在苹果芯片上使用程序计数器的链接器错误



在学习了HelloSilicon关于Apple Silicon的ARM汇编的教程之后,我决定使用通用寄存器和程序计数器。

当使用任何注册器("R1", "R2"…)将源提供给链接器时或";PC"("R15"我得到以下链接器错误:

% ld -o cicle cicle.o -lSystem -syslibroot `xcrun -sdk macosx --show-sdk-path` -e _start -arch arm64
Undefined symbols for architecture arm64:
"PC", referenced from:
_start in cicle.o
ld: symbol(s) not found for architecture arm64

来源:

.global _start          // Provide program starting address to linker
.align 2            // Make sure everything is aligned properly
// Setup the parameters to print hello world
// and then call the Kernel to do it.
_start: 
label:
mov X0, #1      // 1 = StdOut
adr X1, helloworld  // string to print
mov X2, #13         // length of our string
mov X16, #4     // Unix write system call
svc #0x80       // Call kernel to output the string
b   PC          //Expecting endless loop
//b PC-6        //Expecting endless "Hello World" loop

// Setup the parameters to exit the program
// and then call the kernel to do it.
mov     X0, #0      // Use 0 return code
mov     X16, #1     // System call number 1 terminates this program
svc     #0x80       // Call kernel to terminate the program
helloworld:      .ascii  "Hello World!n"

我明白这个问题可以在XCode 12上编码时解决+在构建设置上将Bundle更改为Mach-O,但是,附加Bundle参数-b发送ld: warning: option -b is obsolete and being ignored警告。

当使用任何注册器("R1", "R2"…)向链接器提供源时或";PC"("R15"我得到以下链接器错误:

这些寄存器不存在,您正在为错误的体系结构阅读手册。你需要ARMv8,而不是ARMv7。

对于这个:

b   PC          //Expecting endless loop
//b PC-6        //Expecting endless "Hello World" loop

PC不是一个东西。它只是一个标识符,就像其他标识符一样,比如_start。如果要引用当前指令,请使用点(.):

b .    // infinite loop
b .+8  // skip the next instruction

注意,任何算术都是不可缩放的。如果你想跳转6条指令,你必须执行b .-(4*6)。如果你试图编译b .-6,你会得到一个错误,因为b只能编码偏移对齐到4个字节。

相关内容

  • 没有找到相关文章

最新更新