【问题标题】:compilng C code to run on a system without OS?编译 C 代码以在没有操作系统的系统上运行?
【发布时间】:2015-05-06 16:00:45
【问题描述】:

如何编译使用 printf 等标准函数的 C 源代码,以便在没有操作系统的系统上运行?

我尝试使用 GCC 进行静态链接,但我似乎遗漏了一些东西。有人可以解释一下如何使用 GCC 来完成吗?

【问题讨论】:

  • wiki.osdev.org/GCC_Cross-Compiler 可能会为您提供一些信息。
  • 我很好奇,你有没有让它在没有操作系统的情况下运行?我认为它仍然需要操作系统来完成大多数基本功能,如启动、退出、内存分配等。但是我可能错了。
  • 呃,伙计们?!如果你从不费心去研究做一些简单的编程或交叉编译是如何工作的,你为什么要投反对票并给出有趣的 cmets?
  • 您当然需要构建自己的“运行时库”。如果您编写准系统,那通常是静态库或链接到准系统主程序的一些源文件。作为起点,您使用一些 printf 实现,并简单地重写调用 fwrite() 的代码行以调用您自己的输出函数,这比预期的工作量少。看看你自己,例如在这里:opensource.apple.com/source/shell_cmds/shell_cmds-170/printf/…。如果你在 bash 运行期间做这种事情,你可以称之为 LINUX。
  • @user3479526 问题是 printf 依赖于操作系统,因此在没有操作系统的情况下静态链接和使用它是行不通的。另一方面,像 sprintf 这样的功能不需要操作系统。如果要打印一些文本,最好的办法是使用 sprintf 进行格式化,然后使用例程显示文本。不过,您将需要字体和图形函数来做到这一点。

标签: c x86 operating-system


【解决方案1】:

无操作系统

很难。您的示例printf() 意味着输出到显示器。这是(除了许多其他事情之外)操作系统的任务。甚至 BIOS 也是一个操作系统,并且能够显示文本(并响应键盘按下)。

因此,您必须决定在哪个极简操作系统上运行程序,然后您可以针对该操作系统进行交叉编译。

【讨论】:

    【解决方案2】:

    如果“没有操作系统”是指您正在编译以在嵌入式平台上运行,那么 printf() 对您没有任何意义,因为该平台没有标准输出,而这是 printf() 被定向到的地方在操作系统上(这就是它在 stdio 标头中的原因)。

    嵌入式平台通常带有其他输出或监视数据或状态的方法,例如更改 GPIO 引脚状态、将数据发送到通信外围设备(这需要您为此编写驱动程序)或者您的程序加载器/IDE 可能具有一些表情观察或反馈支持。

    一些嵌入式设备制造商为特定设备提供编译器,在这种情况下可能附带标准 C 库,但仍需要配置才能使用 printf()。

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2011-06-29
      • 2012-08-02
      • 2012-05-21
      • 1970-01-01
      • 2011-12-11
      相关资源
      最近更新 更多