HR's Blog

Swimming 🏊 in the sea🌊of code!

0%

ELF格式解析1-Object Files

.

动态库类型

目标文件有三种格式:

  • 可重定位目标文件
    包含二进制代码和数据,其形式可以在编译时与其他可重新定位的目标文件合并起来,创建一个可执行目标文件,自己本身没有办法独立运行。在iOS开发中,接触到.a的文件都属于这种类型的目标文件。可以直接打包进App中,不需要动态链接。

  • 可执行目标文件
    包含二进制代码和数据,其形式可以直接复制到内存并执行。也就是我们最终使用的可执行文件,或者App本身。

  • 共享目标文件
    一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态加载进内存并链接。对应的就是iOS中Framework的动态库,但是iOS中Framework的动态库分两种情况:

    • 第一种:是系统的级的动态库,这种动态库可以保证在多个App引用相同类型的动态库的时候,通过虚拟内存技术,该动态库只在内存中存在一份。平时我们看到的UIKit之类的都属于系统级别的动态库。
    • 第二种:是开发者自己编译的动态库,这种动态库虽然也是在App运行的时候链接,但是苹果并不会保证该动态库多个App都使用的时候内存中只存在一份。因为该动态库只在App自己沙盒中,无法共享给其他应用使用,动态库在打包后也会被打包进各自的App中,但是当有Watch或者Extension的项目的时候,可以达到共享的目的。

动态库格式

Windows使用可移植(Portable Executable, PE)格式。
Mac OS使用Mach-O格式
Linux和Unix系统则使用(Executable and Linkable Format, ELF)
虽然各个平台的格式各不相同,但是基本概念是相似的。

ELF格式