GCC编译器原理(一)05------GCC 工具:readelf、size、strings、strip和 windres
1.3.18 readelf:elf 文件格式分析工具
这个工具和 objdump 命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖 BFD 库( BFD 库是一个 GNU 项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件);
ELF 文件类型 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF 是构成众多 xNIX 系统的基础之一。
- ELF文件有三种类型:
- 可重定位的对象文件(Relocatable file) 由汇编器汇编生成的 .o 文件
- 可执行的对象文件(Executable file) 可执行应用程序
- 可被共享的对象文件(Shared object file) 动态库文件,也即 .so 文件
- ELF文件的节:
- text section 里装载了可执行代码;
- data section 里面装载了被初始化的数据;
- bss section 里面装载了未被初始化的数据;
- 以 .rec 打头的 sections 里面装载了重定位条目;
- symtab 或者 .dynsym section 里面装载了符号信息;
- strtab 或者 .dynstr section 里面装载了字符串信息;
参数说明
选项 |
描述 |
-a |
--all 显示全部信息,等价于 -h -l -S-s -r -d -V -A -I. |
-h |
--file-header 显示elf文件开始的文件头信息. |
-l |
--program-headers --segments 显示程序头(段头)信息(如果有的话)。 |
-S |
--section-headers --sections 显示节头信息(如果有的话)。 |
-g |
--section-groups 显示节组信息(如果有的话)。 |
-t |
--section-details 显示节的详细信息(-S 的)。 |
-s |
--syms --symbols 显示符号表段中的项(如果有的话)。 |
-e |
--headers 显示全部头信息,等价于: -h -l -S |
-n |
--notes 显示note段(内核注释)的信息。 |
-r |
--relocs 显示可重定位段的信息。 |
-u |
--unwind 显示unwind段信息。当前只支持 IA64ELF 的 unwind 段信息。 |
-d |
--dynamic 显示动态段的信息。 |
-V |
--version-info 显示版本段的信息。 |
-A |
--arch-specific 显示CPU构架信息。 |
-D |
--use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。 |
-x <number or name> |
--hex-dump=<number or name> 以16进制方式显示指定段内内容。number 指定段表中段的索引,或字符串指定文件中的段名。 |
-w[liaprmfFsoR] |
--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。 |
-I |
--histogram 显示符号的时候,显示 bucketlist 长度的柱状图。 |
-v |
--version 显示 readelf 的版本信息。 |
-H |
--help 显示 readelf 所支持的命令行选项。 |
-W |
--wide 宽行输出。 |
@file |
可以将选项集中到一个文件中,然后使用这个 @file 选项载入。 |
1.3.19 size
size 工具,就是列出程序文件中各段的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。
命令使用格式:size [ option ... ] [ object ... ]
选项 |
描述 |
-A –B |
选择以 sysv | berkeley 的样式输出。 |
-o | -d | -x |
选择输出数据的格式. |
-t |
选择全部输出 |
1.3.20 strings
strings 工具在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings 工具对识别随机对象文件很有用。
语法:strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [ file ... ]
选项 |
描述 |
-a |
--all 扫描整个文件而不是只扫描目标文件初始化和装载段 |
-f |
–print-file-name 在显示字符串前先显示文件名 |
-n |
–bytes=[number] 找到并且输出所有 NUL 终止符序列 |
- |
设置显示的最少的字符数,默认是 4 个字符 |
-t |
--radix={o,d,x} 输出字符的位置,基于八进制,十进制或者十六进制 |
-o |
类似 --radix=o |
-T |
--target= 指定二进制文件格式 |
-e |
--encoding={s,S,b,l,B,L} 选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit |
@ |
读取中选项 |
1.3.21 strip
strip 工具通过除去绑定程序和符号调试程序使用的信息,减少扩展公共对象文件格式(XCOFF)的对象文件的大小。
语法 strip [ -V ] [ -r [ -l ] | -x [ -l ] | -t | -H | -e | -E ] [ -X {32 |64 |32_64 }] [ -- ] File ...
strip 命令减少 XCOFF 对象文件的大小。
strip 命令从 XCOFF 对象文件中有选择地除去行号信息、重定位信息、调试段、typchk 段、注释段、文件头以及所有或部分符号表。 一旦使用该命令,则很难调试文件的符号;因此,通常应该只在已经调试和测试过的生成模块上使用 strip 命令。使用 strip 命令减少对象文件所需的存储量开销。
对于每个对象模块,strip 命令除去给出的选项所指定的信息。对于每个归档文件,strip 命令从归档中除去全局符号表。
可以使用 ar -s 命令将除去的符号表恢复到归档文件或库文件中。
没有选项的 strip 命令除去行号信息、重定位信息、符号表、调试段、typchk 段和注释段。
选项 |
描述 |
-e |
在对象文件的可选头中设置 F_LOADONLY 标志。如果对象文件放置在归档中,则该标志告知绑定程序(ld 命令),在与此归档链接时应忽略该对象文件中的符号。 |
-E |
复位(关闭)对象文件的可选头中的 F_LOADONLY 位。(请参阅 -e 标志。) |
-H |
除去对象文件头、任何可选的头以及所有段的头部分。注: 不除去符号表信息。 |
-l |
(小写 L)从对象文件中除去行号信息。 |
-r |
除了外部符号和静态符号条目,将全部符号表信息除去。不除去重定位信息。同时除去调试段和 typchk 段。这个选项产生一个对象文件,该对象文件仍可以用作输入到链接编辑器(ld 命令)中。 |
-t |
除去大多数符号表信息,但并不除去函数符号或行号信息。 |
-V |
打印 strip 命令的版本号。 |
-x |
除去符号表信息,但并不除去静态或外部符号信息。 -x 标志同时除去重定位信息,因此将不可能链接到该文件。 |
-X mode |
指定应检查 strip 的对象文件的类型。 mode 必须是下列之一:
缺省值是处理 32 位对象文件(忽略 64 位对象文件)。也可以用 OBJECT_MODE 环境变量来设置 mode 。例如,OBJECT_MODE=64 使 strip 处理任何 64 位对象文件,并忽略 32 位对象文件。-X 标志重设 OBJECT_MODE 变量。 |
-- |
(双连字符)将跟随在该标志后的所有参数解释为文件名。这就允许除去名称是以连字符开始的文件。 |
1.3.22 windres
Windows 方面的命令,不涉及
GCC编译器原理(一)05------GCC 工具:readelf、size、strings、strip和 windres的更多相关文章
- GCC编译器原理(二)------编译原理一:目标文件
一.目标文件 在 UNIX® 和 Linux® 中,任何事物都是文件.UNIX 和 Linux 编程实际上是编写处理各种文件的代码.系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和 ...
- GCC编译器原理(一)------交叉编译器制作和GCC组件及命令
1.1 交叉编译器制作 默认安装的 GCC 编译系统所产生的代码适用于本机,即运行 GCC 的机器,但也可将 GCC 安装成能够生成其他的机器代码.安装一些必须的模块,就可产生多种目标机器代码,而且可 ...
- GCC编译器原理(三)------编译原理三:编译过程(2-2)---编译之语法分析
2.2 语法分析 语法分析器(Grammar Parser)将对由扫描器产生的记号进行语法分析,从而产生语法树(Syntax Tree).整个分析过程采用了上下文无关语法(Context-free G ...
- GCC编译器原理(一)04------GCC 工具:nlmconv、nm、objcopy、objdump和 ranlib
1.3.13 nlmconv nlmconv 将可重定位的对象文件(Infile)转换为 NetWare 可加载模块(outfile),并可选择读取头文件信息获取 NLM 头信息. 选项,描述 -I ...
- GCC编译器原理(一)------GCC 工具:addr2line、ar、as、c++filt和elfedit
1.3 GCC 工具 1.3.1 binutils 工具集 工具 描述 addr2line 给出一个可执行文件的内部地址,addr2line 使用文件中的调试信息将地址翻译成源代码文件名和行号. ar ...
- GCC编译器原理(一)03------GCC 工具:gprof、ld、libbfd、libiberty 和libopcodes
1.3.7 gprof:性能分析工具 参考文档:https://www.cnblogs.com/andashu/p/6378000.html gprof是GNU profile工具,可以运行于linu ...
- GCC编译器原理(三)------编译原理三:编译过程(3)---编译之汇编以及静态链接【2】
4.1.2 符号解析与重定位 (1)重定位 在完成空间和地址的分配步骤之后,链接器就进入了符号解析和重定位的步骤,这是静态链接的核心部分. 先看看 a.o 的反汇编文件: objdump -d a.o ...
- GCC编译器原理(三)------编译原理三:编译过程(2-1)---编译之词法分析
二.编译 引用文档:https://blog.csdn.net/chdhust/article/details/9040647 编译过程就是把预处理完的文件进行一系列词法分析.语法分析.语义分析及优化 ...
- GCC编译器原理(三)------编译原理三:编译过程---预处理
Gcc的编译流程分为了四个步骤: 预处理,生成预编译文件(.文件):gcc –E hello.c –o hello.i 编译,生成汇编代码(.s文件):gcc –S hello.i –o hello. ...
随机推荐
- windows7安装docker
因为本机已经安装了git,所以这里取消勾选 配置环境变量 进入到D:\DockerToolbox 将D:\DockerToolbox下的boot2docker.iso 复制到C:\Users\my\. ...
- [NOI2010]航空管制(拓扑排序+贪心)
题目描述 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上,小X不幸又一 ...
- Navicat Premium 12 破解(MySQL、MariaDB、MongoDB、SQL Server、SQLite)
打开注入到安装目录中的exe中 破解提示(还没好,继续看下去) 如果你安装的是中文版,选一下中文版(英文默认即可),获取一下key(名字和组织可以自定义) 打开Navicat,选择注册(第一次打开选注 ...
- 手把手教你用1行代码实现人脸识别 --Python Face_recognition
环境要求: Ubuntu17.10 Python 2.7.14 环境搭建: 1. 安装 Ubuntu17.10 > 安装步骤在这里 2. 安装 Python2.7.14 (Ubuntu17.10 ...
- OpenLayers学习笔记(三)— QML与HTML通信之 地图上点击添加自由文本
实现在地图随意点击,弹出文本输入框,输入任意文字,完成自由文本添加的功能 作者: 狐狸家的鱼 GitHub:八至 本文链接:地图上点击添加自由文本 关于如何QML与HTML通信已经在上一篇文章 QML ...
- A1107. Social Clusters
When register on a social network, you are always asked to specify your hobbies in order to find som ...
- Win32 SDK:ListBox 为什么不整个 LB_SETTEXT
Win32 & SDK: ListBox 有个 LB_GETTEXT,为什么没有 LB_SETTEXT,想修改指定Item的Text,还真不容易. 自已写了一个,支持单选和多选模式,部分代码: ...
- gradle的安装配置成功标志
gradle主要位于AndroidStudio中 看我的目录 在环境变量里添加用户变量 GRADLE_HOME 然后在环境变量 path 中增加 %GRADLE_HOME%\bin;,如图所示 测试配 ...
- Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
1.开发环境配置 Windows7 64位旗舰版 python3.6 node.js mysql navicat pycharm webstorm或vscode 2.项目初始化 新版的pycharm很 ...
- C# Winfom 中ListBox的简单用法
https://www.cnblogs.com/xielong/p/6744805.html Winform控件ListBox的用法 1.如何添加listBox的值 this.listBox1.Ite ...