Инструмент для изменения динамического раздела двоичного файла ELF

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

6
задан zer0stimulus 8 July 2010 в 17:16
поделиться

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

3
ответ дан 17 December 2019 в 02:21
поделиться

Если вы посмотрите на раздел . 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
ответ дан 17 December 2019 в 02:21
поделиться

Вы можете проверить переменную среды LD_LIBRARY_PATH .

1
ответ дан 17 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: