[/codesyntax]Magic字段,用于标明当前文件是32位还是64位的常量。
32位通常定义如下:
[codesyntax lang="c" lines="fancy"]
#define MH_MAGIC 0xfeedface /* the mach magic number */
[/codesyntax] 64位通常定义如下:
[codesyntax lang="c" lines="fancy"]
#define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */
[/codesyntax]Cputype段用于只是当前文件的目标架构,即当前代码只能在指定CPU上运行。
[codesyntax lang="c" lines="fancy"]
#define CPU_TYPE_ARM ((cpu_type_t) 12)
[/codesyntax] Cputype在/usr/include/mach/machine.h中定义;
Cpusubtype指定CPU确切的模型。其定义同样参见/usr/include/mach/machine.h;
Filetype字段用于标识文件的布局包括对齐方式等。在/usr/include/mach-o/loader.h中定义了filetype字段的常量。
Ncmds和sizeofcmds字段,加载命令的数目和大小。
Flag字段。
4. 加载命令
头部之后就是加载命令。加载命令的数目以及总的大小在header中已经给出。加载命令标识文件的布局以及链接相关的信息,主要包含:
虚拟地址的出师布局,包括某段(segment)某区域(section)的起始地址以及大小;
用于动态链接的符号表;
主线程的初始化状态;
共享库。
利用命令otool –l XX 可以获取加载命令区。
Otool –l ButtonFun;所得加载命令如下(截取一小部分,完整版见最后的附件):
ButtonFun:
Load command 0
cmd LC_SEGMENT
cmdsize 56
segname __PAGEZERO
vmaddr 000000000
vmsize 000001000
fileoff 0
filesize 0
maxprot 000000000
initprot 000000000
nsects 0
flags 00
Load command 1
cmd LC_SEGMENT
cmdsize 464
segname __TEXT
vmaddr 000001000
vmsize 000002000
fileoff 0
filesize 8192
maxprot 000000007
initprot 000000005
nsects 6
flags 00
先看一下加载命令定义:
[codesyntax lang="c" lines="fancy"]
struct load_command {
uint32_t cmd;
/* type of load command */
uint32_t cmdsize;
/* total size of command in bytes */
};
[/codesyntax]cmd是一个字符串常量,用来指示命令类型。对于每一种命令类型都有一个专有的结构体。具体的加载命令类型可以参考/usr/include/mach-o/loader.h
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-42605-2.html
方便面是人家日本人发明的