处理交叉编译、独立 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 是什么?我认为我真的不了解独立和托管环境:(
在某些情况下,当您使用 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也一样。
我有几个关于 https://wiki.osdev.org/Meaty_Skeleton 的问题,上面写着:
The GCC documentation explicitly states that libgcc requires the freestanding environment to supply the
memcmp
,memcpy
,memmove
, andmemset
functions, as well asabort
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 是什么?我认为我真的不了解独立和托管环境:(
在某些情况下,当您使用 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也一样。