Mach-O

作者: 小冰山口 | 来源:发表于2020-12-01 16:33 被阅读0次
    • Mach-OMach object的缩写, 是Mac/iOS上用于存储程序, 库的标准格式

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

      image.png
    • 可以在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的基本结构
    image.png
    • 一个Mach-O文件包含3个主要区域
      -- Header
      ✅ 文件类型, 目标架构类型等

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

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

    • MachOView, 用来查看Mach-O文件结构的
      image.png
    dyldMach-O
    • dyld用于加载以下类型的Mach-O文件
      -- MH_EXECUTE
      -- MH_DYLIB
      -- MH_BUNDLE

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

    相关文章

      网友评论

          本文标题:Mach-O

          本文链接:https://www.haomeiwen.com/subject/lzrrwktx.html