C语言 构建交叉编译器的必要性



我正在使用 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 对象。(不使用标准库?我认为-独立代表这一点( 第二个命令创建一个平面二进制映像,其中绝对(虚拟?(地址偏移0x10000。

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

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

x86-64 ELF GCC(就像你在Linux上找到的那样(完全能够编译32位x86/ELF。

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

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

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

最新更新