0
点赞
收藏
分享

微信扫一扫

Mach-O

何以至千里 2021-09-25 阅读 26
  • Mach-OMach object的缩写, 是Mac/iOS上用于存储程序, 库的标准格式

  • 属于Mach-O格式的文件类型有

  • 可以在xnu源码中, 查看到Mach-O格式的详细定义

常见的Mach-O文件类型

  • MH_OBJECT
    -- 目标文件(.o)
    -- 静态库文件(.a),静态库其实就是N.o合并在一起

  • MH_EXECUTE: 可执行文件

  • MH_DYLIB: 动态库文件
    -- .dylib
    -- .framework/xx

  • MH_DYLINKER: 动态链接编辑器
    -- /usr/lib/dyld

  • MH_DSYM: 存储着二进制文件符号
    -- .dSYM/Contents/Resources/DWARF/xx(常用于分析App的崩溃信息)

Universal Binary (通用二进制文件)
  • 通用二进制文件
    -- 同时适用于多钟架构的二进制文件
    -- 包含了多种不同架构的独立的二进制文件

$(ARCHS_STANDARD)XCode内置的环境变量, 不同的XCode版本, 这个变量值不一样

  • 因为需要储存多种架构的代码, 通用二进制文件通常比单一平台的二进制的程序要大

  • 由于两种架构有共同的一些资源, 所以并不会达到单一版本的两倍之多

  • 由于执行过程中, 只调用一部分代码, 运行起来也不需要额外的内存

  • 因为文件比原来的要大, 也被称为"胖二进制文件" (Fat Binary)

  • 命令行工具
    file 文件路径: 查看Mach-O的文件类型
    lipo -info xxx查看架构信息
    lipo xxx -thin armv7 -output yyy_armv7二进制文件瘦身, 通用架构拆成armv7架构
    lipo xxx -thin arm64 -output yyy_arm64二进制文件瘦身, 通用架构拆成arm64架构
    lipo -creat yyy_armv7 yyy_arm64 -output zzz合并架构
    otool: 查看Mach-O特定部分和段的内容

Mach-O的基本结构

  • 一个Mach-O文件包含3个主要区域
    -- Header
    ✅ 文件类型, 目标架构类型等

-- Load commands
✅ 描述文件在虚拟内存中的逻辑结构, 布局

-- Raw segment data
✅ 在Load comments中定义的Segment的原始数据

  • MachOView, 用来查看Mach-O文件结构的

dyldMach-O
  • dyld用于加载以下类型的Mach-O文件
    -- MH_EXECUTE
    -- MH_DYLIB
    -- MH_BUNDLE

  • App的可执行文件, 动态库都是由dyld负责加载的

举报

相关推荐

0 条评论