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

x86_64 AT&T汇编多文件编译:跨文件调用函数报错求助

解决x86_64 AT&T汇编跨文件调用函数的问题

别担心,这个问题真的很常见,解决起来超简单!你遇到的“未定义引用”错误,核心原因是函数符号没有被声明为全局可见,导致链接器找不到其他文件里的函数。下面我一步步给你讲清楚怎么解决:

1. 确保被调用函数是全局可见的

在定义函数的汇编文件里,必须用.globl指令把函数名标记为全局符号,这样其他文件才能访问它。比如我们有一个math_functions.s文件,里面定义一个加法函数:

# math_functions.s
.globl add_numbers  # 关键:让这个函数对其他文件可见
add_numbers:
    # x86_64调用约定:前两个参数存放在%rdi和%rsi
    addq %rsi, %rdi  # 把第二个参数加到第一个参数上
    movq %rdi, %rax  # 返回值存在%rax里
    ret

2. 在调用文件中声明外部函数

虽然gcc的汇编器可以直接调用未声明的外部函数,但显式声明会更清晰,也能避免一些潜在问题。在调用函数的文件(比如main.s)里,用.extern指令声明要调用的外部函数:

# main.s
.globl main
.extern add_numbers  # 声明这是一个外部文件里的函数

main:
    # 准备调用add_numbers的参数:第一个参数10,第二个参数20
    movq $10, %rdi
    movq $20, %rsi
    call add_numbers  # 调用外部函数
    # 此时%rax里是30,程序返回这个值
    ret

3. 正确编译链接所有文件

现在按照上面的写法,直接用gcc把所有汇编文件一起编译链接就行:

gcc -o my_program main.s math_functions.s

如果你的文件比较多,也可以先把每个文件编译成目标文件,再链接起来:

# 编译成目标文件(.o)
gcc -c main.s -o main.o
gcc -c math_functions.s -o math_functions.o
# 链接所有目标文件生成可执行文件
gcc -o my_program main.o math_functions.o

为什么之前会出错?

默认情况下,AT&T汇编里的函数符号是局部的(只有当前文件能访问),链接器在合并文件时找不到其他文件里的函数,就会抛出“未定义引用”错误。只要用.globl把需要跨文件调用的函数标记为全局,问题就解决啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:04