iOS开篇

133 阅读3分钟

作为一个工作了n年的一个iOS程序猿,一直未能对零散的知识有一个整理。以这一篇作为开端。未来每周至少更新两篇文章。

我们在打开了一个App, 可以理解在手机操作系统上运行了一个新的进程,而进程是特殊文件在内存中加载得到的结果,这个特殊文件必须是系统文件可以理解的。也就是Mach-O格式的文件:Mach-O文件不仅仅是可执行文件的标准格式,还是Mac-OS,iOS系统中一些其他文件的标准格式

比如: 1.可执行文件 2.库文件(.dylib/.a/.framework等等) 3.dsym文件 4.目标文件编译输出的(.O文件) 5.动态链接器文件

Mach-O总的来说是苹果的一种文件标准格式

编译 我们开发的app,编译打包后,会生成一个可执行的,Mach-O格式的二进制文件; 对于mac-os与iOS中的APP, 其生成二进制根据支持的架构分为两种: 1.单架构的二进制文件(运行于单个架构的二进制文件:x86,arm64等) 2.胖二进制文件(就是一个二进制文件里包含了多个单架构二进制文件)

当我们Xcode运行我们iOS程序的时候,会生成一个.app文件,位于工程目录/product文件夹下,.app实际上是一个文件夹,显示包内容,里边那个与工程同名的unix格式文件就是Mach-O格式文件。 file xxx 可以查看该文件格式:xxx: Mach-O 64-bit executable arm64 lipo -info xxx 可以查看该文件所支持的系统架构 Non-fat file: xxx is architecture: arm64

Mach-O文件可以使用MachOView打开,可以看到只支持一种架构的二进制文件,叫做单架构二进制文件;支持多种的叫做通用二进制文件或者胖二进制文件:可以支持在多种架构上运行

企业微信截图_97e2bf7b-ba2d-417d-b95e-c3d4900f8955.png

单架构的可执行文件Mach-O的文件结构如下

企业微信截图_e0292649-ee7f-4530-839a-92bc649a5e9c.png

三个部分:

mach-Header: 1.表明Mach-O的格式 2.表明文件类型,CPU架构能信息 3.表明load commands数量等 4.其他

load commands: 这一部分存储的是加载指令,指导操作系统该如何把可执行文件加载到内存中 1.指导data部分的数据该如何加载 2.指导dyld加载哪些库 3.指明符号表地址 4.其他

Data: 这一部分存储的数据区域,包含程序运行的一切数据,表明数据加载到什么位置, 1.代码数据 2.运行时的类数据 3.符号表,动态符号表 4.其他数据 Data区域是以Segment为单位划分的。常见的Segment有 1> __PAGEZERO 一段随机大小,不可访问的空间 2> __TEXT 代码区 3> __Data 数据区域 4> __LINKEDIT 包含了方法和变量的元数据,代码签名等信息

MachOView: github.com/fangshufeng… Mach-O源码:github.com/apple/darwi…