亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > C++ > 正文

Name Mangling in C++

2019-11-11 07:53:20
字體:
供稿:網(wǎng)友
摘要:詳細(xì)介紹了C++中的Name Mangling的原理和gcc中對(duì)應(yīng)的實(shí)現(xiàn),通過程序代碼和nm C++filt等工具來驗(yàn)證這些原理。對(duì)于詳細(xì)了解程序的鏈接過程有一定的幫助。Name Mangling概述大型程序是通過多個(gè)模塊構(gòu)建而成,模塊之間的關(guān)系由makefile來描述。對(duì)于由C++語(yǔ)言編制的大型程序而言,也是符合這個(gè)規(guī)則。程序的構(gòu)建過程一般為:各個(gè)源文件分別編譯,形成目標(biāo)文件。多個(gè)目標(biāo)文件通過鏈接器形成最終的可執(zhí)行程序。顯然,從某種程度上說,編譯器的輸出是鏈接器的輸入,鏈接器要對(duì)編譯器的輸出做二次加工。從通信的角度看,這兩個(gè)程序需要一定的協(xié)議來規(guī)范符號(hào)的組織格式。這就是Name Mangling產(chǎn)生的根本原因。C++的語(yǔ)言特性比C豐富的多,C++支持的函數(shù)重載功能是需要Name Mangling技術(shù)的最直接的例子。對(duì)于重載的函數(shù),不能僅依靠函數(shù)名稱來區(qū)分不同的函數(shù),因?yàn)镃++中重載函數(shù)的區(qū)分是建立在以下規(guī)則上的:函數(shù)名字不同 || 參數(shù)數(shù)量不同||某個(gè)參數(shù)的類型不同那么區(qū)分函數(shù)的時(shí)候,應(yīng)該充分考慮參數(shù)數(shù)量和參數(shù)類型這兩種語(yǔ)義信息,這樣才能為卻分不同的函數(shù)保證充分性。當(dāng)然,C++還有很多其他的地方需要Name Mangling,如namespace, class, template等等??偟膩碚f,Name Mangling就是一種規(guī)范編譯器和鏈接器之間用于通信的符號(hào)表表示方法的協(xié)議,其目的在于按照程序的語(yǔ)言規(guī)范,使符號(hào)具備足夠多的語(yǔ)義信息以保證鏈接過程準(zhǔn)確無誤的進(jìn)行。簡(jiǎn)單的實(shí)驗(yàn)Name Mangling會(huì)帶了一個(gè)很常見的負(fù)面效應(yīng),就是C語(yǔ)言的程序調(diào)用C++的程序時(shí),會(huì)比較棘手。因?yàn)镃語(yǔ)言中的Name Mangling很簡(jiǎn)單,不如C++中這么復(fù)雜。下面的代碼用于演示這兩種不同點(diǎn): 1. /*2. * simple_test.c3. * a demo to show that different name mangling technology in C++ and C4. 5. * Author: Chaos Lee6. 7. */8.  9. #include<stdio.h>10.  11. int rect_area(int x1,int x2,int y1,int y2)12. 13. {14.         return (x2-x1) * (y2-y1);15. }16.  17. int elipse_area(int a,int b)18. 19. {20.         return 3.14 * a * b;21. }22.  23. int main(int argc,char *argv[])24. 25. {26.         int x1 = 10, x2 = 20, y1 = 30, y2 = 40;27.         int a = 3,b=4;28.         int result1 = rect_area(x1,x2,y1,y2);29.         int result2 = elipse_area(a,b);30.         return 0;31. } 1. [lichao@sg01 name_mangling]$ gcc -c simple_test.c2. 3. [lichao@sg01 name_mangling]$ nm simple_test.o4. 5. 0000000000000027 T elipse_area6. 7. 0000000000000051 T main8. 9. 0000000000000000 T rect_area從上面的輸出結(jié)果上,可以看到使用gcc編譯后對(duì)應(yīng)的符號(hào)表中,幾乎沒有對(duì)函數(shù)做任何修飾。接下來使用g++編譯: 1.  [lichao@sg01 name_mangling]$ nm simple_test.o2. 0000000000000028 T _Z11elipse_areaii3. 4. 0000000000000000 T _Z9rect_areaiiii5. 6.                  U __gxx_personality_v07. 0000000000000052 T main顯然,g++編譯器對(duì)符號(hào)的改編比較復(fù)雜。所以,如果一個(gè)由C語(yǔ)言編譯的目標(biāo)文件中調(diào)用了C++中實(shí)現(xiàn)的函數(shù),肯定會(huì)出錯(cuò)的,因?yàn)榉?hào)不匹配。簡(jiǎn)單對(duì)_Z9rect_areaiiii做個(gè)介紹:l C++語(yǔ)言中規(guī)定 :以下劃線并緊挨著大寫字母開頭或者以兩個(gè)下劃線開頭的標(biāo)識(shí)符都是C++語(yǔ)言中保留的標(biāo)示符。所以_Z9rect_areaiiii是保留的標(biāo)識(shí)符,g++編譯的目標(biāo)文件中的符號(hào)使用_Z開頭(C99標(biāo)準(zhǔn))。l 接下來的部分和網(wǎng)絡(luò)協(xié)議很類似。9表示接下來的要表示的一個(gè)字符串對(duì)象的長(zhǎng)度(現(xiàn)在知道為什么不讓用數(shù)字作為標(biāo)識(shí)符的開頭了吧?)所以rect_area這九個(gè)字符就作為函數(shù)的名稱被識(shí)別出來了。l 接下來的每個(gè)小寫字母表示參數(shù)的類型,i表示int類型。小寫字母的數(shù)量表示函數(shù)的參數(shù)列表中參數(shù)的數(shù)量。l 所以,在符號(hào)中集成了用于區(qū)分不同重載函數(shù)的足夠的語(yǔ)義信息。如果要在C語(yǔ)言中調(diào)用C++中的函數(shù)該怎么做?這時(shí)候可以使用C++的關(guān)鍵字extern “C”。對(duì)應(yīng)代碼如下: 1. /*2. * simple_test.c3. * a demo to show that different name mangling technology in C++ and C4. 5. * Author: Chaos Lee6. 7. */8.  9. #include<stdio.h>10.  11. #ifdef __cplusplus12. 13. extern "C" {14. 15. #endif16. int rect_area(int x1,int x2,int y1,int y2)17. 18. {19.         return (x2-x1) * (y2-y1);20. }21.  22. int elipse_area(int a,int b)23. 24. {25.         return (int)(3.14 * a * b);26. }27.  28. #ifdef __cplusplus29. 30. }31. #endif32.  33. int main(int argc,char *argv[])34. 35. {36.         int x1 = 10, x2 = 20, y1 = 30, y2 = 40;37.         int a = 3,b=4;38.         int result1 = rect_area(x1,x2,y1,y2);39.         int result2 = elipse_area(a,b);40.         return 0;41. }下面是使用gcc編譯的結(jié)果: 1. [lichao@sg01 name_mangling]$ gcc -c simple_test.c2. 3. [lichao@sg01 name_mangling]$ nm simple_test.o4. 5. 0000000000000027 T elipse_area6. 7. 0000000000000051 T main8. 9. 0000000000000000 T rect_area在使用g++編譯一次: 1. [lichao@sg01 name_mangling]$ g++ -c simple_test.c2. 3. [lichao@sg01 name_mangling]$ nm simple_test.o4. 5.                  U __gxx_personality_v06. 7. 0000000000000028 T elipse_area8. 9. 0000000000000052 T main10. 11. 0000000000000000 T rect_area可見,使用extern “C”關(guān)鍵字之后,符號(hào)按照C語(yǔ)言的格式來組織了。事實(shí)上,C標(biāo)準(zhǔn)庫(kù)中使用了大量的extern “C”關(guān)鍵字,因?yàn)镃標(biāo)準(zhǔn)庫(kù)也是可以用C++編譯器編譯的,但是要確保編譯之后仍然保持C的接口而不是C++的接口(因?yàn)槭荂標(biāo)準(zhǔn)庫(kù)),所以需要使用extern “C”關(guān)鍵字。下面是一個(gè)簡(jiǎn)單的例子: 1. /*2. * libc_test.c3. * a demo PRogram to show that how the standard C4. 5. * library are compiled when encountering a C++ compiler6. 7. */8. #include<stdio.h>9. int main(int argc,char * argv[])10. 11. {12.         puts("hello world./n");13.         return 0;14. }搜索一下puts,我們并沒有看到extern “C”.奇怪么? 1. [lichao@sg01 name_mangling]$ g++ -E libc_test.c | grep 'puts'2. 3. extern int fputs (__const char *__restrict __s, FILE *__restrict __stream);4. 5. extern int puts (__const char *__s);6. 7. extern int fputs_unlocked (__const char *__restrict __s,8. 9.  puts("hello world./n");搜索一下 extern “C”試下 1. [lichao@sg01 name_mangling]$ g++ -E libc_test.c | grep 'extern "C"'2. 3. extern "C" {4. 5. extern "C" {這是由于extern “C”可以使用{}的形式將其作用域內(nèi)的函數(shù)全部聲明為C語(yǔ)言可調(diào)用的接口形式。標(biāo)準(zhǔn)不同編譯器使用不同的方式進(jìn)行name mangling, 你可能會(huì)問為什么不將C++的 name mangling標(biāo)準(zhǔn)化,這樣就能實(shí)現(xiàn)各個(gè)編譯器之間的互操作了。事實(shí)上,在C++的FAQ列表上有對(duì)此問題的回答:"Compilers differ as to how objects are laid out, how multiple inheritance is implemented, how virtual function calls are handled, and so on, so if the name mangling were made the same, your programs would link against libraries provided from other compilers but then crash when run. For this reason, the ARM (Annotated C++ Reference Manual) encourages compiler writers to make their name mangling different from that of other compilers for the same platform. Incompatible libraries are then detected at link time, rather than at run time."“編譯器由于內(nèi)部實(shí)現(xiàn)的不同而不同,內(nèi)部實(shí)現(xiàn)包括對(duì)象在內(nèi)存中的布局,繼承的實(shí)現(xiàn),虛函數(shù)調(diào)用處理等等。所以如果將name mangling標(biāo)準(zhǔn)化了,不錯(cuò),你的程序確實(shí)能夠鏈接成功,但是運(yùn)行肯定要崩的。恰恰是因?yàn)檫@個(gè)原因,ARM鼓勵(lì)為同一平臺(tái)提供的不同編譯器應(yīng)該使用不同的name mangling方式。這樣在編譯的時(shí)候,不兼容的庫(kù)就會(huì)被檢測(cè)到,而不至于鏈接時(shí)雖然通過了,但是運(yùn)行時(shí)崩潰了?!憋@然,這是基于“運(yùn)行時(shí)崩潰比鏈接時(shí)失敗的代價(jià)更大”這個(gè)原則而考慮的。GCC的name manglingGCC采用IA 64的name mangling方案,此方案定義于Intel IA64 standard ABI.在g++的FAQ列表中有以下一段話:       "GNU C++ does not do name mangling in the same way as other C++ compilers.This means that object files compiled with one compiler cannot be used withanother”GNU C++的name mangling方案和其他C++編譯器方案不同,所以一種編譯器生成的目標(biāo)文件并不能被另外一種編譯器生成的目標(biāo)文件使用。以下為內(nèi)置的編碼類型: 1. Builtin types encoding2. 3.   <builtin-type> ::= v  # void4.                  ::= w  # wchar_t5.                  ::= b  # bool6.                  ::= c  # char7.                  ::= a  # signed char8.                  ::= h  # unsigned char9.                  ::= s  # short10.                  ::= t  # unsigned short11.                  ::= i  # int12.                  ::= j  # unsigned int13.                  ::= l  # long14.                  ::= m  # unsigned long15.                  ::= x  # long long, __int6416.                  ::= y  # unsigned long long, __int6417.                  ::= n  # __int12818.                  ::= o  # unsigned __int12819.                  ::= f  # float20.                  ::= d  # double21.                  ::= e  # long double, __float8022.                  ::= g  # __float12823.                  ::= z  # ellipsis24.                  ::= u <source-name>    # vendor extended type操作符編碼:Operator encoding 1. <operator-name> ::= nw # new          2.                  ::= na        # new[]3.                  ::= dl        # delete       4.                  ::= da        # delete[]     5.                  ::= ps        # + (unary)6.                  ::= ng        # - (unary)    7.                  ::= ad        # & (unary)    8.                  ::= de        # * (unary)    9.                  ::= co        # ~            10.                  ::= pl        # +            11.                  ::= mi        # -  12. 13.                                   ::= ml        # *            14. 15.                  ::= dv        # /            16.                  ::= rm        # %            17.                  ::= an        # &            18.                  ::= or        # |            19.                  ::= eo        # ^            20.                  ::= aS        # =            21.                  ::= pL        # +=           22.                  ::= mI        # -=           23.                  ::= mL        # *=           24.                  ::= dV        # /=           25.                  ::= rM        # %=           26.                  ::= aN        # &=           27.                  ::= oR        # |=           28.                  ::= eO        # ^=           29.                  ::= ls        # <<           30.                  ::= rs        # >>           31.                  ::= lS        # <<=          32.                  ::= rS        # >>=          33.                  ::= eq        # ==           34.                  ::= ne        # !=           35.                  ::= lt        # <            36.                  ::= gt        # >            37.                  ::= le        # <=           38.                  ::= ge        # >=           39.                  ::= nt        # !            40.                  ::= aa        # &&           41.                  ::= oo        # ||           42.                  ::= pp        # ++           43.                  ::= mm        # --           44.                  ::= cm        # ,             45.                  ::= pm        # ->*          46.                  ::= pt        # ->           47.                  ::= cl        # ()           48.                  ::= ix        # []           49.                  ::= qu        # ?            50.                  ::= st        # sizeof (a type)51.                  ::= sz        # sizeof (an expression)52.                  ::= cv <type> # (cast)       53. 54.                  ::= v <digit> <source-name>   # vendor extended operator類型編碼: 1. <type> ::= <CV-qualifiers> <type>2. 3.          ::= P <type>   # pointer-to4.          ::= R <type>   # reference-to5.          ::= O <type>     # rvalue reference-to (C++0x)6.          ::= C <type>   # complex pair (C 2000)7.          ::= G <type>   # imaginary (C 2000)8.          ::= U <source-name> <type>     # vendor extended type qualifier下面是一段簡(jiǎn)單的代碼: 1. /*2. * Author: Chaos Lee3. 4. * Description: A simple demo to show how the rules used to mangle functions' names work5. 6. * Date:2012/05/067. 8. */9. #include<iostream>10. #include<string>11. using namespace std;12. 13. int test_func(int & tmpInt,const char * ptr,double dou,string str,float f)14. 15. {16.         return 0;17. }18. int main(int argc,char * argv[])19. 20. {21.         char * test="test";22.         int intNum = 10;23.         double dou = 10.012;24.         string str="str";25.         float f = 1.2;26.         test_func(intNum,test,dou,str,f);27.         return 0;28. } 1. [lichao@sg01 name_mangling]$ g++ -c func.cpp2. 3. [lichao@sg01 name_mangling]$ nm func.cpp4. 5. nm: func.cpp: File format not recognized6. 7. [lichao@sg01 name_mangling]$ nm func.o8. 9. 0000000000000060 t _GLOBAL__I__Z9test_funcRiPKcdSsf10.                  U _Unwind_Resume11. 0000000000000022 t _Z41__static_initialization_and_destruction_0ii12. 13. 0000000000000000 T _Z9test_funcRiPKcdSsf14. 15.                  U _ZNSaIcEC1Ev16.                  U _ZNSaIcED1Ev17.                  U _ZNSsC1EPKcRKSaIcE18.                  U _ZNSsC1ERKSs19.                  U _ZNSsD1Ev20.                  U _ZNSt8ios_base4InitC1Ev21.                  U _ZNSt8ios_base4InitD1Ev22. 0000000000000000 b _ZSt8__ioinit23. 24.                  U __cxa_atexit25.                  U __dso_handle26.                  U __gxx_personality_v027. 0000000000000076 t __tcf_028. 29. 000000000000008e T main加粗的那行就是函數(shù)test_func經(jīng)過name mangling之后的結(jié)果,其中:l Ri,表示對(duì)整型變量的引用l PKc:表示const char *指針l Ss:目前還沒有找到原因。先留著~l f:表示浮點(diǎn)型name demanglingC++的name mangling技術(shù)一般使得函數(shù)變得面目全非,而很多情況下我們?cè)诓榭催@些符號(hào)的時(shí)候并不需要看到這些函數(shù)name mangling之后的效果,而是想看看是否定義了某個(gè)函數(shù),或者是否引用了某個(gè)函數(shù),這對(duì)于我們調(diào)試程序是非常有幫助的。所以需要一種方法從name mangling之后的符號(hào)變換為name mangling之前的符號(hào),這個(gè)過程稱之為name demangling.事實(shí)上有很多工具提供這些功能,最常用的就是c++file命令,c++filt命令接受一個(gè)name mangling之后的符號(hào)作為輸入并輸出demangling之后的符號(hào)。例如: 1. [lichao@sg01 name_mangling]$ c++filt _Z9test_funcRiPKcdSsf2. 3. test_func(int&, char const*, double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, float)一般更常用的方法為: 1. [lichao@sg01 name_mangling]$ nm func.o | c++filt2. 3. 0000000000000060 t global constructors keyed to _Z9test_funcRiPKcdSsf4. 5.                  U _Unwind_Resume6. 0000000000000022 t __static_initialization_and_destruction_0(int, int)7. 8. 0000000000000000 T test_func(int&, char const*, double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, float)9. 10.                  U std::allocator<char>::allocator()11. 12.                  U std::allocator<char>::~allocator()13. 14.                  U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)15. 16.                  U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)17. 18.                  U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()19. 20.                  U std::ios_base::Init::Init()21.                  U std::ios_base::Init::~Init()22. 0000000000000000 b std::__ioinit23. 24.                  U __cxa_atexit25.                  U __dso_handle26.                  U __gxx_personality_v027. 0000000000000076 t __tcf_028. 29. 000000000000008e T main另外使用nm命令也可以demangle符號(hào),使用選項(xiàng)-C即可,例如: 1. [lichao@sg01 name_mangling]$ nm -C func.o2. 3. 0000000000000060 t global constructors keyed to _Z9test_funcRiPKcdSsf4. 5.                  U _Unwind_Resume6. 0000000000000022 t __static_initialization_and_destruction_0(int, int)7. 8. 0000000000000000 T test_func(int&, char const*, double, std::string, float)9. 10.                  U std::allocator<char>::allocator()11. 12.                  U std::allocator<char>::~allocator()13. 14.                  U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)15. 16.                  U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)17. 18.                  U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()19. 20.                  U std::ios_base::Init::Init()21.                  U std::ios_base::Init::~Init()22. 0000000000000000 b std::__ioinit23. 24.                  U __cxa_atexit25.                  U __dso_handle26.                  U __gxx_personality_v027. 0000000000000076 t __tcf_028. 29. 000000000000008e T main又到了Last but not least important的時(shí)候了,還有一個(gè)特別重要的接口函數(shù)就是__cxa_demangle(),此函數(shù)的原型為: 1. namespace abi {2. extern "C" char* __cxa_demangle (const char* mangled_name,3. 4. char* buf,5. size_t* n,6. int* status);7. }用于將mangled_name所指向的mangled進(jìn)行demangle并將結(jié)果存放在buf中,n為buf的大小。status存放函數(shù)執(zhí)行的結(jié)果,返回值為0表示執(zhí)行成功。下面是使用這個(gè)接口函數(shù)進(jìn)行demangle的例子: 1. /*2. * Author: Chaos Lee3. 4. * Description: Employ __cxa_demangle to demangle a mangling function name.5. 6. * Date:2012/05/067. 8. *9. */10. #include<iostream>11. #include<cxxabi.h>12. using namespace std;13. 14. using namespace abi;15. 16. int main(int argc,char *argv[])17. 18. {19.         const char * mangled_string = "_Z9test_funcRiPKcdSsf";20. 21.         char buffer[100];22.         int status;23.         size_t n=100;24.         __cxa_demangle(mangled_string,buffer,&n,&status);25. 26.         cout<<buffer<<endl;27.         cout<<status<<endl;28.         return 0;29. }測(cè)試結(jié)果: 1. [lichao@sg01 name_mangling]$ g++ cxa_demangle.cpp -o cxa_demangle2. 3. [lichao@sg01 name_mangling]$ ./cxa_demangle4. 5. test_func(int&, char const*, double, std::string, float)6. 7. 0name mangling與黑客l 使用demangling可以破解動(dòng)態(tài)鏈接庫(kù)中的沒有公開的APIl 編寫名稱為name mangling接口函數(shù),打開重復(fù)符號(hào)的編譯開關(guān),可以替換原來函數(shù)中鏈接函數(shù)的指向,從而改變程序的運(yùn)行結(jié)果。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

久久亚洲精品一区二区| 国产一区激情在线| 伊人久久精品一区二区三区| 2020av在线| 性色国产成人久久久精品| 久久久久久久久久亚洲| 国产哺乳奶水91在线播放| 亚洲欧美另类中文字幕| 中文字幕a在线观看| 午夜一级黄色片| 欧美色视频一区二区三区在线观看| 国产精品大片wwwwww| 国产精品亚洲αv天堂无码| 99蜜月精品久久91| 中文字幕在线播放一区二区| 天天插天天干天天操| 麻豆三级在线观看| 亚洲奶水xxxx哺乳期| xxxx在线播放| 国产色在线观看| 欧美人妻精品一区二区免费看| 91免费精品国自产拍在线不卡| 日本高清好狼色视频| 极品人妻一区二区三区| 国产一级一片免费播放| 国产一区二区三区四区五区加勒比| 日韩色图在线观看| 亚洲精品一级片| 另类天堂视频在线观看| 91精品久久久久久久91蜜桃| 免费观看成人高潮| 久久久久久久有限公司| 一区二区视频在线看| gogo大尺度成人免费视频| 免费日韩在线观看| 777奇米四色成人影色区| 国产伦精品一区二区三区视频黑人| 538在线一区二区精品国产| 91色视频在线导航| 九色网友自拍视频手机在线| 久久综合影音| 天天干天天操天天拍| 日本一区二区视频在线观看| 你懂的网址视频| 欧美三级视频网站| 怕怕欧美视频免费大全| 九色视频成人porny| 亚州av日韩av| 18av在线播放| 成人h动漫精品一区二区无码| 国产九色91回来了| 欧美日韩精品系列| 欧美日韩国产欧美日美国产精品| 欧州一区二区| 91porn在线| 免费成人高清在线视频theav| 国产女人18毛片水真多| 久久亚洲欧美日韩精品专区| 日韩免费福利视频| 欧美亚洲精品日韩| 欧美在线一二三| 欧美国产成人精品一区二区三区| 欧美日韩国产第一页| 免费看片91| a4yy在线播放免费观看视频| 日韩在线观看免费全集电视剧网站| av观看免费| 欧洲人成人精品| 99在线视频精品| 3d动漫精品啪啪一区二区下载| 无码国产精品一区二区免费式直播| 在线能看的av| 国产精品宾馆在线精品酒店| 日本色综合中文字幕| 1级黄色大片儿| 亚洲韩国日本中文字幕| 日韩av黄色片| jizzjizzjizz中国免费| 日韩欧美中文一区| www.日韩高清| av超碰在线观看| 亚欧黄色av| 一区二区三区欧美亚洲| a视频在线看| 一区二区三区在线免费观看| 精品欧美国产| 一区二区三区日韩精品视频| 精品欧美一区二区久久久伦| 欧美r级电影在线观看| 亚洲精品一区中文字幕电影| 中国人体摄影一区二区三区| 亚洲嫩模一区| 青青草91视频| 手机免费看av网站| 久久夜色邦福利网| 日韩一区国产在线观看| 99久久99热这里只有精品| 97在线公开视频| 日韩欧美亚洲国产一区| 天天干天天摸天天操| 日韩美女中文字幕| 在线观看免费视频黄| 国产女优裸体网站| 国产精品福利在线播放| 亚洲国产精品久久久久蝴蝶传媒| 免费a级观看| 免费一级片视频| 欧美激情综合亚洲一二区| 青青久在线视频| 少妇免费毛片久久久久久久久| 97久久精品人搡人人玩| 国产精品免费人成网站酒店| 9.1成人看片| 九一国产在线| 日本婷婷久久久久久久久一区二区| 影音先锋人妻啪啪av资源网站| 国产成人精品无码播放| 涩涩视频在线播放| 久久亚洲天堂网| 国产综合视频在线| 久久这里只有精品1| 国产极品美女在线| 亚洲第一中文字幕| 亚洲国产成人久久| 日本成人在线一区| 精品视频一区三区九区| 三年片免费观看大全| 麻豆freexxxx性91精品| 成人黄色免费视频| av电影成人| 在线一区二区三区视频| 日韩av在线发布| 亚洲精品无码久久久久| 女性裸体视频网站| 成人区人妻精品一区二| 成人国产精品入口免费视频| 成人午夜激情片| 欧美日韩久久不卡| 亚洲国产精品成人一区二区在线| 久久久久无码精品| 国产精品免费人成网站| 日本黄色激情视频| 超碰日本道色综合久久综合| 桃花岛成人影院| wwwxxx免费| 在线免费av片| 久久久久久久久久一区二区三区| 国产色综合一区二区三区| 国产激情视频在线播放| 成人18视频在线播放| 777永久免费网站国产| 九色蝌蚪av新入口| 看看黄色一级片| 中文字幕第22页| 国产精品美女久久久久久| 丰满熟妇人妻中文字幕| 国产精品日韩一区二区三区| 欧美日韩免费电影| 久久综合九色综合久| 亚洲国产精品久久网午夜小说| 国产女女做受ⅹxx高潮| 久久精品国产一区二区| 国产在线视频精品一区| 亚洲欧美日韩中文在线制服| 鲁大师私人影院在线观看| 2020av在线| 欧美综合在线视频观看| 麻豆久久久9性大片| 在线视频网站| av在线之家电影网站| 日本孕妇大胆孕交无码| 加勒比久久综合| jizz一区二区三区| 三级黄色录像视频| 国产精品美女xx| 最大av网站| 日韩欧美电影一区| 欧美黄色影院| 成人做爽爽免费视频| 欧美性猛交xxx乱久交| 91精品国产高清一区二区三蜜臀| 伊人网在线视频| 潮喷失禁大喷水aⅴ无码| 色猫视频免费观看| 天堂中文网在线| 神马午夜精品91| 亚洲人成精品久久久久久| 国产蜜臀一区二区打屁股调教| 成人黄色在线| 日本午夜在线观看| 亚洲永久免费av| 日本一区二区视频在线观看| 中文字幕欧美视频在线| 亚洲1区在线| 国产探花在线精品一区二区| 国产在线观看免费av| 一区二区三区四区高清精品免费观看| 秋霞久久久久久一区二区| 成人精品鲁一区一区二区| 中文岛国精品亚洲一区| 99成人超碰| 欧美日韩一区二区视频在线| 美女啪啪无遮挡免费久久网站| 亚洲欧美综合区自拍另类| 性欧美13一14内谢| 国产伦精品一区二区三区四区视频| 777奇米成人网| 一级黄色免费在线观看| 日韩综合在线视频| 欧美三级三级三级| 6699嫩草久久久精品影院| 亚洲午夜久久久久久久| 高清视频一区二区三区| 久久久国产免费| www在线看| 中文字幕欧美日韩va免费视频| 国产91|九色| 国产精品久免费的黄网站| 少妇久久久久久被弄到高潮| h视频在线观看免费| 国产精品99久久久久久大便| 综合视频免费看| 无码人妻精品一区二区三区9厂| 在线观看午夜看亚太视频| 91麻豆精品一二三区在线| 国产午夜精品一区二区三区视频| 97在线观看免费高| 色综合天天综合网天天狠天天| 黄色成人在线观看网站| 亚洲香蕉成人av网站在线观看| 伊人精品一区二区三区| 精品亚洲aⅴ无码一区二区三区| 国产精品欧美久久久久天天影视| 久久久久久av无码免费网站下载| 无码人妻aⅴ一区二区三区| 精品肉丝脚一区二区三区| 国产精品影视| 国产日韩另类视频一区| 欧美午夜在线视频| 日韩视频一区二区三区四区| 日韩在线观看视频一区二区| 国内精品久久久久国产盗摄免费观看完整版| 免费人成a大片在线观看动漫| 可以直接看的av网址站| 一本到不卡免费一区二区| 日韩成人中文字幕| 91精品导航| 日韩精品毛片| 中文 欧美 日韩| 精品国产乱码久久久久软件| 狠狠躁天天躁日日躁欧美| 韩国三级丰满少妇高潮| 久久久青草青青国产亚洲免观| 羞羞小视频在线观看| 欧美一级高潮片| 91视频.com| 日韩av片在线播放| 午夜婷婷在线观看| 在线精品国精品国产尤物884a| 91精品国产91久久久久久不卡| 丰满人妻中伦妇伦精品app| 亚洲天堂av资源在线观看| 在线视频观看一区| 亚洲精品婷婷| 欧美高清xxx| ww国产内射精品后入国产| 性欧美在线视频| 亚洲欧美日韩精品永久在线| ady日本映画久久精品一区二区| 久热在线视频| 懂色中文一区二区三区在线视频| 国产精品成人一区二区艾草| 久久黄色免费网站| 亚洲欧美日本国产专区一区| 欧美色中文字幕| 久久成人羞羞网站| 你懂的网址国产 欧美| 日韩情涩欧美日韩视频| 蜜桃久久久久| 午夜精品一区二区三区视频| 亚洲精品日韩精品| 老司机一区二区三区| 欧美高清一级片在线观看| 美女黄视频在线播放| 欧美,日韩,国产在线| 中文精品久久| 激情自拍一区| 中文字幕亚洲色图| 波多野结衣综合网| 美女国内精品自产拍在线播放| 精品人妻一区二区三区四区在线| 激情久久婷婷| gogo亚洲高清大胆美女人体| 2023国产精华国产精品| 成人欧美在线视频| 日韩久久一区二区三区| 免费毛片大全| 伊人色**天天综合婷婷| 亚洲福利在线播放| 国产精品扒开腿做爽爽爽软件| 少妇精品无码一区二区三区| 奇米色一区二区三区四区| 麻豆精品一二三| 最新亚洲精品国自产在线观看| 欧美日本免费| 第一社区sis001原创亚洲| 销魂美女一区二区三区视频在线| 国产精品狼人色视频一区| 色诱视频网站一区| 欧美日韩hd| 最近中文字幕在线观看| 中文字幕一区二区三区精彩视频| 亚洲精品97久久中文字幕| 久久99久久99精品中文字幕| 九九热在线精品视频| 国产小视频福利在线| 影院欧美亚洲| 午夜免费福利影院| 99久久久国产精品免费蜜臀| 国产精品无码在线播放| 91电影在线播放| ckplayer中文字幕| 黄污在线观看| 国产女人水真多18毛片18精品| 成人免费黄色网址| 男女在线视频| 国产久草在线| 日本网站在线观看一区二区三区|