iOS开发:Mach-O入门理解
文章目录
- 1、目标文件Mach-O
- 2、常见的Mach-O文件类型
- 4、在Xcode中查看target的Mach-O类型
- 4、Mach-O的基本结构
- 5、如何窥探Mach-O的结构
- 6、Universal Binary(通用二进制文件)
- 7、动态加载器dyld与目标文件Mach-O的关系
1、目标文件Mach-O
Mach-O:是Mach object
的缩写,是Mac\iOS上用于存储程序、库的标准格式。
属于Mach-O格式的文件类型有:
#define MH_OBJECT 0x1 /* Target 文件:编译器对源码编译后得到的中间结果 */
#define MH_EXECUTE 0x2 /* 可执行二进制文件 */
#define MH_FVMLIB 0x3 /* VM 共享库文件(还不清楚是什么东西) */
#define MH_CORE 0x4 /* Core 文件,一般在 App Crash 产生 */
#define MH_PRELOAD 0x5 /* preloaded executable file */
#define MH_DYLIB 0x6 /* 动态库 */
#define MH_DYLINKER 0x7 /* 动态连接器 /usr/lib/dyld */
#define MH_BUNDLE 0x8 /* 非独立的二进制文件,往往通过 gcc-bundle 生成 */
#define MH_DYLIB_STUB 0x9 /* 静态链接文件(还不清楚是什么东西) */
#define MH_DSYM 0xa /* 符号文件以及调试信息,在解析堆栈符号中常用 */
#define MH_KEXT_BUNDLE 0xb /* x86_64 内核扩展 */
可以在xnu
源码中,可以查看到Mach-O格式的详细定义(https://opensource.apple.com/tarballs/xnu/)
EXTERNAL_HEADERS/mach-o/fat.h
EXTERNAL_HEADERS/mach-o/loader.h
2、常见的Mach-O文件类型
1、MH_OBJECT
1、目标文件(.o)
2、静态库文件(.a),静态库其实就是N个.o合并在一起的
2、MH_EXECUTE:可执行文件
.app/xx
3、MH_DYLIB:动态库文件
.dylib
.framework/xx
4、MH_DYLINKER:动态链接编辑器
/usr/lib/dyld
5、MH_DSYM:存储着二进制文件符号信息的文件
.dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩溃信息)
.o文件编译生成的流程:
4、在Xcode中查看target的Mach-O类型
4、Mach-O的基本结构
官方描述
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html
一个Mach-O文件包含3个主要区域:
1、Header :保存文件的基本信息,如文件类型、CPU架构信息、加载命令个数等。
2、Load commands:根据这里的数据确定内存分布(本身不包含数据,类似于一个指针)。
3、Raw segment data:存放具体的代码和数据,是Mach-O文件真正的内容数据。
5、如何窥探Mach-O的结构
一、命令行工具:
1、file:查看Mach-O的文件类型
file 文件路径
2、otool:查看Mach-O特定部分和段的内容
3、lipo:常用于多架构Mach-O文件的处理
3.1、查看架构信息:lipo -info 文件路径
3.2、导出某种特定架构:lipo 文件路径 -thin 架构类型 -output 输出文件路径
3.3、合并多种架构:lipo 文件路径1 文件路径2 -output 输出文件路径
二、GUI工具
MachOView(https://github.com/gdbinit/MachOView)
6、Universal Binary(通用二进制文件)
通用二进制文件
同时适用于多种架构的二进制文件
包含了多种不同架构的独立的二进制文件
二进制文件特点:
1、因为需要储存多种架构的代码,通用二进制文件通常比单一平台二进制的程序要大。
2、由于两种架构有共同的一些资源,所以并不会达到单一版本的两倍之多。
3、由于执行过程中,只调用一部分代码,运行起来也不需要额外的内存。
4、因为文件比原来的要大,也被称为“胖二进制文件”(Fat Binary)。
7、动态加载器dyld与目标文件Mach-O的关系
1、动态加载器dyld可用于加载以下类型的Mach-O文件
MH_EXECUTE
MH_DYLIB
MH_BUNDLE
2、APP的可执行文件、动态库都是由dyld负责加载的。
iOS开发:Mach-O入门理解相关推荐
- IOS开发语言Swift入门连载---类型转换
IOS开发语言Swift入门连载-类型转换 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 类型转换在 Swift 中使用is 和 as 操作符实现.这两个操作符提供了一种简单达 ...
- iOS开发60分钟入门学习精华
有过脚本开发经验的人(如Javascript,PHP,Shell)在刚开始学习iOS开发的时候,会觉得iOS开发的学习曲线比脚本语言要高,是的,这种感觉是对的.因为学iOS开发,不仅是学习一门新语言, ...
- 《iOS开发实战 从入门到上架App Store(第2版)》书籍目录
第1章 开发准备 1.1 iOS 10新特性简述 1.1.1 新增触觉反馈编程接口 1.1.2 SiriKit框架的开放 1.1.3 引入Messages App 1.1.4 通知框架的整合与扩展 1 ...
- IOS开发语言Swift入门连载---基础部分
Swift >是 > iOS > 和 >OS X >应用开发的一门新语言.然而,如果你有 > C > 或者 > Objective-C > 开发经 ...
- iOS 开发 OpenGL 新手入门
一.搭建开发环境 1.打开XCODE,新建一个工程 选择:IOS-->ApplicationàSingle View Application模板. 取名为"HelloOpenGL&qu ...
- iOS开发—音视频入门学习必看
音视频学习从零到整–(2) 音视频学习从零到整–(3) 音视频学习从零到整–(4) 音视频学习从零到整–(5) 音视频学习从零到整–(6) 音视频学习从零到整–(7) 一.音频基础复习 1.1 声音的 ...
- java ios 开发教程_《iOS开发60分钟入门》
@autoreleasepool 作用:优化内存的使用和释放 1, 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时. 2, 写循环,循环里面包含了大量临时创建的对象.(本文 ...
- IOS开发语言Swift入门连载---基本运算符
运算符是检查.改变.合并值的特殊符号或短语.例如,加号+ 将两个数相加(如let i = 1 + 2 ).复杂些的运算例如逻辑与运算符&& (如if enteredDoorCode & ...
- iOS开发ARC入门和使用
本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论.请不要将本文的部分或全部内容用于商用,谢谢合作. 欢迎转载本文,但是转载请注明本文出处:http:/ ...
- iOS 开发怎么入门?
2017.5.22更新. 这次答案的更新主要想把此答案 ------------- 原文 ------------- 反对以上所有答案. 我反对理由如下:不管是斯坦福大学的CS193p公开课.苹果官方 ...
最新文章
- pycharm安装scrapy失败_运行Scrapy程序时出现No module named win32api问题的解决思路和方法...
- linux 知识汇总
- 搭建Keras,TensorFlow运行环境
- scrapy 序列化写入器 ——ItemExporter
- 人工智能/数据科学比赛汇总 2019.2
- MYSQL 删除二进制日志的 3 个方法
- java性能优化文章
- 网页播放器代码集中营(2)
- Python数据挖掘-文本挖掘
- 牛顿插值法的Python程序
- 如何写一篇高质量的伪原创文章
- qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in
- Zotero批量下载知网文献
- CTF_crypto常见加密密文特征
- 瑞萨单片机iap串口升级app工程的构建-学习记录
- jQuery获取(设置)自定义属性值
- nonebot2调用文本API发送随机文本
- 用Delphi开发视频聊天软件
- 在线教育有什么优势?
- 解决百度网盘、微软网盘、Google网盘相互转存文件