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

这是一个世界你好:


package main                                                                                                                                               


import (                                                                      

  "fmt"                                                                    

  )                                                                         


func main() {                                                                 

        fmt.Println("Go is great!")                                           

}

放入hello.go并使用以下命令进行编译:

  • go build -o hello_go_build hello.go

  • go build -o hello_go_build_gccgo --compiler gccgo hello.go

  • gccgo -o hello_gccgo_shared hello.go

  • gccgo -static -o hello_gccgo_static hello.go

首先,我注意到hello_go_build_gccgohello_gccgo_shared没有相同的大小。我在互联网上寻找信息没有成功。谁知道那是为什么?甚至更好的是,有人可以告诉我如何解决这个问题吗?我试图用该-work标志保留临时文件,但找不到相关信息。

然后,您可能会注意到,两个静态链接的二进制文件也不具有相同的大小。实际上,使用go buildhello_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 编译器可以选择进行函数级链接(而不是静态链接整个包,只链接所需的函数及其依赖项)?


Helenr
浏览 174回答 1
1回答

慕丝7291255

首先,我注意到hello_go_build_gccgo和hello_gccgo_shared的大小不同。我在互联网上寻找信息没有成功。谁知道那是为什么?我会觉得很奇怪,如果他们是相同的大小。一个是静态链接,另一个使用共享库,那么为什么应该期望它们具有相同的大小?然后,您可能会注意到,两个静态链接的二进制文件也不具有相同的大小。我会觉得很奇怪,如果他们是相同的大小。一个由编译gc,另一个由gccgo-两种完全不同的编译器编译。为什么应该期望它们产生相同大小的二进制文件?最后,即使现在,大小不再重要,我很好奇:是否有任何 go 编译器可以选择进行函数级链接(而不是静态链接整个包,只链接所需的函数及其依赖项)?没有与“将整个包静态链接”的事情gc。未使用的功能(也许不仅是功能)不存在于二进制文件中。而且,IIRC从第一天起就是这种情况(从公开发布日算起)。不知道前面的内容是否也适用gccgo,但是我希望它在此方面也能起到同样的作用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go