什么是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/LinkMapTestPath是生成可执行文件的路径。
2. Arch
# Arch: x86_64Arch指代架构类型。
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.tbdObject 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输出结果为:
                        
                        
                    