这是一个世界你好: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
,但是我希望它在此方面也能起到同样的作用。
- 1 回答
- 0 关注
- 173 浏览
添加回答
举报
0/150
提交
取消