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.a
Inarchivelibobjdump.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.a
rw-r--r--0/018696Mar820:252019main.o
rw-r--r--0/021352Mar820:252019objdump.o

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

[root@TENCENT64~]#objdump--section=.text-sobjdump.o
objdump.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.o
objdump.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:4883ec10sub$0x10,%rsp
2a:897dfcmov%edi,-0x4(%rbp)
2d:8975f8mov%esi,-0x8(%rbp)
30:837dfc01cmpl$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
//@}

//Forconstructionoffilebuffersforcout,cin,cerr,cloget.al.
staticios_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:e8b0ffffffcallq22<_Z41__static_initialization_and_destruction_0ii>
72:5dpop%rbp
73:c3retq

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

[root@TENCENT64~]#objdump-tobjdump.o
objdump.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.o
U__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.o
objdump.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爱好者】欢迎添加关注!文章转载请注明出处。


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

    关注

    88

    文章

    11817

    浏览量

    219555
  • 命令
    +关注

    关注

    5

    文章

    759

    浏览量

    23924

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式ElfBoard-进程之什么是进程

    将源码转换为计算机可以理解的二进制机器语言指令。解释型脚本形式:脚本是包含命令的文本文件,可以由shell或者其他命令解释器之类的程序直接处理。(如:python、Bash)等脚本语言通过解释器
    发表于 01-26 08:42

    初识ros2 功能包建立与可执行文件的配置

    本文介绍了ROS2程序的两种启动方式:直接运行可执行文件(ros2 run)和使用启动文件(ros2 launch)。重点讲解了Python软件包的结构,包括package.xml、setup.py
    的头像 发表于 01-22 13:41 443次阅读

    如何将Python GUI程序打包成EXE可执行文件

    如果我们给同事展示一个命令行,他们可能会有点“吓人”的感觉,担心忘记或输错参数。而一个 UI 界面则是一目了然,“选择固件→点击下载”这样的流程几乎零学习成本。
    的头像 发表于 12-16 09:08 3910次阅读
    如何将Python GUI程序打包成EXE<b class='flag-5'>可执行文件</b>

    飞凌嵌入式ElfBoard-获取文件的状态信息文件权限

    可执行文件等。b:表示这是一个块设备文件,如硬盘、光驱等。c:表示这是一个字符设备文件,如键盘、鼠标等。l:表示这是一个符号链接(软连接)。s:表示这是一个套接字文件(socket)
    发表于 12-16 08:40

    采用汇编指示符来使用自定义指令

    ,.dword为插入双字即64位。以下为演示过程: * 在main.c中编写如下代码 * 使用riscv-nuclei-elf-gcc main.c命令编译main.c。 生成默认名a.out可执行文件
    发表于 10-28 06:02

    飞凌嵌入式ElfBoard-Vim编辑器之GCC的基本使用

    ./hello_ubuntu,可以看到输出结果和我们程序的要求一致。如果编译命令不添加-o hello_ubuntu,则编译完成生成的是a.out可执行文件,输出结果是一样的。elf@ubuntu:~/work
    发表于 10-16 09:05

    飞凌嵌入式ElfBoard-Linux系统基础入门-文件操作相关shell命令

    -iname文件名称符合,忽略大小写示例:2.5.12 whereis查找文件命令:whereis功能:用于定位可执行文件、源代码
    发表于 09-30 09:46

    飞凌嵌入式ElfBoard ELF 1板卡-Linux系统基础入门-目录相关shell命令

    ,权限,时间等信息-t依照建立时间顺序列出文件-F按类型列出文件,在文件末尾用不同符号区分斜线(/)表示目录星号(*)表示可执行文件@符号
    发表于 09-29 10:12

    测试工程师都在用的Linux命令清单(建议收藏)

    的Linux命令,并结合实际场景解析其应用方法。一、文件和目录操作:基础中的基础1.1文件查看命令#查看
    的头像 发表于 08-08 10:06 833次阅读
    测试工程师都在用的Linux<b class='flag-5'>命令</b>清单(建议收藏)

    ESP32驱动SPIFFS进行文件操作

    本篇文章介绍如何在ESP32开发板上使用SPIFFS(SPI Flash File System)进行文件操作。看下如何初始化SPIFFS文件系统、读取文件、列出文件、删除
    的头像 发表于 08-05 18:11 4494次阅读
    ESP32驱动SPIFFS进<b class='flag-5'>行文件</b>操作

    Linux基础命令which详解

    在Linux系统中,which命令用于查找并显示指定命令可执行文件路径。这对于系统管理员和开发人员来说是一个非常有用的工具,可以帮助定位命令
    的头像 发表于 07-29 17:58 1057次阅读

    【Milk-V Duo S 开发板免费体验】移植lrzsz方便使用zmodem进行文件传输

    生成的可执行文件位于src下三. 测试导出文件到开发板scp src/lrz root@192.168.42.1:/root 需要输入密码milkv scp src/lsz
    发表于 07-08 15:01

    Linux系统查看及修改设备型号信息,触觉智能RK3562开发板演示

    本文介绍Linux系统如何查看及修改设备型号信息的方法,适用于查看设备型号信息或者想将设备型号信息
    的头像 发表于 06-19 15:58 1213次阅读
    Linux系统<b class='flag-5'>查看</b>及修改设备型号<b class='flag-5'>信息</b>,触觉智能RK3562开发板演示

    飞凌嵌入式ElfBoard ELF 1板卡-uboot常用命令文件系统命令

    ; fatinfo mmc 1:1 二、fatls fatls 命令用于查询fat格式设备的目录和文件信息命令格式如下: fatls[]
    发表于 05-26 17:32

    Linux常用命令大全

    Linux常用命令是指在Linux操作系统中广泛使用的命令工具,这些命令工具可以完成各种不同的任务,如管理文件和目录、操作进程、网络通信、软件安装等。
    的头像 发表于 05-03 18:08 2041次阅读