码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • iOS开发:Mach-O入门理解


    文章目录

    • 1、目标文件Mach-O
    • 2、常见的Mach-O文件类型
    • 4、在Xcode中查看target的Mach-O类型
    • 4、Mach-O的基本结构
    • 5、如何窥探Mach-O的结构
    • 6、Universal Binary(通用二进制文件)
    • 7、动态加载器dyld与目标文件Mach-O的关系

    1、目标文件Mach-O

    Mach-O:是Mach object的缩写,是Mac\iOS上用于存储程序、库的标准格式。

    属于Mach-O格式的文件类型有:

    #define MH_OBJECT   0x1     /* Target 文件:编译器对源码编译后得到的中间结果 */
    #define MH_EXECUTE  0x2     /* 可执行二进制文件 */
    #define MH_FVMLIB   0x3     /* VM 共享库文件(还不清楚是什么东西) */
    #define MH_CORE     0x4     /* Core 文件,一般在 App Crash 产生 */
    #define MH_PRELOAD  0x5     /* preloaded executable file */
    #define MH_DYLIB    0x6     /* 动态库 */
    #define MH_DYLINKER 0x7     /* 动态连接器 /usr/lib/dyld */
    #define MH_BUNDLE   0x8     /* 非独立的二进制文件,往往通过 gcc-bundle 生成 */
    #define MH_DYLIB_STUB   0x9     /* 静态链接文件(还不清楚是什么东西) */
    #define MH_DSYM     0xa     /* 符号文件以及调试信息,在解析堆栈符号中常用 */
    #define MH_KEXT_BUNDLE  0xb     /* x86_64 内核扩展 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    可以在xnu源码中,可以查看到Mach-O格式的详细定义(https://opensource.apple.com/tarballs/xnu/)

    EXTERNAL_HEADERS/mach-o/fat.h
    EXTERNAL_HEADERS/mach-o/loader.h

    2、常见的Mach-O文件类型

    1、MH_OBJECT

    1、目标文件(.o)
    2、静态库文件(.a),静态库其实就是N个.o合并在一起的

    2、MH_EXECUTE:可执行文件

    .app/xx

    3、MH_DYLIB:动态库文件

    .dylib
    .framework/xx

    4、MH_DYLINKER:动态链接编辑器

    /usr/lib/dyld

    5、MH_DSYM:存储着二进制文件符号信息的文件

    .dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩溃信息)

    .o文件编译生成的流程:
    在这里插入图片描述

    4、在Xcode中查看target的Mach-O类型

    在这里插入图片描述

    4、Mach-O的基本结构

    官方描述
    https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html

    一个Mach-O文件包含3个主要区域:
    1、Header :保存文件的基本信息,如文件类型、CPU架构信息、加载命令个数等。
    2、Load commands:根据这里的数据确定内存分布(本身不包含数据,类似于一个指针)。
    3、Raw segment data:存放具体的代码和数据,是Mach-O文件真正的内容数据。

    在这里插入图片描述

    5、如何窥探Mach-O的结构

    一、命令行工具:
    1、file:查看Mach-O的文件类型

    file  文件路径
    
    • 1

    2、otool:查看Mach-O特定部分和段的内容

    3、lipo:常用于多架构Mach-O文件的处理
    3.1、查看架构信息:lipo -info 文件路径
    3.2、导出某种特定架构:lipo 文件路径 -thin 架构类型 -output 输出文件路径
    3.3、合并多种架构:lipo 文件路径1 文件路径2 -output 输出文件路径

    二、GUI工具
    MachOView(https://github.com/gdbinit/MachOView)

    6、Universal Binary(通用二进制文件)

    通用二进制文件

    同时适用于多种架构的二进制文件
    包含了多种不同架构的独立的二进制文件

    二进制文件特点:
    1、因为需要储存多种架构的代码,通用二进制文件通常比单一平台二进制的程序要大。
    2、由于两种架构有共同的一些资源,所以并不会达到单一版本的两倍之多。
    3、由于执行过程中,只调用一部分代码,运行起来也不需要额外的内存。
    4、因为文件比原来的要大,也被称为“胖二进制文件”(Fat Binary)。

    7、动态加载器dyld与目标文件Mach-O的关系

    1、动态加载器dyld可用于加载以下类型的Mach-O文件

    MH_EXECUTE
    MH_DYLIB
    MH_BUNDLE

    2、APP的可执行文件、动态库都是由dyld负责加载的。

  • 相关阅读:
    【2023最新版】DataGrip使用MySQL教程
    qt 关于自定义控件,然后其他页面提升后背景样式表不生效问题
    汪子熙趣味成语接龙的游戏软件使用文档说明
    WSL2最佳实践,淘汰难用的Xshell和Finalshell
    【lwip】09-IPv4协议&超全源码实现分析
    如何不编写 YAML 管理 Kubernetes 应用?
    基于NodeJs+MySQL+Vue的小区物业管理信息系统
    Doris 2.0.1 DockerFile版 升级实战
    软件工程与计算总结(四)项目管理基础
    【Linux】Vim
  • 原文地址:https://blog.csdn.net/weixin_38633659/article/details/125432846
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号