8

有什么方法可以检查目标文件(.o 文件)是否启用了 PIC?

4

1 回答 1

7

不确定这是多么可移植,但是对于 x86 和 x86_64,ELF 格式,您可以使用readelf -r并查看重定位类型。

对于 32 位 PIC 代码,您应该有一个 R_386_GOTPC 重定位部分:

Relocation section '.rel.text' at offset 0x38c contains 3 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000004  00000902 R_386_PC32        00000000   __i686.get_pc_thunk.cx
0000000a  00000a0a R_386_GOTPC       00000000   _GLOBAL_OFFSET_TABLE_
00000010  00000803 R_386_GOT32       00000000   f

非 PIC 不应该存在这样的部分.o。(您还将在readelf -s输出中看到一个全局偏移量表。)

对于 64 位,相同但具有R_X86_64_GOTPCREL重定位类型。我很确定所有重定位类型名称都直接指示代码是否为 PIC,但我现在找不到参考。

于 2011-05-05T11:29:51.077 回答