当前位置: 首页 > news >正文

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     #为不含调试信息的可执行文件添加调试信息
http://www.lryc.cn/news/38801.html

相关文章:

  • Windows使用Stable Diffusion时遇到的各种问题和知识点整理(更新中...)
  • MySQL workbench基本查询语句
  • 软件测试详解
  • YOLOS学习记录
  • 数组边遍历(for循环)边删除为什么删不干净 及三种实现删除的方法
  • 环境配置之Keepass
  • Java 电话号码的组合
  • MATLAB——将直接型转化为并联型和级联型
  • .NET Framework .NET Core与 .NET 的区别
  • carla与ros2的自动驾驶算法-planning与control算法开发与仿真
  • corn表达式
  • 推荐系统中对抗性机器学习-文献综述与未来发展整理分享
  • Proteus8.15安装教程
  • Shell 基本运算符
  • Linux基础命令-sed流编辑器
  • C语言笔试题(1)
  • 网络连接的三种模式
  • 大学模拟电路期末考试模拟题详解
  • C/C++内存管理讲解
  • 【Linux】网络原理
  • list模拟实现
  • CSS看这一篇就够啦,CSS基础大全,可用于快速回顾知识,面试首选
  • Canvas详细使用方法(一)
  • CentOS定时任务——crontab
  • C51---蓝牙模块---连接软件---控制LED灯
  • Linux 学习笔记——二、主机规划与磁盘分区
  • 麒麟服务器V10 版本 安装 Anaconda教程,也就是安装Python环境的教程(亲测有效)
  • 【3维视觉】网格细分Mesh Subdivision算法介绍(Loop, Catmull-Clark, Doo-Sabin)
  • 自学大数据第六天~HDFS命令
  • maven仓库的配置