четверг, 29 января 2015 г.

Solaris: CRLE vs LD_LIBRARY_PATH

В случае с Solaris x86/64 с двумя ядрами и ABI (32 и 64 bit) задание LD_LIBRARY_PATH не только неудобно и может привести к проблемам при выполнении кода обеих видов, но еще и небезопасно.

Соответственно, если вы, например, имеете ядро 64 бита и смешанный код, скажем, установленный из OpenCSW и собранный собственноручно, вам нужно обеспечить доступность библиотек обеих разрядностей.

Библиотеки OpenCSW установлены в двух смежных директориях: /opt/csw/lib и /opt/csw/lib/64. 

Повторюсь, в этом случае LD_LIBRARY_PATH не только приводит к проблемам при сборке, но еще и вызовет путаницу в загрузке одноименных библиотек разной разрядности.

Способ 1, костыльный. Можно написать скрипты-wrapper'ы, где прямо перед вызовом будет задаваться LD_LIBRARY_PATH с нужными значениями.

Способ 2, опасный. Можно задать максимально полный LD_LIBRARY_PATH в /etc/profile. И поиметь проблемы с совместимостью бинарного кода и безопасностью.

Способ 3, правильный. Создайте конфигурационные файлы линковщика времени выполнения с необходимыми путями к библиотекам:


crle -c /var/ld/ld.config -l /lib:/usr/lib:/usr/local/lib:/opt/csw/lib:/usr/sfw/lib
crle -64 -c /var/ld/64/ld.config -l /lib/64:/usr/lib/64:/opt/csw/lib/64:/usr/sfw/lib/64

Получите два конфигурационных файла в /var/ld и больше никаких разночтений с библиотеками:


root @ fhtagn / # crle -c /var/ld/ld.config -l /lib:/usr/lib:/usr/local/lib:/opt/csw/lib:/usr/sfw/lib
root @ fhtagn / # crle -64 -c /var/ld/64/ld.config -l /lib/64:/usr/lib/64:/opt/csw/lib/64:/usr/sfw/lib/64
root @ fhtagn / # 
root @ fhtagn / # crle



Configuration file [version 4]: /var/ld/ld.config 
Platform: 32-bit LSB 80386
Default Library Path (ELF): /lib:/usr/lib:/usr/local/lib:/opt/csw/lib:/usr/sfw/lib
Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default)

Command line:
crle -c /var/ld/ld.config -l /lib:/usr/lib:/usr/local/lib:/opt/csw/lib:/usr/sfw/lib

root @ fhtagn / # crle -64

Configuration file [version 4]: /var/ld/64/ld.config 
Platform: 64-bit LSB AMD64
Default Library Path (ELF): /lib/64:/usr/lib/64:/opt/csw/lib/64:/usr/sfw/lib/64
Trusted Directories (ELF): /lib/secure/64:/usr/lib/secure/64 (system default)

Command line:
crle -64 -c /var/ld/64/ld.config -l /lib/64:/usr/lib/64:/opt/csw/lib/64:/usr/sfw/lib/64

root @ fhtagn / #

Вот и все, ребята! :)

PS. Не трогайте дефолтные пути системных библиотек, они должны присутствовать. А то пожалеете! :)