zoukankan      html  css  js  c++  java
  • Chap-3 Section 3.4 段表

    ELF文件中又各式各样的段,段表(Section Header Table)就是保存这些段的基本属性
    的结构。段表是ELF文件中除了文件头之外最重要的结构,它描述了ELF的各个段的信息,
    比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。

    可以用readelf -S *.o来查看可执行文件中的各个段,
    段表的结构比较简单,它是以“Elf32_Shdr”结构体为元素的数组,数组元素的个数等于
    段的个数,每个“Elf32_Shdr”结构体对应一个段,该结构体又称为段描述符(Section Descriptor).
    ELF段表的这个数组第一个元素是无效的段描述符,它的类型为NULL.

    ELF_Shdr的结构如下所示:
    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;

    段的名字(sh_name)
    段名是一个字符串,它位于一个叫做“.shstrtab”的字符串表。sh_name是段名
    字符串在“.shstrtab”中的偏移。
    段的名字对于编译器、链接器来说是有意义的,但是对于操作系统来说并没有
    实质意义,对于操作系统,一个段该如何处理取决于它的属性和权限,即由段的类型
    和标志位这两个成员来决定。

    段的类型(sh_type)
    段的类型相关常量以SHT_开头,例如:
    SHT_NULL 0 无效段
    SHT_PROGBITS 1 程序段。代码段和数据段都是这种类型。
    SHT_SYMTAB 2 该段的内容为符号表
    SHT_STRTAB 3 该段的内容为字符串表
    SHT_RELA 4 重定位表
    SHT_NOBITS 8 该段在文件中没有内容
    SHT_REL 9 该段包含了重定位信息
    SHT_DYNAMIC 6 动态链接信息

    段的标志位(sh_flags)
    段的标志位表示该段在进程虚拟地址空间中的属性,比如是否可写、可执行等。
    相关常量以SHF_开头。
    SHF_WRITE 1 该段在进程空间中可写
    SHF_ALLOC 2 该段在进程空间中需要分配空间。有些包含指示或者控制信息
    的段不需要在进程空间中被分配空间,他们一般不会有这个标志。
    而代码段、数据段和.bss段都会有这个标志位。
    SHF_EXECINSTR 4 该段在进程空间中可以被执行,一般指代码段。

  • 相关阅读:
    能量项链
    开学前最后一天信奥赛一本通重刷日记
    重刷信奥赛一本通日记-3
    重刷信奥赛一本通日记-2
    重刷信奥赛一本通日记-1
    第二次考试题解way
    第一次考试题解
    第一次考试感言
    「HNOI2012」矿场搭建
    「HAOI2006」受欢迎的牛
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3502866.html
Copyright © 2011-2022 走看看