zoukankan      html  css  js  c++  java
  • Linux ELF 文件格式

    ELF 文件类型

    ELF (Executable Linkable Format) 是 linux 下的可执行文件格式,与 windows 下的 PE (Portable Executable) 格式一样,都是 COFF (Common File Format)文件格式的变种。在 linux 下除了可执行文件,编译过程中产生的目标文件(.o 文件),动态链接文件(.so 文件),静态链接库文件(.a 文件) ,核心转储文件(Core Dump File)都按照 ELF 格式存储。查看 ELF 文件类型可以用 file 命令。

    ELF 文件结构

    ELF 文件结构在 /usr/include/elf.h 中有完整定义,一些实用的命令:

    file elf_file 输出 ELF 各个段的 size
    
    readelf [options] elf_file
    -S 输出 section header
    -t 输出符号表 symbol table
    -h 输出 ELF 文件头信息
    
    objdump [options] elf_file
    -h 输出文件基本 ELF 信息
    -d 反汇编代码段
    -s 输出完整内容
    -r 查看重定位表
    -D 反汇编所有段内容
    -S 输出内容包含源代码(需要 gcc -g 参数支持)
    

    ELF 结构中比较重要的几个段:

    .data 数据段,存放已经初始化的全局/静态变量
    .bss(Block Started by Symbol) 存放未初始化的全局变量和静态变量,因为这些变量在程序加载的时候都会被初始化为零,所以不需要存放实际的数据,只需要预留位置
    就可以了。
    .text 代码段,存放源代码编译后的机器指令
    .rodata 只读数据段,存放只读变量
    .symtab(Symbol Table) 符号表
    .strtab(String Table) 字符串表
    .plt(Procedure Linkage Table) 动态链接跳转表
    .got(Global Offset Table) 动态链接全局入口表
    

    动态链接和静态链接

    在静态链接过程中,编译器将需要重定位的符号写在 ELF 结构中的重定位表 (Relocation Table) 内,之后链接器 (Linker) 分析重定位表,从全局符号表中找到相应符号的地址,完成重定位。

    如果希望某个代码文件生成的对象文件可以被动态的链接,需要在编译时给 GCC 指定 -fPIC 参数, PIC(Position Independent Code)即位置无关代码。

  • 相关阅读:
    SpringMvc 大概流程分析
    HandlerMethodArgumentResolver 参数解析器
    linux 技巧:使用 screen 管理你的远程会话
    CentOS Linux解决Device eth0 does not seem to be present
    php连接oracle oracle开启扩展
    关于linux一些备份、还原,压缩,归档的命令
    Sphinx学习之sphinx的安装篇
    linux wget 命令用法详解(附实例说明)
    Linux的bg和fg命令
    linux中ctrl+z和ctrl+c的区别
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8511688.html
Copyright © 2011-2022 走看看