欢迎光临
专业Linux运维二十年

linux查看二进制文件信息是什么-objdump 命令使用与实例

Linux objdump 命令


objdump 是 GNU Binutils 集中的一个重要命令行工具,用于显示目标文件(object files)和可执行文件的各种信息。它是 Linux 系统下进行二进制分析、逆向工程和调试的利器。

objdump 的主要功能包括:

  • 反汇编二进制文件
  • 查看文件头部信息
  • 显示节区(section)内容
  • 查看符号表
  • 显示重定位信息
  • 分析文件结构

基本语法

objdump 的基本命令格式如下:

objdump [选项] 文件名

登录后复制

如果不指定任何选项,objdump 会显示文件的节区头部信息。


常用选项详解

反汇编相关选项

实例

-d,
–disassemble        
# 反汇编包含代码的节区

-D,
–disassemble-all    
# 反汇编所有节区

-S,
–source            
# 混合显示源代码和汇编代码(需要编译时使用-g选项)


–prefix-addresses      
# 在反汇编时显示完整地址


–no-addresses          
# 不显示地址信息

节区信息选项

实例

-h,
–section-headers    
# 显示节区头部信息

-j,
–section=名称      
# 仅显示指定节区的内容

符号表选项

实例

-t,
–syms              
# 显示符号表

-T,
–dynamic-syms      
# 显示动态符号表

文件头部信息

-f, --file-headers       # 显示文件头部信息

登录后复制

其他实用选项

实例

-l,
–line-numbers      
# 显示行号信息(需要调试信息)

-r,
–reloc              
# 显示重定位条目

-R,
–dynamic-reloc      
# 显示动态重定位条目

-s,
–full-contents      
# 显示所有节区的完整内容


实用示例

示例1:查看可执行文件的结构

objdump -h /bin/ls

登录后复制

输出示例:

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。


33

/bin/ls:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  0000000000400238  0000000000400238  00000238  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  0000000000400254  0000000000400254  00000254  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  ...

登录后复制

示例2:反汇编可执行文件

objdump -d /bin/ls

登录后复制

输出示例(部分):

0000000000405a50 :
  405a50:       31 ed                   xor    %ebp,%ebp
  405a52:       49 89 d1                mov    %rdx,%r9
  405a55:       5e                      pop    %rsi
  405a56:       48 89 e2                mov    %rsp,%rdx
  405a59:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
  ...

登录后复制

示例3:查看符号表

objdump -t myprogram.o

登录后复制

输出示例:

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。


33

myprogram.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 myprogram.c
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 g     F .text  0000000000000015 main
0000000000000000         *UND*  0000000000000000 printf

登录后复制

示例4:混合显示源代码和汇编代码

objdump -S myprogram

登录后复制

输出示例:

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。


33

实例

int m n
(
)
{

 
400526
:      
55                      push  
%rbp

 
400527
:      
48
89 e5                mov    
%rsp
,%rbp

   
printf
(
“Hello, World!n”
)
;

  40052a
:       bf d4
05
40
00          mov    $
0x4005d4
,%edi

 
40052f
:       e8 cc fe ff ff          callq  
400400

   
return
0
;

 
400534
:       b8
00
00
00
00          mov    $
0x0
,%eax


}


实际应用场景

场景1:调试程序崩溃

当程序崩溃时,可以使用 objdump 查看崩溃地址附近的代码:

objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram

登录后复制

场景2:分析库函数调用

查看程序调用了哪些动态库函数:

objdump -T myprogram | grep UND

登录后复制

场景3:学习汇编语言

通过反汇编简单的C程序来学习汇编语言:

实例

gcc
-o simple simple.c

objdump
-d simple


注意事项

  1. 调试信息:要获得源代码级别的信息,编译时需要加上 -g 选项
  2. 优化影响:编译器优化会影响生成的汇编代码,分析时需注意
  3. 架构差异:不同CPU架构的汇编指令不同,确保使用正确的反汇编选项
  4. 权限问题:分析系统文件可能需要root权限
  5. 文件格式:objdump 主要针对ELF格式文件,其他格式可能需要特殊处理

进阶技巧

结合其他工具使用

实例

# 使用grep过滤特定函数

objdump
-d myprogram
|
grep
-A20
“main>:”

# 统计函数大小

objdump
-d myprogram
|
awk
‘/^[0-9a-f]+ :/ {print $1,$2}’

创建反汇编脚本

实例

#!/bin/bash


# 反汇编脚本示例


if
[
$#
-ne
1
];
then

   
echo
“Usage: $0 “

   
exit
1


fi

echo
“=== 文件头部信息 ===”

objdump
-f
$1

echo
-e
“n=== 节区信息 ===”

objdump
-h
$1

echo
-e
“n=== 反汇编代码 ===”

objdump
-d
$1


总结

objdump 是Linux系统下强大的二进制分析工具,掌握它可以:

  • 深入理解程序运行机制
  • 快速定位程序问题
  • 学习汇编语言和系统知识
  • 进行基础的逆向工程分析

通过本文介绍的基本用法和实用示例,你应该已经能够开始使用 objdump 进行基本的二进制文件分析了。随着实践经验的积累,你会发现它在系统编程和调试中的更多妙用。


脚本之家
赞(0) 打赏
未经允许不得转载:Linux老运维 » linux查看二进制文件信息是什么-objdump 命令使用与实例

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫