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

如何使用objcopy从原始二进制文件创建对象时指定符号名?

解决objcopy嵌入资源时符号冲突的方法

GNU objcopy本身没有直接指定自定义符号名的参数,但可以通过以下几种方式手动控制符号名,避免冲突:

方法1:用objcopy重定义符号

生成默认符号的目标文件后,使用objcopy --redefine-sym选项直接修改符号名。比如处理foo.bar时,先生成目标文件:

objcopy --input binary --output elf64-x86-64 --binary-architecture i386:x86-64 foo.bar foo_bar.o

再重定义三个核心符号,区分开foo.bar和foo_bar的符号:

objcopy \
  --redefine-sym _binary_foo_bar_start=_binary_foo_dot_bar_start \
  --redefine-sym _binary_foo_bar_end=_binary_foo_dot_bar_end \
  --redefine-sym _binary_foo_bar_size=_binary_foo_dot_bar_size \
  foo_bar.o

这样就能得到带有自定义名称的符号,不会和其他文件的符号重复。

方法2:使用自定义链接脚本

通过链接脚本手动映射二进制section到自定义符号,完全控制符号命名:

  1. 先生成仅包含原始二进制section的目标文件:
objcopy --input binary --output elf64-x86-64 --binary-architecture i386:x86-64 foo.bar foo_raw.o
  1. 编写链接脚本(比如custom_syms.ld),定义自己的符号:
SECTIONS {
  .data.res_foo_dot_bar : {
    _res_foo_bar_start = .;
    *(.data._binary_foo_bar_start);
    _res_foo_bar_end = .;
    _res_foo_bar_size = _res_foo_bar_end - _res_foo_bar_start;
  }
}
  1. 在链接程序时指定该脚本,即可使用自定义的_res_foo_bar_start等符号。

方法3:转成C数组编译(更灵活)

用bin2c工具将二进制文件转换成C语言数组,直接编译进程序,符号名完全由自己定义:

bin2c foo.bar > foo_bar_res.h

生成的头文件会包含类似unsigned char foo_bar_data[] = { ... };的定义,直接在代码中引用即可,彻底避免符号冲突问题。

内容的提问来源于stack exchange,提问作者jiandingzhe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:37:29