GNU Triplet,GCC和Linux内核编译

我的本地gcc说,它的三联是以下。

> gcc -dumpmachine x86_64-suse-linux 

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

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

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

gcc有各种选项来控制它的工作方式。 这里有几个相关的:

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

你也不需要使用gcc进行链接。 你可以直接调用链接器,为它提供你自己的链接器映射,启动对象代码和其他你需要的东西。

Linux内核的构建看起来,由于任意的原因,不要使用“ -ffreestanding ,它确实控制了链接​​阶段,并确保内核链接,而不用拉入任何用户空间代码。