Não foi possível executar um programa de 32 bits na VM de 64 bits

12

Eu compilei um pequeno programa C "olá mundo" na máquina Ubuntu 10.04 de 32 bits. Depois, coloquei o executável (a.out) na máquina virtual VMWare do Ubuntu 12.10 (64 bits) e tentei executá-la (./a.out). O sistema operacional não identifica o arquivo e diz 'Não existe esse arquivo ou diretório'. Mas quando eu coloco o mesmo executável em um Ubuntu 12.10 (64 bits) em execução em um laptop de 64 bits, ele funciona bem e eu obtenho a saída desejada. A VM está em execução nos IBM Blade Servers. Eu queria saber por que os resultados para uma VM?

Jay
fonte

Respostas:

20

A mensagem No such file or directorynão se refere ao seu arquivo executável: a.out. Em vez disso, refere-se a um programa auxiliar necessário para executar o executável vinculado dinamicamente de 32 bits a.out.

Agora, achei tudo isso muito bem explicado neste belo artigo:

Ligação estática e dinâmica

Existem dois tipos de executáveis ​​binários: vinculados estaticamente e dinamicamente. Primeiro, sobre os vinculados estaticamente : quando um programa deseja chamar uma função de biblioteca, ele se refere a ele pelo nome. Ao criar o programa a partir da fonte, todas as funções da biblioteca usadas no programa são copiadas da biblioteca para o programa. O programa então contém seu próprio código, bem como o código das funções da biblioteca que ele usa. Em seguida, nos locais de chamada, o nome é alterado para o endereço da função correspondente no programa. Esse processo é chamado de vinculação porque vincula o nome de uma função à própria função, sua implementação. Chama-se estática , porque o link não pode ser alterado após a criação do programa.

Programas vinculados dinamicamente funcionam de maneira diferente: O programa também se refere às funções da biblioteca por nome. Ao criar o programa, duas listas são montadas e armazenadas juntamente com o programa: uma lista de quais funções da biblioteca são usadas em quais locais e uma lista das bibliotecas que contêm as funções usadas pelo programa. Isso é tudo para criar o programa.

Posteriormente, no tempo de execução , um programa auxiliar especial, o chamado vinculador dinâmico, procura em locais específicos no sistema de arquivos cada biblioteca da lista de bibliotecas e o carrega na memória. Agora, o vinculador dinâmico sabe em que endereços de memória as funções da biblioteca estão disponíveis. Ele usa a primeira lista para escrever o endereço correto em todos os locais que chamam funções de biblioteca. Em seguida, o programa vinculado dinamicamente pode ser executado.

Radu Rădeanu
fonte
3
A mensagem de erro "Nenhum arquivo encontrado" também me confundiu na primeira vez em que ocorreu, então entendi que significava que estava faltando algum arquivo exigido pelo aplicativo.
Ramchandra Apte
@Radu Rădeanu, como você chama um programa auxiliar ? Eu acho que uma biblioteca vinculada dinamicamente. Nesse caso, chamá-lo de programa auxiliar apenas atrapalha a explicação.
golem
Aqui está um link que eu encontrei útil para entender esta questão - Primeiros “Não encontrado” mensagem ao executar um binário de 32 bits em um sistema de 64 bits
golem