【问题标题】:Subtleties dealing with cross compilation, freestanding libgcc, etc处理交叉编译、独立 libgcc 等的细节
【发布时间】:2020-03-29 05:06:47
【问题描述】:

我有几个关于https://wiki.osdev.org/Meaty_Skeleton 的问题,它说:

GCC 文档明确指出 libgcc 需要 提供memcmpmemcpymemmovememset 函数,以及某些平台上的 abort。我们会满足 通过创建一个特殊的内核 C 库 (libk) 来满足此要求 包含用户空间 libc 的独立部分 (不需要任何内核功能)而不是托管 libc 需要进行系统调用的功能

好的,我知道libgcc是gcc使用的“私有库”,即它只在编译过程中有意义,当gcc在使用时,有点像gcc的助手。这是正确的吗?我知道我运行 gcc 的机器叫做构建机器,宿主机器是我自己的操作系统。这里指定的独立环境是什么?由于 gcc 在构建机器上运行,所以我猜 libgcc 必须使用构建机器 libgcc?独立式在哪里出现?

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

【问题讨论】:

  • libk 只是本教程的作者为他们将要创建的库选择的名称,以提供 libgcc 所依赖的那些 ISO C 函数。
  • @PeterCordes 这里的独立环境是什么?我的主机系统(我正在构建的操作系统)?
  • 它是独立的,不是由操作系统托管的。即它是您正在开发的内核。从那段的上下文中有几个线索,就像最后一句话基本上定义了它:独立(不需要任何内核功能)

标签: c gcc x86 osdev freestanding


【解决方案1】:

libgcc

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

例如,如果您在内核中使用 64 位算术并且想要为 i386 进行编译,那么 GCC 会调用位于 libgcc 中的特定函数:

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

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

这是另一个恕我直言的好explanation。对于 ARM 架构,这里称为裸机编程,但也适用于 x86。

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多