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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值