3

我的本地 gcc 说,它的三元组如下。

> gcc -dumpmachine
x86_64-suse-linux

其中cpu-vendor-os对应x86_64、suse、linux。后者意味着 glibs 正在使用中(?)。当我在交叉编译基于busybux的系统时,编译器三元组类似于avr32-linux-uclibc,其中os是'linux-uclibc',这意味着使用了uclibc。

'linux-glibc' 和 'linux-uclibc' 之间的区别在于(AFAIU)collect2 行为和 libgcc.a 内容。glibc 或 uclibs 都以静默方式链接到目标二进制文件。

问题是 linux 内核是如何被相同的编译器编译的?一旦内核在裸机上运行,​​它就不能与任何类型的用户空间 libc 链接,并且应该使用适当的 libgcc.a

4

1 回答 1

3

gcc 有各种选项来控制它的工作方式。以下是一些相关的:

  • -nostdlib省略到标准库和启动代码的链接
  • -nostdinc省略在标准位置搜索头文件。
  • -ffreestanding为独立环境(例如内核)编译

您也不需要使用 gcc 进行链接。您可以直接调用链接器,为它提供您自己的链接器映射、启动目标代码以及您需要的任何其他内容。

linux 内核构建似乎出于任意原因不使用-ffreestanding,但它确实控制了链接​​阶段,并确保在不拉入任何用户空间代码的情况下链接内核。

于 2013-11-07T18:08:37.730 回答