【问题标题】:Necessity of building a cross compiler构建交叉编译器的必要性
【发布时间】:2020-01-05 18:18:31
【问题描述】:

我使用的是 64 位 linux 机器 我在做一些操作系统开发,据说需要使用交叉编译器为目标系统生成代码。 准系统教程 (https://wiki.osdev.org/Bare_bones) 指导使用主机操作系统的本机编译器构建 i686-gcc 编译器(我相信它是 gcc 7.4.0)。

但是,可以使用 gcc 本身为其他目标平台生成代码,例如。

gcc -ffreestanding -c -fno-pie -m32 source.c -o source.o        
ld source.o -o flatbinary.bin -m elf_i386 -Ttext 0x10000 --oformat binary

我相信第一个命令会为 32 位机器创建一个 ELF 对象。 (不使用标准库?我认为 -ffreestanding 代表这一点) 第二个命令创建一个平面二进制图像,其中绝对(虚拟?)地址偏移 0x10000。

这不是交叉编译器的作用吗?为什么需要单独的交叉编译器??

注意:我刚刚涉足编译器、目标文件等的广阔世界,并且刚刚开始了解。我可能有一些根本不正确的概念。 :(

【问题讨论】:

    标签: c gcc compilation x86 osdev


    【解决方案1】:

    x86-64 ELF GCC(就像您在 Linux 上发现的那样)完全能够为 32 位 x86/ELF 编译。

    如果您使用的是其他 ISA,例如 ARM,则需要一个交叉编译器来定位 i386。

    如果您在 Windows 上,您可能需要一个交叉编译器来生成 32 位 x86 ELF 对象,因为 MinGW 或 Cygwin GCC 将生成 PE/COFF 对象文件,而不是 ELF。正确的机器代码,错误的目标文件格式。

    【讨论】:

    • 你怎么知道什么格式和什么 ABI OPs OS 用来写不需要的?
    • @PeterCordes 我读到交叉编译器有助于不重复包含诸如 -nostdlib 或此类选项之类的东西......这是什么意思?我对此比较陌生,所有这些都非常令人困惑......显然是由于现在使用的多个 ISA、操作系统等的巨大复杂性:(
    • @P__J__:您可以通过阅读教程并看到它用于制作 i686-elf 内核来判断。如果您已经有一个可以针对该 ISA / 目标文件格式的编译器,那么您就大功告成了。
    • @SuraajKS:无论如何,您都没有与编译器链接,而是直接使用ldgcc -nostdlib 就像使用 ld 而不添加 CRT 启动文件或 -lc 像编译器通常那样。 (运行gcc -v hello.c 以查看在编译普通可执行文件时它通常链接的内容。)由于库函数将不可用(除非您的内核提供它们自己的实现)您必须小心编写代码的方式。 .
    • @SuraajKS 程序gcc 并不是真正的编译器本身,它是调用实际编译器和(默认情况下)链接器的前端程序。 gcc 也可以在调用链接器时添加一些特定的库,例如用于内置函数的 GCC 特定库。
    【解决方案2】:

    建议构建一个交叉编译器以避免在编译操作系统时出错,但这不是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多