Есть ли инструмент для изменения разделяемых записей библиотеки в динамическом разделе двоичного файла ELF? Я хотел бы явно изменить зависимости разделяемой библиотеки в моем двоичном файле (например, заменить путь к существующей библиотеке с помощью настраиваемого пути)Инструмент для изменения динамического раздела двоичного файла ELF
ответ
заменить путь к существующей библиотеке с указанием пути
Если это ваша собственная библиотека, то вы, вероятно, связывая это так:
$ cc -o prog1 -l/full/path/to/libABC.so prog1.o
вместо собственно:
$ cc -o prog1 -L/full/path/to/ -lABC prog1.o
Первый подход говорит Linux-компоновщику, что приложение требует предварительной что библиотека, только эта библиотека и отсутствие переопределения должны быть возможны. Второй подход говорит о том, что для приложения требуется библиотека, которая будет установлена где-то в системе, либо по пути библиотеки по умолчанию, либо по указателю $ LD_LIBRARY_PATH (будет проверена во время выполнения). -L используется только во время соединения.
В противном случае вместо исправления ELF сначала проверьте, можно ли заменить библиотеку с помощью символической ссылки. Это обычная трюка: после этого сложно изменить исполняемый файл, но очень легко изменить, где к точкам символической ссылки.
Возможно, вы захотите проверить переменную окружения LD_LIBRARY_PATH
.
Если вы посмотрите на .dynsym раздела в Linux с помощью readelf
, вы просто увидеть что-то вроде:
1: 0000000000000000 163 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2)
который просто содержит символическое имя библиотеки. Тем не менее, если включить динамическую информацию загрузчика, вы получите:
libc.so.6 => /lib/libc.so.6 (0x00002ba11da4a000)
/lib64/ld-linux-x86-64.so.2 (0x00002ba11d82a000)
Так как уже упоминалось, абсолюта проще всего сделать (при условии, что вы делаете это для отладки, и не навсегда) будет просто создать новый сеанс, экспортируйте свой собственный путь перед существующим LD_LIBRARY_PATH
и идите оттуда.