我对装配比较新,我正在使用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中可用。
提前谢谢。
答案 0 :(得分:0)
似乎答案是与位置无关的代码需要TOC 。