为何创建指向其他数据记录地址的汇编代码链接时报错?
汇编代码链接错误排查与解决
问题背景
这段代码出自Jonathan Bartlett所著《Learn to Program with Assembly》第96页,目的是通过指针将文本作为数据记录的一部分存储(记录包含姓名、体重、年龄、鞋码等信息),精简后的代码如下:
.section .data .globl people, numpeople numpeople: .quad (endpeople - people)/PERSON_RECORD_SIZE people: .quad $gkcname, 200, 10, 2, 74, 20 endpeople: gkcname: .ascii "Gilbert Keith Chester\0" .globl NAME_PTR_OFFSET, WEIGHT_OFFSET, SHOE_OFFSET .globl HAIR_OFFSET, HEIGHT_OFFSET, AGE_OFFSET .equ NAME_PTR_OFFSET, 0 .equ WEIGHT_OFFSET, 8 .equ SHOE_OFFSET, 16 .equ HAIR_OFFSET, 24 .equ HEIGHT_OFFSET, 32 .equ AGE_OFFSET, 40 .globl PERSON_RECORD_SIZE .equ PERSON_RECORD_SIZE, 48
错误信息
代码能通过汇编,但链接时出现如下错误:
persondatanamepointer.o: In function `people': (.data+0x8): undefined reference to `$gkcname'
问题原因与解决方法
- 问题根源:在NASM汇编语法中,引用符号地址不需要加
$前缀,$gkcname是错误写法,链接器会将其当作名为$gkcname的符号去查找,而实际定义的符号是gkcname,因此找不到目标符号导致报错。 - 修复方法:将
people标签下的.quad $gkcname修改为.quad gkcname即可。修改后的代码片段:
people: .quad gkcname, 200, 10, 2, 74, 20
内容的提问来源于stack exchange,提问作者DeFalco
相关产品推荐
相关产品推荐

