Заменить LD_PRELOAD или LD_LIBRARY_PATH - PullRequest
1 голос
/ 31 марта 2011

Я занимаюсь программированием на С на машине, для которой у меня нет прав root. Я скомпилировал несколько общих библиотек, на которые я ссылаюсь, но поскольку я не могу установить библиотеки в обычном месте (/usr/local/lib), я должен явно указывать расположение библиотек при каждой компиляции и запуске. При компиляции это просто означает добавление флага -L к команде gcc, но для выполнения программы это намного раздражает. Либо я должен добавить нестандартный каталог к ​​LD_LIBRARY_PATH в каждом сеансе, либо я должен добавить LD_PRELOAD=/path/to/libs в начало команды execute.

Есть ли лучший способ сделать это на машине, для которой у меня нет root-доступа?

Кстати, машина работает на Red Hat 4.1.

Ответы [ 4 ]

3 голосов
/ 04 апреля 2011

Существует несколько решений, от лучшего к худшему:

  1. Использование $ORIGIN, например gcc main.o -L../lib -lfoo -Wl,-rpath='$ORIGIN'/../lib
  2. Использование целевого RPATH, например gcc main.o -L../LIB -lfoo -Wl,-rpath=/home/user/lib
  3. Установите LD_LIBRARY_PATH из вашего .bashrc или .profile

Решение 1 позволяет вам устанавливать бинарный файл где угодно, если вы перемещаете бинарный файл и библиотеки вместе, например, my-app /bin / a.out и my-app / lib / {required-shared-libs} .so.Он также позволяет использовать несколько версий приложения и их набор общих библиотек.

Решение 2 отлично работает, если вам нужен только один набор общих библиотек, и вы никогда не захотите перемещать их.

Решение 3 влияет на каждое приложение, которое вы запускаете, и может заставить некоторые из них связываться с вашими общими библиотеками, а не с системными.Это может привести к их сбою, сбою с неразрешенными символами или к другой боли.Ситуация усугубляется только у вас и у кого-то еще, поэтому вам будет трудно получить помощь.

1 голос
/ 01 апреля 2011

Если вы установите переменную окружения LD_RUN_PATH при компиляции и компоновке вашей программы, тогда этот путь поиска будет встроен в исполняемый файл, и динамический компоновщик будет искать его во время выполнения.

1 голос
/ 31 марта 2011

Вы можете добавить переменные окружения к вашему .bashrc (или к любому файлу, который ваш источник оболочки при входе в систему).

0 голосов
/ 31 марта 2011

Использование LD_LIBRARY_PATH или LD_PRELOAD - в значительной степени то, как это сделать.Чтобы это исправить, переименуйте вашу программу из myprog в myprog-exe и создайте сценарий оболочки, который выглядит следующим образом myprog:

#!/bin/sh
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
`dirname $0`/myprog-exe

Таким образом, когда кто-то запускает myprog, он действительно запускает сценарий оболочкикоторый затем запускает myprog.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...