久综合色-久综合网-玖草影视-玖草资源在线-亚洲黄色片子-亚洲黄色片在线观看

Hello! 歡迎來到小浪云!


【Linux系統IO】六、動靜態庫


Ⅰ. 前言

? 我們之前學 gcc 的時候也有接觸過一點動靜態庫的知識,現在要把它單獨拿出來講,主要是因為我們后面肯定在自己開發的時候需要包裝自己的庫,此時就需要有動靜態庫的原理知識和使用知識!

? 一般庫名稱都是中間部分,也就是去掉前綴和后綴的部分剩下的內容,如:libc.so,去掉前綴 lib,去掉后綴 .so -> c 動態庫。

? 靜態庫和動態庫最本質的區別就是:該庫是否被編譯進目標(程序)內部。

? 下面我們一一介紹它們!

? 在介紹之前我們先來介紹兩個我們也曾經講過的指令:

? 第一個就是 ldd 指令,它的功能是 顯示可執行文件依賴的庫 。

【Linux系統IO】六、動靜態庫

? 第二個指令就是 file 可執行文件 指令,用于 查看程序是動態還是靜態鏈接。

【Linux系統IO】六、動靜態庫

Ⅱ. 靜態庫一、靜態庫的概念

? 靜態庫:這類的函數庫通常擴展名為 libxxx.a 或 xxx.lib 。工作原理是程序在編譯鏈接的時候把庫的代碼鏈接 (拷貝) 到可執行文件中,變成可執行文件中的一部分,所以 程序運行的時候將不再需要靜態庫。

? 這類庫在編譯的時候會直接整合到目標程序中,所以利用 靜態函數庫編譯成的文件會比較大,這類函數庫最大的優點就是編譯成功的可執行文件 可以獨立運行,而不再需要向外部要求讀取函數庫的內容;但是從升級難易度來看明顯沒有優勢,如果函數庫更新,需要重新編譯。

? 靜態鏈接:鏈接靜態庫,每個程序將自己在庫中用到的指令代碼單獨寫入自己可執行程序中,程序 運行時無依賴,加載運行速度快,但是程序運行后有可能會有 冗余代碼 在內存中。

二、ar指令

? ar (archiver)命令可以用來 創建、查詢、修改庫。庫是一組單獨的文件,里面包含了按照特定的結構組織起來的源文件,原始文件的內容、模式、時間戳、屬性、組等屬性都保留在庫文件中。

? 下面是命令選項:

代碼語言:JavaScript代碼運行次數:0運行復制

-d:刪除庫文件中的成員文件-m:變更成員文件在庫文件中的次序-p:顯示庫文件中的成員文件內容-q:將文件附加在庫文件末端-r:將文件插入庫文件中-t:顯示庫文件中所包含的文件-x:從庫文件中取出成員文件-a:將文件插入庫文件中指定的成員文件之后-b:將文件插入庫文件中指定的成員文件之前-c:建立庫文件-f:截掉要放入庫文件中過長的成員文件名稱-i:將文件插入庫文件中指定的成員文件之前-o:保留庫文件中文件的日期-s:若庫文件中包含了對象模式,可利用此參數建立備存文件的符號表-S:不產生符號表-u:只將日期較新文件插入庫文件中-v:程序執行時顯示詳細的信息-V:顯示版本信息

下面介紹幾個常用的:

參數 r :在庫中插入或替換模塊。當插入的模塊名已經在庫中存在,則替換同名的模塊。如果若干模塊中有一個模塊在庫中不存在,ar 顯示一個錯誤消息,并不替換其他同名模塊。默認的情況下,新的成員增加在庫的結尾處,不過也可以使用其他任選項來改變增加的位置。參數 c :創建一個庫。不管庫是否存在,都將創建。參數 s :創建目標文件索引,這在創建較大的庫時能加快時間。(補充:如果不需要創建索引,可改成大寫 S 參數;如果 .a 文件缺少索引,可以使用 ranlib 命令添加)參數 t :比如 ar t libxxx.a,表示顯示庫文件中有哪些目標文件,只顯示名稱。參數 v :比如 ar tv libxxx.a,表示顯示庫文件中有哪些目標文件,顯示文件名、時間、大小等詳細信息。nm -s libxxx.a :顯示庫文件中的索引表。ranlib libxxx.a :為靜態庫文件創建索引表。三、靜態庫的封裝

? 封裝庫就是將多個 .o 文件打包到一個文件中,所以我們可以使用 gnu 中的歸檔指令 ar -rc (其中 ar 代表 archiver,rc 選項表示 replace and create)封裝一個靜態庫。

? 所以下面我們用 makefile 將封裝指令使用起來,形成我們的靜態庫 libmymath.a :

代碼語言:javascript代碼運行次數:0運行復制

libmymath.a : add.o sub.o   # 使用ar指令封裝靜態庫ar -rc $@ $^      %.o : %.c      # %的作用是匹配目錄下的.c文件集合生成.o文件集合,與*號類似,但是%多用于makefile,且使用范圍不太一樣gcc -c $<cleanclean:rm libmymath.a mylib><figure class=""><img src="https://img.php.cn/upload/article/001/503/042/174488066080163.jpg" alt="【Linux系統IO】六、動靜態庫"></figure><p>? 這樣子還不夠,因為我們不僅僅需要將庫發給對方,我們還需要將頭文件也打包起來發給對方,考慮到如果頭文件太多也不好管理的情況,我們最好自己將頭文件和庫放在一個目錄下打包起來,所以我們可以在 makefile 中添加一個偽目標 output,其中我們調用 make output 的時候希望其能創建一個目錄將我們需要打包的頭文件和庫打包到一個目錄下:</p>代碼語言:javascript<i class="icon-code"></i>代碼運行次數:<!-- -->0<svg xmlns="http://www.w3.org/2000/svg" width="16"    style="max-width:90%" viewbox="0 0 16 16" fill="none"><path d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>運行<svg width="16" height="16" viewbox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor"></path></svg>復制<pre class="prism-token token line-numbers javascript">.PHONY : output      # output作為偽目標進行打包頭文件和靜態庫output:mkdir -p mylib/includemkdir -p mylib/libcp -f *.a mylib/libcp -f *.h mylib/include
【Linux系統IO】六、動靜態庫

? 除此之外,如果我們想安裝,也就是說這個庫和頭文件我希望不只是被對方使用,還能在我這個系統上面使用,所以可以安裝這些庫和頭文件,其實本質就是將頭文件放到 /usr/include 中,庫放到對應的庫目錄中比如 /lib64 中,所以我們現在也能清楚,安裝的本質就是將頭文件拷貝到系統的頭文件目錄下,庫拷貝到系統的庫目錄下!

? 參考下面代碼,這里就不貼調用效果了:

代碼語言:javascript代碼運行次數:0運行復制

.PHONY:installinstall:sudo cp *.h /usr/include  # 注意一般拷貝到系統目錄的時候要sudo一下sudo cp *.a /lib64

?

? 最后我們將這個 mylib 目錄壓縮變成一個包,一般采用 tar 指令進行壓縮,現在,我們的軟件就已經發布出來了,我們就可以將其打包然后放在網站或者 yum 的資源中供別人進行下載使用了:

【Linux系統IO】六、動靜態庫

四、靜態庫的使用

? 為什么要把靜態庫的使用單獨拎出來說呢,因為其中有很多坑,許多人打包完卻因為很多這些坑導致這些庫都調不起來,所以我們要好好來講一下!

? 下面假設我們在別的目錄下的 main.c 中調用該庫,在這之前先將這個包解壓到 main.c 目錄下:

【Linux系統IO】六、動靜態庫

? 接下來有了這個 mylib ,我們不就可以直接編譯鏈接 main.c 為可執行文件了嗎,下面我們來試試看:

【Linux系統IO】六、動靜態庫

? 奇怪,明明我們的庫和頭文件都有啊,為什么還報錯說找不到頭文件呢 ? ? ?

? 仔細一想,我們之前在學c語言的時候講過,如果頭文件使用雙引號括起來的,那么它首先會到源文件的當前目錄下查找,但是我們好像把庫和頭文件都放在了 mylib 中,深度相對于源文件更深了一點,所以 main.o 在鏈接的時候就找不到了!

【Linux系統IO】六、動靜態庫

? 不僅如此,就算我們等會解決了這個問題還會遇到其它問題,這里就不賣關子了,直接將幾個問題的解決方法一次性給出:

? 當我們鏈接庫時,必須指定庫的名稱,這是因為同一路徑下可能同時存在許多庫(頭文件不需要指定名稱,只需指定路徑,因為 main 中指明了我們需要的頭文件名稱),同時,庫需要去掉前綴 lib 和 后綴 .a 或者 .so 才是庫真正的名稱,也就是在我們編譯鏈接可執行文件的時候需要在 gcc 或者其它指令后面 指定頭文件路徑、庫文件路徑、庫文件名稱(注意要去掉前綴和后綴):

代碼語言:javascript代碼運行次數:0運行復制

gcc -o main main.c -I./mylib/include -L./mylib/lib -lmymath-I 指定頭文件路徑:告訴編譯器在./xxx路徑中找頭文件-L 指定庫文件路徑:告訴編譯器在./xxx路徑找庫-l 指定庫文件名:庫名稱(去掉前綴lib,去掉后綴.so或.a)

? 其中不管 -I 還是 -L ,其實它們和路徑之間是可以不留空格的,一般我們的書寫習慣也是不留空格!

【Linux系統IO】六、動靜態庫

? 為了方便,我們可以在 makefile 中將這些選項加入:

代碼語言:javascript代碼運行次數:0運行復制

libmymath.a : add.o sub.o   # 使用ar指令封裝靜態庫ar -rc $@ $^ -I./mylib/include -L./mylib/lib -lmymath%.o : %.cgcc -c $<outputoutput:mkdir mylib libmymath.a><p>? 平時我們使用編譯器提供的庫并不需要帶這些選項,是因為編譯器有自己的環境變量(LIBRARY_PATH),能夠找到位于 /lib64 庫文件的存放目錄和 /usr/include 頭文件的存放目錄。</p> <p>? 所以我們可以將我們寫的靜態庫和頭文件放入這些目錄或其他相關目錄下,這就是一般軟件的安裝過程。但是不推薦,因為放進去會污染標準庫(可能不安全)。</p>五、靜態鏈接的一個小問題<p>? 接下來還有一個問題,我們查看一下我們生成的可執行文件的屬性看看:</p> <figure class=""><img src="https://img.php.cn/upload/article/001/503/042/174488066173494.jpg" alt="【Linux系統IO】六、動靜態庫"></figure><p>? 這里還存在一個奇怪的地方:main 的依賴庫中并看不到 libmymath.a,并且 main 是動態鏈接的;這是由如下原因造成的:</p> <p>? 1、gcc 默認使用動態鏈接(只是建議行為),這是針對動靜態庫都存在的情況說的,如果只存在靜態庫,那么 Linux 也只能使用靜態鏈,但是如果存在動態庫,即使指明 Static 選項也只會使用動態鏈接;</p> <p>? 2、一個可執行程序的形成可能不僅僅只依賴一個庫,如果依賴的庫中有一部分不只有靜態庫,有一部分庫有動態庫,那么形成的可執行程序整體是動態鏈接的,但其中只有靜態庫的地方才會進行靜態鏈接;</p> <p>? 3、這里的現象和第二點一樣,main 的形成不僅僅依賴一個庫 (使用了 C 語言庫函數),且 Linux 中存在 C 語言動態庫,所以這里是使用動態鏈接的,而我們自己的庫 libmymath.a 以靜態的方式進行鏈接。</p>Ⅲ. 動態庫1、動態庫的概念<p>? 動態庫:這類函數庫通常名為 libxxx.so 或 xxx.dll 。</p> <p>? 與靜態函數庫被整個捕捉到程序中不同,動態函數庫在編譯的時候,在程序里只有一個 “指向庫” 的位置而已,也就是說當 可執行文件需要使用到函數庫的機制時,程序才會去讀取函數庫來使用;也就是說 可執行文件無法單獨運行。這樣從產品功能升級角度方便升級,只要替換對應動態庫即可,不必重新編譯整個可執行文件。</p> <p>? 動態庫可以在多個程序間共享,所以動態鏈接使得 可執行文件更小,節省了磁盤空間。<a style="color:#f60; text-decoration:underline;" title="操作系統" href="https://www.php.cn/zt/16016.html" target="_blank">操作系統</a>采用 虛擬內存機制允許物理內存中的一份動態庫被要用到該庫的所有進程共用,節省了內存和磁盤空間。</p> <p>? 一個與動態庫鏈接的可執行文件僅僅包含它用到的函數入口地址的一個表,而不是外部函數所在目標文件的整個機器碼。這種鏈接方式,是用于解決靜態庫存在的浪費內存和磁盤空間,以及解決模塊更新困難等問題。</p> <p>? 動態鏈接生成可執行程序,可執行程序中會記錄自己依賴的庫列表以及庫中的函數地址信息,等到運行程序的時候,由操作系統將庫加載到內存中(多個程序可以共享,不需要加載多份相同實例),然后根據庫加載后的地址在對每個程序內部用到的庫函數的地址進行偏移計算。</p> <p>? 動態庫也叫運行時庫,是運行時加載的庫,將庫中數據加載到內存中后,每個使用了動態庫的程序都要根據加載的起始位置計算內部函數以及變量地址,因此動態鏈接動態庫加載及運行速度是不如靜態鏈接的,但是它也有好處,就是多個程序在內存中只需要加載一份動態庫就可以共享使用。</p> <figure class=""><hr></figure><p>基于這么一種思想,動態鏈接具有以下優缺點:</p> <p>優點:</p>節省內存并減少頁面交換;庫文件與程序文件獨立,只要輸出接口不變,更換庫文件不會對程序文件造成任何影響,因而極大地提高了可維護性和可擴展性;不同編程語言編寫的程序只要按照函數調用約定就可以調用同一個庫函數;適用于大規模的軟件開發,使開發過程獨立、耦合度小,便于不同開發者和開發組織之間進行開發和測試。<p>缺點:</p>運行時依賴,所以找不到庫文件就會運行失敗加載動態庫的程序運行速度相對較慢,因為動態庫運行時加載,映射到虛擬地址空間后需要重新根據映射起始地址計算函數/變量地址需要對庫版本之間的兼容性做出更多處理二、動態庫的封裝<p>動態庫的制作和靜態庫存在很多相似的地方,但也有不同:</p>動態庫匯編 形成 .o 文件需要指定 fPIC 選項,用于 形成位置無關碼(與位置無關,庫文件可以在內存的任意位置加載,不影響其他程序的關聯性)動態庫歸檔不使用 ar 指令,而是 在 gcc 中指定 shard 選項就可以完成歸檔工作,表示生成共享庫形式。<p>? 同樣的,知道封裝動態庫的知識后,我們將所有 .o 文件進行打包并與頭文件合并成目錄:</p>代碼語言:javascript<i class="icon-code"></i>代碼運行次數:<!-- -->0<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 16 16" fill="none"><path d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>運行<svg width="16" height="16" viewbox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor"></path></svg>復制<pre class="prism-token token line-numbers javascript">libmymath.so : add.o sub.o   # 加上-shared封裝靜態庫gcc -shared -o $@ $^ %.o : %.c    # %的作用是匹配目錄下的.c文件集合生成.o文件集合,與*號類似,但是%多用于makefile,且使用范圍不太一樣gcc -fPIC -c $<figure class=""><img src="https://img.php.cn/upload/article/001/503/042/174488066285836.jpg" alt="【Linux系統IO】六、動靜態庫"></figure>三、動態庫的使用<p>? 和靜態庫一樣,我們先將 mylib 目錄文件壓縮,然后發到使用方那邊再解壓。接著還是一樣,我們在編譯鏈接成可執行文件的時候必須加上三個選項:頭文件路徑、庫文件路徑、庫文件名! </p><figure class=""><img src="https://img.php.cn/upload/article/001/503/042/174488066289355.jpg" alt="【Linux系統IO】六、動靜態庫"></figure><p>? 很奇怪啊,為什么找不到我們寫的動態庫呢,我們明明已經把頭文件路徑、庫文件路徑和庫文件名都加上去了啊,為什么還是找不到啊 ? ? ?</p><p>? 其實是因為雖然說我們是告訴了 gcc 我們的頭文件路徑等,但是當我們編譯鏈接生成可執行文件之后,gcc 可就不管我們了啊,我們執行一個可執行文件,這是和操作系統有關系的,通過加載到內存變成進程從而管理,但是操作系統哪里知道我們告訴了它這些頭文件路徑等等呢,并且我們的庫也不在系統中,所以 操作系統 和 shell 才會找不到!</p><p>? 所以要執行可執行文件的話我們必須告訴 操作系統 和 shell 關于庫的路徑!下面介紹四種方法!</p>方案一:更改環境變量LD_LIBRARY_PATH – 短暫性<p>? 在系統中有個環境變量叫做 LD_LIBRARY_PATH,其中該環境變量中放的就是一些指定的動態鏈接庫的路徑,我們可以利用 export 指令將我們要存放的動態鏈接庫的路徑添加進去,注意要添加絕對路徑! </p><figure class=""><img src="https://img.php.cn/upload/article/001/503/042/174488066236729.jpg" alt="【Linux系統IO】六、動靜態庫"></figure><p>? 這里需要注意的是:添加環境變量后,默認只在本次登錄有效,下次登錄時無效(默認清理登錄前一次添加環境變量)。如果想讓這個環境變量永久生效,可以把這個環境變量添加到登錄相關的啟動腳本里,下面兩個都行,但是不建議,如果真要改,多開幾個終端,防止改了之后登不上 Linux:</p>代碼語言:javascript<i class="icon-code"></i>代碼運行次數:<!-- -->0<svg xmlns="http://www.w3.org/2000/svg" width="16"    style="max-width:90%" viewbox="0 0 16 16" fill="none"><path d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>運行<svg width="16" height="16" viewbox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor"></path></svg>復制<pre class="prism-token token line-numbers javascript">vim ~/.bash_profilevim ~/.bashrc

方案二:將動態庫和頭文件拷貝至對應的系統庫路徑(/lib64)和頭文件路徑(/usr/include)下(不推薦)

? 這個我們上面講過,這里就不講了,并且不推薦,因為會污染系統文件池!

方案三:配置文件 –永久性代碼語言:javascript代碼運行次數:0運行復制

[liren@VM-8-2-centos use_library]$ ll -d /etc/ld.so.conf.d/drwxr-xr-x. 2 root root 4096 Jul 25  2022 /etc/ld.so.conf.d/

? 在我們系統中存在一個系統搜索動態庫的路徑配置文件目錄 /etc/ld.so.conf.d/ ,我們可以在這個目錄創建 .conf 配置文件,向配置文件中添加我們的動態庫的 絕對路徑 即可!(這個配置文件的名稱是可以隨便取的)

? 添加絕對路徑后,我們還要使用 ldconfig 指令來更新一下這些配置文件,才能生效!

【Linux系統IO】六、動靜態庫

方案四:創建軟鏈接

? 在當前文件路徑下建立軟鏈接,注意這個軟鏈接的名稱要和動態庫的名稱一樣,因為在尋找庫的時候我們指定了用庫文件名!

【Linux系統IO】六、動靜態庫

Ⅳ. 動靜態庫的加載一、靜態庫的加載

? 首先,我們要知道,靜態庫不需要加載!

? 這個過程,在磁盤中 main.c 和 lib.c 庫,會先在磁盤中形成一段代碼,然后對這段代碼進行編譯,編譯的本質就是預處理,編譯-查找錯誤,形成二進制代碼,然后進行匯編形成二級制指令。在編譯階段的時候就已經形成了虛擬地址空間。

? 在虛擬地址空間中,這段代碼也就被存入代碼區,這個是根據不同區的特性所決定的。當執行這段代碼的時候,操作系統就會直接在代碼區進行訪問。

【Linux系統IO】六、動靜態庫

二、動態庫的加載

? 動態庫加載的過程,在磁盤中有一個 my.exe(可執行)和 lib.so(動態庫),在形成可執行之前,編譯階段時,我們用到了 fPIC(產生位置無關碼)。

? 在這個階段,動態庫會將指定的函數地址,寫入到可執行文件中。這個地址可以理解成 my_add.c(地址) + 偏移地址。

? 形成可執行文件之后,磁盤將可執行文件拷貝到內存中,內存通過頁表映射到虛擬地址空間的代碼區中,當 OS 執行程序時,掃描到 my_add.c 是需要調用動態庫的時候,程序會停下來,OS 會再通過函數的地址,然后頁表映射去內存到磁盤中找動態庫中,找到后拷貝到內存,又通過頁表映射到共享區中。OS 再去 共享區 調用該方法,然后向下執行程序。

? 注意:動態庫可以避免靜態庫內存空間浪費的問題,這是由于如果多個進程鏈接了同一個動態庫,動態庫也只需要加載一次。動態庫被加載到物理內存中并通過頁表映射到某一個進程(假設A進程)的共享區之后,操作系統會記錄該動態庫在A進程共享區中的地址,當其他進程也需要執行動態庫代碼時,操作系統會根據記錄的地址加上偏移量通過頁表跳轉到A進程的共享區中執行函數,執行完畢后再跳回到當前進程地址空間的代碼段處。

? 所以 從始至終物理內存中都只有一份動態庫代碼。

【Linux系統IO】六、動靜態庫

相關閱讀

主站蜘蛛池模板: 成人精品一区二区激情 | 亚洲一区二区三区欧美 | 亚洲综合在线另类色区奇米 | 国产成人aaa在线视频免费观看 | 香蕉久久夜色精品国产尤物 | 国产精品国色综合久久 | 夜间福利在线观看 | 免费看片亚洲 | 全部孕妇毛片丰满孕妇孕交 | 精品伊人久久久久7777人 | 欧美成人手机在线 | 九九视频高清视频免费观看 | 免费看一区二区三区 | 精品国产欧美精品v | 久久亚洲精品中文字幕 | 手机国产日韩高清免费看片 | 国产高清美女一级毛片久久 | 久久国产精品免费网站 | 一a一级片 | 黄在线观看在线播放720p | 免费视频网站一级人爱视频 | 日本免费三级网站 | 国产精品亚洲一区二区在线观看 | 久久国产精品高清一区二区三区 | 最新69成人精品毛片 | 真正全免费视频a毛片 | 成人一级片| 日本一级大毛片a一 | 欧美大片一区二区三区 | 欧美在线三级 | 亚洲香蕉一区二区三区在线观看 | 国产成人午夜极速观看 | 欧美7777| 91国内精品视频 | a级毛片毛片免费很很综合 a级毛片免费 | 亚洲精品一区二区三区五区 | 亚洲日韩中文字幕在线播放 | caoporen免费公开视频上传 | 三级毛片在线播放 | 日韩精品视频一区二区三区 | 韩国女主播青草在线观看 |