处理交叉编译、独立 libgcc 等的微妙之处

Subtleties dealing with cross compilation, freestanding libgcc, etc

我有几个关于 https://wiki.osdev.org/Meaty_Skeleton 的问题,上面写着:

The GCC documentation explicitly states that libgcc requires the freestanding environment to supply the memcmp, memcpy, memmove, and memset functions, as well as abort on some platforms. We will satisfy this requirement by creating a special kernel C library (libk) that contains the parts of the user-space libc that are freestanding (doesn't require any kernel features) as opposed to hosted libc features that need to do system calls

好吧,我明白了 libgcc 是 gcc 使用的 'private library' ,即它只在编译过程中有意义,当 gcc 在使用时,有点像帮手海合会。这是正确的吗?我理解我运行 gcc上的机器叫做构建机器,宿主机器是我自己的OS。这里指定的独立环境是什么?由于 gcc 运行s 在构建机器上,我猜 libgcc 必须使用构建机器 libgcc 吗?独立式在哪里出现?

另外,libk 是什么?我认为我真的不了解独立和托管环境:(

libgcc

在某些情况下,当您使用 GCC 编译时,必须 linked 这个库。因为 GCC 会调用此库中的函数,如果目标体系结构不支持特定功能。

例如,如果您在内核中使用 64 位算法并且您希望针对 i386 进行编译,那么 GCC 将调用位于 [=11] 中的特定函数=]:

uint64_t div64(uint64_t dividend, uint64_t divisor)
{
    return (dividend / divisor);
}

当您尝试 link 没有 libgcc 的内核时,link 用户会收到一个 undefined reference to __udivdi3 错误。另一方面,libgcc 也调用标准 C 库函数。所以必须实现这些具体的功能。

这是另一个恕我直言的好东西 explanation。 ARM架构这里叫裸机编程,x86也一样。