Sev*_*yev 1 assembly gcc arm elf
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
跨模块函数调用的类似想法。但是,当项目混合使用 ARM 和 Thumb 代码时,后者可能会失火。但我已经解决了这个问题。