企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## 格式 看文档: go tool link —help ``` -ldflags '[pattern=]arg list' -B note: 使用ELF时,添加一个ELF NT_GNU_BUILD_ID note -E entry: 设置entry符号名 -H type: 设置头类型 -I linker: 指定linker为ELF动态链接器 -L directory:添加指定路径是库路径 -R quantum:设置地址舍入限额(默认-1) -T address: 设置文本(text)段地址(默认-1) -V: 打印版本信息并退出 -X definition: 添加形式为importpath.name=value的字符串值定义 -a: 分开显示 -buildid id:指定id为toolchain 的build id。 -buildmode mode:设置构建模式 -c:转储调用图(dump call graph) -compressdwarf:尽可能压缩DWARF(默认开启) -cpuprofile file:将cpu profile信息写入文件file。 -d:禁用动态可执行文件 -debugtramp int: debug trampolines -dumpdep: 转储符号依赖图(dump symbol dependency graph) -extar string: 归档buildmode=c-archive的程序 -extld linker:指定在external mode下使用的链接器 -extldflags flags:给external 链接器传参 -f:忽略版本不匹配 -g:禁用go package日期检查 -h:遇到错误时停止 -importcfg file:从file中读取import 配置信息 -installsuffix suffix:设置包目录前缀 -k symbol: 设置field跟踪符号 -libgcc string: 开启编译器支持的库进行内部链接(使用”none”进行禁用) -linkmode mode: 设置链接模式 -linkshared: 链接Go共享库 -memprofile file:将memory profile信息写入file -memprofilerate rate: 设置runtime.MemProfileRate为rate值 -msan:开启MScan接口(enable MSan interface) -n 转储符号表(dump symbol table) -o file: 把构建成的目标文件写入file -pluginpath string:指定插件的全路径 -r path: 设置ELF动态链接器搜索path -race: 开启竞态检查 -s 禁用符号表 -strictdups int:在读取目标文件期间进行完整性检查,检查重复的符号内容(1=warn 2=err)。 -tmpdir directory: 指定存放定时文件的目录 -u:拒绝不安全的packages -v:打印链接trace -w:禁止生成 DWARF ``` ## 实例 ### -ldflags 编译优化 ``` go build -ldflags "-w -s" -gcflags "all=-N -l" one.go -w 禁止生成debug信息,注意使用该选项后,无法使用 gdb 进行调试 -s 禁用符号表 -N 禁止编译优化 -l 禁止内联,禁止内联也可以一定程度上减小可执行程序大小 ``` ### 注入编译参数,如git 信息,go version <details> <summary>libs/bininfo/bininfo.go</summary> ``` package bininfo import ( "fmt" "runtime" ) var ( // 初始化为 unknown,如果编译时没有传入这些值,则为 unknown GitTag = "unknown" GitCommitLog = "unknown" GitStatus = "unknown" BuildTime = "unknown" BuildGoVersion = "unknown" ) // 返回多行格式 func StringifyMultiLine() string { return fmt.Sprintf("GitTag=%s\nGitCommitLog=%s\nGitStatus=%s\nBuildTime=%s\nGoVersion=%s\nruntime=%s/%s\n", GitTag, GitCommitLog, GitStatus, BuildTime, BuildGoVersion, runtime.GOOS, runtime.GOARCH) } ``` </details> <br/> <details> <summary>antbiz.go</summary> ``` func parseFlag() { binInfoFlag := flag.Bool("v", false, "show bin info") flag.Parse() if *binInfoFlag { fmt.Printf("%+v\n", bininfo.StringifyMultiLine()) os.Exit(0) } } ``` </details> <br/> shell ``` GitTag=`git tag | sort -V | tail -n 1` GitCommitLog=`git log --pretty=oneline -n 1` GitCommitLog=${GitCommitLog//\'/\"} GitStatus=`git status -s` BuildTime=`date +'%Y.%m.%d.%H%M%S'` BuildGoVersion=`go version` LDFlags=" \ -X 'antbiz/libs/bininfo.GitTag=${GitTag}' \ -X 'antbiz/libs/bininfo.GitCommitLog=${GitCommitLog}' \ -X 'antbiz/libs/bininfo.GitStatus=${GitStatus}' \ -X 'antbiz/libs/bininfo.BuildTime=${BuildTime}' \ -X 'antbiz/libs/bininfo.BuildGoVersion=${BuildGoVersion}' \ " GOOS=linux go build -v -ldflags "$LDFlags" antbiz.go ``` 运行 ``` GitTag=没有缓存的项目 GitCommitLog=cb5314722bd436ccd213fd2ef65853eb9c72f9e3 [添加] bininfo 信息 GitStatus= M .gitignore M .gitlab-ci.yml M CHANGELOG BuildTime=2022.09.19.104631 GoVersion=go version go1.18.3 linux/amd64 runtime=linux/amd64 ```