ELF文件查看利器之readelf和objdump用法

Android在NDK开发工具中提供了readelf,用来帮助开发者查看编译后目标文件的组成结构和具体内容。

常用的有以下几个功能选项:

1)-h或者--file-header

显示在ELF文件头里包含的所有信息,:

同样是显示ELF文件头的信息,readelf比objdump要详细的多。

2)-l或者--program-headers或者--segments

显示程序头表信息,包扩有几个段,每个段的属性,以及每个段中包含有哪几个节(Section):

3)-S或者--section-headers或者--sections

显示节区表内的所有信息,包括每个节的属性,注意这里是用的是大写的“S”:

4)-t或者--section-details

用来显示所有节的详细信息,感觉上但从信息量上来说,和前面的“-S”没有什么大的不同:

5)-e或者--headers

显示所有头的信息,包括ELF文件头、程序头和节头,也就是“-h -l -S”的组合。

6)-s或者--syms或者--symbols

显示符号表的信息,包含静态符号表(.symtab)和动态符号表(.dynsym):

如果只关心动态符号表,可以直接使用“--dyn-syms”。

7)-r或者--relocs

显示所有重定位入口的信息,例如:

8)-d或者--dynamic

显示动态节区的内容

9)-x或者--hex-dump=

显示某个节区的二进制码,具体哪个节可以用该节的编号或者名字来指定,例如“-x .text”:

总体看来,就察看ELF内容来说,readelf和objdump在很多方面还是非常相似的,可以互补。

但是如果想看ELF文件中的汇编代码,还是objdump更强一点。

 

 

 

Android在NDK开发工具中提供了objdump,用来帮助开发者查看编译后目标文件的组成结构和具体内容。

常用的有以下几个功能选项:

1)-a或者--archive-headers

这个参数起到的作用和ar命令相似,用来看一个.a静态库文件中包含了哪些目标文件。

2)-f或者--file-headers

输出目标ELF文件头中包含的信息,例如:

表明这是个ELF文件,支持处理器指令集是armv5te,等等。总体来说,信息量有限。

3)-h或者--[section-]headers

输出目标文件中节表(Section Table)中所包含的所有节头(Section Header)的信息,:

可以看到,这个文件共有18个有效节区。从中,我们可以了解到每个节区的名字,大小,和文件头的偏移位置,对齐属性,以及其它的一些属性。

4)-x或者--all-headers

显示目标文件的所有头的信息,包括ELF文件头、程序头(Program Header)和节头(Section Header)。除了这些头之外,还包括动态节区(Dynamic Section)和符号表(Symbol Table)内的信息。例如:

5)-d或者--disassemble

反汇编目标ELF文件中包含可执行指令的哪些节区中的内容,:

如果有汇编语言的功底,就可以通过这个命令来探究目标文件中每个函数的实现逻辑,非常的方便。

6)-D或者--disassemble-all

-D与前面的-d类似,唯一的不同是,用-D会反汇编目标ELF文件中的所有内容,而前面的-d只会反汇编可执行代码的部分。

7)-s或者--full-contents

显示目标文件每个节区的二进制完整内容,对应的会显示该内容在目标文件中的偏移位置,还有将内容转换成ASCII码的形式,例如:

8)-S或者--source

混合显示源码和汇编代码,如果编译目标文件的时候指定了-g参数的话,效果会非常明显。否则,和-d参数没有什么区别,事实上-S参数默认包含了-d参数。

9)-t或者--syms

输出目标文件的符号表(Symbol Table),即目标ELF文件中名字叫做.symtab节内的内容。

10)-T或者--dynamic-syms

输出目标文件的动态符号表(Dynamic Symbol Table),即目标ELF文件中名字叫做.dynsym节内的内容,:

通过这张表内的信息,可以看出由本ELF文件中导出的符号,和需要从别的动态库中导入的符号。如果第三列显示“*UND*”表明这个符号在本ELF文件中未定义,也就是说这个符号要从别的动态库中导入,其它的情况表明这个符号由本ELF文件中定义。

11)-r或者--reloc

显示目标文件的静态重定位入口。

12)-R或者--dynamic-reloc

这个参数仅仅对于动态目标文件有意义,比如动态库文件(.so)。

13)-j或者--section=

表示只显示名字为“NAME”节区中的内容。

原文:https://blog.csdn.net/roland_sun/article/details/36649155 
 

你可能感兴趣的:(Linux)