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