2018-06-30


PatchELF,set rpath to shared libraries

Чрез Patchelf при определени условия може да се промени пътят към споделени, (shared libraries) ,от които зависи изпълним bin файл в дадена Linux система.Те са белязани с разширение (.so), последвано от версия на библиотеката.Ако липсват определени такива, може да се поставят в папка, след което да се посочи път към тях. Понякога това е за предпочитене пред задаване, манипулиране на custom path във файла /home/*/.bash_profile или /home/*/.profile, както е именуван там. Променливите на средата environment variables се дефинират в профила на потребителската директория или /etc/environment.
Преди известно време ползвах програмата,за да събера работеща версия на vlc.appImage за CentOS 6.0 (след чиста инсталация). Послужих си с 📎️ bsdtar за разархивиране на appImage файла... или например, изпълнение в терминал от директория в която се намира той. След това проверка кои зависимости отсъстват при unpacking-а. Десен бутон върху директорията съдържаща изпълнимия vlc bin (open in terminal)
./vlc.appImage --appimage-extract

[nick@localhost bin]$ ldd vlc
linux-vdso.so.1 => (0x00007fffef3ff000)
libvlc.so.5 => not found
libvlccore.so.8 => not found
librt.so.1 => /lib64/librt.so.1 (0x00000030ecc00000)
libm.so.6 => /lib64/libm.so.6 (0x00000030ec800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030ec400000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000030ebc00000)
libc.so.6 => /lib64/libc.so.6 (0x00000030ec000000)
/lib64/ld-linux-x86-64.so.2 (0x00000030eb800000)
Вижда се, че ldd отпечатва информация за липсващите libvlc.so.5 и libvlccore.so.8. При опит за стартиране на софтуера в терминален емулатор би се появило съобщение с подобно предупреждение "...missing shared libraries"...Конкретно в този случай помага инструмент като patchelf, който чрез rpath "показва пътя" към тези библиотеки, като кодира нови стойности в хедъра на изпълнимия файл.На 64-битови Linux системи интерпретаторът трябва да бъде /lib64/ld-linux-x86-64.so.2. 📎️ ELF binaries. Синтаксиса не се различава от Linux логиката в терминала.
[nick@localhost bin]$ patchelf --set-rpath /home/nick/app/usr/lib  /home/nick/app/usr/bin/vlc
Където, /home/nick/app/usr/lib е път към липсващите библиотеки (папка lib), /home/nick/app/usr/bin/vlc е път към изпълнимия файл vlc, намиращ се в папка bin. По подразбиране Linux не търси изпълними файлове в home. За да стартира програмата през терминал, преди името трябва да се използва префикса ./ Отдавна този media player зависи от Qt ,затова след всичко е нужна инсталацията на пакета qt-x11. Към него са закачени няколко зависимости. Излишните може да се премахнат безпроблемно след това. Реално са нужни qt toolkit и gstreamer phonon backend. Лесно се обработват чрез пакетния менажер на CentOS.
EDIT:
Разбира се, за да се гледа H.265(HEVC) видео на CentOS 6.0, може да се инсталира mplayer от source code, както е описано тук: 📎️ "linuxfromscratch.org.multimedia/mplayer". При конфигурирането са нужни определени група пакети:
[nick@localhost bin]# yum groupinstall Development Tools
Трябва да се има предвид, че програмите компилирани от сорс не се съобразяват със зависимостите в Linux, докато developer-ите на пакети го правят, така че винаги имам едно на ум за това.
EDIT:
В CentOS 6.0 по подразбиране няма потребител със sudo права.Съществуващия трябва да се присъедини към групата "video", иначе няма да има достъп до framebuffer. Това важи при условие,че mplayer се инсталира в /user/local/bin, а не директно в /usr/bin. Относно fuse може да се види на този адрес: 📎️ /appimagekit/fuse
GNU ld - "компилиращ линкер"
📎️ https://manned.org/ld.1
📎️ https://linux.die.net/man/1/ld
📎️ https://www.gnu.org/software/binutils/
ld.so(8) - "изпълним линкер"
📎️ https://man7.org/linux/man-pages/man8/ld.so.8.html
EDIT:
По-долу,полезни анализи,документация относно изграждането на преносими, изпълними файлове в Линукс.
https://github.com/JonathonReinhart/staticx Linux
Тагове: "GLIBC ,enable/disable-new-dtags, Library rpath $ORIGIN, NODEFLIB"
📎️ коментарите към кода...Link
📎️ "When the object has the RUNPATH information we don't use any RPATHs"
📎️ "Одитирайте библиотеките, за проблемен RPATH/RUNPATH при изграждане"
📎️ Link , 📎️ Link
https://staticx.readthedocs.io/en/latest/rpath.html

Published by Nikolay Dimitrov - Thursday June 30, 2018

Tags : промяна на път към динамични библиотеки в Linux , mplayer достъп до framebuffer ,
CentOS6,плейване на H.265(HEVC)видео...

Няма коментари :

Публикуване на коментар

Забележка: Само членове на този блог могат да публикуват коментари.