Xcode的linkmap文件分析

Xcode的linkmap文件分析

1. 获得linkmap文件

  在工程中的Build Setting中搜索map,使能Linking下的选项“Write Link Map File”为“Yes”。并在“Path to Link Map File”中设置LinkMap文件的路径,或直接使用默认设置。

2. 找到路径

  编译工程,在工程左侧最底下的Products目录中查看.app文件,右键show in finder。参照以下默认路径,找出xxx-LinkMap-xxx.txt

  /Users/xxxx/Library/Developer/Xcode/DerivedData/project-fftqybbbfgbbhmhfjpzgdschwatw/Build/Intermediates/project.build/Debug/project.build/project-LinkMap-normal-x86_64.txt

3. 分析LinkMap文件

  该LinkMap文件与嵌入式项目中的map文件类似,可用来查看整个内存的分配情况,所有变量的分布等。

  3.1 # Object files: 目标文件列表

    列出.o类型的目标文件

    列出.tbd类型的文件,按照路径来看,是framework和lib类在编译时形成的目标文件;.tbd类型之前没有接触过,需要查一下。

  3.2 # Sections: 段表

    描述各个段在最后编译成的可执行文件中的偏移位置及大小,包括了代码段(__TEXT,保存程序代码段编译后的机器码)和数据段(__DATA,保存变量值)

    # Address     Size         Segment   Section

    0x100001A60   0x00002721   __TEXT    __text

    ......

    ......

    其中,__text表示编译后的程序执行语句,__data表示已初始化的全局变量和局部静态变量,__bss表示未初始化的全局变量和局部静态变量,__cstring表示代码里的字符串常量,等。

  3.3 # Symbols: 符号变量表

    按每个文件列出每个对应字段的位置和占用空间

    # Address     Size       File     Name

    0x100001A60   0x00000060   [ 2]     _hexToDec
    0x100001AC0   0x00000059   [ 2]     _decToHex

    0x100001B20   0x00000046   [ 3]     _main

    0x100001B70   0x000002D0   [ 4]     _testArrayPoint

    ......  // 以上为一些文件的信息

    0x100005A48   0x00000008   [ 4]     _pp
    0x100005A50   0x00000050   [ 4]     _p1

    ......  // 以上为一些变量的信息

    首列是数据在文件的偏移地址,第二列是占用大小,第三列是所属文件序号,对应上述Object files列表,最后是名字。

    例如pp实际为代码中定义的一个指针,该指针地址 = 0x100005A48,对于64bit处理器来说,pp长度即size = 8Byte,所处文件为[4]号,从该段起始处文件信息中可以看出,[4]号文件名 = testArrayPoint。实际该变量也是定义在这个文件中的。

 

4. 总结

  在开发嵌入式项目的经验中,尤其当指针跑飞、异常中断、变量值莫名改变以及代码空间受限时,经常有机会查看map文档,对于调试内存数据类问题非常有用。

  以上为简单的查看Xcode项目的LinkMap文件的方法,与嵌入式项目一样,查看该文档依然有用。

 

posted on 2016-05-25 12:05  Rosa.Bai  阅读(1933)  评论(0)    收藏  举报