Cuando no puede 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 vinculado dinámicamente es la parte del sistema responsable de cargar las bibliotecas dinámicas. Es algo como
/lib/ld.so
o /lib/ld-linux.so.2
, y debería ser un archivo ejecutable.
- El cargador de un script es el programa mencionado en la línea shebang, por ejemplo,
/bin/sh
para un script que comienza con #!/bin/sh
. (Bash y zsh dan un mensaje de "mal intérprete" 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 núcleo 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 (leer la #!
línea del script y volver a resolver la condición de error), pero ninguno de los que he visto intenta hacer lo mismo para los binarios nativos.
ldd
tampoco funcionará en los binarios porque funciona estableciendo 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 núcleo, y como hemos visto, el núcleo no puede informar todo lo que sabe.
Esta situación a menudo surge cuando intenta ejecutar un binario para el sistema correcto (o la familia de sistemas) y superar la arquitectura pero la subarquitectura incorrecta. Aquí tiene binarios ELF en un sistema que espera binarios ELF, por lo que el núcleo los carga perfectamente. 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 lo file
indica la salida), busca 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 el chroot: el cargador y todas las bibliotecas que necesitan los programas. Desde Debian wheezy en adelante, si desea soporte para i386 y x86_64, comience con una instalación de amd64 y active el soporte multiarch : 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 pueden ser necesario, puedes usar aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Puede obtener una colección de bibliotecas comunes instalando el ia32-libs
paquete (primero debe habilitar el soporte multiarch). En Debian amd64 hasta wheezy, el cargador de 32 bits está en el libc6-i386
paquete. Puede instalar un conjunto más grande de bibliotecas de 32 bits mediante la instalación ia32-libs
.
libc6-i386
paquete, oia32-libs
si quieres muchas bibliotecas).