iOS【Mach-O可执行文件】

2020-05-30  本文已影响0人  NJ_墨

摘录:其字德安「Mach-O文件结构」
(以此记录一下)

iOS上的可执行文件相当于windows上的.exe可执行文件。
在iOS上,主要的可执行文件格式是Mach-O格式。

iOS程序包是.ipa文件。解压缩后里面会有一个payload文件夹,文件夹里有一个.app文件,右键显示包内容,然后找到一个一般体积最大跟.app同名的文件,那个文件就是可执行文件。

Mach-O类型的文件

#define MH_OBJECT   0x1     /* 目标文件*/
#define MH_EXECUTE  0x2     /* 可执行文件 */
#define MH_FVMLIB   0x3     /* fixed VM shared library file */
#define MH_CORE     0x4     /*核心转储文件 */
#define MH_PRELOAD  0x5     /* preloaded executable file */
#define MH_DYLIB    0x6     /* dynamically bound shared library */
#define MH_DYLINKER 0x7     /* dynamic link editor */
#define MH_BUNDLE   0x8     /* dynamically bound bundle file */
#define MH_DYLIB_STUB   0x9     /* shared library stub for static */
                    /*  linking only, no section contents */
#define MH_DSYM     0xa     /* companion file with only debug */
                    /*  sections */
#define MH_KEXT_BUNDLE  0xb     /* x86_64 kexts */

常见的Mach-O格式的文件

1、`MH_OBJECT` 目标文件
    *`.o`
    *`.a/ .framework`静态库
        *静态库即多个`.o`文件存放在一起实现特定的功能

2、`MH_EXECUTE` 可执行文件
    *`.app/MyApp`
    *`.out`

3、  `MH_DYLIB` 动态库
    *`.framework/xxx`
    *`/dylib`

4、`MH_DYLINKER` 动态链接器
    *`usr/lib/dyld`

5、`MH_DSYM` 存储二进制文件符号信息的文件
    *`.dYSM/Contents/Resources/DWARF/MyApp`

如图:


image

查看项目targetMach-O文件的类型
MH_EXECUTE类型
如图:

image

Mach-O文件的基本结构

Mach-O包含三个主要区域

1、`Header`: 文件类型, 目标架构
2、`Load command`: 描述文件在虚拟内存中的逻辑与布局
3、`Raw segment date`: `Load command`中定义的原始数据
image
➜ otool -h  DingTalk
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedface      12          9  0x00           2    79       7860 0x00218085
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777228          0  0x00           2    79       8672 0x00218085

# 该Mach-O文件类型是 executable  只有armv7指令集
➜  HomeDesign3D China.app file HomeDesign3D\ China
HomeDesign3D China: Mach-O executable arm_v7

# 该Mach-O文件 类型是 executable;  有armv7, arm64指令集是一个通用二进制文件
➜  DingTalk.app file DingTalk
DingTalk: Mach-O universal binary with 2 architectures: [arm_v7: Mach-O executable arm_v7] [arm64]
DingTalk (for architecture armv7):  Mach-O executable arm_v7
DingTalk (for architecture arm64):  Mach-O 64-bit executable arm64

image image image

Mach-O结构详解

Mach Header(arm64)
image

LC_SEGMENT / LC_SEGMENT_64段的详解

image

段中区section详解

image

Load Commmands加载命令中其他信息

动态库加载流程小结
1.0 首先启动dyld动态链接器; 内核根据LC_LOAD_DYLINKER启动/usr/lib/dyld

2.0 如果Mach-O文件中使用了外部定义的符号或函数, 则会在文本段__TEXT有__stubs, __stub_helper区; 区内放着本地未被定义的符号; 编译器在编译源码时会创建对这些未定义符号桩区的调用

3.0 dyld运行时, 会在符号桩区调用地址上; 添加JMP 到 真实函数地址的指令

4.0 至于dyld怎么找到指定的动态库中指定的函数地址? 此时dyld将加载Load Command中的LC_LOAD_DYLIB命令

5.0 LC_LOAD_DYLIB(动态库), dyld将加载每一个指定的库且搜寻匹配的符号

6.0 当符号匹配时, 将在符号表(由dyld加载LC_SYMTAB, LC_DYSYMTAB获取)查找对应的函数/符号地址

上一篇 下一篇

猜你喜欢

热点阅读