下载  >  开发技术  >  C  > MAP 文件认识初步

MAP 文件认识初步 评分

主要介绍了基于 ARM 核微处理器工程编译连接生成的 MAP 文件 结构、内容,简单分析工程各组成元素和生成的映象文件之间的关系。通过实际例子 分析说明 MAP 文件,并浅谈 MAP 文件对编写代码的作用,认识怎样编写嵌入式系统软件。
Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. Emaileelyz@hotmail.com 、MAP文件生成 MAP文件由连接器 armlink生成,完整的 armlink命令语法如下: armlink [-help][-vsn][-partial][-output file][-elf] [-reloc][-ro- base address][-ropil L-rw-base address[-rwpi]L-split] I-scatter file][-debug -nodebugl[ -remove?RO/RW/ZI/DBGJ-noremove][-entry location [-keep section-id][first section-id][-last section- id] [-libpath pathlist][-scanlibl-noscanlib [-locals-nolocals][-callgraph][-info topics][-map][-symbols][-symdefs file][-edit file [-xref [-xreffrom object(section)][-xrefto object(section)][-errors file][-list file][-verbose [-unmangled | -mangled] [-match crossmangled][-via file][-strict] 为了使生成的MAP文件信息丰富,便于嵌入式软件开发管理人员分析研究整 个工程的代码质量和代码效率,在生成MAP文件时除根据系统需要选择必要参数 外还应选择以下几个参数 1.-map:此选项创建映像文件的信息图。映像文件信息图一般包括映像文件屮的 母个加载域,运行域和输入段的大小和地址,这里的输入段还包括调试信息和连接 器产生的输入段。 2.- list file:此选项将-info,-map,- symbols,-xref,- xreffrom和- xrefto这几个选 项的输出重新定向到文件fle中。这个定向的文件就是本文所指的MAP文件。 3.- info topics:此选项打印出关于指定种类的信息,这里的参数 topICS是指川逗号 间隔的类型标识符列表。类型标识符列表可以是下面所列出的仁意一个 (1) Sizes-为在映像文件中的每一个输入对象和库成员列出了代码和数据(这里 的数据包括,RO数据,RW数据,Z数据和 Debug数据)的大小; (2) totals-为输入对象文件和库,列出代码和数据(这里的数据包括,RO数 据,RW数据,ZⅠ数据和 Debug数据)总的大小; (3) unused-列出由于使用- remove选项而从映像文件中被删除的所有未使用段 生成MAP文件时最后包括以上参个类型标识符列表,在分析MAP文件时候比较常 用到,格式为- info sizes- info totals- info unused,或 -info totals, Sizes, unused 4.- symbols:此选项列出了连接的时候使用的每一个局部和全局符号该符号,还包 拈连接生成的符号。 版权作者所有,欢迎转载 Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. emaileelyz@hotmail.com 5. remove(RORW/ ZIDBG:使用这个选项会将在输入段未使用的段从映像文件 中删除。如果输入段中含冇映像文件入口点或者该输入段被一个使用的段所引用, 则这样的输入段会当作已使用的段。在使用这个选项吋候要注意,不要刖除异常处 理函数。使用-kccp选项来标识异常处理函数,或用 ENTRY伪指令标眀是入口。可 以使用以下的段属性限制符: RO一删除所有未使用的RO属性的段; RW一删除所有未使用的RW属性的段 ZI一删除所有未使用的Z属性的段; DBG一删除所有未使用的 DEBUC属性的段 注意:此选项并非生成MAP文件必须项,选择此项的目的是统计真止连接到 目标时哪些段是无用的段,便于系统工程师或软件设计人员分析。一般嵌入式系统 选项是- remove(RO/RW/ ZIDBG),ADS默认也是如此。 有时为了看MAP文件清晰方便可以选择- nodebug,即在输出文件中不包含调 试信息,但是注意不能进行源码级的调试。 其他一些 armlink参数本文不再说明,请读者参阅相关的文献资料。 二、MAP文件结构与内容 在使用连接器时,如果使用了上述的参数选项就会生成一个统计信息的MAP 文件,文件结构和內容取决于所用的参数 这里首先把前面提到的一些概念做一下对应,即对号入座 CODE是 RO-CODE同义词,也是text同义词,反之亦然: CONST是RO-DATA同义词,也是. constata同义词,反之亦然 DATA是 RW-DATA同义词,也是data同义词,反之亦然 ZI是.bss的同义词,反之亦然 如果上述5个参数在连接的时候都使用的话,那一个MAP文件包括以五部分 内容 从映象文件屮删除的输入段屮未使用的段的统计信息 对应参数- - remove(RO/ RWIZIDBG),示例如下: Removing unused input sections from the image. Removing fs.0(,text),(40 bytes)∥删除未用代码 Removing fs.0( constata),(350 bytes)删除未用只读数据 Removing fs.o(data),(42 bytes)/删除未用有初值的全局量 版权作者所有,欢迎转载 Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. Emaileelyz@hotmail.com Removing fs.0(bs9,(12 bytes)./删除未用无初值的全局量 x unused section(s)( otal xxxx bytes) removed from the image.∥总数删除统计 2.域符号映射和仝局,局部符号及生成符号映射统计信息 对应参数 -symbols,示例如下: Image symbol Table Mapping Symbols,/域空间地址映射(可以看出域空间使用情况) Local Symbols 符号名 地址值符号类型大小所在对象(段)名 Symbol name value Ov Type Size Object (Section) g u32sFSName Ox00007ldc Data 48 fso(data) g fLag 0x02029c1cD fs o(bss) fsPeekaddr 0X00002410 Arm Code 128 fs o(text) g SymbolMap 0x0002010Data 8 fs ol constata) 小技巧:一般可以通过查阅一些全局变量的大小可以看出每个开发人员负责文 件的RAM资源占用情况(以笔者看来,单个全局量空间占用在100byte.多需要审 查,对于RW-DATA(MAP文件表现为data)则要求更高些);可以通过查阅文件 函数大小可以看出开发人员所写的代码量(ROM占用情况),可以提示开发人员 控制函数大小。MAP文件中每个函数都会分配一个地址值,因此在产生异常中断 时可以通过查中断前模式的LR(R14)值来确定产生异常中断的函数和位置。 需要提刭的是,多数的嵌入式操作系统通过定义全局变量来川于动态申请内存 (堆)、进程栈空间和模式栈空间,所以通过此文件也可以看出栈和堆的定义大 小 3.映像文件的信息图 对应参数map,信息中含冇映像文件信息图一般包括映像文件中的每个加载 域,运行域和输入段的大小和地址,这里的输入段还包括调试信息和连接器产生的 输入段,此部分内容依赖于 scatter file文件。示例如下 Memory Map of the image Image Entry point 0x24000000 Load Region FlasH Base: 0x24000000, Size: 0x00003f80, Max: Ox04000000 ABSOLUTE) Execution Region FLASH Base: 0x24000000, Size: 0x00003f24, Max: OX04000000. ABSOLUTE Base Addr Size Type Attr Idx E Section Name Object 版权作者所有,欢迎转载 Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. -6 Emaileelyz@hotmail.com 0x240000000x00000034 Code ro5“Init lit.o Execution Region 32bitRAM Base: 0x00000000, Size: 0x000000e4, Max: Oxffffffff, ABSOLUTE 说明:一个映象文件可以有多个域,每个域在加载时和运行时可以有不同的地 址,每个域可以包括多达3个输出段,具体看设计需要。这部分内容与 scatter file文件 完全对应(如果映象文件屮映射关系比较复杂的话),因此看此部分内容可以和配置 文件联系起来。 在多数ARM核处理器中都有一个内部的RAM,可以通过把一些使用频率非常高 的RO,RW和Ⅰ通过运行域定位到内部RAM里面,通常可以提高系统运行的速度, 原因不言自明。 4.映象文件的每个输入文件或厍的RO,RW,丌等统计信息 对应参数- info sizcs,示例如 Image component sizes Code Ro Data RW Data ZI Data Debug Object Name 52 0 0 0172 init.o Code ro data rw data Zi Data debug library member name 184 0 0 0 memcpy.0 Code ro data RW Data ZI Data Debug Library Name 11492 475 0 96 3900 c a un. 由统计信息可以看到每个文件的资源(ROM和RAM)占用情况,比较快速的 知道哪些文件消耗了系统资源。 5.文件对象类和库总的RO,RW,ZI等大小 对应参数- info totals,示例如下 Image component sizes Code Ro Data RW Data ZI Data Debug 904 76 8 10 7276 Object Totals 14792 475 0 96 5556 Library Totals 版权作者所有,欢迎转载 Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. Emaileelyz@hotmail.com Code RO Data RW Data ZI Data Debug 15696 551 8 106 12832 Grand Totals Total ro Size( code+ ro Data) 16247(1587kB) Total RW size(rw data zI Data) 114(0.11kB) Total rom Size( code+ ro Data+ RW Data) 16255( 15.87kB) 在 SIzes中也已经包括了 totals的内容,但这里更简洁的给岀总的各个对象資源 占用状况。 嵌入式系统资源有限,如RAM和ROM(多为一个 FLASH IO)多容量较小, 所以在资源使用上需要合理的规划。此处总的 RW Size( RDAta+ ZI Data)代表需 要的RAM资源,而总的 ROM Size( code+ RO Data+ RW Data代表所需的ROM资 源,这些都不能超出实际物理芯片的容量,在加入集成第三方软件吋候特别需要考 虑这些 个实例MAP文件分析 为了更好的理解MAP文件的内容,笔者以ADS12自带的一个小例来说明前面所 讲的内容。例子在 ARMADSY12 Examples embedded \embed目录下,是一个嵌入式 系统的例了,笔者把sots.c文件加入到工程中,文件中排序函数由main.c调用,选择 分散加载配置文件为 scat o.scf,RAM/ROM重映射 sorts. c文件也是ADS1.2自带的排序算法文件,为便于分析加了一些代码在里面, 文件内容如下(只列出增加内容,也主要对增加的內容进行分析) include <stdio.h>> Include <stdlib.h> #include <string h> # 1000 char* teststring1="0123456789 abcdefghijklmmopgrstuvwxyz";/因未被调用连接器会删除 char *const teststring2=0123456789abcdefghijklmmopyrstuvwxyz" //FE char* tempstring1口=/指针RW-DATA类型(RAM),数据RO-DATA类型(ROM) DESAPOI const char* const tempstring2口=/指针 RO-DATA类型(ROM),数据 RO-DATA类型 (ROM) DESAPOI const char* tempstring3=/指针RW-DATA类型(RAM),数据 RO-DATA类型(ROM) /因木被调用连接器会删除 "DFSAPOI unsigned intgu32 SESAme;/因未被调用连接器会删除 unsigned char g bFlag;/zl类型 unsigned char g SymbolMap[8];/zⅠ类型 版权作者所有,欢迎转载 Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. Emaileelyz@hotmail.com static void shell sort(char *strings[, int n void insert sort(char *strings, int n) char &v *t: char **strp, **endp; 1 char" xi char *teststringa=0123456789abcdefghijklmmopqrstuvwxyz char a const teststringb=0123456789abcdcfghijklmmopgrstuvwxyz char* tempstring l口=/指针山用栈空间数据占用RO-DATA DESAPOIDESAPOI DESAPOT DFSAPOIDESAPOT DESAPOI' const int arraya[2]={0};/占用栈空间而不是 RO-DATA const char* const tempstring21[-∥/指针占用栈空间数据占用RO-DATA DFSAPOI DFSAPOIIDFSAPO DFSAPOG DFSAPOIOMMDFSA POI g SymbolMap[o]-(unsigned char)g bFlag arraya[oj memcpy(tempstring 1[O], tempstring21[O], sizeof("DFSAPOID) memcpy(tempstringl[O], tempstring 2[0], sizeof("DFSAPOI") shell sort(tempstring 1 1, 5); 对应生成的MAP文件如下 删除的输入段的部分 Removing unused input sections from the image Removing serial o( text),(92 bytes) Removing uart. o( bss), (32 bytes) Removing sorts. o( data), (4 bytes) Removing sorts.o( constata), (37 bytes) Removing sorts. o( constata),(44 bytes) 版权作者所有,欢迎转载 Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. Emaileelyz@hotmail.com Removing sorts. o( data), (4 bytes) Removing sorts. o(. constdata), (8 bytes) Removing sorts. o( bss),(4 bytes) 8 unused section(s)(total 225 bytes )removed from the image. 由以上内容可以看出 sorts. c文件中删除了几个未用的全局变量,上面已有说明, 具体每个的大小与删除的是否一致请大家自己分析 符号映射部分 Mapping Symbols Sym value Execution Region $a0x0000000032 biraM Sd 0x00000054 32bitRAM Sd 0x000000d4 HEAP Sd 0x00040000 STACKS Sa 0x24000000 FLASh Sd 0x24003faO FLASH Local Symbols/只列出 sorts. c文件中增加部分符号块射 Symbol name alue Ov Type Size object(Section) shell sort 0x24000420 ARM Codc 140 sorts.o( text) Insert sort 0x240004ac ARM Code 204 sorts. o( text) tempstring Ox0000005c Data 4 sorts.o(data g fLag 0x00000068Data 1 sorts.o(bss) g SymbolMap 0x00000069Data 8 sorts. o(bss) tempstring 2 Ox24003fa8 Data 4 sorts. o( constata 可以结合c文件中的注释看符号映射部分。在栈上申请的局部变量不会在符号映 射中出现,注意 arraya申请的空间是在栈上,不是在ROM中,不会因为 const属性而 改变,这和 tempstring2有区别。 另:局部变量xlm在函数内没冇使用,编译器编译吋也宀生了詟告,正确的做法 应该是去除警告,做到工程编译0警告。由于我们在学习编程语言开始被灌输了警牛 无所谓的思想,所以对于警告不重视,其实警告信息如不注意有时候产生未知的隐 患,因此好的程序员应该去除所有的警告。而去除警告也应该在编写代码的过程中进 行,而不是在完工的时候再回头来查,这需要养成习惯。 版权作者所有,欢迎转载 Yesterday is a history, tomorrow is a mystery and today is god s gift that's why we call it the present. 10 E mail. eelyz@hotmail.com 映象文件信息图部分 此部分内容关系到分散加载置文件,卜面先列出 scat c.cf文件内容 FLASH0x240000000X4000000 FLASH0x240000000x4000000 lit.o(Init, + First) (+RO) 32bitRAM Oxo000 tors.o(Vect, +First (+RW, +Zi) HEAP +O UNINIT heap. o(+Zn STACKS 0X40000 UNINIT stack.o(+ZD) UARTO OX I 6000000 UNINIT uart.o(+ZD 对应信息图 Memory Map of the image Image Entry point 0x24000000 Load Rcgion FLASH ( Basc: 0x24000000, Sizc: 0x00004298, Max: 0x04000000 ABSOLUTE) Execution Region FLASH Base: 0x24000000, Size: 0x00004238, Max: 0x04000000 ABSOLUTE Base Addr Size Type Attr Idx E Section Name Object 0x240000000x00000034 Code ro42*Init Init. o 0x240004200x00000174 Code ro80text sorts. o Execution Region 32bitRAM(Base: 0x00000000, Size: 0x000000d4, Max: Oxffffffff ABSOLUTE 版权作者所有,欢迎转载

...展开详情
所需积分/C币:15 上传时间:2019-02-21 资源大小:610KB
举报 举报 收藏 收藏
分享 分享