【问题标题】:Executable file format可执行文件格式
【发布时间】:2016-05-28 14:18:17
【问题描述】:

我的问题源于我缺乏较低级别系统编程的经验(特别是在操作系统的实施级别)。可执行文件包含操作系统的一些信息——例如它必须在启动时动态链接到哪些库。因此,编译器在编译文件时会将此类依赖项放在可执行文件的适当位置。所以我们为给定的系统编译代码。但是那么我们如何编译构成系统的代码呢?编译器为哪个系统编译该代码?

开发 C 编程语言是为了帮助编写 UNIX 操作系统,但是说 Linux 呢?

对不起,鸡蛋问题。

【问题讨论】:

  • 你问的是Linux内核是怎么编译的?
  • 确实是我要问的
  • @immibis 您能否进一步了解其工作原理?
  • Linux内核使用gcc编译,一般由GRUB加载。
  • @immibis 但是没有 libc 怎么能用 C 写呢?

标签: c linux unix operating-system system


【解决方案1】:

大多数 C 编译器都可以选择不链接到系统的标准 C 库。如果选择这样的函数,那么mallocprintf等标准函数就不存在了。

您可以调用的唯一代码是您创建的代码。没有系统包含,没有标准库函数,只有你自己的代码。一张白纸。

编写操作系统涉及很多方面——线程、进程、受保护的内存、内存分配器、权限分离、输入/输出、设备访问、文件系统、网络……不胜枚举。

当您编写操作系统的内核时,您最终将拥有足够的支持结构,您可以开始编写用户模式系统调用来访问内核的功能,例如文件 IO。如果您愿意,您可以通过以 C 标准库的标准形式实现它们来实现。

理论上,您可以编写一个没有称为mallocprintf 的函数的操作系统。 C 编译器不会在意。

【讨论】:

    【解决方案2】:

    这里的诀窍是拥有一个可以构建正确代码的链接器。这不是编译器。

    【讨论】:

    • 我不认为我跟随。那么例如系统提供了一个链接器来放置动态链接信息?
    • 您要么需要不同的系统链接器,要么您的链接器需要具有构建系统代码的选项(例如,使用静态库)。
    猜你喜欢
    • 2014-09-19
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2019-12-08
    相关资源
    最近更新 更多