Инструмент для изменения динамического раздела двоичного файла ELF - PullRequest
6 голосов
/ 08 июля 2010

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

Ответы [ 4 ]

3 голосов
/ 09 июля 2010

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

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

$ 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 голос
/ 19 июня 2019

patchelf это то, что вы хотите

$ patchelf --replace-needed LIB_ORIGIN  LIB_NEW  ELF_FILE

Чтобы увидеть эффект

$ readelf -d ELF_FILE

Установить инструменты просто:

$ sudo apt-get install patchelf readelf
1 голос
/ 08 июля 2010

Если вы посмотрите на раздел .dynsym в Linux через readelf, вы увидите что-то вроде:

1: 0000000000000000   163 FUNC    GLOBAL DEFAULT  UND fseek@GLIBC_2.2.5 (2)

, которое просто содержит символическое имя библиотеки.Однако, если вы включите информацию о динамическом загрузчике, вы получите:

libc.so.6 => /lib/libc.so.6 (0x00002ba11da4a000)
    /lib64/ld-linux-x86-64.so.2 (0x00002ba11d82a000)

Так что, как уже упоминалось, абсолютно простой способ (если вы делаете это для отладки, а не навсегда) будетсоздайте новый сеанс, экспортируйте свой собственный путь перед существующим LD_LIBRARY_PATH и перейдите оттуда.

1 голос
/ 08 июля 2010

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

...