Iniciar sesión
En esta serie de artículos, se le explicará cómo crear un archivo de imagen de aplicación.
El primer capítulo se centrará en la ejecución de ejecutables independientemente del sistema. Debes tener conocimientos intermedios de gnu/linux para entender claramente esta sección.
Concepto binario estático y dinámico
Un código compilado estáticamente puede ejecutarse sin necesidad de bibliotecas adicionales. Para entender si un archivo es estático o no, debemos mirar ese archivo con el 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)
Como se ve aquí, nuestro archivo se compila como dinámico, por lo que se enumeran sus dependencias. Si nuestro archivo se compiló como estático, deberíamos haber obtenido un resultado como el que se muestra a continuación.
$ ldd test.bin no es un ejecutable dinámico
concepto de libc e intérprete
Todos los archivos compilados dinámicamente son básicamente libc.so.6 ve ld-linux-x86-64.so.2 necesita dependencias. de estos archivos libc.so.6 Es una biblioteca básica de C. Gracias a esta biblioteca, el programa puede realizar sus funciones básicas. ld-linux-x86-64.so.2 es el intérprete y determina cómo se ejecutará el archivo. Para encontrar con qué intérprete funciona un archivo presentar Podemos usar el comando. linux-vdso.so.1 lo proporciona el kernel y no está disponible como ningún archivo.
$ archivo /bin/bash /bin/bash: ejecutable circular LSB de 64 bits ELF, x86-64, versión 1 (SYSV), vinculado dinámicamente, intérprete /lib64/ld-linux-x86-64.so.2, para GNU /Linux 3.2.0, despojado
concepto LD_LIBRARY_PATH
La dependencia de un ejecutable generalmente debe estar instalada en el sistema. Sin embargo, en algunos casos, es posible que deba ubicarse en una ubicación diferente a los directorios del sistema. En casos similares LD_LIBRARY_PATH Al definir la variable ambiental, se especifica la ubicación del directorio adicional donde se buscará la biblioteca.
$ ldd test.bin linux-vdso.so.1 (0x00007ffc1c5c5000) libtest.so => no encontrado libc.so.6 => /lib64/libc.so.6 (0x00007feaab862000) /lib64/ld-linux-x86 -64 .so.2 (0x00007feaaba76000)
En el ejemplo anterior libtest.so Encontramos una advertencia en nuestra salida ldd porque el archivo no se pudo encontrar en el sistema. Ahora intentemos el mismo proceso de nuevo definiendo nuestra variable ambiental.
$ 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)
Como puede ver, encontró la biblioteca en el directorio que definimos.
De esta forma, si copiamos todas las dependencias de un archivo a un directorio, podemos ejecutar ese archivo independientemente del 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) # Ahora copiemos todos los archivos a un directorio llamado libs. $ mkdir librerías $ ldd /bin/bash | cortar -f3 -d" " | grep "^/" | sed "s/.*/instalar & libs\//g" | sh # Puede usar el comando anterior para copiar dependencias por lotes. $ ls libs libc.so.6 libreadline.so.8 libtinfo.so.6 libtinfow.so.6 # Ahora definamos nuestra variable ambiental. exportar 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 => /inicio/usuario/prueba/libs/libtinfo.so.6 (0x00007fd9ce7ab000) libc.so.6 => /inicio/usuario/prueba/libs/libc.so.6 (0x00007fd9ce5b2000) libtinfow.so.6 => /home/usuario/prueba/libs/libtinfow.so.6 (0x00007fd9ce572000) /lib64/ld-linux-x86-64.so.2 (0x00007fd9ce926000)
En el ejemplo anterior, extrajimos todas las dependencias de su ubicación en el sistema y las copiamos en un directorio separado y las usamos desde ese directorio. Si te has dado cuenta aquí, no copiamos al intérprete. Esto se debe a que el archivo llama al intérprete cuando lo ejecutamos. Para superar esta situación, también copiemos el intérprete y el archivo que se ejecutará y ejecútelo de la siguiente manera.
$ install /bin/bash ./ $ install /lib64/ld-linux-x86-64.so.2 ./ $ ./ld-linux-x86-64.so.2 --library-path "/home/user /test/libs/" ./bash --versión GNU bash, versión 5.1.16(1)-release (x86_64-pc-linux-gnu) ...
Ahora es posible ejecutar nuestro programa en cualquier sistema con todas sus dependencias.
Al resto de nuestro artículo desde aquí Se puede llegar.