Apple Silicon下使用程序计数器PC引发链接器错误
Apple Silicon ARM64汇编:PC寄存器使用错误与链接问题解决
错误原因
你遇到的Undefined symbols for architecture arm64: "PC"错误,核心问题是ARM64(AArch64)架构的Apple汇编语法不支持用PC作为寄存器助记符。汇编器将PC识别为未定义的外部符号,而非程序计数器,导致链接器无法找到对应符号。
注:ARM32架构确实允许用PC指代程序计数器,但ARM64规范限制了直接访问PC的方式,且Apple的clang汇编器不兼容该写法。
汇编代码修正
要实现无限循环打印"Hello World",直接跳转至前面的label标签即可,无需操作PC。修正后的代码如下:
.global _start // 向链接器提供程序入口地址 .align 2 // 确保代码对齐正确 // 准备打印Hello World的参数,调用内核执行 _start: label: mov X0, #1 // 1 = 标准输出 adr X1, helloworld // 加载字符串地址 mov X2, #13 // 字符串长度 mov X16, #4 // Unix系统调用:write svc #0x80 // 调用内核输出字符串 b label // 跳转到label,实现无限循环(替代原错误的b PC) // 若需相对跳转,也可使用 b .-28 (计算当前指令到label的偏移,但标签写法更直观) // 准备退出程序的参数,调用内核执行 mov X0, #0 // 返回码0 mov X16, #1 // Unix系统调用:exit svc #0x80 // 调用内核终止程序 helloworld: .ascii "Hello World!\n"
链接命令说明
你原有的链接命令完全有效,不需要添加过时的-b参数——当前问题根源是汇编代码错误,与Mach-O Bundle类型无关。执行以下命令完成编译链接:
# 编译汇编代码 clang -c -o cicle.o cicle.s -arch arm64 # 链接生成可执行文件 ld -o cicle cicle.o -lSystem -syslibroot `xcrun -sdk macosx --show-sdk-path` -e _start -arch arm64
额外提示
- 若需在ARM64中获取当前PC地址,应使用
adr Xn, .(将当前指令地址加载到Xn寄存器),而非直接访问PC。 - 你提到的Xcode12+修改Bundle类型的方案,适用于其他Mach-O链接场景,与本次PC符号错误无关,无需采用。
内容的提问来源于stack exchange,提问作者Marroja
相关产品推荐
相关产品推荐

