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

首頁 > 編程 > C++ > 正文

Name Mangling in C++

2019-11-11 07:46:46
字體:
供稿:網(wǎng)友
摘要:詳細介紹了C++中的Name Mangling的原理和gcc中對應的實現(xiàn),通過程序代碼和nm C++filt等工具來驗證這些原理。對于詳細了解程序的鏈接過程有一定的幫助。Name Mangling概述大型程序是通過多個模塊構(gòu)建而成,模塊之間的關系由makefile來描述。對于由C++語言編制的大型程序而言,也是符合這個規(guī)則。程序的構(gòu)建過程一般為:各個源文件分別編譯,形成目標文件。多個目標文件通過鏈接器形成最終的可執(zhí)行程序。顯然,從某種程度上說,編譯器的輸出是鏈接器的輸入,鏈接器要對編譯器的輸出做二次加工。從通信的角度看,這兩個程序需要一定的協(xié)議來規(guī)范符號的組織格式。這就是Name Mangling產(chǎn)生的根本原因。C++的語言特性比C豐富的多,C++支持的函數(shù)重載功能是需要Name Mangling技術(shù)的最直接的例子。對于重載的函數(shù),不能僅依靠函數(shù)名稱來區(qū)分不同的函數(shù),因為C++中重載函數(shù)的區(qū)分是建立在以下規(guī)則上的:函數(shù)名字不同 || 參數(shù)數(shù)量不同||某個參數(shù)的類型不同那么區(qū)分函數(shù)的時候,應該充分考慮參數(shù)數(shù)量和參數(shù)類型這兩種語義信息,這樣才能為卻分不同的函數(shù)保證充分性。當然,C++還有很多其他的地方需要Name Mangling,如namespace, class, template等等??偟膩碚f,Name Mangling就是一種規(guī)范編譯器和鏈接器之間用于通信的符號表表示方法的協(xié)議,其目的在于按照程序的語言規(guī)范,使符號具備足夠多的語義信息以保證鏈接過程準確無誤的進行。簡單的實驗Name Mangling會帶了一個很常見的負面效應,就是C語言的程序調(diào)用C++的程序時,會比較棘手。因為C語言中的Name Mangling很簡單,不如C++中這么復雜。下面的代碼用于演示這兩種不同點: 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編譯后對應的符號表中,幾乎沒有對函數(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++編譯器對符號的改編比較復雜。所以,如果一個由C語言編譯的目標文件中調(diào)用了C++中實現(xiàn)的函數(shù),肯定會出錯的,因為符號不匹配。簡單對_Z9rect_areaiiii做個介紹:l C++語言中規(guī)定 :以下劃線并緊挨著大寫字母開頭或者以兩個下劃線開頭的標識符都是C++語言中保留的標示符。所以_Z9rect_areaiiii是保留的標識符,g++編譯的目標文件中的符號使用_Z開頭(C99標準)。l 接下來的部分和網(wǎng)絡協(xié)議很類似。9表示接下來的要表示的一個字符串對象的長度(現(xiàn)在知道為什么不讓用數(shù)字作為標識符的開頭了吧?)所以rect_area這九個字符就作為函數(shù)的名稱被識別出來了。l 接下來的每個小寫字母表示參數(shù)的類型,i表示int類型。小寫字母的數(shù)量表示函數(shù)的參數(shù)列表中參數(shù)的數(shù)量。l 所以,在符號中集成了用于區(qū)分不同重載函數(shù)的足夠的語義信息。如果要在C語言中調(diào)用C++中的函數(shù)該怎么做?這時候可以使用C++的關鍵字extern “C”。對應代碼如下: 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”關鍵字之后,符號按照C語言的格式來組織了。事實上,C標準庫中使用了大量的extern “C”關鍵字,因為C標準庫也是可以用C++編譯器編譯的,但是要確保編譯之后仍然保持C的接口而不是C++的接口(因為是C標準庫),所以需要使用extern “C”關鍵字。下面是一個簡單的例子: 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語言可調(diào)用的接口形式。標準不同編譯器使用不同的方式進行name mangling, 你可能會問為什么不將C++的 name mangling標準化,這樣就能實現(xiàn)各個編譯器之間的互操作了。事實上,在C++的FAQ列表上有對此問題的回答:"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)部實現(xiàn)的不同而不同,內(nèi)部實現(xiàn)包括對象在內(nèi)存中的布局,繼承的實現(xiàn),虛函數(shù)調(diào)用處理等等。所以如果將name mangling標準化了,不錯,你的程序確實能夠鏈接成功,但是運行肯定要崩的。恰恰是因為這個原因,ARM鼓勵為同一平臺提供的不同編譯器應該使用不同的name mangling方式。這樣在編譯的時候,不兼容的庫就會被檢測到,而不至于鏈接時雖然通過了,但是運行時崩潰了?!憋@然,這是基于“運行時崩潰比鏈接時失敗的代價更大”這個原則而考慮的。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++編譯器方案不同,所以一種編譯器生成的目標文件并不能被另外一種編譯器生成的目標文件使用。以下為內(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下面是一段簡單的代碼: 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,表示對整型變量的引用l PKc:表示const char *指針l Ss:目前還沒有找到原因。先留著~l f:表示浮點型name demanglingC++的name mangling技術(shù)一般使得函數(shù)變得面目全非,而很多情況下我們在查看這些符號的時候并不需要看到這些函數(shù)name mangling之后的效果,而是想看看是否定義了某個函數(shù),或者是否引用了某個函數(shù),這對于我們調(diào)試程序是非常有幫助的。所以需要一種方法從name mangling之后的符號變換為name mangling之前的符號,這個過程稱之為name demangling.事實上有很多工具提供這些功能,最常用的就是c++file命令,c++filt命令接受一個name mangling之后的符號作為輸入并輸出demangling之后的符號。例如: 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符號,使用選項-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ù)就是__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進行demangle并將結(jié)果存放在buf中,n為buf的大小。status存放函數(shù)執(zhí)行的結(jié)果,返回值為0表示執(zhí)行成功。下面是使用這個接口函數(shù)進行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. }測試結(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可以破解動態(tài)鏈接庫中的沒有公開的APIl 編寫名稱為name mangling接口函數(shù),打開重復符號的編譯開關,可以替換原來函數(shù)中鏈接函數(shù)的指向,從而改變程序的運行結(jié)果。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

91麻豆国产自产在线观看亚洲| 国产日韩成人内射视频| www.看毛片| 精品一区二区国语对白| 国产欧美日韩精品在线观看| 色爱av美腿丝袜综合粉嫩av| 中文字字幕在线中文乱码电影| 日韩精品免费视频人成| 户外露出一区二区三区| 久久福利电影| 一区二区三区欧美日韩| 国产三级国产精品| 毛片在线免费播放| 成人资源视频网站免费| 国产三区二区一区久久| 国产伦精品一区三区精东| 在线精品视频一区二区三四| 少妇免费视频| 国产精品一区二区91| 日本中文字幕在线视频观看| 欧美日韩一区二区三区免费看| 欧美三级免费观看| 日韩成人黄色av| 久久精品久久久久久久| 国产精品一区二区你懂的| 91精品国产99| 日韩精品久久久久久福利| 91九色精品国产一区二区| 色影视在线视频资源站| 国产一区二区三区美女| 丁香花在线高清完整版视频| 一本一道波多野毛片中文在线| 777777777亚洲妇女| 日韩视频在线免费播放| 五月天综合婷婷| 亚洲综合激情另类小说区| 情侣黄网站免费看| 欧美亚洲一二三区| 日韩av黄色片| 91精品久久久久久久久久久久| 性欧美性free| 99视频精品全部免费在线| 红桃成人av在线播放| 日韩精品成人一区二区在线观看| gv天堂gv无码男同在线观看| 国产精品一区二区三区四区| 国产视频一区二| 中文字幕视频一区二区三区久| 亚洲国产一区二区三区在线观看| 日韩有码在线观看| 日本精品600av| 日韩啊v在线| 国产特级黄色录像| 日韩精品视频免费看| 精品一区二区三区免费毛片| 国产又大又黄又粗的视频| 久久成人资源| 欧美国产日韩xxxxx| 国产浪潮av性色av小说| 一本一道久久a久久| 偷拍欧美精品| 国产精品久久久亚洲一区| 国产精品成人久久久久| 中文字幕在线一二| 亚洲人成网站77777在线观看| 黄色一二三区| 日韩欧美国产综合在线| 亚洲字幕成人中文在线观看| 国产福利a级| 日韩专区在线播放| 一本大道久久精品懂色aⅴ| 亚洲日本japanese丝袜| caoporn97免费视频公开| 亚洲国产欧美一区二区三区同亚洲| 亚洲第一精品自拍| 中文在线最新版天堂8| 91免费视频播放| 宅男网站在线免费观看| 人妻内射一区二区在线视频| 成人欧美一区二区三区在线播放| 国精产品一区二区| 中文字幕不卡三区视频| 九九精品在线观看| 亚洲精品一区三区三区在线观看| 国产suv一区二区三区88区| 国精产品一品二品国精品69xx| 久久久国产精品黄毛片| 情侣偷拍对白清晰饥渴难耐| 亚洲成人在线观看视频| 日本人体一区二区| 亚洲一级片在线观看| 中文字幕xxx| 久久久久久久国产精品影院| www.亚洲男人天堂| 捆绑凌虐一区二区三区| 午夜久久久久久久久久久| 一区二区三区在线观看av| 中文字幕在线视频精品| 免费成人在线观看视频| 91偷拍一区二区三区精品| 久久尤物视频| 欧美丰满熟妇bbbbbb百度| 亚洲激情在线观看视频| 久久中文字幕国产| 久久人人爽人人爽人人片av高清| 顶级嫩模精品视频在线看| 羞羞视频网站在线免费观看| 男人天堂视频在线观看| av资源中文在线天堂| 欧美亚洲午夜视频在线观看| 亚洲18在线看污www麻豆| 久久国产三级精品| 蜜臀久久久久久999| xfplay先锋影音夜色资源站| 成人黄色一级视频| 99久久精品费精品国产一区二区| 国产伦精品一区二区三区免费视频| 2019中文字幕在线| 欧美野外猛男的大粗鳮| 亚洲欧美另类色图| 国产欧美欧美| 日韩深夜福利网站| 成人三级av在线| 国产专区一区二区三区| 日韩专区欧美专区| 51妺嘿嘿午夜福利| 精品一区二区视频在线观看| 色香蕉在线视频| 中文字幕永久免费视频| 热99在线视频| 不卡在线视频中文字幕| 成人在线观看免费网站| 看黄网站在线观看| 亚洲777理论| 神马影院一区二区三区| 91精品国产99| 亚洲老妇色熟女老太| 手机在线一区二区三区| 精品成人在线视频| 欧美激情综合五月色丁香小说| 中文在线аv在线| 日本视频一区二区三区| 欧美激情 国产精品| 日韩一二在线观看| 韩国主播福利视频一区二区三区| 国产又粗又猛又爽又黄的视频四季| 亚洲第一精品久久忘忧草社区| 国产亚洲精品美女久久久久久久久久| 欧美18一12sex性处hd| 日韩动漫在线观看| 国产精品嫩草在线观看| 黄色的网站在线观看| 亚洲国产毛片完整版| 91精品国产综合久久精品| 一本色道综合亚洲| 亚洲丝袜在线视频| 成人情趣视频网站| 欧美色图综合网| 91蝌蚪视频九色| 午夜免费福利视频在线观看| 一区二区三区无码高清视频| 91手机视频在线观看| 亚洲午夜一级| 日本一本二本在线观看| 日韩精品影院| www.久久久久久久久久| 欧美亚洲福利| 欧美亚洲国产成人精品| 精品女同一区二区三区在线观看| 久久久久久免费毛片精品| 日产精品高清视频免费| 久久久久久久黄色| 久草成人在线视频| 亚洲午夜电影网| 欧美黑人精品一区二区不卡| 波多野结衣电车痴汉| 成人av综合在线| 亚洲天堂av在线播放| 欧美日韩老妇| 狠狠做深爱婷婷久久综合一区| 欧美日韩午夜激情| 欧美丰满少妇xxxx| 国产视频二区| 国产av无码专区亚洲av麻豆| 天天干天天舔天天操| 亚洲乱码中文字幕久久孕妇黑人| 亚洲三级中文字幕| 一区二区三区影院| 精品无人区一区二区三区竹菊| 久久久国产一级片| 日本高清精品| 精品日韩在线播放| 日韩高清av在线| 日韩伦理一区二区三区| 欧美一区二区三区喷汁尤物| 波多野在线观看| 成人一区二区三区在线观看| 国产精品黑丝在线播放| 97精品欧美一区二区三区| 成人激情视频在线播放| 亚洲韩国日本中文字幕| 国产一区二区三区四区三区四| 黄色片网站在线| 深夜福利久久| 亚洲成av人综合在线观看| 日韩av黄色在线观看| 911国产在线| 制服丝袜一区二区三区| 久久精品第一页| 成人欧美一区二区三区1314| 国产色一区二区三区| 98国产高清一区| 日日夜夜操视频| 国产综合色视频| 久久久久久久影院| 无码免费一区二区三区| 亚洲精品一区二区三区区别| 欧美日韩视频精品一区二区| 一本一本久久a久久综合精品蜜桃| 夜夜添无码一区二区三区| a级在线观看视频| 极品美女销魂一区二区三区| 666欧美在线视频| 亚洲天堂视频在线观看免费| 色婷婷av一区二区三区丝袜美腿| 国产中文字幕视频在线观看| 视频二区欧美| 亚洲一二三av| 精品国产三级| 免费毛片视频网站| 九色视频成人porny| 欧美一区二区三区婷婷| 国产原创一区| 国产精品免费观看久久| 国产美女在线免费观看| 伊人色综合久久久天天蜜桃| 欧美日韩国产一区二区| 性插视频在线观看| 亚洲三级 欧美三级| 日韩黄色免费电影| 国产福利在线播放麻豆| 日韩a级片在线观看| 性久久久久久久久久久| 久久久国产一区二区三区| 欧美精品成人91久久久久久久| 国产999精品| 久久夜色精品亚洲| 国产手机视频精品| 国产精品视频麻豆| 午夜精品久久久久久久四虎美女版| 国产色综合天天综合网| 久久国产精品偷| 日本电影一区二区三区| 日韩一区二区在线| 高清欧美性猛交| 欧美精品一区二区久久| 色先锋影音岛国av资源| 欧美成人三级伦在线观看| 免费在线超碰| 日韩影院免费视频| 日韩熟女一区二区| www黄色av| 国产一区二区在线免费视频| av网在线播放| 少妇户外露出[11p]| 国产嫩草在线视频| 亚洲综合影院| 色视频网站在线观看| 视频一区欧美精品| 美女在线一区| 国产精品乱子久久久久| 一区二区 亚洲| 国产一区二区三区四区五区加勒比| 全国男人的天堂天堂网| 亚洲狠狠丁香婷婷综合久久久| 国产精品无码在线播放| 日韩免费一区二区| 99精品在线观看| jizz在线免费观看| 国产成人综合欧美精品久久| 欧美久久久影院| 日韩欧美高清一区| 日韩美女在线看| 国产日韩欧美综合| 日韩国产一区二区| 国产又大又黄视频| 五级黄高潮片90分钟视频| 九色视频在线播放| 免费在线国产精品| 亚洲午夜精品一区二区三区| 欧美日韩一区二区在线免费观看| 欧美激情网站在线观看| 日韩一区二区三区四区五区六区| 天堂8中文在线| 最近2019免费中文字幕视频三| 9国产精品视频| 99亚洲伊人久久精品影院| 国产精品嫩草影视| 亚洲香肠在线观看| 国产成人精品免费看在线播放| 日韩一区中文| 国产精品成人va在线观看| 欧美性资源免费| 精品人伦一区二区三区蜜桃免费| 午夜在线视频观看| 天天爽夜夜爽一区二区三区| 日本综合视频| 精品网站999| 国产人成一区二区三区影院| 97人人模人人爽人人喊中文字| 欧美日韩国产页| 5566成人精品视频免费| 日本欧洲一区二区| 日本道在线观看| 国产精品久久久久久久免费看| 黑人精品无码一区二区三区AV| 日本新janpanese乱熟| 欧美大片网站| 国产精品视频一区二区三区综合| 青青艹视频在线| 伪装者免费全集在线观看| 国产精品久久看| 欧美三区视频| 国产午夜麻豆影院在线观看| 欧美大片拔萝卜| 久久国产精品免费一区| 一区二区三区在线高清| 国产99久久久国产精品|