一直以来我对MH_EXECUTE、MH_DYLIB、MH_BUNDLE这三种类型的Mach-O文件区分得不是特别清楚,今天特意开个坑来对比一下。
MH_EXECUTE (无默认后缀名)是可执行文件,这个最简单了,在链接时候不用额外参数,默认生成的就是可执行文件
MH_DYLIB (后缀名.dylib,前缀一般是lib)是动态库文件,这个也比较好理解,我们可以在链接时加一个-lXXX来将libxxx.dylib的导出函数直接引用到你编写的程序中,链接时需要加入的参数是-shared
MH_BUNDLE 是资源包吧,苹果的系统下特别多资源包,无论是xxx.app或是一个语言本地化文件也可以称作资源包,但这里探讨的是Mach-O文件中的Bundle文件。
链接时需要加入的参数是-bundle
其实Bundle(后缀名.bundle)与dylib非常相似,区别在于bundle文件只能动态装载,不能通过动态链接器dyld加载。
bundle其实更多时候用来放一些资源数据啦,就像文件夹那样的一样
是不是没好好说话。。
反正意思就只能用dlopen、dlsym那样来使用,而不像dylib那样还可以直接在链接时就引用了。
如果跟windows下的文件格式一对比大概就更容易理解了吧
文件类型 | darwin下后缀名 | Windows NT下后缀名 | linux下后缀名 |
MH_EXECUTE | 无 | .exe | 无 |
MH_DYLIB | .dylib | .dll | .so |
MH_BUNDLE | .bundle | 无(或者我不知道) | 无(或者我不知道) |
后面我会考虑再继续增加其他常见文件类型的