ELF(Executable and Linkable Format)文件格式

在这里插入图片描述

在这里插入图片描述

  • .text:已编译程序的机器代码。
  • .rodata:只读数据,比如printf语句中的格式串和开关语句的跳转表。
  • .data:已初始化的全局和静态变量。局部变量在运行时被保存在栈
    中,既不出现在.data节中,也不出现在.bss节中
  • .bss:未初始化的全局和静态变量,以及所有被初始化为0的全局和静态变量。
  • .symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息。
  • .rel.text:一个.text节中位置的列表,当链接器把这个目标文件和其他文件组合式,需要修改这些位置。
  • .rel.data:被模块引用或定义的所有全局变量的重定位信息。
  • .debug:一个调试符号表,其条目是程序中定义的局部变量、类型定义、定义和引用的全局变量,以及原始的源文件。
  • .line:原始C源程序中的行号和.text节中机器指令之间的映射。
  • .strtab:一个字符串表,其内容包括.symtab和.debug节中的符号表,以及节头部中的节名字。
    在这里插入图片描述
  • 加载器将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或入口点来运行该程序。这个将程序复制到内存并运行的过程叫做加载。
  • 每一个Linux程序都有一个运行时内存映像。
  • 链接器的两个任务:(1),符号解析(symbol resolution)。目标文件定义和引用符号,每个符号对应于一个函数、一个全局变量或一个静态变量。符号解析的目的就是将每个符号引用正好和一个符号定义关联起来。(2),重定位(relocation)。编译器和汇编器生成从地址0开始的代码和数据节(Section ???)。链接器通过把每个符号定义于一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号定义的引用,使得它们指向这个内存位置。链接器使用汇编器产生的重定位条目(relocation entry)的详细指令,不加甄别地指向这些重定位。
  • 目标文件纯粹是字节块地集合。这些块中,有些包含程序代码,有些包含程序数据,而其他的则包含引导链接器和加载器的数据结构。
  • 链接器将这些块连接起来,确定被连接块的运行时位置,并且修改代码和数据库中的各种位置。链接器对目标机器了解甚少。产生目标文件的编译器和汇编器已经完成了大部分工作。
  • 共享库是一个目标模块,在运行或加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。在linux中通常.so后缀。
  • 共享库以两种方式:(1),在任何给定的文件系统中,对于一个库只要一个.so文件。所有引用该库的可执行目标文件共享这个.so文件中的代码和数据,而不是像静态库的内容那样被复制和嵌入到引用它们的可执行文件中。(2),在内存中,一个共享库的.text节的一个副本(???)可以被不同的正在运行的进程共享。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值