0

这是 Go 中的Hello 世界

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_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 编译器可以选择进行函数级链接(而不是静态链接一个包作为一个整体,只链接所需的函数及其依赖项)?

4

1 回答 1

2

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

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

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

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

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

没有“将包作为一个整体静态链接”之类的东西gc。二进制文件中不存在未使用的函数(也许不仅仅是函数)。而且,IIRC,从第一天开始就是这种情况(从公开发布开始计算)。不确定前面是否也适用gccgo,但我希望它在这方面做得同样好。

于 2013-02-04T11:08:28.143 回答