iOS/maxOS二进制文件是mach-o格式的,mach-o又分为几种不同的类型。本文介绍了常见的mach-o文件类型以及它们的不同之处。

在Xcode->Build Setting -> Mach-O Type中,我们可以选择下面几种类型:

  • Executable
  • Dynamic Library
  • Bundle
  • Static Library
  • Relocatable Object File

新建Framework项目中,默认是Dynamic Library。

实际上,这里的Mach-o Type完整的定义在mach-o/loader.h struct mach_header_64结构的filetype:

  • #define MH_OBJECT 0x1 / relocatable object file /

  • #define MH_EXECUTE 0x2 / demand paged executable file /

  • #define MH_FVMLIB 0x3 / fixed VM shared library file /

  • #define MH_CORE 0x4 / core file /

  • #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 /
    各种类型说明如下:

  • MH_OBJECT
    .m,.c等文件编译出来的目标文件,文件后缀是.o。Static Library类型产出是MH_OBJECT类型文件的archieve。

  • MH_EXECUTE
    可单独执行的可执行文件,必须有main方法作为执行入口,app的二进制就是这种类型;对应Executable类型产出;

  • MH_FVMLIB

  • MH_CORE

  • MH_PRELOAD

  • MH_DYLIB
    动态库文件,包括.dylib文件,动态framework;对应Dynamic Library类型产出。

  • MH_DYLINKER
    动态链接器,在 iOS 中就是/usr/lib/dyld;

  • MH_BUNDLE
    独立的二进制文件,不支持在项目中添加Link Binary使用。可以在Copy Bundle Resources中作为资源添加。 通过NSBundle load的方式加载;对应Bundle类型产出。典型的例子就是/System/Library/AccessibilityBundles目录的.axbundle后缀的文件。

  • MH_DSYM
    存储二进制文件符号信息的文件,用于Debug分析;

/usr/lib/dyld仅会处理MH_BUNDLE, MH_DYLIB,MH_EXECUTE类型文件。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:642363427 不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!