Игнорируйте LD_LIBRARY_PATH и придерживайтесь библиотеки, указанной через -rpath во время ссылки

StackOverflow https://stackoverflow.com/questions/2408172

  •  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.

Поможет ли это?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top