gcc命令之-objdump

合集下载

objdump参数

objdump参数

objdump参数Objdump 是一个非常强大的调试工具,它可以分析可执行文件与目标文件里的所有符号、展开指令、调用堆栈信息等等,以便进行调试。

它的作用在于检验二进制文件是否正确,可以在调试时拓展二进制文件的可读性和可视性。

在本篇文章中,我们将会详细探讨 objdump 常见的参数、含义及使用方法。

## objdump 的基础参数objdump 命令的通用语法如下:```bash objdump 选项文件名 ```其中,选项可以是 objdump 的不同参数选项。

下面是 objdump 常见的参数:### -d- 可读性高的反汇编代码 - 可读性非常高,指令的每个部分都会有注释解释作用使用示例:```bash objdump -d demo # 查看 demo 可执行文件的反汇编代码 ```### -x- 打印出头信息 - 打印可执行文件的文件头、程序头、段表,以及段的详细信息使用示例:```bash objdump -x demo # 查看 demo 可执行文件的头信息 ```### -D- 可读性高的反汇编代码 - 与 -d 差别在于是否显示符号信息使用示例:```bash objdump -D demo # 查看 demo 可执行文件的反汇编代码及符号信息 ```### -f- 可以输出一些文件的格式 - 显示可执行文件的文件格式以及其他相关信息,例如 ELF 元素头信息、处理器架构等等使用示例:```bash objdump -f demo # 查看 demo 可执行文件的格式信息 ```### -s- 可以展示文件的所有段信息 - 显示可执行文件的段信息,例如代码段、数据段、bss 段等等使用示例:```bash objdump -s demo # 查看 demo 可执行文件的段信息 ```### -t- 查看文件的符号表 - 显示可执行文件中的所有符号信息,包括函数名、局部变量名、全局变量名等等使用示例:```bash objdump -t demo # 查看 demo 可执行文件的符号表 ```### -G- 可以输出动态符号的信息 - 显示可执行文件的动态符号信息,包括函数名、局部变量名、全局变量名等等使用示例:```bash objdump -G demo # 查看 demo 可执行文件的动态符号表 ```### -g- 显示所有符号信息,包括调试符号 - 显示可执行文件中的所有符号信息,包括调试符号,例如调试符号信息、函数参数、本地变量使用示例:```bash objdump -g demo # 查看 demo 可执行文件的所有符号表 ```### -j- 选择指定的节 - 查看指定节的反汇编代码,只能在ELF 文件中执行使用示例:```bash objdump -j .text demo # 查看 demo 可执行文件中的 `.text` 节反汇编代码 ```## 关于 objdump 的其他参数在 objdump 命令中还有许多其它参数。

objdump与readelf

objdump与readelf

objdump与readelf对比objdump与readelfobjdump和readelf都可以用来查看二进制文件的一些内部信息. 区别在于objdump借助BFD而更加通用一些, 可以应付不同文件格式, readelf 则并不借助BFD,而是直接读取ELF格式文件的信息, 按readelf手册页上所说, 得到的信息也略细致一些.几个功能对比. 1. 反汇编代码查看源代码被翻译成的汇编代码, 大概有3种方法,1) 通过编译器直接从源文件生成, 如gcc -S2) 对目标代码反汇编, 一种是静态反汇编, 就是使用objdump3) 另外一种就是对运行时的代码反汇编, 一般通过gdbreadelf并不提供反汇编功能. objdump可以指定反汇编哪个节, 一般只有对包含指令的节反汇编才有意义. 而对于一些其他的类型的节, objdump也可以将特殊节的数据以解析后的形式呈现出来,例如对于.plt, 输出如下: [qtl@courier lib]$ objdump -d -j .plt libfoobar.so libfoobar.so: file formatelf32-i386Disassembly of section .plt:000003a4<__gmon_start__@plt-0x10>:3a4: ff b3 04 00 00 00 pushl 0x4(%ebx)3aa: ff a3 08 00 00 00 jmp *0x8(%ebx)3b0: 00 00 add %al,(%eax)...000003b4 <__gmon_start__@plt>:3b4: ff a3 0c 00 00 00 jmp *0xc(%ebx)3ba: 68 00 00 00 00 push $0x03bf: e9 e0 ff ff ff jmp 3a4<_init+0x18>000003c4 <cos@plt>:3c4: ff a3 10 00 00 00 jmp *0x10(%ebx) 3ca: 68 08 00 00 00 push $0x83cf: e9 d0 ff ff ff jmp 3a4<_init+0x18>000003d4 <fwrite@plt>:3d4: ff a3 14 00 00 00 jmp *0x14(%ebx) 3da: 68 10 00 00 00 push $0x103df: e9 c0 ff ff ff jmp 3a4<_init+0x18>000003e4 <fprintf@plt>:3e4: ff a3 18 00 00 00 jmp *0x18(%ebx) 3ea: 68 18 00 00 00 push $0x183ef: e9 b0 ff ff ff jmp 3a4<_init+0x18>000003f4 <__cxa_finalize@plt>:3f4: ff a3 1c 00 00 00 jmp *0x1c(%ebx)3fa: 68 20 00 00 00 push $0x203ff: e9 a0 ff ff ff jmp 3a4<_init+0x18>2. 显示relocation节的条目-r参数显示elf文件的类型为REL的节的信息, 使用-S参数可以列出elf文件的所有节的信息, 其中也就包括了REL节. 对于可重定位文件两者显示条目一致, 最重要的offset和type以及 都有.下面是两者输出的对比. [qtl@courier lib]$ readelf -r bar.o Relocation section '.rel.text' at offset 0x4bc contains 6 entries:Offset Info Type Sym.Value Sym.Name00000008 00000b02 R_386_PC32 00000000 __i686.get_pc_thunk.bx0000000e 00000c0a R_386_GOTPC 00000000 _GLOBAL_OFFSET_TABLE_00000025 00000d04 R_386_PLT32 00000000 cos0000002e 00000e03 R_386_GOT32 00000000 stdout00000044 00000509 R_386_GOTOFF00000000 .rodata00000050 00000f04 R_386_PLT32 00000000 fprintf[qtl@courier lib]$ objdump -r bar.o bar.o: file format elf32-i386RELOCATION RECORDS FOR [.text]:OFFSET TYPE VALUE00000008 R_386_PC32 __i686.get_pc_thunk.bx0000000e R_386_GOTPC_GLOBAL_OFFSET_TABLE_00000025 R_386_PLT32 cos0000002e R_386_GOT32 stdout00000044 R_386_GOTOFF .rodata00000050 R_386_PLT32 fprintf对于共享库,[qtl@courier lib]$ readelf -r libfoobar.so Relocation section '.rel.dyn' at offset 0x334 contains 6 entries:Offset Info Type Sym.Value Sym. Name00001608 00000008 R_386_RELATIVE00001704 00000008 R_386_RELATIVE000016d4 00000106 R_386_GLOB_DAT 00000000 __gmon_start__000016d8 00000206 R_386_GLOB_DAT 00000000 _Jv_RegisterClasses000016dc 00000606 R_386_GLOB_DAT 00000000 stdout000016e0 00000706 R_386_GLOB_DAT 00000000 __cxa_finalizeRelocation section '.rel.plt' at offset 0x364 contains 5 entries:Offset Info Type Sym.Value Sym. Name000016f0 00000107 R_386_JUMP_SLOT 00000000 __gmon_start__000016f4 00000307 R_386_JUMP_SLOT 00000000 cos000016f8 00000407 R_386_JUMP_SLOT 00000000 fwrite000016fc 00000507 R_386_JUMP_SLOT 00000000 fprintf00001700 00000707 R_386_JUMP_SLOT 00000000 __cxa_finalize[qtl@courier lib]$ objdump -R libfoobar.so libfoobar.so: file format elf32-i386DYNAMIC RELOCATION RECORDSOFFSET TYPE VALUE00001608 R_386_RELATIVE *ABS*00001704 R_386_RELATIVE *ABS*000016d4 R_386_GLOB_DAT __gmon_start__000016d8 R_386_GLOB_DAT _Jv_RegisterClasses000016dc R_386_GLOB_DAT stdout000016e0 R_386_GLOB_DAT __cxa_finalize000016f0 R_386_JUMP_SLOT __gmon_start__000016f4 R_386_JUMP_SLOT cos000016f8 R_386_JUMP_SLOT fwrite000016fc R_386_JUMP_SLOT fprintf00001700 R_386_JUMP_SLOT __cxa_finalize有上面可以看出, readelf的显示分节, 而objdump则将两个节合在一起. readelf的显示更加清晰一些. 3. 显示动态重定位条目(或者可以认为是动态链接相关的重定位条目)(按objdump的man page说明, 只对dynamic object有效, 如某些类型的共享库)readelf和objdump等价的命令为readelf -D -r file和objdump -R file. 对readelf使用-r和-D -r的区别, 对于共享库在于数据的呈现方式略有不同. 这两种都将数据解析后呈现出来. 前者显示的是相对于基地址的偏移, 后者则显示绝对偏移量.前者显示条目数, 后者显示字节数. 两者输出对比:[qtl@courier lib]$ readelf -D -r libfoobar.so 'REL' relocation section at offset 0x334 contains 48 bytes:Offset Info Type Sym.Value Sym. Name00001608 00000008 R_386_RELATIVE00001704 00000008 R_386_RELATIVE000016d4 00000106 R_386_GLOB_DAT 00000000 __gmon_start__000016d8 00000206 R_386_GLOB_DAT 00000000 _Jv_RegisterClasses000016dc 00000606 R_386_GLOB_DAT 00000000 stdout000016e0 00000706 R_386_GLOB_DAT 00000000 __cxa_finalize'PLT' relocation section at offset 0x364 contains 40 bytes:Offset Info Type Sym.Value Sym. Name000016f0 00000107 R_386_JUMP_SLOT 00000000 __gmon_start__000016f4 00000307 R_386_JUMP_SLOT 00000000 cos000016f8 00000407 R_386_JUMP_SLOT 00000000 fwrite000016fc 00000507 R_386_JUMP_SLOT 00000000 fprintf00001700 00000707 R_386_JUMP_SLOT 00000000 __cxa_finalize[qtl@courier lib]$ objdump -R libfoobar.so libfoobar.so: file format elf32-i386DYNAMIC RELOCATION RECORDSOFFSET TYPE VALUE00001608 R_386_RELATIVE *ABS*00001704R_386_RELATIVE *ABS*000016d4 R_386_GLOB_DAT __gmon_start__000016d8 R_386_GLOB_DAT _Jv_RegisterClasses000016dc R_386_GLOB_DAT stdout000016e0 R_386_GLOB_DAT __cxa_finalize000016f0 R_386_JUMP_SLOT __gmon_start__000016f4 R_386_JUMP_SLOT cos000016f8 R_386_JUMP_SLOT fwrite000016fc R_386_JUMP_SLOT fprintf00001700 R_386_JUMP_SLOT __cxa_finalize另外有必要说明的是如果对可重定位文件(.o文件)应用这两个命令是无效的,错误提示如下:[qtl@courier lib]$ readelf -D -r bar.oThere are no dynamic relocations in this file.[qtl@courier lib]$ objdump -Rbar.obar.o: file format elf32-i386objdump: bar.o: not a dynamic objectobjdump: bar.o: Invalid operation4. 显示节信息: readelf -S 和objdump -h对于可重定位文件, objdump -h不能显示.rel开头的节和.shstrtab, .symtab, .strtab.而readelf的显示有一个.group节, 其内容为节的group, 可以用-g参数查看.输出如下:[qtl@courier lib]$ readelf -S bar.oThere are 13 section headers, starting at offset0x150:Section Headers:[Nr] Name Type AddrOff Size ES Flg Lk Inf Al[ 0] NULL 00000000 000000 000000 00 0 0 0[ 1] .group GROUP 00000000 000034 000008 04 11 11 4[ 2] .text PROGBITS 0000000000003c 00005c 00 AX 0 0 4[ 3] .rel.text REL 00000000 0004bc 000030 08 11 2 4[ 4] .data PROGBITS 00000000 000098 000000 00 WA 0 0 4[ 5] .bss NOBITS 00000000 000098 000000 00 WA 0 0 4[ 6] .rodata PROGBITS 00000000 000098 00000e 00 A 0 0 1[ 7] .comment PROGBITS 00000000 0000a6 00002e 00 0 0 1[ 8] .text.__i686.get_ PROGBITS 00000000 0000d4 000004 00 AXG 0 0 1[ 9] .note.GNU-stack PROGBITS 00000000 0000d8 000000 00 0 0 1[10] .shstrtab STRTAB 00000000 0000d8 000075 00 0 0 1[11] .symtab SYMTAB 00000000 000358 000110 10 12 10 4[12] .strtab STRTAB 00000000 000468 000053 00 0 0 1Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings)I (info), L (link order), G (group), x (unknown)O (extra OS processing required) o (OS specific), p (processor specific)[qtl@courier lib]$ objdump -hbar.obar.o: file format elf32-i386Sections:Idx Name Size VMA LMAFile off Algn0 __i686.get_pc_thunk.bx 00000008 00000000 00000000 00000034 2**2CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD1 .text 0000005c 00000000 00000000 0000003c 2**2CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE2 .data 00000000 00000000 00000000 00000098 2**2CONTENTS, ALLOC, LOAD, DATA3 .bss 00000000 00000000 00000000 00000098 2**2ALLOC4 .rodata 0000000e 00000000 00000000 00000098 2**0CONTENTS, ALLOC, LOAD, READONLY, DATA5 .comment 0000002e 00000000 00000000 000000a6 2**0CONTENTS, READONLY6 .text.__i686.get_pc_thunk.bx 00000004 00000000 00000000 000000d4 2**0CONTENTS, ALLOC, LOAD, READONLY, CODE7 .note.GNU-stack 00000000 00000000 00000000 000000d8 2**0CONTENTS, READONLY对于共享库,objdump -h仍然不能显示.shstrtab, .symtab, .strtab三个节, 另外还有一个区别在于readelf从一个NULL类型的节开始, 而objdump的输出去掉了这个空的节.[qtl@courier lib]$ readelf -S libfoobar.soThere are 27 section headers, starting at offset0x8f0:Section Headers:[Nr] Name Type AddrOff Size ES Flg Lk Inf Al[ 0] NULL 00000000 000000 000000 00 0 0 0[ 1] .gnu.hash GNU_HASH 000000b4 0000b4 000048 04 A 2 0 4[ 2] .dynsym DYNSYM 000000fc 0000fc 000110 10 A 3 1 4[ 3] .dynstr STRTAB 0000020c 00020c 0000b3 00 A 0 0 1[ 4] .gnu.version VERSYM 000002c0 0002c0 000022 02 A 2 0 2[ 5] .gnu.version_r VERNEED 000002e4 0002e4 000050 00 A 3 2 4[ 6] .rel.dyn REL 00000334 000334 000030 08 A 2 0 4[ 7] .rel.plt REL 00000364 000364 000028 08 A 2 9 4[ 8] .init PROGBITS 0000038c 00038c 000017 00 AX 0 0 4[ 9] .plt PROGBITS 000003a4 0003a4 000060 04 AX 0 0 4[10] .text PROGBITS 00000410 000410 0001a4 00 AX 0 0 16[11] .fini PROGBITS 000005b4 0005b4 00001c 00 AX 0 0 4[12] .rodata PROGBITS 000005d0 0005d0 00001d 00 A 0 0 1[13] .eh_frame PROGBITS 000005f0 0005f0 000004 00 A 0 0 4[14] .ctors PROGBITS 000015f4 0005f4 000008 00 WA 0 0 4[15] .dtors PROGBITS 000015fc 0005fc 000008 00 WA 0 0 4[16] .jcr PROGBITS 00001604 000604 000004 00 WA 0 0 4[17] .data.rel.ro PROGBITS 00001608000608 000004 00 WA 0 0 4[18] .dynamic DYNAMIC 0000160c 00060c 0000c8 08 WA 3 0 4[19] .got PROGBITS 000016d4 0006d4 000010 04 WA 0 0 4[20] .got.plt PROGBITS 000016e4 0006e4 000020 04 WA 0 0 4[21] .data PROGBITS 00001704 000704 000004 00 WA 0 0 4[22] .bss NOBITS 00001708 000708 000010 00 WA 0 0 4[23] .comment PROGBITS 00000000 000708 000114 00 0 0 1[24] .shstrtab STRTAB 00000000 00081c 0000d2 00 0 0 1[25] .symtab SYMTAB 00000000 000d28 0003d0 10 26 45 4[26] .strtab STRTAB 00000000 0010f8 0001d7 00 0 0 1Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings)I (info), L (link order), G (group), x (unknown)O (extra OS processing required) o (OS specific), p (processor specific)[qtl@courier lib]$ objdump -h libfoobar.so libfoobar.so: file formatelf32-i386Sections:Idx Name Size VMA LMAFile off Algn0 .gnu.hash 00000048 000000b4 000000b4000000b4 2**2CONTENTS, ALLOC, LOAD, READONLY, DATA1 .dynsym 00000110 000000fc 000000fc 000000fc 2**2CONTENTS, ALLOC, LOAD, READONLY, DATA2 .dynstr 000000b3 0000020c 0000020c 0000020c 2**0CONTENTS, ALLOC, LOAD, READONLY, DATA3 .gnu.version 00000022 000002c0 000002c0 000002c0 2**1CONTENTS, ALLOC, LOAD, READONLY, DATA4 .gnu.version_r 00000050 000002e4 000002e4 000002e4 2**2CONTENTS, ALLOC, LOAD, READONLY, DATA5 .rel.dyn 00000030 00000334 00000334 00000334 2**2CONTENTS, ALLOC, LOAD, READONLY, DATA6 .rel.plt 00000028 00000364 00000364 00000364 2**2CONTENTS, ALLOC, LOAD, READONLY, DATA7 .init 00000017 0000038c 0000038c 0000038c 2**2CONTENTS, ALLOC, LOAD, READONLY, CODE8 .plt 00000060 000003a4 000003a4 000003a4 2**2CONTENTS, ALLOC, LOAD, READONLY, CODE9 .text 000001a4 00000410 00000410 00000410 2**4CONTENTS, ALLOC, LOAD, READONLY, CODE10 .fini 0000001c 000005b4 000005b4 000005b4 2**2CONTENTS, ALLOC, LOAD, READONLY, CODE11 .rodata 0000001d 000005d0 000005d0CONTENTS, ALLOC, LOAD, READONLY, DATA12 .eh_frame 00000004 000005f0 000005f0 000005f0 2**2CONTENTS, ALLOC, LOAD, READONLY, DATA13 .ctors 00000008 000015f4 000015f4 000005f4 2**2CONTENTS, ALLOC, LOAD, DATA14 .dtors 00000008 000015fc 000015fc 000005fc 2**2CONTENTS, ALLOC, LOAD, DATA15 .jcr 00000004 00001604 00001604CONTENTS, ALLOC, LOAD, DATA16 .data.rel.ro 00000004 00001608 00001608 00000608 2**2CONTENTS, ALLOC, LOAD, DATA17 .dynamic 000000c8 0000160c 0000160c 0000060c 2**2CONTENTS, ALLOC, LOAD, DATA18 .got 00000010 000016d4 000016d4 000006d4 2**2CONTENTS, ALLOC, LOAD, DATA19 .got.plt 00000020 000016e4 000016e4 000006e4 2**2CONTENTS, ALLOC, LOAD, DATA20 .data 00000004 00001704 00001704 00000704 2**2CONTENTS, ALLOC, LOAD, DATA21 .bss 00000010 00001708 00001708 00000708 2**2ALLOC22 .comment 00000114 00000000 00000000 00000708 2**0CONTENTS, READONLY5. 显示.dynamic节信息只readelf -d有对应的功能, objdump没有. 另外需要注意, 看重定位文件不需要动态链接(加载), 所以没有.dynamic节. 对于共享库文件输出如下: [qtl@courier lib]$ readelf -d libfoobar.so Dynamic section at offset 0x60c contains 21 entries:Tag TypeName/Value0x00000001 (NEEDED) Shared library: [libm.so.6]0x00000001 (NEEDED) Shared library: [libc.so.6]0x0000000c (INIT) 0x38c0x0000000d (FINI) 0x5b40x6ffffef5 (GNU_HASH) 0xb40x00000005 (STRTAB) 0x20c0x00000006 (SYMTAB) 0xfc0x0000000a (STRSZ) 179 (bytes)0x0000000b (SYMENT) 16 (bytes)0x00000003 (PLTGOT) 0x16e40x00000002 (PLTRELSZ) 40 (bytes)0x00000014 (PLTREL) REL0x00000017 (JMPREL) 0x3640x00000011 (REL) 0x3340x00000012 (RELSZ) 48 (bytes)0x00000013 (RELENT) 8 (bytes)0x6ffffffe (VERNEED) 0x2e40x6fffffff (VERNEEDNUM) 20x6ffffff0 (VERSYM) 0x2c00x6ffffffa (RELCOUNT) 20x00000000 (NULL) 0x06. 显示程序段信息第二个readelf支持而objdump没有的功能. 命令参数为readelf -l.同样, 对于可重定位文件而言没有段. 这一点也可以从ELF 头中看到, 命令为readelf -h. [qtl@courier lib]$ readelf -l libfoobar.so Elf file type is DYN (Shared object file)Entry point 0x410There are 4 program headers, starting at offset 52Program Headers:Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg AlignLOAD 0x000000 0x00000000 0x00000000 0x005f4 0x005f4 R E 0x1000LOAD 0x0005f4 0x000015f4 0x000015f4 0x00114 0x00124 RW 0x1000DYNAMIC 0x00060c 0x0000160c 0x0000160c 0x000c8 0x000c8 RW 0x4GNU_STACK 0x000000 0x000000000x00000000 0x00000 0x00000 RW 0x4 Section to Segment mapping:Segment Sections...00 .gnu.hash .dynsym .dynstr .gnu.version .gnu.versi on_r .rel.dyn.rel.plt .init .plt .text .fini .rodata .eh_frame01 .ctors .dtors .jcr .data.rel.ro .dynamic .got .got.plt . data .bss02 .dynamic03 7. 以字节(HEX或字符)形式dump某节的内容readelf -x <secname>objdump -s后者默认一次dump所有节的内容. 如果只想dump某节的内容, 则用-j <secname>参数指定. readelf一次只能dump某一节的内容. 两者输出如下: [qtl@courier lib]$ readelf -x .dynamic libfoobar.so Hex dump of section '.dynamic':0x0000160c 0000007b 00000001 00000071 00000001 ....q.......{...0x0000161c 000005b4 0000000d 0000038c0000000c ................0x0000162c 0000020c 00000005 000000b4 6ffffef5 ...o............0x0000163c 000000b3 0000000a 000000fc 00000006 ................0x0000164c 000016e4 00000003 00000010 0000000b ................0x0000165c 00000011 00000014 00000028 00000002 ....(...........0x0000166c 00000334 00000011 00000364 00000017 ....d.......4...0x0000167c 00000008 00000013 00000030 00000012 ....0...........0x0000168c 00000002 6fffffff 000002e46ffffffe ...o.......o....0x0000169c 00000002 6ffffffa 000002c06ffffff0 ...o.......o....0x000016ac 00000000 00000000 00000000 00000000 ................0x000016bc 00000000 00000000 00000000 00000000 ................0x000016cc 0000000000000000 ........[qtl@courier lib]$ objdump -s -j .dynamic libfoobar.so libfoobar.so: file formatelf32-i386Contents of section .dynamic:160c 01000000 71000000 010000007b000000 ....q.......{...161c 0c000000 8c030000 0d000000b4050000 ................162c f5feff6f b4000000 05000000 0c020000 ...o............163c 06000000 fc000000 0a000000b3000000 ................164c 0b000000 10000000 03000000e4160000 ................165c 02000000 28000000 1400000011000000 ....(...........166c 17000000 64030000 1100000034030000 ....d.......4...167c 12000000 30000000 1300000008000000 ....0...........168c feffff6f e4020000 ffffff6f 02000000 ...o.......o.... 169c f0ffff6f c0020000 faffff6f 02000000 ...o.......o....16ac 00000000 00000000 0000000000000000 ................16bc 00000000 00000000 0000000000000000 ................16cc 00000000 00000000 ........8. 查看ELF程序头信息readelf -h提供完整的信息, objdump -f只提供很少的信息. 9. 查看符号信息readelf -sobjdump -t两个命令都提供类似nm的信息. 输出如下: [qtl@courier lib]$ readelf -s libfoobar.so Symbol table '.dynsym' contains 17 entries:Num: Value Size Type Bind Vis Ndx Name0: 00000000 0 NOTYPE LOCAL DEFAULTUND1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__2: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses3: 00000000 38 FUNC GLOBAL DEFAULT UND cos@GLIBC_2.0 (2)4: 00000000 351 FUNC GLOBAL DEFAULT UND fwrite@GLIBC_2.0 (3)5: 00000000 36 FUNC GLOBAL DEFAULT UND fprintf@GLIBC_2.0 (3)6: 00000000 4 OBJECT GLOBAL DEFAULT UND stdout@GLIBC_2.0 (3)7: 00000000 346 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.1.3(4)8: 00000520 92 FUNC GLOBAL DEFAULT 10 bar9: 000004dc 66 FUNC GLOBAL DEFAULT 10 foo10: 00001718 0 NOTYPE GLOBAL DEFAULT ABS _end11: 00001708 0 NOTYPE GLOBAL DEFAULT ABS _edata12: 0000170c 4 OBJECT GLOBAL DEFAULT 22 foo_var13: 00001708 0 NOTYPE GLOBAL DEFAULT ABS __bss_start14: 0000038c 0 FUNC GLOBAL DEFAULT8 _init15: 000005b4 0 FUNC GLOBAL DEFAULT 11 _fini16: 00001710 8 OBJECT GLOBAL DEFAULT 22 bar_varSymbol table '.symtab' contains 61 entries:Num: Value Size Type Bind Vis Ndx Name0: 00000000 0 NOTYPE LOCAL DEFAULT UND1: 000000b4 0 SECTION LOCAL DEFAULT 12: 000000fc 0 SECTION LOCAL DEFAULT 23: 0000020c 0 SECTION LOCAL DEFAULT 34: 000002c0 0 SECTION LOCAL DEFAULT 45: 000002e4 0 SECTION LOCAL DEFAULT 56: 00000334 0 SECTION LOCAL DEFAULT 67: 00000364 0 SECTION LOCAL DEFAULT 78: 0000038c 0 SECTION LOCAL DEFAULT 89: 000003a4 0 SECTION LOCAL DEFAULT 910: 00000410 0 SECTION LOCAL DEFAULT 1011: 000005b4 0 SECTION LOCAL DEFAULT 1112: 000005d0 0 SECTION LOCAL DEFAULT 1213: 000005f0 0 SECTION LOCAL DEFAULT 1314: 000015f4 0 SECTION LOCAL DEFAULT 1415: 000015fc 0 SECTION LOCAL DEFAULT 1516: 00001604 0 SECTION LOCAL DEFAULT 1617: 00001608 0 SECTION LOCAL DEFAULT 1718: 0000160c 0 SECTION LOCAL DEFAULT1819: 000016d4 0 SECTION LOCAL DEFAULT 1920: 000016e4 0 SECTION LOCAL DEFAULT 2021: 00001704 0 SECTION LOCAL DEFAULT 2122: 00001708 0 SECTION LOCAL DEFAULT 2223: 00000000 0 SECTION LOCAL DEFAULT 2324: 00000410 0 FUNC LOCAL DEFAULT 10 call_gmon_start25: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c26: 000015f4 0 OBJECT LOCAL DEFAULT 14 __CTOR_LIST__27: 000015fc 0 OBJECT LOCAL DEFAULT 15 __DTOR_LIST__28: 00001604 0 OBJECT LOCAL DEFAULT 16 __JCR_LIST__29: 00001708 1 OBJECT LOCAL DEFAULT 22 completed.575830: 00001704 0 OBJECT LOCAL DEFAULT 21 p.575631: 00000440 0 FUNC LOCAL DEFAULT 10 __do_global_dtors_aux32: 000004a0 0 FUNC LOCAL DEFAULT 10 frame_dummy33: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c34: 000015f8 0 OBJECT LOCAL DEFAULT 14 __CTOR_END__35: 00001600 0 OBJECT LOCAL DEFAULT 15 __DTOR_END__36: 000005f0 0 OBJECT LOCAL DEFAULT 13 __FRAME_END__37: 00001604 0 OBJECT LOCAL DEFAULT 16 __JCR_END__38: 00000580 0 FUNC LOCAL DEFAULT 10 __do_global_ctors_aux39: 00000000 0 FILE LOCAL DEFAULT ABS foo.c40: 00000000 0 FILE LOCAL DEFAULTABS bar.c41: 000016e4 0 OBJECT LOCAL HIDDEN ABS _GLOBAL_OFFSET_TABLE_42: 00001608 0 OBJECT LOCAL HIDDEN 17 __dso_handle43: 000004d7 0 FUNC LOCAL HIDDEN 10 __i686.get_pc_thunk.bx44: 0000160c 0 OBJECT LOCAL HIDDEN ABS _DYNAMIC45: 00000520 92 FUNC GLOBAL DEFAULT 10 bar46: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__47: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses48: 000005b4 0 FUNC GLOBAL DEFAULT 11 _fini49: 0000170c 4 OBJECT GLOBAL DEFAULT 22 foo_var50: 000004dc 66 FUNC GLOBAL DEFAULT 10 foo51: 00000000 38 FUNC GLOBAL DEFAULT UND cos@@GLIBC_2.052: 00000000 351 FUNC GLOBAL DEFAULT UND fwrite@@GLIBC_2.053: 00000000 36 FUNC GLOBAL DEFAULT UND fprintf@@GLIBC_2.054: 00001708 0 NOTYPE GLOBAL DEFAULT ABS __bss_start55: 00001718 0 NOTYPE GLOBAL DEFAULT ABS _end56: 00000000 4 OBJECT GLOBAL DEFAULT UND stdout@@GLIBC_2.057: 00001710 8 OBJECT GLOBAL DEFAULT 22 bar_var58: 00001708 0 NOTYPE GLOBAL DEFAULT ABS _edata59: 00000000 346 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.160: 0000038c 0 FUNC GLOBAL DEFAULT8 _init[qtl@courier lib]$ objdump -t libfoobar.so libfoobar.so: file format elf32-i386SYMBOL TABLE:000000b4 l d .gnu.hash00000000 .gnu.hash000000fc l d .dynsym00000000 .dynsym0000020c l d .dynstr00000000 .dynstr000002c0 l d .gnu.version00000000 .gnu.version000002e4 l d .gnu.version_r00000000 .gnu.version_r00000334 l d .rel.dyn00000000 .rel.dyn00000364 l d .rel.plt00000000 .rel.plt0000038c l d .init 00000000 .init 000003a4 l d .plt 00000000 .plt。

objdump命令

objdump命令

objdump命令objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。

选项--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 选项可用的架构和目标格式列表。

objdump 函数

objdump 函数

objdump 函数objdump 是 GNU 二进制工具集(GNU Binutils)中的一个工具,它可以用来查看目标文件、可执行文件、共享库等二进制文件的反汇编和符号信息。

objdump 可以通过命令行参数来指定要显示的信息类型,如反汇编指令、符号表、调试信息等,并且可以以不同的格式(如十六进制、源代码、汇编代码等)来显示这些信息。

以下是对 objdump 的一些常用用法和参数的介绍:1. 常用命令行参数:-d:显示反汇编指令。

-t:显示符号表。

-S:将反汇编指令和源代码交叉显示。

-f:显示目标文件格式信息。

-r:显示重定位表。

-x:显示所有节的详细信息。

-s:显示目标文件的内容。

-h:显示目标文件的节头表。

等等。

2. 反汇编指令:objdump 可以通过指定 -d 参数来显示目标文件的反汇编指令。

反汇编指令可以帮助理解程序的执行过程,了解程序的控制结构、函数调用等关键信息。

反汇编指令还可以用于进行逆向工程、调试和研究。

3. 符号表:符号表包含了目标文件中定义和引用的全局符号的信息,如函数、变量等。

通过指定 -t 参数,objdump 可以将符号表的信息显示出来。

符号表的信息对于调试和分析程序非常有用,可以帮助定位问题、理解代码的结构和逻辑。

4. 调试信息:若目标文件包含调试信息,可以通过 -S 参数来将反汇编指令和源代码进行交叉显示。

这样做可以方便地查看源代码和对应的机器码,有助于理解程序的执行流程和调试代码。

objdump 还支持其他格式显示调试信息,如使用 -G 参数以 gas 语法显示,使用 -W 参数显示 DWARF 格式调试信息等。

5. 目标文件格式信息:使用 -f 参数可以显示目标文件的格式信息,包括目标文件类型、CPU 架构、节的数量和大小等。

了解目标文件的格式信息对于理解二进制文件的结构和特性至关重要。

6. 重定位信息:重定位表记录了目标文件中需要进行修正的地方,如函数调用、全局变量等。

使用objdump命令反汇编二进制文件

使用objdump命令反汇编二进制文件

使用objdump命令反汇编二进制文件objdump 是 GNU Binutils 工具包中的一个工具,用于反汇编二进制文件。

它可以将二进制文件转换为汇编代码,帮助我们理解程序的内部细节和执行流程。

使用 objdump 命令反汇编二进制文件可以帮助开发人员进行调试、研究安全漏洞、逆向工程等操作。

以下是使用 objdump 命令反汇编二进制文件的具体步骤和使用示例。

步骤一:安装 GNU Binutils 工具包objdump 命令属于 GNU Binutils 工具包的一部分,因此首先需要安装 Binutils 工具包。

可以通过包管理器进行安装,例如在 Ubuntu 系统中,可以使用以下命令进行安装:```sudo apt-get install binutils```步骤二:反汇编二进制文件一旦安装完成 Binutils 工具包,就可以使用 objdump 命令来反汇编二进制文件。

下面是 objdump 命令的基本语法:```objdump [选项] <二进制文件>```以下是一些常用的选项:- `-d`:反汇编所有节 (sections) 的内容- `-S`:反汇编并显示源代码(如果可用)- `-t`:显示二进制文件中的符号表使用 objdump 命令进行反汇编可以提供更多有关二进制文件内部的信息。

例如,通过 objdump 命令可以查看可执行文件的代码段、数据段、符号表等信息。

以下是一个使用 objdump 命令反汇编可执行文件的示例:```objdump -d ./a.out```上述命令将会反汇编当前目录下的可执行文件 a.out,并输出其汇编代码。

步骤三:分析汇编代码一旦成功运行 objdump 命令并反汇编了目标二进制文件,就可以分析所得到的汇编代码了。

汇编代码可以让我们更深入了解程序的执行流程、指令的功能和数据的存储方式。

通过分析汇编代码,我们还可以判断程序是否存在漏洞或者进行程序优化。

objdump 使用方法 -回复

objdump 使用方法 -回复

objdump 使用方法-回复关于"objdump 使用方法"的文章,将详细介绍该工具的步骤和用法。

objdump是一个十分有用的命令行工具,它可以用于分析可执行文件和目标文件。

无论是在逆向工程、代码审计还是调试过程中,objdump都扮演着重要的角色,它可以帮助开发者理解和调试指令的执行流程,查看变量和符号表以及分析代码中的漏洞。

接下来,我们将详细介绍objdump 的使用方法。

第一步:安装objdumpobjdump是GNU Binutils软件包的一部分,因此你需要确保已经安装了Binutils。

在大多数Linux发行版中,Binutils默认安装。

如果没有安装,可以使用包管理器安装。

例如,在Ubuntu或Debian系统上,可以使用以下命令安装:sudo apt-get install binutils第二步:了解objdump的基本用法objdump这个命令有很多选项和参数,因此在使用之前,先了解一些基本的用法是很重要的。

可以通过以下命令来查看objdump的基本用法:objdump help这将显示所有可用的选项和参数。

在下面的步骤中,我们将介绍一些常用的选项。

第三步:查看可执行文件或目标文件的头部信息objdump可以用来查看一个可执行文件或目标文件的头部信息。

头部信息包含了关于文件类型、目标体系结构以及程序入口点等重要的信息。

可以使用以下命令来查看头部信息:objdump -f <file>其中,`<file>`是需要分析的可执行文件或目标文件。

第四步:反汇编代码objdump最常用的功能之一是反汇编代码。

通过反汇编代码,我们可以查看可执行文件或目标文件中的汇编指令。

下面的命令会将代码以汇编指令的形式输出:objdump -d <file>这将显示整个可执行文件或目标文件的汇编代码。

如果只想查看特定函数的汇编代码,可以使用以下命令:objdump -d <file> -j .text -M intel其中,`-j .text`表示只查看.text节的内容,`-M intel`表示以Intel格式显示汇编代码。

objdump反汇编指令

objdump反汇编指令

objdump反汇编指令
objdump是一个反汇编工具,用于将一个二进制文件中的机器指令转化为汇编指令。

以下是objdump的一些常用选项以及对应的反汇编指令:
1. -d: 反汇编所有的代码段。

输出结果包括机器指令和对应的汇编指令。

2. -D: 类似于-d选项,但是输出结果还包括符号表、调试信息等。

3. -S: 反汇编代码段,并且将反汇编指令与源代码进行交替显示。

输出结果类似于源代码和对应的汇编指令的混合。

4. -M: 指定反汇编器的架构。

例如,使用-M x86-64选项可以指定反汇编目标为x86-64架构。

5. -m: 显示可执行文件的某一特定部分的反汇编结果。

6. -r: 显示重定位信息,包括重定位表和符号表。

7. -t: 显示BSS段的内容。

8. -j: 选择特定的代码段进行反汇编。

例如,-j .text可以只反汇编.text段。

9. -C: 还原由C++编译的函数名。

以上是一些常用的objdump选项和对应的反汇编指令。

使用objdump可以帮助我们查看二进制文件中的机器指令,以及对应的汇编指令,从而进行代码分析和调试。

mingw基本命令

mingw基本命令

mingw基本命令Mingw基本命令Mingw是一套用于Windows操作系统上的开发工具链,它允许开发者在Windows环境下编译和构建Unix-like系统的应用程序。

本文将介绍Mingw的基本命令,以帮助读者更好地使用该工具。

1. gcc命令gcc是Mingw提供的编译器,用于将C/C++源代码编译成可执行文件。

常用的gcc命令选项包括:- -c:只编译源文件,生成目标文件(.o或.obj文件),不进行链接。

- -o:指定生成的可执行文件的名称。

- -I:指定头文件的搜索路径。

- -L:指定库文件的搜索路径。

- -l:链接指定的库文件。

2. g++命令g++是Mingw提供的C++编译器,用法与gcc类似。

通过g++命令,可以将C++源代码编译成可执行文件。

3. make命令make是一个常用的自动化构建工具,可根据Makefile文件中的规则自动编译和链接源代码。

在Mingw中,make命令通常与gcc 或g++命令配合使用。

使用make命令可以简化编译和构建过程,提高开发效率。

4. ar命令ar命令用于创建、修改和提取静态库。

在Mingw中,静态库的文件扩展名通常为.a。

通过ar命令,可以将多个目标文件打包成一个静态库文件,供其他程序使用。

5. dlltool命令dlltool命令用于创建和管理动态链接库(DLL)。

通过dlltool命令,可以从目标文件中提取导出函数,并生成一个.def文件。

然后,可以使用这个.def文件和gcc命令将目标文件编译成DLL。

6. objdump命令objdump命令用于反汇编目标文件或可执行文件,并显示其汇编代码。

通过objdump命令,可以查看程序的汇编实现,以便进行调试和优化。

7. gdb命令gdb是一个强大的调试器,可用于调试C和C++程序。

在Mingw 中,使用gdb命令可以对可执行文件进行调试,查看变量的值、执行流程等。

8. strip命令strip命令用于去除可执行文件或目标文件中的符号表和调试信息,以减小文件大小。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

gcc命令之objdump 收藏---------------objdump是用查看目标文件或者可执行的目标文件的构成的gcc工具---------------以下3条命令足够那些喜欢探索目标文件与源代码之间的丝丝的关系的朋友。

objdump -x obj 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出<可查到该文件的所有动态库>objdump -t obj 输出目标文件的符号表()objdump -h obj 输出目标文件的所有段概括()objdump -j .text/.data -S obj 输出指定段的信息,大概就是反汇编源代码把objdump -S obj C语言与汇编语言同时显示以下为网上摘录文章。

关于nm -s的显示请自己man nm查看objdump命令的man手册objdump - 显示二进制文件信息objdump[-a] [-b bfdname |--target=bfdname] [-C] [--debugging][-d] [-D][--disassemble-zeroes][-EB|-EL|--endian={big|little}] [-f][-h] [-i|--info][-j section | --section=section][-l] [-m machine ] [--prefix-addresses][-r] [-R][-s|--full-contents] [-S|--source][--[no-]show-raw-insn] [--stabs] [-t][-T] [-x][--start-address=address] [--stop-address=address][--adjust-vma=offset] [--version] [--help]objfile...--archive-headers-a 显示档案库的成员信息,与ar tv 类似objdump -a libpcap.a和ar -tv libpcap.a 显示结果比较比较显然这个选项没有什么意思。

--adjust-vma=offsetWhen dumping information, first add offset to allthe section addresses. This is useful if the sec-tion addresses do not correspond to the symboltable, which can happen when putting sections atparticular addresses when using a format which cannot represent section addresses, such as a.out.-b bfdname--target=bfdname指定目标码格式。

这不是必须的,objdump能自动识别许多格式,比如:objdump -b oasys -m vax -h fu.o显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。

objdump -i将给出这里可以指定的目标码格式列表--demangle-C 将底层的符号名解码成用户级名字,除了去掉所有开头的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging显示调试信息。

企图解析保存在文件中的调试信息并以C语言的语法显示出来。

仅仅支持某些类型的调试信息。

--disassemble-d 反汇编那些应该还有指令机器码的section--disassemble-all-D 与-d 类似,但反汇编所有section--prefix-addresses反汇编的时候,显示每一行的完整地址。

这是一种比较老的反汇编格式。

显示效果并不理想,但可能会用到其中的某些显示,自己可以对比。

--disassemble-zeroes一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。

-EB-EL--endian={big|little}这个选项将影响反汇编出来的指令。

little-endian就是我们当年在dos下玩汇编的时候常说的高位在高地址,x86都是这种。

--file-headers-f 显示objfile中每个文件的整体头部摘要信息。

--section-headers--headers-h 显示目标文件各个section的头部摘要信息。

--help 简短的帮助信息。

--info-i 显示对于-b 或者-m 选项可用的架构和目标格式列表。

--section=name-j name 仅仅显示指定section的信息--line-numbers-l 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

--architecture=machine-m machine指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。

可以用-i选项列出这里能够指定的架构--reloc-r 显示文件的重定位入口。

如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。

--dynamic-reloc-R 显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库。

--full-contents-s 显示指定section的完整内容。

objdump --section=.text -s inet.o | more--source-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。

隐含了-d参数。

--show-raw-insn反汇编的时候,显示每条汇编指令对应的机器码,除非指定了--prefix-addresses,这将是缺省选项。

--no-show-raw-insn反汇编时,不显示汇编指令的机器码,这是指定--prefix-addresses选项时的缺省设置。

--stabsDisplay the contents of the .stab, .stab.index, and.stab.excl sections from an ELF file. This is onlyuseful on systems (such as Solaris 2.0) in which.stab debugging symbol-table entries are carried inan ELF section. In most other file formats, debug-ging symbol-table entries are interleaved withlinkage symbols, and are visible in the --syms output.--start-address=address从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。

--stop-address=address显示数据直到指定地址为止,该选项影响-d、-r和-s选项的输出。

--syms-t 显示文件的符号表入口。

类似于nm -s提供的信息--dynamic-syms-T 显示文件的动态符号表入口,仅仅对动态目标文件有意义,比如某些共享库。

它显示的信息类似于nm -D|--dynamic 显示的信息。

--version 版本信息objdump --version--all-headers-x 显示所有可用的头信息,包括符号表、重定位入口。

-x 等价于-a -f -h -r -t 同时指定。

objdump -x inet.o参看nm(1)★objdump应用举例(待增加)/*g++ -g -Wstrict-prototypes -Wall -Wunused -o objtest objtest.c*/#include#includeint main ( int argc, char * argv[] ){execl( "/bin/sh", "/bin/sh", "-i", 0 );return 0;}g++ -g -Wstrict-prototypes -Wall -Wunused -o objtest objtest.cobjdump -j .text -Sl objtest | more/main(查找)08048750:main():/home/scz/src/objtest.c:7*/#include#includeint main ( int argc, char * argv[] ){8048750: 55 pushl %ebp 8048751: 89 e5 movl %esp,%ebp/home/scz/src/objtest.c:8execl( "/bin/sh", "/bin/sh", "-i", 0 );8048753: 6a 00 pushl $0x0 8048755: 68 d0 87 04 08 pushl $0x80487d0 804875a: 68 d3 87 04 08 pushl $0x80487d3 804875f: 68 d3 87 04 08 pushl $0x80487d3 8048764: e8 db fe ff ff call 8048644 <_init+0x40> 8048769: 83 c4 10 addl $0x10,%esp/home/scz/src/objtest.c:9return 0;804876c: 31 c0 xorl %eax,%eax 804876e: eb 04 jmp 8048774 8048770: 31 c0 xorl %eax,%eax 8048772: eb 00 jmp 8048774/home/scz/src/objtest.c:10}8048774: c9 leave8048775: c3 ret8048776: 90 nop如果说上面还不够清楚,可以用下面的命令辅助一下:objdump -j .text -Sl objtest --prefix-addresses | moreobjdump -j .text -Dl objtest | more用以上不同的命令去试会得到惊喜!。

相关文档
最新文档