0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用于查看目标文件或可执行文件的组成信息的命令:objdump命令

Linux爱好者 来源:Linux爱好者 作者:恋猫大鲤鱼 2021-02-09 18:17 次阅读

1.功能简介

objdump 命令是 GNU Binutils 二进制工具集的一员,用于查看目标文件或可执行文件的组成信息,以可读的形式打印二进制文件的内容。

2.命令格式

objdump[OPTIONS]OBJFILES

3.选项说明

-a,--archive-headers显示档案头信息,展示档案每一个成员的文件格式。效果等同于命令 ar -tv -b,--target=BFDNAME 指定目标码格式。这不是必须的,objdump 能自动识别许多格式,比如 objdump -b oasys -m vax -h fu.o 显示 fu.o 的头部摘要信息,明确指出该文件是 Vax 系统下用 Oasys 编译器生成的目标文件。objdump -i 将给出这里可以指定的目标码格式列表 -C,--demangle[=STYLE] 目标文件中的符号解码成用户级名称。比如移除符号修饰时在变量与函数名前添加的下划线等。 -d,--disassemble 反汇编目标文件,将机器指令反汇编成汇编代码 -D,--disassemble-all 与-d类似,但反汇编所有段(section) -z,--disassemble-zeroes 一般反汇编输出将省略零块,该选项使得这些零块也被反汇编 -EB,-EL,--endian={big|little} 指定目标文件的字节序,在目标文件没描述字节序时很有用,例如 S-records。这个选项只影响反汇编 -f,--file-headers 显示每一个目标文件的头信息 -F,--file-offsets 反汇编时,打印每一个符号的偏移地址 --file-start-context 显示源码/汇编代码(假设为-S)时,将上下文扩展到文件的开头 -g,--debugging 显示调试信息。企图解析保存在文件中的调试信息并以 C 语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持 -e,--debugging-tags 类似-g选项,但是生成的信息是和ctags工具相兼容的格式 -h,--section-headers,--headers 显示目标文件各个section的头部摘要信息 -i,--info 显示对于-b或者-m选项可用的架构和目标格式列表 -j,--section=NAME 仅显示指定名称的section的信息 -l,--line-numbers 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用 -S,--source反汇编时尽可能使用源代码表示。隐含了-d参数-m,--architecture=MACHINE 指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构 -M,--disassembler-options=OPTIONS 给反汇编程序传递参数,可以指定多个,使用逗号分隔 -p,--private-headers 打印目标文件格式的特定信息。打印的信息取决于目标文件格式,对于某些目标文件格式,不打印任何附加信息。 -P,--private=OPTIONS 打印目标文件格式的特定信息。OPTIONS 是一个逗号分隔的列表。例如对于XCOFF,可用的选项有 header, aout, sections, syms, relocs, lineno, loader, except, typchk, traceback and toc -r,--reloc 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来 -R,--dynamic-reloc 显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库 -s,--full-contents 显示section的完整内容。默认所有的非空section都会被显示 -W[lLiaprmfFsoRt],--dwarf=[rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index] 显示文件中调试段的内容,如果存在的话 -G,--stabs 显示请求的任何 section 的全部内容。显示段 .stab、.stab.index 和 .stab.excl 的内容 -t,--syms 显示文件的符号表入口。类似于nm -s提供的信息 -T,--dynamic-syms 显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D,--dynamic 显示的信息 -x,--all-headers 显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -p -r -t 同时指定 -w,--wide 为具有超过80列的输出设备格式化某些行。也不要在显示符号名称时截断符号名称 --start-address=ADDRESS 从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出 --stop-address=ADDRESS 显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出 --prefix-addresses 反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式 --no-show-raw-insn 反汇编时,不显示汇编指令的机器码。当使用--prefix-addresses时,这是缺省选项 --adjust-vma=OFFSET 当解析信息时,首先给所有的段添加偏移值offset。当段地址与符号表不符时,这个选项很有用。比如将段放置到特殊地址,因为某个格式无法表示段地址,比如 a.out --special-syms 显示特殊符号与用户不关心的符号 --prefix=PREFIX 当使用-S时,指定前缀添加到绝对路径中 --prefix-strip=LEVEL 指定剥离绝对路径中多少个前缀目录名。此选项只有在使用了选项--prefix=PREFIX 才有效 --insn-width=WIDTH 指定反汇编后的指令输出的行宽,单位字节 -V,--version 版本信息 -H,--help帮助信息

4.常用示例

首先给出后面大部分测试所基于的源代码以及编译指令。涉及两个C++源文件。
objdump.cpp:

main.cpp:

#include
           usingnamespacestd; voidprint(); intmain() {print(); }

使用-g选项加入调试信息,分别编译生成目标文件objdump.o与main.o。

g++-c-gobjdump.cpp-oobjdump.o g++-c-gmain.cpp-omain.o

然后通过ar命令将两个目标文件打包成静态库libobjdump.a。

arcrvlibobjdump.amain.oobjdump.o

(1)查看档案包含的目标文件列表。

[root@TENCENT64~]#objdump-alibobjdump.aInarchivelibobjdump.a: main.o:fileformatelf64-x86-64 rw-r--r--0/018696Mar820:252019main.o objdump.o:fileformatelf64-x86-64 rw-r--r--0/021352Mar820:252019objdump.o

使用命令ar -tv也可以列出档案中包含的目标文件。

[root@TENCENT64~]#ar-tvlibobjdump.arw-r--r--0/018696Mar820:252019main.o rw-r--r--0/021352Mar820:252019objdump.o

(2)显示目标文件objdump.o的代码段(.text)内容。

[root@TENCENT64~]#objdump--section=.text-sobjdump.oobjdump.o:fileformatelf64-x86-64 Contentsofsection.text: 0000554889e5be00000000bf00000000e800UH.............. 0010000000be000000004889c7e800000000........H....... 00205dc3554889e54883ec10897dfc8975f8].UH..H....}..u. 0030837dfc017527817df8ffff0000751ebf.}..u'.}.....u.. 004000000000e800000000ba00000000be00................ 0050000000bf00000000e800000000c9c355...............U 00604889e5beffff0000bf01000000e8b0ffH............... 0070ffff5dc3..].

注意,不能单独使用-j或者–section选项,一定要加上-s选项。

(3)反汇编objdump.o中的text段内容,并尽可能用源代码形式表示。

[root@TENCENT64~]#objdump--section=.text-Sobjdump.oobjdump.o:fileformatelf64-x86-64 Disassemblyofsection.text: 0000000000000000<_Z5printv>:#include
           voidprint() { 0:55push%rbp 1:4889e5mov%rsp,%rbp std::cout<<"objdump"<
          
           $0x0,%esi 9:bf00000000mov
           $0x0,%edi e:e800000000callq13<_Z5printv+0x13> 13:be00000000mov
           $0x0,%esi 18:4889c7mov%rax,%rdi 1b:e800000000callq20<_Z5printv+0x20> } 20:5dpop%rbp 21:c3retq 0000000000000022<_Z41__static_initialization_and_destruction_0ii>: 22:55push%rbp 23:4889e5mov%rsp,%rbp 26:4883ec10
           sub
           $0x10,%rsp 2a:897d
           fcmov%edi,-0x4(%rbp) 2d:8975f8mov%esi,-0x8(%rbp) 30:837d
           fc01cmpl
           $0x1,-0x4(%rbp) 34:7527jne5d<_Z41__static_initialization_and_destruction_0ii+0x3b> 36:817df8ffff0000cmpl
           $0xffff,-0x8(%rbp) 3d:751ejne5d<_Z41__static_initialization_and_destruction_0ii+0x3b> externwostreamwclog;///Linkedtostandarderror(buffered)
           #endif//@} //Forconstructionoffilebuffers
           forcout,cin,cerr,cloget.al. stat
           ic
           ios_base::Init__ioinit; 3f:bf00000000mov
           $0x0,%edi 44:e800000000callq49<_Z41__static_initialization_and_destruction_0ii+0x27> 49:ba00000000mov
           $0x0,%edx 4e:be00000000mov
           $0x0,%esi 53:bf00000000mov
           $0x0,%edi 58:e800000000callq5d<_Z41__static_initialization_and_destruction_0ii+0x3b> 5d:c9leaveq 5e:c3retq 000000000000005f<_GLOBAL__sub_I__Z5printv>: 5f:55push%rbp 60:4889e5mov%rsp,%rbp 63:beffff0000mov
           $0xffff,%esi 68:bf01000000mov
           $0x1,%edi 6d:e8b0ffff
           ffcallq22<_Z41__static_initialization_and_destruction_0ii> 72:5dpop%rbp 73:c3retq
          

(3)显示目标文件的符号表入口。

[root@TENCENT64~]#objdump-tobjdump.oobjdump.o:fileformatelf64-x86-64 SYMBOLTABLE: 0000000000000000ldf*ABS*0000000000000000objdump.cpp 0000000000000000ld.text0000000000000000.text 0000000000000000ld.data0000000000000000.data 0000000000000000ld.bss0000000000000000.bss 0000000000000000lO.bss0000000000000001_ZStL8__ioinit 0000000000000000ld.rodata0000000000000000.rodata 0000000000000022lF.text000000000000003d_Z41__static_initialization_and_destruction_0ii 000000000000005flF.text0000000000000015_GLOBAL__sub_I__Z5printv 0000000000000000ld.init_array0000000000000000.init_array 0000000000000000ld.debug_info0000000000000000.debug_info 0000000000000000ld.debug_abbrev0000000000000000.debug_abbrev 0000000000000000ld.debug_aranges0000000000000000.debug_aranges 0000000000000000ld.debug_line0000000000000000.debug_line 0000000000000000ld.debug_str0000000000000000.debug_str 0000000000000000ld.note.GNU-stack0000000000000000.note.GNU-stack 0000000000000000ld.eh_frame0000000000000000.eh_frame 0000000000000000ld.comment0000000000000000.comment 0000000000000000gF.text0000000000000022_Z5printv 0000000000000000*UND*0000000000000000_ZSt4cout 0000000000000000*UND*0000000000000000_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc 0000000000000000*UND*0000000000000000_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 0000000000000000*UND*0000000000000000_ZNSolsEPFRSoS_E 0000000000000000*UND*0000000000000000_ZNSt8ios_base4InitC1Ev 0000000000000000*UND*0000000000000000.hidden__dso_handle 0000000000000000*UND*0000000000000000_ZNSt8ios_base4InitD1Ev 0000000000000000*UND*0000000000000000__cxa_atexit

这里,输出的信息类似nm -s命令的输出,相比较之下,nm命令的输出如下:

[root@TENCENT64~]#nm-sobjdump.oU__cxa_atexit U__dso_handle 000000000000005ft_GLOBAL__sub_I__Z5printv 0000000000000022t_Z41__static_initialization_and_destruction_0ii 0000000000000000T_Z5printv U_ZNSolsEPFRSoS_E U_ZNSt8ios_base4InitC1Ev U_ZNSt8ios_base4InitD1Ev U_ZSt4cout U_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 0000000000000000b_ZStL8__ioinit U_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc

(4)显示目标文件各个段的头部摘要信息。

[root@TENCENT64~]#objdump-hobjdump.oobjdump.o:fileformatelf64-x86-64 Sections: IdxNameSizeVMALMAFileoffAlgn 0.text0000007400000000000000000000000000000000000000402**2 CONTENTS,ALLOC,LOAD,RELOC,READONLY,CODE 1.data0000000000000000000000000000000000000000000000b42**2 CONTENTS,ALLOC,LOAD,DATA 2.bss0000000100000000000000000000000000000000000000b42**2 ALLOC 3.rodata0000000800000000000000000000000000000000000000b42**0 CONTENTS,ALLOC,LOAD,READONLY,DATA 4.init_array0000000800000000000000000000000000000000000000c02**3 CONTENTS,ALLOC,LOAD,RELOC,DATA 5.debug_info000014f900000000000000000000000000000000000000c82**0 CONTENTS,RELOC,READONLY,DEBUGGING 6.debug_abbrev0000039f00000000000000000000000000000000000015c12**0 CONTENTS,READONLY,DEBUGGING 7.debug_aranges0000003000000000000000000000000000000000000019602**0 CONTENTS,RELOC,READONLY,DEBUGGING 8.debug_line0000024400000000000000000000000000000000000019902**0 CONTENTS,RELOC,READONLY,DEBUGGING 9.debug_str00000e4c0000000000000000000000000000000000001bd42**0 CONTENTS,READONLY,DEBUGGING 10.comment0000002d0000000000000000000000000000000000002a202**0 CONTENTS,READONLY 11.note.GNU-stack000000000000000000000000000000000000000000002a4d2**0 CONTENTS,READONLY 12.eh_frame000000780000000000000000000000000000000000002a502**3 CONTENTS,ALLOC,LOAD,RELOC,READONLY,DATA

参考文献

[1] objdump manual
[2] objdump命令.Linux命令大全
[3] GNU Binutils

责任编辑:xj

原文标题:每天一个 Linux 命令(106):objdump 命令

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11102

    浏览量

    207663
  • 命令
    +关注

    关注

    5

    文章

    657

    浏览量

    21919

原文标题:每天一个 Linux 命令(106):objdump 命令

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式学习-常见的shell命令文件操作相关命令

    、whereis查找 文件 命令:whereis功能: 用于定位 可执行文件、源代码 文件、帮助 文件
    发表于08-20 09:40

    常见的shell命令文件操作相关命令

    用于定位 可执行文件、源代码 文件、帮助 文件文件系统中的位置参数:whereis [选项] 文件
    发表于08-19 10:01

    430单片机代码debug后无法生成可执行文件

    软件是用许可证注册过的,代码是正确的,但是点完右上角那个build键后,消息框说生成不了 可执行文件,如图
    发表于07-15 09:28

    labview生成exe文件如何配置文件

    LabVIEW是一种 用于实时测试、控制和数据采集的编程环境。在开发过程中,您可以使用LabVIEW软件生成 可执行文件(.exe),以便在没有LabVIEW开发环境的计算机上运行您的应用程序。生成
    的头像 发表于12-27 16:28 1559次阅读

    keil如何生成bin文件

    创建工程、编写代码、配置编译选项、编译生成 可执行文件、转换为bin 文件等。 创建工程 首先,打开Keil软件,点击“File”->“New”->“Project”,选择适合的 目标设备,如STM32系列或其他ARM芯片。输入项目名
    的头像 发表于12-15 13:43 9115次阅读

    bootm命令执行流程

    ,用来保存 可执行内核映像的相关 信息,主要包括内核映像的加载地址、起始地址、 可执行入口地址等。 获取内核映像的相关 信息是为后面的加载
    的头像 发表于12-04 17:33 822次阅读
    bootm<b class='flag-5'>命令</b>的<b class='flag-5'>执行</b>流程

    LabVIEW在不同操作系统上使VI、可执行文件或安装程序

    的。 可执行文件必须在 目标操作系统上构建,并且不能在另一个操作系统上或同一操作系统的另一个版本上运行。例如,Windows 7的安装程序 或可执行文件在不同的Windows版本上(例如Windows XP
    发表于12-02 21:47

    linux显示文件行号命令

    的前面显示行号。如果要显示特定 文件的行号,只需将 filename 替换为您的 文件名即可。 除了 cat -n 命令,还有其他一些方法可以显示 文件的行号: nl
    的头像 发表于11-13 16:55 1496次阅读

    linux删除文件命令rm

    在Linux系统中,可以使用rm 命令来删除 文件或目录。该 命令的功能是删除一个目录中的一个或多个 文件或目录,也可以将某个目录及其下的所有 文件
    的头像 发表于11-13 16:42 644次阅读

    linux解压gz文件命令

    在Linux系统中,可以使用gzip 命令解压.gz 文件。gzip 命令 用于压缩和解压缩 文件,使用方法如下: 解压.gz
    的头像 发表于11-08 14:42 4421次阅读

    linux中查找文件命令

    在Linux中,可以使用以下 命令来查找 文件: find 命令:可以在指定目录及其子目录中查找 文件,支持根据 文件名、
    的头像 发表于11-08 14:24 991次阅读

    linux中删除文件命令

    在Linux中,可以使用 rm 命令来删除 文件。该 命令有多个参数和选项可供使用,以根据不同的情况进 行文件删除操作。例如: rm 命令后面跟上
    的头像 发表于11-08 14:11 523次阅读

    shell脚本基本命令

    Shell脚本是一种 可执行文件,它包含了一组用某种特定语言编写的 命令,这些 命令可以被解释器(如bash) 执行。以下是一些常见的shell脚本基本 命令
    的头像 发表于11-08 10:08 1525次阅读

    K510跑python的opencv可行吗?打包为linux可执行文件能跑吗?

    想了解一下K510跑python的opencv可行吗?打包为linux 可执行文件能跑吗?
    发表于09-14 09:01

    计算机中的ELF文件解析

    关于计算机的 文件有很多种,今天分享一种 用于二进制 文件可执行文件目标代码、共享库和核心转储格式 文件
    发表于09-13 10:12 898次阅读
    计算机中的ELF<b class='flag-5'>文件</b>解析