zoukankan      html  css  js  c++  java
  • Chap-3 Section 3.5 ELF符号表结构

    ELF文件中的符号表往往是文件中的一个段,段名叫".strtab"。符号表的结构是由Elf32_Sym
    结构体构成的数组,每个Elf32_Sym结构对应一个符号。数组的第一个元素,也就是下标
    为0的元素为无效的“未定义”符号。
    typedef struct {
    Elf32_Word st_name; //该符号名在字符串表中的下标。
    Elf32_Addr st_value; //符号相对应的值。
    Elf32_Word st_size; //符号大小。对于包含数据的符号,这个值是该数据类型的大小
    unsigned char st_info; //符号类型和绑定信息。
    unsigned char st_other; //该成员目前为0,没用。
    Elf32_Half st_shndx; //符号所在的段。
    }Elf32_Sym;

    符号类型和绑定信息(st_info)
    该成员低4位表示符号的类型(Symbol Type),高28位表示符号绑定信息(Symbol Binding)。
    符号绑定信息
    STB_LOCAL 0 局部符号,对于目标文件的外部不可见
    STB_GLOBAL 1 全局符号,外部可见
    STB_WEAK 2 弱符号
    符号类型信息
    STT_NOTYPE 0 未知类型符号
    STT_OBJECT 1 该符号是个数据对象,比如变量、数组等
    STT_FUNC 2 该符号是个函数或者其他可执行代码
    STT_SECTION 3 该符号表示一个段,这种符号必须是STB_LOCAL的
    STT_FILE 4 该符号表示文件名,一般都是该目标文件所对应的源文件名,
    它一定是STB_LOCAL类型的。

    符号所在的段(st_shndx)
    如果符号定义在本目标文件中,那么这个成员表示符号所在段在段表中的下标。如果符号
    不是定义在本目标文件中,或者对于有些特殊符号,又如下所示的一些值:
    符号所在段特殊常量
    SHN_ABS 0xfff1 该符号包含了一个绝对值,比如表示文件名的符号。
    SHN_COMMON 0xfff2 表示该符号是一个"COMMON块"的符号
    SHN_UNDEF 0 该符号在本目标文件中被引用到,但是定义在其他目标文件中。

    符号值(st_value)
    如果这个符号是函数或者变量的定义,那么符号的值就是这个函数或者变量的地址,分为
    一下几种情况:
    1.在目标文件中,如果是符号的定义并且该符号不是"COMMON块"类型的,则st_value表示
    该符号在段中的偏移,即符号所对应的函数或者变量位于由sh_shndx指定的段,偏移st_value
    的位置,这也是目标文件中定义全局变量最长见的情况。
    2.在目标文件中,如果符号是"COMMON块"类型的,则st_value表示该符号的对其属性。
    3.在可执行文件中,st_value表示符号的虚拟地址。

  • 相关阅读:
    Java 简单算法--打印乘法口诀(只使用一次循环)
    Java简单算法--求100以内素数
    ubuntu 16.04 chrome flash player 过期
    java 网络API访问 web 站点
    java scoket (UDP通信模型)简易聊天室
    leetcode1105 Filling Bookcase Shelves
    leetcode1140 Stone Game II
    leetcode1186 Maximum Subarray Sum with One Deletion
    leetcode31 Next Permutation
    leetcode834 Sum of Distances in Tree
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3502869.html
Copyright © 2011-2022 走看看