Mach-O文件(12)

MachO文件(12)

MachO文件

Mach-O其实是Mach Object文件格式的缩写,是mac以及iOS上可执行文件的格式, 类似于windows上的PE格式 (Portable Executable ), linux上的elf格式 (Executable and Linking Format)

Mach-O为Mach object文件格式的缩写,它是一种用于可执行文件、目标代码、动态库的文件格式。作为a.out格式的替代,Mach-O提供了更强的扩展性。

MachO格式的常见文件

  • 目标文件.o
  • 库文件
    • .a
    • .dylib
    • Framework
  • 可执行文件
  • dyld
  • .dsym
//将test.c通过clang进行编译生成test.o
clang -c test.c
//通过 $file 文件路径 查看文件类型
file test.o
//编译.o生成一个.out的可执行文件
clang test.o -> a.out
//file查看.out -> executable意思是可执行 ./a.out 可直接调用
//也可通过下面代码直接生成可执行文件
clang -o test2 test.c
clang -o test3 test.o
//a.out test2 test3 是一样的, 通过hash值比较 -> md5 a.out 

.o文件

编译流程

  1. 准确两个文件 test1.c test.c
  2. clang -o demo test1.c test.c -> demo可执行文件, ./demo可直接调用
    1. 流程为下:
    2. clang -c test1.c test.c -> .o
    3. clang -o demo1 test.o test1.o -> demo1可执行文件
    4. 此时进行hash比较, md5 demo 跟 md5 demo1 hash值却不一样, 因为链接顺序不一样
      1. objdump --macho -d demo //查看链接顺序

.a文件 .dylib文件

  1. find /usr -name "*.a"
    1. file 路径
  2. find /usr -name "*.dylib"
    1. file 路径

dyld

  1. cd /usr/lib/
  2. ls dyld
  3. file dyld -> dynamic linker 动态链接器 Mach-O文件
    1. 有两个架构i386, x86_64

dSYM

  1. 工程编译 -> .dSYM -> 显示包文件
  2. file 里面的包内容 -> .dDYM类型, 符号文件
    1. 排查崩溃信息 -> 拿到堆栈信息 -> 去符号

可执行文件的架构配置

  1. 工程 -> Build Seetings -> 搜mach -> 可以更改生成类型
  2. 工程编译生成的可执行文件, 默认是arm64
    1. 11以上的编译 -> arm64
    2. 选择低版本10.3 -> armv7/arm64
  3. 架构设置 -> Build Seetings -> architectures
    1. 可以修改,比如添加armv7s来支持iPhone5/5c
    2. Build Active Architectures only //编译当前架构
      1. debug -> 当前运行手机的架构
      2. release -> 根据你需要支持的设备来定的, 即选择的编译版本

通用二进制文件 (Universal binary)

苹果公司提出的一种程序代码。能同时适用多种架构的二进制文件

  • 同一个程序包中同时为多种架构提供最理想的性能。
  • 因为需要储存多种代码,通用二进制应用程序通常比单一平台二进制的程序要大。
  • 但是 由于两种架构有共通的非执行资源(代码以外的),所以并不会达到单一版本的两倍之多。
  • 而且由于执行中只调用一部分代码,运行起来也不需要额外的内存。
//查看架构 Demo是上面生成的三个架构的
lipo -info Demo
//使用lifo –thin 拆分某种架构, 拆出来是某种架构
lipo Demo -thin armv7 -output machO_armv7
//使用lipo -create  合并多种架构
lipo -create machO_armv7 machO_arm64 -output machO_7_64


// 删掉i386,x86_86
lipo -remove i386 NIMSDK -o NIMSDK

MachO文件结构

[图片上传失败...(image-5b2ccc-1619252451688)]

//直接查看otool指令
otool 
//查看headers信息
otool -f Demo

MachOView来分析, 非常推荐
MachOView.app

Header的数据结构

快捷搜索 -> loader.h -> mach_header
[图片上传失败...(image-f18376-1619252451688)]

Load Command段

  1. Load Command段 -> PAGEZERO -> VM
    1. VM Addr : 虚拟内存地址
    2. VM Size: 运行时刻, 在内存中的大小 -> 4G空间, 虚拟内存大小
      1. 64位 -> 0xffffffff12345678
      2. 32位 -> 0x12345678
      3. 这样64位就可以兼容32位
    3. File offset: 数据在文件中偏移量
    4. File size: 数据在文件中的大小
  2. LC_DYLD_INFO_ONLY
    1. Rebase Info Size 重定向, 运行时, 代码段要统一加上一个偏移量, 称为重定向
  3. LC_SYMTAB 符号表信息
  4. LC_MAIN 主程序入口
    1. 如果别人有做防护, 运行就崩, 那么main不失为一个好的切入点
  5. 还有一些需要加载的动态库

[图片上传失败...(image-95a9fd-1619252451688)]

代码段__text

  1. 主程序代码
  2. 符号绑定

数据段__Data

  1. 符号表
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容