编译二进制文件说明
如何生成
使用Xcode进行编译 ,会生成二进制相关文件,可以更详细看产物的布局
项目Target -> Build Setting -> Linking Genera -> Write Link Map = YES
文件路径
执行上述操作后,Command+B
后,会生成二进制的产物,(我的项目名为TYPlayground),其大致路径为(如下图):
/Users/xxx/Library/Developer/Xcode/DerivedData/TYPalyground-doefpfbhcehqtqexpxoqzqpabkvm/Build/Intermediates.noindex/TYPalyground.build/Debug-iphonesimulator/TYPalyground.build/
文件说明
TYPalyground-LinkMap-normal-x86_64.txt
显示了link的详细信息
第一部分:.o文件
展示编译后的.o文件,(下图中的3-10行)
第二部分:link
展示需要链接的Framework,(下图中的11-17行)
第三部分:Segment
Sections 区域
这个区域提供了各个段(Segment)和节(Section)在可执行文件中的位置和大小。这个区域完整的描述可执行文件中的全部内容。
Address + Size + 1 = 下一个section的起始地址
其中,段分为两种
__TEXT
代码段__DATA
数据段
TEXT
# Sections:
# Address Size Segment Section
0x100001330 0x00001A7A __TEXT __text // 代码
0x100002DAA 0x00000084 __TEXT __stubs
0x100002E30 0x00000028 __TEXT __const
0x100002E58 0x00001216 __TEXT __objc_methname // OC 方法
0x10000406E 0x000000D8 __TEXT __cstring // 字符串
0x100004146 0x000000D4 __TEXT __objc_classname // OC 类名
0x10000421A 0x00000B88 __TEXT __objc_methtype // OC 方法类型
0x100004DA4 0x0000008C __TEXT __gcc_except_tab
0x100004E30 0x00000111 __TEXT __entitlements
0x100004F41 0x00000042 __TEXT __ents_der
0x100004F84 0x00000070 __TEXT __unwind_info
0x100005000 0x000000D0 __DATA_CONST __got
0x1000050D0 0x00000040 __DATA_CONST __const // 常量
0x100005110 0x000000C0 __DATA_CONST __cfstring
0x1000051D0 0x00000038 __DATA_CONST __objc_classlist // OC 方法列表
0x100005208 0x00000010 __DATA_CONST __objc_nlclslist
0x100005218 0x00000028 __DATA_CONST __objc_protolist // OC 协议列表
0x100005240 0x00000008 __DATA_CONST __objc_imageinfo
0x100005248 0x00000068 __DATA_CONST __objc_classrefs
0x100006000 0x000016D8 __DATA __objc_const // OC 常量
0x1000076D8 0x00000180 __DATA __objc_selrefs
0x100007858 0x00000008 __DATA __objc_protorefs
0x100007860 0x00000018 __DATA __objc_superrefs // OC 父类引用
0x100007878 0x00000020 __DATA __objc_ivar // OC iar
0x100007898 0x00000230 __DATA __objc_data
0x100007AC8 0x000001E0 __DATA __data
0x100007CA8 0x00000010 __DATA __bss
第四部分:Symbol
上一部分是对Segment进行了一级划分,分出了Section
这一部分是对Section进一步划分,分出Symbol。
可以看到 +[TestViewController load]
的起始地址和上面__TEXT __text // 代码
的地址是一致的,以此类推,可以获取上面各个节的信息。
# Symbols:
# Address Size File Name
0x100001330 0x00000060 [ 3] +[TestViewController load]
0x100001390 0x00000090 [ 3] -[TestViewController init]
0x100001420 0x000001C0 [ 3] -[TestViewController viewDidLoad]