使用定制的GCC 7.2.0在ARM64上构建GMP 6.1.2-断言错误-BinUtils汇编程序似乎有问题
我正在尝试为RHEL7.4-ARM64上的ARMv8-A Thunderx2t99(AARCH64)CPU构建GMP 6.1.2 我可以使用系统GCC 4.8.5(由RHEL7.4-ARM64提供)构建BINUTILS 2.29.1、GMP 6.1.2和CC 7.2.0。无错误,GMP通过其使用定制的GCC 7.2.0在ARM64上构建GMP 6.1.2-断言错误-BinUtils汇编程序似乎有问题,c,gcc,compiler-errors,gmp,arm64,C,Gcc,Compiler Errors,Gmp,Arm64,我正在尝试为RHEL7.4-ARM64上的ARMv8-A Thunderx2t99(AARCH64)CPU构建GMP 6.1.2 我可以使用系统GCC 4.8.5(由RHEL7.4-ARM64提供)构建BINUTILS 2.29.1、GMP 6.1.2和CC 7.2.0。无错误,GMP通过其检查测试。gen fac计划有效 现在我使用GCC 7.2.0再次构建所有内容。GMP在深入构建过程之前就出现了断言错误 在GMP构建过程中,它构建了一些程序,“gen fac”就是其中之一。这正是Makef
检查测试。gen fac计划有效
现在我使用GCC 7.2.0再次构建所有内容。GMP在深入构建过程之前就出现了断言错误
在GMP构建过程中,它构建了一些程序,“gen fac”就是其中之一。这正是Makefile执行的命令:
“自定义工具链/bin/gcc-v`test-f'gen fac.c'| | echo'/`gen fac.c-o gen fac”
然后,它尝试执行:“./gen fac 64 0”,如果使用我的GCC 7.2.0构建,则会出现断言错误:
gen-fac:mini-gmp/mini-gmp.c:1207:mpn\u肢体大小\u在\u基础中\u 2:断言'u>0'失败。
/bin/sh:line 1:9766中止(堆芯转储)。/gen fac 64 0>fac_table.h
在这种情况下,u
正好为0
我想我能缩小范围。在GCC 7.2.0中,GMP_LLIMB_面具出现错误。所以我写了一个小测试程序来展示这个案例(DEFINE是从GMP/mini GMP.h复制粘贴的):
这使我相信我构建GCC 7.2.0错误或GMP 6.1.2错误。至少,GCC之间对long的处理似乎有所不同
以下是我如何配置GCC:
"$GCC/configure" \
--prefix="$1" \
--with-local-prefix="$1" \
--enable-clocale=gnu \
--enable-languages=c,c++,fortran \
--with-gmp="$1" \
--with-mpfr="$1" \
--with-mpc="$1" \
--with-isl="$1" \
--enable-tls \
--enable-threads=posix \
--enable-lto \
--with-ld="$1/bin/ld" \
--with-as="$1/bin/as" \
--with-system-zlib \
--disable-nls \
--disable-libstdcxx-pch \
--disable-multilib \
--enable-compressed-debug-sections=all \
--build="$MACHINE_TARGET" \
--host="$MACHINE_TARGET" \
--target="$MACHINE_TARGET"
以下是我如何配置GMP(在本例中,MACHINE_ABI=64):
有人能解释一下这里发生了什么吗
因此,原因似乎是比努蒂尔。
我正在进行两阶段构建:
- 第一阶段是编译:make->binutils->gmp->mpc->mfpr->isl->GCC
- 第2阶段是再次编译所有内容(顺序相同),但使用新的GCC
在第1阶段之后,一切都会正常工作。我可以使用GCC 7.2.0手动编译GMP。如果我开始第2阶段,编译/安装binutils,我的GCC就会开始像上面那样工作
我把它的范围缩小到只有作为(汇编程序)。如果我将用作在第1阶段生成的,一切正常。注意:(无符号长)1 printf(“大小:%u\n”,大小f(无符号长));两个版本的GCC都给我8。不过,由于利用了UB,GMP在4.8.5版上看起来确实有效。@chux:有意思,我不知道。这是“无符号整数算术总是以模2^n的形式执行”这一一般原则的一个重要例外,并且在溢出时不会造成任何伤害。@chux:另一方面,printf结果表明,无符号长
确实大于32位。我添加了更多信息。我一直在调查错误的事情。看起来binutils生成的汇编程序不好。仍在寻找建议。注意:(无符号长)1 printf(“大小:%u\n”,sizeof(无符号长));两个版本的GCC都给我8。不过,由于利用了UB,GMP在4.8.5版上看起来确实有效。@chux:有意思,我不知道。这是“无符号整数算术总是以模2^n的形式执行”这一一般原则的一个重要例外,并且在溢出时不会造成任何伤害。@chux:另一方面,printf结果表明,无符号长
确实大于32位。我添加了更多信息。我一直在调查错误的事情。看起来binutils生成的汇编程序不好。仍在寻求建议。
== GCC 4.8.5 ==
GMP_HLIMB_BIT=4294967296=100000000
GMP_LLIMB_MASK=4294967295=ffffffff
== GCC 7.2.0 ==
GMP_HLIMB_BIT=4294967296=100000000
GMP_LLIMB_MASK=4294967297=100000001
"$GCC/configure" \
--prefix="$1" \
--with-local-prefix="$1" \
--enable-clocale=gnu \
--enable-languages=c,c++,fortran \
--with-gmp="$1" \
--with-mpfr="$1" \
--with-mpc="$1" \
--with-isl="$1" \
--enable-tls \
--enable-threads=posix \
--enable-lto \
--with-ld="$1/bin/ld" \
--with-as="$1/bin/as" \
--with-system-zlib \
--disable-nls \
--disable-libstdcxx-pch \
--disable-multilib \
--enable-compressed-debug-sections=all \
--build="$MACHINE_TARGET" \
--host="$MACHINE_TARGET" \
--target="$MACHINE_TARGET"
ABI="${MACHINE_ABI}" \
./configure \
--prefix="${1}" \
--disable-static \
--without-readline