Mon
Dans cette série d'articles, on vous expliquera comment créer un fichier appimage.
Le premier chapitre se concentrera sur l'exécution d'exécutables indépendamment du système. Vous devez avoir une connaissance intermédiaire de gnu/linux pour comprendre clairement cette section.
Concept binaire statique et dynamique
Un code compilé statiquement peut s'exécuter sans avoir besoin de bibliothèques supplémentaires. Pour comprendre si un fichier est statique ou non, nous devons examiner ce fichier avec la commande 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)
Comme on le voit ici, notre fichier est compilé en dynamique, donc ses dépendances sont répertoriées. Si notre fichier a été compilé en tant que statique, nous aurions dû obtenir une sortie comme celle ci-dessous.
$ ldd test.bin n'est pas un exécutable dynamique
concept libc et interpréteur
Tous les fichiers compilés dynamiquement sont essentiellement libc.so.6 ve ld-linux-x86-64.so.2 a besoin de dépendances. à partir de ces fichiers libc.so.6 C'est une bibliothèque C de base. Grâce à cette bibliothèque, le programme devient capable d'exécuter ses fonctions de base. ld-linux-x86-64.so.2 est l'interpréteur et détermine comment le fichier sera exécuté. Pour trouver avec quel interpréteur un fichier fonctionne filet Nous pouvons utiliser la commande. linux-vdso.so.1 est fourni par le noyau et n'est disponible dans aucun fichier.
$ fichier /bin/bash /bin/bash : exécutable ELF 64-bit LSB pie, x86-64, version 1 (SYSV), lié dynamiquement, interpréteur /lib64/ld-linux-x86-64.so.2, pour GNU /Linux 3.2.0, dépouillé
Concept LD_LIBRARY_PATH
La dépendance d'un exécutable doit généralement être installée sur le système. Cependant, dans certains cas, il peut être nécessaire de le placer dans un emplacement différent de celui des répertoires système. Dans des cas similaires LD_LIBRARY_PATH En définissant la variable d'environnement, l'emplacement du répertoire supplémentaire dans lequel la bibliothèque sera recherchée est spécifié.
$ ldd test.bin linux-vdso.so.1 (0x00007ffc1c5c5000) libtest.so => not found libc.so.6 => /lib64/libc.so.6 (0x00007feaab862000) /lib64/ld-linux-x86 -64 .so.2 (0x00007feaaba76000)
Dans l'exemple ci-dessus libtest.so Nous avons rencontré un avertissement dans notre sortie ldd car le fichier est introuvable dans le système. Essayons maintenant le même processus en définissant notre variable d'environnement.
$ 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)
Comme vous pouvez le voir, il a trouvé la bibliothèque dans le répertoire que nous avons défini.
De cette façon, si nous copions toutes les dépendances d'un fichier dans un répertoire, nous pouvons exécuter ce fichier indépendamment du système.
$ 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) # Maintenant, copions tous les fichiers dans un répertoire appelé libs. $ bibliothèques mkdir $ ldd /bin/bash | couper -f3 -d" " | grep "^/" | sed "s/.*/install & libs\//g" | sh # Vous pouvez utiliser la commande ci-dessus pour copier par lots les dépendances. $ ls libs libc.so.6 libreadline.so.8 libtinfo.so.6 libtinfow.so.6 # Définissons maintenant notre variable d'environnement. 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)
Dans l'exemple ci-dessus, nous avons extrait toutes les dépendances de leur emplacement dans le système et les avons copiées dans un répertoire séparé et leur avons fait l'utiliser à partir de ce répertoire. Si vous avez remarqué ici, nous n'avons pas copié l'interprète. C'est parce que l'interpréteur est appelé par le fichier lorsque nous exécutons le fichier. Pour surmonter cette situation, copions également l'interpréteur et le fichier à exécuter et exécutons-le comme suit.
$ 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) ...
Il est maintenant possible d'exécuter notre programme sur n'importe quel système avec toutes ses dépendances.
Vers la suite de notre article à partir d'ici Vous pouvez rejoindre.