青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

tqsheng

go.....
隨筆 - 366, 文章 - 18, 評(píng)論 - 101, 引用 - 0
數(shù)據(jù)加載中……

Linux下靜態(tài)庫(kù)_庫(kù)的基本概念;如何生成靜態(tài)庫(kù)動(dòng)態(tài)庫(kù);nm查看庫(kù)中包含那些函數(shù)、ar生成靜態(tài)庫(kù),查看庫(kù)中包含那些.o文件、ldd查看程序依賴的.so文件;gcc/g++與庫(kù)相關(guān)的參數(shù)-L,-l,-fPIC,-shared;靜態(tài)庫(kù)鏈接時(shí)搜索過程;動(dòng)態(tài)庫(kù)鏈接時(shí),加載時(shí)搜索的過程;動(dòng)態(tài)庫(kù)找不到的問題;動(dòng)態(tài)庫(kù)升級(jí)步驟

Linux下靜態(tài)庫(kù)_庫(kù)的基本概念;如何生成靜態(tài)庫(kù)動(dòng)態(tài)庫(kù);nm查看庫(kù)中包含那些函數(shù)、ar生成靜態(tài)庫(kù),查看庫(kù)中包含那些.o文件、ldd查看程序依賴的.so文件;gcc/g++與庫(kù)相關(guān)的參數(shù)-L,-l,-fPIC,-shared;靜態(tài)庫(kù)鏈接時(shí)搜索過程;動(dòng)態(tài)庫(kù)鏈接時(shí),加載時(shí)搜索的過程;動(dòng)態(tài)庫(kù)找不到的問題;動(dòng)態(tài)庫(kù)升級(jí)步驟

2010-11-23 10:47:45| 分類: Linux系統(tǒng)編程 | 標(biāo)簽: |字號(hào) 訂閱

一、基本概念

1.1、什么是庫(kù)

在 windows 平臺(tái)和 linux 平臺(tái)下都大量存在著庫(kù)。

本質(zhì)上來說庫(kù)是 一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。

由于 windows 和 linux 的平臺(tái)不同(主要是編譯器、匯編器和連接器 的不同),因此二者庫(kù)的二進(jìn)制是不兼容的。

本文僅限于介紹 linux 下的庫(kù)。

 

1.2、 庫(kù)的種類

linux 下的庫(kù)有兩種:靜態(tài)庫(kù)和共享庫(kù)(動(dòng)態(tài)庫(kù))。

二者的不同點(diǎn)在于代碼被載入的時(shí)刻不同。

靜態(tài)庫(kù)的代碼在編譯過程中已經(jīng)被載入可執(zhí)行程序,因此體積較大。

靜態(tài)用.a為后綴, 例如: libhello.a

共享庫(kù)(動(dòng)態(tài)庫(kù))的代碼是在可執(zhí)行程序運(yùn)行時(shí)才載入內(nèi)存的,在編譯過程中僅簡(jiǎn)單的引用,因此代碼體積較小。

動(dòng)態(tài)通常用.so為后綴, 例如:libhello.so

共享庫(kù)(動(dòng)態(tài)庫(kù))的好處是,不同的應(yīng)用程序如果調(diào)用相同的庫(kù),那么在內(nèi)存里只需要有一份該共享庫(kù)的實(shí)例。

為了在同一系統(tǒng)中使用不同版本的庫(kù),可以在庫(kù)文件名后加上版本號(hào)為后綴,例如: libhello.so.1.0,由于程序連接默認(rèn)以.so為文件后綴名。所以為了使用這些庫(kù),通常使用建立符號(hào)連接的方式。

ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so

1.3、靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)文件在linux下是如何生成的:
以下面的代碼為例,生成上面用到的hello庫(kù):
/* hello.c */  
#include "hello.h"  
void sayhello()  
{      
    printf("hello,world ");  
}

首先用gcc編繹該文件,在編繹時(shí)可以使用任何合法的編繹參數(shù),例如-g加入調(diào)試代碼等:

$gcc -c hello.c -o hello.o

1、生成靜態(tài)庫(kù) 生成靜態(tài)庫(kù)使用ar工具,其實(shí)ar是archive的意思

$ar cqs libhello.a hello.o

2、生成動(dòng)態(tài)庫(kù) 用gcc來完成,由于可能存在多個(gè)版本,因此通常指定版本號(hào):

$gcc -shared -o libhello.so.1.0 hello.o
 
1.4、庫(kù)文件是如何命名的,有沒有什么規(guī)范: 
在 linux 下,庫(kù)文件一般放在/usr/lib和/lib下, 
靜態(tài)庫(kù)的名字一般為libxxxx.a,其中 xxxx 是該lib的名稱;
動(dòng)態(tài)庫(kù)的名字一般為libxxxx.so.major.minor,xxxx 是該lib的名稱,major是主版本號(hào),minor是副版本號(hào) 
 
1.5、可執(zhí)行程序在執(zhí)行的時(shí)候如何定位共享庫(kù)(動(dòng)態(tài)庫(kù))文件 :
    當(dāng)系統(tǒng)加載可執(zhí)行代碼(即庫(kù)文件)的時(shí)候,能夠知道其所依賴的庫(kù)的名字,但是還需要知道絕對(duì)路徑,此時(shí)就需要系統(tǒng)動(dòng)態(tài)載入器 (dynamic linker/loader) 
    對(duì)于 elf 格式的可執(zhí)行程序,是由 ld-linux.so* 來完成的,它先后搜索 elf 文件的 DT_RPATH 段—環(huán)境變量LD_LIBRARY_PATH—/etc/ld.so.cache 文件列表— /lib/,/usr/lib 目錄找到庫(kù)文件后將其載入內(nèi)存
    如: export LD_LIBRARY_PATH=’pwd’ 
將當(dāng)前文件目錄添加為共享目錄
 
1.6、使用ldd工具,查看可執(zhí)行程序依賴那些動(dòng)態(tài)庫(kù)或著動(dòng)態(tài)庫(kù)依賴于那些動(dòng)態(tài)庫(kù)
   ldd 命令可以查看一個(gè)可執(zhí)行程序依賴的共享庫(kù), 
    例如 # ldd /bin/lnlibc.so.6 
        => /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2 
        => /lib/ld- linux.so.2 (0×40000000) 
    可以看到 ln 命令依賴于 libc 庫(kù)和 ld-linux 庫(kù) 
 
1.7、使用nm工具,查看靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)中有那些函數(shù)名(T類表示函數(shù)是當(dāng)前庫(kù)中定義的,U類表示函數(shù)是被調(diào)用的,在其它庫(kù)中定義的,W類是當(dāng)前庫(kù)中定義,被其它庫(kù)中的函數(shù)覆蓋)。
    有時(shí)候可能需要查看一個(gè)庫(kù)中到底有哪些函數(shù),nm工具可以打印出庫(kù)中的涉及到的所有符號(hào),這里的庫(kù)既可以是靜態(tài)的也可以是動(dòng)態(tài)的。

nm列出的符號(hào)有很多, 常見的有三種::

一種是在庫(kù)中被調(diào)用,但并沒有在庫(kù)中定義(表明需要其他庫(kù)支持),用U表示;

一種是在庫(kù)中定義的函數(shù),用T表示,這是最常見的;

另外一種是所 謂的“弱態(tài)”符號(hào),它們雖然在庫(kù)中被定義,但是可能被其他庫(kù)中的同名符號(hào)覆蓋,用W表示。

例如,假設(shè)開發(fā)者希望知道上文提到的hello庫(kù)中是否引用了 printf():

    $nm libhello.so | grep printf 

發(fā)現(xiàn)printf是U類符號(hào),說明printf被引用,但是并沒有在庫(kù)中定義。

由此可以推斷,要正常使用hello庫(kù),必須有其它庫(kù)支持,使用ldd工具查看hello依賴于哪些庫(kù):

$ldd hello libc.so.6=>/lib/libc.so.6(0x400la000) /lib/ld-linux.so.2=>/lib/ld-linux.so.2 (0x40000000)

從上面的結(jié)果可以繼續(xù)查看printf最終在哪里被定義,有興趣可以go on

1.8、使用ar工具,可以生成靜態(tài)庫(kù),同時(shí)可以查看靜態(tài)庫(kù)中包含那些.o文件,即有那些源文件構(gòu)成。

可以使用 ar -t libname.a 來查看一個(gè)靜態(tài)庫(kù)由那些.o文件構(gòu)成。

可以使用 ar q libname.a xxx1.o xxx2.o xxx3.o ... xxxn.o 生成靜態(tài)庫(kù)

 
Linux下進(jìn)行程序設(shè)計(jì)時(shí),關(guān)于庫(kù)的使用:
 
一、gcc/g++命令中關(guān)于庫(kù)的參數(shù):
-shared: 該選項(xiàng)指定生成動(dòng)態(tài)連接庫(kù)(讓連接器生成T類型的導(dǎo)出符號(hào)表,有時(shí)候也生成弱連接W類型的導(dǎo)出符號(hào)),不用該標(biāo)志外部程序無法連接。相當(dāng)于一個(gè)可執(zhí)行文件
-fPIC:表示編譯為位置獨(dú)立(地址無關(guān))的代碼,不用此選項(xiàng)的話,編譯后的代碼是位置相關(guān)的,所以動(dòng)態(tài)載入時(shí),是通過代碼拷貝的方式來滿足不同進(jìn)程的需要,而不能達(dá)到真正代碼段共享的目的。
-L:指定鏈接庫(kù)的路徑,-L. 表示要連接的庫(kù)在當(dāng)前目錄中
-ltest:指定鏈接庫(kù)的名稱為test,編譯器查找動(dòng)態(tài)連接庫(kù)時(shí)有隱含的命名規(guī)則,即在給出的名字前面加上lib,后面加上.so來確定庫(kù)的名稱
LD_LIBRARY_PATH:這個(gè)環(huán)境變量指示動(dòng)態(tài)連接器可以裝載動(dòng)態(tài)庫(kù)的路徑
當(dāng)然如果有root權(quán)限的話,可以修改/etc/ld.so.conf文件,然后調(diào)用 /sbin/ldconfig來達(dá)到同樣的目的,
   不過如果沒有root權(quán)限,那么只能采用修改LD_LIBRARY_PATH環(huán)境變量的方法了。 
調(diào)用動(dòng)態(tài)庫(kù)的時(shí)候,有幾個(gè)問題會(huì)經(jīng)常碰到:
    1、有時(shí),明明已經(jīng)將庫(kù)的頭文件所在目錄 通過 “-I” include進(jìn)來了,庫(kù)所在文件通過 “-L”參數(shù)引導(dǎo),并指定了“-l”的庫(kù)名,但通過ldd命令察看時(shí),就是死活找不到你指定鏈接的so文件,這時(shí)你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件來指定動(dòng)態(tài)庫(kù)的目錄。通常這樣做就可以解決庫(kù)無法鏈接的問題了。
 
二、靜態(tài)庫(kù)鏈接時(shí)搜索路徑的順序: 
1. ld會(huì)去找gcc/g++命令中的參數(shù)-L;
2. 再找gcc的環(huán)境變量LIBRARY_PATH,它指定程序靜態(tài)鏈接庫(kù)文件搜索路徑;
      export LIBRARY_PATH=$LIBRARY_PATH:data/home/billchen/lib 
3. 再找默認(rèn)庫(kù)目錄 /lib /usr/lib /usr/local/lib,這是當(dāng)初compile gcc時(shí)寫在程序內(nèi)的。
   
三、動(dòng)態(tài)鏈接時(shí)、執(zhí)行時(shí)搜索路徑順序: 
1. 編譯目標(biāo)代碼時(shí)指定的動(dòng)態(tài)庫(kù)搜索路徑;
    2. 環(huán)境變量LD_LIBRARY_PATH指定動(dòng)態(tài)庫(kù)搜索路徑,它指定程序動(dòng)態(tài)鏈接庫(kù)文件搜索路徑;
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:data/home/billchen/lib 
3. 配置文件/etc/ld.so.conf中指定的動(dòng)態(tài)庫(kù)搜索路徑;
4. 默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib;
5. 默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/usr/lib。
 
四、靜態(tài)庫(kù)和動(dòng)態(tài)鏈接庫(kù)同時(shí)存在的問題:
   當(dāng)一個(gè)庫(kù)同時(shí)存在靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)時(shí),比如libmysqlclient.a和libmysqlclient.so同時(shí)存在時(shí):
    在Linux下,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)同事存在時(shí),gcc/g++的鏈接程序,默認(rèn)鏈接的動(dòng)態(tài)庫(kù)。

可以使用下面的方法,給連接器傳遞參數(shù),看是否鏈接動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)。

-WI,-Bstatic -llibname //指定讓gcc/g++鏈接靜態(tài)庫(kù)

使用:

gcc/g++ test.c -o test -WI,-Bstatic -llibname

-WI,-Bdynamic -llibname //指定讓gcc/g++鏈接動(dòng)態(tài)庫(kù)

使用:

gcc/g++ test.c -o test -WI,-Bdynamic -llibname

如果要完全靜態(tài)加在,使用-static參數(shù),即將所有的庫(kù)以靜態(tài)的方式鏈入可執(zhí)行程序,這樣生成的可執(zhí)行程序,不再依賴任何庫(kù),同事出現(xiàn)的問題是,這樣編譯出來的程序非常大,占用空間。

 
五、有關(guān)環(huán)境變量: 
LIBRARY_PATH環(huán)境變量:指定程序靜態(tài)鏈接庫(kù)文件搜索路徑
LD_LIBRARY_PATH環(huán)境變量:指定程序動(dòng)態(tài)鏈接庫(kù)文件搜索路徑
 
六、動(dòng)態(tài)庫(kù)升級(jí)問題:
   在動(dòng)態(tài)鏈接庫(kù)升級(jí)時(shí),
不能使用cp newlib.so oldlib.so,這樣有可能會(huì)使程序core掉;
而應(yīng)該使用:
rm oldlib.so 然后 cp newlib.so oldlib.so
或者
mv oldlib.so oldlib.so_bak 然后 cp newlib.so oldlib.so


為什么不能用cp newlib.so oldlib.so ?

在替換so文件時(shí),如果在不停程序的情況下,直接用 cp new.so old.so 的方式替換程序使用的動(dòng)態(tài)庫(kù)文件會(huì)導(dǎo)致正在運(yùn)行中的程序崩潰。

 

解決方法:

解決的辦法是采用“rm+cp” 或“mv+cp” 來替代直接“cp” 的操作方法。

linux系統(tǒng)的動(dòng)態(tài)庫(kù)有兩種使用方法:運(yùn)行時(shí)動(dòng)態(tài)鏈接庫(kù),動(dòng)態(tài)加載庫(kù)并在程序控制之下使用。

 

1、為什么在不停程序的情況下,直接用 cp 命令替換程序使用的 so 文件,會(huì)使程序崩潰?
很多同學(xué)在工作中遇到過這樣一個(gè)問題,在替換 so 文件時(shí),如果在不停程序的情況下,直接用cp new.so old.so的方式替換程序使用的動(dòng)態(tài)庫(kù)文件會(huì)導(dǎo)致正在運(yùn)行中的程序崩潰,退出。

這與 cp 命令的實(shí)現(xiàn)有關(guān),cp 并不改變目標(biāo)文件的 inode,cp 的目標(biāo)文件會(huì)繼承被覆蓋文件的屬性而非源文件。實(shí)際上它是這樣實(shí)現(xiàn)的:
strace cp libnew.so libold.so 2>&1 |grep open.*lib.*.so
open("libnew.so", O_RDONLY|O_LARGEFILE) = 3
open("libold.so", O_WRONLY|O_TRUNC|O_LARGEFILE) = 4
在 cp 使用“O_WRONLY|O_TRUNC” 打開目標(biāo)文件時(shí),原 so 文件的鏡像被意外的破壞了這樣動(dòng)態(tài)鏈接器 ld.so 不能訪問到 so 文件中的函數(shù)入口。從而導(dǎo)致 Segmentation fault,程序崩潰。ld.so 加載 so 文件及“再定位”的機(jī)制比較復(fù)雜。

 

2、怎樣在不停止程序的情況下替換so文件,并且保證程序不會(huì)崩潰?
答案是采用“rm+cp” 或“mv+cp” 來替代直接“cp” 的操作方法。

在用新的so文件 libnew.so 替換舊的so文件 libold.so 時(shí),如果采用如下方法:
rm libold.so //如果內(nèi)核正在使用libold.so,那么inode節(jié)點(diǎn)不會(huì)立刻別刪除掉。
cp libnew.so libold.so
采用這種方法,目標(biāo)文件 libold.so 的 inode 其實(shí)已經(jīng)改變了,原來的 libold.so 文件雖然不能用 ”ls”查看到,但其 inode 并沒有被真正刪除,直到內(nèi)核釋放對(duì)它的引用。

(即: rm libold.so,此時(shí),如果ld.so正在加在libold.so,內(nèi)核就在引用libold.so的inode節(jié)點(diǎn),rm libold.so的inode并沒有被真正刪除,當(dāng)ld.so對(duì)libold.so的引用結(jié)束,inode才會(huì)真正刪除。這樣程序就不會(huì)崩潰,因?yàn)樗€在使用舊的libold.so,當(dāng)下次再使用libold.so時(shí),已經(jīng)被替換,就會(huì)使用新的libold.so)

同理,mv只是改變了文件名,其 inode 不變,新文件使用了新的 inode。這樣動(dòng)態(tài)鏈接器 ld.so 仍然使用原來文件的 inode 訪問舊的 so 文件。因而程序依然能正常運(yùn)行。

(即: mv libold.so ***后,如果程序使用動(dòng)態(tài)庫(kù),還是使用舊的inode節(jié)點(diǎn),當(dāng)下次再使用libold.so時(shí),就會(huì)使用新的libold.so)


到這里,為什么直接使用“cp new_exec_file old_exec_file”這樣的命令時(shí),系統(tǒng)會(huì)禁止這樣的操作,并且給出這樣的提示“cp: cannot create regular file `old': Text file busy”。這時(shí),我們采用的辦法仍然是用“rm+cp”或者“mv+cp”來替代直接“cp”,這跟以上提到的so文件的替換有同樣的道理。


但是,為什么系統(tǒng)會(huì)阻止 cp 覆蓋可執(zhí)行程序,而不阻止覆蓋 so 文件呢

這是因?yàn)?Linux 有個(gè) Demand Paging 機(jī)制,所謂“Demand Paging”,簡(jiǎn)單的說,就是系統(tǒng)為了節(jié)約物理內(nèi)存開銷,并不會(huì)程序運(yùn)行時(shí)就將所有頁(yè)(page)都加載到內(nèi)存中,而只有在系統(tǒng)有訪問需求時(shí)才將其加載。“Demand Paging”要求正在運(yùn)行中的程序鏡像注意,并非文件本身不被意外修改,因此內(nèi)核在啟動(dòng)程序后會(huì)鎖定這個(gè)程序鏡像的 inode。

對(duì)于 so 文件,它是靠 ld.so 加載的,而ld.so畢竟也是用戶態(tài)程序,沒有權(quán)利去鎖定inode,也不應(yīng)與內(nèi)核的文件系統(tǒng)底層實(shí)現(xiàn)耦合

posted on 2013-01-04 16:38 tqsheng 閱讀(8250) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美女视频黄 久久| 亚洲精品视频啊美女在线直播| 国产精品女主播| 欧美二区在线观看| 免费毛片一区二区三区久久久| 夜夜嗨一区二区| 一区二区三区四区五区精品视频| 99视频国产精品免费观看| 一区二区激情| 午夜精品久久久久久久久久久久| 午夜精品久久久久久久久久久| 欧美制服丝袜第一页| 欧美在线一级va免费观看| 久久天天躁夜夜躁狠狠躁2022 | 亚洲人成在线观看| 99精品视频免费观看| 亚洲免费在线观看| 久久久久久成人| 欧美黄色aa电影| 亚洲午夜免费视频| 快射av在线播放一区| 国产精品ⅴa在线观看h| 国产午夜久久| 一本一本久久a久久精品综合妖精| 亚洲综合不卡| 暖暖成人免费视频| 亚洲视频自拍偷拍| 免费看黄裸体一级大秀欧美| 国产精品乱码久久久久久| 黄色成人在线网站| 亚洲欧美乱综合| 欧美顶级艳妇交换群宴| 亚洲一区制服诱惑| 欧美激情精品久久久久久黑人| 国产欧美精品va在线观看| 亚洲人成久久| 久久亚洲国产成人| 亚洲网站视频| 欧美精品一卡二卡| 精品动漫3d一区二区三区免费版 | 亚洲国语精品自产拍在线观看| 亚洲免费大片| 久久激情视频久久| 国产精品videosex极品| 亚洲精品国偷自产在线99热| 久久欧美肥婆一二区| 亚洲一区精品在线| 欧美三日本三级三级在线播放| 1000部精品久久久久久久久| 欧美在线你懂的| 夜夜爽夜夜爽精品视频| 欧美国产先锋| 亚洲人www| 亚洲第一在线| 老鸭窝毛片一区二区三区| 国产在线欧美| 久久精品亚洲| 欧美一区二区在线播放| 国产精品午夜久久| 先锋影音一区二区三区| 亚洲一区二区三区在线视频| 国产精品爱久久久久久久| 亚洲小视频在线观看| 亚洲裸体视频| 欧美视频免费看| 亚洲一区3d动漫同人无遮挡| 一区二区三区精品| 欧美日韩一区二区高清| 99riav久久精品riav| 最新亚洲电影| 欧美四级伦理在线| 欧美一级成年大片在线观看| 亚洲一区日韩| 狠狠色伊人亚洲综合成人| 葵司免费一区二区三区四区五区| 欧美亚洲视频一区二区| 极品av少妇一区二区| 美玉足脚交一区二区三区图片| 久久一区二区三区四区五区| 亚洲国产精品悠悠久久琪琪| 亚洲破处大片| 欧美色图一区二区三区| 午夜精品一区二区三区在线| 欧美诱惑福利视频| 在线观看亚洲| 亚洲精品在线一区二区| 国产精品成人一区二区三区夜夜夜| 亚洲欧美中日韩| 久久久999| aa级大片欧美三级| 亚洲区在线播放| 国产精品视频自拍| 久久久91精品国产一区二区三区| 久久精品人人做人人爽| 在线精品视频免费观看| 91久久在线播放| 国产日韩欧美一区二区三区在线观看| 老牛影视一区二区三区| 欧美精品一区在线发布| 久久精品欧美| 欧美日韩国产在线一区| 午夜日韩电影| 久久福利视频导航| 亚洲精选在线观看| 欧美亚洲一级片| 在线一区亚洲| 美女成人午夜| 久久精品一本久久99精品| 欧美国产日韩一区二区三区| 校园春色综合网| 欧美精品三级日韩久久| 久久精品亚洲一区二区| 欧美日韩视频一区二区| 久久一区视频| 国产伪娘ts一区| 亚洲一区二区四区| 夜夜精品视频一区二区| 蜜臀av一级做a爰片久久| 久久久xxx| 国产精品一区二区你懂得 | 国产精品爽爽爽| 亚洲区在线播放| 亚洲日本中文字幕| 久久久久一区二区| 久久国内精品自在自线400部| 欧美日韩18| 毛片一区二区三区| 国产亚洲精品美女| 亚洲一区二区在线看| 亚洲一区二区动漫| 欧美精品一区二区三区在线看午夜 | 久久综合五月| 国产伦精品一区二区三区高清版 | 亚洲精品久久久久中文字幕欢迎你| 欧美一级欧美一级在线播放| 一区二区三区欧美成人| 蜜臀av性久久久久蜜臀aⅴ| 久久精品免费| 国产精品网曝门| 亚洲欧美乱综合| 性欧美长视频| 国产精品一区二区你懂的| 亚洲欧美另类在线观看| 欧美在线观看一区| 国产亚洲一级| 欧美亚洲视频在线观看| 久久精选视频| 伊人一区二区三区久久精品| 久久久久久久性| 亚洲成色精品| 一本久道久久综合婷婷鲸鱼| 欧美日韩福利在线观看| 日韩视频在线观看免费| 亚洲欧美国产一区二区三区| 国产免费观看久久黄| 久久国产精品久久久久久久久久| 久久人人爽人人| 亚洲欧洲久久| 欧美日韩免费在线视频| 亚洲影院免费| 免费在线看一区| 中文欧美在线视频| 国产精品日韩欧美大师| 久久精品国产综合精品| 免费欧美网站| 亚洲第一级黄色片| 欧美极品影院| 午夜视频在线观看一区二区| 麻豆精品视频在线观看| 亚洲电影网站| 欧美少妇一区二区| 久久国产精品一区二区三区四区| 亚洲国产成人在线播放| 亚洲欧美日韩在线一区| 国外成人免费视频| 欧美另类亚洲| 久久精品国产综合精品| 99精品视频网| 久久综合伊人77777麻豆| 在线视频日韩| 午夜精品视频一区| 欧美成人激情视频免费观看| 中国av一区| 韩国在线视频一区| 欧美日韩国语| 欧美中文在线观看国产| 日韩亚洲国产欧美| 男女精品网站| 久久精品卡一| 亚洲一区视频在线观看视频| 亚洲国产精品久久久久婷婷老年| 欧美体内she精视频| 久久婷婷蜜乳一本欲蜜臀| 99视频精品全部免费在线| 欧美大片91| 久久亚洲国产精品日日av夜夜| 亚洲在线国产日韩欧美| 亚洲免费播放| 亚洲国产欧美另类丝袜| 国产日韩在线亚洲字幕中文|