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对应.text2对应.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: readelfobjdump在查看节内容时有什么区别?
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系统如何安装bz2文件?

    bz2文件是使用bzip2算法压缩的文件格式,在Linux系统中常用于压缩源代码包或数据文件,因其较高的压缩率而被广泛使用,安装bz2文件通常需要先解压,再根据文件类型(源代码包或二进制文件)进行后续操作,本文将详细介绍在Linux系统中安装bz2文件的完整步骤,包括工具准备、解压方法、源代码编译安装及二进制文……

    2025年8月28日
    2700
  • Linux如何查看网络端口状态及占用情况?

    在Linux系统中,网络端口管理是系统运维和开发中的核心任务之一,无论是排查服务是否正常监听、诊断端口冲突,还是进行安全审计,都需要掌握查看网络端口的方法,Linux提供了多种命令和工具来查看端口状态、关联进程及详细信息,下面将详细介绍这些工具的使用方法及适用场景,使用netstat命令查看端口netstat是……

    2025年8月22日
    3600
  • 如何在Linux无root权限下安全安装软件?

    核心思路:用户级目录编译Linux允许用户在个人目录(如或~/local/)中完成编译和安装,无需root权限,关键在于自定义安装路径和环境变量配置,步骤详解创建本地安装目录在用户主目录下建立专用目录,避免污染系统路径:mkdir -p ~/local/bin ~/local/lib ~/local/inclu……

    2025年7月21日
    4300
  • 双硬盘如何装linux

    启动U盘,进入BIOS设置从U盘启动,安装时选择手动分区,指定双

    2025年8月10日
    4500
  • Linux如何查询硬件信息?

    在Linux系统中,查询硬件信息是系统维护、故障排查和性能优化的基础操作,通过命令行工具可以快速获取CPU、内存、硬盘、显卡等硬件的详细信息,以下介绍常用方法和命令,CPU信息查询CPU是系统的核心组件,可通过以下命令查看详细信息:lscpu:以易读格式显示CPU架构、核心数、线程数、主频等,例如输出包含“Ar……

    2025年9月21日
    1900

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信