对Link Map File的初步认识
什么是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等。各个段的含义如下:
- _ _ TEXT包含了被执行的代码。这些代码是只读、可执行
- _ _ DATA包含了包含了将会被更改的数据,例如全局变量、静态变量等,可读写,但是不可执行
- _ _ 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包含的信息有:
- Address:起始地址
- Size:所占内存大小,这里使用16进制表示。
- File:该Name所在的文件编号,也就是Object files部分的中括号的数字,例如-[ViewController viewDidLoad]对应的文件编号为2,根据Object files部分可以看到所属的文件为:ViewController.o。这样可以计算某个o文件所占内存的大小。只需要把Symbols中编号为o编号Symbols累加统计即可。
- 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
总结
- 苹果开发还是有很多细节的东西需要去学习去了解。
- 学习一门脚本语言,也会给平时的开发带来很大的方便。
参考
转载请注明出处:https://www.cnblogs.com/zhanggui/p/9991455.html
对Link Map File的初步认识的更多相关文章
- MAP File
https://warpproject.org/trac/wiki/howto/Linker_scripts_MAP_files Description A MAP file is an output ...
- make&&gcc/g++ 生成 map file
map file 对于嵌入式开发是非常有用的,尤其是当你开发的module引起了 kernel panic 的时候. 仅写作Mark用 make: $vim makefile (add " ...
- DNS map file in windows
Edit "C:\WINDOWS\system32\drivers\etc\hosts", add the IP to DNS name mapping.
- iOS安装包瘦身的那些事儿
在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...
- iOS APP可执行文件的组成
iOS APP编译后,除了一些资源文件,剩下的就是一个可执行文件,有时候项目大了,引入的库多了,可执行文件很大,想知道这个可执行文件的构成是怎样,里面的内容都是些什么,哪些库占用空间较高,可以用以下方 ...
- 【转】 Xcode基本操作 -- 不错
原文网址:http://blog.csdn.net/phunxm/article/details/17044337 1.Xcode IDE概览 说明:从左到右,依次是“导航窗格(Navigator)- ...
- Xcode编辑器之基本使用(一)
前言. 苹果原生xcode使用介绍文档 1.Xcode IDE概览 说明: 从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码 ...
- iOS代码瘦身实践
1 分析当前ipa的组成 一般一个ipa会包含: 1) 资源文件 本地文件:数据.配置.数据库等等 字体文件 图片资源 2) 源代码 通过生成linkmap文件,分析源代码生成的编译文件的大小.在B ...
- HLS直播技术方案及踩过的坑
一.为什么是IJKPlayer 在基础技术方面,后端有比較成熟的系统,就不再说了,这里说说client方面. 有直播就会有弹幕.基本上是标配了. 字幕方面bilibili开源了一个Android的项目 ...
随机推荐
- Storm入门(十)Twitter Storm: Transactional Topolgoy简介
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/736/twitter-stor ...
- Video/Audio禁止快进(退)
首先接着上个随笔.上个随笔主要介绍了视频音频的相关操作.属性和方法.这里主要记录一个应用:禁止快进(快退同理). 思路:监听快进事件(此处是监听播放时间更新),利用一个缓存的时间和播放到的时间进行对比 ...
- 最短路问题之Dijkstra算法
题目: 在上一篇博客的基础上,这是另一种方法求最短路径的问题. Dijkstra(迪杰斯特拉)算法:找到最短距离已经确定的点,从它出发更新相邻顶点的最短距离.此后不再关心前面已经确定的“最短距离已经确 ...
- 年轻的工程师如何月入伍万XD
郑昀:你要跟谁比?关键词:成长,自我管理,自我激励,面试,候选人201806 ——你觉得跟你的 Leader 差在什么地方?——肯定有差距,一个是知识面不如他广,二一个是解决问题不如他老练.——怎么追 ...
- 网络协议 19 - RPC协议综述:远在天边近在眼前
[前五篇]系列文章传送门: 网络协议 14 - 流媒体协议:要说爱你不容易 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - DNS 协议:网络世界的地址簿 网络协议 17 - HT ...
- go get golang.org被墙问题解决
go get golang.org被墙问题解决 今天在下载golang.org/x/image/tiff的时候出错 > go get -v golang.org/x/image/tiff Fet ...
- 【Android Studio安装部署系列】三十七、从Android Studio3.2升级到Android Studio3.4【以及创建Android Q模拟器】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 保持Android Studio开发环境的最新版本. 下载Android Studio3.4 使用Android Studio自带的 ...
- Python3+unitest自动化测试初探(中篇)
目录 6.生成测试报告 7.编写邮件发送工具 8.发送邮件 发布 0 86 编辑 删除 Python3+unitest自动化测试初探(中篇)(2019-04-18 01:41) 发布 3 245 编辑 ...
- word中如何只修改英文的颜色
替换->更多->使用通配符,查找[a-zA-Z],替换为^&,字体选红色
- C#语法——await与async的正确打开方式
C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者 ...