如何配置GNU binutils支持x86_64裸机ELF及PE/COFF格式
配置支持x86_64裸机ELF与PE/COFF的GNU Binutils
我正尝试为x86_64裸机ELF目标配置GNU binutils,同时添加PE/COFF二进制格式支持,用于操作系统和EFI的教学开发。我知道有--enable-targets=all选项,但不想编译binutils所有支持的目标格式,仅需添加少量额外目标格式。
我尝试过多种方式通过--enable-targets列表配置BFD,但均未完全成功。例如尝试了以下配置:
--enable-targets=x86_64-none-elf64,i386-none-elf32,i386-none-pe,i386-none-pei,x86_64-none-pe,pei-none-x86_64,x86_64-none-coff,i386-none-coff
但遗憾的是,部分目标总是出现“支持已移除”的错误,而使用--enable-targets=all编译时,程序帮助文本显示这些目标仍受支持,因此我认为是自身配置有误。
以下是shell脚本中使用的完整配置命令行:
../binutils-2.45/configure --prefix=$INSTALL \ --with-gmp=$INSTALL \ --with-mpfr=$INSTALL \ --with-mpc=$INSTALL \ --with-isl=$INSTALL \ --with-sysroot=$INSTALL/$ARCH \ --disable-gdb \ --enable-plugins \ --enable-lto \ --disable-nls \ --disable-sim \ --target=$ARCH \ --enable-year2038 \ --enable-multilib \ --enable-multiarch \ --enable-obsolete \ --enable-targets=x86_64-none-elf64,i386-none-elf32,i386-none-pe,i386-none-pei,x86_64-none-pe,pei-none-x86_64,x86_64-none-coff,i386-none-coff \ CFLAGS="-O2 -march=core2 -msse4.1 -mxsave" \ CXXFLAGS="-O2 -march=core2 -msse4.1 -mxsave"
问题原因与解决方法
1. 目标三元组格式错误
Binutils的目标三元组需要遵循标准格式:arch-vendor-os(或arch-vendor-format),你列出的部分目标不符合规范,导致配置时被判定为已移除。
2. 正确的目标列表配置
针对你的需求(x86_64裸机ELF + PE/COFF/EFI支持),应该使用以下--enable-targets参数:
--enable-targets=i386-none-elf,i386-pe,x86_64-none-elf,x86_64-pe,pei-i386,pei-x86_64,i386-coff,x86_64-coff
i386-none-elf/x86_64-none-elf:对应32/64位裸机ELF目标,替代你之前的i386-none-elf32/x86_64-none-elf64(这类带位数后缀的格式已被废弃)i386-pe/x86_64-pe:32/64位PE格式支持pei-i386/pei-x86_64:PEI(EFI可执行镜像)格式支持i386-coff/x86_64-coff:32/64位COFF格式支持
3. 额外注意事项
- 确保
--target=$ARCH中的$ARCH设置为x86_64-none-elf,这是你的主目标 --enable-obsolete参数可以保留,它会启用一些被标记为过时但仍可用的目标格式- 编译前建议清理之前的构建目录,避免旧配置残留:
make distclean
内容的提问来源于stack exchange,提问作者Johannes Krottmayer
相关产品推荐
相关产品推荐

