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!
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.
La suivante fonctionne pour moi:
../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu
Trois ./configure
drapeaux:
--build=
le système effectuant la construction. Ressemble à la vôtre estx86_64-pc-linux-gnu
.--host=
Le système sur lequel les objets générés seront utilisés. Vous souhaitez définir cei386-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.