链接汇编目标文件时出现undefined reference to esp错误的原因及解决方法
解决汇编链接时“undefined reference to esp”的错误
错误原因分析
这问题我之前也踩过坑,其实是个很容易忽略的AT&T汇编语法细节:在AT&T格式的x86汇编里,所有寄存器名称必须以%作为前缀。
你代码里的这一行:
addl $4, esp
这里的esp没加%前缀,汇编器会把它当成一个普通的外部符号(比如未定义的函数或全局变量),而不是CPU的栈指针寄存器。等到链接阶段,链接器找不到名为esp的符号定义,自然就抛出了undefined reference to 'esp'的错误。
而你之前写的addl $8, %esp是正确的,因为加了%前缀,汇编器能识别这是寄存器,所以编译阶段没问题。
修复方法
只需要把出错的那行代码里的esp加上%前缀就行:
addl $4, %esp
修正后的相关代码片段:
pushl $buffer call isdigit addl $4, %esp # 补上%前缀,标记这是寄存器 cmp $1, %eax je if_digit
额外注意事项
- AT&T语法和Intel语法的核心区别之一就是寄存器的前缀要求,写AT&T汇编时一定要记得给所有寄存器加
%,别和Intel语法搞混。 - 编译时汇编器没报错,是因为它允许未定义的外部符号存在,这种问题只会在链接阶段暴露出来,以后遇到类似的“undefined reference”错误,也可以先检查下是不是符号名(包括寄存器)的语法写错了。
内容的提问来源于stack exchange,提问作者Jimmy Suh
相关产品推荐
相关产品推荐

