使用-mtune等参数的原生gcc与交叉编译器i386-elf-gcc有何区别?
原生GCC搭配-m32参数与i386-elf-gcc交叉编译器的具体区别
- 目标运行时依赖不同
你当前用的原生GCC(通常是x86_64-linux-gnu-gcc这类宿主平台编译器)哪怕加上-m32、-mtune=i386参数,默认仍然绑定宿主Linux系统的32位glibc、系统调用规则,生成的程序只能在x86架构的Linux系统下运行。而i386-elf-gcc是针对i386裸机目标的交叉编译器,没有绑定任何操作系统的运行时库,生成的程序可以直接在i386架构的裸机环境运行,是开发操作系统内核、BootLoader的常用工具。 - 默认编译配置不同
原生GCC加-m32仅调整了指令集生成规则,默认的预处理宏、启动文件(crt系列)、编译选项都是为宿主Linux的32位用户态程序准备的。而i386-elf-gcc的所有默认配置都面向i386裸机目标,默认不启用Linux特有的编译属性、系统调用包装,也不会引入宿主平台的特有宏定义。 - 链接行为不同
原生LD搭配-m elf_i386参数时,如果不手动指定-nostdlib、-nodefaultlibs等参数,会默认尝试链接宿主系统的32位C运行时、动态加载器,很容易给裸机程序引入不必要的宿主依赖。而i386-elf-ld默认没有任何宿主相关的链接规则,也不会主动查找宿主系统的运行库,更适配裸机场景的链接需求。 - 适用场景差异
如果只是开发x86 Linux下运行的32位用户态程序,两种方式都可以正常生成可用程序。但如果是开发裸机程序、操作系统内核,用原生GCC加参数的方案需要额外添加-ffreestanding、-fno-pic、-nostdinc等大量参数规避宿主环境的干扰,而i386-elf-gcc天生适配这类场景,不需要额外处理复杂的兼容参数。
内容的提问来源于stack exchange,提问作者Duy Nguyen
相关产品推荐
相关产品推荐

