1. objcopy 复制及修改目标文件
-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使用说明
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为例详细介绍:
readelf -v
显示版本
readelf -h
显示帮助
readelf -a test
显示test的全部信息
readelf -h test
显示test的ELF Header的文件头信息(就是ELF文件开始的前52个字节)
readelf -l test
显示test的Program Header Table中的每个Prgram Header Entry的信息(如果有)
readelf -S test
显示test的Section Header Table中的每个Section Header Entry的信息(如果有)
readelf -g test
显示test的Section Group的信息(如果有)
readelf -s test
显示test的Symbol Table中的每个Symbol Table Entry的信息(如果有)
readelf -e test
显示test的全部头信息(包括ELF Header,Section Header和Program Header,等同与 readelf -h -l -S test)
readelf -n test
显示test的note段的信息(如果有)
readelf -r test
显示test中的可重定位段的信息(如果有)
readelf -d test
显示test中的Dynamic Section的信息(如果有)
readelf -V test
显示test中的GNU Version段信息(如果有)
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。