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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:45:31