日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang语言编译的二进制可执行文件为什么比 C 语言大(转载)

發布時間:2024/4/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang语言编译的二进制可执行文件为什么比 C 语言大(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一位朋友問我“為什么同樣的hello world 入門程序”為什么golang編譯出來的二進制文件,比 C 大,而且大很多。我做了個測試,來分析這個問題。C 語言的hello world程序:

1 2 3 4 5 #include <stdio.h> int main() { ????printf("hello world!\n"); ????return 0; }

golang 語言的hello world程序:

1 2 3 4 5 6 7 package main import "fmt" func main() { ????fmt.Printf("hello, world!\n") }

編譯,查看生成文件大小

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 root@cnxct:/home/cfc4n/go_vs_c# gcc -o c.out main.c root@cnxct:/home/cfc4n/go_vs_c# go build -o go_fmt.out main_fmt.go root@cnxct:/home/cfc4n/go_vs_c# ll total 1552 drwxr-xr-x 2 root? root???? 4096 Sep 20 16:56 ./ drwxr-xr-x 8 cfc4n cfc4n??? 4096 Sep 20 16:54 ../ -rwxr-xr-x 1 root? root???? 8600 Sep 20 16:56 c.out* -rwxr-xr-x 1 root? root? 1560062 Sep 20 16:56 go_fmt.out* -rw-r--r-- 1 root? root?????? 78 Sep 20 16:54 main.c -rw-r--r-- 1 root? root?????? 78 Sep 20 16:55 main_fmt.go root@cnxct:/home/cfc4n/go_vs_c# du -sh * 12K c.out 1.5M??? go_fmt.out 4.0K??? main.c 4.0K??? main_fmt.go

正如這位朋友所說c.out是12K,而?go_fmt.out是1.5M,差距奇大無比….為什么呢?

這兩個二進制可執行文件文件里,都包含了什么?

眾所周知,linux 上的二進制可執行文件是?ELF Executable and Linkable Format?可執行和可鏈接格式

ELF文件格式組成

?

如上圖,ELF 文件分為如下:

  • ELF文件的組成:ELF header
  • 程序頭:描述段信息
  • Section頭:鏈接與重定位需要的數據
  • 程序頭與Section頭需要的數據.text .data

在 Linux 上, 查看elf格式構成可以使用readelf

ELF Header:頭的信息

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 root@cnxct:/home/cfc4n/go_vs_c# readelf -h c.out 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:????????????????????????????? EXEC (Executable file) ??Machine:?????????????????????????? Advanced Micro Devices X86-64 ??Version:?????????????????????????? 0x1 ??Entry point address:?????????????? 0x400430 ??Start of program headers:????????? 64 (bytes into file) ??Start of section headers:????????? 6616 (bytes into file) ??Flags:???????????????????????????? 0x0 ??Size of this header:?????????????? 64 (bytes) ??Size of program headers:?????????? 56 (bytes) ??Number of program headers:???????? 9 ??Size of section headers:?????????? 64 (bytes) ??Number of section headers:???????? 31 ??Section header string table index: 28 ?root@cnxct:/home/cfc4n/go_vs_c# readelf -h go_fmt.out 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:????????????????????????????? EXEC (Executable file) ??Machine:?????????????????????????? Advanced Micro Devices X86-64 ??Version:?????????????????????????? 0x1 ??Entry point address:?????????????? 0x44e360 ??Start of program headers:????????? 64 (bytes into file) ??Start of section headers:????????? 456 (bytes into file) ??Flags:???????????????????????????? 0x0 ??Size of this header:?????????????? 64 (bytes) ??Size of program headers:?????????? 56 (bytes) ??Number of program headers:???????? 7 ??Size of section headers:?????????? 64 (bytes) ??Number of section headers:???????? 23 ??Section header string table index: 3

ELF 頭的長度都是一樣的,不會帶來總體體積的變化。區別是個別字節的值不一樣,比如Entry point address 程序入口點的值不一樣等。

接下來是 程序頭:,也就是 section部分(在linker連接器的角度是section部分或者裝載器角度的segment)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 root@cnxct:/home/cfc4n/go_vs_c# readelf -d c.out Dynamic section at offset 0xe28 contains 24 entries: ??Tag??????? Type???????????????????????? Name/Value ?0x0000000000000001 (NEEDED)???????????? Shared library: [libc.so.6] ?0x000000000000000c (INIT)?????????????? 0x4003c8 ?0x000000000000000d (FINI)?????????????? 0x4005b4 ?0x0000000000000019 (INIT_ARRAY)???????? 0x600e10 ?0x000000000000001b (INIT_ARRAYSZ)?????? 8 (bytes) ?0x000000000000001a (FINI_ARRAY)???????? 0x600e18 ?0x000000000000001c (FINI_ARRAYSZ)?????? 8 (bytes) ?0x000000006ffffef5 (GNU_HASH)?????????? 0x400298 ?0x0000000000000005 (STRTAB)???????????? 0x400318 ?0x0000000000000006 (SYMTAB)???????????? 0x4002b8 ?0x000000000000000a (STRSZ)????????????? 61 (bytes) ?0x000000000000000b (SYMENT)???????????? 24 (bytes) ?0x0000000000000015 (DEBUG)????????????? 0x0 ?0x0000000000000003 (PLTGOT)???????????? 0x601000 ?0x0000000000000002 (PLTRELSZ)?????????? 48 (bytes) ?0x0000000000000014 (PLTREL)???????????? RELA ?0x0000000000000017 (JMPREL)???????????? 0x400398 ?0x0000000000000007 (RELA)?????????????? 0x400380 ?0x0000000000000008 (RELASZ)???????????? 24 (bytes) ?0x0000000000000009 (RELAENT)??????????? 24 (bytes) ?0x000000006ffffffe (VERNEED)??????????? 0x400360 ?0x000000006fffffff (VERNEEDNUM)???????? 1 ?0x000000006ffffff0 (VERSYM)???????????? 0x400356 ?0x0000000000000000 (NULL)?????????????? 0x0

可以看到c.out里引用了一個動態鏈接庫libc.so.6,再看下go_fmt.out的情況

1 2 3 ??root@cnxct:/home/cfc4n/go_vs_c# readelf -d go_fmt.out There is no dynamic section in this file.

c.out的執行,依賴了libc.so.6,?libc.so.6肯定需要ld.so的,看下依賴情況,

1 2 3 4 5 6 7 root@cnxct:/home/cfc4n/go_vs_c# ldd c.out ????linux-vdso.so.1 =>? (0x00007fff3a195000) ????libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4ac4d06000) ????/lib64/ld-linux-x86-64.so.2 (0x0000558ece3fe000) root@cnxct:/home/cfc4n/go_vs_c# ldd go_fmt.out ????not a dynamic executable

依賴了libc.so這個動態鏈接庫

也就是說,C的程序默認使用了libc.so動態鏈接庫,go 的程序,默認進行了靜態編譯,不依賴任何動態鏈接庫。所以體積變大了。 那么,只是這一個原因嗎?

我在 golang 的官方文檔里找到如下的解釋:

Why is my trivial program such a large binary?
The linker in the gc tool chain creates statically-linked binaries by default. All Go binaries therefore include the Go run-time, along with the run-time type information necessary to support dynamic type checks, reflection, and even panic-time stack traces.

A simple C “hello, world” program compiled and linked statically using gcc on Linux is around 750 kB, including an implementation of printf. An equivalent Go program using fmt.Printf is around 1.5 MB, but that includes more powerful run-time support and type information.

將c的程序也使用靜態編譯試試。。。

1 2 3 4 5 6 7 gcc -static -o c_static.out main.c root@cnxct:/home/cfc4n/go_vs_c# du -sh * 12K c.out 888K??? c_static.out 1.5M??? go_fmt.out 4.0K??? main.c 4.0K??? main_fmt.go

可以看到,使用靜態編譯生成的二進制文件c_static.out為888K,仍然比 GO 寫的小了一半,這到底是為什么呢?到底是哪里多了?

在ELF 可執行文件里,就需要以程序編譯鏈接的角度來分析了,對于一個 ELF 文件的分析,上面部分分析過?ELF header部分,以及?dynamic section的情況了。再以看一下剩余的section信息。

鏈接器視圖與加載器視圖

ELF中的section主要提供給Linker使用, 而segment提供給Loader用,Linker需要關心.text,?.rel.text,?.data,?.rodata等等,關鍵是Linker需要做relocation。而Loader只需要知道這個段的Read、Write、Execute的屬性。

再去看go_fmt.out里都包含了什么,為了方便校對,寫了一個程序來對比

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 package main import ( ????"debug/elf" ????"fmt" ????"os" ) func main() { ????if len(os.Args) != 3 { ????????fmt.Println("參數不對") ????????os.Exit(0) ????} ????strFile1 := os.Args[1] ????strFile2 := os.Args[2] ????f1, e := elf.Open(strFile1) ????if e != nil { ????????panic(e) ????} ????f2, e := elf.Open(strFile2) ????if e != nil { ????????panic(e) ????} ????mapSection1 := make(map[string]string, 0) ????mapSection2 := make(map[string]string, 0) ????//[Nr]??? Name??? Type??? Address??? Offset??? Size??? EntSize??? Flags??? Link??? Info??? Align ????var size1 uint64 ????var size2 uint64 ????for _, s := range f1.Sections { ????????mapSection1[s.Name] = fmt.Sprintf("%s\t%s\t%s\t%010x\t%010x\t%d\t%x\t%s\t%x\t%x\t%x\t", s.Name, strFile1, s.Type.String(), s.Addr, s.Offset, s.Size, s.Entsize, s.Flags.String(), s.Link, s.Info, s.Addralign) ????????size1 += s.Size ????} ????for _, s := range f2.Sections { ????????mapSection2[s.Name] = fmt.Sprintf("%s\t%s\t%s\t%010x\t%010x\t%d\t%x\t%s\t%x\t%x\t%x\t", s.Name, strFile2, s.Type.String(), s.Addr, s.Offset, s.Size, s.Entsize, s.Flags.String(), s.Link, s.Info, s.Addralign) ????????size2 += s.Size ????} ????fmt.Println(fmt.Sprintf("%s:%d\t%s:%d", strFile1, size1, strFile2, size2)) ????fmt.Println("Name\tFile\tType\tAddress\tOffset\tSize\tEntSize\tFlags\tLink\tInfo\tAlign") ????for k, v := range mapSection1 { ????????fmt.Println(v) ????????if v1, found := mapSection2[k]; found { ????????????fmt.Println(v1) ????????????delete(mapSection2, k) ????????} ????} ????for _, v := range mapSection2 { ????????fmt.Println(v) ????} }

對比一下兩個文件的section段信息

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 root@cnxct:/home/cfc4n/go_vs_c# ./diffelf c_static.out go_fmt.out c_static.out:910462 go_fmt.out:1674012 Name??? File??? Type??? Address Offset? Size??? EntSize Flags?? Link??? Info??? Align .init_array c_static.out??? SHT_INIT_ARRAY? 00006c8ed8? 00000c8ed8? 16? 0?? SHF_WRITE+SHF_ALLOC 00? 8 .fini_array c_static.out??? SHT_FINI_ARRAY? 00006c8ee8? 00000c8ee8? 16? 0?? SHF_WRITE+SHF_ALLOC 00? 8 .data?? c_static.out??? SHT_PROGBITS??? 00006c9080? 00000c9080? 6864??? 0?? SHF_WRITE+SHF_ALLOC 0?? 020 .data?? go_fmt.out? SHT_PROGBITS??? 00004fa4e0? 00000fa4e0? 7440??? 0?? SHF_WRITE+SHF_ALLOC 0?? 020 .strtab c_static.out??? SHT_STRTAB? 0000000000? 00000d6b40? 26703?? 0?? 0x0 0?? 0?? 1 .strtab go_fmt.out? SHT_STRTAB? 0000000000? 00001704e0? 51486?? 0?? 0x0 0?? 0?? 1 __libc_subfreeres?? c_static.out??? SHT_PROGBITS??? 00004bd6a8? 00000bd6a8? 80? 0?? SHF_ALLOC?? 00? 8 __libc_thread_subfreeres??? c_static.out??? SHT_PROGBITS??? 00004bd708? 00000bd708? 8?? 0?? SHF_ALLOC?? 0?? 0?? 8 .got??? c_static.out??? SHT_PROGBITS??? 00006c8fe8? 00000c8fe8? 16? 8?? SHF_WRITE+SHF_ALLOC 0?? 08 .comment??? c_static.out??? SHT_PROGBITS??? 0000000000? 00000cab50? 52? 1?? SHF_MERGE+SHF_STRINGS?? 00? 1 .fini?? c_static.out??? SHT_PROGBITS??? 00004a0470? 00000a0470? 9?? 0?? SHF_ALLOC+SHF_EXECINSTR 0?? 04 .eh_frame?? c_static.out??? SHT_PROGBITS??? 00004bd710? 00000bd710? 44948?? 0?? SHF_ALLOC?? 0?? 08 .bss??? c_static.out??? SHT_NOBITS? 00006cab60? 00000cab50? 6264??? 0?? SHF_WRITE+SHF_ALLOC 0?? 020 .bss??? go_fmt.out? SHT_NOBITS? 00004fc200? 00000fc200? 108808? 0?? SHF_WRITE+SHF_ALLOC 0?? 020 .gcc_except_table?? c_static.out??? SHT_PROGBITS??? 00004c86a4? 00000c86a4? 179 0?? SHF_ALLOC?? 00? 1 .tdata? c_static.out??? SHT_PROGBITS??? 00006c8eb8? 00000c8eb8? 32? 0?? SHF_WRITE+SHF_ALLOC+SHF_TLS 00? 8 .note.gnu.build-id? c_static.out??? SHT_NOTE??? 00004001b0? 00000001b0? 36? 0?? SHF_ALLOC?? 00? 4 __libc_freeres_fn?? c_static.out??? SHT_PROGBITS??? 000049de60? 000009de60? 9513??? 0?? SHF_ALLOC+SHF_EXECINSTR 0?? 0?? 10 .plt??? c_static.out??? SHT_PROGBITS??? 00004002f0? 00000002f0? 160 0?? SHF_ALLOC+SHF_EXECINSTR 0?? 010 .note.stapsdt?? c_static.out??? SHT_NOTE??? 0000000000? 00000cab84? 3864??? 0?? 0x0 0?? 0?? 4 .symtab c_static.out??? SHT_SYMTAB? 0000000000? 00000cbaa0? 45216?? 18? 0x0 20? 2c7 8 .symtab go_fmt.out? SHT_SYMTAB? 0000000000? 0000164000? 50400?? 18? 0x0 16? 5f? 8 .note.ABI-tag?? c_static.out??? SHT_NOTE??? 0000400190? 0000000190? 32? 0?? SHF_ALLOC?? 0?? 04 .rela.plt?? c_static.out??? SHT_RELA??? 00004001d8? 00000001d8? 240 18? SHF_ALLOC+SHF_INFO_LINK018? 8 .rodata c_static.out??? SHT_PROGBITS??? 00004a0480? 00000a0480? 119332? 0?? SHF_ALLOC?? 0?? 0?? 20 .rodata go_fmt.out? SHT_PROGBITS??? 000047e000? 000007e000? 212344? 0?? SHF_ALLOC?? 0?? 0?? 20 .data.rel.ro??? c_static.out??? SHT_PROGBITS??? 00006c8f00? 00000c8f00? 228 0?? SHF_WRITE+SHF_ALLOC 00? 20 .init?? c_static.out??? SHT_PROGBITS??? 00004002c8? 00000002c8? 26? 0?? SHF_ALLOC+SHF_EXECINSTR 0?? 04 .text?? c_static.out??? SHT_PROGBITS??? 0000400390? 0000000390? 645828? 0?? SHF_ALLOC+SHF_EXECINSTR 0?? 010 .text?? go_fmt.out? SHT_PROGBITS??? 0000401000? 0000001000? 508779? 0?? SHF_ALLOC+SHF_EXECINSTR 0?? 010 __libc_atexit?? c_static.out??? SHT_PROGBITS??? 00004bd6f8? 00000bd6f8? 8?? 0?? SHF_ALLOC?? 0?? 08 .stapsdt.base?? c_static.out??? SHT_PROGBITS??? 00004bd700? 00000bd700? 1?? 0?? SHF_ALLOC?? 0?? 01 .jcr??? c_static.out??? SHT_PROGBITS??? 00006c8ef8? 00000c8ef8? 8?? 0?? SHF_WRITE+SHF_ALLOC 0?? 08 ????c_static.out??? SHT_NULL??? 0000000000? 0000000000? 0?? 0?? 0x0 0?? 0?? 0 ????go_fmt.out? SHT_NULL??? 0000000000? 0000000000? 0?? 0?? 0x0 0?? 0?? 0 __libc_thread_freeres_fn??? c_static.out??? SHT_PROGBITS??? 00004a0390? 00000a0390? 222 0?? SHF_ALLOC+SHF_EXECINSTR 0?? 0?? 10 __libc_freeres_ptrs c_static.out??? SHT_NOBITS? 00006cc3d8? 00000cab50? 48? 0?? SHF_WRITE+SHF_ALLOC 0?? 0?? 8 .shstrtab?? c_static.out??? SHT_STRTAB? 0000000000? 00000dd38f? 361 0?? 0x0 0?? 0?? 1 .shstrtab?? go_fmt.out? SHT_STRTAB? 0000000000? 00000b1d80? 257 0?? 0x0 0?? 0?? 1 .tbss?? c_static.out??? SHT_NOBITS? 00006c8ed8? 00000c8ed8? 48? 0?? SHF_WRITE+SHF_ALLOC+SHF_TLS 00? 8 .got.plt??? c_static.out??? SHT_PROGBITS??? 00006c9000? 00000c9000? 104 8?? SHF_WRITE+SHF_ALLOC 00? 8 .itablink?? go_fmt.out? SHT_PROGBITS??? 00004b29d8? 00000b29d8? 56? 0?? SHF_ALLOC?? 0?? 08 .gopclntab? go_fmt.out? SHT_PROGBITS??? 00004b2a20? 00000b2a20? 282414? 0?? SHF_ALLOC?? 0?? 020 .debug_abbrev?? go_fmt.out? SHT_PROGBITS??? 000051c000? 00000fd000? 255 0?? 0x0 0?? 0?? 1 .debug_frame??? go_fmt.out? SHT_PROGBITS??? 000052b2d5? 000010c2d5? 69564?? 0?? 0x0 0?? 0?? 1 .debug_aranges? go_fmt.out? SHT_PROGBITS??? 000054634c? 000012734c? 48? 0?? 0x0 0?? 0?? 1 .debug_info go_fmt.out? SHT_PROGBITS??? 00005463a6? 00001273a6? 248638? 0?? 0x0 0?? 0?? 1 .note.go.buildid??? go_fmt.out? SHT_NOTE??? 0000400fc8? 0000000fc8? 56? 0?? SHF_ALLOC?? 00? 4 .debug_pubtypes go_fmt.out? SHT_PROGBITS??? 000053e9e5? 000011f9e5? 31079?? 0?? 0x0 0?? 0?? 1 .debug_gdb_scripts? go_fmt.out? SHT_PROGBITS??? 000054637c? 000012737c? 42? 0?? 0x0 0?? 01 .debug_line go_fmt.out? SHT_PROGBITS??? 000051c0ff? 00000fd0ff? 61910?? 0?? 0x0 0?? 0?? 1 .typelink?? go_fmt.out? SHT_PROGBITS??? 00004b1ea0? 00000b1ea0? 2872??? 0?? SHF_ALLOC?? 0?? 020 .noptrdata? go_fmt.out? SHT_PROGBITS??? 00004f8000? 00000f8000? 9416??? 0?? SHF_WRITE+SHF_ALLOC 00? 20 .gosymtab?? go_fmt.out? SHT_PROGBITS??? 00004b2a10? 00000b2a10? 0?? 0?? SHF_ALLOC?? 0?? 01 .noptrbss?? go_fmt.out? SHT_NOBITS? 0000516b20? 0000116b20? 18080?? 0?? SHF_WRITE+SHF_ALLOC 00? 20 .debug_pubnames go_fmt.out? SHT_PROGBITS??? 000053c291? 000011d291? 10068?? 0?? 0x0 0?? 0?? 1

發現go_fmt.out多了好多.debug_*開頭的 section,這是用于 debug 的段信息。再次編譯,去除這些信息,同時也把 C 靜態編譯的二進制也去除符號表和重定位信息。

1 2 3 4 5 6 7 8 9 root@cnxct:/home/cfc4n/go_vs_c# gcc -static -o c_static_gs.out -g -s main.c root@cnxct:/home/cfc4n/go_vs_c# go build -o go_fmt_sw.out -ldflags="-s -w" main_fmt.go root@cnxct:/home/cfc4n/go_vs_c# du -sh * 12K c.out 820K??? c_static_gs.out 888K??? c_static.out 1.5M??? go_fmt.out 1012K?? go_fmt_sw.out

如上結果,go_fmt_sw.out為1012K,c_static_gs.out為820K,還大了近200KB。到底是哪里大的呢?

剛剛的兩個elf 文件的section對比中,還有一個比較特殊的go_fmt.out中 有一個名字叫.gopclntab的段,類型是SHT_PROGBITS程序段,大小為 282414字節,也就是275K,在c_static.out里并沒有這個段的,也沒有.gosymtab這個段。二者不一樣,section段名字有規范標準嗎?
其實,對于linker鏈接器來說,會關心段(section)的名字,但對loader加載器來說,并不關心名字,只關心這個段(segment)的權限,是否可執行,所在的偏移地址,用于函數的執行。

.gopclntab段包含了什么內容呢?我寫了一個程序分析了這個段的內容,程序代碼如下:

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 package main import ( ????"debug/elf" ????"debug/gosym" ????"fmt" ????"os" ) func main() { ????if len(os.Args) != 2 { ????????fmt.Println("參數不對") ????????os.Exit(0) ????} ????strFile1 := os.Args[1] ????f1, err := elf.Open(strFile1) ????if err != nil { ????????panic(err) ????} ????symtab, err := f1.Section(".gosymtab").Data() ????if err != nil { ????????f1.Close() ????????panic(".gosymtab 異常") ????} ????gopclntab, err := f1.Section(".gopclntab").Data() ????if err != nil { ????????f1.Close() ????????panic(".gopclntab 異常") ????} ????pcln := gosym.NewLineTable(gopclntab, f1.Section(".text").Addr) ????var tab *gosym.Table ????tab, err = gosym.NewTable(symtab, pcln) ????if err != nil { ????????f1.Close() ????????panic(err) ????} ????for _, x := range tab.Funcs { ????????fmt.Println(fmt.Sprintf("addr:0x%x\t\tname:%s,\t",x.Entry,x.Name)) ????} }

編譯后執行

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 root@cnxct:/home/cfc4n/go_vs_c# ./expelf go_fmt.out addr:0x401000?????? name:sync/atomic.StoreUint32,?? addr:0x401010?????? name:sync/atomic.StoreUint64,?? addr:0x401020?????? name:sync/atomic.StoreUintptr,? addr:0x401030?????? name:runtime.memhash0,? addr:0x401040?????? name:runtime.memhash8,? ...... addr:0x427040?????? name:runtime.printnl,?? ...... addr:0x44dc80?????? name:runtime.memmove,?? addr:0x44e360?????? name:_rt0_amd64_linux,? addr:0x44e380?????? name:main,? addr:0x44e390?????? name:runtime.exit,? addr:0x44ea70?????? name:runtime.epollwait, addr:0x44ea90?????? name:runtime.(*cpuProfile).(runtime.flushlog)-fm,?? addr:0x44eae0?????? name:type..hash.runtime.uncommontype,?? ...... addr:0x452d60?????? name:math.init.1,?? addr:0x452e00?????? name:math.init, addr:0x452e70?????? name:math.hasSSE4,? addr:0x452e90?????? name:type..hash.[70]float64,??? addr:0x452f10?????? name:type..eq.[70]float64,? addr:0x452f50?????? name:errors.New,??? addr:0x452ff0?????? name:errors.(*errorString).Error,?? ...... addr:0x4534c0?????? name:unicode/utf8.RuneCountInString,??? addr:0x453600?????? name:strconv.(*decimal).String, addr:0x453a00?????? name:strconv.digitZero, addr:0x453a30?????? name:strconv.trim,? addr:0x453aa0?????? name:strconv.(*decimal).Assign, ...... addr:0x4599c0?????? name:strconv.init,? addr:0x459ad0?????? name:type..hash.strconv.decimal,??? addr:0x459ec0?????? name:type..eq.[61]strconv.leftCheat,??? addr:0x459f80?????? name:sync.(*Mutex).Lock,??? ...... addr:0x45c6d0?????? name:syscall.Syscall6,? addr:0x45c740?????? name:type..hash.[133]string,??? addr:0x45c7c0?????? name:type..eq.[133]string,? addr:0x45c880?????? name:time.init, addr:0x45df30?????? name:type..hash.os.PathError,?? addr:0x45dfc0?????? name:type..eq.os.PathError, addr:0x45e0e0?????? name:reflect.makeMethodValue,?? addr:0x45eaf0?????? name:reflect.resolveReflectName,??? addr:0x45eb40?????? name:reflect.(*rtype).nameOff,? ...... addr:0x4710d0?????? name:reflect.(*funcTypeFixed64).Comparable, addr:0x4710f0?????? name:type..hash.reflect.funcTypeFixed128,?? addr:0x471170?????? name:type..eq.reflect.funcTypeFixed128, addr:0x471230?????? name:reflect.(*funcTypeFixed128).uncommon,? ......? addr:0x471c50?????? name:reflect.(*sliceType).Comparable,?? addr:0x471c70?????? name:type..hash.struct { reflect.b bool; reflect.x interface {} },? addr:0x471cf0?????? name:type..eq.struct { reflect.b bool; reflect.x interface {} },??? addr:0x471d70?????? name:type..hash.[27]string, addr:0x471df0?????? name:type..eq.[27]string,?? addr:0x471ea0?????? name:fmt.(*fmt).writePadding,?? addr:0x472020?????? name:fmt.(*fmt).pad,??? ...... addr:0x47b730?????? name:fmt.(*pp).badArgNum,?? addr:0x47b940?????? name:fmt.(*pp).missingArg,? addr:0x47bb50?????? name:fmt.(*pp).doPrintf,??? addr:0x47cf70?????? name:fmt.glob..func1,?? addr:0x47cfd0?????? name:fmt.init,? addr:0x47d170?????? name:type..hash.fmt.fmt,??? addr:0x47d1f0?????? name:type..eq.fmt.fmt,? addr:0x47d2a0?????? name:main.main, addr:0x47d310?????? name:main.init,

如上可以看到,有很多函數是以fmt.(*pp)、strconv.*、sync.*、reflect.*、unicode.*等開頭的,后面對應的函數名,也與 golang 的包里對應的包中函數名一致。。。用 IDA來確認一遍
,果然在?.gopclntab?段里有很多?reflect.*開頭的函數。
這就很奇怪了,golang 編譯時,默認把 runtime 包編譯進來就好了,應該不會把strconv\sync\reflect\unicode等包包含進來啊。程序中,只寫了一句fmt.Println(),莫非是fmt包import了其他幾個包導致的?回去搜了下代碼,果然…

嗯,應該是這里問題,改用 go 的內置函數print試試。

1 2 3 4 5 package main func main() { ???print("hello, world!\n") }

編譯后,對比大小

01 02 03 04 05 06 07 08 09 10 11 12 13 root@cnxct:/home/cfc4n/go_vs_c# go build -o go_print.out main_print.go root@cnxct:/home/cfc4n/go_vs_c# go build -o go_print_sw.out -ldflags="-s -w" main_print.go root@cnxct:/home/cfc4n/go_vs_c# du -sh * 12K c.out 820K??? c_static_gs.out 888K??? c_static.out 1.5M??? go_fmt.out 1012K?? go_fmt_sw.out 940K??? go_print.out 624K??? go_print_sw.out 4.0K??? main.c 4.0K??? main_fmt.go 4.0K??? main_print.go

看如上結果,go_print_sw.out 變成了 624K , c_static_gs.out為820K,不光沒比C的靜態編譯的大,還比它小呢。。。 不過呢,這也不能說明什么問題,只是因為其包含的函數內容不一樣。

好了,至此已經知道為什么 golang 編譯的文件比 C 的大了,因為 go 語言是靜態編譯的,而 C 的編譯(比如 gcc編譯器)都是動態鏈接庫形式編譯的。所以,導致了 go 編譯的文件稍微大的問題。其次,跟其他語言比較字符串輸出的話,用print內置函數就好了,就不要使用fmt包下的函數來比較了,因為 fmt 包引入了好多其他的包。。。這也增加編譯后的二進制文件的體積。

其實呢,golang 的編譯(不涉及 cgo 編譯的前提下)默認使用了靜態編譯,不依賴任何動態鏈接庫,這樣可以任意部署到各種運行環境,不用擔心依賴庫的版本問題。只是體積大一點而已,存儲時占用了一點磁盤,運行時,多占用了一點內存。早期動態鏈接庫的產生,是因為早期的系統的內存資源十分寶貴,由于內存緊張的問題在早期的系統中顯得更加突出,因此人們首先想到的是要解決內存使用效率不高這一問題,于是便提出了動態裝入的思想。也就產生了動態鏈接庫。在現在的計算機里,操作系統的硬盤內存更大了,尤其是服務器,32G、64G 的內存都是最基本的。可以不用為了節省幾百 KB 或者1M,幾 M 的內存而大大費周折了。而 golang 就采用這種做法,可以避免各種 so 動態鏈接庫依賴的問題,這點是非常值得稱贊的。

原文:?http://www.cnxct.com/why-golang-elf-binary-file-is-large-than-c/

轉載于:https://www.cnblogs.com/MaAce/p/8716702.html

總結

以上是生活随笔為你收集整理的golang语言编译的二进制可执行文件为什么比 C 语言大(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久兔费看a级 | 天天操天天色综合 | 国产在线超碰 | 免费看的黄网站软件 | 国产不卡视频在线播放 | 国产综合小视频 | 国产精品原创视频 | 97在线成人 | 麻豆成人在线观看 | 国产精品区免费视频 | 久久久色| 国产精品11 | 日韩国产精品毛片 | 亚洲精品高清视频在线观看 | 蜜桃av久久久亚洲精品 | 丝袜足交在线 | av色影院 | 免费精品人在线二线三线 | 最新色站 | 香蕉视频4aa | 色先锋av资源中文字幕 | 精品国产一区二区三区日日嗨 | 久草电影免费在线观看 | 久草青青在线观看 | 日本最新中文字幕 | 911久久香蕉国产线看观看 | 午夜久久美女 | 国产高清黄| 午夜精品成人一区二区三区 | 日韩久久久久久久久 | 成年人在线免费看视频 | 成年人视频在线观看免费 | 丁香婷婷激情五月 | 日韩aⅴ视频 | 久久激情视频网 | 涩涩网站在线播放 | 久草观看视频 | 久久久综合九色合综国产精品 | 91网免费看 | 久久97久久 | 久久久网 | 国产一区二区三区四区大秀 | 久久国产精品影视 | 久久嗨| 精品一区二区综合 | 久草在线在线 | 久久久黄视频 | 欧美在线日韩在线 | 一级一级一片免费 | 久久久久观看 | 日韩欧美高清一区二区三区 | 国产97av| 国产精品白虎 | 最近中文国产在线视频 | 国产亚洲aⅴaaaaaa毛片 | 欧美一级xxxx | 国产精品手机在线播放 | 中文字幕亚洲在线观看 | 99精品在线 | 日韩精品一区二区三区三炮视频 | 国产成人精品一区二区三区福利 | 99久久影院 | 国产一区视频在线 | 精品视频一区在线 | 超级碰碰视频 | 成人av观看 | 黄色视屏免费在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 久久久久免费网站 | 天天爱天天操天天爽 | 国产在线精品一区二区 | 久久天堂影院 | 国产精品久久久久av福利动漫 | 超碰av在线 | 国产精品久久久久久久久久久久午夜片 | 黄色电影在线免费观看 | 亚洲免费观看视频 | 亚洲影院国产 | 久久久久久久久久久高潮一区二区 | 久久国产露脸精品国产 | 制服丝袜在线91 | 午夜色影院 | 亚洲综合爱 | 在线有码中文 | 91精品久久久久久久91蜜桃 | 久久线视频 | 亚洲国产精彩中文乱码av | 91人人爱 | 99精品99 | 一区二区视频在线免费观看 | 粉嫩av一区二区三区四区 | 亚洲天堂网在线视频 | 香蕉精品视频在线观看 | 色视频网页 | 久久成人一区二区 | 久久精品福利视频 | 97爱爱爱 | 中文字幕在线看视频 | 久久久久久久久久久免费av | av电影在线免费观看 | av片中文| 婷婷六月丁 | 日韩久久精品一区二区三区 | 欧美激情视频一区 | 久久99久久精品 | 国产精品久久一区二区三区不卡 | 人人操日日干 | 在线观看色网站 | 亚洲美女免费视频 | 日日综合网 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 在线免费中文字幕 | 永久av免费在线观看 | 国产原创在线视频 | 999久久久久久久久久久 | 久久99精品一区二区三区三区 | 免费午夜av | 亚洲精品国产综合久久 | 日本动漫做毛片一区二区 | 久久久久综合精品福利啪啪 | 婷婷丁香综合 | 在线观看视频三级 | 91网在线| 久久国产一区二区三区 | av在线日韩 | 国产免费又爽又刺激在线观看 | 久久99亚洲热视 | 天天射射天天 | 奇米影视四色8888 | 狠狠色丁香婷婷综合 | 亚洲一级理论片 | 天天爽夜夜爽精品视频婷婷 | 久久久国产精品麻豆 | 热久久国产| 亚洲精品麻豆视频 | 日韩理论片中文字幕 | 黄色网中文字幕 | 五月天网站在线 | 97超碰总站 | 中文字幕传媒 | 91色在线观看视频 | 在线影院 国内精品 | 视频一区二区精品 | 日韩va欧美va亚洲va久久 | 日韩午夜视频在线观看 | 国产这里只有精品 | 摸bbb搡bbb搡bbbb| 中文字幕麻豆 | 国内精品二区 | 婷婷丁香国产 | 手机在线永久免费观看av片 | 五月天天色 | 久久久久久久网 | 精品国产伦一区二区三区观看方式 | 欧美日韩视频在线一区 | 99久久日韩精品免费热麻豆美女 | 色婷婷骚婷婷 | 成人污视频在线观看 | 亚洲五月婷 | 美女精品在线观看 | 国产精品一级视频 | 天天色官网 | 国产精品成久久久久 | 久久久久亚洲a | 欧美九九九 | 亚洲电影一级黄 | 麻豆 videos| 国产在线精品一区 | 91观看视频 | 中文字幕一区二区三区乱码不卡 | 久久99爱视频 | 人人爽人人爽人人片av免 | 国产精品12 | www免费看片com| 国产精品久久久久久久久久久久午 | 久草在线免费色站 | 国产视频在线免费 | 久久免费久久 | 免费看国产黄色 | 在线观看黄色小视频 | 婷婷深爱网 | 91精品推荐| 国产 色 | 久久久久成人精品 | 91成人精品一区在线播放 | 99九九免费视频 | 久久国产精品久久w女人spa | 亚洲色影爱久久精品 | 欧美性粗大hdvideo | 成年人app网址 | 亚洲精品高清在线 | 草莓视频在线观看免费观看 | 免费观看mv大片高清 | 中文av不卡 | 欧美日韩精品区 | 探花国产在线 | 国产精品videossex国产高清 | 在线国产一区 | www免费看 | 又色又爽又黄高潮的免费视频 | 亚洲九九九在线观看 | 精品99免费视频 | 日本巨乳在线 | 国产黄网站在线观看 | 99久久这里有精品 | 精品国产乱码久久久久久1区2匹 | 久久久久免费 | 91丨九色丨蝌蚪丨老版 | 国产精品99久久免费观看 | 久久,天天综合 | 欧美一二三区在线播放 | 亚洲日韩欧美一区二区在线 | 国产精品久久久久久久av电影 | 久久国产精品二国产精品中国洋人 | 成人午夜影院 | 亚洲黄色av网址 | 国产精品免费久久久久影院仙踪林 | 成人国产精品一区 | 免费看国产黄色 | 成人午夜剧场在线观看 | 午夜少妇 | 91视频免费网站 | 久草在线免费看视频 | 一区二区影视 | av高清影院 | 天天爽天天摸 | 日韩视频1区 | 九九久久久久久久久激情 | 国产免费不卡 | 久久亚洲免费 | 久久久69 | 亚洲专区欧美专区 | 国产区 在线 | 91成人区| 国产 日韩 在线 亚洲 字幕 中文 | 波多野结衣在线观看视频 | 成人久久久久 | 精品久久一区 | 午夜视频免费在线观看 | 一区二区三区影院 | 久久在视频| 久久精品一二三区 | 欧美男同视频网站 | www.天天射 | 欧美久草网| 欧美激情第一页xxx 午夜性福利 | av一二三区 | 91最新视频 | 人人爽人人 | 国产精品国产三级国产aⅴ9色 | 岛国大片免费视频 | 欧美日韩精品电影 | 91精品国产自产老师啪 | 99精品久久只有精品 | 久久久伦理| 久久国产精品一区二区 | 免费合欢视频成人app | 久久久一本精品99久久精品66 | 国产在线观看xxx | 亚洲精品国产麻豆 | 天天曰天天干 | 国产精品成人一区二区三区 | 婷婷av网 | 国产精品麻豆欧美日韩ww | 久久只精品99品免费久23小说 | 久久国产精品一区二区三区四区 | 日韩av在线免费看 | 亚洲日本欧美在线 | 久久乐九色婷婷综合色狠狠182 | 午夜三级在线 | 九九热中文字幕 | 中文字幕观看av | 亚洲国产日韩精品 | 超碰在线9 | 久久久久这里只有精品 | 欧美资源在线观看 | 中文字幕乱码亚洲精品一区 | 青青河边草观看完整版高清 | 99视频偷窥在线精品国自产拍 | 日韩手机视频 | 2022国产精品视频 | 免费观看成人网 | 久久精彩免费视频 | 美女露久久 | 黄色毛片在线 | 国产亚洲精品美女久久 | av久久久 | av在线电影网站 | 91精品亚洲影视在线观看 | 麻豆视频免费入口 | 亚洲精品99久久久久中文字幕 | 欧美日韩免费在线视频 | 久久91久久久久麻豆精品 | 欧美贵妇性狂欢 | 精品国产99国产精品 | 丁香五婷 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久免费高清视频 | 日韩av在线网站 | 国产亚州精品视频 | 国产成人一区二区三区电影 | 99c视频在线 | 久久国产精品精品国产色婷婷 | 国产一区高清在线 | 久久久久久久看片 | 久久综合久久综合久久综合 | 99国产精品久久久久久久久久 | 中文字幕免费不卡视频 | 亚洲天堂自拍视频 | 九九电影在线 | 国产亚洲视频在线 | 久久午夜剧场 | 国产91在线播放 | 91经典在线| 欧美激情精品久久久久久 | 亚洲欧美激情精品一区二区 | 天天操天天操天天操天天操天天操天天操 | 天天操一操| 免费十分钟 | 91高清在线| 2024国产精品视频 | 丁香五月亚洲综合在线 | 五月婷婷.com | 久久久国产一区二区三区四区小说 | 久久97精品 | 久久婷婷国产 | 国产成人黄色片 | 国产精品成人久久久 | 国产美女免费看 | 亚洲视频 中文字幕 | 91网在线观看 | 国产视频精品免费播放 | 亚洲一区二区天堂 | 中文字幕韩在线第一页 | 久久精品久久国产 | 色就是色综合 | 国产手机精品视频 | 成人毛片久久 | 久久久黄色 | 免费高清国产 | 日韩性久久 | 97精产国品一二三产区在线 | av日韩精品 | 国产99久久久国产精品成人免费 | 九九热精品国产 | 国产精品99久久久久 | 久久久久久久久久久久影院 | www.在线看片.com| 天天爽天天碰狠狠添 | 亚洲精品视频网站在线观看 | 国产精品高清免费在线观看 | 成人黄色影片在线 | 国产精品久久久久久久午夜片 | 日韩高清不卡一区二区三区 | 欧美尹人 | 日韩激情视频在线 | 91精品一区二区三区蜜臀 | 日韩av综合网站 | 国产手机视频在线观看 | 亚洲女欲精品久久久久久久18 | 国产一区二区在线播放视频 | 伊人色综合久久天天 | 国产剧情一区 | 精品久久久免费 | 激情欧美一区二区三区免费看 | 久久狠狠亚洲综合 | 99欧美视频| 国产精品一区二区久久精品爱微奶 | 色婷婷亚洲婷婷 | 日韩精品久久久免费观看夜色 | 精品欧美一区二区精品久久 | 欧美日韩国产二区三区 | 国产小视频国产精品 | 日韩另类在线 | 91在线91拍拍在线91 | 日韩国产欧美在线播放 | 国产一区欧美二区 | 欧美性生爱 | 天天在线免费视频 | 一级全黄毛片 | 最近能播放的中文字幕 | 黄网站app在线观看免费视频 | av视屏在线播放 | 麻豆传媒视频在线 | 久久精品国产精品亚洲精品 | 亚洲精品男女 | 91桃色在线免费观看 | 国产日韩欧美在线影视 | 天天爱综合 | 日韩免费观看一区二区三区 | 91色一区二区三区 | 波多野结衣视频一区二区 | 菠萝菠萝蜜在线播放 | a视频免费| 色中文字幕在线观看 | 日韩影片在线观看 | av福利超碰网站 | 91探花系列在线播放 | 91视频高清 | 999久久久国产精品 高清av免费观看 | 国产成人精品av在线观 | 这里只有精彩视频 | 日韩高清国产精品 | 一区二区三区在线免费 | 国产精品免费久久久久影院仙踪林 | 中文字幕av在线不卡 | 国产高清视频在线播放一区 | 99在线精品视频在线观看 | 黄色影院在线免费观看 | 就色干综合 | 激情五月婷婷综合 | 黄色在线看网站 | www.com在线观看 | 亚州国产精品久久久 | 99热在线精品观看 | 波多野结衣久久资源 | 久久激情视频 久久 | 国产精品一区二区av影院萌芽 | av电影一区二区三区 | 国产精品短视频 | 欧美日韩国产在线精品 | 久久激情精品 | 久久午夜国产精品 | 最近中文字幕大全 | 日韩电影中文,亚洲精品乱码 | 97成人精品区在线播放 | 91视频免费看网站 | 九月婷婷色 | 欧美一区二视频在线免费观看 | 国产在线观看91 | 精品国产美女 | av资源在线看 | 日韩精品一二三 | 国产成人黄色网址 | 美女视频黄免费 | 亚洲老妇xxxxxx| 麻花天美星空视频 | 国精产品999国精产品岳 | 日韩资源在线播放 | 日韩久久久 | 91精品国自产在线观看 | 成人黄色小视频 | 色爱区综合激月婷婷 | avsex| 久久久免费电影 | 一区二区免费不卡在线 | 国产精品免费久久久久久 | 国产午夜精品一区二区三区欧美 | 日韩免费网址 | 一区二区中文字幕在线观看 | 久久99国产精品自在自在app | 色99网| 成年人在线免费看 | 日韩黄色在线观看 | 国产精品久久久久久超碰 | 成年人视频在线观看免费 | 亚洲黄色精品 | 精精国产xxxx视频在线播放 | 夜夜夜草 | 国产淫片免费看 | 三上悠亚一区二区在线观看 | 免费成人av | 97综合网| 五月婷婷播播 | 中字幕视频在线永久在线观看免费 | 中文字幕av全部资源www中文字幕在线观看 | adc在线观看 | 久久久精品免费看 | 国产精品久久久一区二区三区网站 | 免费亚洲视频在线观看 | 久久久久久久久久久高潮一区二区 | 久久国色夜色精品国产 | 国产高清久久久 | 亚洲欧美视频 | 91日韩精品视频 | 久久久精品99 | 一区二区三区四区五区在线 | 久久久久精 | 久草视频免费播放 | 激情久久久久久久久久久久久久久久 | www.成人sex| 亚洲 欧美变态 另类 综合 | 久操免费视频 | 福利电影久久 | 国产精品久久久久久久久毛片 | 夜夜爽天天爽 | 久久视了| 狠狠网亚洲精品 | 成人a视频 | 日本xxxxav| 亚洲精品一区二区三区新线路 | 日韩av免费观看网站 | 久久久久国产精品一区 | 91超级碰碰| 国产美女视频一区 | 波多野结衣视频一区二区三区 | 国产成免费视频 | 黄网站色成年免费观看 | 天天操天天射天天舔 | 免费视频一二三 | 久久深夜福利免费观看 | 成人app在线免费观看 | 黄色av电影一级片 | 91禁在线看 | 亚洲精品免费在线 | 国产精品久久久久久久午夜片 | 久艹视频在线观看 | 国产精品久久人 | 免费看国产曰批40分钟 | 欧美激情亚洲综合 | 超碰人人99| 久久69精品久久久久久久电影好 | 久久免费成人网 | 国产精品久久久久久久久久久久午夜片 | 99视频免费观看 | 久久精品视频播放 | 人人澡超碰碰97碰碰碰软件 | 久久精品久久精品久久39 | 日本精品免费看 | 久久国产午夜精品理论片最新版本 | 亚洲精品高清视频在线观看 | 色九色| 国产精品国产三级国产不产一地 | 欧美性护士 | 五月婷婷影视 | 超碰97国产 | 欧美在线视频a | a√天堂资源| 亚洲精选久久 | 国产精品一区二区无线 | 国产色女 | 亚洲精品视频网址 | av在线免费播放网站 | 五月婷婷久 | 国产色久| 亚洲天堂精品视频在线观看 | 欧美999| 日韩高清在线不卡 | 亚洲综合爱 | 五月天久久综合 | 99精品在线直播 | 亚洲精品影视 | 在线午夜 | 国产91精品一区二区麻豆网站 | 免费观看一级特黄欧美大片 | 超碰国产在线播放 | 免费在线观看成人小视频 | 国产在线美女 | 日本特黄一级片 | 国产精品久久久久久久久久妇女 | 色偷偷网站视频 | 激情网婷婷 | 久久只精品99品免费久23小说 | 亚洲精品高清视频 | 久久伦理视频 | 国内精品久久久久久久久 | 黄网av在线 | 国产 日韩 在线 亚洲 字幕 中文 | 国产精品v欧美精品v日韩 | 日韩综合第一页 | 国产精品一区二区三区电影 | 安徽妇搡bbbb搡bbbb | 久草www | 在线三级中文 | 射久久久 | 久草在线这里只有精品 | 久草视频在线资源站 | av 一区二区三区 | 91日韩在线| 成人av久久| 欧美中文字幕久久 | 欧美一级黄色片 | 国产免费观看久久黄 | 国产成在线观看免费视频 | 成人99免费视频 | 国产精品久久久久久久久费观看 | 国产 一区二区三区 在线 | 99精品在线播放 | 国产精品18久久久久久久久久久久 | 天天撸夜夜操 | 在线免费观看黄色 | 久久精品视频观看 | 在线看的av网站 | 丁香资源影视免费观看 | 亚洲免费激情 | 中文字幕观看av | 日韩字幕在线 | www日日 | 4p变态网欧美系列 | 99久久精品免费看国产 | 国产在线第三页 | 免费福利视频网 | 欧美性久久久久久 | 久久免费在线观看 | 亚洲成av | 超碰在线97国产 | 国产精品久久久电影 | 日本久久久亚洲精品 | 天堂激情网 | 毛片永久免费 | 狠狠色丁香婷婷综合久小说久 | 欧美成人性网 | 美女久久久久久久久久 | 深夜免费福利网站 | 国产人成在线视频 | 久久久免费播放 | 亚洲欧洲精品视频 | 国产视频91在线 | 超碰97国产 | 91毛片在线| 五月婷婷深开心 | 97视频在线观看视频免费视频 | 99热在线看 | 在线视频免费观看 | 亚洲成a人片77777kkkk1在线观看 | 亚洲午夜久久久影院 | 成av人电影 | 黄色的片子 | 中文字幕国语官网在线视频 | 天天拍天天操 | 久久理论影院 | 国产亚洲精品久久久久秋 | 91视频免费 | 欧美日韩有码 | 国产91大片 | 中文字幕在线看视频国产 | 高清国产午夜精品久久久久久 | 国内久久视频 | 久久综合中文字幕 | 91经典在线 | 日韩欧美在线观看 | 欧美最猛性xxxxx亚洲精品 | 国产精品久久影院 | 国产精品一区二区白浆 | 男女全黄一级一级高潮免费看 | 精品久久视频 | av在线播放观看 | 久久人人看 | 国产精品久久久久久久毛片 | 久久视频在线视频 | 深爱开心激情 | 日本黄色免费看 | 午夜丰满寂寞少妇精品 | 97超碰中文字幕 | 国产免费激情久久 | 最近久乱中文字幕 | 免费观看特级毛片 | 午夜精品一区二区三区免费 | 69精品视频 | 日韩av中文字幕在线免费观看 | 天天射天天搞 | 91免费的视频在线播放 | 国产天天综合 | 国产在线观| 精品视频亚洲 | 国产精品久久久久久久久久免费 | 国产一区二区高清 | 91成版人在线观看入口 | 96av麻豆蜜桃一区二区 | 一本一道波多野毛片中文在线 | 国产成人精品久 | www.黄色| 香蕉免费| 久久精品成人欧美大片古装 | 欧美日韩国产伦理 | 九九视频在线播放 | 97热久久免费频精品99 | 亚洲国产视频直播 | 色999在线 | 国产精品国产自产拍高清av | 成人午夜精品福利免费 | 国产免费叼嘿网站免费 | 色婷婷视频在线观看 | 国产精品久久久久久久久久久久午 | 亚洲成人av在线播放 | 粉嫩av一区二区三区四区在线观看 | 日韩在线视频播放 | 探花视频在线观看免费版 | 在线 欧美 日韩 | 密桃av在线 | 中文字幕在线日 | 天天综合天天做天天综合 | 成人a视频片观看免费 | 亚洲人成在| 99热精品国产一区二区在线观看 | 中文字幕在线一区观看 | 久久国产精品电影 | 亚洲专区 国产精品 | 久久激情综合 | 日韩精品免费专区 | 久久久久久久久久久久久国产精品 | 亚洲黄色在线观看 | 成人小视频在线观看免费 | 丁香影院在线 | 精品国产伦一区二区三区观看方式 | 国产一级h | 日日夜夜添 | 99国内精品 | 一区二区精品国产 | 国产91成人 | 国产日韩精品一区二区三区 | 福利电影一区二区 | 黄色成年片 | 久久精品国产一区 | 久久精品伊人 | 免费观看国产精品视频 | 国产视频一区二区在线观看 | 国产小视频免费观看 | 国产精品视频线看 | 国产精品国产三级国产不产一地 | 日韩女同一区二区三区在线观看 | 激情综合色综合久久 | 中文字幕在线观看你懂的 | aaa免费毛片 | 免费网站污 | 国产亚洲精品久久19p | 成人宗合网 | 欧美日韩一区二区久久 | 99久久综合狠狠综合久久 | 色视频网页 | 视频成人 | 久久久福利 | 精品婷婷| 在线观看色网 | 日韩三级视频 | 亚州精品天堂中文字幕 | 久久你懂的 | 久久精品视频国产 | 免费视频黄 | 成年人电影毛片 | 98久久 | 日韩一区二区三 | 天天干天天色2020 | 九色精品免费永久在线 | 婷婷亚洲激情 | 97在线观看免费观看高清 | 999久久国产精品免费观看网站 | 婷婷丁香狠狠爱 | 久草免费色站 | 欧美日韩中文另类 | 久久精品视频在线观看免费 | 国产一级片免费视频 | 亚洲高清视频在线播放 | 国产成人一区二区三区在线观看 | 国产精品一区免费在线观看 | 在线视频精品播放 | 2019精品手机国产品在线 | av中文字幕在线电影 | 国产精品久久久久久久久久久久久 | 成片免费观看视频大全 | 国产中文字幕一区 | 久久精品a| 91av片| 五月天网站在线 | 国产精品18久久久久久久久 | 国产精品丝袜在线 | 亚洲欧洲美洲av | 免费日韩一区二区三区 | av久久久久久 | 五月婷婷综合激情 | 日日夜夜精品网站 | 精品久久一 | 国产精品久久嫩一区二区免费 | 国产69精品久久99的直播节目 | 免费中文字幕视频 | 成人国产网站 | 欧美成人在线网站 | 精品在线观看视频 | 婷婷丁香激情五月 | 丁香视频全集免费观看 | 国产成人一二三 | 狠狠色丁香婷婷综合 | 岛国av在线不卡 | 国产精品9区 | 麻花传媒mv免费观看 | 日韩精品一区电影 | 久久免费视频网站 | 黄色亚洲精品 | 丁香综合激情 | a视频在线 | 精品九九久久 | 91精品免费 | 久久精品看片 | 国产aa免费视频 | 中文区中文字幕免费看 | 久草.com| 国产成人精品福利 | 国产黄色美女 | 成人av观看| 国产特黄色片 | 久久激情片 | 久草剧场| 日日爱网址 | 国产视频一区二区在线观看 | 涩涩色亚洲一区 | 四虎成人精品在永久免费 | 久久久久久久久久亚洲精品 | 园产精品久久久久久久7电影 | 亚洲精品午夜国产va久久成人 | 天天干天天插伊人网 | 人人射av| 天天干天天操天天操 | 国内三级在线观看 | 中文字幕在线观看免费高清电影 | 国产大陆亚洲精品国产 | 精品亚洲视频在线观看 | 久久开心激情 | 久久免费试看 | 成年人黄色免费视频 | 色综合久久久久综合体桃花网 | 中文字幕日韩国产 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 操操碰| 91黄在线看 | 久久五月婷婷综合 | 国产黄免费 | 国产视频中文字幕 | 国产免费观看久久 | 在线播放 日韩专区 | 日本福利视频在线 | 91九色蝌蚪视频网站 | 国产精品免费观看视频 | 99久久久国产精品免费99 | av免费线看| 视色网站 | 亚洲午夜激情网 | 日韩精品在线观看av | 福利区在线观看 | 一区av在线播放 | 欧美人人爱 | 五月天视频网站 | 黄色影院在线免费观看 | 久草在线观看视频免费 | 黄色视屏av | 韩国三级在线一区 | 色偷偷88欧美精品久久久 | 国产精品久久久久婷婷二区次 | 天天干天天射天天插 | 免费在线国产黄色 | 国产高清福利在线 | www.亚洲| 国产精品久久久久三级 | 久草在| 欧美精品中文字幕亚洲专区 | www.色五月 | 国产精品人成电影在线观看 | 久久久久激情视频 | 亚洲欧洲精品一区二区 | 丁香视频五月 | 在线天堂中文在线资源网 | 午夜精品久久久久久久99婷婷 | 国产一级高清视频 | 欧美激情精品一区 | 国产亚洲情侣一区二区无 | 免费看av片网站 | 五月婷婷综合色拍 | 日韩在线观看视频网站 | 人人人爽| 高清av在线免费观看 | 91爱在线| 五月婷婷导航 | 中文字幕国产精品 | 亚洲做受高潮欧美裸体 | 麻豆久久精品 | 国产高清一区二区 | 欧美日韩调教 | 91免费观看网站 | 国产一级h| 久久国产电影院 | 国产日韩中文在线 | 国产精成人品免费观看 | 日韩激情精品 | 欧美国产日韩在线观看 | 一级淫片在线观看 | 国产色视频网站 | 伊人婷婷色 | 久久免费精彩视频 | 成人av播放 | 成人网444ppp| 菠萝菠萝在线精品视频 | 麻豆成人在线观看 | 国产精品一区免费在线观看 | 久久综合久久88 | 国产超碰在线观看 | 久久久久国产精品www | 久久爱影视i | 成人免费视频网址 | 国产美女在线观看 | 欧美 亚洲 另类 激情 另类 | 不卡的av电影| 亚洲综合色视频 | 久久国产精品免费一区 | 日韩视频一区二区三区 | 亚洲伊人av| 91精品视频在线看 | 欧美美女一级片 | 国产亚洲精品中文字幕 | 在线免费观看羞羞视频 | 97精品国产97久久久久久久久久久久 | 欧美日韩在线观看一区二区三区 | 99免费视频 | 国产精品一区二区在线 | 亚洲色图色 | 丁香六月网| 国产传媒一区在线 | 伊人色综合久久天天网 | 特级a毛片| 天天艹 | 久草在线观看视频免费 | 久久久色| 一区电影| 久久久久北条麻妃免费看 | 久久精品免费 | 国产成人久久精品一区二区三区 | 久久深夜 | 2023av| 成年人在线 | 免费黄色特级片 | 五月天激情综合网 | av一区二区三区在线观看 | 久久久久久久久久久网站 | 美女网站视频免费黄 | 国产婷婷精品 | 毛片黄色一级 | 国产小视频在线免费观看视频 | 麻花豆传媒mv在线观看 | 西西4444www大胆无视频 | 久保带人| 色噜噜在线观看 | 99热只有精品在线观看 | 日本性生活免费看 | 美女久久久 | 欧美大片aaa | 91精品蜜桃 | ,午夜性刺激免费看视频 | 国产午夜亚洲精品 | 亚洲一区美女视频在线观看免费 | 中文在线a∨在线 | 欧美久久久久久久久 | 超碰人人99 | 91视频下载 | 欧美男男tv网站 | 成人av资源站 | 日韩免费播放 | 国产专区第一页 | 国产专区精品视频 | www天天操 | 成人黄色片免费看 | 天天干视频在线 | 91成人看片 | 超碰在线观看av | 四虎在线视频免费观看 | 色香网 | 成人蜜桃网 | zzijzzij亚洲日本少妇熟睡 | 9幺看片| 婷婷天天色 | 91在线中字 | 天天夜夜亚洲 | 天天干天天射天天爽 | 综合激情网... | 亚洲高清视频一区二区三区 | 精品一区二区在线免费观看 | 麻豆久久一区二区 | 亚洲精选视频免费看 | 热久精品| 又爽又黄在线观看 | 色综合咪咪久久网 | 午夜国产在线观看 | 九色最新网址 | 在线国产视频一区 | 888av| 日韩精品三区四区 | 国产偷国产偷亚洲清高 | 婷婷开心久久网 | 中文字幕高清有码 | 国产精品毛片久久久久久久久久99999999 | 成人av资源站 | 九色视频网址 | 狠狠色噜噜狠狠 | 欧美网址在线观看 | 成年人网站免费在线观看 | 高清国产午夜精品久久久久久 | 91在线观看高清 | 中文字幕在线观看2018 | 久久国产亚洲视频 | 91精品一区二区在线观看 | 亚洲va韩国va欧美va精四季 | 国产在线视频导航 | 顶级欧美色妇4khd | 欧美视频在线二区 | 亚洲一一在线 | 国产成人777777 | 色吊丝在线永久观看最新版本 | 中文不卡视频 | 亚洲成人麻豆 | 精品久久久久一区二区国产 | 日韩网页 |