我的本地 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 ,它确实控制了链接​​阶段,并确保内核在不拉入任何用户空间代码的情况下被链接。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top