Ubuntu 64 bits roda programas 32 bits?

Iniciado por renamed2, 29 de Outubro de 2012, 12:23

tópico anterior - próximo tópico

renamed2

OBS: Não sei se está no fórum correto.

Olá

Sou muito novato no mundo Linux.

Tenho duas máquinas Ubuntu 12.04, uma 32 e outra 64 bits. Criei um programinha bem besta em C++ que multiplica duas matrizes de números inteiros usando pthread. Estou usando Eclipse CDT.

Quando compilei o programa na máquina 32 bits como Release consegui executar o programa pela linha de comando ./ProgParalSequencial e rodou muito bem. Passei o mesmo programa para a máquina de 64 bits e, pela linha de comando, o Ubuntu disse Arquivo ou diretório não encontrado. Tenho absoluta certeza de que o arquivo existe, uma vez que eu usei a tecla Tab do teclado e o próprio Ubuntu escreveu o nome do arquivo na linha de comando.

Como curiosidade, peguei o código e o compilei como Release na máquina de 64 bits (exatamente o mesmo código, NADA foi mudado) e consegui executar o programa na máquina de 64 bits.

Alguém aqui sabe de algum problema de incompatibilidade entre Ubuntu 32 e 64 bits? Será que alguém que já tenha passado pelo mesmo problema pode me ajudar? Estou um pouco receoso porque esse programa precisa rodar em uma terceira máquina Linux, do laboratório da universidade, e não sei se terei de compilá-lo lá também.
Bacharel em Sistemas de Informação pela PUC-Rio
Mestrando em Inteligência Artificial pelo PPGI-UFRJ

Sergio Benjamim

Quando você passou o arquivo para a outra máquina, você alterou a permissão dele? Se não alterar, não vai rodar mesmo.

A versão de 64 bits tem uma certa compatibilidade com programas de 32 bits, tanto é que programas como Skype e Gens-GS só tem versões 32 bits, mas consigo rodar aqui no meu Ubuntu de 64 bits.
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

BrunoCarvalho

Pode-se rodar software 32 em sistemas 64 bits, o que não ocorre é o contrario

renamed2

#3
Então, essas são as permissões do arquivo de 32 bits no Ubuntu 64 bits...

Editado: imagem maior que 40Kb
http://i49.tinypic.com/20idmz6.png
Editado: imagem maior que 40Kb

E isso é o que acontece quando executo os dois arquivos no Ubuntu 64 bits

Editado: imagem maior que 40Kb
http://i46.tinypic.com/2cymija.png
Editado: imagem maior que 40Kb

O arquivo ProgParalSequencial_64, versão 64 bits do programa, executa sem problemas (esse espação em branco significa que ele executou corretamente hehe). Já o ProgParalSequencial_32 acontece a mensagem de erro que disse acima.

Será que alguém pode me dar uma luz?

Obrigado.
Bacharel em Sistemas de Informação pela PUC-Rio
Mestrando em Inteligência Artificial pelo PPGI-UFRJ

Sergio Benjamim

As permissões estão certas. Então é o q vc está achando mesmo, para o programa funcionar, tem que compilar na própria máquina. Não tenho noção de como faz para compilar em multi arquiteturas, talvez alguém aqui do fórum dê uma luz.
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

irtigor

#5
Pela imagem não dá pra ter certeza (fora o dropbox, que geralmente atrapalha). Mova pra home, dê permissão e execute, se não funcionar mostre


./ProgParalSequencial_32
ls -l ProgParalSequencial_32
id


--------
Obs: o terminal produz texto de saída, você pode (deve, pra facilitar) copiar e colar na sua mensagem, preferencialmente usando a tag "code".

renamed2

#6
Oi irtigor

Eu fiz o que vc pediu, tirei do Dropbox e coloquei o a pasta na pasta home e executei os comandos...


renato@ubuntu:~$ cd ProgParalSequenciallinux/
renato@ubuntu:~/ProgParalSequenciallinux$ ls
Config.cpp  entrada  ProgParalSequencial_32  saida     t500.h
Config.h    m.cpp    ProgParalSequencial_64  t500.cpp
renato@ubuntu:~/ProgParalSequenciallinux$ ./ProgParalSequencial_32
bash: ./ProgParalSequencial_32: Arquivo ou diretório não encontrado
renato@ubuntu:~/ProgParalSequenciallinux$ ls -l ProgParalSequencial_32
-rwxrwxr-x 1 renato renato 12414 Out 28 18:08 ProgParalSequencial_32
renato@ubuntu:~/ProgParalSequenciallinux$ id
uid=1000(renato) gid=1000(renato) grupos=1000(renato),4(adm),20(dialout),24(cdrom),46(plugdev),116(lpadmin),118(admin),124(sambashare)
renato@ubuntu:~/ProgParalSequenciallinux$


Vou colocar imagem também pq talvez ajude na visualização...


Editado: imagem maior que 40Kb
http://i46.tinypic.com/654rvq.png
Editado: imagem maior que 40Kb
Bacharel em Sistemas de Informação pela PUC-Rio
Mestrando em Inteligência Artificial pelo PPGI-UFRJ

irtigor

Descartado o problema de permissão, restam as dependências (bibliotecas compartilhadas). Instalou a versão 32 bits dela(s), no sistema 64 bits? Use o ldd, se ficar em dúvida.

Darcamo

Quando você tenta executar um arquivo binário compilado em uma arquitetura incompatível (rodar 64 bits em uma máquina 32bits, por exemplo) você recebe uma mensagem de erro contendo "wrong ELF class".

ELF é um 'formato padrão' para arquivos executáveis (http://en.wikipedia.org/wiki/Executable_and_Linkable_Format).
Pode abrir um arquivo binário em um editor de texto (só não mude nada e nem salve depois) e você verá a palavrinha "ELF" logo na primeira linha.
Essa mensagem de erro que mencionei com "wrong ELF class" é uma clara indicação de que o problema seria isso.

Mas no seu caso a mensagem de erro é que o arquivo não existe, mesmo quando aparentemente você está escrevendo o nome certo. Isso é muito estranho e não faço a menor ideia da real causa, mas acho que se o problema fosse o binário compilado para uma arquitetura incompatível com a da máquina na qual você está tentando rodá-lo a mensagem de erro seria essa do wrong ELF class.

irtigor

#9
Pelo o que eu já vi, é possível. A arquitetura é compatível, então não aparece "wrong ELF class", mas a(s) dependência(s) não está[ão] presente(s), o que justifica a mensagem do shell (que não diferencia "programa", de suas ligações internas).

renamed2

Oi Pessoal

Desculpe a demora em voltar aqui.

Perturbei um pessoal que é muito bom em Linux lá da faculdade e eles me explicaram que era necessário que eu instalasse algumas bibliotecas na minha instalação Linux. Eu realmente não sabia, o que não é novidade, porque sou muito novo em Linux ainda.

Então a título de curiosidade, se alguém passar por aqui com o mesmo problema e ainda não tiver nenhuma execução.... eu abri um terminal e digitei o seguinte comando...


sudo apt-get install ia32-libs


E tudo rodou. Desde já agradeço o pessoal ai que ajudou.
Bacharel em Sistemas de Informação pela PUC-Rio
Mestrando em Inteligência Artificial pelo PPGI-UFRJ

Darcamo

Então é exatamente como o irtigor disse. Vivendo e aprendendo.

Ps: Bem que o shell podia retornar uma mensagem mais clara sobre o problema.