Исправьте расположение библиотеки внутри двоичного файла путем редактирования исполняемого файла
Моя цель-заставить двоичный файл работать в другой системе как часть процесса установки, даже если библиотеки находятся не в том месте, где компоновщик нашел их в моей исходной системе.
Например: у меня есть двоичная "программа", которая связывается с несколькими общими библиотеками "library1.so', 'library2.so-и ...library3.so".
С помощью ldd я вижу, что libary3.so не может быть найден, даже если он находится в /usr / local / lib:
$ ldd program
library1.so.1 => (0x00007fff26ffe000)
library2.so.10 => /usr/local/lib/library2.so.10 (0x00007fa67087d000)
library3.so => not found
Странно то, что другой lib 'library2.so-находится точно в том месте, где ...library3.so-есть.
Конечно, я мог бы исправить это с помощью LD_LIBRARY_PATH, но я хотел бы избежать этого.
Вопрос : Какие еще варианты я могу использовать для исправления отсутствующей библиотеки?
Edit 2: я нашел это предложение
Канонические правила для обработки LD_LIBRARY_PATH
- никогда не устанавливайте LD_LIBRARY_PATH глобально.
-
Если вы должны отправить двоичные файлы, которые если вы хотите разрешить своим клиентам устанавливать программу вне "стандартного" расположения, выполните одно из следующих действий:
- отправляйте свои двоичные файлы как .o файлы, и как часть процесса установки повторно свяжите их с правильным путем библиотеки установки.
- загружайте исполняемые файлы с очень длинным "фиктивным" путем к библиотеке во время выполнения и в процессе установки используйте двоичный редактор для замены правильного пути к библиотеке установки в выполнимый.
- если вы вынуждены установить LD_LIBRARY_PATH, сделайте это только как часть оболочки.
Под-вопрос : Как я могу изменить путь к библиотеке с помощью двоичного редактора?
2 ответа:
Я нашел patchELF , который делает то, что мне нужно:
[...] Аналогично, вы можете изменить RPATH, путь поиска компоновщика, встроенный в исполняемые файлы и динамические библиотеки:
patchelf --set-rpath /opt/my-libs/lib:/foo/lib program
Это заставляет динамический компоновщик искать в /opt / my-libs/lib и /foo / lib для общих библиотек, необходимых программе. Конечно же, вы можно также установить переменную окружения LD_LIBRARY_PATH, но это часто неудобно, так как для настройки требуется скрипт-оболочка. окружающая среда.