Но нет никакой причины добавлять системный путь в жестко запрограммированную RUNPATH.
Не так. Большинство систем имеют несколько каталогов в пути поиска библиотеки по умолчанию, и фактически путь поиска иногда изменяется при установке или удалении программного обеспечения. Помещение каталога (-ies), в котором указанная системная библиотека фактически находилась во время соединения, в RUNPATH для данного двоичного файла делает этот двоичный файл более устойчивым к динамическому связыванию какой-либо другой библиотеки с тем же именем во время выполнения. Это также может немного ускорить динамическое связывание c.
Более того, RUNPATH двоичного файла имеет меньший приоритет при динамическом связывании c, чем переменная окружения LD_LIBRARY_PATH
, поэтому вы можете переопределить RUNPATH
во время выполнения в ситуациях такой как тот, который вы описываете. В этом весь смысл наличия RUNPATH
в дополнение к RPATH
, который имеет более высокий приоритет, чем LD_LIBRARY_PATH
.
Во время тестирования (проверки) MPFR libtool добавляет систему путь к rpath до пути тестирования, то есть:
0x000000000000001d (RUNPATH) Путь к библиотеке: [/usr/lib:/LFSC/native/src/bmpfr/src/.libs]
Полагаю, вы имеете в виду, что система сборки помещает такие записи в программы и библиотеки, которые встроены в дерево сборки. Libtool обычно изменяет записи пути выполнения, когда работает в режиме (переустановки) (который частично зависит от файлов .la). Не следует ожидать появления каталогов дерева компоновки в пути выполнения программы или библиотеки после того, как они правильно установлены в системе.
Обратите также внимание, что это RUNPATH
, а не RPATH
. Как упоминалось выше, это не одно и то же.
В результате тесты могут запускать установленные библиотеки (по первому пути (системе)) вместо тестовых. Обычно это происходит при переустановке программного обеспечения. Возможно, это влияет на установку обновлений.
Если это происходит, когда вы запускаете make check
или когда вы запускаете программы через libtool
, работающие в режиме «execute», то вам следует поднять проблему с MPFR о Это. Это не проблема, если это происходит только при непосредственном запуске неустановленных тестовых программ (но см. Также ниже).
Есть ли способ решить эту проблему без удаления .la файлы?
Вообще говоря, следует ожидать установки LD_LIBRARY_PATH
для запуска неустановленных программ или динамического связывания с неустановленными библиотеками. make check
должен автоматически принять соответствующие меры, и в системе сборки, которая использует libtool, это может принять форму запуска двоичных файлов через libtool. Как правило, система сборки на основе Autotools фактически создает сценарии-оболочки для встроенных двоичных файлов, чтобы сделать это максимально прозрачным.
При этом удаление файлов .la
не обязательно является необоснованным. У Libtool есть веские причины для их создания, но остаточная выгода от их установки в системе вместе с самими библиотеками может не компенсировать недостатки. RedHat, например, долгое время придерживался мнения, что этого не происходит, поэтому фактически он не включает файлы .la в свои пакеты RPM, и в его рекомендациях по упаковке указано, что сторонние упаковщики также не должны этого делать.
В конечном итоге, если вы хотите сохранить внешние файлы .la неизмененными, но избегать libtool
извлечения из них записей RUNPATH при связывании, тогда ваша основная альтернатива - изменить сценарий libtool
проекта. Детали в значительной степени зависят от того, какую версию libtool использует проект.