Comment compiler glibc 32bit sur une machine x86 64

j'essaie de compiler glibc (comme un secondaire, pas un remplacement de système) 2.6 sur un x86_64, et j'essaie de le faire produire des objets 32 bits. Quand je lui donne une configuration standard, il se compile très bien, produisant les objets habituels de la bibliothèque 64 bits. Quelques infos:

$ uname -a
Linux localhost.localdomain 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:32:21 
EST 2010 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release
CentOS release 5.4 (Final)

Entre autres choses, j'ai essayé le code suivant:

tentative 1:

$ # [in build/glibc-2.6]
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 
                                --with-cpu=i386-pc-linux-gnu

...

checking sysdep dirs... configure: error: The i386-pc-linux-gnu
subspecies of x86_64 is not supported."

tentative 2:

$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 
                                --host=i386-pc-linux-gnu

...

$ make

le configurer réussit, mais make provoque un flux d'erreurs de compilation qui tous ressembler à ceci:

nptl/sysdeps/i386/tls.h:65:3: error: #error "TLS support is required."
In file included from include/tls.h:6,
                 from sysdeps/unix/sysv/linux/i386/sysdep.h:30,
                 from <stdin>:1:

j'obtiens le même résultat si j'ajoute --with-tls, et/ou --target=i386-pc-linux-gnu.

[EDIT: Il semble que j'ai été la confusion --cible --construction. J'ai essayé d'ajouter --build=i386-pc-linux-gnu à la place, et aussi pour toutes les autres tentatives où j'ai essayé --target. Dans tous les cas, j'ai obtenu exactement le même résultat qu'avant.]

Tentative 3:

$ CFLAGS=-m32 
  ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 
                                --host=i386-pc-linux-gnu 

... 

In file included from ./../include/libc-symbols.h:55,
                 from <command line>:1:
/home/USER/build/glibc32-2.6/config.h:3:3: error: #error "glibc cannot be 
compiled without optimization"

encore une fois, la même chose se produit avec --with-tls

tentative 4:

$ CFLAGS="-m32 -O2" 
  ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 
                                --host=i386-pc-linux-gnu 

... 

gcc ../sysdeps/unix/sysv/linux/i386/sysdep.S -c  -I../include 
    -I/home/USER/build/glibc32-2.6/csu 
    -I/home/USER/build/glibc32-2.6 -I../sysdeps/i386/elf 
    -I../nptl/sysdeps/unix/sysv/linux/i386 
    -I../sysdeps/unix/sysv/linux/i386 
    -I../nptl/sysdeps/unix/sysv/linux 
    -I../nptl/sysdeps/pthread -I../sysdeps/pthread 
    -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu 
    -I../sysdeps/unix/common -I../sysdeps/unix/mman 
    -I../sysdeps/unix/inet -I../sysdeps/unix/sysv/i386 
    -I../nptl/sysdeps/unix/sysv -I../sysdeps/unix/sysv 
    -I../sysdeps/unix/i386 -I../nptl/sysdeps/unix 
    -I../sysdeps/unix -I../sysdeps/posix 
    -I../sysdeps/i386/fpu -I../nptl/sysdeps/i386 
    -I../sysdeps/i386 -I../sysdeps/wordsize-32 
    -I../sysdeps/ieee754/ldbl-96 
    -I../sysdeps/ieee754/dbl-64 
    -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754 
    -I../sysdeps/generic/elf -I../sysdeps/generic 
    -I../nptl  -I.. -I../libio -I. 
    -D_LIBC_REENTRANT -include ../include/libc-symbols.h 
    -DHAVE_INITFINI -DASSEMBLER 
    -I/home/USER/build/glibc32-2.6/csu/. -DGAS_SYNTAX 
    -Wa,--noexecstack 
    -o /home/USER/build/glibc32-2.6/csu/sysdep.o 
    -MD -MP 
    -MF /home/USER/build/glibc32-2.6/csu/sysdep.o.dt 
    -MT /home/USER/build/glibc32-2.6/csu/sysdep.o

../sysdeps/unix/i386/sysdep.S: Assembler messages:
../sysdeps/unix/i386/sysdep.S:51: Error: @NTPOFF reloc is not supported 
with 64-bit output format
../sysdeps/unix/i386/sysdep.S:51: Error: junk `@NTPOFF' after expression

je pense que ça devrait être plus facile. Ai-je raté quelque chose?

si vous avez besoin de plus d'information, faites-le moi savoir et je vous la fournirai.

[EDIT]

tentative 5 (suggérée par EmployedRussian)

$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 
     CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu

... 

gcc -m32   -nostdlib -nostartfiles -shared 
    -o /home/USER/build/glibc32-2.6/elf/ld.so
    -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs
    /home/USER/build/glibc32-2.6/elf/librtld.os 
    -Wl,--version-script=/home/USER/build/glibc32-2.6/ld.map 
    -Wl,-soname=ld-linux.so.2 
    -T /home/USER/build/glibc32-2.6/elf/ld.so.lds
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `add_dependency':
/home/USER/src/glibc-2.6/elf/dl-lookup.c:106: undefined reference to `__sync_fetch_and_add_4'
/home/USER/src/glibc-2.6/elf/dl-lookup.c:110: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_profile_fixup':
/home/USER/src/glibc-2.6/elf/dl-runtime.c:196: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-runtime.c:205: undefined reference to `__sync_fetch_and_add_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_fixup':
/home/USER/src/glibc-2.6/elf/dl-runtime.c:102: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-runtime.c:110: undefined reference to `__sync_fetch_and_add_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `dl_open_worker':
/home/USER/src/glibc-2.6/elf/dl-open.c:425: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-open.c:427: undefined reference to `__sync_fetch_and_add_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_close_worker':
/home/USER/src/glibc-2.6/elf/dl-close.c:407: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-close.c:409: undefined reference to `__sync_fetch_and_add_4'
collect2: ld returned 1 exit status
make[2]: *** [/home/USER/build/glibc32-2.6/elf/ld.so] Error 1
make[2]: Leaving directory `/home/USER/src/glibc-2.6/elf'
make[1]: *** [elf/subdir_lib] Error 2
make[1]: Leaving directory `/home/USER/src/glibc-2.6'
make: *** [all] Error 2

cette fois la construction fonctionne avec succès pendant une longue période temps avant qu'il n'atteigne une erreur. J'ai fait une recherche et j'ai trouvé quelque chose suggérant d'ajouter un drapeau "-march", ce que j'ai fait. Cela a finalement fonctionné:

tentative 6:

$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 
     CC="gcc -m32" CXX="g++ -m32" 
     CFLAGS="-O2 -march=i686" 
     CXXFLAGS="-O2 -march=i686" 
     i686-linux-gnu

Merci à tous!

18
demandé sur royh 2011-11-04 06:22:50

3 réponses

j'ai édité la question, mais j'ai ensuite réalisé la bonne façon est d'ajouter une réponse. Voici ce qui a finalement fonctionné:

 $ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
     --host=i686-linux-gnu \
     --build=i686-linux-gnu \
     CC="gcc -m32" CXX="g++ -m32" \
     CFLAGS="-O2 -march=i686" \
     CXXFLAGS="-O2 -march=i686"

je pense mettre -m32 dans CC et CXX au lieu de CFLAGS et CXXFLAGS était important car il y avait au moins une opération de compilation pendant la marque qui n'utilisait pas CFLAGS ou CXXFLAGS, et -m32 absolument doit toujours être là. Je ne sais pas pourquoi -march=i686 était nécessaire (étant donné le -m32 les pièces et les --host/build options), mais ça l'était.

23
répondu royh 2011-11-10 10:13:25

La suivante fonctionne pour moi:

../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
 CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu
5
répondu Employed Russian 2011-11-04 05:10:40

Trois ./configure drapeaux:

  • --build= le système effectuant la construction. Ressemble à la vôtre est x86_64-pc-linux-gnu.
  • --host= Le système sur lequel les objets générés seront utilisés. Vous souhaitez définir ce i386-pc-linux-gnu.
  • --target= si vous construisez un compilateur, le système pour lequel le compilateur construit générera des objets.

pour effectuer une compilation croisée, vous devez spécifier --build= et --host=. Quand vous spécifiez seulement --host=, il tentera toujours de construire un natif (x86_64) de la glibc.

4
répondu ephemient 2011-11-04 02:42:48