可执行与可链接格式(ELF)

存在两种视图:

格式

  • ELF 头: readelf -l main 查看
    • 生成该文件的系统的字大小、字节序:16 字节
    • 文件类型 (. o,exec,. so)
    • 机器类型
    • 节头表的位置
    • 节头部表中条目大小、数量等
      • 不同的位置和大小是由节头部表描述的
        • 每个节都有一个固定大小的条目(entry)
  • 段头表/程序头表
    • 页面大小
    • 虚拟地址内存段 (节)
    • 段大小
  • .text 节(代码)
    • 代码
  • .rodata 节(只读数据)
    • 只读数据 : printf 的格式串、跳转表, …
  • .data 节 (数据/可读写)
    • 已初始化全局和静态变量
  • .bss 节 (未初始化全局变量)
    • 未初始化/初始化为 0 的全局和静态变量
    • “Block Started by Symbol” 符号开始的块
    • “Better Save Space”更加节省空间
    • 仅有节头,但节本身不占用磁盘空间
  • .symtab 节(符号表)
    • 符号表
    • 函数和静态变量名
    • 节名称和位置
  • .rel.text 节(可重定位代码)
    • .text 节的可重定位信息
    • 在可执行文件中需要修改的指令地址
    • 需修改的指令.
  • .rel.data 节(可重定位数据)
    • .data 节的可重定位信息
    • 在合并后的可执行文件中需要修改的指针数据的地址
  • .debug 节(调试)
    • 为符号调试的信息 (gcc -g)
  • 节头表Section header table
  • 每个节的偏移量和大小

ELF头

命令行查看

开头 16 个字节的含义:Magic

header 的长度一共是 64 字节