GNU/Linux >> Tutoriales Linux >  >> Linux

¿Recibe el mensaje "no encontrado" cuando se ejecuta un binario de 32 bits en un sistema de 64 bits?

Actualmente tengo un problema extraño en Debian (wheezy/amd64).

He creado un chroot para instalar un servidor (no puedo dar más detalles al respecto, lo siento). Llamemos a su ruta /chr_path/ .
Para facilitar las cosas, he inicializado este chroot con un debootstrap (también sibilante/amd64).

Todo parecía funcionar bien dentro de chroot, pero cuando inicié el script de instalación de mi servidor, obtuve:
zsh: Not found /some_path/perl (el instalador incluye un binario perl por algunas razones)

Naturalmente, revisé el /some_path/ ubicación y encontré el binario "perl". file en el entorno chroot devuelve:

/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

El archivo existe, parece estar bien, tiene los derechos correctos. Puedo usar file , ls , vim en él, pero tan pronto como intento ejecutarlo – ./perl por ejemplo, obtengo:zsh: Not found ./perl .

Esta situación es bastante comprensible para mí. Además:

  • Puedo ejecutar otros binarios básicos (/bin/ls,...) en el chroot sin obtener errores
  • Tengo los mismos problemas con otros binarios que vienen con el proyecto
  • Cuando intento ejecutar el binario desde la raíz principal (/chr_path/some_path/perl ), funciona.
  • He intentado poner uno de los binarios con una copia de mi ls . Verifiqué que los derechos de acceso fueran los mismos pero esto no cambió nada (uno funcionaba y el otro no)

Respuesta aceptada:

Cuando falla al ejecutar un archivo que depende de un "cargador", el error que obtiene puede referirse al cargador en lugar del archivo que está ejecutando.

  • El cargador de un ejecutable nativo enlazado dinámicamente es la parte del sistema responsable de cargar bibliotecas dinámicas. Es algo como /lib/ld.so o /lib/ld-linux.so.2 , y debe ser un archivo ejecutable.
  • El cargador de un script es el programa mencionado en la línea shebang, p. /bin/sh para un script que comienza con #!/bin/sh . (Bash y zsh dan un mensaje de "intérprete incorrecto" en lugar de "comando no encontrado" en este caso).

El mensaje de error es bastante engañoso al no indicar que el cargador es el problema. Desafortunadamente, solucionar esto sería difícil porque la interfaz del kernel solo tiene espacio para informar un código de error numérico, no para indicar también que el error en realidad se refiere a un archivo diferente. Algunos shells hacen el trabajo por sí mismos para los scripts (leyendo el #! línea en el script y volver a trabajar en la condición de error), pero ninguno que haya visto intenta hacer lo mismo con los binarios nativos.

ldd tampoco funcionará en los binarios porque funciona configurando algunas variables de entorno especiales y luego ejecutando el programa, dejando que el cargador haga el trabajo. strace tampoco proporcionaría ninguna información significativa, ya que no informaría más de lo que informa el kernel y, como hemos visto, el kernel no puede informar todo lo que sabe.

Relacionado:¿Forma de determinar el valor óptimo para el parámetro bs a dd?

Esta situación a menudo surge cuando intenta ejecutar un binario para el sistema correcto (o familia de sistemas) y la arquitectura superior, pero la subarquitectura incorrecta. Aquí tiene binarios ELF en un sistema que espera binarios ELF, por lo que el kernel los carga correctamente. Son binarios i386 que se ejecutan en un procesador x86_64, por lo que las instrucciones tienen sentido y llevan el programa al punto en el que puede buscar su cargador. Pero el programa es un programa de 32 bits (como el file salida indica), buscando el cargador de 32 bits /lib/ld-linux.so.2 , y presumiblemente solo ha instalado el cargador de 64 bits /lib64/ld-linux-x86-64.so.2 en el chroot.

Debe instalar el sistema de tiempo de ejecución de 32 bits en chroot:el cargador y todas las bibliotecas que necesitan los programas. Desde Debian wheezy en adelante, si desea compatibilidad con i386 y x86_64, comience con una instalación de amd64 y active la compatibilidad con varias arquitecturas:ejecute dpkg --add-architecture i386 entonces apt-get update y apt-get install libc6:i386 zlib1g:i386 … (si desea generar una lista de las dependencias del paquete perl de Debian, para ver qué bibliotecas es probable que se necesiten, puede usar aptitude search -F %p '~Rdepends:^perl$ ~ri386' ). Puede obtener una colección de bibliotecas comunes instalando ia32-libs paquete (primero debe habilitar la compatibilidad con varias arquitecturas). En Debian amd64 hasta Wheezy, el cargador de 32 bits está en libc6-i386 paquete. Puede instalar un conjunto más grande de bibliotecas de 32 bits instalando ia32-libs .


Linux
  1. no se puede ejecutar un archivo binario cuando se intenta ejecutar un script de shell en Linux

  2. Sistema de archivos multiplataforma

  3. ¿Cómo determinar si un archivo binario de Linux es de 32 bits o de 64 bits?

  4. Ejecute la aplicación de 64 bits en el sistema Ubuntu de 32 bits

  5. Ejecutar un script bash o un binario c en un sistema de archivos con la opción noexec

5 formas de encontrar una descripción y ubicación de un "comando binario" en el sistema de archivos

¿Descomprimir un archivo .gz para obtener un archivo de texto pero obtener un archivo binario?

¿Cuándo aparece el mensaje de error "trabajos:no encontrado"?

¿Cómo verificar que el sistema Linux sea de 32 bits o de 64 bits?

Sistema de archivos de Linux que envejece los archivos más antiguos cuando la partición está llena

Obteniendo el error:bash:./program:no se puede ejecutar el archivo binario:error de formato Exec