PIC (код независимого положения)
Есть ли способ проверить, является ли объектный файл(.файл о) рис-включен?
1 ответ:
Не уверен, насколько это портативно, но для 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
s. (вы также увидите таблицу глобального смещения в выходных данныхreadelf -s
.)Для 64bit, то же самое, но с типом перемещения
R_X86_64_GOTPCREL
. Я почти уверен, что все имена типов перемещения прямо указывают на то, является ли код-это PIC или нет, но я не могу найти ссылку прямо сейчас.