gcc no se vinculará con -m32

23

Intentar compilar incluso el programa más simple ( int main(){}) con -m32un sistema de 64 bits falla:

$ 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 que todavía está buscando erróneamente en los directorios incorrectos cuando -m32se especifica.

libgcc-4.8-dev:i386está instalado y he verificado que las bibliotecas de 32 bits se encuentran en /usr/lib/gcc/i686-linux-gnu/4.8/.

He intentado configurar y exportar LD_INCLUDE_PATHy fue LD_LIBRARY_PATHen vano.

Vladimir Panteleev
fuente

Respuestas:

23

Primero, necesita instalar "gcc-multilib" y "g ++ - multilib"

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

Entonces su comando actual 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
fuente
2
Nota: para los programas de C ++, g++-multilibtambién será necesario.
Vladimir Panteleev
1
Considere también: libc6-dev-i386.
kenorb
0

Para compilar correctamente el código C en ejecutables x86 de 32 bits en un entorno x86_64, debe instalar los siguientes paquetes adicionales:

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

Después de una llamada de compilación como

$ gcc -m32 test.c -o test

tiene éxito

maxschlepzig
fuente
0

Este problema también ocurre cuando la gccversión no coincide con la versión de gcc-multilib. En este caso, debe instalar la versión correcta de los paquetes multilib. Por ejemplo; Estaba usando la versión gcc, 4.6así que tuve que instalar gcc-4.6-multiliby g++-4.6-multilibporque el gcc-multilibpaquete predeterminado era para 4.8.

Hey tú
fuente