accesso
In questa serie di articoli, ti verrà spiegato come creare un file appimage.
Il primo capitolo si concentrerà sull'esecuzione di eseguibili indipendentemente dal sistema. Dovresti avere una conoscenza intermedia di gnu/linux per comprendere chiaramente questa sezione.
Concetto binario statico e dinamico
Un codice compilato staticamente può essere eseguito senza la necessità di librerie aggiuntive. Per capire se un file è statico o meno, dobbiamo guardare quel file con il comando ldd.
$ 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)
Come visto qui, il nostro file è compilato come dinamico, quindi le sue dipendenze sono elencate. Se il nostro file è stato compilato come statico, avremmo dovuto ottenere un output come quello qui sotto.
$ ldd test.bin non è un eseguibile dinamico
concetto di libc e interprete
Tutti i file compilati dinamicamente sono fondamentalmente libc.so.6 ve ld-linux-x86-64.so.2 necessita di dipendenze. da questi file libc.so.6 È una libreria C di base. Grazie a questa libreria, il programma diventa in grado di svolgere le sue funzioni di base. ld-linux-x86-64.so.2 è l'interprete e determina come verrà eseguito il file. Per trovare con quale interprete funziona un file filetto Possiamo usare il comando. linux-vdso.so.1 è fornito dal kernel e non è disponibile come file.
$ file /bin/bash /bin/bash: ELF 64-bit LSB pie eseguibile, x86-64, versione 1 (SYSV), collegato dinamicamente, interprete /lib64/ld-linux-x86-64.so.2, per GNU /Linux 3.2.0, rimosso
concetto LD_LIBRARY_PATH
La dipendenza di un eseguibile deve essere solitamente installata sul sistema. Tuttavia, in alcuni casi, potrebbe essere necessario trovarlo in una posizione diversa rispetto alle directory di sistema. In casi simili LD_LIBRARY_PATH Definendo la variabile ambientale, viene specificata la posizione della directory aggiuntiva in cui verrà eseguita la ricerca nella libreria.
$ ldd test.bin linux-vdso.so.1 (0x00007ffc1c5c5000) libtest.so => non trovato libc.so.6 => /lib64/libc.so.6 (0x00007feaab862000) /lib64/ld-linux-x86 -64 .so.2 (0x00007feaaba76000)
Nell'esempio sopra libtest.so Abbiamo riscontrato un avviso nel nostro output ldd perché non è stato possibile trovare il file nel sistema. Ora riproviamo lo stesso processo definendo la nostra variabile ambientale.
$ 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)
Come puoi vedere, ha trovato la libreria nella directory che abbiamo definito.
In questo modo, se copiamo tutte le dipendenze di un file in una directory, possiamo eseguire quel file indipendentemente dal sistema.
$ ldd /bin/bash linux-vdso.so.1 (0x00007fff2c359000) libreadline.so.8 => /lib64/libreadline.so.8 (0x00007fce1e004000) libtinfo.so.6 => /lib64/libtinfo.so.6 ( 0x00007fce1dfc5000) libc.so.6 => /lib64/libc.so.6 (0x00007fce1ddcc000) libtinfow.so.6 => /lib64/libtinfow.so.6 (0x00007fce1dd8c000) /lib64/ld-linux-x86-64.so .2 (0x00007fce1e154000) # Ora copiamo tutti i file in una directory chiamata libs. $ mkdir libs $ ldd /bin/bash | taglia -f3 -d" " | grep "^/" | sed "s/.*/install & libs\//g" | sh # È possibile utilizzare il comando precedente per copiare in batch le dipendenze. $ ls libs libc.so.6 libreadline.so.8 libtinfo.so.6 libtinfow.so.6 # Ora definiamo la nostra variabile ambientale. export LD_LIBRARY_PATH=/home/user/test/libs/ $ ldd /bin/bash linux-vdso.so.1 (0x00007ffdeddc6000) libreadline.so.8 => /home/user/test/libs/libreadline.so.8 ( 0x00007fd9ce7ea000) libtinfo.so.6 => /home/user/test/libs/libtinfo.so.6 (0x00007fd9ce7ab000) libc.so.6 => /home/user/test/libs/libc.so.6 (0x00007fd9ce5b2000) libtinfow.so.6 => /home/user/test/libs/libtinfow.so.6 (0x00007fd9ce572000) /lib64/ld-linux-x86-64.so.2 (0x00007fd9ce926000)
Nell'esempio sopra, abbiamo estratto tutte le dipendenze dalla loro posizione nel sistema e le abbiamo copiate in una directory separata e le abbiamo rese disponibili da quella directory. Se hai notato qui, non abbiamo copiato l'interprete. Questo perché l'interprete viene chiamato dal file quando eseguiamo il file. Per ovviare a questa situazione, copiamo anche l'interprete e il file da eseguire ed eseguiamolo come segue.
$ install /bin/bash ./ $ install /lib64/ld-linux-x86-64.so.2 ./ $ ./ld-linux-x86-64.so.2 --library-path "/home/user /test/libs/" ./bash --version GNU bash, versione 5.1.16(1)-release (x86_64-pc-linux-gnu) ...
Ora è possibile eseguire il nostro programma su qualsiasi sistema con tutte le sue dipendenze.
Al resto del nostro articolo da qui Si può raggiungere.