【问题标题】:Error building 32-bit (x86) gcc-10.2.0 on a 64-bit (x86-64) machine在 64 位 (x86-64) 机器上构建 32 位 (x86) gcc-10.2.0 时出错
【发布时间】:2021-10-31 22:44:27
【问题描述】:

我正在使用本教程构建一个 32 位 LFS 系统:

https://www.linuxfromscratch.org/~thomas/multilib/index.html

构建是在 64 位系统上执行的。 由于它将在 32 位系统上运行,我还需要为 32 位构建所有二进制文件(我将它们放在单独的目录中,这样它们就不会覆盖 64 位的)

我已经构建了 32 位 gmp、mpc 和 mpfr(因为 gcc 需要它们),没有任何问题。 此外,构建 64 位 gcc 也没有问题。

但是,我有一个问题,构建 32 位 gcc-10.2.0(我在 64 位构建后删除了构建目录)。

使用以下配置: (我在 CC 和 CFLAGS 中都需要 -m32,否则 make 会失败,因为它会尝试链接 32 位库中的 64 位 .o 文件,可能某些内部配置脚本不采用“-m32”选项)

CC="gcc -m32" CXX="g++ -m32" CFLAGS="-m32" CXXLAGS="-m32" LDFLAGS="-m32" AR="ar" AS="as" \
            ../configure --prefix=/usr   \
             --enable-languages=c,c++ \
             --disable-bootstrap      \
             --libdir=/usr/lib32 \
             --build=x86_64-lfs-linux-gnu \
             --enable-multilib       \
             --with-multilib-list=m32,m64 \
             --host=i686-pc-linux-gnu \
             --with-system-zlib

在制作过程中,我收到以下错误:

cc   -g -O2 -m32 -O2  -g -O2 -m32 -DIN_GCC    -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wno-error=format-diag -Wstrict-prototypes -Wmissing-prototypes -Wno-error=format-diag -Wold-style-definition  -isystem ./include  -fpic -mlong-double-80 -DUSE_ELF_SYMVER  -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector  -fpic -mlong-double-80 -DUSE_ELF_SYMVER  -I. -I. -I../.././gcc -I../../../libgcc -I../../../libgcc/. -I../../../libgcc/../gcc -I../../../libgcc/../include -I../../../libgcc/config/libbid -DENABLE_DECIMAL_BID_FORMAT -DHAVE_CC_TLS  -DUSE_TLS -Wno-missing-prototypes -Wno-type-limits -o fixtfti.o -MT fixtfti.o -MD -MP -MF fixtfti.dep  -c ../../../libgcc/soft-fp/fixtfti.c -fvisibility=hidden -DHIDE_EXPORTS
../../../libgcc/soft-fp/fixtfti.c:33:1: error: unknown type name 'TItype'; did you mean 'TFtype'?
   33 | TItype
      | ^~~~~~
      | TFtype
../../../libgcc/soft-fp/fixtfti.c: In function '__fixtfti':
../../../libgcc/soft-fp/fixtfti.c:38:3: error: unknown type name 'UTItype'; did you mean 'UDItype'?

TItype 和 UDItype 未定义。正如我发现的,它们是为 64 位配置(config/i386/64、config/ia64 等)定义的。

但我正在构建一个 32 位 gcc,它们没有定义但已被使用。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • IDK 如何修复它,但 TImode 是 tetra-int 4x 与 int 一样宽,例如__int128 在 x86-64 上。 32 位 GCC 不支持 __int128,因此 32 位 GCC 预计缺少 TItypeUTItype 的定义。 IDK 为什么源会首先尝试使用这些类型,但是,在没有它们的机器上。 (尽管软浮点代码可能想要使用宽整数是有道理的。)
  • 如果你正在构建一个多架构系统,你不需要 gcc 可执行文件本身是 32 位的。相同的 64 位 cc1cc1plus C 和 C++ 编译器二进制文件(以及 /usr/bin/gcc 前端)可以生成 32 位或 64 位可执行文件。不过,您确实需要为 32 位和 64 位编译的库,所以希望这就是您所做的一切。 (或者您正在构建一个传统的纯 32 位用户空间?)
  • 我正在构建一个传统的纯 32 位用户空间,是的,用于旧电脑,只是为了好玩。我尝试在这台 PC 上构建 lfs 系统,使用 32 位 ubuntu 作为主机,但在编译 GCC 时会遇到困难 - 它随机崩溃,可能是因为地址空间不足,因为它是 32 位

标签: gcc x86 x86-64


【解决方案1】:

解决方案是在配置 GCC 时同时设置 CC_FOR_TARGET 和 CXX_FOR_TARGET 环境变量。我认为CC和CXX就足够了。

CC="gcc -m32" CC_FOR_TARGET="gcc -m32" CXX="gcc -m32" CXX_FOR_TARGET="gcc -m32" AR="ar"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2014-11-27
    • 2013-04-02
    • 2010-12-01
    • 2013-11-07
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多