[TOC]
一、ELF文件格式
1、什么是目标文件
- 编译器编译源代码后生成的文件叫做目标文件
- 目标文件从结构上讲,他是已经编译后的可执行文件
- 还没有经过链接的过程
- 可能有些符号或有些地址还没有被调整
- 本身就是按照可执行文件格式存储的,只是跟真正的可执行文件在结构上稍有不同
2、怎么去了解目标文件
- 目标文件里面到底存放的是什么?
- 源代码经过编译后是怎么存储的?
二、目标文件格式
1、可执行文件
- Windows:PE(Protable Executable)
- Linux:ELF( Executable Linkable Format)
- 扩展于:COFF(Common File Format)
其他的
- Inter/Microsoft:OMF(Object Module Format)
- Unix:a.out
- MS-DOS.com
2、动态链接库和静态链接库
除了可执行文件是按照可执行文件格式存储
- 动态链接库(DLL):Dynamic Linking Library
- 静态链接库(SLL):Static Linking Library
这两个链接库也都是按照可执行文件的格式存储的,在不同操作系统上,具体存储方式上有细微的差异性
- Windows:他们按照
PE-COFF
格式存储 - Linux:按照ELF格式存储
- 静态库:可以理解为多个目标文件捆绑在一起形成的一个文件,再加上一些索引(头文件)
3、ELF文件类型
ELF 文件类型 | 说明 | 实例 |
---|---|---|
可重定位文件(Reloatable File) | 这类文件包含了代码和数据,可以被用来连接成可执行文件或共享目标文件,静态链接库也可以归为这一类 | Linux的 .o 、Windows的 .obj
|
可执行文件(Executable File) | 可以直接执行的程序,代表是ELF可执行文件,没有扩展名 | 比如 /bin/bash 文件、windows的 .exe
|
共享目标文件(Shareed Object File) | 包含代码和数据。使用情况有两种,一种是链接器可以用它跟其他的可重定位文件和共享目标文件链接,产生新的目标问加你。第二种是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分运行起来 | Linux的.so ,如/lib/glibc-2.5.so 、Windows的DLL
|
核心转存文件(Core Dump File) | 当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转存到核心转存文件 | Linux下的 core dump
|
【tips】目标文件与可执行文件格式的小历史
- Unix最早的可执行文件格式为 a.out 的格式,设计简单,当共享库的概念出现的时候,a.out 格式变得捉襟见肘了
- 于是 COFF 格式出现了,有以下两个特点:
- 引入了段的机制,不同目标文件可以有不同数据及不同类型的段
- 还定义了调试数据格式
网友评论