GNU Triplet,GCC和Linux内核编译

0x2207

我的母语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

我们

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章