如何使用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到自定义符号,完全控制符号命名:
- 先生成仅包含原始二进制section的目标文件:
objcopy --input binary --output elf64-x86-64 --binary-architecture i386:x86-64 foo.bar foo_raw.o
- 编写链接脚本(比如
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; } }
- 在链接程序时指定该脚本,即可使用自定义的
_res_foo_bar_start等符号。
方法3:转成C数组编译(更灵活)
用bin2c工具将二进制文件转换成C语言数组,直接编译进程序,符号名完全由自己定义:
bin2c foo.bar > foo_bar_res.h
生成的头文件会包含类似unsigned char foo_bar_data[] = { ... };的定义,直接在代码中引用即可,彻底避免符号冲突问题。
内容的提问来源于stack exchange,提问作者jiandingzhe
相关产品推荐
相关产品推荐

