Mach-O 常见filetype简析

一直以来我对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 无(或者我不知道) 无(或者我不知道)

后面我会考虑再继续增加其他常见文件类型的

发表评论

电子邮件地址不会被公开。 必填项已用*标注