3——man elf的翻译——Section header (Shdr)

13 篇文章 1 订阅
8 篇文章 0 订阅

Section header(Shdr)
    通过section header table能够定位文件所有的section。section headertable 的格式是Elf32_Shdr或者Elf64_Shdr。
    ELF header 的e_shooff字段是section header table从文件开始位置的偏移量。e_shnum是section header tables的数量。
    e_shentsize保存的是一个的大小。
    
    一个section header table的索引号是数组的下标。有些索引号是保留的:initial entry和索引号在SHN_LORESERVE和
    SHN_HIRESERVER之间的。initial entry是给ELF扩展e_phnum,e_shnum和e_strndx使用的;其他情况,initial entry是全为
    0的。一个object file没有下面这些索引号的section:
    
    SHN_UNDEF
            此值标记未定义、丢失、不相关或无意义的节引用。
            
    SHN_LORESERVE
            此值指定保留索引范围的下限。
            
    SHN_LOPROC,SHN_HIPROC
            包含范围[shn_loproc,shn_hiproc]中较大的值是为特定于处理器的语义保留的。
            
    SHN_ABS
            此值指定对应引用的绝对值。例如,一个定义为SHN_ABS的节有绝对地址,不受重新定位的影响。
        
    SHN_COMMON
            定义为此的节就是普通的symbols,例如FORTRAN COMMON或者未分配的C外部变量。
            
    SHN_HIRESERVER
            此值指定保留索引范围的上限。系统保留的索引号区间就在SHN_LORESERVE和SHN_HIRESERVER之间。section                    header table不包含在保留索引号区间内的entry。
            
    section header table的结构体如下:
    
        typedef struct {
           uint32_t   sh_name;
           uint32_t   sh_type;
           uint32_t   sh_flags;
           Elf32_Addr sh_addr;
           Elf32_Off  sh_offset;
           uint32_t   sh_size;
           uint32_t   sh_link;
           uint32_t   sh_info;
           uint32_t   sh_addralign;
           uint32_t   sh_entsize;
       } Elf32_Shdr;

       typedef struct {
           uint32_t   sh_name;
           uint32_t   sh_type;
           uint64_t   sh_flags;
           Elf64_Addr sh_addr;
           Elf64_Off  sh_offset;
           uint64_t   sh_size;
           uint32_t   sh_link;
           uint32_t   sh_info;
           uint64_t   sh_addralign;
           uint64_t   sh_entsize;
       } Elf64_Shdr;
    
    32位和64位之间没有本质区别。

    sh_name    对该节的内容和语义进行分类。
            
            SHT_NULL              表示section header是不活跃的。没有和一个section相关联。section header的其他成员无意义。       
            SHT_PROGBITS    保存的是程序的一些信息,并且只由程序决定它的格式和意义。
            
            SHT_SYMTAB        保存的是一个symbols table,也就是符号表。最典型的是提供链接使用的symbols,当然动态
                                            链接有时候也用。作为一个完整的符号表,要包含很多为动态链接使用的没有必要的符号表们。
                                            一个object file也可以包含SHN_DYNSYM section。
                            
            SHN_STRTAB        保存的是一个字符串表。一个object file没准包含很多的string table sections。
            
            SHT_RELA             保存的是relocation  entries with explicit addends(显示加法的重定向入口?)就像给32位
                                           系统使用的Elf32_Rela.一个object也许包含多个此节。
                            
            SHNT_HASH         保存的是符号hash table。参与动态链接的object肯定包含一个symbol hash table。一个object
                                           file没准只包含一个hash table。
                            
            SHT_DYNAMIC     保存的是给动态链接使用的信息。一个object file没准只包含一个dynamic section。
            
            SHT_NOTE            This section holds notes (ElfN_Nhdr).
            
            SHT_NOBITS         这种类型的部分在文件中不占用空间,但在其他方面类似于SHT_PROGBITS。尽管此节不占用空                                                  间,sh_offset保存的是conceptual(概念的) file的偏移量。
                            
            SHT_REL                和SHT_RELA类似,不过是without。就像给32位系统使用的Elf32_Rel。一个object file也许包含
                                            多个此节。
                            
            SHT_SHLIB            保留的但是由未指定的语义。
            
            SHT_DYNSYM       这个section保存的是动态链接符号的最小设置。一个object也可以包含一个SHT_SYMTAB节。
            
            SHT_LOPROC,SHT_HIPROC
                                           [SHT_LOPROC, SHT_HIPROC]区间是为特定于处理器的语义保留的。
                            
            SHT_LOUSER        为应用程序保留的索引号最小值。
            
            SHT_HIUSER        为应用程序保留的索引号最大值。[SHT_LOUSER,SHT_HIUSER]区间是为应用程序使用的。不会和                                             现在的或者以后的系统定义的section type冲突。
                            
    sh_flags
            按位表示多种多样的参数。如果一个标志位被set,那么这个参数就是on的状态。否则这个参数就是off或者not apply
            未定义的参数置零。
            
            SHF_WRITE             此节包含在程序执行期间可写的数据。
            
            SHF_ALLOC             此节在程序执行期间占用内存。一些control sections在object file在内存中的镜像中不存在。这些
                                              节中this attribute is off.
                            
            SHF_EXECINSTR    包含可执行的机器指令。
            
            SHF_MASKPROC    这个掩码中包含的所有位都保留给特定于处理器的语义。
            
    sh_addr    如果这个节在程序在内存的镜像中出现了,那么它保存的是section‘s的第一个字节的地址。否则就是0.
    
    sh_offset
                    保存的是segment从文件开始的偏移量。SHT_NOBITS类型在文件中不占用空间,它的sh_offset定位在文件中
                    的概念位置。
            
    sh_size    section的大小,除了SHT_NOBITS类型。SHT_NOBITS类型的此字段不为零,但是在文件中不占用空间。
    
    sh_link    保存的是section header table index link,具体意思要看section type。
    
    sh_info    保存的是额外信息,具体意思要看section type。
    
    sh_addralign
                    有些section有字节对齐约束。如果是doubleword,那系统必须确保doubleword alignment for the entire
                    section。也就是说sh_addr必须全为零。如果是modulo the value,那么只有0和2的正整数次方是有效的。
                    如果这个值为0或者1,那么这个section就没有字节对齐的要求。
            
    sh_entsize
                    有些section保存的是固定大小的条目,例如symbol table。这类section,sh_entsize给出的是每个条目的
                    大小。如果section没有保存a table of fixed-size entries,那么sh_entsize为0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ELF(Executable and Linkable Format)是一种用于可执行文件、共享库和目标文件的标准文件格式。下面我会用通俗易懂的例子来解释 ELF 头部(ELF Header)、程序头表(Program Header Table)和节头表(Section Header Table)。 想象一下你正在组织一场音乐会。ELF 头部就像是这场音乐会的入口处。它包含了一些重要的信息,比如文件类型、机器架构、入口点地址等。它告诉操作系统如何解释和执行这个文件。 程序头表就像是你制定的演出计划表。它列出了音乐会的各个部分,比如开场曲、主题曲、独奏等。对于可执行文件来说,程序头表描述了程序在内存中的布局,包括各个段(Segment)的起始地址、大小和访问权限等。对于共享库和目标文件来说,程序头表可能是空的或者不需要。 节头表就像是你准备的歌曲列表。它详细描述了每首歌曲的信息,比如歌曲名称、时长、风格等。对于可执行文件来说,节头表记录了各个节(Section)的起始地址、大小和属性等。节通常用于存储代码、数据和其他资源。对于共享库和目标文件来说,节头表也扮演着类似的角色。 总结一下,ELF 头部是文件的入口信息,程序头表描述了程序在内存中的布局,节头表详细描述了文件的各个部分。它们共同组成了 ELF 文件的结构,使操作系统能够正确加载和执行这些文件。希望这个例子能帮助你更好地理解 ELF 文件结构!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值