2010-07-08 5 views
6

Есть ли инструмент для изменения разделяемых записей библиотеки в динамическом разделе двоичного файла ELF? Я хотел бы явно изменить зависимости разделяемой библиотеки в моем двоичном файле (например, заменить путь к существующей библиотеке с помощью настраиваемого пути)Инструмент для изменения динамического раздела двоичного файла ELF

ответ

3

заменить путь к существующей библиотеке с указанием пути

Если это ваша собственная библиотека, то вы, вероятно, связывая это так:

$ 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 сначала проверьте, можно ли заменить библиотеку с помощью символической ссылки. Это обычная трюка: после этого сложно изменить исполняемый файл, но очень легко изменить, где к точкам символической ссылки.

1

Возможно, вы захотите проверить переменную окружения LD_LIBRARY_PATH.

1

Если вы посмотрите на .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 и идите оттуда.