binutils工具集——objcopy的用法

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

一、工具简介

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     #为不含调试信息的可执行文件添加调试信息

猜你喜欢

转载自blog.csdn.net/oqqHuTu12345678/article/details/129468338