我正在使用GCC在ARM上为bada构建一个ELF SO。编译器选项包括-fpic。然而,在构建文件中,当我执行readelf -r
时,会有大量重定位记录,包括以下类型:
我在这里误解了什么?
编辑:从我所看到的,编译器中的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代码时,后者可能会失败。但我已经解决了这个问题。
答案 0 :(得分:3)
PIC不意味着没有重新安置吗?
不,它不。
这只是意味着没有针对.text
部分的重定位(因此.text
可以在多个进程之间共享)。