go build静态链接打包

内容目录

直接go build 打包运行报错

k logs openapi-65cf7665d-2s48b  -n kumo                                                                                                                      ✔  base   production-legolas-v130 ⎈  22:33:39
Defaulted container "openapi" out of: openapi, init-coredump (init)
exec /kumo-openapi/openapi: exec format error

最后对比以前能运行的包

root@ubuntuserver1:/www/wwwroot# file bakopenapi 
bakopenapi: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=8l4M8kC1ugodeoIz6HG3/dcFVMwRcvzqAUom2fg3y/wzuM093mz6vsiTcJmTfp/1ORr-FZ1E05DV3E3C84D, with debug_info, not stripped
root@ubuntuserver1:/www/wwwroot# file openapi.old 
openapi.old: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=uEQMuV_Jz3nIBQy2wNZQ/O_1xQiCyG0qa1dDqbxLW/nu1k99q6utHIEQe8H31s/AOoz3vqHH1UDAGvh9dsP, with debug_info, not stripped

两个文件 bakopenapi 和 openapi.old 都是 64 位的 ELF 可执行文件,并且它们都是针对 x86-64 架构构建的,但有一个关键的不同点:
bakopenapi:是动态链接的(dynamically linked),依赖于系统上的动态库(如 /lib64/ld-linux-x86-64.so.2)。
openapi.old:是静态链接的(statically linked),它不依赖外部动态库,所有依赖的库都已经打包进了可执行文件。

静态链接打包

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o openapi .

在 Go 中,静态链接可以确保所有依赖库都打包进可执行文件,不依赖系统的动态库。要静态链接打包 Go 应用程序,你可以通过设置 CGO_ENABLED=0 来禁用 CGO,并确保生成的可执行文件是完全静态链接的。以下是静态链接打包的步骤:

静态链接打包 Go 应用程序步骤:

  1. 设置环境变量

    • CGO_ENABLED=0 禁用 CGO,确保程序不使用 C 库。
    • 使用 -ldflags 设置链接器标志,确保链接过程完全静态化。
  2. 使用命令
    打包时使用以下命令:

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o your_binary_name .
    • CGO_ENABLED=0:禁用 CGO,生成纯 Go 静态二进制文件。
    • GOOS=linux GOARCH=amd64:指定目标平台(此处为 Linux 64 位架构,视需要调整)。
    • -a:强制重新编译所有包。
    • -ldflags '-extldflags "-static"':通过传递给链接器的标志确保生成静态链接的可执行文件。
    • -o your_binary_name:指定输出的二进制文件名称。
  3. 示例
    如果你的项目结构是这样的:

    my-go-project/
    ├── main.go

    然后在 my-go-project 目录下运行以下命令:

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o my-static-binary .
  4. 验证静态链接
    打包完成后,可以通过 file 命令检查生成的可执行文件是否是静态链接的:

    file my-static-binary

    输出应该类似于:

    my-static-binary: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=..., not stripped

这样,生成的二进制文件将是完全静态链接的,可以在没有外部依赖的情况下运行。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注