Go二进制文件在哪些情况下是动态链接的?

5

Go语言的一个重要特性是它能够生成静态链接二进制文件。然而,当我在$GOPATH/bin中运行ldd *时,我发现了一些动态可执行文件。是否有明确的规则来理解在什么情况下go编译器会生成动态链接的二进制文件?


你所说的“动态可执行文件”是什么意思?尽管生成的二进制文件是静态链接的,但它仍可能依赖于核心系统库,例如在POSIX系统中的libc,在Windows中的kernel32.dll等。 - putu
我的意思是动态链接的可执行文件。我应该清楚地提到它。 - enitihas
此外,大多数使用golang编译的二进制文件运行ldd命令将输出“不是动态可执行文件”,因此我认为它甚至不依赖于libc。但一些项目具有动态链接的二进制文件。 - enitihas
这取决于可执行文件所使用的软件包。例如,当使用net/http(如Get example)时,生成的二进制文件依赖于pthreadlibc等... - putu
2个回答

4
使用cgo时,Go链接到C程序,当然可以使用动态链接库。

我最初也是这么想的。然而,我在一个项目(gocode)中搜索了“import”C“语句,但没有找到任何内容。但是gocde二进制文件是动态链接的。 - enitihas
3
@enitihas,仅因一个包不使用cgo,并不意味着它的依赖项也不使用cgo。甚至标准库也可能会使用cgo,例如在netos/usercrypto/tls包中。 - JimB
@JimB 是否可以在使用stdlib中的包时,使用go创建静态链接二进制文件? - enitihas
1
@enitihas,是的,有时在某些操作系统上会出现这种情况。在某些情况下,您也可以使用cgo进行静态链接。您必须准确地展示您要做什么。 - JimB
在Windows上进行交叉编译Linux二进制文件可以生成静态二进制文件,使用CGO_ENABLED=0构建也是如此。 - Adrian
@Adrian,尽管需要额外的设置,但你可以使用cgo进行交叉编译。 - JimB

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接