-
arm开发板上边不支持arm-linux-objdump 反汇编命令该怎么办?
2017-12-01 02:06:41arm开发板上边不支持arm-linux-objdump 反汇编命令该怎么办? 包括addr2line命令也无法识别, 怎么查看开发板上边支持什么命令呢? -
linux objdump 反汇编命令
2019-08-11 06:01:14objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。 参数选项 --archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的...objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
参数选项
--archive-headers
-a
显示档案库的成员信息,类似ls -l将lib*.a的信息列出。-b bfdname
--target=bfdname
指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如:objdump -b oasys -m vax -h fu.o
显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。-C
--demangle
将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。--debugging
-g
显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。-e
--debugging-tags
类似-g选项,但是生成的信息是和ctags工具相兼容的格式。--disassemble
-d
从objfile中反汇编那些特定指令机器码的section。-D
--disassemble-all
与 -d 类似,但反汇编所有section.--prefix-addresses
反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。-EB
-EL
--endian={big|little}
指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records.-f
--file-headers
显示objfile中每个文件的整体头部摘要信息。-h
--section-headers
--headers
显示目标文件各个section的头部摘要信息。-H
--help
简短的帮助信息。-i
--info
显示对于 -b 或者 -m 选项可用的架构和目标格式列表。-j name
--section=name
仅仅显示指定名称为name的section的信息-l
--line-numbers
用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。-m machine
--architecture=machine
指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.--reloc
-r
显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。--dynamic-reloc
-R
显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。-s
--full-contents
显示指定section的完整内容。默认所有的非空section都会被显示。-S
--source
尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。--show-raw-insn
反汇编的时候,显示每条汇编指令对应的机器码,如不指定--prefix-addresses,这将是缺省选项。--no-show-raw-insn
反汇编时,不显示汇编指令的机器码,如不指定--prefix-addresses,这将是缺省选项。--start-address=address
从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。--stop-address=address
显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。-t
--syms
显示文件的符号表入口。类似于nm -s提供的信息-T
--dynamic-syms
显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。-V
--version
版本信息--all-headers
-x
显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。-z
--disassemble-zeroes
一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。@file
可以将选项集中到一个文件中,然后使用这个@file选项载入。
常用符号表字段
.text:已编译程序的机器代码。
.rodata:只读数据,比如printf语句中的格式串和开关(switch)语句的跳转表。
.data:已初始化的全局C变量。局部C变量在运行时被保存在栈中,既不出现在.data中,也不出现在.bss节中。
.bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。目标文件格式区分初始化和未初始化变量是为了空间效率在:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间。
.symtab:一个符号表(symbol table),它存放在程序中被定义和引用的函数和全局变量的信息。一些程序员错误地认为必须通过-g选项来编译一个程序,得到符号表信息。实际上,每个可重定位目标文件在.symtab中都有一张符号表。然而,和编译器中的符号表不同,.symtab符号表不包含局部变量的表目。
.rel.text:当链接噐把这个目标文件和其他文件结合时,.text节中的许多位置都需要修改。一般而言,任何调用外部函数或者引用全局变量的指令都需要修改。另一方面调用本地函数的指令则不需要修改。注意,可执行目标文件中并不需要重定位信息,因此通常省略,除非使用者显式地指示链接器包含这些信息。
.rel.data:被模块定义或引用的任何全局变量的信息。一般而言,任何已初始化全局变量的初始值是全局变量或者外部定义函数的地址都需要被修改。
.debug:一个调试符号表,其有些表目是程序中定义的局部变量和类型定义,有些表目是程序中定义和引用的全局变量,有些是原始的C源文件。只有以-g选项调用编译驱动程序时,才会得到这张表。
.line:原始C源程序中的行号和.text节中机器指令之间的映射。只有以-g选项调用编译驱动程序时,才会得到这张表。
.strtab:一个字符串表,其内容包括.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。
使用举例反汇编应用程序
objdump -d main.o
显示文件头信息
objdump -f main.o
显示制定section段信息(comment段)
objdump -s -j .comment main.o
反汇编实例
1. 准备代码hello.c
#include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("baoli"); MODULE_DESCRIPTION("hello world module"); static int __init hello_init(void) { int * p = 0; printk(KERN_WARNING "hello world.\n"); *p = 1; return 0; } static void __exit hello_exit(void) { printk(KERN_WARNING "hello exit!\n"); } module_init(hello_init); module_exit(hello_exit);
2. 编译&安装模块
编译成ko模块后,执行isnmod hello.ko,显示killed安装失败。
用dmesg内核日志,可以看到内核跑出了Oops异常:
给出了原因:不能访问NULL指针
错误发生位置:hello_init+0x10,即hello_init偏移0x10处,可以反汇编查看此处对应的具体指令。3. 反汇编分析
执行:objdump -d hello.o > assemble.txt
汇编代码如下:
hello.o: file format elf64-x86-64 Disassembly of section .init.text: 0000000000000000 <init_module>: MODULE_LICENSE("GPL"); MODULE_AUTHOR("baoli"); MODULE_DESCRIPTION("hello world module"); static int __init hello_init(void) { 0: 55 push %rbp 1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 8: 48 89 e5 mov %rsp,%rbp b: e8 00 00 00 00 callq 10 <init_module+0x10> 10: c7 04 25 00 00 00 00 movl $0x1,0x0 17: 01 00 00 00 1b: 31 c0 xor %eax,%eax 1d: 5d pop %rbp 1e: c3 retq Disassembly of section .exit.text: 0000000000000000 <cleanup_module>: 0: 55 push %rbp 1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 8: 48 89 e5 mov %rsp,%rbp b: e8 00 00 00 00 callq 10 <cleanup_module+0x10> 10: 5d pop %rbp 11: c3 retq
可以看到hello_init+0x10处对应汇编指令为movl $0x1,0x0,即*p = 1;
通过objdump反汇编Oops可以轻松的知道错误原因及位置。
4. objdump总结
1)objdump -d:反汇编目标文件中包含的可执行指令。
2)如果需要混合显示源码和汇编代码,需要加上-S选项,并且在编译目标文件时加上-g。
3)如果在编译目标文件时没有加-g选项,则-S相当于-d。
4)-S选项生成的混合代码,有时文件结构混乱,可读性较差。推荐使用-d选项,直接阅读汇编代码。 -
objdump 反汇编
2013-07-19 21:52:38objdump是gcc工具,用来查看编译后目标文件的组成。 常用命令: objdump -x obj:以某种分类信息的形式把目标文件的数据组成输出;...objdump -j ./text/.data -S obj:输出指定段的信息(反汇编源代码) objdump -S obobjdump是gcc工具,用来查看编译后目标文件的组成。
常用命令:
objdump -x obj:以某种分类信息的形式把目标文件的数据组成输出;<可查到该文件的的所有动态库>
objdump -t obj:输出目标文件的符号表()
objdump -h obj:输出目标文件的所有段概括()
objdump -j ./text/.data -S obj:输出指定段的信息(反汇编源代码)
objdump -S obj:输出目标文件的符号表() 当gcc -g时打印更明显objdump -j .text -Sl stack1 | more
-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,
效果比较明显。隐含了-d参数。
-l 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用
使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求
编译时使用了-g之类的调试编译选项。
-j name 仅仅显示指定section的信息这是按Section的名称列出的,其中跟动态连接有关的Section也出现在前面名为Dynamic的Segment中,只是在那里是按类型列出的。例如,前面类型为HASH的表项说与此有关的信息在0x8048128处,而这里则说有个名为.hash的Section,其起始地址为0x8048128。还有,前面类型为PLTGOT的表项说与此有关的信息在0x804a2c4处,这里则说有个名为.got的Section,其起始地址为0x804a2c4,不过Section表中提供的信息更加详细一些,有些信息则互相补充。在Section表中,只要类型为PROGBITS,就说明这个Section的内容都来自映像文件,反之类型为NOBITS就说明这个Section的内容并非来自映像文件。
跟区段头表中的信息一对照,就可以知道在第16项.data以前的所有区段都是要装入用户空间的。这里面包括了大家所熟知的.text即“代码段”。此外,.init、.fini两个区段也有着特殊的重要性,因为映像的程序入口就在.init段中,实际上在进入main()之前的代码都在这里。而从main()返回之后的代码,包括对exit()的调用,则在.fini中。还有一个区段.plt也十分重要,plt是“Procedure Linkage Table”的缩写,这就是用来为目标映像跟共享库建立动态连接的。
有些Section名是读者本来就知道的,例如.text、.data、.bss;有些则从它们的名称就可猜测出来,例如.symtab是符号表、.rodata是只读数据、还有.comment和.debug_info等等。还有一些可能就不知道了,这里择其要者先作些简略的介绍:(1).hash。为便于根据函数/变量名找到有关的符号表项,需要对函数/变量名进行hash计算,并根据计算值建立hash队列。
● .dynsym。需要加以动态连接的符号表,类似于内核模块中的INPORT符号表。这是动态连接符号表的数据结构部分,须与.dynstr联用。
● .dynstr。动态连接符号表的字符串部分,与.dynsym联用。
● .rel.dyn。用于动态连接的重定位信息。
● .rel.plt。一个结构数组,其中的每个元素都代表着GOP表中的一个表项GOTn(见下)。
● .init。在进入main()之前执行的代码在这个Section中。
● .plt。“过程连接表(Procedure Linking Table)”,见后。
● .fini。从main()返回之后执行的代码在这个Section中,最后会调用exit()。
● .ctors。表示“Constructor”,是一个函数指针数组,这些函数需要在程序初始化阶段(进入main()之前,在.init中)加以调用。
● .dtors。表示“Distructor”,也是一个函数指针数组,这些函数需要在程序扫尾阶段(从main()返回之后,在.fini中)加以调用。
● .got。“全局位移表(Global Offset Table)”,见后。
● .strtab。与符号表有关的字符串都集中在这个Section中。
gcc -g -o stack1 stack1.c
objdump -dS stack1 (objdump -j .text -Sl stack1 | more 只显示代码段)Disassembly of section .init:(在进入main()之前执行的代码在这个Section中)
Disassembly of section .plt:(过程连接表(Procedure Linking Table,实现动态链接)
Disassembly of section .text:(代码段)
080482e0 <_start>:
80482e0: 31 ed xor �p,�p
80482e2: 5e pop %esi
80482e3: 89 e1 mov %esp,�x
80482e5: 83 e4 f0 and $0xfffffff0,%esp
80482e8: 50 push �x
80482e9: 54 push %esp
80482ea: 52 push �x
80482eb: 68 50 84 04 08 push $0x8048450
80482f0: 68 f0 83 04 08 push $0x80483f0
80482f5: 51 push �x
80482f6: 56 push %esi
80482f7: 68 c5 83 04 08 push $0x80483c5
80482fc: e8 c3 ff ff ff call 80482c4 <__libc_start_main@plt>
8048301: f4 -
vmlinux 反汇编_objdump 反汇编 vmlinux
2021-01-14 14:40:14COMPILE=aarch64-linux-android- 交叉编译工具的版本从android顶层/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin查找aarch64-linux-android-objdump输入命令sudo ./aarc...android 8.1 and kernel 4.4
从编译终端界面查找 CROSS_COMPILE=aarch64-linux-android- 交叉编译工具的版本
从android顶层/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin查找aarch64-linux-android-objdump
输入命令sudo ./aarch64-linux-android-objdump,切忌./ 一定要有,代表当前目录的aarch64-linux-android-objdump,否则出现command not found。
1.确保vmlinux中包含debug信息。主要由编译设置gcc -g
使成生的vmlinux中含有debug信息
3. sudo ./aarch64-linux-android-objdump -h vmlinux > vmlinux.txt
显示 linux 内核段信息,如段的开始虚拟地址,段的长度
4. sudo ./aarch64-linux-android-objdump -S -l -z vmlinux > vmlinux.txt
反汇编 vmlinux 到vmlinux.txt, vmlinux.txt 含有汇编和 c 源文件的混合代码,看起来很方
便。而且能一步步看linux怎么一步步运行的。
5. sudo ./aarch64-linux-android-objdump -S -l -z -j xxxx(section name) vmlinux > vmlinux.txt
反汇编 linux 内核段 xxxx 到文件 vmlinux.txt 中。
6. sudo ./aarch64-linux-android-objdump -x vmlinux > x.txt
vmliux中所有段的头信息,其中包口vmlinux的入口地址等
7. sudo ./aarch64-linux-android-objdump --debugging vmlinux > debugging.txt
很多有用的debug信息,如函数名,结构体定义等
-
objdump 反汇编 vmlinux
2018-03-22 13:57:35android 8.1 and kernel 4.4从编译终端界面查找 CROSS_COMPILE=aarch64-linux-android- 交叉编译工具的版本从android顶层/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-...objdump输入命令sudo ./aarc...android 8.1 and kernel 4.4
从编译终端界面查找 CROSS_COMPILE=aarch64-linux-android- 交叉编译工具的版本
从android顶层/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin查找aarch64-linux-android-objdump
输入命令sudo ./aarch64-linux-android-objdump,切忌./ 一定要有,代表当前目录的aarch64-linux-android-objdump,否则出现command not found。
1.确保vmlinux中包含debug信息。主要由编译设置gcc -g
使成生的vmlinux中含有debug信息
3. sudo ./aarch64-linux-android-objdump -h vmlinux > vmlinux.txt
显示 linux 内核段信息,如段的开始虚拟地址,段的长度
4. sudo ./aarch64-linux-android-objdump -S -l -z vmlinux > vmlinux.txt
反汇编 vmlinux 到vmlinux.txt, vmlinux.txt 含有汇编和 c 源文件的混合代码,看起来很方
便。而且能一步步看linux怎么一步步运行的。
5. sudo ./aarch64-linux-android-objdump -S -l -z -j xxxx(section name) vmlinux > vmlinux.txt
反汇编 linux 内核段 xxxx 到文件 vmlinux.txt 中。
6. sudo ./aarch64-linux-android-objdump -x vmlinux > x.txt
vmliux中所有段的头信息,其中包口vmlinux的入口地址等
7. sudo ./aarch64-linux-android-objdump --debugging vmlinux > debugging.txt
很多有用的debug信息,如函数名,结构体定义等
-
实例分析objdump反汇编用法
2018-07-06 15:39:16Ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版-----------------------------------------------------------------------------------objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。... -
简单实例分析objdump反汇编用法
2018-12-07 10:59:05objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。 1. 准备代码hello.c #include <linux/module.h> #include <linux/init.h> #include <linux/kernel... -
Linux 下使用 objdump 反汇编
2016-10-18 21:54:26objdump有点象那个快速查看之流的...对于一般只想让自己程序跑起来的程序员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,至少你可以自己写写shellcode了,或者看看人家给的exploit中 -
objdump 反汇编文件输出格式
2013-05-02 20:32:39objdump是一个很有用的命令,可以查看可执行文件的反汇编结果。 今天查阅了点资料,特记录如下: Sections: Idx Name Size VMA LMA File off Algn 0 .rom_vectors 000001e0 802b0000 802b0000 00000080 2*... -
从最简单的程序剖析objdump反汇编指令
2018-04-11 10:06:03objdump命令参考:https://blog.csdn.net/zoomdy/article/details/50563680 本文以最简单的程序开始,剖析反汇编之后的程序最小执行系统以及初始化、判断语句、循环语句以及函数及其调用过程在反汇编指令集中的... -
objdump(Linux)反汇编命令使用指南
2018-04-17 20:44:331 objdump反汇编示例 源文件main.c: /* main.c */ #include &amp;amp;lt;stdio.h&amp;amp;gt; void swap(int* first, int* second) { int temp = *first; *first = *second; *second = temp;... -
arm-eabi-objdump 反汇编的实现
2014-04-10 14:46:46反汇编代码,有工具arm-eabi-objdump(位于prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin),执行如下命令: ./arm-eabi-objdump -t sensors.default.so |sort > sensors.default.dump 或者 ./arm-eabi-... -
objdump 反汇编一个函数的脚本
2012-04-19 12:51:442)使用objdump -d 反汇编, 然后通过--start-address和--stop-address参数指定函数区间 3)使用nm -n out.elf > System.map 命令生成System.map文件 4)grep -A 1 打印匹配行和下一行, awk 打印第一列地址. #!/... -
MIPS objdump 反汇编二进制文件
2013-03-14 19:31:00objdump -D -b binary -m mips -EB test.bin>test1.txt 和正常编译器件产生的 .lst 文件相同 vim查看二进制文件 命令 :%!xxd 转载于:https://www.cnblogs.com/mipscpu/archive/2013/03/14/2960224.html... -
linux 下使用 objdump 反汇编
2009-08-07 19:14:00objdump有点象那个快速查看之流的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。对于一般只想让自己程序跑起来的程序员,这...目录:★ 测试练习前的准备工作★ Redhat 6.0 objdump命令的m -
objdump命令,反汇编_objdump
2018-07-20 14:17:33--archive-headers -a 显示档案库的成员信息,...这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o 显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目... -
linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
2016-12-30 17:57:32linux下objdump命令的具体选项如下: objdump [-a│--archive-headers] [-b bfdname│--target=bfdname] [-C│--demangle[=style] ] [-d│--disassemble] [-D│-- -
linux中的objdump命令(反汇编常用)
2016-10-21 16:43:29我们介绍过linux中的readelf命令, 但迟迟没有介绍objdump命令, 因为其实后者可以看作是前者的子集, 我们来看看官方文档怎么说: /* The difference between readelf and objdump: Both programs are capable... -
Linux反汇编命令
2016-11-02 21:47:52作为初学者我们还接触不到很多linux命令,出于好奇对于Linux的反汇编命令也找了下相关资料 objdump命令是Linux下的反汇编目标文件或者可执行文件的命令 objdump命令的man手册 objdump - 显示二进制文件信息 ... -
Mac OS X 反汇编命令
2016-04-11 14:13:42Linux 反汇编命令$ gcc main.c -g $ objdump -dS a.out使用 objdump 命令可以把C代码和汇编代码穿插起来显示。Mac OS X但是在苹果系统下会出现如下情况: zsh: command not found: objdump 安装 binutils,较为快捷...