这是
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编译器的任何人进行功能级链接(而不是静态链接一个包作为一个整体,只链接所需的功能和他们的依赖)?
答案 0 :(得分:2)
首先,我注意到hello_go_build_gccgo和hello_gccgo_shared的大小不同。我在互联网上查找信息但没有成功。有谁知道为什么会这样?
如果 大小相同,我会觉得很奇怪。一个是静态链接,另一个使用共享库,那么为什么它们应该是相同的大小呢?
然后,您可能会注意到,两个静态链接的二进制文件也没有相同的大小。
如果 大小相同,我会觉得很奇怪。一个由gc
编译,另一个由gccgo
编译 - 两个完全不同的编译器。为什么要期望他们生成相同大小的二进制文件?
最后,即使现在,大小也不重要了,我很好奇:是否有任何选项可以与go编译器的任何人进行功能级链接(而不是静态链接一个包作为一个整体,只链接所需的功能和他们的依赖)?
没有“将整个软件包作为一个整体”静态链接到gc
。二进制文件中不存在未使用的函数(可能不仅仅是函数)。而且,IIRC,从第1天起就是这种情况(从公开发布开始计算)。不确定前面是否也适用于gccgo
,但我希望它能在这方面做得很好。