【问题标题】:In what cases are go binaries dynamically linked?在什么情况下 go 二进制文件是动态链接的?
【发布时间】:2017-06-19 19:52:37
【问题描述】:

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

【问题讨论】:

  • 动态可执行文件是什么意思?尽管生成的二进制文件是静态链接的,但它可能仍依赖于 核心系统库,例如libc POSIX 系统,kernel32.dll Windows 等
  • 我的意思是动态链接的可执行文件。我应该清楚地提到它。
  • 另外,在大多数 golang 构建的二进制文件上运行 ldd 会给出“不是动态可执行文件”的输出,所以我认为甚至不依赖于 libc。但有些项目有动态链接的二进制文件。
  • 这取决于可执行文件正在使用的包。例如,当使用net/httpGet example 一样时,生成的二进制文件依赖于pthreadlibc 等...

标签: go linker static-linking dynamic-linking


【解决方案1】:

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

【讨论】:

  • 我一开始也是这么想的。但是,我在其中一个项目(gocode)中搜索了“导入“C”语句,但找不到任何。但是 gocde 二进制文件是动态链接的。
  • @enitihas,仅仅因为一个包不使用 cgo,并不意味着它的依赖项不使用。甚至 std 库也可能使用 cgo,例如在 net 包、os/usercrypto/tls 中。
  • @JimB 即使使用标准库中的此类包,是否也可以使用 go 创建静态链接的二进制文件?
  • @enitihas,是的,有时,在某些操作系统上。在某些情况下,您也可以使用 cgo 进行静态链接。你必须准确地展示你要做什么。
  • 在 Windows 上交叉编译 Linux 二进制文件提供静态二进制文件,使用 CGO_ENABLED=0 构建也是如此。
【解决方案2】:

Go 1.8 引入了一个叫做 Go Plugin 的东西,它似乎在使用动态链接。

https://golang.org/pkg/plugin/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2015-02-27
    • 1970-01-01
    • 2016-04-22
    • 2012-03-18
    • 2011-01-27
    • 2012-12-08
    • 2013-05-24
    相关资源
    最近更新 更多