You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GCC链接汇编代码与C代码的正确方法及相关场景咨询

GCC链接汇编代码与C代码的正确方式

通用步骤(C与汇编混合场景)

不管是纯汇编文件链接,还是汇编+C代码混合编译,核心逻辑都是先把每个源文件编译成独立的目标文件(.o),再通过GCC完成最终链接:

  • 编译汇编文件:你可以用GCC直接处理汇编文件生成目标文件,命令是 gcc -c your_asm.s -o your_asm.o;当然也可以用原生汇编器as:as your_asm.s -o your_asm.o,两者效果一致,GCC本质是帮你调用了as工具。
  • 编译C文件:用标准C编译命令生成目标文件:gcc -c your_c.c -o your_c.o
  • 链接所有目标文件:把编译好的.o文件传给GCC,它会自动处理链接逻辑:gcc your_asm.o your_c.o -o final_program。如果代码依赖标准C库(比如用了printf、malloc),GCC会自动链接libc;如果不需要标准库,记得加上-nostdlib选项。

针对你的汇编文件的具体解决方案

看你提供的print.s和string.s,代码直接调用Linux系统调用,没有依赖任何C库,而且自己定义了_start作为程序入口(这是Linux内核识别的程序起始点)。如果直接用gcc *.o -o hello会报错——因为GCC默认会链接C库的启动代码,这些代码会找main函数作为入口,和你定义的_start冲突。

正确的GCC链接方式有两种:

方式1:先手动编译汇编为目标文件,再链接

你已经用as string.s -o string.o和as print.s -o print.o生成了目标文件,接下来链接时要加上-nostdlib和-static选项:

gcc print.o string.o -o hello -nostdlib -static
  • -nostdlib:告诉GCC不要链接标准C库和默认启动文件,这样就会采用你定义的_start作为程序入口。
  • -static:强制静态链接,避免动态链接器的干扰(毕竟我们没用到任何动态库)。

方式2:一步到位,用GCC直接编译并链接汇编文件

不用手动调用as,直接把汇编文件传给GCC,加上相同的选项即可:

gcc print.s string.s -o hello -nostdlib -static

运行生成的hello程序,就能看到熟悉的Hello, world!输出啦~

内容的提问来源于stack exchange,提问作者DBr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:25:45