我正在尝试在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 GNU/Linux $ cat /etc/redhat-release CentOS release 5.4 (最终版)
在其他方面,我尝试了以下几种方法:
尝试1:
配置$# in build/glibc-2.6 $../../src/glibc-2.6/
--prefix=$HOME/glibc32-2.6 \ --with-cpu=i386-pc-linux-gnu ...正在检查sysdep目录...配置:错误:不支持x86_64的i386-pc-linux-gnu亚种。“
尝试2:
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \--host=i386-pc-linux-gnu...$ make
配置成功,但是make
导致了一系列编译错误,它们看起来都是这样的:
nptl/sysdeps/i386/tls.h:65:3: error:#error“需要TLS支持”。在include/tls.h:6包含的文件中,来自sysdeps/unix/sysv/linux/i386/sysdep.h:30,来自:1:
如果我添加--with-tls和/或--target=i386-pc-linux-gnu,我会得到相同的结果。
编辑:看起来我把--target for --build弄糊涂了。我尝试添加--build=i386-pc-linux-gnu,也尝试添加--target。在所有情况下,我得到的结果都与以前完全相同。
尝试3:
$ CFLAGS=-m32 \ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \ --host=i386-pc-linux-gnu \ ...在././include/libc-symbs.h:55中包含的文件中,来自:1: /home/USER/build/glibc32-2.6/config.h:3:3: error:#error "glibc在没有优化的情况下无法编译“
同样,-- with -tls也会发生同样的事情
尝试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/ie754/ldbl-96\-i../sysdeps/ie754/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-symbs.h\ -DHAVE_INITFINI -DASSEMBLER \ -I/home/USER/build/glibc32-2.6/csu/。-DGAS_SYNTAX \ -Wa,--noexecstack \ -o /主目录/用户/构建/glibc32-2.6/csu/sysdep.o\ -MD -MP \ -MF /主目录/用户/构建/glibc32-2.6/csu/sysdep.o.dt\ -MT /主目录/用户/构建/glibc32-2.6/csu/sysdep.o../sysdeps/unix/i386/sysdep.S:汇编程序消息:../sysdeps/unix/i386/sysdep.S:51:错误:@NTPOFF reloc不支持\64位输出格式。./sysdeps/unix/i386/sysdep.S:51: Error: junk `@NTPOFF‘表达式后
我觉得这应该更容易些。我是不是遗漏了什么?
如果您需要更多信息,请让我知道,我将提供它。
编辑
尝试5(由EmployedRussian建议)
配置$../../src/glibc-2.6/
--prefix=$HOME/glibc32-2.6 \ CC="gcc -m32“CXX="g++ -m32”i686-linux-gnu ...--version-script=/home/USER/build/glibc32-2.6/ld.map -m32 -nostdlib -nostartfiles -shared \ -o /home/USER/build/glibc32-2.6/elf/ld.so -Wl,-z,combreloc,-z,relro -Wl,--hash-style= -Wl,-z,defs /home/USER/build/glibc32-2.6/elf/librtld.os \ -Wl,defs\ -Wl,-soname=ld-linux.so.2 \ -T /home/USER/build/glibc32-2.6/elf/ld.so.lds /home/USER/build/GLIBC32-2.6/elf/LIBL.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:对\_\_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:对用户构建的未定义引用/home/\_\_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/glibc32-2.6/elf/librtld.os:在函数\_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:中对\_\_sync\_fetch\_and\_add\_4' /home/USER/build/glibc32-2.6/elf/librtld.os: In function
dl_\_\_sync\_fetch\_and\_add\_4' /home/USER/build/glibc32-2.6/elf/librtld.os: In function
___sync_fetch_and_add_4’的未定义引用: /home/USER/src/glibc-2.6/在函数\_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/\_\_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中:\_\_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’make1:*elf/subdir_lib错误2用户:离开目录`/home/make1/src/glibc-2.6‘make:*所有错误2
这一次,构建在到达错误之前成功运行了很长一段时间。我做了一个搜索,发现了一些建议我添加了一个"-march“标志,我确实这么做了。这终于起作用了:
尝试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
谢谢大家!
发布于 2011-11-10 10:47:35
我编辑了问题,但后来我意识到正确的方法是添加答案。以下是最终奏效的方法:
$ ../../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"
我认为将-m32
放在CC和CXX中而不是CFLAGS和CXXFLAGS中是很重要的,因为在make过程中至少有一个编译操作没有使用CFLAGS或CXXFLAGS,而-m32
绝对必须始终在那里。不确定为什么-march=i686
是必要的(给定-m32
部件和--host/build
选项),但它是必要的。
发布于 2011-11-04 13:10:41
下面的方法对我很有效:
../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu
发布于 2011-11-04 10:42:49
三个重要的./configure
标志:
对执行构建的系统执行
--build=
命令。看起来您的是x86_64-pc-linux-gnu
.--host=
生成的对象将在其上使用的系统。如果要构建编译器,则需要将其设置为i386-pc-linux-gnu
.--target=
。要执行交叉编译,必须同时指定--build=
和--host=
。当您仅指定glibc时,它仍将尝试构建本机(x86_64
) --host=
。
https://stackoverflow.com/questions/8004241
复制相似问题