9、MachO简介

news/2025/3/16 0:48:11/

一、MachO文件

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

二、MachO文件结构

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

2.1 属于MachO格式的常见文件

    • 目标文件 .o
    • 库文件
      • .a
      • .dylib
      • Framework
    • 可执行文件
    • dyld
    • .dsym
  • File指令
    • 通过 $file 文件路径 查看文件类型

2.2 通用二进制文件(Universal binary)

  • 苹果公司提出的一种程序代码.能同时适用多种架构的二进制文件
  • 同一个程序包中同时为多种架构提供最理想的性能
  • 因为需要存储多种代码,通用二进制应用程序通常比单一平台二进制的程序更大.
  • 但是 由于两种架构有共通的非执行资源(代码以外的),所以并不会达到单一版本的两倍之多.
  • 而且由于执行中只调用一部分代码,运行起来也不需要额外的内存.

2.3 lipo命令

  • 使用lipo -info 可以查看MachO文件包含的架构
    • lipo -info MachO文件
  • 使用 lipo -thin 拆分某种架构
    • lipo MachO文件 -thin架构 -output输出文件路径
  • 使用lipo -create 合并多种架构
    • lipo -create MachO1 MachO2 -output 输出文件路径

2.4 MachO文件结构

MachO的组成结构如图所示包括了

  • Header : 包含二进制文件的一般信息
    • 字节顺序、架构类型、加载指令的数量等
    • 使得可以快速确认一些信息,比如当前文件用于32位还是64位,对应的处理器是什么、文件类型是什么.
  • Load Commands 一张包含很多内容的表
    • 内容包括区域的位置、符号表、动态符号表等.
  • Data通常是MachO文件中最大的部分
    • 包含Segment的具体数据

2.4.1 Header的数据结构

#import <mach-o/loader.h>
/** The 64-bit mach header appears at the very beginning of object files for* 64-bit architectures.*/
struct mach_header_64 {uint32_t    magic;        /* mach magic number identifier */int32_t        cputype;    /* cpu specifier */int32_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 */
};
  • magic: 魔数,快速定位属于64还是32位
  • cputype: CPU类型,比如ARM
  • cpusubtype: CPU的具体类型 arm64/ armv7
  • filetype: 文件类型,比如可执行文件
  • ncmds: loadCommands条数
  • sizeofcmds LoadCommands的大小
  • flags 标志位标识二进制文件支持的功能. 主要是和系统加载、链接有关
  • reserved 保留字段

2.4.2 虚拟内存

VM Addr : 虚拟内存地址

VM Size: 虚拟内存大小

File offset: 数据在文件中偏移量

File size: 数据在文件中的大小

2.4.3 LoadCommands

LC_SEGMENT_64

将文件中(32位或64位)的段映射到进程地址空间中

LC_DYLD_INFO_ONLY

动态链接相关信息

LC_SYMTAB

符号地址

LC_DYSYMTAB

动态符号表地址

LC_LOAD_DYLINKER

使用谁加载,我们使用dyld

LC_UUID

文件的UUID

LC_VERSION_MIN_MACOSX

支持最低的操作系统版本

LC_SOURCE_VERSION

源代码版本

LC_MAIN

设置程序主线程的入口地址和栈大小

LC_LOAD_DYLIB

依赖库的路径,包含三方库

LC_FUNCTION_STARTS

函数起始地址表

LC_CODE_SIGANTURE

代码签名

三、DYLD

dyld(the dynamic link editor)是苹果的动态链接器,是苹果操作系统一个重要组成部分,在系统内核做好程序准备工作之后,交由dyld负责余下的工作.

四、总结

  • MachO属于一种文件格式
    • 包含: 可执行文件、静态库、动态库、dyld等等
    • 可执行文件:
      • 通用二进制文件: 集合了多种架构
      • lipo命令
        • -thin拆分架构
        • -create 合并架构
  • MachO结构
    • Header
      • 用于快速确定该文件的CPU类型、文件类型
    • Load Commands
      • 指示加载器如何设置并且加载二进制数据
    • Data
      • 存放数据: 代码、数据、字符串常量、类、方法等等

       


http://www.ppmy.cn/news/48178.html

相关文章

事件处理框架

一、事件处理框架-event_base Reactor模式有几个基础的组件&#xff0c;其中的Reactor框架就是event_base结构体&#xff0c;下面是定义&#xff08;只列出部分常用的成员&#xff09;&#xff0c;如下&#xff1a; struct event_base {/* 后台使用的I/O多路复用机制 */const s…

分享一些提升效率的小工具

1、 IObit Uninstaller IObit Uninstaller是一款简单专业的卸载工具&#xff0c;可以帮我们卸载电脑中顽固难卸的软件和浏览器插件&#xff0c;支持强制一键卸载和文件粉碎功能。 除了卸载软件&#xff0c;它还可以自动帮我们检测软件安装、检测软件更新、查看工具栏和插件。 …

K8S使用持久化卷存储到NFS(NAS盘)

参考文章&#xff1a;K8S-v1.20中使用PVC持久卷 - 知乎 目录 1、概念&#xff1a; 1.1 基础概念 1.2 PV的配置 1.2.1 静态PV配置 1.2.2 动态PV配置 1.2.3 PVC与PV的绑定 1.2.4 PVC及PV的使用 2 部署PV及PVC 2.1 所有K8S机器都需要安装NFS程序 2.2 仅针对需要暴露文件…

yara规则--编写

编写 YARA 规则 — yara 4.2.0 文档 YARA规则易于编写和理解&#xff0c;并且它们的语法是 类似于 C 语言。这是您可以编写的最简单的规则 YARA&#xff0c;它什么都不做&#xff1a; rule dummy {condition:false } 一、规则标识符 每个规则都以关键字“ rule”开头&#xff0…

如何处理嵌入式中程序错误

一、错误概念 1.1 错误分类 从严重性而言&#xff0c;程序错误可分为致命性和非致命性两类。对于致命性错误&#xff0c;无法执行恢复动作&#xff0c;最多只能在用户屏幕上打印出错消息或将其写入日志文件&#xff0c;然后终止程序&#xff1b;而对于非致命性错误&#xff0…

近期遇到的vscode 插件开发的问题,when表达式,正则匹配路径

前言 最近在修改dbt插件的时候&#xff0c;遇到了几个比较奇怪的问题&#xff0c;猜测应该是因为跟新了VSCode导致的。 这里稍微记录一下&#xff0c;如果能帮助其他的同学&#xff0c;那就太值啦。 when 正则表达式 之前有在packgae.json 中使用 when 的正则表达式&#xf…

flask-restful 和 blueprint

flask-restful 使用 flask-restful第三方库 from flask_restful import Resource, Api app Flask(__name__) api Api(app) class HelloWorldResource(Resource): def get(self): return {hello:world} def post(self): return {msg&#xff1a;‘post hello wolrd’} api…

非关系型数据库---Redis安装与基本使用

一、数据库类型 关系数据库管理系统(RDBMS)非关系数据库管理系统(NoSQL) 按照预先设置的组织机构&#xff0c;将数据存储在物理介质上(即&#xff1a;硬盘上) 数据之间可以做无关联操作 (例如: 多表查询&#xff0c;嵌套查询&#xff0c;外键等) 主流的RDBMS软件&#xff1a;My…