PIC不意味着没有重新安置吗?

时间:2014-02-26 23:38:05

标签: gcc assembly arm elf

我正在使用GCC在ARM上为bada构建一个ELF SO。编译器选项包括-fpic。然而,在构建文件中,当我执行readelf -r时,会有大量重定位记录,包括以下类型:

  • R_ARM_RELATIVE
  • R_ARM_REL32
  • R_ARM_ABS32
  • R_ARM_GLOB_DAT
  • R_ARM_JUMP_SLOT

我在这里误解了什么?

编辑:从我所看到的,编译器中的PIC实现不使用GOT。相反,它们使用PC相对寻址,存储的常数是从使用点到符号地址的偏移量;这是由链接器解决的。像这样,读取一个全局变量:

    ldr r12, OffsetToVar
PointOfUse:
    ldr r0, [r12, pc] 
# r0 now has the value of MyVar

#...

# At function's end...
OffsetToVar:
    .long MyVar-PointOfUse-8
# Compiler can't resolve this, since it doesn't know
# the address of MyVar, but linker can

跨模块函数调用的类似想法。当项目混合使用ARM和Thumb代码时,后者可能会失败。但我已经解决了这个问题。

1 个答案:

答案 0 :(得分:3)

  

PIC不意味着没有重新安置吗?

不,它

这只是意味着没有针对.text部分的重定位(因此.text可以在多个进程之间共享)。