Исправьте расположение библиотеки внутри двоичного файла путем редактирования исполняемого файла


Моя цель-заставить двоичный файл работать в другой системе как часть процесса установки, даже если библиотеки находятся не в том месте, где компоновщик нашел их в моей исходной системе.

Например: у меня есть двоичная "программа", которая связывается с несколькими общими библиотеками "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

  1. никогда не устанавливайте LD_LIBRARY_PATH глобально.
  2. Если вы должны отправить двоичные файлы, которые если вы хотите разрешить своим клиентам устанавливать программу вне "стандартного" расположения, выполните одно из следующих действий:

    • отправляйте свои двоичные файлы как .o файлы, и как часть процесса установки повторно свяжите их с правильным путем библиотеки установки.
    • загружайте исполняемые файлы с очень длинным "фиктивным" путем к библиотеке во время выполнения и в процессе установки используйте двоичный редактор для замены правильного пути к библиотеке установки в выполнимый.
  3. если вы вынуждены установить LD_LIBRARY_PATH, сделайте это только как часть оболочки.

Под-вопрос : Как я могу изменить путь к библиотеке с помощью двоичного редактора?

2 3

2 ответа:

Я нашел patchELF , который делает то, что мне нужно:

[...] Аналогично, вы можете изменить RPATH, путь поиска компоновщика, встроенный в исполняемые файлы и динамические библиотеки:

patchelf --set-rpath /opt/my-libs/lib:/foo/lib program    

Это заставляет динамический компоновщик искать в /opt / my-libs/lib и /foo / lib для общих библиотек, необходимых программе. Конечно же, вы можно также установить переменную окружения LD_LIBRARY_PATH, но это часто неудобно, так как для настройки требуется скрипт-оболочка. окружающая среда.

Я думаю, что редактирование двоичных файлов для изменения путей-плохая идея. Попробуйте включить опции

-Wl,-Bstatic -lstdc++

Во время процесса связывания. В этом случае у вас будет статически связанный двоичный файл, который будет вызываться в разных системах.