如何使用1.5+创建静态链接的golang可执行文件

Ric*_*ard 7 go rkt

golang version <1.5 - 有很多静态链接示例,帖子和食谱.> = 1.5怎么样?(谷歌搜索没有返回我的搜索条件的有用结果.)任何人有任何关于如何生成可以在基本rkt(来自CoreOS)容器内执行的静态链接二进制文件的建议?

我走了:

$go version
go version go1.5 linux/amd64
Run Code Online (Sandbox Code Playgroud)

当我尝试运行我的容器时:

sudo rkt --insecure-skip-verify run /tmp/FastBonusReport.aci
Run Code Online (Sandbox Code Playgroud)

我明白了:

[38049.477658] FastBonusReport[4]: Error: Unable to open "/lib64/ld-linux-x86-64.so.2": No such file or directory
Run Code Online (Sandbox Code Playgroud)

建议容器中的可执行文件依赖于此lib,因此不是静态的.

我的清单看起来像:

cat <<EOF > /tmp/${myapp}/manifest
{
    "acKind": "ImageManifest",
    "acVersion": "0.9.0",
    "name": "${lowermyapp}",
    "labels": [
        {"name": "os", "value": "linux"},
        {"name": "arch", "value": "amd64"}
    ],
    "app": {
        "exec": [
            "/bin/${myapp}"
        ],
        "user": "0",
        "group": "0"
    }
}
EOF
Run Code Online (Sandbox Code Playgroud)

我的命令行来构建二进制文件看起来像:

go build ${myapp}.go
Run Code Online (Sandbox Code Playgroud)

文章有几个例子golang <1.5.然后在CoreOS网站上有这篇入门文章.

Ric*_*ard 11

我讨厌回答我自己的问题.评论是正确的CGO_ENABLED=0 go build ./...似乎已经完成了伎俩.

虽然它不是原始问题的一部分,但一旦程序开始在rkt容器中执行,它就无法执行正确的DNS请求.所以一定有其他事情发生.


Bry*_*yan 5

静态链接:

去1.5:

go build -ldflags "-extldflags -static" ...
Run Code Online (Sandbox Code Playgroud)

使用Go 1.6我不得不使用:

go build -ldflags "-linkmode external -extldflags -static" ...
Run Code Online (Sandbox Code Playgroud)