Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用定制的GCC 7.2.0在ARM64上构建GMP 6.1.2-断言错误-BinUtils汇编程序似乎有问题_C_Gcc_Compiler Errors_Gmp_Arm64 - Fatal编程技术网

使用定制的GCC 7.2.0在ARM64上构建GMP 6.1.2-断言错误-BinUtils汇编程序似乎有问题

使用定制的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

我正在尝试为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”就是其中之一。这正是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