Игнорируйте LD_LIBRARY_PATH и придерживайтесь библиотеки, указанной через -rpath во время ссылки
-
18-09-2019 - |
Вопрос
Я сижу в среде, над которой у меня нет реального контроля (это не только у меня, так что, по сути, я не могу изменить среду, иначе это не сработает ни для кого другого), единственное, на что я могу повлиять, это на то, как создается двоичный файл.
Моя проблема в том, что среда указывает LD_LIBRARY_PATH, содержащий libstdc ++, который несовместим с используемым компилятором.Я попытался скомпилировать его статически, но это кажется невозможным для g ++ (версия 4.2.3, похоже, была проделана работа в этом направлении в более поздних версиях, хотя они недоступны, -static-libstdc ++ или что-то в этом роде).
Теперь я пришел к использованию rpath для добавления абсолютного пути к исполняемому файлу (это сработало бы, все машины, на которых он должен запускаться, идентичны).К сожалению, похоже, что LD_LIBRARY_PATH имеет приоритет над rpath (сброс LD_LIBRARY_PATH подтвердил, что он может найти библиотеку, но, как указано выше, LD_LIBRARY_PATH будет установлен для всех, и я не могу это изменить).
Есть ли какой-либо способ, которым я могу заставить rpath иметь приоритет над LD_LIBRARY_PATH, или есть какие-либо другие возможные решения моей проблемы?Обратите внимание, что я говорю о динамической компоновке во время выполнения, я могу управлять командной строкой во время компиляции и компоновки.
Спасибо.
Решение
Связывание с libstdc++.a
это определенно возможно, хотя и сложно.Инструкции здесь.
Я немного скептически отношусь к вашему утверждению о том, что LD_LIBRARY_PATH
имеет приоритет над "запеченным" DT_RPATH
хотя - по крайней мере, в Linux и (я полагаю) Солярис, LD_LIBRARY_PATH
рассматривается только после DT_RPATH
поиск не удался.
Другие советы
Может быть, вы можете использовать оболочку-оболочку, которая изменяет среду только для этой программы?
#!/bin/sh
LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@
Это должно перегрузить LD_LIBRARY_PATH перед выполнением, а затем заменить оболочку вашим двоичным файлом через exec.
Поможет ли это?