MachO 文件簡介

1、Mach-O文件概述

  • Mach-O實際上是Mach Object文件格式的縮寫,是mac以及iOS上可執行文件的格式, 相似於windows上的PE格式 (Portable Executable ), linux上的elf格式 (Executable and Linking Format);它是一種用於可執行文件、目標代碼、動態庫的文件格式。做爲a.out格式的替代,Mach-O提供了更強的擴展性。
  • 屬於MachO格式的常見文件
    • File指令-----經過 $file 文件路徑 查看文件類型
    • 1.目標文件.o
      • clang -o 生成文件名 文件1 文件2 ,eg:clang -o demo test1 test2 直接生成MachO可執行文件,可拆分兩步:(編譯和鏈接
        • a.clang -c 文件1 文件2 ,eg:clang -c test1 test2 多個源文件編譯生成多個.o目標文件;
        • b.clang -o 生成文件名 文件1 文件2, eg:clang -o demo test1.o test2.o 多個.o目標文件,鏈接成一個MachO可執行文件;
    • 2.庫文件
      • .a
        • 查找.a的庫 $find / -name "*.a"
      • .dylib
        • 查找.dylib的庫 $find / -name "*.dylib"
      • Framework
    • 3.可執行文件
      • dyld ------ 動態鏈接器 dynamic linker
      • .dsym ------ 符號表 ,release 版本生成項目名.app.dSYM文件夾,路徑../Contents/Resources/DWARF中生成 Mach-O dSYM companion file 格式的文件,是該項目的符號表;

2、可執行文件 MachO

  • 一、MachO文件的架構
    • 在Xcode中查看target的Mach-O類型
    • debug模式下只會生成一種架構;
    • release模式下當適配系統爲iOS11如下時,會有多種架構;
  • 二、能夠設置編譯出不一樣架構
    • 1.須要支持的架構能夠在Architectures中添加;
    • 2.Build Active Architecture Only調試時能夠設置debug模式下爲Yes,只編譯出一種架構;若發佈debug包供測試時,可設置爲NO;release 模式須要支持多種架構;
  • 三、universal/Fat binary(通用二進制文件)
    • 蘋果公司提出的一種程序代碼。能同時適用多種架構的二進制文件,同一個程序包中同時爲多種架構提供最理想的性能。由於須要儲存多種代碼,通用二進制應用程序一般比單一平臺二進制的程序要大。可是因爲兩種架構有共同的非執行資源,因此並不會達到單一版本的兩倍之多。並且因爲執行中只調用一部分代碼,運行起來也不須要額外的內存。
    • 1.使用lifo -info 能夠查看MachO文件包含的架構 $lipo -info MachO文件名
    • 2.使用lifo –thin 拆分某種架構 $lipo MachO文件名 -thin 架構名 -output 輸出文件名稱
    • 3.使用lipo -create 合併多種架構 $lipo -create MachO1 MachO2 -output 輸出文件路徑

3、MachO文件結構

蘋果官方圖片

  • 一、Mach-O 的組成結構如圖所示包括了:
    • 1.Header 包含該二進制文件的通常信息(至關於一本書的序言)
      • 字節順序、架構類型、加載指令的數量等。
      • 使得能夠快速確認一些信息,好比當前文件用於32位仍是64位,對應的處理器是什麼、文件類型是什麼
    • 2.Load commands 一張包含不少內容的表(至關於一本書的目錄)
      • 內容包括區域的位置、符號表、動態符號表等。
    • 3.Data 一般是對象文件中最大的部分(至關於一本書的內容)
      • 包含Segement的具體數據
  • 二、universal/Fat binary(通用二進制文件)的MachO文件——多個MachO文件疊在一塊兒;
    • Fat Headers 中包含全部的架構信息,利用otool -f 文件名能夠查看全部架構,如圖:
    • 用可視化工具MachOView查看,如圖:
  • 三、Header的數據結構

  • 四、LoadCommands 數據結構和意義

  • 五、Data 段數據結構

相關文章
相關標籤/搜索