【问题标题】:How to compile glibc 32bit on an x86_64 machine如何在 x86_64 机器上编译 glibc 32bit
【发布时间】:2011-12-21 16:47:17
【问题描述】:

我正在尝试在 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)

除其他外,我尝试了以下方法:

尝试 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."

尝试 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 support is required."
In file included from include/tls.h:6,
                 from sysdeps/unix/sysv/linux/i386/sysdep.h:30,
                 from <stdin>:1:

如果我添加 --with-tls 和/或 --target=i386-pc-linux-gnu,我会得到相同的结果。

[编辑:看起来我把 --target 和 --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 \

... 

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"

同样的事情发生在 --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/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

我觉得这应该更容易。我错过了什么吗?

如果您需要更多信息,请告诉我,我会提供。

[编辑]

尝试 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

这一次构建成功运行了很长时间才遇到错误。我进行了搜索,发现了一些建议我添加“-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

谢谢大家!

【问题讨论】:

    标签: linux glibc


    【解决方案1】:

    我编辑了问题,但后来我意识到正确的方法是添加答案。这是最终奏效的方法:

     $ ../../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 选项),但确实如此。

    【讨论】:

    • 这对我来说也适用于运行 Proxmox VE 2.2 的 64 位主机上的 glibc-2.10.0(32 位)。
    • 今天,使用 Glibc 2.23,我不需要 --build 或 -march(因此没有 CFLAGS 或 CXXFLAGS)。由于这些都不是必需的,我认为自这个问题/答案以来已经修复了一些错误。
    • 我的 Ubuntu 14.04.5 LTS / 内核版本:4.4.0-31-generic 工作。
    【解决方案2】:

    以下对我有用:

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

    【讨论】:

    • 这个版本比其他任何版本都走得更远,但最终还是出错了。然而,我发现了一个可行的构建,它为此添加了一些东西。我仍在试图弄清楚它为什么会起作用。
    【解决方案3】:

    三个重要的./configure 标志:

    • --build= 执行构建的系统。你的好像是x86_64-pc-linux-gnu
    • --host= 将使用生成的对象的系统。您想将其设置为 i386-pc-linux-gnu
    • --target= 如果您正在构建编译器,则构建的编译器将为其生成对象的系统。

    要执行交叉编译,您必须同时指定--build=--host=。当你只指定--host= 时,它仍然会尝试构建一个原生 (x86_64) glibc。

    【讨论】:

    • 谢谢,我把 --target 和 --build 混淆了。不幸的是,当我重做所有测试时,我得到了和以前一样的结果。
    猜你喜欢
    • 2011-07-14
    • 2019-04-29
    • 1970-01-01
    • 2019-05-28
    • 2020-06-19
    • 1970-01-01
    • 2016-07-04
    • 2011-07-12
    • 2018-09-13
    相关资源
    最近更新 更多