Я пытаюсь создать 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 по какой-то причине требует установки собственных библиотек.