Я недавно столкнулся с этой проблемой после обновления системы: использование параметра GCC -Wl,-rpath=
работает иначе, чем раньше.
Я использовал его, чтобы задать пути поиска для некоторых общих библиотек, которые были встроены вподмодуль моего проекта.В то время я считал, что это лучше, чем настройка LD_LIBRARY_PATH
для всей системы (я не хотел устанавливать ее каждый раз при включении компьютера).Все работало нормально, и эти два подхода казались эквивалентными.
Теперь кажется, что поведение -rpath
изменилось.Он по-прежнему работает для напрямую зависимых библиотек, но не для тех, которые связывают другие библиотеки из того же каталога, установленного через -rpath=
.Экспорт LD_LIBRARY_PATH
по-прежнему работает как прежде.
Я проверил вывод компиляции, используя readelf
, и есть разница.Перед обновлением (Linux Mint 18.2 с GCC 5.4) динамическая секция имела следующую строку:
0x000000000000000f (RPATH) Library rpath: [submod/lib]
После обновления (Linux Mint 19 с GCC 7.3) строка изменилась на:
0x000000000000001d (RUNPATH) Library runpath: [submod/lib]
В использовать RPATH, но не RUNPATH? предполагается, что RPATH был заменен на RUNPATH (или что он, по крайней мере, обслуживает другое назначение, поскольку имеет более низкий приоритет), но это нене дает ответа относительно того, почему это влияет на косвенные ссылки.Сами библиотеки не имеют ни RPATH, ни RUNPATH в выводе readelf
.
Поэтому мой вопрос таков: Почему компоновщик вдруг начал интерпретировать опцию -rpath=
по-другому, и есть ли способзаставить старое поведение? (или сделать что-то другое, что приведет к эквивалентному результату.)
Другой вопрос будет: Можно ли сказать старой версии компоновщика создать новуювывод (т.е. RUNPATH вместо RPATH)?
РЕДАКТИРОВАТЬ
Это не дубликат Как установить RunPath двоичного файла? - у меня вопрос наоборот: я хочу поведение RPATH.Я понял это (благодаря подсказке в комментарии), и я отвечу на мои вопросы здесь.