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

为何创建指向其他数据记录地址的汇编代码链接时报错?

汇编代码链接错误排查与解决

问题背景

这段代码出自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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:57:06