《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > Linux教學——Linux 動態鏈接過程中的【重定位】底層原理

Linux教學——Linux 動態鏈接過程中的【重定位】底層原理

2022-11-02
作者:道哥
來源:電子技術應用專欄作家 一口Linux

  動態鏈接要解決什么問題?

  靜態鏈接得到的可執行程序,被操作系統加載之后就可以執行執行。

  因為在鏈接的時候,鏈接器已經把所有目標文件中的代碼、數據等Section,都組裝到可執行文件中了。

  并且把代碼中所有使用的外部符號(變量、函數),都進行了重定位(即:把變量、函數的地址,都填寫到代碼段中需要重定位的地方),因此可執行程序在執行的時候,不依賴于其它的外部模塊即可運行。

  詳細的靜態鏈接過程,請參考上一篇文章:【圖片+代碼】:GCC 鏈接過程中的【重定位】過程分析。

  也就是說:符號重定位的過程,是直接對可執行文件進行修改。

  但是對于動態鏈接來說,在編譯階段,僅僅是在可執行文件或者動態庫中記錄了一些必要的信息。

  真正的重定位過程,是在這個時間點來完成的:可執行程序、動態庫被加載之后,調用可執行程序的入口函數之前。

  只有當所有需要被重定位的符號被解決了之后,才能開始執行程序。

  既然也是重定位,與靜態鏈接過程一樣:也需要把符號的目標地址填寫到代碼段中需要重定位的地方。

  矛盾:代碼段不可寫

  問題來了!

  我們知道,在現代操作系統中,對于內存的訪問是有權限控制的,一般來說:

  代碼段:可讀、可執行;

  數據段:可讀、可寫;

  如果進行符號重定位,就需要對代碼進行修改(填寫符號的地址),但是代碼段又沒有可寫的權限,這是一個矛盾!

  微信截圖_20221102164425.png

  解決這個矛盾的方案,就是Linux系統中動態鏈接器的核心工作!

  解決矛盾:增加一層間接性

  David Wheeler有一句名言:“計算機科學中的大多數問題,都可以通過增加一層間接性來解決。”

  解決動態鏈接中的代碼重定位問題,同樣也可以通過增加一層間接性來解決。

  既然代碼段在被加載到內存中之后不可寫,但是數據段是可寫的。

  在代碼段中引用的外部符號,可以在數據段中增加一個跳板:讓代碼段先引用數據段中的內容,然后在重定位時,把外部符號的地址填寫到數據段中對應的位置,不就解決這個矛盾了嗎?!

  如下圖所示:

  微信截圖_20221102164500.png

  理解了上圖的解決思路,基本上就理解了動態鏈接過程中重定位的核心思想。

  示例代碼

  我們需要3個源文件來討論動態鏈接中重定位的過程:main.c、a.c、b.c,其中的a.c和b.c被編譯成動態庫,然后main.c與這兩個動態庫一起動態鏈接成可執行程序。

  它們之間的依賴關系是:

  微信截圖_20221102164521.png

  b.c

  代碼如下:

  #include <stdio.h>

  int b = 30;

  void func_b(void)

  {

  printf("in func_b. b = %d \n", b);

  }

  代碼說明:

  定義一個全局變量和一個全局函數,被 a.c 調用。

  a.c

  代碼如下(稍微復雜一些,主要是為了探索:不同類型的符號如何處理重定位):

  #include <stdio.h>

  // 內部定義【靜態】全局變量

  static int a1 = 10;

  // 內部定義【非靜態】全局變量

  int a2 = 20;

  // 聲明外部變量

  extern int b;

  // 聲明外部函數

  extern void func_b(void);

  // 內部定義的【靜態】函數

  static void func_a2(void)

  {

  printf("in func_a2 \n");

  }

  // 內部定義的【非靜態】函數

  void func_a3(void)

  {

  printf("in func_a3 \n");

  }

  // 被 main 調用

  void func_a1(void)

  {

  printf("in func_a1 \n");

  // 操作內部變量

  a1 = 11;

  a2 = 21;

  // 操作外部變量

  b  = 31;

  // 調用內部函數

  func_a2();

  func_a3();

  // 調用外部函數

  func_b();

  }

  代碼說明:

  定義了 2 個全局變量:一個靜態,一個非靜態;

  定義了 3 個函數:

  func_a2是靜態函數,只能在本文件中調用;

  func_a1和func_a3是全局函數,可以被外部調用;

  在 main.c 中會調用func_a1。


  main.c

  代碼如下:

  #include <stdio.h>

  #include <unistd.h>

  #include <dlfcn.h>

  // 聲明外部變量

  extern int a2;

  extern void func_a1();

  typedef void (*pfunc)(void);

  int main(void)

  {

  printf("in main \n");

  // 打印此進程的全局符號表

  void *handle = dlopen(0, RTLD_NOW);

  if (NULL == handle)

  {

  printf("dlopen failed! \n");

  return -1;

  }

  printf("\n------------ main ---------------\n");

  // 打印 main 中變量符號的地址

  pfunc addr_main = dlsym(handle, "main");

  if (NULL != addr_main)

  printf("addr_main = 0x%x \n", (unsigned int)addr_main);

  else

  printf("get address of main failed! \n");

  printf("\n------------ liba.so ---------------\n");

  // 打印 liba.so 中變量符號的地址

  unsigned int *addr_a1 = dlsym(handle, "a1");

  if (NULL != addr_a1)

  printf("addr_a1 = 0x%x \n", *addr_a1);

  else

  printf("get address of a1 failed! \n");

  unsigned int *addr_a2 = dlsym(handle, "a2");

  if (NULL != addr_a2)

  printf("addr_a2 = 0x%x \n", *addr_a2);

  else

  printf("get address of a2 failed! \n");

  // 打印 liba.so 中函數符號的地址

  pfunc addr_func_a1 = dlsym(handle, "func_a1");

  if (NULL != addr_func_a1)

  printf("addr_func_a1 = 0x%x \n", (unsigned int)addr_func_a1);

  else

  printf("get address of func_a1 failed! \n");

  pfunc addr_func_a2 = dlsym(handle, "func_a2");

  if (NULL != addr_func_a2)

  printf("addr_func_a2 = 0x%x \n", (unsigned int)addr_func_a2);

  else

  printf("get address of func_a2 failed! \n");

  pfunc addr_func_a3 = dlsym(handle, "func_a3");

  if (NULL != addr_func_a3)

  printf("addr_func_a3 = 0x%x \n", (unsigned int)addr_func_a3);

  else

  printf("get address of func_a3 failed! \n");

  printf("\n------------ libb.so ---------------\n");

  // 打印 libb.so 中變量符號的地址

  unsigned int *addr_b = dlsym(handle, "b");

  if (NULL != addr_b)

  printf("addr_b = 0x%x \n", *addr_b);

  else

  printf("get address of b failed! \n");

  // 打印 libb.so 中函數符號的地址

  pfunc addr_func_b = dlsym(handle, "func_b");

  if (NULL != addr_func_b)

  printf("addr_func_b = 0x%x \n", (unsigned int)addr_func_b);

  else

  printf("get address of func_b failed! \n");

  dlclose(handle);

  // 操作外部變量

  a2 = 100;

  // 調用外部函數

  func_a1();

  // 為了讓進程不退出,方便查看虛擬空間中的地址信息

  while(1) sleep(5);

  return 0;

  }

  糾正:代碼中本來是想打印變量的地址的,但是不小心加上了 *,變成了打印變量值。最后檢查的時候才發現,所以就懶得再去修改了。

  代碼說明:

  利用 dlopen 函數(第一個參數傳入 NULL),來打印此進程中的一些符號信息(變量和函數);

  賦值給 liba.so 中的變量 a2,然后調用 liba.so 中的 func_a1 函數;

  編譯成動態鏈接庫

  把以上幾個源文件編譯成動態庫以及可執行程序:

  $ gcc -m32 -fPIC --shared b.c -o libb.so

  $ gcc -m32 -fPIC --shared a.c -o liba.so -lb -L./

  $ gcc -m32 -fPIC main.c -o main -ldl -la -lb -L./

  有幾點內容說明一下:

  -fPIC 參數意思是:生成位置無關代碼(Position Independent Code),這也是動態鏈接中的關鍵;

  既然動態庫是在運行時加載,那為什么在編譯的時候還需要指明?

  因為在編譯的時候,需要知道每一個動態庫中提供了哪些符號。Windows 中的動態庫的顯性的導出和導入標識,更能體現這個概念(__declspec(dllexport), __declspec(dllimport))。

  此時,就得到了如下幾個文件:

  微信截圖_20221102164840.png

  動態庫的依賴關系

  對于靜態鏈接的可執行程序來說,被操作系統加載之后,可以認為直接從可執行程序的入口函數開始(也就是ELF文件頭中指定的e_entry這個地址),執行其中的指令碼。

  但是對于動態鏈接的程序來說,在執行入口函數的指令之前,必須把該程序所依賴的動態庫加載到內存中,然后才能開始執行。

  對于我們的實例代碼來說:main程序依賴于liba.so庫,而liba.so庫又依賴于libb.so庫。

  可以用ldd工具來分別看一下動態庫之間的依賴關系:

 微信截圖_20221102165434.png

  可以看出:

  在 liba.so 動態庫中,記錄了信息:依賴于 libb.so;

  在 main 可執行文件中,記錄了信息:依賴于 liba.so, libb.so;

  也可以使用另一個工具patchelf來查看一個可執行程序或者動態庫,依賴于其他哪些模塊。例如:

  微信截圖_20221102165456.png

  那么,動態庫的加載是由誰來完成的呢?動態鏈接器!

  動態庫的加載過程

  動態鏈接器加載動態庫

  當執行main程序的時候,操作系統首先把main加載到內存,然后通過.interp段信息來查看該文件依賴哪些動態庫:

  微信截圖_20221102165702.png

  上圖中的字符串/lib/ld-linux.so.2,就表示main依賴動態鏈接庫。

  ld-linux.so.2也是一個動態鏈接庫,在大部分情況下動態鏈接庫已經被加載到內存中了(動態鏈接庫就是為了共享),操作系統此時只需要把動態鏈接庫所在的物理內存,映射到 main進程的虛擬地址空間中就可以了,然后再把控制權交給動態鏈接器。

  動態鏈接器發現:main依賴liba.so,于是它就在虛擬地址空間中找一塊能放得下liba.so的空閑空間,然后把liba.so中需要加載到內存中的代碼段、數據段都加載進來。

  當然,在加載liba.so時,又會發現它依賴libb.so,于是又把在虛擬地址空間中找一塊能放得下libb.so的空閑空間,把libb.so中的代碼段、數據段等加載到內存中,示意圖如下所示:

  微信截圖_20221102165727.png

  動態鏈接器自身也是一個動態庫,而且是一個特殊的動態庫:它不依賴于其他的任何動態庫,因為當它被加載的時候,沒有人幫它去加載依賴的動態庫,否則就形成雞生蛋、蛋生雞的問題了。

  動態庫的加載地址

  一個進程在運行時的實際加載地址(或者說虛擬內存區域),可以通過指令:$ cat /proc/[進程的 pid]/maps 讀取出來。

  例如:我的虛擬機中執行main程序時,看到的地址信息是:

  微信截圖_20221102165755.png

  黃色部分分別是:main, liba.so, libb.so 這3個模塊的加載信息。

  另外,還可以看到c庫(libc-2.23.so)、動態鏈接器(ld-2.23.so)以及動態加載庫libdl-2.23.so的虛擬地址區域,布局如下:

  微信圖片_20221102165852.png

  可以看出出來:main可執行程序是位于低地址,所有的動態庫都位于4G內存空間的最后1G空間中。

  還有另外一個指令也很好用 $ pmap [進程的 pid],也可以打印出每個模塊的內存地址:

  微信截圖_20221102170205.png

  符號重定位

  全局符號表

  在之前的靜態鏈接中學習過,鏈接器在掃描每一個目標文件(.o文件)的時候,會把每個目標文件中的符號提取出來,構成一個全局符號表。

  然后在第二遍掃描的時候,查看每個目標文件中需要重定位的符號,然后在全局符號表中查找該符號被安排在什么地址,然后把這個地址填寫到引用的地方,這就是靜態鏈接時的重定位。

  但是動態鏈接過程中的重定位,與靜態鏈接的處理方式差別就大很多了,因為每個符號的地址只有在運行的時候才能知道它們的地址。

  例如:liba.so引用了libb.so中的變量和函數,而libb.so中的這兩個符號被加載到什么位置,直到main程序準備執行的時候,才能被鏈接器加載到內存中的某個隨機的位置。

  也就是說:動態鏈接器知道每個動態庫中的代碼段、數據段被加載的內存地址,因此動態鏈接器也會維護一個全局符號表,其中存放著每一個動態庫中導出的符號以及它們的內存地址信息。

  在示例代碼main.c函數中,我們通過dlopen返回的句柄來打印進程中的一些全局符號的地址信息,輸出內容如下:

  微信截圖_20221102170236.png

  上文已經糾錯過:本來是想打印變量的地址信息,但是 printf 語句中不小心加上了型號,變成了打印變量值。

  可以看到:在全局符號表中,沒有找到liba.so中的變量a1和函數func_a2這兩個符號,因為它倆都是static類型的,在編譯成動態庫的時候,沒有導出到符號表中。

  既然提到了符號表,就來看看這 3 個ELF文件中的動態符號表信息:

  動態鏈接庫中保護兩個符號表:.dynsym(動態符號表: 表示模塊中符號的導出、導入關系) 和 .symtab(符號表: 表示模塊中的所有符號);

  .symtab 中包含了 .dynsym;

  由于圖片太大,這里只貼出 .dynsym 動態符號表。

  綠色矩形框前面的Ndx列是數字,表示該符號位于當前文件的哪一個段中(即:段索引);

  紅色矩形框前面的Ndx列是UND,表示這個符號沒有找到,是一個外部符號(需要重定位);

  微信截圖_20221102170520.png      微信截圖_20221102170533.png

  全局偏移表GOT

  在我們的示例代碼中,liba.so是比較特殊的,它既被main可執行程序所依賴,又依賴于libb.so。

  而且,在liba.so中,定義了靜態、動態的全局變量和函數,可以很好的概況很多種情況,因此這部分內容就主要來分析liba.so這個動態庫。

  前文說過:代碼重定位需要修改代碼段中的符號引用,而代碼段被加載到內存中又沒有可寫的權限,動態鏈接解決這個矛盾的方案是:增加一層間接性。

  例如:liba.so的代碼中引用了libb.so中的變量b,在liba.so的代碼段,并不是在引用的地方直接指向libb.so數據段中變量b的地址,而是指向了liba.so自己的數據段中的某個位置,在重定位階段,鏈接器再把libb.so中變量b的地址填寫到這個位置。

  因為liba.so自己的代碼段和數據段位置是相對固定的,這樣的話,liba.so的代碼段被加載到內存之后,就再也不用修改了。

  而數據段中這個間接跳轉的位置,就稱作:全局偏移表(GOT: Global Offset Table)。

  劃重點:

  liba.so的代碼段中引用了libb.so中的符號b,既然b的地址需要在重定位時才能確定,那么就在數據段中開辟一塊空間(稱作:GOT表),重定位時把b的地址填寫到GOT表中。

  而liba.so的代碼段中,把GOT表的地址填寫到引用b的地方,因為GOT表在編譯階段是可以確定的,使用的是相對地址。

  這樣,就可以在不修改liba.so代碼段的前提下,動態的對符號b進行了重定位!

  其實,在一個動態庫中存在 2 個GOT表,分別用于重定位變量符號(section名稱:.got)和函數符號( section 名稱:.got.plt)。

  也就是說:所有變量類型的符號重定位信息都位于.got中,所有函數類型的符號重定位信息都位于.got.plt中。

  并且,在一個動態庫文件中,有兩個特殊的段(.rel.dyn和.rel.plt)來告訴鏈接器:.got和.got.plt這兩個表中,有哪些符號需要進行重定位,這個問題下面會深入討論。

  liba.so動態庫文件的布局

  為了更深刻的理解.got和.got.plt這兩個表,有必要來拆解一下liba.so動態庫文件的內部結構。

  通過readelf -S liba.so指令來看一下這個ELF文件中都有哪些section:

  微信截圖_20221102170606.png

  可以看到:一共有28個section,其中的21、22就是兩個GOT表。

  另外,從裝載的角度來看,裝載器并不是把這些sections分開來處理,而是根據不同的讀寫屬性,把多個section看做一個segment。

  再次通過指令 readelf -l liba.so ,來查看一下segment信息:

  微信截圖_20221102170627.png

  也就是說:

  這28個section中(關注綠色線條):

  section 0 ~ 16 都是可讀、可執行權限,被當做一個 segment;

  section 17 ~ 24 都是可讀、可寫的權限,被動作另一個 segment;

  再來重點看一下.got和.got.plt這兩個section(關注黃色矩形框):

  可見:.got和.got.plt與數據段一樣,都是可讀、可寫的,所以被當做同一個 segment被加載到內存中。

  通過以上這2張圖(紅色矩形框),可以得到liba.so動態庫文件的內部結構如下:

  微信截圖_20221102170644.png

  liba.so動態庫的虛擬地址

  來繼續觀察liba.so文件segment信息中的AirtAddr列,它表示的是被加載到虛擬內存中的地址,重新貼圖如下:

  微信截圖_20221102170710.png

  因為編譯動態庫時,使用了代碼位置無關參數(-fPIC),這里的虛擬地址從0x0000_0000開始。

  當liba.so的代碼段、數據段被加載到內存中時,動態鏈接器找到一塊空閑空間,這個空間的開始地址,就相當于一個基地址。

  liba.so中的代碼段和數據段中所有的虛擬地址信息,只要加上這個基地址,就得到了實際虛擬地址。

  我們還是把上圖中的輸出信息,畫出詳細的內存模型圖,如下所示:

  微信截圖_20221102170726.png

  GOT表的內部結構

  現在,我們已經知道了liba.so庫的文件布局,也知道了它的虛擬地址,此時就可以來進一步的看一下.got和.got.plt這兩個表的內部結構了。

  從剛才的圖片中看出:

  .got 表的長度是 0x1c,說明有 7 個表項(每個表項占 4 個字節);

  .got.plt 表的長度是 0x18,說明有 6 個表項;

  上文已經說過,這兩個表是用來重定位所有的變量和函數等符號的。

  那么:liba.so通過什么方式來告訴動態鏈接器:需要對.got和.got.plt這兩個表中的表項進行地址重定位呢?

  在靜態鏈接的時候,目標文件是通過兩個重定位表.rel.text和.rel.data這兩個段信息來告訴鏈接器的。

  對于動態鏈接來說,也是通過兩個重定位表來傳遞需要重定位的符號信息的,只不過名字有些不同:.rel.dyn和.rel.plt。

  通過指令 readelf -r liba.so來查看重定位信息:

  微信截圖_20221102170746.png

  從黃色和綠色的矩形框中可以看出:

  liba.so 引用了外部符號 b,類型是 R_386_GLOB_DAT,這個符號的重定位描述信息在 .rel.dyn 段中;

  liba.so 引用了外部符號 func_b, 類型是 R_386_JUMP_SLOT,這個符號的重定位描述信息在 .rel.plt 段中;

  從左側紅色的矩形框可以看出:每一個需要重定位的表項所對應的虛擬地址,畫成內存模型圖就是下面這樣:

  微信截圖_20221102170844.png

  暫時只專注表項中的紅色部分:.got表中的b, .got.plt表中的func_b,這兩個符號都是libb.so中導出的。

  也就是說:

  liba.so的代碼中在操作變量b的時候,就到.got表中的0x0000_1fe8這個地址處來獲取變量b的真正地址;

  liba.so的代碼中在調用func_b函數的時候,就到.got.plt表中的0x0000_200c這個地址處來獲取函數的真正地址;

  反匯編liba.so代碼

  下面就來反匯編一下liba.so,看一下指令碼中是如何對這兩個表項進行尋址的。

  執行反匯編指令:$ objdump -d liba.so,這里只貼出func_a1函數的反匯編代碼:

  微信截圖_20221102170900.png

  第一個綠色矩形框(call 490 <__x86.get_pc_thunk.bx>)的功能是:把下一條指令(add)的地址存儲到%ebx中,也就是:

  %ebx = 0x622

  然后執行: add $0x19de,%ebx,讓%ebx加上0x19de,結果就是:%ebx = 0x2000。

  0x2000正是.got.plt表的開始地址!

  看一下第2個綠色矩形框:

  mov -0x18(%ebx),%eax: 先用%ebx減去0x18的結果,存儲到%eax中,結果是:%eax = 0x1fe8,這個地址正是變量b在.got表中的虛擬地址。

  movl $0x1f,(%eax):在把0x1f(十進制就是31),存儲到0x1fe8表項中存儲的地址所對應的內存單元中(libb.so的數據段中的某個位置)。

  因此,當鏈接器進行重定位之后,0x1fe8表項中存儲的就是變量b的真正地址,而上面這兩步操作,就把數值31賦值給變量b了。

  第3個綠色矩形框,是調用函數func_b,稍微復雜一些,跳轉到符號 func_b@plt的地方,看一下反匯編代碼:

  微信截圖_20221102170917.png

  jmp指令調用了%ebx + 0xc處的那個函數指針,從上面的.got.plt布局圖中可以看出,重定位之后這個表項中存儲的正是func_b函數的地址(libb.so中代碼段的某個位置),所以就正確的跳轉到該函數中了。

更多信息可以來這里獲取==>>電子技術應用-AET<<


微信圖片_20210517164139.jpg

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 欧美性视频在线 | 福利视频精品 | 免费看污视频的网站 | 五十路熟女一区二区三区 | www.国产精品一区 | 丰满少妇作爱视频免费观看 | 日韩欧美精品免费 | 91午夜剧场 | 久久996re热这里只有精品无码 | 中国男女全黄大片 | 青娱乐极品视觉盛宴av | 国产精品婷婷午夜在线观看 | 亚洲成a人v欧美综合天堂麻豆 | 五月婷婷六月丁香 | 柠檬福利视频导航 | 中文字幕人妻偷伦在线视频 | 女仆高潮hd理论片 | 国产精品久久久久久久久久小说 | 天堂无码人妻精品一区二区三区 | 美女啪啪国产 | 在线中文字幕乱码英文字幕正常 | 欧美日韩a√ | www黄色片网站 | 欧美一级在线看 | 中文成人无码精品久久久 | 日本人丰满少妇xxxxx | 在线观看国产精品视频 | 国产成人av一区二区 | 高清视频在线观看一区二区三区 | 日本三级日产三级国产三级 | 欧美午夜特黄aaaaaa片 | 日本久久久久久久久久久 | 一级二级三级毛片 | 麻豆精品国产入口 | 免费一区视频 | wwwxxx亚洲| 国产99久久久久久免费看农村 | 狼人av在线 | 天天做天天爽 | 黑白配高清在线观看免费版中文 | 五月婷婷激情 | 国产一区二区精品久久 | 荷兰成人性大交视频 | 国产精品久久国产精品99 | 无码一区二区三区免费 | 50路60路老熟妇啪啪 | 少妇精品久久久一区二区三区 | 少妇一区二区视频 | 人妻熟妇乱又伦精品视频app | 极品熟妇大蝴蝶20p 国产女人高潮叫床视频 | 综合精品一区 | 白洁av| 亚洲天堂手机在线 | 岛国视频一区 | 中产乱码中文在线观看免费软件 | 久久伊人一区 | 精品国产粉嫩内射白浆内射双马尾 | 日韩成人在线看 | 国产午夜不卡片免费视频 | 欧美午夜性春猛交xxxx明星 | 38在线视频| 久久久精品一区aaa片 | 无码精品人妻一区二区三区免费看 | 熟女丰满老熟女熟妇 | 精品国产乱码久久久久久天狼 | 小视频在线免费观看 | 国产精品欧美激情在线播放 | 特级西西444ww大胆视频 | 国产成人精品白浆久久69 | 农村妇女毛片精品久久久 | 色 综合 欧美 亚洲 国产 | 久草视频在线资源 | 免费级毛片 | 欧美日皮视频 | 成人区人妻精品一区二区不卡网站 | 台湾佬中文娱乐网址 | 欧美激情一区二区三区在线 | 男人天堂你懂的 | 日韩一级片在线观看 | 久久98| 首页 亚洲 欧美 制服 丝腿 | 国产欧美日韩va另类在线播放 | 精品国产免费久久 | 九草在线| 欧美福利一区二区三区 | 亚洲线精品一区二区三区影音先锋 | 欧美精品免费在线观看 | 国产精品成人一区二区三区视频 | 女人脱了内裤趴开腿让男躁 | 久久精品视 | 色丁香av | 伊人精品久久久大香线蕉 | 欧美你懂得 | 亚洲精品美女久久久久网站 | 爽成人777777婷婷 | 中文字幕一精品亚洲无线一区 | 无码专区一ⅴa亚洲v天堂 | 国产福利酱国产一区二区 | 亚洲区自拍 | 最近中文字幕在线 | 91久久中文字幕 | 小舞同人18吸乳羞羞在线观看 | 99国产精品久久久久久久成人 | 免费黄色成人 | 国产一区99 | 久久疯狂做爰流白浆xx | 日韩欧美中字 | 91亚洲国产成人久久精品麻豆 | 中文字幕一区二区三 | 国产精品嫩草影院精东 | 精品人妻人人做人人爽 | 久久久久久久久嫩草精品乱码 | 久久午夜羞羞影院免费观看 | 美女视频黄色在线观看 | 国产精品v欧美精品v日韩 | 日韩第四页 | 好吊色视频988gao在线观看 | 美女视频黄色免费 | 91私密视频| 人善交类欧美重口另类 | 日韩精品亚洲人成在线观看 | 精品人妻伦一二三区久久 | www.麻豆av| 国产一区二区不卡在线 | 国产亚洲精久久久久久无码77777 | 日本xxxx裸体xxxx视频大全 | 日本免费视频在线观看 | 国产精品嫩草影院入口日本一区二 | 新婚若妻侵犯中文字幕 | 性做久久久久久久免费看 | 国产成人av一区二区三区在线观看 | 国产成人亚洲精品自产在线 | 超高清日韩aⅴ大片美女图片 | 国产精品成人一区二区三区 | 欧美一级三级 | 国产精品丝袜在线 | 欧美日韩国产伦理 | 伊人久久大香线蕉综合四虎小说 | 麻豆三级在线观看 | 久久久av波多野一区二区 | 久久机热这里只有精品 | 成人免费网站入口www | 精品国产乱码一区二区三区99 | 国产91久久久 | 国精品午夜福利视频不卡 | 精品亚洲成a人无码成a在线观看 | 国产香蕉尹人视频在线 | 日韩午夜激情视频 | 黑人邻居太猛中文字幕hd | 极品尤物一区二区三区 | 国产福利影院 | 成人动漫综合网 | 国产人成在线视频 | 爱情岛av亚洲论坛自拍品质 | 摸丰满大乳奶水www免费 | 日日碰狠狠丁香久燥 | 亚洲再线 | 97夜色| 9cao| 亚洲欧美日本韩国 | 欧美精品一区二区三区四区 | 国产成人无码一二三区视频 | 中文字幕天天躁日日躁狠狠躁免费 | 国内黄色一级片 | 在线理论片 | 国产精品免费一区 | 丰满少妇理论片bd高清 | 亚洲自拍另类 | 久久99久久99精品免视看婷婷 | 大象传媒成人在线观看 | 91丨porny丨对白 | 亚洲拍拍 | 亚洲欧洲一区二区在线观看 | 精品国产乱码久久久久久天狼 | 91精品国产综合久久小美女 | 久久无码人妻精品一区二区三区 | 国产人成视频在线观看 | 7777久久久国产精品 | av在线播放国产 | 99久久免费看精品国产一区 | 免费成人在线观看 | 一级黄色免费 | 高清视频在线播放 | 欧美性猛交xxx嘿人猛交 | 人妻少妇乱子伦精品 | 天堂а√8在线最新版在线 大地资源中文第三页 | 日日操操 | 日韩精品毛片无码一区到三区 | 成人午夜免费毛片 | 国产在线精品国自产拍影院同性 | 中国内地毛片免费高清 | 久久国产精品久久久久久电车 | 国产精品久久久久久福利一牛影视 | 日日摸夜夜摸狠狠摸婷婷 | 国产一区二区三四区 | 亚洲蜜桃av | 韩国精品一区二区三区无码视频 | 丰满人妻妇伦又伦精品国产 | 国产黑丝在线 | 激情网站免费 | 欧美一区二区三区免费在线观看 | 亚洲人av高清无码 | 一级国产精品一级国产精品片 | 女女同性女同区二区国产 | 午夜免费福利 | yy8090新视觉午夜毛片 | 伊人夜色| 国产精品无码翘臀在线观看 | 谁有av网址 | 日本欧美色十大禁片毛片 | 国产亚洲天堂网 | 国产一区二区三区影院 | 福利国产片 | 91亚洲网| 极品销魂美女特嫩bbb片 | 欧产日产国产精品 | 丁香激情综合久久伊人久久 | 999re5这里只有精品 | 亚洲中文字幕av在天堂 | 夜夜嗨网站 | 国产一区二区在线免费 | 国产免费久久精品国产传媒 | 免费的黄网站在线观看 | 免费网站永久免费入口 | av天天操 | 又粗又硬又猛又黄网站在线观看高清观看视频 | 极品福利视频 | 免费在线黄色av | 国产精品一区二区人人爽79欧美 | 日日躁夜夜躁狠狠躁超爽2001 | 久热re这里精品视频在线6 | 久久最新精品 | 午夜久久久久久久久 | 99精品久久久久久久免费看蜜月 | 自拍偷自拍亚洲精品偷一 | 一区二区三区激情 | 色呦呦在线免费观看 | 视频免费精品 | 91精品国产影片一区二区三区 | 亚洲天堂男 | 伊人成综合网 | 视频丨9l丨白浆 | 手机在线毛片 | 香蕉网在线观看 | 三级视频久久 | 色热热| 免费视频一区二区 | 亚洲色精品aⅴ一区区三区 国产黄大片在线观看 | 后入内射无码人妻一区 | 国产精品亚洲色婷婷99久久精品 | 久久这里只有精品国产 | 强睡邻居人妻中文字幕 | 亚洲精品一区二区另类图片 | 欧美在线资源 | 黄色片在线视频 | 人妻被按摩到潮喷中文字幕 | ass精品国模裸体pics | 亚洲成人aa | www.狠狠| 二区视频在线 | 日本在线一区二区 | 日韩成人免费观看 | 亚洲欧美色图小说 | 亚洲第一无码专区天堂 | 欧美一区二区伦理片 | 国产精品9999久久久久 | 久久一日本道色综合久久 | 久久99国产精品久久99果冻传媒 | 色香欲天天影视综合网 | 国产精品自拍第一页 | 国产视频一二三 | 国产真实乱对白精彩 | 国产av人人夜夜澡人人爽 | 久久精品区 | 国产网站在线 | 国产av永久无码天堂影院 | 破了亲妺妺的处免费视频国产 | 精品久久久久久国产偷窥 | 日本真人做爰免费视频120秒 | 国产精品丝袜久久久久久久不卡 | 亚洲欧美激情在线 | 国产伦理一区 | 亚洲欧洲综合av | 偷偷草| 国产三级在线观看免费 | 秋霞网av| 97视频在线观看播放 | 91偷拍在线嫩草 | 久久精品人人做人人爱爱站长工具 | 东京热加勒比无码少妇 | 中文字幕乱码亚洲精品一区 | 精品国产品香蕉在线 | 91精品综合久久久久久五月天 | 小拗女一区二区三区 | 日韩欧美群交p片內射中文 三级4级全黄60分钟 | x88av视频| 免费一级淫片a人观看69 | 欧美日韩1 | 亚洲a久久 | 全部免费毛片在线播放高潮 | 久热精品在线观看 | 日本成人在线播放 | 一天天影影综合网 | 噼里啪啦在线播放 | 无码伊人久久大杳蕉中文无码 | 四季av中文字幕 | 久草青青 | 国产调教夫妻奴av | 91网站免费视频 | 国产精品久久久久久久久人妻 | 亚色视频在线观看 | 日日弄天天弄美女bbbb | 精品久久久久久久久午夜福利 | 久久久久网址 | 久草播放| 国产精品久久久久影院 | 午夜福利理论片高清在线观看 | 99视频精品全部免费 在线 | 黄色的网站在线免费观看 | 日本三级视频 | 亚洲少妇激情 | 中文字幕亚洲综合久久筱田步美 | 日本肉体xxxⅹ裸体交 | 全黄久久久久a级全毛片 | 亚洲人成网亚洲欧洲无码 | 中文字幕一区二区三区不卡 | 成人国产精品一区二区 | 热久久久久久 | 亚洲日本va午夜中文字幕 | 性欧美videos另类极品小说 | 中文在线最新版天堂 | 中文字幕在线免费观看视频 | 久久久久国产免费 | 91麻豆产精品久久久久久夏晴子 | 中文字幕丰满乱子伦无码专区 | 久热久 | 中文字幕一区二区三区四区视频 | 九色视频网址 | 亚洲午夜国产一区99re久久 | 亚洲视频1区 | 国产丰满大乳奶水在线视频 | 少妇高潮毛片免费看 | 无套在线观看 | 久久精品无码一区二区三区免费 | 欧美一级艳片视频免费观看 | 日本中文字幕网站 | 欧美一区二区三区粗大 | 国产精品乱码一区二区三区视频 | 在线看亚洲十八禁网站 | 久久99精品国产麻豆婷婷 | 欧美自拍偷拍一区二区 | 欧美黑人性暴力猛交喷水 | 少妇与公做了夜伦理69 | 欧美做受又硬又粗又大视频 | 天堂а在线中文在线新版 | 999热视频| 国产免费二区 | 91精品国产福利在线观看的优点 | 黄色视频毛片 | 国产精品99久久久久人最新消息 | 成人国产欧美大片一区 | 69福利视频 | 亚洲精品永久在线观看 | 亚洲激情视频一区 | 理论片在线观看视频 | 色婷婷国产精品视频 | 999这里只有是极品 999资源站 | 日本xxxxxxxxx96| 欧美 日韩 国产 成人 在线观看 | 又黄又爽又色无遮挡免费软件国外 | 国产精品久久久久久妇女6080 | 日本淫片免费啪啪3 | 日韩人妻无码一区二区三区久久99 | 日韩欧美一区二区三区久久婷婷 | 老子影院午夜伦手机不四虎卡 | 91在线免费播放 | 久久精品手机观看 | 中文字幕在线观看亚洲日韩 | 欧美日韩一区二区在线播放 | 国产精品久久久久999 | 中文字幕一区二 | 免费观看污网站 | 成人国产精品视频 | 直接看的毛片 | 99精品国产在热久久 | 国产又粗又猛又大爽老大爷 | 播放灌醉水嫩大学生国内精品 | 羞羞视频在线免费 | 深夜啪啪 | 中文字幕制服丝袜 | 国产精品一区二区 尿失禁 又污又爽又黄的网站 | 乱亲女秽乱长久久久 | 免费成人在线网站 | www.8888久久爱站网 | 人人妻人人超人人 | 国产成人无码一二三区视频 | 欧美高清在线一区 | 国产69精品一区二区亚洲孕妇 | 蜜臀av性久久久久av蜜臀妖精 | 国产亚洲精久久久久久无码77777 | 国产精品国产三级国产aⅴ浪潮 | 色性网| 美女破处视频 | 亚洲一区二区三区四区五区xx | 中文字幕av一区二区三区 | 日本黄色免费大片 | 亚洲午夜在线观看 | 亚洲欧美激情图片 | 1级黄色大片| 天天综合在线观看 | 国产精品爱久久久久久久 | 国变精品美女久久久久av爽 | 四虎影视网 | 国产亚洲精品久 | 永久免费看啪啪的网站 | 久久99网 | 欧美丰满老熟妇xxxxx性 | 国产农村妇女aaaaa视频 | 欧美体内she精高潮 欧美体内谢she精2性欧美 | 国产在线一区二区三区 | 色婷婷av一本二本三本浪潮 | 精精国产xxxx视频在线野外 | 97成人免费视频 | 精品国产乱码久久久久久口爆 | 国产最新网址 | 国产精品免费一区二区三区四区 | 国产精品视频一区二区噜噜 | 成人欧美一区二区三区1314 | 日本在线免费观看 | 四虎影视在线永久免费观看 | 人妻熟妇乱又伦精品视频app | av高清免费观看 | 亚洲com| 玖玖在线精品 | 夜色综合网 | 91av视频在线观看 | 美女黄网站成人免费视频 | 91亚色视频在线观看 | 国产亚洲视频一区 | 国产天码青椒老色批青椒影视 | 成人在线影视 | 久久99精品久久久久久水蜜桃 | 免费精品99久久国产综合精品应用 | 国产又粗又长又黄视频 | 免费福利在线观看 | 亚洲熟妇av午夜无码不卡 | 日韩欧美一区二区三区免费观看 | 久久人人爽人人爽人人片av免费 | 女人高潮抽搐aaa | 国产r级在线| 久草视频在线看 | 日韩色小说 | 国产精品白嫩极品美女视频 | 99精品欧美一区二区三区小说 | 中文字幕一本 | 色琪琪丁香婷婷综合久久 | 国产va免费精品观看精品 | 手机成人av| 日本加勒比一区二区 | 草草福利影院 | 国产免费观看黄av片 | 国产精品嫩| 日韩影视一区二区三区 | 日本xxxx丰满人妖学校 | 亚洲性无码一区二区三区 | 爱情岛亚洲首页论坛小巨 | 91小视频 | 亚洲成人黄色av | 日韩人妻无码一区二区三区综合部 | 精品无码一区二区三区水蜜桃 | 成人毛毛片 | 操亚洲美女| 一及黄色毛片 | 97婷婷狠狠成为人免费视频 | 色橹橹欧美在线观看视频高清 | 国产无套粉嫩白浆内精品 | jlzzjlzz亚洲日本少妇 | 日韩在线一级片 | 自拍偷自拍亚洲精品情侣 | 亚洲人成在线播放 | a级小视频 | 日韩精品一区二区三区中文在线 | 欧美操老女人 | 天天色综合av | 亚洲成人三区 | 国偷自产一区二区三区在线观看 | 日韩 欧美 中文字幕 制服 | 九色porny视频黑人 | 欧美国产精品一区二区三区 | 国产做受69高潮 | 久久久久中文字幕 | 激情综合丁香五月 | 新婚少妇在线观看一区 | 18禁肉肉无遮挡无码网站 | 中文字幕一区二区三区免费视频 | 日日噜噜噜夜夜爽爽狠狠视频 | 中国一级黄色 | 久久一区二区三区视频 | 久久久久久久久久久一区二区 | 国产精品一区二区性色av | 消息称老熟妇乱视频一区二区 | 美丽姑娘免费观看在线观看 | 亚洲国产婷婷综合在线精品 | 国产对白视频 | 欧美va亚洲va | 亚洲成人美女xvideos | 黑人邻居太猛中文字幕hd | 美女隐私黄www网站免费 | 深夜在线观看 | 四虎国产精品免费观看视频优播 | 欧美视频二区 | 好吊爽在线播放视频 | 五月综合色 | 欧美激情视频免费 | 成人av在线影视 | 亚洲成人激情av | 日本久久久久 | 少妇放荡的呻吟干柴烈火动漫 | 国产免费一区二区三区四在线播放 | 91精品国产综合久久福利 | 久久国产精品精品国产色婷婷 | 99久久九九 | 华人少妇被黑人粗大的猛烈进 | 中国黄色一级毛片 | 国产igao激情视频入口 | 亚洲一级免费在线观看 | 最新国产一区 | xxx一区二区| 色图插插插 | aaa在线播放 | 天堂视频网 | 91av导航| 亚洲欧美黄| 久久精品国产精品亚洲蜜月 | 91丨porny丨海角社区 | 99国产精品久久久久久久久久久 | 国产又粗又猛又爽又黄又 | 国产成人精品免费看视频 | 青青草激情 | 337p粉嫩大胆噜噜噜噜69影视 | 16一17女人毛片 | 国产免费一区二区三区香蕉精 | 亚洲精品激情视频 | 999国产 | 亚洲欧洲中文日韩久久av乱码 | 人妻精品国产一区二区 | 小拗女一区二区三区 | 日本亲子乱子伦xxxx | 真实偷拍激情啪啪对白 | 亚洲黄页网站 | 婷婷丁香六月 | 久久伊人精品视频 | 国产伦精品一区二区三区综合网 | 久久中文网 | 久久疯狂做爰流白浆xx | 性高湖久久久久久久久免费 | 综合五月婷婷 | 欧美日韩高清在线 | 日韩精品在线观 | 私人av | 精东av在线| 国产欧美日韩高清 | 少妇人妻丰满做爰xxx | 国产极品视频在线观看 | 成人免费观看在线视频 | 日本va在线视频播放 | 国产伦子系列沙发午睡 | 又粗又猛又黄又爽无遮挡 | av在线进入 | 人成福利视频在线观看 | 全国露性器r级最禁片 | 又紧又大又爽精品一区二区 | 国产成年人视频 | 天天做天天爱夜夜爽 | 国内精品国产三级国产在线专 | 日韩欧美在线视频播放 | 国产97在线观看 | 黄色大片网| 又色又爽又黄18网站 | 亚洲h在线播放在线观看h | ass少妇pics粉嫩bbw1 | 成年人免费av| 加勒比色老久久综合网 | 好吊妞视频988gao免费 | 四个黑人玩一个少妇四p | 奇米影视第四色首页 | 91人人爽人人爽人人精88v | 国产成人欧美一区二区三区的 | 婷婷中文 | 三上悠亚人妻中文字幕在线 | av福利院| 精品熟人妻一区二区三区四区不卡 | 性一交一黄一片 | 日韩精品在线免费观看 | 欧美成人免费大片 | 视频久久| 永久免费毛片在线播放 | 任我撸在线视频 | 40到50岁中老年妇女毛片 | 77777五月色婷婷丁香视频 | 成人福利免费视频 | 欧美日韩一区二区三区不卡视频 | www.色欧美| 中文字幕亚洲欧美日韩在线不卡 | 亚洲 一区二区 在线 | 国产精品视频永久免费播放 | 免费大片av手机看片高清 | 亚洲精品乱码久久久久久自慰 | 精品欧美黑人一区二区三区 | 久久综合成人网 | av网址在线免费观看 | 天天爱天天操 | 国产无遮挡又黄又爽在线视频 | 久久精品成人免费观看 | 7799精品视频 |