linux如何查看节里面的内容

在Linux系统中,“节”(Section)通常指可执行文件、目标文件或共享库中的数据段,用于存储代码、数据、符号表等信息,查看节内容有助于分析程序结构、调试问题或理解文件布局,以下是常用工具及方法,结合实例说明如何查看节内容。

linux如何查看节里面的内容

ELF文件与节的基本概念

Linux下的可执行文件多采用ELF(Executable and Linkable Format)格式,其结构包括ELF头、节头表(Section Header Table)和各节内容,节头表记录了每个节的名称、大小、偏移量等信息,是定位节内容的关键,常见节包括:

  • .text:存储程序代码(可执行指令)。
  • .data:已初始化的全局变量和静态变量。
  • .bss:未初始化的全局变量和静态变量(运行时初始化为0)。
  • .rodata:只读数据(如字符串常量)。
  • .symtab:符号表(函数和变量名及其地址)。

的工具及方法

readelf:查看ELF文件结构的核心工具

readelf是专门分析ELF文件的工具,支持查看节头表、节内容、符号表等详细信息。

(1)查看节头表(列出所有节)

使用-S或--section-headers选项可显示节头表,包含节名、大小、偏移量等信息:

readelf -S example

输出示例(截取关键部分):

[Nr] Name              Type            Addr     Off    Size   Flg Lk Inf Al
[ 0]                   NULL            00000000 000000 000000 00      0   0  0
[ 1] .text             PROGBITS        00000000 000040 000020 00   AX  0   0  4
[ 2] .data             PROGBITS        00000020 000060 000010 00  WA  0   0  4
[ 3] .bss              NOBITS          00000030 000070 000008 00  WA  0   0  1
[ 4] .rodata           PROGBITS        00000000 000070 000005 00   A  0   0  1
  • Name:节名(如.text)。
  • Type:节类型(PROGBITS为数据/代码,NOBITS为.bss等虚拟节)。
  • Addr:节在内存中的起始地址。
  • Off:节在文件中的偏移量。
  • Size:节的大小(字节)。
  • Flg:节属性(A=可定位,X=可执行,W=可写)。

(2)查看指定节的原始内容

使用-x或--hex-dump选项可查看节的十六进制内容,需指定节索引(从0开始)或节名:

# 按节索引查看(如查看索引1的.text节)
readelf -x 1 example
# 按节名查看(如查看.rodata节)
readelf -x .rodata example

输出示例(.rodata):

Hex dump of section '.rodata':
  0x00000070 48656c6c 6f20576f 726c6421 0a         Hello World!.

(3)查看节中的字符串内容

使用-p或--string-dump选项可提取节中的字符串(适用于.rodata、.comment等节):

readelf -p .rodata example

输出:

String dump of section '.rodata':
  [     0]  Hello World!

(4)查看符号表与节的关联

符号表(.symtab或.dynsym)记录了符号与节的对应关系,使用--syms或-s查看:

linux如何查看节里面的内容

readelf -s example

输出示例:

Symbol table '.symtab' contains 4 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    1 main
     2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    2 data_var
     3: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    3 bss_var
  • Ndx列表示符号所属的节索引(如1对应.text,2对应.data)。

objdump:反汇编与节内容查看

objdump是二进制文件分析工具,支持反汇编和节内容转储。

(1)查看节头信息

使用-h或--section-headers选项:

objdump -h example

输出与readelf -S类似,但格式略有不同。

(2)查看节内容(十六进制+ASCII)

使用-s或--full-contents选项:

objdump -s example

输出示例:

Contents of section .rodata:
 0000 48656c6c 6f20576f 726c6421 0a         Hello World!.

(3)反汇编代码节(.text)

使用-d或--disassemble选项可反汇编.text节:

objdump -d example

输出示例(汇编代码):

00000000 <main>:
   0:   push   %rbp
   1:   mov    %rsp,%rbp
   4:   sub    $0x10,%rsp
   8:   lea    0x0(%rip),%rax        # 12 <main+0x12>
   a:   mov    %rax,-0x4(%rbp)
   f:   mov    -0x4(%rbp),%rax
  12:   mov    %rax,%rdi
  15:   call   0x20 <puts@plt>
  1a:   mov    $0x0,%eax
  1f:   leave  
  20:   ret    

nm:查看符号与节的映射

nm用于显示文件的符号表,可结合节索引查看符号所属节:

linux如何查看节里面的内容

nm example

输出示例:

0000000000000000 T main
0000000000000000 D data_var
0000000000000000 B bss_var
  • T:符号在.text节(代码)。
  • D:符号在.data节(已初始化数据)。
  • B:符号在.bss节(未初始化数据)。

size:查看节大小统计

size工具可快速显示各节的总大小(以字节为单位):

size example

输出示例:

   text    data     bss     dec     hex filename
    32      16       8      56      38 example
  • text:.text节大小(代码)。
  • data:.data和.rodata等已初始化数据节大小。
  • bss:.bss节大小(未初始化数据)。

工具对比与使用场景

以下表格总结了各工具的功能特点及适用场景:

工具 主要功能 常用选项 适用场景
readelf 查看ELF文件结构、节头表、符号表 -S(节头表)、-x(十六进制内容)、-p(字符串) 精确分析节布局、调试符号问题
objdump 反汇编、节内容转储、符号表查看 -h(节头)、-s)、-d(反汇编) 代码分析、查看二进制数据内容
nm 显示符号表及所属节 无(默认显示所有符号) 快速定位变量/函数所在的节
size 统计节大小(text/data/bss) 无(默认显示统计) 快速了解程序内存占用分布

进阶技巧

  • 结合grep过滤节名:若文件节较多,可通过管道过滤目标节,例如readelf -S example | grep "data"。
  • 查看动态节(共享库):对于动态链接的ELF文件,使用readelf -d example查看动态节(如.dynsym、.dynstr)。

相关问答FAQs

Q1: 如何查看ELF文件中某个特定节(如.rodata)的所有字符串?
A: 使用readelf的-p选项直接提取节中的字符串,查看example文件中.rodata节的字符串:

readelf -p .rodata example

若节名包含空格或特殊字符,需用引号包裹,例如readelf -p ".my data" example。

Q2: readelf和objdump在查看节内容时有什么区别?
A: 两者均能查看节内容,但侧重点不同:

  • readelf:专注于ELF文件结构分析,功能更全面(如节头表、符号表、重定位信息等),适合底层调试和文件格式研究。
  • objdump:更侧重于可读性,支持反汇编(-d)和混合显示(十六进制+ASCII),适合代码分析和逆向工程。
    查看.text节时,readelf -x .text example输出纯十六进制,而objdump -d example直接反汇编为汇编指令,更易理解代码逻辑。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/20954.html

赞 (0)
酷番叔酷番叔
上一篇 2025年8月31日 16:10
下一篇 2025年8月31日 16:26

相关推荐

  • Linux解压zip文件的操作方法有哪些?

    在Linux系统中,处理zip文件是日常运维和开发中常见的操作,无论是接收跨平台传输的压缩包,还是管理项目资源,掌握解压zip文件的方法都至关重要,本文将详细介绍Linux环境下解压zip文件的多种工具、具体操作步骤、高级选项应用及常见问题解决方案,帮助用户高效完成文件解压任务,Linux解压zip文件的常用工……

    2025年9月21日
    24100
  • Linux如何实时监测内存使用情况及占用?

    Linux内存监测是系统运维和性能优化中的核心环节,通过实时或历史数据掌握内存使用情况,可有效避免内存不足导致的系统卡顿、服务崩溃等问题,Linux提供了多种内置工具和第三方工具,结合不同命令参数和输出分析,能全面监控内存状态,以下从常用工具、核心指标、分析方法三方面详细说明,基础内存监测工具:快速查看整体状态……

    2025年10月7日
    20300
  • Linux如何登录root账户?方法步骤及注意事项解析

    Linux系统中,root用户是拥有最高权限的超级管理员,负责系统核心配置、软件安装、用户管理等关键操作,由于root权限过高,直接登录存在安全风险,Linux系统通常默认禁用root直接登录,需通过特定方法切换或登录,以下是几种常见的root登录方式及相关注意事项,通过su命令切换到root用户(命令行界面……

    2025年8月25日
    28500
  • linux 如何进入mongo

    Linux 中,进入 MongoDB 通常使用 mongo 命令。

    2025年8月15日
    15900
  • Linux中创建文件夹目录的具体步骤和命令是什么?

    在Linux操作系统中,建立文件夹目录(即创建目录)是日常管理和系统维护的基础操作,主要通过mkdir命令实现,mkdir是“make directory”的缩写,支持灵活的参数配置,能够满足单目录创建、多级嵌套目录创建、权限设置等需求,本文将详细介绍mkdir命令的使用方法、常用参数、高级技巧及常见问题解决……

    2025年9月24日
    26000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信