Linux 如何在 x86_64 机器上编译 glibc 32 位
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8004241/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to compile glibc 32bit on an x86_64 machine
提问by royh
I'm trying to compile glibc (as a secondary, not a system replacement) 2.6 on an x86_64, and trying to get it to produce 32-bit objects. When I give it a standard configure, it compiles fine, producing the usual 64-bit library objects. Some info:
我正在尝试在 x86_64 上编译 glibc(作为辅助,而不是系统替代)2.6,并试图让它生成 32 位对象。当我给它一个标准配置时,它编译得很好,生成通常的 64 位库对象。一些信息:
$ 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)
$ 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)
Among other things, I've tried the following:
除其他外,我尝试了以下方法:
Attempt 1:
尝试 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."
$ # [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."
Attempt 2:
尝试 2:
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \ --host=i386-pc-linux-gnu ... $ make
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \ --host=i386-pc-linux-gnu ... $ make
The configure succeeds, but make
causes a stream of compilation errors which all look like this:
配置成功,但make
会导致一系列编译错误,如下所示:
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:
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:
I get the same result if I add --with-tls, and/or --target=i386-pc-linux-gnu.
如果我添加 --with-tls 和/或 --target=i386-pc-linux-gnu,我会得到相同的结果。
[EDIT: It looks like I was confusing --target for --build. I tried adding --build=i386-pc-linux-gnu instead, and also for all of the other attempts where I tried --target. In all cases, I got exactly the same result as before.]
[编辑:看起来我对--build 混淆了--target。我尝试添加--build=i386-pc-linux-gnu,以及我尝试过的所有其他尝试--target。在所有情况下,我得到的结果与以前完全相同。]
Attempt 3:
尝试 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"
$ 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"
Again, the same thing happens with --with-tls
同样,同样的事情发生在 --with-tls
Attempt 4:
尝试 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
$ 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
I feel like this should be easier. Am I missing something?
我觉得这应该更容易。我错过了什么吗?
If you need any more information, let me know and I'll provide it.
如果您需要更多信息,请告诉我,我会提供。
[EDIT]
[编辑]
Attempt 5 (suggested by EmployedRussian)
尝试 5(由 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
$ ../../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
This time the build runs successfully for a long time before it reaches an error. I did a search and found something suggesting that I add a "-march" flag, which I did. This finally worked:
这次构建成功运行了很长时间,然后才遇到错误。我进行了搜索,发现了一些建议我添加“-march”标志的东西,我确实这样做了。这终于奏效了:
Attempt 6:
尝试 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
$ ../../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
Thanks everyone!
谢谢大家!
采纳答案by royh
I edited the question, but then I realized the proper way is to add an answer. Here's what finally worked:
我编辑了问题,但后来我意识到正确的方法是添加答案。这是最终有效的方法:
$ ../../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"
I think putting -m32
in CC and CXX instead of CFLAGS and CXXFLAGS was important because there was at least one compile operation during the make which didn't use CFLAGS or CXXFLAGS, and -m32
absolutely has to always be there. Not sure why -march=i686
was necessary (given the -m32
parts and the --host/build
options), but it was.
我认为-m32
使用 CC 和 CXX 而不是 CFLAGS 和 CXXFLAGS 很重要,因为在 make 期间至少有一个编译操作没有使用 CFLAGS 或 CXXFLAGS,并且-m32
绝对必须始终存在。不知道为什么-march=i686
是必要的(考虑到-m32
零件和--host/build
选项),但确实如此。
回答by ephemient
Three important ./configure
flags:
三个重要./configure
标志:
--build=
The system performing the build. Looks like yours isx86_64-pc-linux-gnu
.--host=
The system on which the generated objects will be used. You want to set this toi386-pc-linux-gnu
.--target=
If you are building a compiler, the system for which the built compiler will generate objects.
--build=
执行构建的系统。看起来你的是x86_64-pc-linux-gnu
。--host=
将在其上使用生成对象的系统。您想将其设置为i386-pc-linux-gnu
.--target=
如果您正在构建编译器,则构建的编译器将为其生成对象的系统。
To perform a cross-compile, you must specify both--build=
and --host=
. When you only specify --host=
, it will still attempt to build a native (x86_64
) glibc.
要进行交叉编译,你必须指定两个--build=
和--host=
。当您仅指定 时--host=
,它仍将尝试构建本机 ( x86_64
) glibc。
回答by Employed Russian
The following works for me:
以下对我有用:
../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu