首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在x86_64机器上编译glibc 32位

如何在x86_64机器上编译glibc 32位
EN

Stack Overflow用户
提问于 2011-11-04 10:22:51
回答 3查看 33.6K关注 0票数 22

我正在尝试在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 functiondl_\_\_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

谢谢大家!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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选项),但它是必要的。

票数 28
EN

Stack Overflow用户

发布于 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
票数 5
EN

Stack Overflow用户

发布于 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=

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8004241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档