• 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表示符号的虚拟地址。

  • 相关阅读:
    毕业设计:文献参考(六)
    毕业设计:文献参考(五)
    稀疏数组搜索(leetcode)
    寻找重复数(leetcode)
    联通网络的操作次数(leetcode)
    Flutter 混合开发基础
    浅谈 Serverless 开发和应用
    基于 Qt Quick Plugin 快速构建桌面端跨平台组件
    Android 设备音视频兼容性适配
    RTC 系统音频弱网对抗技术发展与实践
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3502869.html
Copyright © 2020-2023  润新知