Как я могу сказать, что-то вроде objdump, был ли объектный файл собран с -fPIC? - PullRequest
51 голосов
/ 27 августа 2009

Как узнать, например, objdump, был ли объектный файл создан с -fPIC?

Ответы [ 6 ]

59 голосов
/ 29 августа 2009

Ответ зависит от платформы. На большинстве платформ, если вывод от

readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)'

пусто, тогда либо foo.o не был скомпилирован с -fPIC, либо foo.o не содержит никакого кода, где -fPIC имеет значение.

12 голосов
/ 25 ноября 2009

Мне просто нужно было сделать это на цели PowerPC, чтобы найти, какой общий объект (.so) создавался без -fPIC. Я запустил readelf -d libMyLib1.so и нашел TEXTREL. Если вы видите TEXTREL, один или несколько исходных файлов, составляющих ваш .so, не были созданы с -fPIC. readelf можно заменить elfdump , если необходимо.

например.,

[user@host lib]$ readelf -d libMyLib1.so | grep TEXT   # Bad, not -fPIC
 0x00000016 (TEXTREL)
[user@host lib]$ readelf -d libMyLib2.so | grep TEXT   # Good, -fPIC
[user@host lib]$

И чтобы помочь людям в поиске решений, ошибка, которую я получал, когда запускал свой исполняемый файл, была такой:

root@target:/# ./program: error while loading shared libraries: /usr/lib/libMyLi
b1.so:  R_PPC_REL24 relocation at 0x0fc5987c for symbol 'memcpy' out of range

Я не знаю, относится ли эта информация ко всем архитектурам.

Источник: blogs.oracle.com / rie

2 голосов
/ 19 июня 2015

-fPIC означает, что код сможет выполнять в адресах, отличных от адреса, для которого был скомпилирован.

Для этого disasambler будет выглядеть так ...

call get_offset_from_compilation_address
get_offset_from_compilation_address: pop ax
sub ax, ax , &get_offset_from_compilation_address

теперь у нас есть смещение, которое нам нужно добавить к любому доступу к памяти.

load bx, [ax + var_address}
2 голосов
/ 11 декабря 2014
readelf -a *.so | grep Flags
  Flags:                             0x50001007, noreorder, pic, cpic, o32, mips32

Это должно работать большую часть времени.

2 голосов
/ 13 июня 2012

Полагаю, вы действительно хотите знать, состоит ли общая библиотека из объектных файлов, скомпилированных с -fPIC.

Как уже упоминалось, если есть TEXTREL, то -fPIC не использовался.

Существует отличный инструмент под названием scanelf, который может показать вам символы, которые вызвали перемещение .text.

Дополнительную информацию можно найти на HOWTO. Поиск и исправление текстовых перемещений TEXTRELs .

0 голосов
/ 26 июня 2010

Еще одна опция, чтобы определить, генерируется ли ваша программа с параметром -fPIC:

при условии, что в вашем коде включена опция -g3 -gdwarf-2 при компиляции.

другой формат отладки gcc может также содержать информацию макроса:

Обратите внимание, что следующий синтаксис $ '..' предполагает bash

echo $' main() { printf("%d\\n", \n#ifdef __PIC__\n__PIC__\n#else\n0\n#endif\n); }' | gcc -fPIC -g3 
-gdwarf-2 -o test -x c -

readelf --debug-dump=macro ./test | grep __PIC__

такой метод работает, потому что руководство gcc объявляет, что если используется -fpic, PIC определяется как 1, и если используется -fPIC, PIC равно 2.

Ответы выше, проверив GOT, являются лучшим способом. Потому что предварительный запрос -g3 -gdwarf-2, я думаю, используется редко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...