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
相关产品推荐
相关产品推荐

