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