Giriş

Bu məqalə seriyasında sizə appimage faylını necə düzəltməyiniz izah ediləcək.

Birinci fəsildə sistemdən asılı olmayaraq icra olunan faylların işə salınmasına diqqət yetiriləcək. Bu bölməni aydın başa düşmək üçün gnu/linux haqqında orta səviyyədə biliklərə sahib olmalısınız.

Statik və dinamik ikili anlayış

Statik şəkildə tərtib edilmiş kod heç bir əlavə kitabxanaya ehtiyac olmadan işləyə bilər. Faylın statik olub olmadığını anlamaq üçün ldd əmri ilə həmin fayla baxmaq lazımdır.

$ ldd /bin/bash
linux-vdso.so.1 (0x00007ffc8f136000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ff10adcd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff10adc7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff10ac02000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff10af6c000)

Burada göründüyü kimi, faylımız dinamik olaraq tərtib edilmişdir, ona görə də onun asılılıqları siyahıya alınmışdır. Əgər faylımız statik olaraq tərtib edilmişdisə, aşağıdakı kimi bir nəticə əldə etməli idik.

$ ldd test.bin dinamik icra edilə bilən deyil

libc və tərcüməçi konsepsiyası

Bütün dinamik tərtib edilmiş fayllar əsasən libc.so.6 ve ld-linux-x86-64.so.2 asılılıqlara ehtiyacı var. bu fayllardan libc.so.6 Bu, əsas C kitabxanasıdır. Bu kitabxana sayəsində proqram öz əsas funksiyalarını yerinə yetirə bilir. ld-linux-x86-64.so.2 tərcüməçidir və faylın necə işlədiləcəyini müəyyən edir. Faylın hansı tərcüməçi ilə işlədiyini tapmaq üçün fayl əmrindən istifadə edə bilərik. linux-vdso.so.1 kernel tərəfindən təmin edilir və heç bir fayl kimi mövcud deyil.

$ faylı /bin/bash /bin/bash: icra edilə bilən ELF 64-bit LSB pastası, x86-64, versiya 1 (SYSV), dinamik əlaqəli, tərcüməçi /lib64/ld-linux-x86-64.so.2, GNU üçün /Linux 3.2.0, silindi

LD_LIBRARY_PATH konsepsiyası

İcra olunandan asılılıq adətən sistemdə quraşdırılmalıdır. Bununla belə, bəzi hallarda onun sistem qovluqlarından fərqli bir yerdə yerləşdirilməsi tələb oluna bilər. Oxşar hallarda LD_LIBRARY_PATH Ətraf mühit dəyişənini təyin etməklə, kitabxananın axtarılacağı əlavə kataloqun yeri müəyyən edilir.

$ ldd test.bin linux-vdso.so.1 (0x00007ffc1c5c5000) libtest.so => ​​tapılmadı libc.so.6 => /lib64/libc.so.6 (0x00007feaab862000) /lib64/ld-linux-x86 -64 .so.2 (0x00007feaaba76000)

Yuxarıdakı nümunədə libtest.so Fayl sistemdə tapılmadığı üçün ldd çıxışımızda xəbərdarlıqla qarşılaşdıq. İndi ətraf mühit dəyişənimizi təyin edərək eyni prosesi yenidən sınayaq.

$ export LD_LIBRARY_PATH=/home/user/test/libs/
$ ldd test.bin
linux-vdso.so.1 (0x00007ffe22bbc000)
libtest.so => /home/user/test/libs/libtest.so (0x00007f4c97790000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4c97583000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4c9779c000)

Gördüyünüz kimi, müəyyən etdiyimiz kataloqda kitabxana tapdı.

Bu şəkildə bir faylın bütün asılılıqlarını bir kataloqa köçürsək, o faylı sistemdən müstəqil şəkildə işlədə bilərik.

$ ldd /bin/bash linux-vdso.so.1 (0x00007fff2c359000) libreadline.so.8 => /lib64/libreadline.so.8 (0x00007fce1e004000) libtinfo.so.6 => /lib64/lib 6x0fce00007dfc1) libc.so.5000 => /lib6/libc.so.64 (6x0fce00007ddcc1) libtinfow.so.000 => /lib6/libtinfow.so.64 (6x0fce00007ddux1c8ld.-) .000 (64x86fce64e2) # İndi bütün faylları libs adlı qovluğa kopyalayaq. $ mkdir libs $ ldd /bin/bash | cut -f0 -d" " | grep "^/" | sed "s/.*/install & libs\//g" | sh # Asılılıqları toplu surətdə çıxarmaq üçün yuxarıdakı əmrdən istifadə edə bilərsiniz. $ ls libs libc.so.00007 libreadline.so.1 libtinfo.so.154000 libtinfow.so.3 # İndi ətraf mühit dəyişənimizi təyin edək. ixrac LD_LIBRARY_PATH=/home/user/test/libs/ $ ldd /bin/bash linux-vdso.so.6 (8x6ffdeddc6) libreadline.so.1 => /home/user/test/libs/libreadline.so.0 ( 00007x6000fd8ce8ea0) libtinfo.so.00007 => /home/user/test/libs/libtinfo.so.9 (7x000fd6ce6ab0) libc.so.00007 => /home/user/test/libs/libc.so.9 (7x000) libtinfow.so.6 => /home/user/test/libs/libtinfow.so.6 (0x00007fd9ce5) /lib2000/ld-linux-x6-6.so.0 (00007x9fd572000ce64)

Yuxarıdakı misalda biz bütün asılılıqları sistemdəki yerlərindən çıxardıq və ayrı bir qovluğa köçürdük və onu həmin kataloqdan əlçatan etdik. Burada fikir vermisinizsə, tərcüməçini köçürməmişik. Bunun səbəbi, faylı işə saldığımız zaman tərcüməçinin fayl tərəfindən çağırılmasıdır. Bu vəziyyətdən çıxmaq üçün tərcüməçini və işlədiləcək faylı da kopyalayıb aşağıdakı kimi işlədək.

$ install /bin/bash ./ $ install /lib64/ld-linux-x86-64.so.2 ./ $ ./ld-linux-x86-64.so.2 --library-path "/home/user /test/libs/" ./bash --versiya GNU bash, versiya 5.1.16(1)-release (x86_64-pc-linux-gnu) ...

İndi proqramımızı bütün asılılıqları ilə istənilən sistemdə işlətmək mümkündür.

Məqaləmizin qalan hissəsinə buradan çata bilərsiniz.