摘要
objcopy命令是将目标文件(elf文件)的一部分或者全部内容拷贝到另外一个目标文件中,也可以实现目标文件的格式转换。objcopy依赖GNU BFD库来读写文件,需要注意的是在两种不同格式之间拷贝可重定位的目标文件可能有异常。
objcopy在做转换的时候会创建临时文件,然后将这些临时文件删除。objcopy使用BFD做转换工作。如果没有明确地格式要求,则objcopy将访问所有在BFD库中已经描述了的并且它可以识别的格式。
注意:objcopy工具不能用来改变文件的大端和小端属性。使用时请注意objcopy 所能支持的机器架构,及目标文件格式。
使用示例
objcopy --info(同objdump -i) 显示当前objcopy支持的芯片架构与目标文件格式
一般在x86-64架构下,目标文件格式为:elf64-x86-64;芯片架构为i386
objcopy --add-section mysection=hello_text main main.add
在原elf文件中添加一个mysection的段,这个段内容指定为hello_text文件;
objcopy -j mysection main.add section_hello
将原elf中某一段拷贝出来,输出为一个elf文件,section_hello文件中还是包含mysection段,其实相当于把除了mysection其他的段删除,生成一个新的elf文件。
Q: 如何将一个二进制文件,比如图片,词典一类的东西做为.o文件,直接链接到可执行文件内部呢?
A:
$ objcopy -I binary -O elf32-i386 -B i386 14_95_13.jpg image.o
$ gcc image.o tt.o -o tt
$ nm tt | grep 14_95
0805d6c7 D _binary_14_95_13_jpg_end
00014213 A _binary_14_95_13_jpg_size
080494b4 D _binary_14_95_13_jpg_start
llvm-strip 就是llvm-objcopy ,一般使用 --strip-unneeded 进行strip
常用指令:
head 查看文件内容
strings 查看文件中字符
readelf -S main.o 查看elf文件头信息
objdump -ht main.o 查看elf文件头信息及段表
参考链接:
objcopy命令_Linux objcopy命令使用详解:实现目标文件的格式转换
objcopy (GNU Binary Utilities)
https://www.cnblogs.com/dylancao/p/10039036.html
https://www.cnblogs.com/yangguang-it/p/7061759.html
https://www.cnblogs.com/openix/archive/2012/04/08/2437384.html