No se puede ejecutar un programa de 32 bits en una máquina virtual de 64 bits

12

Compilé un pequeño programa C "hello world" en una máquina Ubuntu 10.04 de 32 bits. Luego puse el ejecutable (a.out) en Ubuntu 12.10 (64 bit) de la máquina virtual VMWare e intenté ejecutarlo (./ a.out). El sistema operativo no identifica el archivo y dice 'No existe tal archivo o directorio'. Pero cuando pongo el mismo ejecutable en un Ubuntu 12.10 (64 bits) que se ejecuta en una computadora portátil de 64 bits, funciona bien y obtengo el resultado deseado. La VM se está ejecutando en servidores IBM Blade. Quería saber por qué los resultados para una VM?

Arrendajo
fuente

Respuestas:

20

El mensaje No such file or directoryno se refiere a su archivo ejecutable: a.out. En su lugar, se refiere a un programa auxiliar que se necesita para ejecutar el ejecutable vinculado dinámicamente de 32 bits a.out.

Ahora, encontré todo esto muy bien explicado en este bonito artículo:

Enlace estático y dinámico

Hay dos tipos de ejecutables binarios: vinculados estáticamente y vinculados dinámicamente. Primero acerca de los vinculados estáticamente : cuando un programa quiere llamar a una función de biblioteca, se refiere a ella por su nombre. Al construir el programa desde la fuente, todas las funciones de la biblioteca utilizadas en el programa se copian de la biblioteca al programa. El programa contiene su propio código y el código de las funciones de biblioteca que utiliza. Luego, en los lugares de llamada, el nombre se cambia a la dirección de la función correspondiente en el programa. Este proceso se llama vinculación porque vincula el nombre de una función con la función misma, su implementación. Se llama estático , porque el enlace no se puede cambiar después de que se haya creado el programa.

Los programas vinculados dinámicamente funcionan de manera diferente: el programa también se refiere a las funciones de la biblioteca por su nombre. Al compilar el programa, se ensamblan y almacenan dos listas junto con el programa: una lista de las funciones de la biblioteca que se utilizan en qué lugares, y una lista de las bibliotecas que contienen las funciones utilizadas por el programa. Eso es todo por construir el programa.

Más tarde, en el momento de la ejecución , un programa auxiliar especial, el denominado vinculador dinámico, busca lugares específicos en el sistema de archivos para cada biblioteca en la lista de bibliotecas y lo carga en la memoria. Ahora el enlazador dinámico sabe en qué direcciones de memoria están disponibles las funciones de la biblioteca. Utiliza la primera lista para escribir la dirección correcta en todos los lugares que llaman a las funciones de la biblioteca. Entonces se puede ejecutar el programa vinculado dinámicamente.

Radu Rădeanu
fuente
3
Este mensaje de error "No se encontró ningún archivo" también me confundió la primera vez ° ͜ °, luego entendí que significaba que faltaba algún archivo requerido por la aplicación.
Ramchandra Apte
@Radu Rădeanu, ¿cómo se llama un programa de ayuda ? Supongo que una biblioteca vinculada dinámicamente. Si es así, llamarlo un programa auxiliar simplemente confunde la explicación.
Golem
Aquí hay un enlace que encontré útil para comprender este problema: obtener el mensaje "No encontrado" cuando se ejecuta un binario de 32 bits en un sistema de 64 bits
Golem