O gcc não vincula com -m32

23

A tentativa de compilar até o programa mais simples ( int main(){}) com -m32um sistema de 64 bits falha:

$ gcc -m32 test.c
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status

Parece ainda estar procurando erroneamente nos diretórios errados quando -m32é especificado.

libgcc-4.8-dev:i386está instalado e eu verifiquei que as bibliotecas de 32 bits estão localizadas /usr/lib/gcc/i686-linux-gnu/4.8/.

Eu tentei configurar e exportar LD_INCLUDE_PATHe LD_LIBRARY_PATHsem sucesso.

Vladimir Panteleev
fonte

Respostas:

23

Primeiro, você precisa instalar "gcc-multilib" e "g ++ - multilib"

sudo apt-get install gcc-multilib g++-multilib

Então seu comando atual funcionará,

$ cat hello.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    puts("Hello, World!");
}
$ uname -a
Linux vbox-1404 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc -m32 hello.c
$ ./a.out
Hello, World!
$ file a.out
a.out: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=80bdc95e2941e3ba8d7bb7c1682098f20e77cebc, not stripped
Elliott Frisch
fonte
2
Nota: Para programas C ++, g++-multilibtambém será necessário.
Vladimir Panteleev
1
Considere também: libc6-dev-i386.
kenorb
0

Para compilar com êxito o código C em executáveis ​​x86 de 32 bits em um ambiente x86_64, é necessário instalar os seguintes pacotes extras:

sudo apt-get install libc6-dev-i386 gcc-multilib

Após uma chamada de compilação como

$ gcc -m32 test.c -o test

consegue.

maxschlepzig
fonte
0

Esse problema também ocorre quando a gccversão não corresponde à versão do gcc-multilib. Nesse caso, você deve instalar a versão correta dos pacotes multilib. Por exemplo; Eu estava usando a versão gcc, 4.6então tive que instalar gcc-4.6-multilibe g++-4.6-multilibporque o gcc-multilibpacote padrão era para 4.8.

HeyYO
fonte