Binutils工具集中的一些比较常用的工具
addr2line
addr2line是用来将程序地址转换成其所对应的程序源文件、代码行以及所对应的函数。
ar
ar是用来管理档案文件的,在嵌入式系统开发中,ar主要是用来对静态库进行管理。
ar常用的几个参数总结:
c 创建一个档案文件
r 向档案文件中增加文件
t 显示档案文件中存在哪些文件
s 用于指示生成索引以加快查找速度
d 从档案文件中删除文件
x 从档案文件中解压文件
nm
nm用于列出程序文件中的符号,符号是指函数或变量名等。
nm所列出的每一行有三部分组成:
第一列,是指程序运行时的符号所对应的地址。对于函数则地址表示的是函数的开始地址;对于变量则表示的是变量的存储地址。
第二列,是指相应符号是放在哪一个段的。
第三列,是指符号的名称。
对nm列出的第二列信息,非常的有用,其意义在于可以了解我们在程序中所定义的一个符号(比如变量)是被放在程序的哪一个段的(.text、.data还是.bss)。第二列信息部分字母的含义如下(其他字母含义可以man nm查看):
A 表示符号所对应的值是绝对的,并且在以后的连接过程中也不会改变。
B或b 表示符号位于未初始化的数据段(.bss)中。
C 表示没有被初始化的公共符号
D或d 表示符号位于初始化的数据段(.data)中。
N 表示符号是调试用的。
p 表示符号位于一个栈回朔段内。
R或r 表示符号位于只读数据段(.rdata)中。
T或t 表示符号位于代码段(.text)中。
U 表示符号没有被定义。
注,同一个字母的小写,表示该符号有static修饰。
objdump
objdump可以用来查看目标程序中的段信息和调试信息,也可以用来对目标程序进行反汇编,还有其他一些功能,具体参考如下。
使用objdump的-h选项查看目标程序的段信息和调试信息(如果有调试信息的话——编译时加了-g选项)。
objdump -h输出的段信息主要包括如下所示几列内容:

Size:每一个段的大小。
VMA:Virtual Memory Address,虚拟内存地址,表示该段在程序运行时的起始地址。
LMA:Load Memory Address,加载内存地址,表示加载程序时该段存放的起始地址。
注,在大多数情况下,VMA和LMA是一样的。由于绝大多数的嵌入式系统都不使用虚拟内存(即不使用MMU),所以VMA的地址就是系统的实地址。
File off:指示的是每一个段在代码文件中的存储位置。对于boot loader来说,就是要通过File off信息从文件中读出相应段的内容,然后将内容写到VMA所对应的地址块上。
Align:指示了每一个段的对齐字节数是多少。
使用objdump的-d选项可以显示程序文件的汇编代码。
在使用-d选项进行反汇编时,还有一个非常有用的选项是-S,其用途是告诉objdump在反汇编时同时显示C/C++源程序和与之对应的汇编代码。
使用objdump的-f选项可以显示目标文件的头信息。
其中最要注意的是start address,其指示了这一程序被执行时的入口地址是什么。对于嵌入式系统,当boot loader加载完程序后,就会调转到start address运行被加载的程序。
另一个非常有用的选项是-s,将它与-j选项配合使用能查看某一个段中的具体内容。
例如,要查看test的.data段:objdump –s –j .data test
objcopy
objcopy的功能非常的强大,它可以对最后生成的程序文件进行一定的编辑。
可以通过-j选项来指定哪一个段是我们需要抽取的。如果有多个段需要抽取,则使用多个-j选项即可。
与-j参数相反的是,采用-R可以删除一个段。
在嵌入式系统中,资源往往是有限的,有时为了减少程序文件所占的空间(比如flash),我们可以将程序中的调试信息去除,最为常用的是采用strip工具达到这一目的。但是,采用objcopy的--strip-debug选项也可以达到同样的目的。
objcopy最重要的功能就是能按照我们的需要抽取程序文件中的段。在嵌入式系统中,比如制作boot loader时就会需要用到objcopy,以便将代码段抽取出来,然后使用烧写器将代码烧写到系统的启动运行地指处。
ranlib
ranlib的功能相对简单,就是用于在档案文件中生成文件索引。ar中的s参数也有同样的功能。当档案文件增加了索引后,对于其中文件的存取速度将更快。
readelf
readelf工具的功能其实objdump都有。
size
size工具也很简单,就是列出程序文件中各段的大小。
注:在使用objdump查看段信息时,列出的段有.text、.data、.bss、.rdata、.idata。在使用size列出各段大小时,将.rdata被归类到.text段中,.idata被归类到.data段中。
如果使用-A选项,size将列出与objdump相同的段及段的大小。
strings
strings用于查看我们的程序文件中的可显示字符。
注,版本信息和密码信息都可以从strings的输出结果中找到。
由于strings是输出.data段中的字符串信息的,因此,strings工具与具体的处理器是无关的。
strip
strip的功能也相对的简单,主要用于去除程序文件中的调试信息以便减小文件的大小。
以上内容主要参考自:http://yunli.blog.51cto.com/831344/186727
Binutils工具集中的一些比较常用的工具的更多相关文章
- PHP之封装一些常用的工具类函数
分享一些PHP中常用的工具里函数: <?php /** * Created by PhpStorm. * User: Steven * Date: 2016/8/12 * Time: 14:21 ...
- 常用网络工具 ipconfig arp traceroute
如今的计算机是离不开网络的计算机了,因而我们对网络要有一基础的认识.连不上网,程序运行不正常之类的,多少都与网络有关.本文将介绍常用的工具. 网络出问题 ipconfig ping 网络连不上,首先要 ...
- SharePoint 2013常用开发工具分享
众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...
- 常用备份工具是mysql自带的mysqldump
常用备份工具是mysql自带的mysqldump,mysqldump -u root -p密码 dbname >d:\test.sql ------------备份某个库mysqldump -u ...
- Linux 常用工具小结:(5) lftp工具使用
Linux 常用工具小结:(1) lftp工具使用. 这里会按照一些比较常用的功能列出,并举一个具体的例子逐一解释功能. 通常使用ftp过程是登陆ftp,浏览ftp内容,下载ftp文件,或者上传ftp ...
- Android常用的工具类
主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Prefe ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- Drupal常用开发工具(一)——Devel模块
进行 Drupal 开发时有许多模块和工具可供使用,其中最常用的两项便是 Devel 及 Drupal for Firebug.本文和<Drupal常用开发工具(二)——Drupal for F ...
- Oracle RAC 常用维护工具和命令
Oracle RAC 常用维护工具和命令 分类: Oracle Basic Knowledge Oracle RAC2010-03-09 01:02 13987人阅读 评论(6) 收藏 举报 orac ...
随机推荐
- win10如何彻底删除Gis|彻底卸载ArcGis的方法说明
ArcGIS产品线为用户提供一个可伸缩的,全面的GIS平台.ArcObjects包含了许多的可编程组件,从细粒度的对象(例如单个的几何对象)到粗粒度的对象(例如与现有ArcMap文档交互的地图对象)涉 ...
- python测试开发django-18.admin后台中文版
前言 django的admin后台页面默认是英文的,不喜欢英文的话,可以改下setting.py里面的语言设置,改成中文版的显示 语言设置 打开setting.py,找到以下内容 # Internat ...
- linux下一个网卡配置多个IP
转自:http://blog.csdn.net/beckdon/article/details/15815197 最常用的给网卡配置ip的命令为 #ifconfig eth0 192.168.0.1 ...
- svn各种箭头的含义
黄色感叹号(有冲突): 有冲突了,冲突就是你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许 你提交,防止你的提交覆盖了 ...
- [Android Pro] ESP和EBP 栈顶指针和栈底指针
cp: http://blog.csdn.net/hutao1101175783/article/details/40128587 (1)ESP:栈指针寄存器(extended stack poin ...
- AppServ与IIS快速共存搭建PHP环境
一:AppServ 一路安装 其中,不能与IIS端口冲突,比如可以指定端口为8080: 安装完毕后验证 http://localhost:8080,验证 MySql是否能够打开: 二:IIS整合 新建 ...
- C# 获取文件的MIME类型
在C#中获取文件的MIME类型(Content Type)的方法如下 一.使用MimeMapping类 在System.Web程序集中,当前为静态类,就一个获取 // // 摘要: // 映射文档扩展 ...
- 华清远见Linux设备驱动(每章小结)
1. linux设备驱动是以内核模块的方式而存在的,在具体的驱动开发中将驱动编译为模块具有很到的工程意义.因为如果将正在开发中的驱动编译如内核,而开发过程中会不断修改驱动代码,则需要不断的编译和重启 ...
- 用EntityFramework6连接MySQL【转】
http://www.cnblogs.com/wujingtao/p/5399950.html 不是微软的亲儿子这待遇就是不一样,其中的坑可真实不少,第一次连MySQL足足折腾了我大半天. 废话不多说 ...
- Hash dump神器 (转)
在Win7 x64位下无压力测试通过. 0 / INTRO========= Quarks PwDump 是一个Win32环境下的系统授权信息导出工具,目前除此之外没有任何一款工具可以导出如此全面的信 ...