1

使用 gccgo 构建静态程序版本时遇到问题

1> 使用 go build go build -compiler gccgo -gccgoflags '-static -L/lib64' test.go 结果:

/usr/bin/ld: cannot find -lgo
/usr/bin/ld: cannot find -lpthread
/usr/bin/ld: cannot find -lm
/usr/bin/ld: cannot find -lc

2>使用 gccgo build gccgo -o test_gccgo_yes -static -L/lib64 test.go 结果:

/usr/bin/ld: cannot find -lgo
/usr/bin/ld: cannot find -lpthread
/usr/bin/ld: cannot find -lm
/usr/bin/ld: cannot find -lc

3> 如果我不使用静态编译它 gccgo -o test_gccgo_yes -g test.go 结果:ldd test_gccgo_yes show test_gccgo_yes 是动态文件

如何使用 gccgo 构建静态程序?

4

1 回答 1

2

如果您正在使用staticgccgo,则需要每个库的静态版本,libc.a而不是动态库libc.so

安装发行版的静态包。在 CentOS 7 上,它们被命名为glibc-staticlibgo-static. 然后你应该能够构建(你也不需要-L标志)

但是,之后您可能仍会收到一些警告和可能的错误。例如,在构建一个这样的静态应用程序时,我遇到了以下错误:

/usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgo.a(net.o): In function `net.lookupPort':
(.text+0x48e2): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie

所以可能需要做更多的工作来获得一个工作的静态二进制文件。见https://www.akkadia.org/drepper/no_static_linking.html

于 2016-06-20T08:58:21.000 回答