精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

程序員內功修煉:五分鐘徹底搞懂 Linux ELF 文件 !

系統
ELF 文件不僅僅是一個格式,它是 Linux 世界中程序的"靈魂容器",承載著程序從編譯到執行的整個生命周期。?

大家好啊,我是小康。

今天咱們來聊一個看起來高深,實際上理解起來其實挺簡單的話題—— ELF 文件。

不知道你有沒有想過:我們敲下./program命令的那一刻,計算機是怎么把這個文件變成一個活蹦亂跳的進程的?這背后的"黑魔法"到底是什么?

沒錯,答案就是今天的主角:ELF(Executable and Linkable Format)可執行與可鏈接格式。你可以把它理解為 Linux 世界里程序的"靈魂容器"!

一、什么是 ELF 文件?給個痛快話!

簡單來說,ELF 是 Linux 下的可執行文件格式,就像 Windows 下的 .exe 一樣。但別被這個簡單的解釋騙了,ELF 可比 .exe 復雜得多,也強大得多!

ELF 文件可以是:

  • 可執行文件(比如你的./program)
  • 目標文件(編譯后但還沒鏈接的 .o 文件)
  • 共享庫文件(就是 .so 文件,類似 Windows 下的 .dll)
  • 核心轉儲文件(程序崩潰時的那個core dump)

本質上,ELF 就是一個容器,里面裝著代碼、數據以及程序運行所需的各種信息,按照特定的格式組織起來。

二、初見 ELF:第一印象很重要

想知道一個文件是不是 ELF 格式的?超簡單:

$ file /bin/ls
/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, ...

看到沒?只要文件輸出信息的開頭是"ELF",那它就是 ELF 格式的!

再來點兒硬核的,我們直接看一下 ELF 文件的前幾個字節:

$ hexdump -C -n 16 /bin/ls
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|

這里最開始的7f 45 4c 46就是 ELF 文件的"魔數"(Magic Number)。其中 45 4c 46 是 ASCII 碼中的 "ELF" 三個字母,前面的 7f 是一個特殊字符。這四個字節就是 ELF 文件的"身份證",操作系統首先會檢查這四個字節,確認它是不是一個 ELF 文件。

三、ELF 文件的內部結構:化繁為簡

很多教程一上來就給你畫個復雜的結構圖,看得人頭暈眼花。咱們先別急,我用一個簡單的類比來幫你理解:

把 ELF 文件想象成一本"程序說明書",這本書有三部分組成:

  • 文件頭(ELF Header):相當于書的封面和目錄,告訴你這本書有什么內容,怎么看
  • 程序頭表(Program Header Table):相當于給"閱讀器"(操作系統)看的指南,告訴它怎么把這本書變成一個活的程序
  • 節區頭表(Section Header Table):相當于給"編輯器"(鏈接器、調試器)看的指南,告訴它這本書的內部結構

然后,書的主體內容就是各種節區(Sections)或段(Segments),里面裝著代碼、數據等實際內容。

直觀一點,用圖來表示就是:

+------------------+
|    ELF Header    | <-- 文件開始處的標識信息和總體布局
+------------------+
|     程序頭表      | <-- 告訴操作系統如何加載
| Program Header 1 |
| Program Header 2 |
|       ...        |
+------------------+
|    Section 1     | <-- 實際內容,如代碼、數據等
|    Section 2     |
|       ...        |
+------------------+
|    節區頭表       |  <-- 描述每個Section的信息
| Section Header 1 | 
| Section Header 2 |
|       ...        |
+------------------+

哎,你可能會問:什么是節區(Section)?什么又是段(Segment)?它們有什么區別?

簡單來說:

  • 節區(Section):是 ELF 文件存儲的基本單位,針對鏈接器
  • 段(Segment):是運行時內存的基本單位,針對加載器

一個段通常包含多個功能相似的節區。比如,包含代碼的所有節區會被歸入到一個叫做"TEXT"的段中。

四、深入解剖 ELF文件:逐層剝開

1. ELF頭(ELF Header)

ELF 頭是整個文件的"門面",包含了文件的基本信息和指向其他部分的指針。用readelf -h命令可以查看:

$ readelf -h /bin/ls
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x5850
  Start of program headers:          64 (bytes into file)
  Start of section headers:          136912 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         13
  Size of section headers:           64 (bytes)
  Number of section headers:         30
  Section header string table index: 29

這里面最重要的信息是:

  • Entry point address:程序執行的起點地址
  • Start of program headers:程序頭表的位置
  • Start of section headers:節區頭表的位置

2. 程序頭表(Program Header Table)

程序頭表告訴操作系統如何創建進程映像,用readelf -l命令查看:

$ readelf -l /bin/ls

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
                 0x00000000000002d8 0x00000000000002d8  R      0x8
  INTERP         0x0000000000000318 0x0000000000000318 0x0000000000000318
                 0x000000000000001c 0x000000000000001c  R      0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000004428 0x0000000000004428  R      0x1000
  LOAD           0x0000000000005000 0x0000000000005000 0x0000000000005000
                 0x0000000000012d1c 0x0000000000012d1c  R E    0x1000
  LOAD           0x0000000000018000 0x0000000000018000 0x0000000000018000
                 0x0000000000004d40 0x0000000000004d40  R      0x1000
  LOAD           0x000000000001d520 0x000000000001e520 0x000000000001e520
                 0x0000000000001640 0x0000000000002270  RW     0x1000
...

最重要的是那些類型為LOAD的段,它們會被加載到內存中。

注意看Flags:

  • R表示可讀(Read)
  • W表示可寫(Write)
  • E表示可執行(Execute)

這就是為什么有的內存區域可執行,有的只能讀不能寫,這些權限在 ELF 文件里就定義好了!

3. 節區頭表(Section Header Table)

節區頭表描述了文件中各個節區的信息,用readelf -S查看:

$ readelf -S /bin/ls
There are 30 section headers, starting at offset 0x21730:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000000318  00000318
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.gnu.build-i NOTE             0000000000000338  00000338
       0000000000000024  0000000000000000   A       0     0     4
...
  [11] .text             PROGBITS         00000000000052a0  000052a0
       0000000000012a7c  0000000000000000  AX       0     0     16
...
  [23] .data             PROGBITS         000000000001e520  0001d520
       0000000000000e60  0000000000000000  WA       0     0     32
  [24] .bss              NOBITS           000000000001f380  0001e380
       0000000000001410  0000000000000000  WA       0     0     32
...

常見的重要節區包括:

  • .text:存放程序的機器代碼
  • .data:已初始化的全局變量和靜態變量
  • .bss:未初始化的全局變量和靜態變量(不占用文件空間)
  • .rodata:只讀數據(如字符串常量)
  • .symtab:符號表,存儲程序中定義和引用的函數、變量
  • .strtab:字符串表,通常存儲符號名
  • .dynamic:動態鏈接信息

五、ELF 文件的生命周期:從編譯到執行

為了徹底搞懂 ELF 文件,我們需要了解它的整個生命周期:

源代碼(.c) --編譯--> 目標文件(.o) --鏈接--> 可執行文件 --加載--> 進程

1. 編譯階段:生成目標文件(.o)

當你寫完 C 代碼,運行gcc -c hello.c時,會得到一個hello.o的目標文件。這個文件已經是 ELF 格式的了,但它還不能直接執行,因為里面有很多"坑"等著被填上。

這些"坑"在 ELF 文件中表現為"重定位表",用readelf -r可以看到:

$ readelf -r hello.o

Relocation section '.rela.text' at offset 0x2d0 contains 2 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000013  000a00000004 R_X86_64_PLT32    0000000000000000 printf - 4
000000000023  000b00000004 R_X86_64_PLT32    0000000000000000 exit - 4

這表示代碼中調用了printf和exit函數,但編譯器不知道它們在哪兒,所以留了個"坑"等著鏈接器來填。

2. 符號表:程序的"通訊錄"

說到這些函數(printf 、exit),咱們不得不提 ELF 文件中的"符號表"。簡單來說,符號表就像是程序的"通訊錄",記錄了程序中所有函數和變量的名字和位置。

來看看符號表長啥樣:

$ readelf -s hello.o

Symbol table '.symtab' contains 12 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS hello.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
    ...
     9: 0000000000000000    41 FUNC    GLOBAL DEFAULT    1 main
    10: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND printf
    11: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND exit

瞧,這里面有main函數(我們自己定義的),還有printf和exit(外部函數)。注意它們的Ndx(索引)列:main是1,表示在第1個節區;而printf和exit是UND,表示"未定義",這就是前面說的"坑"。

這個目標文件的符號表就像一張"半成品通訊錄",只記錄了自己有什么函數,以及自己需要哪些外部函數,但還不知道那些外部函數在哪里。所以它還不能獨立工作,需要鏈接器來幫忙找到這些外部函數。

3. 動態鏈接:程序的"即插即用"

說到外部函數,就不得不提 ELF 的一個超強功能:動態鏈接。

還記得 Windows 上安裝軟件時經常冒出的"DLL缺失"錯誤嗎?Linux 上也有類似概念,不過實現得更優雅,這就是動態鏈接庫(.so文件)。

動態鏈接的好處簡直不要太多:

  • 節省內存:多個程序共享同一個庫
  • 節省磁盤:不用把所有代碼都打包進可執行文件
  • 方便升級:庫更新后,程序自動用上新版本,不用重新編譯

那么問題來了:程序怎么知道自己需要哪些庫?又是如何找到這些庫的呢?

ELF 文件中有一個特殊的.dynamic節區,專門記錄這些信息:

$ readelf -d /bin/ls | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libselinux.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

這告訴我們,ls命令依賴于這兩個共享庫。如果你想更直觀地看到所有依賴及它們的實際位置,可以用ldd命令:

$ ldd /bin/ls
 linux-vdso.so.1 (0x00007ffc961cd000)
 libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f27f989e000)
 libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f27f96b3000)
 ...

看到沒?ldd不僅告訴你需要哪些庫,還告訴你它們的實際位置和加載地址。

那程序又是怎么找到這些庫的呢?它會按照以下順序查找:

  • 環境變量LD_LIBRARY_PATH指定的目錄
  • 可執行文件的RPATH屬性指定的目錄
  • /etc/ld.so.cache緩存中記錄的位置
  • 默認目錄如/lib、/usr/lib等

動態鏈接器(ld.so)會在程序啟動時自動處理這些依賴關系,把所有需要的庫都加載進來,就像樂高積木一樣把程序拼裝完整,非常巧妙!

4. 鏈接階段:生成可執行文件

鏈接器會把多個目標文件和庫文件鏈接在一起,解決那些"坑"(重定位),最終生成可執行文件。

那么鏈接器具體是怎么解決這些"坑"的呢?簡單來說就是做個"牽線搭橋"的活:

  • 收集所有目標文件中的符號表,建立一個全局符號表
  • 找到所有標記為"未定義"(UND)的符號
  • 在全局符號表或者庫文件中尋找這些符號的定義
  • 把找到的地址填回原來的"坑"中

比如當鏈接器找到printf函數在 libc.so 中的實際地址后,就會修改原來調用 printf 的指令,讓它指向正確的地址。

鏈接完成后,再看同一個程序的符號表,會發現那些 UND 的符號要么有了實際地址(靜態鏈接),要么指向了動態鏈接的跳轉表(動態鏈接)。

在動態鏈接的情況下,還會在 ELF 文件中記錄運行時需要哪些共享庫,前面已經說過了。

5. 加載階段:從文件到進程

當你執行./program時,操作系統(確切地說是加載器 ld.so )會做這些事:

  • 檢查 ELF 頭的合法性
  • 根據程序頭表,將需要的段加載到內存
  • 如果是動態鏈接的,還會找到并加載所需的共享庫
  • 跳轉到 Entry Point 開始執行

這個過程可以用strace命令觀察:

$ strace ./hello
execve("./hello", ["./hello"], 0x7ffcef8db490 /* 52 vars */) = 0
brk(NULL)                               = 0x55c84f34c000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...

execve就是創建新進程的系統調用,后面一系列操作就是在加載和準備程序運行環境。

六、ELF實用工具箱:玩轉ELF文件

好了,了解了 ELF 的原理后,來看看有哪些工具可以幫我們操作 ELF 文件:

(1) file:判斷文件類型

$ file /bin/ls

(2) readelf:查看ELF文件的所有信息

$ readelf -a /bin/ls  # 顯示全部信息

(3) objdump:反匯編 ELF 文件

$ objdump -d /bin/ls  # 反匯編代碼段

(4) nm:列出符號表

$ nm /bin/ls  # 顯示符號(函數、變量)

(5) ldd:查看動態依賴

$ ldd /bin/ls  # 顯示依賴的共享庫

(6) strings:提取文件中的字符串

$ strings /bin/ls | grep "GNU"  # 查找包含"GNU"的字符串

(7) strip:移除ELF文件中的符號表和調試信息

$ strip -s program  # 減小文件體積

(8) patchelf:修改 ELF 文件的屬性

$ patchelf --set-interpreter /lib64/ld-custom.so program  # 修改解釋器

七、實際應用:ELF文件的那些神奇玩法

ELF文件的知識不僅僅是理論,來看看一些實際的例子:

1. 程序加固與混淆

想象你開發了一個軟件不想被輕易破解:

# 刪除符號表,讓逆向分析更困難
$ strip --strip-all myprogram

# 對比前后大小
$ ls -lh myprogram*
-rwxr-xr-x 1 user user 236K myprogram
-rwxr-xr-x 1 user user 176K myprogram.stripped

看,文件體積一下減少了幾十k,因為符號信息都被刪掉了!

2. 程序補丁與熱修復

假設你想修改程序使用的解釋器路徑:

# 查看當前解釋器
$ readelf -l myprogram | grep interpreter
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

# 修改為自定義解釋器
$ patchelf --set-interpreter /opt/mylibs/ld-linux.so myprogram

# 確認修改成功
$ readelf -l myprogram | grep interpreter
      [Requesting program interpreter: /opt/mylibs/ld-linux.so]

這樣程序就會使用你自定義的動態鏈接器,而不需要重新編譯!

更酷的是,Linux 還提供了一種不用重啟程序就能熱修復的黑科技——LD_PRELOAD環境變量!它可以讓你悄悄地"替換"程序中的函數實現。

來看一個簡單實用的例子 —— 監控程序的內存分配:

創建一個簡單的內存跟蹤庫: memtrace.c

#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>

// 原始malloc函數指針
staticvoid* (*real_malloc)(size_t) = NULL;

// 攔截 malloc 函數
void* malloc(size_t size) {
    // 延遲初始化原始函數
    if (real_malloc == NULL) {
        real_malloc = dlsym(RTLD_NEXT, "malloc");
    }
    
    // 調用原始malloc
    void* ptr = real_malloc(size);
    
    // 打印跟蹤信息
    fprintf(stderr, "malloc(%zu) = %p\n", size, ptr);
    
    return ptr;
}

編譯成共享庫:

$ gcc -shared -fPIC memtrace.c -o libmemtrace.so -ldl

接著使用我們的庫監控任何程序的內存分配:

LD_PRELOAD=./libmemtrace.so ./my_program

輸出:

malloc(100) = 0x55e930e2f6b0
malloc(200) = 0x55e930e2f720
malloc(300) = 0x55e930e2f7f0

看到了嗎?我們只用了十幾行代碼,就實現了一個能夠監控任何程序內存分配的工具!這個例子的工作原理很簡單:

  • 定義一個與系統函數同名的malloc
  • 用dlsym(RTLD_NEXT, "malloc")找到真正的 malloc 函數
  • 在調用真正的 malloc 前后添加我們的代碼(這里是打印日志)
  • 通過LD_PRELOAD讓系統優先加載我們的庫

這種技術經常用于:

  • 調試內存問題
  • 給程序添加日志
  • 修改程序行為而不用改源碼
  • 臨時修復運行中的服務

當然,這項技術也常被黑客利用來劫持程序函數,所以理解它不僅能提升編程能力,也對安全防護很重要!

八、總結:ELF 文件的精髓

好了,咱們來總結一下 ELF 文件的核心要點:

(1) ELF是容器:裝載了代碼、數據和各種元數據

(2) 分層結構:ELF 頭、程序頭表、節區、節區頭表

(3) 兩種視角:

  • 執行視角:段(Segments)- 加載器關心
  • 鏈接視角:節(Sections)- 鏈接器關心

(4) 生命周期:從源代碼到目標文件,再到可執行文件,最后變成進程

當你理解了 ELF 文件的本質,Linux 下的很多問題就迎刃而解了:為什么有些程序不能在不同版本的 Linux 上運行?為什么動態庫版本不匹配會導致程序崩潰?為什么有些惡意軟件難以檢測?——這些問題的答案都藏在 ELF 文件的結構中!

記住,ELF 文件不僅僅是一個格式,它是 Linux 世界中程序的"靈魂容器",承載著程序從編譯到執行的整個生命周期。

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2009-12-04 10:45:20

程序員職場

2021-06-18 07:34:12

Kafka中間件微服務

2025-03-13 06:22:59

2024-12-11 07:00:00

面向對象代碼

2025-01-21 07:39:04

Linux堆內存Golang

2019-08-09 10:33:36

開發技能代碼

2025-01-20 08:50:00

2009-05-21 16:23:23

程序員法則職場

2023-12-06 08:48:36

Kubernetes組件

2023-09-18 15:49:40

Ingress云原生Kubernetes

2022-05-23 09:10:00

分布式工具算法

2024-04-29 07:57:46

分布式流控算法

2024-12-04 16:12:31

2025-05-22 08:10:00

C++條件變量編程

2017-03-30 19:28:26

HBase分布式數據

2020-03-03 19:59:38

主板無線網卡

2019-06-14 09:34:59

Linux 系統 數據

2018-09-27 13:56:14

內網外網通信

2023-10-06 20:21:28

Python鏈表

2009-11-16 10:53:30

Oracle Hint
點贊
收藏

51CTO技術棧公眾號

日韩三级精品电影久久久| 中文字幕一区二区三区在线不卡 | 亚洲尤物av| 欧美性猛片aaaaaaa做受| 麻豆av一区二区三区久久| 久久精品99北条麻妃| 亚洲最大av| 精品呦交小u女在线| www.成年人| 欧美gv在线观看| 一区在线观看视频| 久久综合久久久| 国产免费黄色片| 亚洲女同中文字幕| 日韩精品中文字| 男生和女生一起差差差视频| 成人精品电影在线| 国产三级一区二区三区| 97se在线视频| 一级α片免费看刺激高潮视频| 日韩成人影院| 日韩精品在线播放| 中文字幕无码毛片免费看| 精品国模一区二区三区| 亚洲国产aⅴ天堂久久| 在线观看成人一级片| 欧美女优在线| 成人国产一区二区三区精品| 亚洲一区二区三区sesese| 好吊色在线视频| 亚洲区第一页| 久久久久久久久久久91| 搜索黄色一级片| 日韩电影免费网站| 国产性色av一区二区| 日本黄色动态图| 天堂av一区| 欧美一区二区三区思思人| 伊人国产在线视频| 日韩欧美一区二区三区免费观看 | 日韩精品电影在线观看| 欧美成人在线影院| 少妇视频一区二区| 欧美电影免费播放| 最新中文字幕亚洲| av片在线免费看| 日韩综合精品| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 精品国产欧美一区二区五十路| 国产精品探花在线播放| 午夜不卡一区| 偷窥少妇高潮呻吟av久久免费| 日韩动漫在线观看| 久久久久国产精品嫩草影院| 26uuu欧美| 快播亚洲色图| 国产肥老妇视频| 国产精品中文有码| 99精品国产高清一区二区| 国产激情久久久久久熟女老人av| 久久天堂成人| 国产精品久久久久影院日本| 91porny九色| 蜜臀久久久99精品久久久久久| 欧美国产日韩xxxxx| 久久久久无码国产精品| 亚洲国产精品一区| 国产福利精品视频| 中文字幕av影视| 亚洲欧美日韩国产综合精品二区| 欧美成人手机在线| 久一区二区三区| 国产亚洲激情| 久久久久久国产精品久久| 久久精品女人毛片国产| 免费看黄裸体一级大秀欧美| 国产精品美女久久久免费| 一卡二卡三卡在线| 国产91丝袜在线播放0| 久久99久久精品国产| 丁香婷婷在线观看| 一区二区三区在线免费播放| 视频一区不卡| 色视频精品视频在线观看| 国产欧美日韩亚州综合| 无码人妻精品一区二区三区99v| 婷婷在线视频| 国产精品免费人成网站| 黄色录像特级片| 超碰最新在线| 欧美日韩国产综合新一区 | 久草福利在线| 亚洲欧美日韩一区二区| 久久亚洲中文字幕无码| 国产激情久久| 亚洲成人av中文字幕| 久久发布国产伦子伦精品| 中国av一区| 久久99久久久久久久噜噜| 黄色一级片中国| 久久性色av| 91大片在线观看| 国产主播福利在线| 中文字幕乱码日本亚洲一区二区| 日韩国产伦理| 波多野结衣乳巨码无在线观看| 亚洲综合一二区| 成人性生生活性生交12| 精品123区| 欧美群妇大交群的观看方式| 亚洲精品中文字幕在线播放| 国产精品久久久久久久免费观看| 久久久精品国产网站| 国产 日韩 欧美 在线| 国产乱码精品一区二区三区av| 国产高清一区视频| 亚洲成人三级| 色悠久久久久综合欧美99| 91精品人妻一区二区三区蜜桃2| 九九热播视频在线精品6| 中文字幕在线亚洲| 亚洲精品成人在线视频| 成人丝袜高跟foot| 一二三四中文字幕| 青娱乐极品盛宴一区二区| 日韩精品免费看| 国产大片aaa| 国产91精品久久久久久久网曝门| 国产丝袜不卡| 91中文在线| 欧美精品在欧美一区二区少妇| 性一交一黄一片| 午夜av一区| 国产在线播放91| 1区2区3区在线观看| 欧美影院午夜播放| 四川一级毛毛片| 99久久影视| 国产在线播放91| 欧美18hd| 狠狠色噜噜狠狠狠狠97| 人妻换人妻a片爽麻豆| 欧美精品黄色| 99理论电影网| 欧美亚洲系列| 亚洲成人a**站| 日韩欧美一区二区一幕| 久久99国产精品麻豆| 亚洲欧美影院| 日本欧美在线| 欧美老少配视频| 波多野结衣在线观看视频| 久久精品一区二区三区不卡牛牛| 日本一道在线观看| 日韩中文一区二区| 国外色69视频在线观看| 婷婷五月综合久久中文字幕| 欧美性69xxxx肥| 久久精品成人av| 狠狠干综合网| 国产日产精品一区二区三区四区| 四虎久久免费| 欧美第一区第二区| 欧美不卡视频在线观看| 国产伦精品一区二区三区免费迷 | 你懂的成人av| 97人人模人人爽人人少妇| 成年人视频网站在线| 欧美日韩色综合| 久久国产美女视频| 成人午夜精品一区二区三区| 国内性生活视频| 欧美偷拍综合| 999日本视频| 在线天堂新版最新版在线8| 欧美一区二区三区婷婷月色| 国产wwwwxxxx| 日本欧美久久久久免费播放网| 久久精品aaaaaa毛片| 成人开心激情| 精品视频9999| 久蕉依人在线视频| 91精品国产91久久久久久一区二区| 中国1级黄色片| 国产电影精品久久禁18| 国产在线观看福利| 99精品视频精品精品视频| 成人在线免费网站| jizz欧美| 国内精品一区二区三区四区| 国产精品麻豆一区二区三区| 日本精品一区二区三区高清| 超碰手机在线观看| 国产精品一二三区在线| 激情六月丁香婷婷| 91精品国产麻豆国产在线观看| 成人黄色免费网站在线观看| av手机在线观看| 日韩在线视频免费观看高清中文| 91精品国产综合久| 欧美日韩精品在线播放| 国产在线免费看| 久久伊人中文字幕| 免费在线观看日韩av| 日本美女一区二区三区| 国产a级片网站| 午夜精品视频一区二区三区在线看| 91九色单男在线观看| 黄色片网站在线| 亚洲深夜福利视频| 男人天堂av网| 在线播放国产精品二区一二区四区| 欧美黄色aaa| 国产三级精品视频| 中文字幕人妻一区| 国产在线精品免费| 黄色在线视频网| 视频一区视频二区中文字幕| 黄色一级视频片| 亚洲午夜极品| 黄色录像特级片| 亚洲国产一区二区在线观看 | 国产日韩精品一区二区三区在线| 亚洲美女爱爱视频| 石原莉奈在线亚洲二区| 黄色免费福利视频| 伊人精品视频| 妺妺窝人体色www看人体| 91影院成人| 亚洲成人第一| 欧美特黄一级大片| 午夜视频久久久| 欧洲毛片在线视频免费观看| 精品无码久久久久久久动漫| 欧美高清免费| 国产精品视频1区| 天堂久久午夜av| 国产精品视频内| 国产a亚洲精品| 成人国产精品久久久| 福利一区和二区| 成人h视频在线| **日韩最新| 亚洲精品免费av| 亚洲91网站| 国产精品成人一区二区| 最新欧美电影| 久久久久久18| 麻豆网站免费在线观看| 清纯唯美日韩制服另类| 成人影院入口| 国产精品小说在线| 91精品国产自产观看在线| 91中文字幕在线观看| 欧一区二区三区| 国产综合色一区二区三区| 婷婷激情久久| 日韩精品一区二区三区丰满| 成人福利一区| 精品无人区一区二区三区| 综合色就爱涩涩涩综合婷婷| 神马欧美一区二区| 亚洲精品成人无限看| 99在线精品免费视频| 亚洲综合激情| 国产又黄又猛又粗又爽的视频| 国产欧美日本| 国产精品第12页| 久久99热狠狠色一区二区| 日本女人黄色片| av男人天堂一区| 2019男人天堂| 亚洲一区在线观看免费观看电影高清| 微拍福利一区二区| 亚洲欧洲日韩综合一区二区| 九九热精品免费视频| 欧美体内谢she精2性欧美| 中文字幕二区三区| 精品国产91久久久久久久妲己 | 奇米精品一区二区三区在线观看| 男人操女人逼免费视频| 视频一区视频二区中文字幕| www黄色av| 国产一区二区在线看| 欧亚乱熟女一区二区在线| 日本一区二区成人| 免费看黄色av| 亚洲在线视频一区| 久草热在线观看| 精品乱人伦小说| 丰满人妻av一区二区三区| 国产午夜精品美女视频明星a级| 亚洲人成色777777老人头| 最近2019年好看中文字幕视频 | 国产精品一级视频| 日韩av在线网站| 成人在线观看免费网站| 日韩av免费在线看| 中文字幕区一区二区三| 丝袜足脚交91精品| 国产精品毛片在线看| 精品人妻人人做人人爽夜夜爽| 国内欧美视频一区二区| 欧美日韩理论片| 成人国产一区二区三区精品| 日韩av片在线免费观看| 亚洲人亚洲人成电影网站色| 我家有个日本女人| 欧美亚洲禁片免费| 午夜在线视频观看| 九九热精品视频| 性欧美又大又长又硬| 99影视tv| 奇米狠狠一区二区三区| 日韩伦理在线免费观看| 国产精品一卡二卡| 婷婷激情四射网| 欧美三级日韩在线| 内衣办公室在线| 97久久超碰福利国产精品…| 久久天堂久久| 日日噜噜噜夜夜爽爽| 热久久一区二区| 亚洲自拍偷拍图| 综合久久综合久久| 中文字幕 日韩有码| 欧美tk丨vk视频| 在线āv视频| 亚洲aⅴ男人的天堂在线观看| 成人看片黄a免费看视频| 欧美a级黄色大片| 国产一区二区导航在线播放| 五月天免费网站| 欧美色图免费看| 亚洲成人影院麻豆| 国产精品一区二区性色av | www.成人av.com| 亚洲精品成人影院| 亚洲欧美日韩一二三区| 亚洲视频 欧洲视频| a天堂在线视频| 欧美激情第1页| 91久久精品无嫩草影院| 日韩视频精品| 久久精品理论片| 日韩在线不卡av| 欧美一区二区私人影院日本| a毛片在线播放| 电影午夜精品一区二区三区| 激情久久五月| 欧美做受喷浆在线观看| 欧美性高潮在线| 亚洲国产www| 欧美激情欧美狂野欧美精品| 欧美aaa级| 喜爱夜蒲2在线| 99精品1区2区| 免费的毛片视频| 亚洲成人精品久久| gogo在线观看| 国产精品嫩草在线观看| 国产一级久久| 三区四区在线观看| 欧美一级在线观看| av影院在线免费观看| 日韩av在线一区二区三区| 日本女人一区二区三区| 国产大片免费看| 日韩成人av在线| 99亚洲伊人久久精品影院| 精品国产三级a∨在线| 不卡一卡二卡三乱码免费网站| 欧美一区二区三区爽爽爽| 亚洲第一网站免费视频| 国产精品久久久久av电视剧| 欧美高清视频一区| 久久99最新地址| 天海翼一区二区| 日韩中文字幕免费看| 一区在线影院| 欧美另类videosbestsex日本| 国产自产视频一区二区三区| 国语对白一区二区| 夜夜嗨av色一区二区不卡| 韩国一区二区三区视频| 国产午夜伦鲁鲁| 99久久精品国产麻豆演员表| 波多野结衣视频网址| 中文字幕不卡在线视频极品| 亚洲精品a区| 人人妻人人澡人人爽欧美一区| 国产精品99久久久久久宅男| 国产精品xxxx喷水欧美| 久久精品国产精品| 青青操综合网| 原创真实夫妻啪啪av| 在线观看免费视频综合| jizz一区二区三区| 中文网丁香综合网| 久久老女人爱爱|