使用libbfd编写Windows AMD64 COFF目标文件时如何通过bfd API设置机器类型
解决方案
完全可以通过BFD原生API正确设置COFF目标文件的机器类型,不需要手动覆写文件头的hack操作。
出现COFF头机器类型为空的根因是:BFD实例没有显式绑定对应目标架构,导致写出COFF头时机器类型字段取了默认的未知值(即0)。
修复步骤
在现有代码中,只要在触发文件写出前为BFD实例绑定x86-64架构信息即可,已实现的节、符号、重定位写入流程完全不需要改动:
- 调用
bfd_scan_arch("i386:x86-64")获取x86-64架构的描述信息 - 通过
bfd_set_arch_info()将架构信息绑定到当前打开的BFD实例上
修改后的核心代码
bfd_init(); auto bfd = bfd_openw("test.obj", "pe-x86-64"); if (!bfd) { bfd_perror("bfd_openw failed"); return -1; } // 新增架构绑定逻辑,替代手动覆写文件头的操作 const bfd_arch_info *arch_info = bfd_scan_arch("i386:x86-64"); if (!arch_info) { bfd_perror("bfd_scan_arch failed to resolve x86-64 architecture"); bfd_close(bfd); return -1; } if (!bfd_set_arch_info(bfd, arch_info)) { bfd_perror("bfd_set_arch_info failed"); bfd_close(bfd); return -1; } if (!bfd_set_format(bfd, bfd_object)) { bfd_perror("bfd_set_format failed"); return -1; } // 原有节、符号、重定位写入逻辑保持不变 bfd_close(bfd);
关键说明
bfd_openw传入的pe-x86-64参数仅用于指定文件格式的序列化规则,COFF头里的机器类型字段是完全从BFD实例绑定的架构信息读取的。没有绑定架构时,BFD的COFF输出后端只会写入默认的未知机器类型值,和观察到的需要手动覆写为0x8664(小端序下对应写入\x64\x86)的现象完全吻合。
完成架构绑定后,BFD会自动把机器类型字段设置为正确的IMAGE_FILE_MACHINE_AMD64 (0x8664),完全不需要在bfd_close之后再做文件偏移操作。
- BFD体系内x86-64架构的固定标识为
i386:x86-64,传入x86_64这类非标准别名可能无法正确解析 - 这套逻辑也适用于其他架构的Windows COFF目标文件,比如生成ARM64的COFF时,只需要把
bfd_scan_arch的参数替换为aarch64,BFD会自动写入对应的机器类型字段。
内容的提问来源于stack exchange,提问作者tly
相关产品推荐
相关产品推荐

