我的母语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] 删除。
我来说两句