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

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

Моя проблема в том, что среда определяет 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, или есть ли другие возможные решения моей проблемы? Обратите внимание, что я говорю о динамическом линковании во время выполнения, я могу управлять командной строкой во время компиляции и компоновки.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 марта 2010

Может быть, вы можете использовать оболочку оболочки, которая изменяет среду только для этой программы?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

Это должно перегрузить LD_LIBRARY_PATH перед выполнением, а затем заменить оболочку вашим двоичным файлом через exec.

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

1 голос
/ 10 марта 2010

Связывание с libstdc++.a определенно возможно, хотя и сложно. Инструкция здесь .

Я немного скептически отношусь к вашему утверждению, что LD_LIBRARY_PATH имеет преимущество перед "запеченным в" DT_RPATH, хотя - по крайней мере, в Linux и (я полагаю) Solaris, LD_LIBRARY_PATH рассматривается только после DT_RPATH поиск не удался.

...