目录

一、ELF 文件结构概述

二、查看 ELF 文件头信息

1、命令选项

2、示例输出

3、内核数据结构

三、ELF 程序头表

1、命令选项

2、示例输出

3、关键说明

4、内核数据结构

四、ELF 节头表详解

查看节头表信息

1、命令选项

2、示例输出

3、标志说明

4、重要节说明

5、内核数据结构

五、查看节内容

1、反汇编节内容

2、查看目标文件节内容

关键说明


一、ELF 文件结构概述

        ELF (Executable and Linkable Format) 是 Unix/Linux 系统中可执行文件、目标文件和共享库的标准文件格式。


二、查看 ELF 文件头信息

1、命令选项

-h 或 --file-header:显示 ELF 文件的文件头信息。文件头包含了 ELF 文件的基本信息,包括:

  • 文件类型

  • 机器类型

  • 版本信息

  • 入口点地址

  • 程序头表和节头表的位置和大小等

2、示例输出

$ readelf -h mainELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              EXEC (Executable file)Machine:                           Advanced Micro Devices X86-64Version:                           0x1Entry point address:               0x400640Start of program headers:          64 (bytes into file)Start of section headers:          7048 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           56 (bytes)Number of program headers:         9Size of section headers:           64 (bytes)Number of section headers:         31Section header string table index: 30

3、内核数据结构

Linux 内核中 ELF 头部的相关定义(位于 /linux/include/elf.h):

/* 32位 ELF 头 */
typedef struct elf32_hdr {unsigned char e_ident[EI_NIDENT];Elf32_Half e_type;Elf32_Half e_machine;Elf32_Word e_version;Elf32_Addr e_entry;   /* 入口点 */Elf32_Off e_phoff;    /* 程序头表偏移 */Elf32_Off e_shoff;    /* 节头表偏移 */Elf32_Word e_flags;Elf32_Half e_ehsize;Elf32_Half e_phentsize;Elf32_Half e_phnum;Elf32_Half e_shentsize;Elf32_Half e_shnum;Elf32_Half e_shstrndx;
} Elf32_Ehdr;/* 64位 ELF 头 */
typedef struct elf64_hdr {unsigned char e_ident[EI_NIDENT]; /* ELF 魔数 */Elf64_Half e_type;Elf64_Half e_machine;Elf64_Word e_version;Elf64_Addr e_entry;   /* 入口点虚拟地址 */Elf64_Off e_phoff;    /* 程序头表文件偏移 */Elf64_Off e_shoff;    /* 节头表文件偏移 */Elf64_Word e_flags;Elf64_Half e_ehsize;Elf64_Half e_phentsize;Elf64_Half e_phnum;Elf64_Half e_shentsize;Elf64_Half e_shnum;Elf64_Half e_shstrndx;
} Elf64_Ehdr;

三、ELF 程序头表

1、命令选项

    -l 或 --program-headers:显示 ELF 文件的程序头部(段头)信息。这些信息对于理解可执行文件在内存中的布局和加载过程非常重要。

2、示例输出

$ readelf -l mainElf file type is EXEC (Executable file)
Entry point 0x400640
There are 9 program headers, starting at offset 64Program Headers:Type           Offset             VirtAddr           PhysAddrFileSiz            MemSiz              Flags  AlignPHDR           0x0000000000000040 0x0000000000400040 0x00000000004000400x00000000000001f8 0x00000000000001f8  R E    8INTERP         0x0000000000000238 0x0000000000400238 0x00000000004002380x000000000000001c 0x000000000000001c  R      1[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]LOAD           0x0000000000000000 0x0000000000400000 0x00000000004000000x0000000000000d24 0x0000000000000d24  R E    200000LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e100x0000000000000254 0x0000000000000258  RW     200000DYNAMIC        0x0000000000000e28 0x0000000000600e28 0x0000000000600e280x00000000000001d0 0x00000000000001d0  RW     8NOTE           0x0000000000000254 0x0000000000400254 0x00000000004002540x0000000000000044 0x0000000000000044  R      4GNU_EH_FRAME   0x0000000000000b34 0x0000000000400b34 0x0000000000400b340x000000000000005c 0x000000000000005c  R      4GNU_STACK      0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000  RW     10GNU_RELRO      0x0000000000000e10 0x0000000000600e10 0x0000000000600e100x00000000000001f0 0x00000000000001f0  R      1Section to Segment mapping:Segment Sections...00     01     .interp 02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 04     .dynamic 05     .note.ABI-tag .note.gnu.build-id 06     .eh_frame_hdr 07     08     .init_array .fini_array .jcr .dynamic .got

3、关键说明

  1. PhysAddr:在现代操作系统中,物理地址字段通常可以忽略

  2. LOAD:并非所有的节(section)都需要加载到内存,只有标记为 LOAD 的段(segment)才会被加载

4、内核数据结构

/* 32位程序头 */
typedef struct elf32_phdr {Elf32_Word p_type;Elf32_Off p_offset;Elf32_Addr p_vaddr;Elf32_Addr p_paddr;Elf32_Word p_filesz;Elf32_Word p_memsz;Elf32_Word p_flags;Elf32_Word p_align;
} Elf32_Phdr;/* 64位程序头 */
typedef struct elf64_phdr {Elf64_Word p_type;Elf64_Word p_flags;Elf64_Off p_offset;   /* 段在文件中的偏移 */Elf64_Addr p_vaddr;   /* 段虚拟地址 */Elf64_Addr p_paddr;   /* 段物理地址 */Elf64_Xword p_filesz; /* 段在文件中的大小 */Elf64_Xword p_memsz;  /* 段在内存中的大小 */Elf64_Xword p_align;  /* 段对齐方式 */
} Elf64_Phdr;

四、ELF 节头表详解

查看节头表信息

1、命令选项

    -S 或 --section-headers:显示 ELF 文件的节头信息,包括各节的起始地址、大小、标志等重要属性。

2、示例输出

$ readelf -S mainThere are 31 section headers, starting at offset 0x1b88:Section Headers:[Nr] Name              Type            Address          OffsetSize              EntSize          Flags  Link  Info  Align[ 0]                   NULL            0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .interp           PROGBITS        0000000000400238  00000238000000000000001c  0000000000000000   A       0     0     1[ 2] .note.ABI-tag     NOTE            0000000000400254  000002540000000000000020  0000000000000000   A       0     0     4[ 3] .note.gnu.build-i NOTE            0000000000400274  000002740000000000000024  0000000000000000   A       0     0     4[ 4] .gnu.hash         GNU_HASH        0000000000400298  00000298000000000000001c  0000000000000000   A       5     0     8[ 5] .dynsym           DYNSYM          00000000004002b8  000002b80000000000000108  0000000000000018   A       6     1     8[ 6] .dynstr           STRTAB          00000000004003c0  000003c00000000000000076  0000000000000000   A       0     0     1[ 7] .gnu.version      VERSYM          0000000000400436  000004360000000000000016  0000000000000002   A       5     0     2[ 8] .gnu.version_r    VERNEED         0000000000400450  000004500000000000000030  0000000000000000   A       6     1     8[ 9] .rela.dyn         RELA            0000000000400480  000004800000000000000018  0000000000000018   A       5     0     8[10] .rela.plt         RELA            0000000000400498  0000049800000000000000d8  0000000000000018  AI       5    24     8[11] .init             PROGBITS        0000000000400570  00000570000000000000001a  0000000000000000  AX       0     0     4[12] .plt              PROGBITS        0000000000400590  0000059000000000000000a0  0000000000000010  AX       0     0     16[13] .plt.got          PROGBITS        0000000000400630  000006300000000000000008  0000000000000000  AX       0     0     8[14] .text             PROGBITS        0000000000400640  0000064000000000000004b2  0000000000000000  AX       0     0     16[15] .fini             PROGBITS        0000000000400af4  00000af40000000000000009  0000000000000000  AX       0     0     4[16] .rodata           PROGBITS        0000000000400b00  00000b000000000000000032  0000000000000000   A       0     0     8[17] .eh_frame_hdr     PROGBITS        0000000000400b34  00000b34000000000000005c  0000000000000000   A       0     0     4[18] .eh_frame         PROGBITS        0000000000400b90  00000b900000000000000194  0000000000000000   A       0     0     8[19] .init_array       INIT_ARRAY      0000000000600e10  00000e100000000000000008  0000000000000008  WA       0     0     8[20] .fini_array       FINI_ARRAY      0000000000600e18  00000e180000000000000008  0000000000000008  WA       0     0     8[21] .jcr              PROGBITS        0000000000600e20  00000e200000000000000008  0000000000000000  WA       0     0     8[22] .dynamic          DYNAMIC         0000000000600e28  00000e2800000000000001d0  0000000000000010  WA       6     0     8[23] .got              PROGBITS        0000000000600ff8  00000ff80000000000000008  0000000000000008  WA       0     0     8[24] .got.plt          PROGBITS        0000000000601000  000010000000000000000060  0000000000000008  WA       0     0     8[25] .data             PROGBITS        0000000000601060  000010600000000000000004  0000000000000000  WA       0     0     1[26] .bss              NOBITS          0000000000601064  000010640000000000000004  0000000000000000  WA       0     0     1[27] .comment          PROGBITS        0000000000000000  00001064000000000000002d  0000000000000001  MS       0     0     1[28] .symtab           SYMTAB          0000000000000000  000010980000000000000750  0000000000000018          29    49     8[29] .strtab           STRTAB          0000000000000000  000017e80000000000000291  0000000000000000           0     0     1[30] .shstrtab         STRTAB          0000000000000000  00001a79000000000000010c  0000000000000000           0     0     1

3、标志说明

  • W (write)    - 可写
  • A (alloc)    - 运行时分配内存
  • X (execute)  - 可执行
  • M (merge)    - 可合并
  • S (strings)  - 包含字符串
  • I (info)     - 额外信息
  • L (link order) - 保留链接顺序
  • O (extra OS processing required) - 需要特殊处理
  • G (group)    - 组成员
  • T (TLS)      - 线程局部存储
  • C (compressed) - 压缩数据
  • x (unknown)  - 未知
  • o (OS specific) - 操作系统特定
  • E (exclude)  - 排除
  • l (large)    - 大型节
  • p (processor specific) - 处理器特定

4、重要节说明

  • .got:全局偏移表(Global Offset Table),用于动态链接

  • .plt:过程链接表(Procedure Linkage Table),支持延迟绑定

  • .text:包含程序的可执行指令

  • .data:包含初始化的全局变量

  • .bss:包含未初始化的全局变量

5、内核数据结构

/* 32位节头 */
typedef struct {Elf32_Word sh_name;      /* 节名称索引 */Elf32_Word sh_type;      /* 节类型 */Elf32_Word sh_flags;     /* 节标志 */Elf32_Addr sh_addr;      /* 节虚拟地址 */Elf32_Off  sh_offset;    /* 节文件偏移 */Elf32_Word sh_size;      /* 节大小 */Elf32_Word sh_link;      /* 相关节索引 */Elf32_Word sh_info;      /* 附加信息 */Elf32_Word sh_addralign; /* 节对齐要求 */Elf32_Word sh_entsize;   /* 表项大小(如有) */
} Elf32_Shdr;/* 64位节头 */
typedef struct elf64_shdr {Elf64_Word  sh_name;      /* 节名称索引 */Elf64_Word  sh_type;      /* 节类型 */Elf64_Xword sh_flags;     /* 节标志 */Elf64_Addr  sh_addr;      /* 节虚拟地址 */Elf64_Off   sh_offset;    /* 节文件偏移 */Elf64_Xword sh_size;      /* 节大小 */Elf64_Word  sh_link;      /* 相关节索引 */Elf64_Word  sh_info;      /* 附加信息 */Elf64_Xword sh_addralign; /* 节对齐要求 */Elf64_Xword sh_entsize;   /* 表项大小(如有) */
} Elf64_Shdr;

五、查看节内容

1、反汇编节内容

$ objdump -S mainmain:     file format elf64-x86-64Disassembly of section .init:0000000000400570 <_init>:400570:       48 83 ec 08             sub    $0x8,%rsp400574:       48 8b 05 7d 0a 20 00    mov    0x200a7d(%rip),%rax        # 600ff8 <__gmon_start__>40057b:       48 85 c0                test   %rax,%rax40057e:       74 05                   je     400585 <_init+0x15>400580:       e8 ab 00 00 00          callq  400630 <.plt.got>400585:       48 83 c4 08             add    $0x8,%rsp400589:       c3                      retqDisassembly of section .plt:0000000000400590 <.plt>:400590:       ff 35 72 0a 20 00       pushq  0x200a72(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>400596:       ff 25 74 0a 20 00       jmpq   *0x200a74(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>40059c:       0f 1f 40 00             nopl   0x0(%rax)00000000004005a0 <write@plt>:4005a0:       ff 25 72 0a 20 00       jmpq   *0x200a72(%rip)        # 601018 <write@GLIBC_2.2.5>4005a6:       68 00 00 00 00          pushq  $0x04005ab:       e9 e0 ff ff ff          jmpq   400590 <.plt>00000000004005b0 <printf@plt>:4005b0:       ff 25 6a 0a 20 00       jmpq   *0x200a6a(%rip)        # 601020 <printf@GLIBC_2.2.5>4005b6:       68 01 00 00 00          pushq  $0x14005bb:       e9 d0 ff ff ff          jmpq   400590 <.plt>00000000004005c0 <close@plt>:4005c0:       ff 25 62 0a 20 00       jmpq   *0x200a62(%rip)        # 601028 <close@GLIBC_2.2.5>4005c6:       68 02 00 00 00          pushq  $0x24005cb:       e9 c0 ff ff ff          jmpq   400590 <.plt>00000000004005d0 <__libc_start_main@plt>:4005d0:       ff 25 5a 0a 20 00       jmpq   *0x200a5a(%rip)        # 601030 <__libc_start_main@GLIBC_2.2.5>4005d6:       68 03 00 00 00          pushq  $0x34005db:       e9 b0 ff ff ff          jmpq   400590 <.plt>

2、查看目标文件节内容

$ objdump -d hello.ohello.o:     file format elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0:   55                      push   %rbp1:   48 89 e5                mov    %rsp,%rbp4:   bf 00 00 00 00          mov    $0x0,%edi9:   e8 00 00 00 00          callq  e <main+0xe>e:   b8 00 00 00 00          mov    $0x0,%eax13:   e8 00 00 00 00          callq  18 <main+0x18>18:   b8 00 00 00 00          mov    $0x0,%eax1d:   5d                      pop    %rbp1e:   c3                      retq

关键说明

  1. .init:程序初始化代码

  2. .plt:动态链接跳转表

  3. .text:主程序代码

  4. 目标文件中的地址在链接前为0,链接后会填充实际地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89906.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89906.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89906.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出Python函数:参数传递、作用域与案例详解

&#x1f64b;‍♀️ 博主介绍&#xff1a;颜颜yan_ ⭐ 本期精彩&#xff1a;深入浅出Python函数&#xff1a;参数传递、作用域与案例详解 &#x1f3c6; 热门专栏&#xff1a;零基础玩转Python爬虫&#xff1a;手把手教你成为数据猎人 &#x1f680; 专栏亮点&#xff1a;零基…

ps aux 和 ps -ef

在 Linux/Unix 系统中&#xff0c;ps aux 和 ps -ef 都是用于查看进程信息的命令&#xff0c;结合 grep node 可以筛选出与 Node.js 相关的进程。它们的核心功能相似&#xff0c;但在输出格式和选项含义上有区别&#xff1a;1. 命令对比命令含义主要区别ps auxBSD 风格语法列更…

Spark ML 之 LSH

src/test/scala/org/apache/spark/ml/feature/BucketedRandomProjectionLSHSuite.scala test("approxSimilarityJoin for self join") {val data = {for (i <- 0 until 24) yield Vectors

关键成功因素法(CSF)深度解析:从战略目标到数据字典

关键成功因素法由John Rockart提出&#xff0c;用于信息系统规划&#xff0c;帮助企业识别影响系统成功的关键因素&#xff0c;从而确定信息需求&#xff0c;指导信息技术管理。该方法通过识别关键成功因素&#xff0c;找出关键信息集合&#xff0c;确定系统开发优先级&#xf…

Django母婴商城项目实践(六)- Models模型之ORM操作

6、Models模型操作 1 ORM概述 介绍 Django对数据进行增删改操作是借助内置的ORM框架(Object Relational Mapping,对象关系映射)所提供的API方法实现的,允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库。 简单来说,ORM框架的数据操作API是在 QuerySet…

【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含两个岛屿及连接它们的七座桥&#xff0c;如下图所示。 可否走过这样的七座桥&#xff0c;而且每桥只走过一次&#xff1f;瑞士数学家欧拉(Leo…

Redis 详解:从入门到进阶

文章目录前言一、什么是 Redis&#xff1f;二、Redis 使用场景1. 缓存热点数据2. 消息队列3. 分布式锁4. 限流与防刷5. 计数器、排行榜三、缓存三大问题&#xff1a;雪崩 / 穿透 / 击穿1. ❄️ 缓存雪崩&#xff08;Cache Avalanche&#xff09;2. &#x1f50d; 缓存穿透&…

QCustomPlot 使用教程

下载网址&#xff1a;官方网站&#xff1a;http://www.qcustomplot.com/我的环境是 window10 qt5.9.9 下载后&#xff0c;官网提供了很多例子。可以作为参考直接运行自己如何使用&#xff1a;第一步&#xff1a;使用QCustomPlot非常简单&#xff0c;只需要把qcustomplot.cpp和…

基于springboot+mysql的作业管理系统(源码+论文)

一、开发环境 1 Spring Boot框架简介 描述&#xff1a; 简化开发&#xff1a;Spring Boot旨在简化新Spring应用的初始搭建和开发过程。配置方式&#xff1a;采用特定的配置方式&#xff0c;减少样板化配置&#xff0c;使开发人员无需定义繁琐的配置。开发工具&#xff1a;可…

LVS 集群技术基础

LVS(linux virual server)LVS集群技术---NAT模式一.准备四台虚拟机1.client(eth0ip:172.254.100)2.lvs(eth0ip:172.254.200;eth1ip:192.168.0.200)3.rs1(eht0ip:192.168.0.10)4.rs2(eth0ip:192.168.0.20)二&#xff1a;在rs1和rs2安装httpd功能dnf/yum install htppd -y三&…

Oracle RU19.28补丁发布,一键升级稳

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;15年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝15万 擅长主流Oracle、MySQL、PG、高斯及…

lvs 集群技术

LVS概念LVS&#xff1a;Linux Virtual Server&#xff0c;负载调度器&#xff0c;是一种基于Linux操作系统内核的高性能、高可用网络服务负载均衡解决方案。LVS工作原理基于网络层&#xff08;四层&#xff0c;传输层&#xff09;的负载均衡技术&#xff0c;它通过内核级别的IP…

AR巡检和传统巡检的区别

随着工业4.0时代的到来&#xff0c;数字化转型逐渐成为各行各业提升效率、保障安全和降低成本的关键。而在这一转型过程中&#xff0c;巡检工作作为确保设备稳定运行的重要环节&#xff0c;逐步从传统方式走向智能化、数字化。尤其是增强现实&#xff08;AR&#xff09;技术的引…

Axure设计设备外壳 - AxureMost 落葵网

在UI设计中&#xff0c;设备外壳&#xff08;硬件外壳与界面中的“虚拟外壳”&#xff09;和背景是构成视觉体验的核心元素&#xff0c;它们不仅影响美观&#xff0c;更直接关联用户对功能的理解和操作效率。以下从设计角度详细解析其作用与使用逻辑&#xff1a; 一、设备外壳&…

基于深度学习的电信号分类识别与混淆矩阵分析

基于深度学习的电信号分类识别与混淆矩阵分析 1. 引言 1.1 研究背景与意义 电信号分类识别是信号处理领域的重要研究方向,在医疗诊断、工业检测、通信系统等多个领域有着广泛的应用。传统的电信号分类方法主要依赖于手工提取特征和浅层机器学习模型,但这些方法往往难以捕捉…

Git 和Gitee远程连接 上传和克隆

第一步创建远程库第二步初始化本地库创建链接删掉.idea 和target(这两个没用运行就自动生成了)右键空白处选择Git Bash Here 初始化本地库git init建立远程连接建立连接这里是我的地址&#xff0c;后面拼接你的地址git remote add origin https://gitee.com/liu-qing_liang/git…

零基础100天CNN实战计划:用Python从入门到图像识别高手

一、为什么你需要这份100天CNN学习计划&#xff1f; 在人工智能领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09; 是计算机视觉的基石技术。无论是人脸识别、医学影像分析还是自动驾驶&#xff0c;CNN都扮演着核心角色。但对于初学者来说&#xff0c;面对复杂的数学公…

Python Matplotlib中的fontdict参数说明

文章目录 1 fontdict 参数的常用属性 1.1 使用示例 1.2 其他注意事项 1.3 结合其他参数 各位老板好, 在 Python 的 Matplotlib 库中,fontdict 参数用于定义文本属性的字典。这些属性包括字体大小、颜色、样式等,主要用于控制标题、标签和其他文本元素的显示效果。通过将 font…

25数据库三级备考自整理笔记

备考策略&#xff1a;博主是边做题边学习知识点的&#xff0c;从每个章节->每套真题的流程&#xff0c;知识点清晰详细&#xff0c;喜欢的请点个关注和收藏&#xff0c;祝大家考试顺利&#xff0c;必过必过必过&#xff01;一、数据库应用系统开发方法1.数据库的三级模式&am…

文娱投资的逆势突破:博派资本的文化旅游综合体战略

在多数资本因“变现难、政策风险、退出缓慢”等问题纷纷撤离文娱赛道时&#xff0c;博派资本创始人郑兰却选择逆势而上&#xff0c;聚焦线下文化消费&#xff0c;并推出了全新的文化旅游综合体战略。郑兰深刻认为&#xff0c;2025年将成为区域经济和文化产业复苏的关键节点。她…