为了账号安全,请及时绑定邮箱和手机立即绑定

使用 gc 和 gccgo 编译的静态链接二进制文件的奇怪行为

使用 gc 和 gccgo 编译的静态链接二进制文件的奇怪行为

Go
Helenr 2021-05-26 06:14:10
这是一个世界你好:package main                                                                                                                                               import (                                                                        "fmt"                                                                      )                                                                         func main() {                                                                         fmt.Println("Go is great!")                                           }放入hello.go并使用以下命令进行编译:go build -o hello_go_build hello.gogo build -o hello_go_build_gccgo --compiler gccgo hello.gogccgo -o hello_gccgo_shared hello.gogccgo -static -o hello_gccgo_static hello.go首先,我注意到hello_go_build_gccgo并hello_gccgo_shared没有相同的大小。我在互联网上寻找信息没有成功。谁知道那是为什么?甚至更好的是,有人可以告诉我如何解决这个问题吗?我试图用该-work标志保留临时文件,但找不到相关信息。然后,您可能会注意到,两个静态链接的二进制文件也不具有相同的大小。实际上,使用go build(hello_go_build)命令编译的代码不仅可以在我的系统上运行,而且还可以在具有其他Linux发行版的其他系统上运行,而hello_go_build_gccgo在我的系统以及出现以下错误的其他系统上则失败:panic: runtime error: invalid memory address or nil pointer dereference这是一个要解决的错误:https : //groups.google.com/forum/?fromgroups=#!topic/golang- nuts/ y2RIy0XLJ24最后,即使现在,大小不再重要,我很好奇:是否有任何 go 编译器可以选择进行函数级链接(而不是静态链接整个包,只链接所需的函数及其依赖项)?
查看完整描述

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

首先,我注意到hello_go_build_gccgo和hello_gccgo_shared的大小不同。我在互联网上寻找信息没有成功。谁知道那是为什么?

我会觉得很奇怪,如果他们相同的大小。一个是静态链接,另一个使用共享库,那么为什么应该期望它们具有相同的大小?

然后,您可能会注意到,两个静态链接的二进制文件也不具有相同的大小。

我会觉得很奇怪,如果他们相同的大小。一个由编译gc,另一个由gccgo-两种完全不同的编译器编译。为什么应该期望它们产生相同大小的二进制文件?

最后,即使现在,大小不再重要,我很好奇:是否有任何 go 编译器可以选择进行函数级链接(而不是静态链接整个包,只链接所需的函数及其依赖项)?

没有与“将整个包静态链接”的事情gc。未使用的功能(也许不仅是功能)不存在于二进制文件中。而且,IIRC从第一天起就是这种情况(从公开发布日算起)。不知道前面的内容是否也适用gccgo,但是我希望它在此方面也能起到同样的作用。


查看完整回答
反对 回复 2021-05-31
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信