Mach-O文件格式

本文详细介绍了Mach-O文件格式,从一个简单的程序出发,解析了Mach64 Header、Load Commands、segment load command、section等核心概念,以及可执行文件执行的主要步骤。通过Mach-O Viewer分析了hello world程序的结构,并解释了动态链接、地址无关性等关键特性。
摘要由CSDN通过智能技术生成

一个简单的程序

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}

对 mach-o 的分析从这个简单的 小程序开始

可执行文件的结构

我们用 MachOView 打开我们刚刚写了 hello world 小程序,会看到如下结构
这里写图片描述
下面部分会分析各个结构的内容和作用

Mach64 Header

其在内存中的结构如下

struct mach_header_64 {
    uint32_t    magic;        /* mach magic number identifier */
    cpu_type_t    cputype;    /* cpu specifier */
    cpu_subtype_t    cpusubtype;    /* machine specifier */
    uint32_t    filetype;    /* type of file */
    uint32_t    ncmds;        /* number of load commands */
    uint32_t    sizeofcmds;    /* the size of all the load commands */
    uint32_t    flags;        /* flags */
    uint32_t    reserved;    /* reserved */
};

1.magic:魔数,用来标识 Mach-o 的平台属性的,确认文件的类型。操作系统在加载时会,确定魔数是否正确,不正确会被拒绝加载
2.cpusubtype:给出 cpu 类型
3.filetype:该文件的类型,比如MH_EXECUTE,代表可执行文件,MH_DYLINKER,表明该文件是动态链接器程序文件。等
4.ncmds:load commands 的个数
5.flag:标记该文件目前的状态信息,比如MH_NOUNDEFS:表明该文件里没有未定义的符号引用,MH_DYLDLINK:表明该文件,已经完成了静态链接,不能再次被静态链接。

Load Commands

其在内存中的结构为:

struct load_command {
    uint32_t cmd;        /* type of load command */
    uint32_t cmdsize;    /* total size of command in bytes */
};

该结构是其具体加载内容的部分内存结构
1.cmd:具体的加载类型,比如:
LC_SEGMENT:表明下面加载 segment 部分,该部分是可以被加载到内存中,被页表项映射的内容。
LC_SYMSEG:符号表信息,符号表中详细说明了代码中所用符号的信息等
2.cmdsize:具体的load_command结构所占内存的大小。

The segment load command

Mach-O可执行文件,把一个或者多个属性相似的 section 合并成一个 segment,在装载的时候就可以把他们看成整体进行映射(分页),这样可以减少页内碎片。操作系统是按 segment 进行行映射的。另外,segment 的对其属性取决于section 中最大的对其属性值。

struct segment_command { /* for 32-bit architectures */
    uint32_t    cmd;        /* LC_SEGMENT */
    uint32_t    cmdsize;    /* includes sizeof section structs */
    char        segname[16];    /* segment name */
    uint
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值