对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 . . .
上面便是对Link map file做了简单的介绍。
itools
花了两天的时间,根据对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
想了解更多可以访问https://github.com/ScottZg/itools
总结
- 苹果开发还是有很多细节的东西需要去学习去了解。
- 学习一门脚本语言,也会给平时的开发带来很大的方便。
参考
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2018中高阶Android面试题总结 下(附答案)
1、Activity生命周期? onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy() 2、Service生命周期? service 启动方式有两种,一种是通过startService()方式进行启动,另一种是通过bindService()方式进行启动。不同的启动方式他们的生命周期是不一样. 通过startService()这种方式启动的service,生命周期是这样:调用startService() --> onCreate()--> onStartConmon()--> onDestroy()。这种方式启动的话,需要注意一下几个问题,第一:当我们通过startService被调用以后,多次在调用startService(),onCreate()方法也只会被调用一次,而onStartConmon()会被多次调用当我们调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当我们通过startService...
- 下一篇
Android 应用防止被二次打包指南
“Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包。不管从性能、用户体验、外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不觉中浪费手机电量、流量,恶意扣费、偷窥隐私等等行为。 正文 二次打包问题只是Android应用安全风险中的一部分, 一般是通过反编译工具向应用中插入广告代码与相关配置,再在第三方应用市场、论坛发布。 对于打包党对于移动App带来的危害有以下几种: 1. 插入自己广告或者删除原来广告; 2. 恶意代码, 恶意扣费、木马等; 3. 修改原来支付逻辑。 上述恶意行为严重危害移动产品和用户利益,同时也影响企业口碑。 关于移动App破解、数据泄露风险问题,以金融行业为例:众所周知数据是金融类应用产品重要资源之一,关乎企业生存与发展、但移动应用经常被破解、数据被抓包,导致本地存储数据以及用户名、密码等重要信息泄露。下面举例说明数据泄露案例。 金融类本地存储数据泄漏 数据抓包,泄漏用户名和密码 面对二次打包不少公司都有自己的防范措施,知名公司的APP几乎都是自己在程序内部做过处理防止其APP被二次打包,一旦打...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群