构建交叉编译器的必要性

Necessity of building a cross compiler

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

但是,可以使用 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。

这不是交叉编译器干的事吗?为什么我需要一个单独的交叉编译器??

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

x86-64 ELF GCC(就像您在 Linux 上看到的那样)完全能够编译 32 位 x86/ELF.

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

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

建议构建一个交叉编译器,以避免在编译操作系统时出错,但没有必要。