如何将Go主程序与独立文件中的汇编函数链接生成可执行文件?
解决Go与汇编文件链接时找不到runtime.a的问题
首先修正代码中的问题,再给出正确的构建方式:
1. 修正代码
Go主程序(main.go)
func main() { _ = add(5, 3) }
汇编文件(add.s)
Go的汇编语法要求TEXT指令大写,且必须遵循Go的amd64调用约定(参数依次存于DI、SI寄存器,返回值需存入AX寄存器),修正后的代码:
TEXT main.add(SB), NOSPLIT, $0-16 MOVQ DI, AX // 将第一个参数(5)移入AX寄存器 ADDQ SI, AX // 加上第二个参数(3) RET // 返回AX中的计算结果
2. 正确构建方式
推荐:直接用go build自动处理
将main.go和add.s放在同一目录下,执行以下命令即可生成可执行文件:
go build -o myapp .
Go工具链会自动完成Go文件编译、汇编文件编译,并自动链接Go运行时(包括runtime.a等所有依赖),无需手动指定路径。
手动分步编译(仅作参考,不推荐)
如果一定要手动完成编译和链接步骤:
- 编译Go文件为目标文件:
go tool compile -o main.o main.go
- 编译汇编文件为目标文件:
go tool asm -o add.o add.s
- 获取Go运行时库的路径,执行:
go list -f '{{.Target}}' runtime
命令会输出类似$GOROOT/pkg/linux_amd64/runtime.a的路径,接着执行链接命令:
go tool link -o myapp main.o add.o $(go list -f '{{.Target}}' runtime)
注意:手动链接可能还需要处理其他隐藏依赖,因此优先使用go build简化流程。
内容的提问来源于stack exchange,提问作者prr
相关产品推荐
相关产品推荐

