• 链接与ELF文件格式的复习


    在这里复习一下链接的知识:

    什么是链接(linking):把源代码形成的模块独立编译后组装成一个整体的的过程叫做链接。

    链接主要过程包括:地址和空间分配(address and storage allocation),符号决议 - 决定使用同名符号中的哪一个(symbol resolution),重定位 -为开始不能决定地址的符号重定位到正确地址(relocation)

    ELF基本文件结构:

      

    .text段 - 存放程序代码(与程序数据分开,好处1、提高缓存命中;2、保证代码只读防止被以外修改;3、多个程序使用一段代码 - 动态链接库)

    .data段 - 存放已初始化的全局数据(因为默认值为0,因此初始化为0的数据被认为是未初始化的)

    .bss段  - 存放未初始化的全局数据和局部数据(在ELF文件中不占位置,只提供一个长度为符号表保存的符号占位,这样可以节省磁盘空间)

    ELF Header结构:

    typedef struct {

    unsigned char e_ident[16];      ELF魔数,用于操作系统识别文件

    ELF32_Half e_type;          ELF文件类型,有可重定位文件,可执行文件,共享文件

    ELF32_Half e_machine;        ELF文件的CPU平台属性

    ELF32_Word e_version;        ELF版本号,一般为常数1

    ELF32_Addr e_entry;         入口地址,规定ELF程序的入口虚拟地址,可重定位文件一般没有入口地址,该值为0

    ELF32_Off e_phoff;          --

    ELF32_Off e_shoff;          段表在文件中的偏移               -- 用于程序装载(知道每个段的信息才能装

    载程序)

    ELF32_Word e_flags;         ELF标志位,用于标识一些ELF文件平台相关属性

    ELF32_Half e_ehsize;          文件头大小

    ELF32_Half e_phentsize;       --

    ELF32_Half e_phnum;         --

    ELF32_Half e_shentsize;       段表描述符的大小,一般等于sizeof(ELF32_Shdr)  -- 用于程序装载

    ELF32_Half e_shnum;        段表描述符的数量                  -- 用于程序装载

    ELF32_Half e_shstrndx;       段表字符串标所在的段在段表中的下标        -- 用于符号识别决议和重定位

    } Elf32_Ehdr;

    Elf32_Shdr段描述符结构

    typedef struct

    {

    ELF32_Word sh_name;              段名,保存为string table段中偏移

    ELF32_Word sh_type;               段类型,

    ELF32_Word sh_flags;               段标志位,表示段 SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR

    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;

        

    ELF符号表结构:

    typedef struct {

    Elf32_Word st_name;                 符号名,表示在string table中的偏移

    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包含符号类型和绑定信息

    ELF中符号类型包括:

    符号类型
    宏定义名 注释
    STB_LOCAL 0 局部符号,对于外部模块不可见
    STB_GLOBAL 1 全局符号,对于外部模块可见
    STB_WEAK 2 弱引用符号,可被全局符号定义覆盖

    ELF绑定信息包括:

    绑定信息
    宏定义名 注释
    STT_NOTYPE 0 未知符号
    STT_OBJECT 1 对象(变量,数组)
    STT_FUNC 2 函数
    STT_SECTION 3
    STT_FILE 4 目标文件名

  • 相关阅读:
    grid布局
    flex弹性布局
    数据库连接使用ThreadLocal
    maven核心,pom.xml详解
    src和herf的区别
    表单校验出错,导致表单无法提交
    联机调试,如何配置局域网内文件服务器
    不同语言时间戳长度问题,及Java获取时间戳的效率
    OO设计原则 -- OO设计的原则及设计过程的全面总结
    Maven项目被clean命令之后的红叉或找不到class文件
  • 原文地址:https://www.cnblogs.com/kirito/p/3561900.html
Copyright © 2020-2023  润新知