精华内容
下载资源
问答
  • objdump反汇编命令
    更多相关内容
  • linux objdump 反汇编命令

    千次阅读 2019-08-11 06:01:14
    objdump命令是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反汇编

    2022-03-04 14:51:49
    反汇编命令,用来反汇编bin文件,命令如下: C:\gcc\risc-v\bin\objdump.exe -D -b binary -m riscv:rv32 11.bin > 11.dmp riscv:rv32是反汇编时需要指定的主机类型, -b 文件格式, binary 11.bin是bin文件。...

    反汇编命令,用来反汇编bin文件,命令如下:

    C:\gcc\risc-v\bin\objdump.exe -D -b binary -m riscv:rv32 11.bin > 11.dmp

    riscv:rv32是反汇编时需要指定的主机类型,

    -b 文件格式, binary

    11.bin是bin文件。-D表示反编译所有代码

    展开全文
  • objdump(Linux)反汇编命令使用指南

    千次阅读 2021-05-17 19:40:45
    1 objdump反汇编示例1.1 显示main.c的汇编代码1.2 目标文件反汇编1.3 可执行文件反汇编1.4 objdump反汇编常用参数2 objdump帮助信息3 参考资料1 objdump反汇编示例源文件main.c:/* main.c */#includevoid swap(int*...

    1 objdump反汇编示例

    1.1 显示main.c的汇编代码

    1.2 目标文件反汇编

    1.3 可执行文件反汇编

    1.4 objdump反汇编常用参数

    2 objdump帮助信息

    3 参考资料

    1 objdump反汇编示例

    源文件main.c:

    /* main.c */

    #include

    void swap(int* first, int* second)

    {

    int temp = *first;

    *first = *second;

    *second = temp;

    }

    int main(void)

    {

    int a = 10;

    int b = 20;

    printf("a = %d; b = %d;\n", a, b);

    swap(&a, &b);

    printf("a = %d; b = %d;\n", a, b);

    return 0;

    }

    1.1 显示main.c的汇编代码

    gcc -S -o main.s main.c

    汇编文件main.s

    .file "main.c"

    .text

    .globl swap

    .type swap, @function

    swap:

    .LFB0:

    .cfi_startproc

    pushq %rbp

    .cfi_def_cfa_offset 16

    .cfi_offset 6, -16

    movq %rsp, %rbp

    .cfi_def_cfa_register 6

    movq %rdi, -24(%rbp)

    movq %rsi, -32(%rbp)

    movq -24(%rbp), %rax

    ...

    1.2 目标文件反汇编

    gcc -c -o main.o main.c

    objdump -s -d main.o > main.o.txt

    目标文件main.o的反汇编结果输出到文件main.o.txt

    反汇编同时显示源代码

    gcc -g -c -o main.o main.c

    objdump -S -d main.o > main.o.txt

    显示源代码同时显示行号

    objdump -j .text -ld -C -S main.o > main.o.txt

    1.3 可执行文件反汇编

    gcc -o main main.c

    objdump -s -d main > main.txt

    反汇编同时显示源代码

    gcc -g -o main main.c

    objdump -S -d main > main.txt

    1.4 objdump反汇编常用参数

    objdump -d: 将代码段反汇编;

    objdump -S: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数,即需要调试信息;

    objdump -C: 将C++符号名逆向解析

    objdump -l: 反汇编代码中插入文件名和行号

    objdump -j section: 仅反汇编指定的section

    2 objdump帮助信息

    输出objdump帮助信息:

    objdump --help 或者 man objdump

    Usage: objdump Display information from object .

    At least one of the following switches must be given:

    -a, --archive-headers Display archive header information -f, --file-headers Display the contents of the overall file header -p, --private-headers Display object format specific file header contents -P, --private=OPT,OPT... Display object format specific contents -h, --[section-]headers Display the contents of the section headers -x, --all-headers Display the contents of all headers -d, --disassemble Display assembler contents of executable sections -D, --disassemble-all Display assembler contents of all sections -S, --source Intermix source code with disassembly -s, --full-contents Display the full contents of all sections requested -g, --debugging Display debug information in object file -e, --debugging-tags Display debug information using ctags style -G, --stabs Display (in raw form) any STABS info in the file -W[lLiaprmfFsoRt] or --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames, =frames-interp,=str,=loc,=Ranges,=pubtypes, =gdb_index,=trace_info,=trace_abbrev,=trace_aranges, =addr,=cu_index] Display DWARF info in the file

    -t, --syms Display the contents of the symbol table(s) -T, --dynamic-syms Display the contents of the dynamic symbol table -r, --reloc Display the relocation entries in the file -R, --dynamic-reloc Display the dynamic relocation entries in the file @Read options from -v, --version Display this program's version number -i, --info List object formats and architectures supported -H, --help Display this information

    The following switches are optional:

    -b, --target=BFDNAME Specify the target object format as BFDNAME -m, --architecture=MACHINE Specify the target architecture as MACHINE -j, --section=NAME Only display information for section NAME -M, --disassembler-options=OPT Pass text OPT on to the disassembler -EB --endian=big Assume big endian format when disassembling -EL --endian=little Assume little endian format when disassembling --file-start-context Include context from start of file (with -S) -I, --include=DIR Add DIR to search list for source files -l, --line-numbers Include line numbers and filenames in output -F, --file-offsets Include file offsets when displaying information -C, --demangle[=STYLE] Decode mangled/processed symbol names The STYLE, if specified, can be `auto', `gnu',

    `lucid', `arm', `hp', `edg', `gnu-v3', `java'

    or `gnat'

    -w, --wide Format output for more than 80 columns -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling --start-address=ADDR Only process data whose address is >= ADDR --stop-address=ADDR Only process data whose address is <= ADDR --prefix-addresses Print complete address alongside disassembly --[no-]show-raw-insn Display hex alongside symbolic disassembly --insn-width=WIDTH Display WIDTH bytes on a single line for -d --adjust-vma=OFFSET Add OFFSET to all displayed section addresses --special-syms Include special symbols in symbol dumps --prefix=PREFIX Add PREFIX to absolute paths for -S --prefix-strip=LEVEL Strip initial directory names for -S --dwarf-depth=N Do not display DIEs at depth N or greater --dwarf-start=N Display DIEs starting with N, at the same depth or deeper

    --dwarf-check Make additional dwarf internal consistency checks.

    objdump: supported targets: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex

    objdump: supported architectures: i386 i386:x86-64 i386:x64-32 i8086 i386:intel i386:x86-64:intel i386:x64-32:intel l1om l1om:intel k1om k1om:intel plugin

    The following i386/x86-64 specific disassembler options are supported for use

    with the -M switch (multiple options should be separated by commas):

    x86-64 Disassemble in 64bit mode

    i386 Disassemble in 32bit mode

    i8086 Disassemble in 16bit mode

    att Display instruction in AT&T syntax

    intel Display instruction in Intel syntax

    att-mnemonic

    Display instruction in AT&T mnemonic

    intel-mnemonic

    Display instruction in Intel mnemonic

    addr64 Assume 64bit address size

    addr32 Assume 32bit address size

    addr16 Assume 16bit address size

    data32 Assume 32bit data size

    data16 Assume 16bit data size

    suffix Always display instruction suffix in AT&T syntax

    Report bugs to .

    3 参考资料

    [1] objdump反汇编用法示例

    [2] objdump命令的使用

    [3] GNU Binary Utilities: objdump - Sourceware

    [4] stackoverflow - objdump

    展开全文
  • objdump[-a│--archive-headers][-bbfdname│--target=bfdname][-C│--demangle[=style]][-d│--disassemble][-D│--disassemble-all][-z│--disassemble-zeroes][-EB│-EL│--endian={big│little}][-f│--file-...
  • 实例分析objdump反汇编用法

    万次阅读 2018-07-06 15:39:16
    Ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版-----------------------------------------------------------------------------------objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。...
  • 反汇编-objdump

    2021-03-23 09:39:23
    objdump需要用到:反汇编的目标镜像、镜像生成的本地编译器(.exe)
  • objdump反汇编用法示例

    万次阅读 多人点赞 2016-01-22 18:49:37
    objdump反汇编,反汇编与源代码混合显示,C++符号逆向解析。
  • mips反汇编命令

    2021-05-26 14:25:50
    mips-linux-gnu-objdump -d vmlinux > 1.txt
  • objdump有点象那个快速查看之流的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。对于一般只想让自己程序跑起来的程序员...目录:★ 测试练习前的准备工作★ RedHat 6.0 objdump命令的m...
  • objdump 反汇编

    万次阅读 2013-07-19 21:52:38
    objdump是gcc工具,用来查看编译后目标文件的组成。 常用命令objdump -x obj:以某种分类信息的形式把目标文件的数据组成输出;...objdump -j ./text/.data -S obj:输出指定段的信息(反汇编源代码) objdump -S ob
  • arm开发板上边不支持arm-linux-objdump 反汇编命令该怎么办? 包括addr2line命令也无法识别, 怎么查看开发板上边支持什么命令呢?
  • objdump反汇编指令 -d 将代码段反汇编 -S 将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息 -C 将C++符号名逆向解析 -l 反汇编代码中插入源代码的文件名和行号 -j section 仅...
  • 文章目录 概述 参数 ... 参考 Linux:objdump命令解析 https://blog.csdn.net/q2519008/article/details/82349869 objdump反汇编用法示例 https://blog.csdn.net/zoomdy/article/details/50563680 objdump命令的使用 ...
  • 在移植Android过程中会遇到很多Crash的情况,尤其是启动Android过程中。...根据个人一个实例来介绍一下在Android移植过程中反汇编的用法。首先先看一下我遇到的一个logcat关于Crash的打印信息:I/DEBUG ( 14...
  • 【Linux反汇编】如何使用objdump进行反汇编
  • riscv 汇编与反汇编

    千次阅读 2021-05-21 18:45:38
    为了riscv指令集,我们需要汇编与反汇编工具来分析指令格式。riscv-none-embed-as.exe -c mm.s -o mm.o --march=rv32gmm.saddi x10, x6, 20addi x11, x6, 20addi x10, x6, 20addi x10, x6, 20beq x10,x11,labeladdi ...
  • 昂纳雾的反汇编器,objconv是相当不错的。它将在反汇编输出中添加有关性能问题的注释(例如,具有16位立即数的指令中可怕的LCP停顿)。objconv -fyasm a.out /dev/stdout | less(它不被认为-是stdout的简写,默认情况...
  • 简单实例分析objdump反汇编用法

    千次阅读 2018-12-07 10:59:05
    objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。   1. 准备代码hello.c #include &lt;linux/module.h&gt; #include &lt;linux/init.h&gt; #include &lt;linux/kernel...
  • 常用反汇编命令

    千次阅读 2021-07-22 07:38:49
    arm-none-eabi-objdump.exe:反汇编用到的编译器 -d :disassemble 表示反汇编 rtthread.elf:表示需要反汇编的文件 rtthread.asm:生成的汇编文件的名称(注意前面的 > 符号) armcc 反汇编 D:\SoftWare_...
  • objdump 反汇编 vmlinux

    2021-01-14 14:40:14
    COMPILE=aarch64-linux-android- 交叉编译工具的版本从android顶层/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin查找aarch64-linux-android-objdump输入命令sudo ./aarc...
  • objdump命令,反汇编_objdump

    千次阅读 2018-07-20 14:17:33
    --archive-headers -a 显示档案库的成员信息,...这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o 显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目...
  • RT-Thread 使用 arm-none-eabi-objdump.exe 把 elf 文件反汇编
  • 内核编译完成后,会在内核代码根目录下生成vmlinux文件,我们可以通过以下命令反汇编:arm-none-eabi-objdump -Dz -S vmlinux >linux.dump -S表示尽可能的把原来的代码和反汇编出来的代码一起呈现出来,-S参数需要...
  • linux下反汇编命令

    2022-07-04 13:38:01
    linux下反汇编命令
  • objdump 反汇编一个函数的脚本

    千次阅读 2012-04-19 12:51:44
    2)使用objdump -d 反汇编, 然后通过--start-address和--stop-address参数指定函数区间 3)使用nm -n out.elf > System.map 命令生成System.map文件 4)grep -A 1 打印匹配行和下一行, awk 打印第一列地址. #!/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,838
精华内容 3,135
关键字:

objdump反汇编命令