必赢亚洲手机app下载


CheungSSH国产汉语开源自动化运行系统Web界面

gif动图快捷制作方法

打探iOS上的可执行文件和Mach

http://www.cocoachina.com/mac/20150122/10988.html

http://www.reinterpretcast.com/hello-world-mach-o

多多有情人都知情,在Windows上exe是可径直实施的文件增添名,而在Linux(以及许多本子的Unix)系统上ELF是可直接实施的文件格式,那么在苹果的操作系统上又是何许的啊?在iOS(和Mac
OS
X)上,首要的可执行文件格式是Mach-O格式。本文就关于iOS上的可执行文件和Mach-O格式做二个简易整理。

Mach-O格式是iOS系统上应用程序运维的底子,通晓Mach-O的格式,对于调节和测试、自动化测试、安全都有意义。在打听二进制文件的数据结构现在,一切就都显得未有地下。

0. Mach与Mach-O

此间先唤醒我们刹那间,Mach不是Mac,Mac是苹果电脑Macintosh的简称,而Mach则是1种操作系统内核。Mach内核被NeXT公司的NeXTSTEP操作系统使用。在Mach上,壹种可实施的文件格是就是Mach-O(Mach
Object file format)。一玖九七年,Jobs将NeXTSTEP带回苹果,成为了OS
X的基本基础。所以固然Mac OS
X是Unix的“后代”,但所重要支持的可执行文件格式是Mach-O。

iOS是从OS X演化而来,所以同样是永葆Mach-O格式的可执行文件。

一. iOS可执行文件初探

作为iOS客户端开发者,大家相比熟习的一种文件是ipa包(酷派Application)。但其实那只是一个变相的zip压缩包,大家得以把3个ipa文件一向通过unzip命令解压。

解压之后,会有二个Payload目录,而Payload里则是二个.app文件,而这几个实际又是三个索引,可能说是2个完好无损的App
Bundle。

在那个目录中,里面体量最大的文件壹般正是和ipa包同名的三个二进制文件。找到它,大家用file命令来看一下那一个文件的类型:

1
2
3
XXX: Mach-O universal binary with 2 architectures
XXX (for architecture armv7): Mach-O executable arm
XXX (for architecture armv7s): Mach-O executable arm

总的来说,那是一个帮衬armv七和armv七s三种处理器架构的通用程序包,里面富含的两局部都是Mach-O格式。

对于一个贰进制文件来讲,每一个门类都得以在文书最初多少个字节来标识出来,即“魔数”。比如PNG图片的早期多少个字节是\211
P N G \r \n \032 \n (89 50 四E 肆7 0D 0A 一A
0A)。大家再来看下这几个Mach-O universal binary的:

1
0000000 ca fe ba be 00 00 00 02 00 00 00 0c 00 00 00 09

没有错,开头的陆个字节是cafe babe,即“Cafe
baby”。明白Java可能说class文件格式的同学恐怕会很纯熟,那也是.class文件初步的“魔数”,但貌似是Mach-O在更早的时候正是用了它。在OS
X上,可执行文件的标识有诸如此类多少个魔数(约等于文件格式):

cafebabe

feedface

feadfacf

再有四个格式,正是以#!起首的脚本

cafebabe就是跨处理器架构的通用格式,feedface和feedfacf则分级是某壹处理器架构下的Mach-O格式,脚本的就很普遍了,比如#!/bin/bash开头的shell脚本。

此地注意一点是,feedface和cafebabe的字节顺序不一样,大家得以用lipo把地点cafebabe的文件拆出armv7架构的,看一下起始的多少个字节:

0000000 ce fa ed fe 0c 00 00 00 09 00 00 00 02 00 00 00

2. Mach-O格式

接下去我们再来看看那么些Mach-O格式到底是什么的格式。我们能够透过二进制查看工具查看那么些文件的多寡,结果发现,不是拥有数据都以频频的,而是被分为了多少个段子。

在1个人名字为JOE
SAVAGE的三哥公布的图样上来看,Mach-O的文本数量显现出来是其一样子的:

图片 1

(图形化的Mach-O文件数量)

我们能够对数据的遍布感受下。

尽管被五颜6色的符号出来,也许这还不是尤其直白。再来引用苹果官方文书档案的示意图:

图片 2

(Mach-O文件格式基本构造)

从那张图上来看,Mach-O文件的数量主题可分为三超越四分之一,分别是尾部(Header)、加载命令(Load
commands)、和终极的数码(Data)。

回过头来,大家再看上面那张图,可能就都领会了。淡红部分是底部、黄铜色是加载命令、而其它一些则是被细分成Segments的数码。

3. Mach-O头部

那边,我们用otool来看下Mach-O的尾部音信,获得:

1
2
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedface      12          9  0x00          2    45       4788 0x00218085

更详实的,大家可以透过otool的V参数获得翻译版:

1
2
3
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC     ARM         V7  0x00     EXECUTE    45       4788   NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE

前方几个字段的意义,上下相比就能看懂,笔者那里关键说下这么多少个字段:

filetype,这几个可以有那二个品种,静态库(.a)、单个指标文件(.o)都能够由此那个体系标识来差别。

ncmdssizeofcmds,这些cmd正是加载命令,ncmds正是加载命令的个数,而sizeofcmds正是所占的高低。

flags里含有的符号很多,比如TWOLEVEL是指符号都以两级格式的,符号自个儿+加上自身所在的单元,PIE标识是岗位非亲非故的。

4. 加载命令

上边底部中的数据现已认证了方方面面Mach-O文件的宗旨消息,但整套Mach-O中最重点的还要数加载命令。它表明了操作系统应该怎么样加载文件中的数据,对系统内核加载器和动态链接器起指引意义。1来它描述了文本中数量的切切实实协会结构,二来它也证实了经过运维后,对应的内部存款和储蓄器空间结构是什么样组织的。

笔者们能够用otool -l xxx来看二个Mach-O文件的加载命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Load command 0
      cmd LC_SEGMENT
  cmdsize 56
  segname __PAGEZERO
   vmaddr 0x00000000
   vmsize 0x00004000
  fileoff 0
 filesize 0
  maxprot ---
 initprot ---
   nsects 0
    flags (none)
Load command 1
      cmd LC_SEGMENT
  cmdsize 736
  segname __TEXT
   vmaddr 0x00004000
   vmsize 0x00390000
  fileoff 0
 filesize 3735552
  maxprot r-x
 initprot r-x
   nsects 10
    flags (none)
Section
  sectname __text
   segname __TEXT
      addr 0x0000b0d0
      size 0x0030e7f4

地点那段是推行结果的一片段,是加载PAGE_ZERO和TEXT两个segment的load
command。PAGE_ZERO是壹段“空白”数据区,那段数据尚未任何读写运转权限,方便捕捉总线错误(SIGBUS)。TEXT则是重点代码段,大家注意到里面包车型大巴r-x,不带有w写权限,那是为着制止代码逻辑被专断歪曲。

自己再提几个加载命令,LC_MAIN。这么些加载指令,会注脚整个程序的输入地址,有限帮助进度运营后可以健康的起先全方位应用程序的运维。

除此而外,Mach-O里还有LC_SYMTAB、LC_LOAD_DYLIB、LC_CODE_SIGNATURE等加载命令,咱们能够去官方文书档案查找其含义。

至于Data部分,在摸底了尾部和加载命令后,就没怎么尤其可说的了。Data是最原始的编写翻译数据,里面富含了Objective-C的类新闻、常量等。

正文是对Mach-O文件格式的1个精通小结,希望能够一得之见,帮忙各位朋友把握可执行文件的焦点脉络,进而缓解各项难题。

参考:

THE NITTY GRITTY OF “HELLO WORLD” ON OS
X

OS X ABI Mach-O File Format
Reference

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图