對Link Map File的初步認識

来源:https://www.cnblogs.com/zhanggui/archive/2018/11/20/9991455.html
-Advertisement-
Play Games

Link Map File中文直譯為鏈接映射文件,它是在Xcode生成可執行文件的同時生成的鏈接信息文件,用於描述可執行文件的構造部分,包括了代碼段和數據段的分佈情況。 ...


Link Map File中文直譯為鏈接映射文件,它是在Xcode生成可執行文件的同時生成的鏈接信息文件,用於描述可執行文件的構造部分,包括了代碼段和數據段的分佈情況。Xcode在生成可執行文件的時候預設情況下不生成該文件,需要開發者手動設置Target --> Build Setting --> Write Link Map File為YES:
Link Map Setting
這裡還可以設置Link Map存放的位置,預設的位置為:

$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt

例如:

/Users/zhanggui/Library/Developer/Xcode/DerivedData/LinkMapTest-ffnpzjkbsmhwvdcxorqbxpyvjtob/Build/Intermediates.noindex/LinkMapTest.build/Debug-iphonesimulator/LinkMapTest.build/LinkMapTest-LinkMap-normal-x86_64.txt

開發者也可以根據自己的需要自行設置該文件的位置。

打開Link Map File,裡面包含了以下幾個部分:

1. Path

# Path: /Users/zhanggui/Library/Developer/Xcode/DerivedData/LinkMapTest-ffnpzjkbsmhwvdcxorqbxpyvjtob/Build/Products/Debug-iphonesimulator/LinkMapTest.app/LinkMapTest

Path是生成可執行文件的路徑。

2. Arch

# Arch: x86_64

Arch指代架構類型。

3. Object files:

# Object files:
[ 0] linker synthesized
[ 1] /Users/zhanggui/Library/Developer/Xcode/DerivedData/LinkMapTest-ffnpzjkbsmhwvdcxorqbxpyvjtob/Build/Intermediates.noindex/LinkMapTest.build/Debug-iphonesimulator/LinkMapTest.build/LinkMapTest.app-Simulated.xcent
[ 2] /Users/zhanggui/Library/Developer/Xcode/DerivedData/LinkMapTest-ffnpzjkbsmhwvdcxorqbxpyvjtob/Build/Intermediates.noindex/LinkMapTest.build/Debug-iphonesimulator/LinkMapTest.build/Objects-normal/x86_64/ViewController.o
[ 3] /Users/zhanggui/Library/Developer/Xcode/DerivedData/LinkMapTest-ffnpzjkbsmhwvdcxorqbxpyvjtob/Build/Intermediates.noindex/LinkMapTest.build/Debug-iphonesimulator/LinkMapTest.build/Objects-normal/x86_64/main.o
[ 4] /Users/zhanggui/Library/Developer/Xcode/DerivedData/LinkMapTest-ffnpzjkbsmhwvdcxorqbxpyvjtob/Build/Intermediates.noindex/LinkMapTest.build/Debug-iphonesimulator/LinkMapTest.build/Objects-normal/x86_64/AppDelegate.o
[ 5] /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.1.sdk/System/Library/Frameworks//Foundation.framework/Foundation.tbd
[6]/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.1.sdk/usr/lib/libobjc.tbd
[7]/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.1.sdk/System/Library/Frameworks//UIKit.framework/UIKit.tbd

Object Files列舉了可執行文件里所有的obj以及tbd。每一行代表對文件的編號。例如ViewController.o文件,其編號為2。編號的具體作用稍後介紹。

4. Sections

# Sections:
# Address   Size        Segment Section
0x100001730 0x00000333  __TEXT  __text
0x100001A64 0x0000002A  __TEXT  __stubs
0x100001A90 0x00000056  __TEXT  __stub_helper
0x100001AE6 0x00000A27  __TEXT  __objc_methname
0x10000250D 0x0000003C  __TEXT  __objc_classname
0x100002549 0x0000086D  __TEXT  __objc_methtype
0x100002DB6 0x0000007A  __TEXT  __cstring
0x100002E30 0x00000182  __TEXT  __entitlements
0x100002FB4 0x00000048  __TEXT  __unwind_info
0x100003000 0x00000010  __DATA  __nl_symbol_ptr
0x100003010 0x00000010  __DATA  __got
0x100003020 0x00000038  __DATA  __la_symbol_ptr
0x100003058 0x00000010  __DATA  __objc_classlist
0x100003068 0x00000010  __DATA  __objc_protolist
0x100003078 0x00000008  __DATA  __objc_imageinfo
0x100003080 0x00000BE8  __DATA  __objc_const
0x100003C68 0x00000010  __DATA  __objc_selrefs
0x100003C78 0x00000008  __DATA  __objc_classrefs
0x100003C80 0x00000008  __DATA  __objc_superrefs
0x100003C88 0x00000008  __DATA  __objc_ivar
0x100003C90 0x000000A0  __DATA  __objc_data
0x100003D30 0x000000C0  __DATA  __data

單從字面含義理解:每個Section包含了Address、Size、Segment以及Section。介紹之前,這裡先簡單介紹一下Mach-O文件。
上面第一部分的Path是可執行文件的路徑,使用iTerm進去到該文件夾,然後使用file命令即可查看該文件的類型:

file LinkMapTest

輸出結果為:

LinkMapTest: Mach-O 64-bit executable x86_64

可以知道該文件是一個Mach-O格式的文件,它是iOS系統應用執行文件格式。Mach-O文件中的虛擬地址最終會被映射到物理地址上,這些地址會被分為不同的段類型:_ _ TEXT 、_ _ DATA以及_ _ LINKEDIT等。各個段的含義如下:

  1. _ _ TEXT包含了被執行的代碼。這些代碼是只讀、可執行
  2. _ _ DATA包含了包含了將會被更改的數據,例如全局變數、靜態變數等,可讀寫,但是不可執行
  3. _ _ LINKEDIT 包含了載入程式的元數據,比如函數名稱和地址,只讀。

Segment又被劃分成了不同的Section,不同的Section存儲了不同的信息,例如 _ _ objc _ methname 為方法的名稱。
再回顧上面的Sections,Address是起始位置、Size是大小、Segment是段、Section。

5. Symbols

# Address   Size        File  Name
0x100001730 0x0000003C  [  2] -[ViewController viewDidLoad]
0x100001770 0x00000092  [  3] _main
0x100001810 0x00000080  [  4] -[AppDelegate application:didFinishLaunchingWithOptions:]
0x100001890 0x00000040  [  4] -[AppDelegate applicationWillResignActive:]
0x1000018D0 0x00000040  [  4] -[AppDelegate applicationDidEnterBackground:]
0x100001910 0x00000040  [  4] -[AppDelegate applicationWillEnterForeground:]
0x100001950 0x00000040  [  4] -[AppDelegate applicationDidBecomeActive:]
0x100001990 0x00000040  [  4] -[AppDelegate applicationWillTerminate:]
0x1000019D0 0x00000020  [  4] -[AppDelegate window]
0x1000019F0 0x00000040  [  4] -[AppDelegate setWindow:]
0x100001A30 0x00000033  [  4] -[AppDelegate .cxx_destruct]
0x100001A64 0x00000006  [  5] _NSStringFromClass
0x100001A6A 0x00000006  [  7] _UIApplicationMain
0x100001A70 0x00000006  [  6] _objc_autoreleasePoolPop
0x100001A76 0x00000006  [  6] _objc_autoreleasePoolPush
0x100001A7C 0x00000006  [  6] _objc_msgSendSuper2
0x100001A82 0x00000006  [  6] _objc_retainAutoreleasedReturnValue
0x100001A88 0x00000006  [  6] _objc_storeStrong
0x100001A90 0x00000010  [  0] helper helper
0x100001AA0 0x0000000A  [  5] _NSStringFromClass
0x100001AAA 0x0000000A  [  6] _objc_autoreleasePoolPop
0x100001AB4 0x0000000A  [  6] _objc_autoreleasePoolPush
0x100001ABE 0x0000000A  [  6] _objc_msgSendSuper2
0x100001AC8 0x0000000A  [  6] _objc_retainAutoreleasedReturnValue
0x100001AD2 0x0000000A  [  6] _objc_storeStrong
0x100001ADC 0x0000000A  [  7] _UIApplicationMain
0x100001AE6 0x0000000C  [  2] literal string: viewDidLoad
. . .

根據Sections的起始地址,可以將Symbols分為Sections個數的組,例如0x100001730到0x100001A64之間,就是 _ _ test代碼區。
Symbols包含的信息有:

  1. Address:起始地址
  2. Size:所占記憶體大小,這裡使用16進位表示。
  3. File:該Name所在的文件編號,也就是Object files部分的中括弧的數字,例如-[ViewController viewDidLoad]對應的文件編號為2,根據Object files部分可以看到所屬的文件為:ViewController.o。這樣可以計算某個o文件所占記憶體的大小。只需要把Symbols中編號為o編號Symbols累加統計即可。
  4. Name就是該Sybmols的名稱。

6. Dead Stripped Symbols

# Dead Stripped Symbols:
#           Size        File  Name
<<dead>>    0x00000018  [  2] CIE
<<dead>>    0x00000018  [  3] CIE
<<dead>>    0x00000006  [  4] literal string: class
<<dead>>    0x00000008  [  4] literal string: v16@0:8
<<dead>>    0x00000018  [  4] CIE
. . .

上面便是對Link map file做了簡單的介紹。

ZLinkMapParser

花了兩天的時間,根據對Link Map File的學習,使用Ruby寫了一個腳本文件,可以方便地統計出指定Link Map File中的組件或者tbd占用記憶體大小,類似:

AppDelegate.o          8.50KB
ViewController.o          735B
LinkMapDemo.app-Simulated.xcent          386B
main.o          192B
 linker synthesized          128B
libobjc.tbd          120B
Foundation.tbd          24B
UIKit.tbd          24B
總大小為(僅供參考):10.07KB

想瞭解更多可以訪問ZLinkMapParser

總結

  1. 蘋果開發還是有很多細節的東西需要去學習去瞭解。
  2. 學習一門腳本語言,也會給平時的開髮帶來很大的方便。

參考

  1. Mach-O可執行文件
  2. iOS調優|深入理解Link Map File
  3. iOS APP可執行文件的組成

轉載請註明出處:https://www.cnblogs.com/zhanggui/p/9991455.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 創建位置表,並且插入測試數據 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 80011 Source Host : localhost:3306 Source Database : t ...
  • DDL Data Definition(重點) (n. 定義;[物] 清晰度;解說)用於定義數據的結構,創建,修改,刪除資料庫對象 一、表的增刪改查 1、創建表:CREATE TABLE temp AS (SELECT * FROM emp WHERE 1==2) 創建表結構。 CREATE TAB ...
  • 一、SQL的多表查詢: 1、左連接和右連接(不重要一方加(+)) SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno(+)=d.deptno ; (+)在等號左邊是右連接,反之左連接。 2、交叉 ...
  • memcached(1)簡介及環境安裝 author:SimpleWu 簡介 Memcached是一個自由開源的, 高性能 , 分散式 記憶體對象緩存系統。 Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric為首開發的一款軟體。現在已 ...
  • 一. 集合對象概述 這裡的集合是string類型的無序集合,在集合對象中集合成員是唯一的,這就意味著集合中不能出現重覆的數據。集合是通過哈希表實現的,集合中最大的成員數為 232-1 (4294967295, 每個集合可存儲40多億個成員)。集合對象的編碼可以是intset或者hashtable。 ...
  • plist關鍵欄位: CFBundleIdentifier:應用包名、唯一標識 CFBundleVersion:文件版本號,可以每次發版本遞增 CFBundleShortVersionString:appstore顯示版本號,每次app store發版遞增 CFBundleName:預設設置是等同於 ...
  • iOS 用KVC設置結構體 在Fundation中KVC提供的鍵值路徑只能訪問對象,不能訪問結構體。這很不面向對象。 執行下麵的語句將會報錯: 實現這個功能是很簡單的:首先NSValue的結構體信息,然後拿到關於這個結構體如何取值和賦值的信息。有了這兩條信息就可以了。 最方便的數據結構就是字典,Ke ...
  • 在最近主導的一個項目中,App端的實現使用了weex。通過近一個月的實踐,我們發現如果對於人機交互較少的App,即使較少前端經驗的人也能迅速進入開發(當然需要一定時間 才能上手weex)。在開發的時候,我們使用了weex-ui庫,但也發現其中有一些控制項沒有實現,如UISegmentControl。於 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...