以下内容源于网络资源的学习与整理,如有侵权请告知删除。
一、工具简介
objcopy主要用来转换目标文件的格式。
在实际开发中,我们会用该工具进行格式转换与内容删除。
(1)在链接完成后,将elf格式的.out文件转化为bin格式的文件。
#复制:将可执行程序test_adr.elf从一种二进制格式(elf)转换成另外一种二进制格式(bin)
arm-linux-objcopy -O binary -S test_adr.elf test_adr.bin
(2)(通过-g、-S等选项)删除文件正常运行时不需要的内容,比如符号表、重定位表、调试信息等。裁剪后其体积比原来小很多,可以节省flash资源。当flash空间不足时,我们可以先查看文件中是否存在运行时非必需的内容,并利用objcopy工具删除。
arm-linux-objcopy -g -S -O elf32-littlearm test_adr.elf test_adr2.elf
#或者写成
arm-linux-objcopy -g -S test_adr.elf -O elf32-littlearm test_adr2.elf
二、使用方法
通过man手册,可知该工具使用格式如下。
objcopy [options] infile [outfile] #[]表示该项是可选的
(1)其中options表示选项,有很多可选的,这里仅列出一些常用的选项。
选项 | 描述 |
-g --strip-debug | 表示不要将源文件中的调试信息拷贝到输出文件中。 |
-S --strip-all | 表示不要将源文件中的重定位信息和标号信息拷贝到输出文件中。 |
-F bfdname --target=bfdname | 指明源文件的格式是bfdname,同时也使用这个格式来写输出文件。bfdname是BFD库中描述的标准格式名,包括binary(二进制文件格式)、srec(S记录格式)、elf32-i386等。 |
-I bfdname(大写i) --input-target=bfdname | 指明源文件的格式是bfdname。明确告诉objcopy源文件的格式,比“objcopy自己去分析源文件的格式”高效。 |
-O bfdname --output-target=bfdname | 表示输出文件的格式是bfdname。 |
-R sectionpattern --remove-section=sectionpattern | 表示从输出文件中删除名为sectionpattern的段。这个选项可以多次使用,即可以“-R section1 -R section2”这样使用。不恰当地使用这个选项可能会导致输出文件不可用。 |
(2)下面是一些实例说明。
- objcopy -O srec main main.srec #将文件转换成S-record格式
- objcopy -O binary main main.bin #将文件转换成rawbinary 格式
- objcopy -S main main.stripall #生成一个不含重定位信息与标号信息的目标文件
- objcopy -R .comment main main.remove #去掉名为.comment的段
- objcopy --add-section mysection=hello_text main main.add #添加一个自定义的节到可执行文件并将一个文件内容添加到其中
- objcopy -j mysection main.add section_hello #将指定的段拷贝出来
- objcopy --only-keep-debug main.debug main.debuginfo # 生成调试信息文件
- objcopy --strip-debug main.debug main.stripdebug #生成不含调试信息的可执行文件
- objcopy --add-gnu-debuglink=main.debuginfo main.stripdebug #为不含调试信息的可执行文件添加调试信息