2013-12-04 5 views
1

В чем разница между -static и -static-libgo для gccgo? Документация не кажется, действительно пролить свет на то, что происходит:gccgo -static vs -static-libgo

  • Используйте опцию -static-libgo связать статически с скомпилированных пакетов.
  • Используйте опцию -static, чтобы сделать полностью статическую ссылку (по умолчанию для компилятора gc).

-static-libgo только статическая связь libgo.a только? Пока -static - полная библиотека glibc?

+0

Я думаю -static будет пытаться статически все, а -static-libgo либо только делает это с пакетами Go или только ссылки libgo.a статически. – fuz

ответ

9

Проверить динамическое связывание в сгенерированных Эльфы:

дс строит статически:

$ go build hello.go 
$ readelf -d hello 
There is no dynamic section in this file. 

gccgo ссылки динамически против libgo, Libc и т.д. по умолчанию:

$ go build -compiler gccgo hello.go 
$ readelf -d hello 
Dynamic section at offset 0x36e0 contains 29 entries: 
    Tag  Type       Name/Value 
0x0000000000000001 (NEEDED)    Shared library: [libgo.so.5] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libgcc_s.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [ld-linux-x86-64.so.2] 
0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 

Выпекать libgo внутри исполняемый файл, но по-прежнему динамически связывается с libc и друзьями:

$ go build -compiler gccgo -gccgoflags '-static-libgo' hello.go 
$ readelf -d hello 
Dynamic section at offset 0x128068 contains 28 entries: 
    Tag  Type       Name/Value 
0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libgcc_s.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [ld-linux-x86-64.so.2] 

Link все статично:

$ go build -compiler gccgo -gccgoflags '-static' hello.go 
$ readelf -d hello 
There is no dynamic section in this file.