1 minuto(s) de lectura

Descripcion

En muchas ocasiones cuando ejecutamos un ELF, este se queja de que no encuentra una libreria.

Este es por ejemplo, el caso de cuando recibimos el ERROR: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory”, ld-linux.so es una libreria dinamica encargada de cargar o linkar archivos ELF y es parte del sistema operativo y por lo tanto debe estar instalada.

Procedimiento

El primer paso es descubir las dependencias de nuestro archivo ejecutable empleando cualquiera de estas tecnicas:

~]#  file grmon_1.1.61
grmon_1.1.61: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.18, stripped

~]# readelf -a grmon_1.1.61 | grep ELF
ELF Header:
    Class:                           ELF32

~]# objdump -f grmon_1.1.61
grmon_1.1.61:     formato del fichero elf32-i386
arquitectura: i386, opciones 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
dirección de inicio 0x0805fd00

Aqui ya observamos que se trata de un archivo ejecutable de 32bits (soporte eliminado en kernel modernos) y que necesita /lib/ld-linux.so.2.

Para obtener una lista de todas las dependencias del ejecutable empleamos readelf:

~]# readelf -a grmon | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [librt.so.1]
 0x00000001 (NEEDED)                     Shared library: [libz.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

o bien empleando ldd como ya vimos en Ejecutar programas i686 en fedora: Usamos ldd para mostrar las librerias dinamicas que necesita el ejecutable.

~]#  ldd grmon_1.1.61
        linux-gate.so.1 (0xf7ece000)
        libm.so.6 => /lib/libm.so.6 (0xf7dee000)
        libdl.so.2 => /lib/libdl.so.2 (0xf7de9000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xf7de4000)
        librt.so.1 => /lib/librt.so.1 (0xf7ddf000)
        libz.so.1 => /lib/libz.so.1 (0xf7dc5000)
        libc.so.6 => /lib/libc.so.6 (0xf7bcf000)
        /lib/ld-linux.so.2 (0xf7ed0000)

Resolviendo la dependencia

Ahora debemos localizar paquetes que inluyan las liberias que necesitamos, por ejemplo libz.so.1:

~]# yum provides libz.so.1
Last metadata expiration check: 0:50:48 ago on Thu 03 Aug 2023 11:42:27 AM CEST.
zlib-1.2.12-5.fc37.i686 : Compression and decompression library
Repo        : fedora
Matched from:
Provide    : libz.so.1

El paquete sera zlib-1.2-12-5.fc37.i686 y procedemos a instalarlo con nuestro gestor de paquetes.

Conclusion

GRMON esta listo para usar en nuestro Fedora 35.

Referencias

Linux Kernel Versions: 32-Bit vs 64-Bit

Check if a Library is 32-Bit or 64-Bit

Ejecutar programas i686 en fedora