Назад | Перейти на главную страницу

Как сделать так, чтобы исполняемые файлы находили библиотеки после перемещения?

Я пытаюсь создать RPM для GNU libiconv

У меня нет проблем с компиляцией исходного кода, но когда я устанавливаю во временное место, полный временный путь к разделяемой библиотеке жестко закодирован в исполняемый файл iconv.

Я пробовал добавить --disable-rpath к команде configure, поскольку в ней говорится: «не жестко кодируйте пути к библиотекам времени выполнения», но это, похоже, не работает.

Моя команда сборки выглядит так:

./configure --prefix=/usr/local --disable-rpath && \
make && \
make DESTDIR=/tmp/path install

Бег ldd /tmp/path/usr/local/bin/iconv Я вижу путь к /tmp/path/usr/local/lib/libiconv.so.2 жестко запрограммирован

Как я могу гарантировать, что исполняемый файл ищет библиотеки в их конечном месте назначения в /usr/local/lib а не искать их там, где они построены?

После того, как я полностью не смог избежать rpaths в исполняемом файле, я впоследствии исправил его, используя chrpath программа.

Мне пришлось сделать это в два этапа, чтобы задать окончательный путь, а также избежать сбоя rpmbuild на этапе check-rpaths.

Я закончил с этим после make:

make DESTDIR=/tmp/path install
chrpath --replace /usr/local/lib /tmp/path/usr/local/bin/iconv
chrpath --convert /tmp/path/usr/local/bin/iconv

Я обнаружил chrpath во время чтения Рекомендации Fedora по упаковке. Хотя я на CentOS.

У меня это работает, хотя, вероятно, это не лучший способ. Моя неспособность создать исполняемый файл без жестко запрограммированных путей выше меня. Возможно, это как-то связано со способом создания исполняемого файла iconv. На самом деле он построен на make install stage по какой-то причине требует установки собственных библиотек.