在构建coreboot时,出现有关链接期间的错误:
coreboot/src/console/vtxprintf.c:102: undefined reference to '__udivmoddi4'
。
在哪里可以找到包含此功能的库?
我正在使用gcc(8.1.1 20180531)为x86_64(Lenovo x230)构建coreboot。
Coreboot-git hash:f59a052ee8dae6f1378514cb622d229e652ad2f6
答案 0 :(得分:2)
__udivmoddi4
是libgcc中的一个函数,用于为GCC所谓的DI模式(双整数,i686上的64位)实现组合的无符号除法/模运算。它用于这样的操作:
unsigned long long
div (unsigned long long a, unsigned long long b, unsigned long long *p)
{
*p = a % b;
return a / b;
}
在i386上使用__udivmoddi4
是GCC 7 related to this patch中的一项新优化。以前的版本分别发出对__umoddi3
和__udivdi3
的调用,基本上两次执行相同的工作。
通常,所有这些功能都是由libgcc
提供的,但是Coreboot不会针对标准库进行链接。它在payloads/libpayload/libc/64bit_div.c
中提供了这些功能的自己的实现,但是__udivmoddi4
尚未在此添加。
要么您自己实现该功能(最简单的方法就是从中调用__umoddi3
和__udivdi3
),或者暂时使用GCC 6编译Coreboot。仅针对printf
实现降低优化级别可能是一种解决方法。