PIC (код независимого положения)


Есть ли способ проверить, является ли объектный файл(.файл о) рис-включен?

1 8

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 .os. (вы также увидите таблицу глобального смещения в выходных данных readelf -s.)

Для 64bit, то же самое, но с типом перемещения R_X86_64_GOTPCREL. Я почти уверен, что все имена типов перемещения прямо указывают на то, является ли код-это PIC или нет, но я не могу найти ссылку прямо сейчас.