PIC 不是意味着没有搬迁吗?

Sev*_*yev 1 assembly gcc 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
Run Code Online (Sandbox Code Playgroud)

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

Emp*_*ian 5

PIC 不是意味着没有搬迁吗?

不,它没有

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