我正在交叉编译(使用x86_64-linux-android-gcc)为x86_64-linux-android构建GNU libc,GLIBC version2.32。从strtod_l.c的编译中得到“__asm中的操作数约束不一致”的错误。在strtod_l.c中,有一个函数round_and_return(),它调用宏math_force_eval(force_underflow)。此宏在“at barriers.h”中定义,错误发生在以下行:
__asm __volatile ("" : : "f" (x));这让我开始尝试发现force_underflow的价值是什么:
尝试将这些行添加到strtod_l.c,但得到以下错误:
printf(“force_underflow=%f\n”,force_underflow);
错误:%f的类型为double,force_underflow的类型为long double
已尝试:
printf(“force_underflow=%lf\n”,force_underflow);
错误:%lf的类型为double,force_underflow的类型为long double
已尝试:
printf(“force_underflow=%Lf\n”,force_underflow);
错误:%Lf是long double类型,force_underflow是double类型
这就引出了我的第一个问题:变量"force_underflow“怎么可能同时是"double”类型和"long double“类型呢?这行代码中有没有什么东西:
__asm __volatile("" : : "f" (x));是否可以修改以满足编译器的要求?感谢您的任何/所有建议!
致敬,史蒂夫
发布于 2021-01-06 08:08:05
x86_64-linux-android-gcc不是一个适合编译glibc的编译器;它的目标是x86_64-linux-android ABI,而不是x86_64-linux-gnu ABI。为了编译glibc,你需要一个linux-gnu目标工具链。
我之前并不知道之前的ABI的细节,但从错误消息中,听起来x86安卓没有一个独特的long double表示,但它定义为与double相同的东西。但这只是使用错误目标编译器可能导致的多种形式的破坏之一。其他的破坏甚至可能是无声的。你只需要为你的目标构建合适的交叉工具链。
https://stackoverflow.com/questions/65586845
复制相似问题