Anmeldung
In dieser Artikelserie erfahren Sie, wie Sie eine AppImage-Datei erstellen.
Das erste Kapitel konzentriert sich darauf, ausführbare Dateien unabhängig vom System auszuführen. Sie sollten über fortgeschrittene Kenntnisse von GNU/Linux verfügen, um diesen Abschnitt klar zu verstehen.
Statisches und dynamisches binäres Konzept
Ein statisch kompilierter Code kann ohne zusätzliche Bibliotheken ausgeführt werden. Um zu verstehen, ob eine Datei statisch ist oder nicht, müssen wir uns diese Datei mit dem Befehl ldd ansehen.
$ 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)
Wie hier zu sehen, ist unsere Datei als dynamisch kompiliert, sodass ihre Abhängigkeiten aufgelistet sind. Wenn unsere Datei als statisch kompiliert wurde, sollten wir eine Ausgabe wie die folgende erhalten haben.
$ ldd test.bin ist keine dynamische ausführbare Datei
libc- und interpreterkonzept
Alle dynamisch kompilierten Dateien sind grundsätzlich libc.so.6 ve ld-linux-x86-64.so.2 braucht Abhängigkeiten. aus diesen Dateien libc.so.6 Es ist eine grundlegende C-Bibliothek. Dank dieser Bibliothek kann das Programm seine Grundfunktionen ausführen. ld-linux-x86-64.so.2 ist der Interpreter und bestimmt, wie die Datei ausgeführt wird. Um herauszufinden, mit welchem Interpreter eine Datei funktioniert Datei Wir können den Befehl verwenden. linux-vdso.so.1 wird vom Kernel bereitgestellt und ist nicht als Datei verfügbar.
$ file /bin/bash /bin/bash: ELF 64-Bit LSB Pie ausführbar, x86-64, Version 1 (SYSV), dynamisch verlinkt, Interpreter /lib64/ld-linux-x86-64.so.2, für GNU /Linux 3.2.0, entfernt
LD_LIBRARY_PATH-Konzept
Die Abhängigkeit einer ausführbaren Datei muss normalerweise auf dem System installiert werden. In einigen Fällen muss es sich jedoch möglicherweise an einem anderen Ort als den Systemverzeichnissen befinden. In ähnlichen Fällen LD_LIBRARY_PATH Durch die Definition der Umgebungsvariablen wird der Ort des zusätzlichen Verzeichnisses angegeben, in dem die Bibliothek durchsucht wird.
$ ldd test.bin linux-vdso.so.1 (0x00007ffc1c5c5000) libtest.so => nicht gefunden libc.so.6 => /lib64/libc.so.6 (0x00007feaab862000) /lib64/ld-linux-x86 -64 .so.2 (0x00007feaaba76000)
Im obigen Beispiel libtest.so In unserer ldd-Ausgabe ist eine Warnung aufgetreten, da die Datei im System nicht gefunden werden konnte. Lassen Sie uns nun den gleichen Prozess noch einmal versuchen, indem wir unsere Umgebungsvariable definieren.
$ 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)
Wie Sie sehen können, hat es die Bibliothek in dem von uns definierten Verzeichnis gefunden.
Wenn wir auf diese Weise alle Abhängigkeiten einer Datei in ein Verzeichnis kopieren, können wir diese Datei unabhängig vom System ausführen.
$ 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) # Jetzt kopieren wir alle Dateien in ein Verzeichnis namens libs. $ mkdir libs $ ldd /bin/bash | Schnitt -f3 -d" " | grep "^/" | sed "s/.*/install & libs\//g" | sh # Sie können den obigen Befehl verwenden, um Abhängigkeiten stapelweise zu kopieren. $ ls libs libc.so.6 libreadline.so.8 libtinfo.so.6 libtinfow.so.6 # Lassen Sie uns nun unsere Umgebungsvariable definieren. 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)
Im obigen Beispiel haben wir alle Abhängigkeiten von ihrem Speicherort im System gezogen und sie in ein separates Verzeichnis kopiert und von diesem Verzeichnis aus verfügbar gemacht. Falls Sie hier bemerkt haben, dass wir den Interpreter nicht kopiert haben. Dies liegt daran, dass der Interpreter von der Datei aufgerufen wird, wenn wir die Datei ausführen. Um diese Situation zu überwinden, kopieren wir auch den Interpreter und die auszuführende Datei und führen sie wie folgt aus.
$ 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, Version 5.1.16(1)-release (x86_64-pc-linux-gnu) ...
Jetzt ist es möglich, unser Programm auf jedem System mit all seinen Abhängigkeiten auszuführen.
Zum Rest unseres Artikels von hier Sie können zu erreichen.