PowerPC 汇编中的位置相关、独立代码和全局变量

Position Dependent, Independent Code, and Global Variables in PowerPC Assembly

我对组装比较陌生,正在使用 powerpc 芯片。我正在使用 gcc 交叉编译器并使用 buildroot 环境(仅用于背景)。

我正在将代码添加到一些代码的 .head 部分,这些代码将创建一个 .elf 对象(为了参数起见,我们称它为 target.elf),它通过 buildroot 被带入一个更大的二进制文件。 target.elf 被定义为从代码和本地链接器中的地址 0x0 开始,但稍后会移动到不同的地址位置。我希望从汇编代码中引用一个在汇编代码和 c 文件之间共享的全局变量。当我使用与位置无关的方式这样做时,我 运行 遇到了问题。当我使用 GOT 作为参考时(例如 symbol@got@h),我能够正确地参考符号。

这是一个问题,因为我希望创建一个中断处理程序,它不依赖于在进入时具有指向堆栈或 TOC 的有效指针,并且我需要 TOC 才能使用 GOT。

有没有没有 TOC 的方法?

下面是一些示例代码:

不正确的结果(%r3 不包含 "symbol" 包含的内容):

.global symbol
symbol:
    .long 0

.global irq_handler
irq_handler:
    addi    %r3, 0, 0
    ori     %r3, %r3, symbol@l
    ld      %r3, 0(%r3)
    b       .

In global area of C-file:
extern uint64_t symbol;

我还尝试在 c 文件中定义符号(因此没有 extern 但仍然是全局的)并省略了 asm 文件中的定义。这也失败了。

我也走捷径,只加载地址的@l部分,因为前32位是0x0。

正确结果(%r3 确实包含 "symbol" 包含的内容):

.global irq_handler
irq_handler:
  ld      %r3, symbol@got(%r2)
  ld      %r3, 0(%r3)
  b       .

请注意,在正确的示例中,目录在 %r2 中可用。

提前致谢。

似乎答案是目录 位置无关代码所必需的。