Вход:  Пароль:  
FreeSource: AltLinux/Sisyphus/devel/ProblemWithVerifyELFAndRPATH ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |
Это старая версия AltLinux/Sisyphus/devel/ProblemWithVerifyELFAndRPATH за 2005-10-21 20:12:59..

Введение в проблему


При сборке wmnetload я столкнулся со следующей ошибкой:



Было два возможных выхода из сложившейся ситуации, даже три:


1) ослабить проверку, добавив в спек %_verify_elf_method relaxed
2) докопаться до истинной причины и решить проблему в корне
3) не собирать wmnetload :-)


Я конечно же выбрал второй вариант и ниже опишу последовательность своих действий, в результате которых удалось избежать этой ошибки. Возможно, что в вашем случае разрешить подобную ошибку придется иным способом, но в моем сработал этот. В любом случае рекомендую вам ознакомиться с материалами, ссылки на которые приведены в конце.

Немного теории


Перед тем как начать что-то делать не плохо бы узнать что такое RPATH и почему /usr/local/lib, присутствующий в нем, является ошибкой.


RPATH — это свойство некоего ELF-объекта (программы или библиотеки) хранить в себе дополнительные пути поиска разделяемых (shared) библиотек. Т.е. программа будет искать so'шку сначала там, куда указывает RPATH, а затем в /lib, /usr/lib и других системных путях, которые указаны в /etc/ld.so.conf. Значение переменный RPATH «зашито» в самой програме и вы можете увидеть его вызвав readelf -a program. Среди множества появившейся информации ищите упоминание про RPATH. Маленькая тонкость: в бинарниках со стандартным значением RPATH вы не найдете упоминания о нем, так как по умолчанию значение у переменной пустое. Для примера приведу часть вывода readelf для все того же wmnetload, скомпилированного с /usr/local/lib в RPATH:



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


Почему RPATH не должен содержать какие-либо пути отличные от стандартных? Потому что все библиотеки должны располагаться в стандартных и отведенных для этого местах, а именно в /usr/lib. «Потому что должны быть веские причины держать разделяемую библиотеку не в /usr/lib и тем более веские держать их в разных местах, ни одно из которых не является /usr/lib» (с) lioka

Поиск источника проблемы


Начал я с того, что по'grep'ал исходники на предмет этого самого RPATH. Все указывало на файл configure.in, в котором я обнаружил следующие строки:



Как видим, RPATH включает в себя $LIBRARY_RPATH. Тогда ищем где и как определяется $LIBRARY_RPATH. Наша цель узнать как в ней оказывается /usr/local/lib и удалить этот путь.



Теперь ищем где же определяется $LIBRARY_SEARCH_PATH:



Вот то что мы искали! Вот откуда «растут ноги» у нашей проблемы. Остается лишь удалить этот путь из RPATH.

Решение проблемы


Как мы выяснили выше для ликвидации проблемы нужно удалить путь /usr/local/lib из $LIBRARY_SEARCH_PATH. Я сделал это так:



Т.е. просто заменил строку sed'ом. Этот код следует вызывать в секции %pre, т.е. до вызова %configure. Также следует не забыть
пересоздать configure-скрипт, вызвав autoconf (%__autoconf).

Благодарности

Смотри также



Страницы, ссылающиеся на данную: AltLinux/Sisyphus/devel/TextRel
AltLinux/Sisyphus/devel/TextRel/libtool


Вы не владеете cтраницей AltLinux/Sisyphus/devel/ProblemWithVerifyELFAndRPATH и поэтому не можете получить список наблюдающих за ней


 
Файлов нет. [Показать файлы/форму]
Один комментарий. [Показать комментарии/форму]