什么是Link Map File

Link Map File中文直译为链接映射文件,它是在Xcode生成可执行文件的同时生成的链接信息文件,用于描述可执行文件的构造部分,包括了代码段和数据段的分布情况。Xcode在生成可执行文件的时候默认情况下不生成该文件,需要开发者手动设置Target --> Build Setting --> Write Link Map File为YES:



这里还可以设置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的组成

打开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
. . .

在使用linkmap计算内存占比的时候,不要把Dead Stripped Symbols计算在内,因为它们是链接器认为无用的符号,链接的时候不会记入。

上面便是对Link map file做了简单的介绍。

iOS Tools

花了两天的时间,根据对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

想了解更多可以访问itools

总结

  1. 苹果开发还是有很多细节的东西需要去学习去了解。
  2. 学习一门脚本语言,也会给平时的开发带来很大的方便。

参考

  1. Mach-O可执行文件
  2. iOS调优|深入理解Link Map File
  3. iOS APP可执行文件的组成

转载请注明出处:https://www.cnblogs.com/zhanggui/p/9991455.html

对Link Map File的初步认识的更多相关文章

  1. MAP File

    https://warpproject.org/trac/wiki/howto/Linker_scripts_MAP_files Description A MAP file is an output ...

  2. make&&gcc/g++ 生成 map file

    map file 对于嵌入式开发是非常有用的,尤其是当你开发的module引起了 kernel panic 的时候. 仅写作Mark用 make: $vim makefile (add  " ...

  3. DNS map file in windows

    Edit "C:\WINDOWS\system32\drivers\etc\hosts", add the IP to DNS name mapping.

  4. iOS安装包瘦身的那些事儿

    在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...

  5. iOS APP可执行文件的组成

    iOS APP编译后,除了一些资源文件,剩下的就是一个可执行文件,有时候项目大了,引入的库多了,可执行文件很大,想知道这个可执行文件的构成是怎样,里面的内容都是些什么,哪些库占用空间较高,可以用以下方 ...

  6. 【转】 Xcode基本操作 -- 不错

    原文网址:http://blog.csdn.net/phunxm/article/details/17044337 1.Xcode IDE概览 说明:从左到右,依次是“导航窗格(Navigator)- ...

  7. Xcode编辑器之基本使用(一)

    前言. 苹果原生xcode使用介绍文档 1.Xcode IDE概览 说明: 从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码 ...

  8. iOS代码瘦身实践

    1 分析当前ipa的组成 一般一个ipa会包含: 1) 资源文件 本地文件:数据.配置.数据库等等 字体文件 图片资源 2)  源代码 通过生成linkmap文件,分析源代码生成的编译文件的大小.在B ...

  9. HLS直播技术方案及踩过的坑

    一.为什么是IJKPlayer 在基础技术方面,后端有比較成熟的系统,就不再说了,这里说说client方面. 有直播就会有弹幕.基本上是标配了. 字幕方面bilibili开源了一个Android的项目 ...

随机推荐

  1. Docker 创建 Crowd3.3.2 以及打通 Jira Software7.12.3和Confluence6.12.2 SSO 单点登录

    目录 目录 1.介绍 1.1.什么是Crowd? 2.Crowd 的官网在哪里? 3.如何下载安装? 4.对 Crowd 进行配置 4.1.破解 Crowd 第一步 4.2.破解 Crowd 第二步, ...

  2. Linux记录~持续更新~

    ls -ildha /etc -i 显示对应id号 唯一标识 -l 显示详情 -d 显示当前文件夹 不包括子目录 -h 单位为KB 而不是B -a 显示所有 包括隐藏文件 mkdir mkdir -p ...

  3. Beanstalkd工作队列

    Beanstalkd工作队列Beanstalkd 是什么Beanstalkd是目前一个绝对可靠,易于安装的消息传递服务,主要用例是管理不同部分和工人之间的工作流应用程序的部署通过工作队列和消息堆栈,类 ...

  4. T-SQL语法基础

    一.T-SQL语言的分类 DDL-数据定义语言 create-创建 alter-修改 drop-删除(针对对象) DML-数据操作语言 Insert-插入 update-更新 delete-删除(针对 ...

  5. Spring Boot获取前端页面参数的几种方式总结

    Spring Boot的一个好处就是通过注解可以轻松获取前端页面的参数,之后可以将参数经过一系列处理传送到后台数据库. 获得的方式有很多种,这里稍微总结一下,大致分为以下几种: 1.指定前端url请求 ...

  6. iOS开发之Masonry框架源码解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  7. IIS虚拟目录挂载文件服务器目录

    要求说明: 通过网站上传文件保存到统一的文件服务器上. 服务器说明: 1.文件服务器以下称为FilesServer,IP地址为:192.168.1.213 2.Web服务器为以下称为WebServer ...

  8. Pandas学习笔记

    本学习笔记来自于莫烦Python,原视频链接 一.Pandas基本介绍和使用 Series数据结构:索引在左,值在右 import pandas as pd import numpy as np s ...

  9. 【机器学习】--Python机器学习库之Numpy

    一.前述 NumPy(Numerical Python的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然地使用数组和矩阵. NumPy包含很多实用的数学函数,涵盖线性代数运算.傅 ...

  10. javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)

    接上一篇 面向对象编程的理解? 答:面向对象编程,就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法).这个对象我们称之为类.面向对象编程思想其中一个特点就是封装,就是把你需 ...