objcpy,objdump,readelf,nm
来源:互联网 发布:台湾人逛淘宝吗 编辑:程序博客网 时间:2024/05/01 22:38
-I : 输入文件的格式(binary, elf32-i386等)
-O : 输出文件的格式
-B : 二进制文件体系结构(i386, arm等)
-R : 删除不用的section(.comment .note 等)
-j : 仅留下有用的section(.text .data 等)
-S : 不复制重定位和符号信息
-K : 保留某个符号
-N : 去掉某个符号
-L : 使某个符号local化
-W : 使某个符号weaken化
例如: objcopy -S -O binary -j .text a.out a.bin 只保留.text的二进制文件.
2. objdump 显示目标文件信息
-f : 显示文件头信息(参考readelf -h)
-d : 反汇编目标文件中需要执行指令的section
-D : 反汇编目标文件中所有的section
-h : 显示section 头信息(参考readelf -S)
-x : 显示所有信息(参考readelf -a)
-s : 显示各个section的十六进制码以及对应的ascii码
-m : CPU架构
-b : 目标文件格式,默认elf32,可以指定为binary二进制格式.
例如: objdump -D -b binary -m i386 a.bin 对二进制文件进行反汇编
3. readelf 显示目标elf文件信息
-a : 显示所有信息-h : 显示elf头信息
-l : 显示Program Header Table中的每个Entry信息
-S : 显示Section Header Table中的每个Entry信息
-g : 显示Section Group信息
-s : 显示Symbol Table中的每个Entry信息
-e : 等同于 -h + -l + -s
-n : 显示.note段信息
-r : 显示可重定位信息
-d : 显示Dynamic Section信息
4. nm 列出目标文件中的符号
-a : 列出所有符号,包括debugger-only的符号.
-A : 显示文件名
-g : 只显示外部符号
-C : 将低级符号解码(demangle)成用户级名字,使C++函数名具有可读性.
-D : 显示Dynamic符号
-u : 仅显示没有定义的符号
-r : 反序显示
-n : 按地址顺序显示
nm列出符号的地址,符号类型和符号名字.其中符号说明如下:
A : 绝对地址,链接时不改变.
B : 符号位于bss数据段
C : 符号为common. common symbol是未初始化数据段(参考汇编文件中.common)
D : 已初始化数据段中的符号
G : 符号位于已初始化数据段中,重要用于small data object提高访问速度.
I : 该符号是对另一个符号的间接引用
N : 该符号是一个debugging符号
R : 只读数据去符号(C语言中的const修饰)
S : 符号位于非初始化数据区,用于small object
T : 符号位于text section
U : 符号未定义
V : 该符号是一个weak object
W : 弱符号
? : 类型未定义
objcopy用于将object的部分或全部内容拷贝到另一个object,从而可以实现格式的变换。
objcopy可用用于将文件转换成S-record格式或者raw二进制格式。
例如,
xxxx-elf-objcopy –O srec test.o test.s19
则将test.o转换成s-record文件中。通常涉及到text段。
xxxx-elf-objcopy –O binary test.o test.bin
则将test.o转换成raw binary文件格式。
当将object文件转换成raw binary格式时,通常将去除掉symbols和relocation信息。在生成s-record过程中,有时需要用选项“-S”,“-R”去除掉binary文件,s-record文件不需要的相应信息。
此外,还需要注意到使用objcopy不能够改变大、小endian。
选项
Desc
infile/outfile
源文件/目标文件
-I bfdname
--input-target=bfdname
输入文件的bfdname,可取值elf32-little,elf32-big等,可用用objdump –I查看相应的信息
-O bfdname
--output-target=bfdname
输出文件的bfdname
-F bfdname
--target=bfdname
指定输入、输出文件的bfdname,目标文件格式
-j sectionname
--only-section=sectionname
只将由sectionname指定的section拷贝到输出文件
-R sectionname
--remove-section=sectionname
去除掉由sectionname指定的section
-S
--strip-all
去掉源文件的符号信息和relocation信息
-g
--strip-debug
去除掉调试符号信息和相关的段
-K symbolname
--keep-symbol=symbolname
保留由symbolname指定的符号信息
-N symbolname
--strip-symbol=symbolname
去除掉由symbolname指定的符号信息
-G symbolname
--keep-global-symbol=symbolname
-L symbolname
--localize-symbol=symbolname
-W symbolname
--weaken-symbol=symbolname
-w
--wildcard
-x
--discard-all
-X
--discard-locals
处理符号
-b byte
--byte=byte
每byteth byte中保留1 byte
-i interleave
--interleave=interleave
每隔interleave字节拷贝1 byte
--gap-fill val
在section中填充val
--set-start val
设定新文件的start address
--change-start incr
--adjust-start incr
调整start address
--change-address incr
--adjust-vma incr
调整所有sections的VMA(virtual memory address)和LMA(linear memory address)。
--change-section-address
section{=,+,-}val
--adjust-section-vma section
{=,+,-}val
调整指定section的VMA/LMA地址
--set-section-flags section=flag
指定指定section的flag,flag的取值可以alloc,contents, load, noload, readonly, code, data, rom, share, debug
--add-section sectionname=filename
添加一个section,该section的内容为filenmae的内容
--rename-section oldname=
newname[,flags]
更改section的名
-V
--version
objcopy的version number
objdump命令的使用
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:
objdump -f test
显示test的文件头信息
objdump -d test
反汇编test中的需要执行指令的那些section
objdump -D test
与-d类似,但反汇编test中的所有section
objdump -h test
显示test的Section Header信息
objdump -x test
显示test的全部Header信息
objdump -s test
除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
举例:
将C源代码和反汇编出来的指令对照:
1.
编译成目标文件(要加-g选项)
gcc -g -o test.c
2.
输出C源代码和反汇编出来的指令对照的格式
objdump -S test.o
如下:
如何对任意一个二进制文件进行反汇编?
我们可以这样做:
objdump -D -b binary -m i386 a.bin
-D表示对全部文件进行反汇编,-b表示二进制,-m表示指令集架构,a.bin就是我们要反汇编的二进制文件
objdump -m可以查看更多支持的指令集架构,如i386:x86-64,i8086等
另外上面的所有objdump命令的参数同样适用于arm-linux-objdump。
同时我们也可以指定big-endian或little-endian(-EB或-EL),我们可以指定从某一个位置开始反汇编等。所以objdump命令是非常强大的!
readelf命令的使用
readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍:
- objcpy,objdump,readelf,nm
- ar, nm, objdump, readelf
- 对比objdump与readelf readelf objdump nm
- addr2line/objdump/nm/readelf使用
- 二进制实用程序(objdump, readelf,ar, nm等)
- 二进制实用程序(objdump, readelf,ar, nm等)
- nm readelf objdump objcopy makefile ld.script
- 二进制实用程序(objdump, readelf,ar, nm等)
- 二进制实用程序(objdump, readelf,ar, nm等)
- 程序分析命令nm,objdump, readelf
- 二进制实用程序(objdump, readelf,ar, nm等)
- readelf,nm, objdump工具使用的总结
- 二进制实用程序(objdump, readelf,ar, nm等)
- 二进制实用程序(objdump, readelf,ar, nm等) .
- 目标文件格式分析工具: ar,nm,objdump,objcopy,readelf
- 目标文件格式分析工具: ar,nm,objdump,objcopy,readelf
- 目标文件格式分析工具: ar,nm,objdump,objcopy,readelf
- [转载]目标文件格式分析工具: ar,nm,objdump,objcopy,readelf
- 常用资源整理
- 对象外道道指令程序实例
- uva 1076 - Password Suspects(AC自动机+记忆化搜索)
- drp——servlet
- 【14/9/5】与运行环境交互
- objcpy,objdump,readelf,nm
- Python模块:生成随机数模块random
- 浴火重生!1799元魅族MX4全面评测
- 面对对象4【抽象abstract】【接口interface】【多态】【instanceof关键字】【Object类】
- Stone(博弈)
- Hdu 4969 Just a Joke (简单积分)
- PAT 1078. Hashing
- uva 10829 - L-Gap Substrings(后缀数组)
- Spring @Autowired 注入的一个小技巧