-static
和 和-static-libgo
有什么不一样gccgo
?该文档似乎并没有真正阐明正在发生的事情:
- 使用该
-static-libgo
选项静态链接已编译的包。 - 使用该
-static
选项进行完全静态链接(gc 编译器的默认设置)。
-static-libgo
只有静态链接吗libgo.a
?虽然-static
是完整的 glibc 库?
-static
和 和-static-libgo
有什么不一样gccgo
?该文档似乎并没有真正阐明正在发生的事情:
-static-libgo
选项静态链接已编译的包。-static
选项进行完全静态链接(gc 编译器的默认设置)。-static-libgo
只有静态链接吗libgo.a
?虽然-static
是完整的 glibc 库?
检查生成的 ELF 中的动态链接:
gc 静态构建:
$ 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]
静态链接所有内容:
$ go build -compiler gccgo -gccgoflags '-static' hello.go
$ readelf -d hello
There is no dynamic section in this file.