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

时间:2016-03-31 17:23:34

标签: assembly powerpc

我对装配比较新,我正在使用powerpc芯片。我正在使用gcc交叉编译器并使用buildroot环境(仅用于后台)。

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

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

有没有办法在没有TOC的情况下这样做?

以下是一些示例代码:

结果不正确(%r3不包含"符号"包含):

.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确实包含"符号"包含):

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

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

提前谢谢。

1 个答案:

答案 0 :(得分:0)

似乎答案是与位置无关的代码需要TOC