欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

減少 golang 二進(jìn)制文件大小操作

 更新時間:2020年12月17日 10:31:00   作者:瘋瘋癲癲  
這篇文章主要介紹了減少 golang 二進(jìn)制文件大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

環(huán)境:

$ go version
go version go1.11.2 linux/amd64

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609

一. Go VS C 二進(jìn)制

hello.go

package main
import "fmt"
func main() {
 fmt.Println("hello world")
}

hello.c

#include <stdio.h>
int main() {
 printf("hello world\n");
 return 0;
}
$ go build -o hello hello.go
$ go build -ldflags "-s -w" -o hello2 hello.go
$ gcc hello.c
$ ls -l
-rwxrwxr-x 1 zengxl zengxl 1902849 11月 27 15:40 hello
-rwxrwxr-x 1 zengxl zengxl 1353824 11月 27 15:43 hello2
-rwxrwxr-x 1 zengxl zengxl 8600 11月 27 15:44 a.out

golang 連接的參數(shù):

$ go tool link -h

usage: link [options] main.o
-s disable symbol table  # 去掉符號表
-w disable DWARF generation # 去掉調(diào)試信息

ELF

先來看下 C 的:

$ readelf -h a.out 
ELF 頭:
 Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
 類別:        ELF64
 數(shù)據(jù):        2 補(bǔ)碼,小端序 (little endian)
 版本:        1 (current)
 OS/ABI:       UNIX - System V
 ABI 版本:       0
 類型:        EXEC (可執(zhí)行文件)
 系統(tǒng)架構(gòu):       Advanced Micro Devices X86-64
 版本:        0x1
 入口點(diǎn)地址:    0x400430
 程序頭起點(diǎn):   64 (bytes into file)
 Start of section headers:   6616 (bytes into file)
 標(biāo)志:    0x0
 本頭的大?。? 64 (字節(jié))
 程序頭大小:  56 (字節(jié))
 Number of program headers:   9
 節(jié)頭大?。?  64 (字節(jié))
 節(jié)頭數(shù)量:   31
 字符串表索引節(jié)頭: 28
$ readelf -d a.out 

Dynamic section at offset 0xe28 contains 24 entries:
 標(biāo)記  類型       名稱/值
 0x0000000000000001 (NEEDED)    共享庫:[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

再來看下 go 的:

$ readelf -h hello
ELF 頭:
 Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
 類別:        ELF64
 數(shù)據(jù):        2 補(bǔ)碼,小端序 (little endian)
 版本:        1 (current)
 OS/ABI:       UNIX - System V
 ABI 版本:       0
 類型:        EXEC (可執(zhí)行文件)
 系統(tǒng)架構(gòu):       Advanced Micro Devices X86-64
 版本:        0x1
 入口點(diǎn)地址:    0x451fa0
 程序頭起點(diǎn):   64 (bytes into file)
 Start of section headers:   456 (bytes into file)
 標(biāo)志:    0x0
 本頭的大?。? 64 (字節(jié))
 程序頭大小:  56 (字節(jié))
 Number of program headers:   7
 節(jié)頭大?。?  64 (字節(jié))
 節(jié)頭數(shù)量:   13
 字符串表索引節(jié)頭: 3

$ readelf -d hello

There is no dynamic section in this file.

The linker in the gc toolchain creates statically-linked binaries by default. All Go binaries therefore include the Go runtime, 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 weighs a couple of megabytes, but that includes more powerful run-time support and type and debugging information.

所以,為什么 go 二進(jìn)制比 C 大很多就比較明顯了。

golang 靜態(tài)編譯,不依賴動態(tài)庫。

二. 如何減小 go 二進(jìn)制文件大小

2.1. -ldflags

上面已經(jīng)提到了過了。

$ go build -ldflags "-s -w" xxx.go

2.2. UPX

https://github.com/upx/upx

Commands:
 -1  compress faster     -9 compress better
 -d  decompress      -l list compressed file
 -t  test compressed file    -V display version number
 -h  give more help     -L display software license
Options:
 -q  be quiet       -v be verbose
 -oFILE write output to 'FILE'
 -f  force compression of suspicious files
 -k  keep backup files
file.. executables to (de)compress

Compression tuning options:
 --brute    try all available compression methods & filters [slow]
 --ultra-brute  try even more compression variants [very slow]

$ upx --brute binaryfile

IDA 逆向分析簡單看下:

https://www.hex-rays.com/products/ida/support/download.shtml

下面是支持 Go 的 IDA helper

https://github.com/sibears/IDAGolangHelper

原始的 go 二進(jìn)制文件:

可以看到 go 的一些函數(shù)名。

去掉符號表和調(diào)試信息的 go 二進(jìn)制文件:

已經(jīng)看不到函數(shù)名信息,只有類似 sub_47BF70 這樣。

經(jīng)過 upx 壓縮的 go 二進(jìn)制文件:

信息已經(jīng)比較少了,入口點(diǎn)也發(fā)生了變化。

2.3. 壓縮結(jié)果對比

$ go build -o hello hello.go
$ go build -ldflags "-s -w" -o hello-strip hello.go
$ upx --brute hello
$ ll -h
-rwxr-xr-x 1 aland aland 1.9M Dec 6 13:06 hello
-rwxr-xr-x 1 aland aland 809K Dec 6 13:07 hello-upx
-rwxr-xr-x 1 aland aland 1.3M Dec 6 13:06 hello-strip

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 深入探究Golang中l(wèi)og標(biāo)準(zhǔn)庫的使用

    深入探究Golang中l(wèi)og標(biāo)準(zhǔn)庫的使用

    Go?語言標(biāo)準(zhǔn)庫中的?log?包設(shè)計(jì)簡潔明了,易于上手,可以輕松記錄程序運(yùn)行時的信息、調(diào)試錯誤以及跟蹤代碼執(zhí)行過程中的問題等。本文主要來深入探究?log?包的使用和原理,幫助讀者更好地了解和掌握它
    2023-05-05
  • 基于golang的簡單分布式延時隊(duì)列服務(wù)的實(shí)現(xiàn)

    基于golang的簡單分布式延時隊(duì)列服務(wù)的實(shí)現(xiàn)

    這篇文章主要介紹了基于golang的簡單分布式延時隊(duì)列服務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Go語言實(shí)現(xiàn)操作MySQL的基礎(chǔ)知識總結(jié)

    Go語言實(shí)現(xiàn)操作MySQL的基礎(chǔ)知識總結(jié)

    這篇文章主要總結(jié)一下怎么使用Go語言操作MySql數(shù)據(jù)庫,文中的示例代碼講解詳細(xì),需要的朋友可以參考以下內(nèi)容,希望對大家有所幫助
    2022-09-09
  • 使用Go語言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例

    使用Go語言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例

    這篇文章主要介紹了使用Go語言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Go語言獲取數(shù)組長度的方法

    Go語言獲取數(shù)組長度的方法

    這篇文章主要介紹了Go語言獲取數(shù)組長度的方法,實(shí)例分析了len函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 深入了解Golang的指針用法

    深入了解Golang的指針用法

    與C語言一樣,Go語言中同樣有指針,通過指針,我們可以只傳遞變量的內(nèi)存地址,而不是傳遞整個變量,這在一定程度上可以節(jié)省內(nèi)存的占用。本文將通過示例詳細(xì)講講Golang的指針用法,需要的可以參考一下
    2022-07-07
  • Go語言實(shí)現(xiàn)讀取文件的方式總結(jié)

    Go語言實(shí)現(xiàn)讀取文件的方式總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)讀取文件的幾個方式,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,感興趣的小伙伴可以收藏一下
    2023-04-04
  • golang?日志庫ZAP[uber-go?zap]示例詳解

    golang?日志庫ZAP[uber-go?zap]示例詳解

    ZAP是由Uber開源的高性能Go語言日志庫,支持多種日志級別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結(jié)合lumberjack進(jìn)行日志切割,實(shí)現(xiàn)日志按文件大小、時間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器
    2024-10-10
  • 深入理解Go語言中接口的使用

    深入理解Go語言中接口的使用

    在現(xiàn)代編程語言中,接口是不可或缺的一個重要特性,這篇文章將為大家詳細(xì)介紹Go語言中的接口,從而能夠更好得使用Go語言,需要的可以參考一下
    2023-06-06
  • Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解

    Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解,需要的朋友可以參考下
    2022-04-04

最新評論