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