You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 02:36:07