3. 目标文件格式

  1. 可重定位目标文件(.o)

    其代码和数据可和其他可重定位文件合并为可执行文件

    • 每个.o文件由对应的.c文件生成

    • 每个.o文件代码和数据地址都是从0开始

  2. 可执行目标文件(Linux默认为a.out,Windows中为*.exe

包含的代码和数据可以被直接复制到内存并被执行

代码和数据地址为虚拟地址空间中的地址

  1. 共享的目标文件(Linux中的*.so)

    特殊的可重定位目标文件,能在装入或运行时被装入到内存并自动被链接,称为共享库文件

    Windows中称其为Dynamic Link Libraries(DLLS)

目标文件格式目标代码指编译器和汇编器处理源代码后所生成的机器语言目标代码,而目标文件指包含目标代码的文件

标准的几种目标文件格式

  • DOS操作系统(最简单):COM格式(*.com),文件中仅包含代码和数据,且被加载到内存的固定位置(不采用虚拟地址)

  • System V UNIX早期版本:COFF格式,文件中不仅包含代码和数据,还包含重定位信息,调试信息,符号表等其他信息,由一组严格定义的数据结构序列组成

  • Windows:PE格式(COFF的变种),称为可移植可执行(Portable Executable,简称PE)

  • Linux等类UNIX:ELF格式(COFF的变种),称为可执行可链接(Exexutable and Linkable Format,简称ELF)

ELF文件的两种视图

  • 链接视图(被链接):可重定位目标文件

    • 可被链接(合并)生成可执行文件或共享目标文件

    • 静态链接库文件由若干个可重定位目标文件组成

    • 包含代码,数据(已初始化.data节和未初始化.bss节)

    • 包含重定位信息(指出哪些符号引用处需要重定位)

    • 文件扩展名为.o(相当鱼Windonws中的.obj文件)

  • 执行视图(被执行):可执行目标文件

    • 包含代码,数据(已初始化.data节和未初始化.bss节)

    • 定义的所有变量和函数已有确定地址(虚拟地址空间中的地址)

    • 符号引用处已被重定位,以指向所引用的定义符号

    • 没有文件扩展名或默认为a.out

    • 可被CPU直接执行,指令地址和指令给出的操作数地址都是虚拟地址)

ELF头ELF头
程序头表(可选)程序头表
section1(节)segment 1(段)
……segment 2
section nsegment 3
…………
节头表节头表(可选)

链接视图 执行视图

节(section) 是ELF文件中具有相同特征的最小可处理单位

  • .text节:代码

  • .data节:已初始化全局变量和静态变量

  • .rodata节:只读数据

  • .bss节:未初始化数据

多个节映射成一个段(如合并.data节和.bss节,并映射到一个可读可写数据段中)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值