构建coreboot:未定义参考__udivmoddi4

时间:2018-07-21 16:04:47

标签: gcc

在构建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

1 个答案:

答案 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实现降低优化级别可能是一种解决方法。