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

隨筆-4  評論-40  文章-117  trackbacks-0


一、基本概念

1.1什么是庫

在windows平臺和linux平臺下都大量存在著庫。

本質上來說庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。

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

本文僅限于介紹linux下的庫。

 

 

1.2庫的種類

linux下的庫有兩種:靜態庫和共享庫(動態庫)。

二者的不同點在于代碼被載入的時刻不同。

靜態庫的代碼在編譯過程中已經被載入可執行程序,因此體積較大。

共享庫的代碼是在可執行程序運行時才載入內存的,在編譯過程中僅簡單的引用,因此代碼體積較小。

 

 

1.3庫存在的意義

庫是別人寫好的現有的,成熟的,可以復用的代碼,你可以使用但要記得遵守許可協議。

現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。

共享庫的好處是,不同的應用程序如果調用相同的庫,那么在內存里只需要有一份該共享庫的實例。

 

 

1.4庫文件是如何產生的在linux下

靜態庫的后綴是.a,它的產生分兩步

Step 1.由源文件編譯生成一堆.o,每個.o里都包含這個編譯單元的符號表

Step 2.ar命令將很多.o轉換成.a,成為靜態庫

動態庫的后綴是.so,它由gcc加特定參數編譯產生。

具體方法參見后文實例。

 

1.5庫文件是如何命名的,有沒有什么規范

在linux下,庫文件一般放在/usr/lib和/lib下,

靜態庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱

動態庫的名字一般為libxxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號, minor是副版本號

 

 

1.6如何知道一個可執行程序依賴哪些庫

ldd命令可以查看一個可執行程序依賴的共享庫,

例如# 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庫和ld-linux庫

 

 

1.7可執行程序在執行的時候如何定位共享庫文件

當系統加載可執行代碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑。

此時就需要系統動態載入器(dynamic linker/loader)

對于elf格式的可執行程序,是由ld-linux.so*來完成的,它先后搜索elf文件的 DT_RPATH段—環境變量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib目錄找到庫文件后將其載入內存

如:export LD_LIBRARY_PATH=’pwd’

將當前文件目錄添加為共享目錄

 

1.8在新安裝一個庫之后如何讓系統能夠找到他

如果安裝在/lib或者/usr/lib下,那么ld默認能夠找到,無需其他操作。

如果安裝在其他目錄,需要將其添加到/etc/ld.so.cache文件中,步驟如下

1.編輯/etc/ld.so.conf文件,加入庫文件所在目錄的路徑

2.運行ldconfig,該命令會重建/etc/ld.so.cache文件


二、用gcc生成靜態和動態鏈接庫的示例

我們通常把一些公用函數制作成函數庫,供其它程序使用。

函數庫分為靜態庫和動態庫兩種。

 

靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。

 

動態庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。

 

本文主要通過舉例來說明在Linux中如何創建靜態庫和動態庫,以及使用它們。

 

為了便于闡述,我們先做一部分準備工作。

 

2.1準備好測試代碼hello.h、hello.c和main.c;

hello.h(見程序1)為該函數庫的頭文件。

 

hello.c(見程序2)是函數庫的源程序,其中包含公用函數hello,該函數將在屏幕上輸出"Hello XXX!"。

 

main.c(見程序3)為測試庫文件的主程序,在主程序中調用了公用函數hello。

 

 程序1: hello.h

#ifndef HELLO_H 
#define HELLO_H 
  
void hello(const char *name); 
  
#endif


程序2:hello.c

#include <stdio.h> 
void hello(const char *name) { 

        printf("Hello %s!\n", name); 
}


程序3:main.c

#include "hello.h" 
 int main() 
 { 
     hello("everyone"); 
     return 0; 
 }

2.2問題的提出

注意:這個時候,我們編譯好的hello.o是無法通過gcc –o 編譯的,這個道理非常簡單,

hello.c是一個沒有main函數的.c程序,因此不夠成一個完整的程序,如果使用gcc –o 編譯并連接它,GCC將報錯。

無論靜態庫,還是動態庫,都是由.o文件創建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。

這個時候我們有三種思路:

1)  通過編譯多個源文件,直接將目標代碼合成一個.o文件。

2)  通過創建靜態鏈接庫libmyhello.a,使得main函數調用hello函數時可調用靜態鏈接庫。

3)  通過創建動態鏈接庫libmyhello.so,使得main函數調用hello函數時可調用靜態鏈接庫。

2.3思路一:編譯多個源文件

在系統提示符下鍵入以下命令得到hello.o文件。

# gcc -c hello.c

為什么不使用gcc–o hello hello.cpp 這個道理我們之前已經說了,使用-c是什么意思呢?這涉及到gcc 編譯選項的常識。

 

我們通常使用的gcc –o 是將.c源文件編譯成為一個可執行的二進制代碼(-o選項其實是制定輸出文件文件名,如果不加-c選項,gcc默認會編譯連接生成可執行文件,文件的名稱有-o選項指定),這包括調用作為GCC內的一部分真正的C編譯器(ccl),以及調用GNU C編譯器的輸出中實際可執行代碼的外部GNU匯編器(as)和連接器工具(ld)。

gcc –c是使用GNU匯編器將源文件轉化為目標代碼之后就結束,在這種情況下,只調用了C編譯器(ccl)和匯編器(as),而連接器(ld)并沒有被執行,所以輸出的目標文件不會包含作為Linux程序在被裝載和執行時所必須的包含信息,但它可以在以后被連接到一個程序。

我們運行ls命令看看是否生存了hello.o文件。

# ls

hello.c hello.h hello.o main.c

 

ls命令結果中,我們看到了hello.o文件,本步操作完成。

 

同理編譯main

#gcc –c main.c

 

將兩個文件鏈接成一個.o文件。

#gcc –o hello hello.o main.o

 

運行

# ./hello

 

Hello everyone!

 

完成^ ^!

2.4思路二:靜態鏈接庫

 

下面我們先來看看如何創建靜態庫,以及使用它。

 

靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。在創建和使用靜態庫時,需要注意這點。創建靜態庫用ar命令

 

在系統提示符下鍵入以下命令將創建靜態庫文件libmyhello.a

 

# ar rcs libmyhello.a hello.o

 

 

我們同樣運行ls命令查看結果:

 

# ls

 

hello.c  hello.h hello.o libmyhello.a main.c

 

ls命令結果中有libmyhello.a

 

靜態庫制作完了,如何使用它內部的函數呢?只需要在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然后在用gcc命令生成目標文件時指明靜態庫名,gcc將會從靜態庫中將公用函數連接到目標文件中。注意,gcc會在靜態庫名前加上前綴lib,然后追加擴展名.a得到的靜態庫文件名來查找靜態庫文件,因此,我們在寫需要連接的庫時,只寫名字就可以,如libmyhello.a的庫,只寫:-lmyhello

 

在程序3:main.c中,我們包含了靜態庫的頭文件hello.h,然后在主程序main中直接調用公用函數hello。下面先生成目標程序hello,然后運行hello程序看看結果如何。

 

# gcc -o hello main.c -static -L. -lmyhello

 

# ./hello

 

Hello everyone!

 

我們刪除靜態庫文件試試公用函數hello是否真的連接到目標文件 hello中了。

 

# rm libmyhello.a

 

rm: remove regular file `libmyhello.a'? y

 

# ./hello

 

Hello everyone!

 

程序照常運行,靜態庫中的公用函數已經連接到目標文件中了。

靜態鏈接庫的一個缺點是,如果我們同時運行了許多程序,并且它們使用了同一個庫函數,這樣,在內存中會大量拷貝同一庫函數。這樣,就會浪費很多珍貴的內存和存儲空間。使用了共享鏈接庫的Linux就可以避免這個問題。

共享函數庫和靜態函數在同一個地方,只是后綴有所不同。比如,在一個典型的Linux系統,標準的共享數序函數庫是/usr/lib/libm.so。

當一個程序使用共享函數庫時,在連接階段并不把函數代碼連接進來,而只是鏈接函數的一個引用。當最終的函數導入內存開始真正執行時,函數引用被解析,共享函數庫的代碼才真正導入到內存中。這樣,共享鏈接庫的函數就可以被許多程序同時共享,并且只需存儲一次就可以了。共享函數庫的另一個優點是,它可以獨立更新,與調用它的函數毫不影響。

2.5思路三、動態鏈接庫(共享函數庫)

 

我們繼續看看如何在Linux中創建動態庫。我們還是從.o文件開始。

 

動態庫文件名命名規范和靜態庫文件名命名規范類似,也是在動態庫名增加前綴lib,但其文件擴展名為.so。例如:我們將創建的動態庫名為myhello,則動態庫文件名就是libmyhello.so。用gcc來創建動態庫。

 

在系統提示符下鍵入以下命令得到動態庫文件libmyhello.so

 

# gcc -shared -fPIC -o libmyhello.so hello.o

 

 “PIC”命令行標記告訴GCC產生的代碼不要包含對函數和變量具體內存位置的引用,這是因為現在還無法知道使用該消息代碼的應用程序會將它連接到哪一段內存地址空間。這樣編譯出的hello.o可以被用于建立共享鏈接庫。建立共享鏈接庫只需要用GCC”-shared”標記即可。

 

我們照樣使用ls命令看看動態庫文件是否生成。

 

# ls

 

hello.cpp hello.h hello.o libmyhello.so main.cpp

調用動態鏈接庫編譯目標文件。

 

在程序中使用動態庫和使用靜態庫完全一樣,也是在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然后在用gcc命令生成目標文件時指明動態庫名進行編譯。我們先運行gcc命令生成目標文件,再運行它看看結果。

 

如果直接用如下方法進行編譯,并連接:

# gcc -o hello main.c -L. -lmyhello

 

(使用”-lmyhello”標記來告訴GCC驅動程序在連接階段引用共享函數庫libmyhello.so”-L.”標記告訴GCC函數庫可能位于當前目錄。否則GNU連接器會查找標準系統函數目錄:它先后搜索1.elf文件的 DT_RPATH段—2.環境變量LD_LIBRARY_PATH—3./etc/ld.so.cache文件列表—4./lib/,/usr/lib目錄找到庫文件后將其載入內存,但是我們生成的共享庫在當前文件夾下,并沒有加到上述的4個路徑的任何一個中,因此,執行后會出現錯誤)

 

# ./hello

 

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

 

#

錯誤提示,找不到動態庫文件libmyhello.so。程序在運行時,會在/usr/lib/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。有多種方法可以解決,

(1)我們將文件 libmyhello.so復制到目錄/usr/lib中,再試試。

 

# mv libmyhello.so /usr/lib

 

# ./hello

成功!

(2)既然連接器會搜尋LD_LIBRARY_PATH所指定的目錄,那么我們可以將這個環境變量設置成當前目錄:

先執行:

export LD_LIBRARY_PATH=$(pwd)

再執行:

./hello

成功!

(3)

執行:  

ldconfig   /usr/zhsoft/lib     
       
      
  注:   當用戶在某個目錄下面創建或拷貝了一個動態鏈接庫,若想使其被系統共享,可以執行一下"ldconfig   目錄名"這個命令.此命令的功能在于讓ldconfig將指定目錄下的動態鏈接庫被系統共享起來,意即:在緩存文件/etc/ld.so.cache中追加進指定目錄下的共享庫.本例讓系統共享了/usr/zhsoft/lib目錄下的動態鏈接庫.該命令會重建/etc/ld.so.cache文件

 

成功!

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

下面的這個錯誤我沒有遇到,不過也記錄下,給遇到的人:

 {  這步后我沒有成功,報錯內容如下:/hello: error while loading shared libraries: /usr/lib/libmyhello.so: cannot restore segment prot after reloc: Permission denied

google了一下,發現是SELinux搞的鬼,解決辦法有兩個:

1.
    chcon -t texrel_shlib_t   
/usr/lib/libmyhello.so
    (chcon -t texrel_shlib_t "你不能share的庫的絕對路徑")

2.
    #vi /etc/sysconfig/selinux file
    或者用
    #gedit /etc/sysconfig/selinux file
    修改SELINUX=disabled
    重啟

}

#

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

這也進一步說明了動態庫在程序運行時是需要的。

 

可以查看程序執行時調用動態庫的過程:

# ldd hello
執行 test,可以看到它是如何調用動態庫中的函數的。
[pin@localhost 20090505]$ ldd hello
        linux-gate.so.1 => (0x00110000)
        libmyhello.so => /usr/lib/libmyhello.so (0x00111000)
        libc.so.6 => /lib/libc.so.6 (0x00859000)
        /lib/ld-linux.so.2 (0x0083a000)

我們回過頭看看,發現使用靜態庫和使用動態庫編譯成目標程序使用的gcc命令完全一樣,
那當靜態庫和動態庫同名時,gcc命令會使用哪個庫文件呢?抱著對問題必究到底的心情,
來試試看。

先刪除除.c和.h外的所有文件,恢復成我們剛剛編輯完舉例程序狀態。

# rm -f hello hello.o /usr/lib/libmyhello.so

# ls

hello.c hello.h main.c

#

在來創建靜態庫文件libmyhello.a和動態庫文件libmyhello.so。

# gcc -c hello.c

# ar rcs libmyhello.a hello.o

# gcc -shared -fPCI -o libmyhello.so hello.o

# ls

hello.c hello.h hello.o libmyhello.a libmyhello.so main.c

#

通過上述最后一條ls命令,可以發現靜態庫文件libmyhello.a和動態庫文件libmyhello.so都已經生成,并都在當前目錄中。然后,我們運行gcc命令來使用函數庫myhello生成目標文件hello,并運行程序 hello。

# gcc -o hello main.c -L. -lmyhello

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shar
ed object file: No such file or directory

#

從程序hello運行的結果中很容易知道,當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。

Note:

編譯參數解析


最主要的是GCC命令行的一個選項:
-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件
l -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
l -L.:表示要連接的庫在當前目錄中
l -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
l LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。
l 當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用 /sbin/ldconfig來達到同樣的目的,不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。

調用動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的頭文件所在目錄 通過 “-I” include進來了,庫所在文件通過 “-L”參數引導,并指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈接的so文件,這時你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了。


靜態庫鏈接時搜索路徑順序:

1. ld會去找GCC命令中的參數-L

2. 再找gcc的環境變量LIBRARY_PATH

3. 再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的


動態鏈接時、執行時搜索路徑順序:


1.  編譯目標代碼時指定的動態庫搜索路徑;

2.  環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;

3.  配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;

4. 默認的動態庫搜索路徑/lib;

5. 默認的動態庫搜索路徑/usr/lib。


有關環境變量:

LIBRARY_PATH環境變量:指定程序靜態鏈接庫文件搜索路徑

LD_LIBRARY_PATH環境變量:指定程序動態鏈接庫文件搜索路徑


posted on 2012-02-09 13:43 李陽 閱讀(32944) 評論(7)  編輯 收藏 引用 所屬分類: Linux

評論:
# re: Linux下Gcc生成和使用靜態庫和動態庫詳解(轉) 2012-08-01 16:00 |
寫的很詳細,謝謝分享!  回復  更多評論
  
# re: Linux下Gcc生成和使用靜態庫和動態庫詳解(轉) 2013-01-15 15:25 | lwVampire
受教了,很細致的文章  回復  更多評論
  
# re: Linux下Gcc生成和使用靜態庫和動態庫詳解(轉) 2013-03-04 16:49 | zhangmo
非常詳細的文章,謝謝分享。  回復  更多評論
  
# re: Linux下Gcc生成和使用靜態庫和動態庫詳解(轉) 2013-04-25 15:54 | molixiaoge
謝謝 看了很好  回復  更多評論
  
# re: Linux下Gcc生成和使用靜態庫和動態庫詳解(轉) 2014-05-23 17:20 | zpyws
非常好的文章,受益匪淺  回復  更多評論
  
# re: Linux下Gcc生成和使用靜態庫和動態庫詳解(轉) 2015-01-29 08:27 | lemonsky
寫的很好,最近在看embeded compile,這篇文章很有啟發  回復  更多評論
  
# re: Linux下Gcc生成和使用靜態庫和動態庫詳解(轉) 2016-05-18 18:09 | hdp
gta@gta-virtual-machine:~/Test/gcc$ gcc -shared -fPIC -o libmyhello.so hello.o
/usr/bin/ld: hello.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
hello.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

按照你的方式,在制作動態庫時出現了問題。
后來在其他博客中發現是hello.o的問題。
我想問,是我電腦環境的問題,還是你的博客有問題?  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人成人一区二区在线观看| 亚洲视频在线一区| 久久久久久久一区二区| 亚洲欧美日韩在线观看a三区| 国产精品人人做人人爽人人添| 亚洲综合精品一区二区| 午夜精品福利在线| 黄色一区二区在线| 亚洲黄网站在线观看| 欧美日韩精品是欧美日韩精品| 一区二区三区高清不卡| 亚洲一区一卡| 在线观看一区视频| 亚洲免费观看| 国产视频精品va久久久久久| 欧美va亚洲va香蕉在线| 欧美日韩国产不卡| 久久久久久久尹人综合网亚洲| 久久亚洲综合色| 亚洲欧美日韩国产一区二区三区| 欧美中文在线观看国产| 亚洲免费网站| 欧美日本成人| 欧美专区日韩专区| 欧美不卡在线视频| 久久狠狠一本精品综合网| 久久综合九九| 欧美亚洲在线| 欧美精品www| 久久综合色一综合色88| 欧美日韩国产色站一区二区三区 | 久久综合国产精品| 亚洲午夜一二三区视频| 免费看精品久久片| 欧美有码在线视频| 欧美午夜宅男影院在线观看| 麻豆av福利av久久av| 国产精品一区一区三区| 亚洲国产精品一区制服丝袜| 国产日本亚洲高清| 亚洲天天影视| 亚洲天堂网站在线观看视频| 女同性一区二区三区人了人一| 久久精品男女| 国产精品日韩欧美综合| 亚洲免费观看高清完整版在线观看熊 | 欧美日韩国产综合视频在线| 欧美大片一区二区| 国语自产偷拍精品视频偷| 亚洲一本大道在线| 亚洲欧美久久| 欧美香蕉大胸在线视频观看| 亚洲日韩欧美一区二区在线| 亚洲电影免费观看高清完整版| 久久国产精品亚洲77777| 午夜一区在线| 国产精品视频专区| 亚洲欧美日韩国产一区| 亚洲专区一区| 国产精品影音先锋| 亚洲一区二三| 欧美一区二区三区精品电影| 国产精品久久久久三级| 亚洲无限av看| 欧美一区二区在线播放| 国产精品日本欧美一区二区三区| 一本色道精品久久一区二区三区| 一区二区三区日韩欧美| 欧美性事免费在线观看| 一区二区三区国产精华| 香蕉久久国产| 狠狠久久综合婷婷不卡| 久久久久网站| 亚洲国产精品黑人久久久| 亚洲毛片视频| 欧美午夜视频一区二区| 亚洲自拍偷拍福利| 鲁大师成人一区二区三区 | 国产精品久久久久久久久久免费 | 日韩视频免费大全中文字幕| 亚洲毛片在线免费观看| 欧美另类人妖| 亚洲视频一区在线| 欧美一区二区三区四区视频| 国产亚洲福利社区一区| 蜜臀av一级做a爰片久久 | 久久久久五月天| 亚洲第一精品电影| 欧美伦理91| 欧美一级久久久久久久大片| 免费在线日韩av| 中文日韩在线| 伊人久久综合97精品| 欧美激情女人20p| 亚洲欧美日韩在线| 亚洲国产电影| 久久国内精品视频| aa国产精品| 精品69视频一区二区三区| 欧美区一区二| 久久久久久黄| 一区二区三区高清在线观看| 免费的成人av| 午夜精品视频| 亚洲精品久久在线| 国产日韩欧美日韩大片| 欧美另类女人| 久久天天躁狠狠躁夜夜爽蜜月| 在线亚洲一区| 欧美黄免费看| 久久久蜜桃一区二区人| 亚洲性xxxx| 亚洲精品国产无天堂网2021| 国产综合色精品一区二区三区| 欧美日韩xxxxx| 美女黄毛**国产精品啪啪| 欧美一区二区三区日韩| 99亚洲伊人久久精品影院红桃| 欧美高清视频免费观看| 久久国产精品久久国产精品| 亚洲尤物在线视频观看| 99re热这里只有精品免费视频| 伊人伊人伊人久久| 国产一区二区三区久久 | 免费成人你懂的| 久久激情网站| 亚洲欧美中文字幕| 亚洲一级电影| 中日韩高清电影网| 一本久久青青| 亚洲日韩视频| 亚洲第一福利视频| 亚洲国产成人精品久久久国产成人一区 | 免费成人毛片| 久久综合中文字幕| 久久频这里精品99香蕉| 欧美一区二区三区精品电影| 亚洲一区久久久| 亚洲综合999| 亚洲欧美电影院| 亚洲免费网站| 欧美影院精品一区| 久久久久久一区二区三区| 久久视频精品在线| 久久精品在线观看| 麻豆成人小视频| 蜜臀久久久99精品久久久久久| 美日韩精品免费观看视频| 美女成人午夜| 亚洲福利视频二区| 亚洲激情视频网| 一区二区毛片| 欧美亚洲系列| 久久深夜福利| 欧美日韩dvd在线观看| 国产精品va在线播放我和闺蜜| 国产精品男女猛烈高潮激情| 国产美女高潮久久白浆| 加勒比av一区二区| 亚洲精品国偷自产在线99热| 亚洲视频欧洲视频| 久久本道综合色狠狠五月| 麻豆91精品| 亚洲精品少妇网址| 先锋影音网一区二区| 久久这里只精品最新地址| 欧美激情影院| 国产日产高清欧美一区二区三区| 激情欧美亚洲| 一区二区三区www| 久久黄色小说| 亚洲激情在线激情| 午夜综合激情| 欧美高清视频一区二区三区在线观看 | 亚洲第一视频| 亚洲午夜免费视频| 麻豆91精品| 国产欧美精品一区二区三区介绍| 亚洲国产高潮在线观看| 亚洲免费视频观看| 欧美韩国日本一区| 亚洲一区二区三区在线播放| 久久综合狠狠综合久久激情| 欧美午夜在线观看| 91久久在线播放| 久久av免费一区| 亚洲精品一区中文| 久久成人精品一区二区三区| 欧美日韩视频专区在线播放| 狠狠色狠狠色综合日日tαg | 国产亚洲精品成人av久久ww| 99热在线精品观看| 欧美不卡福利| 欧美一区二区在线观看| 欧美日韩免费观看一区| 亚洲高清二区| 久久全球大尺度高清视频| 亚洲一级一区| 欧美少妇一区二区| 亚洲精品麻豆|