仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2857|回复: 18
打印 上一主题 下一主题

[学习教程] IOS制作之iOS 系列译文:Mach-O 可实行文件仓酷云

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:37:12 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你可能还需要学习使用Xcode这个开发环境,接著你需要掏钱向苹果注册开发者权限,基本的帐号是99美金。本视频为“斯坦福大学iPhone开发教程”,51CTO将不断关注本视频教程的更新进度,为大家提供最新的视频。当我们在Xcode中构建一个程序的时分,个中有一部分就是把源文件(.m和.h)文件变化成可实行文件。这个可实行文件包括了将会在CPU(iOS设备上的arm处置器大概你mac上的Intel处置器)运转的字节码。
我们将会过一遍编译器这个历程的做了些甚么,同时也看一下可实行文件的外部究竟是如何的。实在,内里的工具比你看到的要多良多。
让我们先把Xcode放一边,踏进Commond-Lines的年夜陆。当我们在Xcode中构建一个App时,Xcode只是复杂的挪用了一系列的工具罢了。但愿这将会让你更好的分明一个可实行文件(被称之为Mach-O可实行文件),是如何组装起来的,而且是如何在iOS大概osx上实行的
XCrun

先从一些基本性的工具入手下手:我们将会利用一个叫做Xcrun的命令行工具。他看起来很奇异,可是切实其实相称杰出。这个小工具是用来挪用其他工具的。本来的时分我们实行:
1
%clang-v

如今在终端中,我们能够实行:
1
%xcrunclang-v

Xcrun定位Clang,而且利用相干的参数来实行Clang。
为何我们要做这个事变?这看起来毫无重点,胡扯八道。可是Xcrun同意我们利用多个版本的Xcode,大概利用特定Xcode版本内里的工具,大概针对特性的SDK利用分歧的工具。假如你刚好有Xcode4.5和xcode5、利用xcode-select和xcrun你能够选择选择利用来自Xcode4.5内里的SDK的工具,大概来自Xcode5内里的SDK的工具。在年夜多半其他平台上,这将是一个不成能的事变。假如你看一下匡助手册上xcode-select和xcrun的一些细节。你就可以在不安装命令行工具的情形下,利用在终端中利用开辟者工具。
一个不利用IDE的HelloWorld

回到终端,创立一个包括一个c文件的目次:
1
2
3
%mkdir~/Desktop/objcio-command-line
%cd!$
%touchhelloworld.c

如今利用你喜好的文本编纂器来编纂这个文件,比方TextEdit.app:
1
%open-ehelloworld.c

录进上面的代码:
1
2
3
4
5
6
#include<stdio.h>
intmain(intargc,char*argv[])
{
printf("HelloWorld!n");
return0;
}

保留,而且回到终端实行:
1
2
%xcrunclanghelloworld.c
%./a.out

如今你可以在终端上看到熟习的HelloWorld!。你编译了一个C程序而且实行了它。一切都是在不利用IDE的情形下做的。深呼吸一下,乐意乐意。
我们在这里做了些甚么?我们将hellowrold.c编译成了叫a.out的Mach-o二进制文件。a.out是编译器的默许名字,除非你指定一一般的。
HelloWorld和编译器

如今可选择的编译器是Clang(读作:/’kl/)。Chris写了一些更多关于Clang细节的先容,能够参考:aboutthecompiler
归纳综合一下就是,编译器将会读进处置hellowrold.c,输入可实行文件a.out。这个历程包括了十分多的步骤。我们所要做的就是准确的实行它们。
预处置:



  • 序列化
  • 宏界说睁开
  • #include睁开(援用文件睁开)
语法和语义剖析:



  • 利用预处置后的单词构建词法树
  • 实行语义剖析天生语法树
  • 输入AST(AbstractSyntaxTree)
代码天生和优化



  • 将AST转化成更初级的两头码(LLVMIR)
  • 优化天生代码
  • 方针代码天生
  • 输入汇编代码
汇编程序



  • 将汇编代码转化成方针文件
毗连器



  • 将多个方针文件兼并成可实行文件(大概一个静态库)我们来看一个关于这些步骤的复杂的例子。
预处置

编译器将做的第一件事变是处置文件。利用Clang展现一下这个历程:
1
%xcrunclang-Ehelloworld.c

欧耶。输入了413行内容。翻开个编纂器看看究竟产生了甚么:
1
%xcrunclang-Ehelloworld.c|open-f

在文件顶部我们能看到良多以”#”开首的行。这些被称之为行标志语句的语句告知我们它前面的内容来自那里。我们必要这个。假如我再看一下hellowrold.c,第一行是:
1
#include<stdio.h>

我们都用过#include和#import。它们做的就是告知于处置器在#include语句的中央拔出stdio.h的内容。在方才的文件里就是拔出了一个以#开首的行标志。跟在#前面的数字是在源文件中的行号。每行最初的数字是在新文件中的行号。回到方才翻开的文件,接上去是体系头文件,大概一些被当作包裹着extern“C”的文件。
假如你转动到文件开端,你将会发明我们的helloworld.c的代码:
1
2
3
4
5
6
#2"helloworld.c"2
intmain(intargc,char*argv[])
{
printf("HelloWorld!n");
return0;
}

在Xcode中,你能够经由过程利用Product->PerformAction->Preprocess来检察任何一个文件的预处置输入。必定要注重这将会消费一些工夫来加载预处置输入文件(靠近100,000行)。
编译

下一个步骤:文本处置和代码天生。我们能够挪用clang输入汇编代码就像如许:
1
%xcrunclang-S-o-helloworld.c|open-f

看一看输入。我们起首注重到的是一些以点开首的行。这些是汇编指令。其他的是真实的x86_64汇编代码。最初是些标志,就像C中的那些标志一样。
我们夙昔三行入手下手:
1
2
3
.section__TEXT,__text,regular,pure_instructions
.globl_main
.align4,0x90

这三行是汇编指令,不是汇编代码。”.section”指令指出了哪个段接上去将会被实行。比用二进制暗示悦目多了。
下一个,.global指令申明_main是一个内部标记。这就是我们的main()函数。它可以从我们的二进制文件以外看到,由于体系要挪用它来运转可实行文件。
.align指令指出了上面代码的对齐体例。从我们的角度看,接上去的代码将会依照16比特对齐而且假如必要的时分用0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-6 08:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表