×
单片机 > 单片机程序设计 > 详情

痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)

发布时间:2020-06-17 发布时间:
|

  第四节课里,痞子衡给大家介绍了第一种output文件-relocatable文件,本文继续给大家讲project生成的第二种output文件-map文件,map文件记录了很多重要的信息,这对于后续调试有很大帮助。


  文件关系:链接文件(.icf) + 工程文件(.ewp) + 可重定向文件(.o/.a) -> 映射文件(.map)


  痞子衡在第四节课可重定向文件(.o/.a)里分析object文件里的symbol list时讲到由于object文件并没有经过链接,所以所有symbol地址信息是无效的(待分配的),而map文件就是所有relocatable文件经过链接器统一链接后生成的记录链接信息的文件,map文件里可以查到所有symbol在存储器中具体分配地址。话不多说,让我们直接开启map文件分析之旅,以第三节课工程文件(.ewp)里demo工程为例。


一、解析map文件

  在IAR软件选项设置options->Linker->List里选中Generate linker map file,编译链接demo工程可在D:myProjectbspbuildsdemoReleaseList路径下得到demo.map文件。让我们从头到尾逐一分析里面内容:


1.1 工程文件信息

  map文件里第一部分信息记录的是工程文件相关信息,包括工程使用的软件版本,工程编译时间,工程文件目录,工程文件生成文件信息。


###############################################################################

#

# IAR ELF Linker V8.11.2.13589/W32 for ARM                12/Jan/2018  17:37:39

# Copyright 2007-2017 IAR Systems AB.

#

#    Output file  =  D:myProjectbspbuildsdemoReleaseExedemo.elf

#    Map file     =  D:myProjectbspbuildsdemoReleaseListdemo.map

#    Command line =  

#        -f C:UsersBaogeAppDataLocalTempEW5D86.tmp

#        (D:myProjectbspbuildsdemoReleaseObjmain.o

#        D:myProjectbspbuildsdemoReleaseObjreset.o

#        D:myProjectbspbuildsdemoReleaseObjstartup.o

#        D:myProjectbspbuildsdemoReleaseObjstartup_MKL25Z4.o

#        D:myProjectbspbuildsdemoReleaseObjsystem_MKL25Z4.o

#        D:myProjectbspbuildsdemoReleaseObjtask.o -o

#        D:myProjectbspbuildsdemoReleaseExedemo.elf --map

#        D:myProjectbspbuildsdemoReleaseListdemo.map --config

#        D:myProjectbspbuildsdemo/../../linker/iar/KL25Z128xxx4_flash.icf

#        --entry Reset_Handler --inline --vfe --text_out locale)

#

###############################################################################

1.2 系统库使用信息

  map文件里第二部分信息记录的是工程系统库使用情况,由于task.c里调用了malloc()、free()等HEAP相关操作的API,所以自然我们在编译链接工程时会使用到HEAP相关系统库,这里告诉我们用的是DLib里的DLMalloc,而DLMalloc有很多种不同的HEAP实现策略,我们可在options->General Options->Library Option 2->Heap selection指定具体策略,由于demo工程选的是Automatic,也就是让IDE自动选择,这里告诉我们最终用的策略是advanced heap。


*******************************************************************************

*** RUNTIME MODEL ATTRIBUTES

***


CppFlavor       = *

__Heap_Handler  = DLMalloc

__SystemLibrary = DLib

__dlib_version  = 6



*******************************************************************************

*** HEAP SELECTION

***


The advanced heap was selected because the application calls memory

allocation functions outside of system library functions, and there

are calls to deallocation functions in the application.

1.3 各object中Section放置信息

  从map文件第三部分开始,就进入非常有用的信息环节了。第一个重要信息就是section放置信息。我们在第四节课可重定向文件(.o/.a)里分析过单个relocatable文件task.o,task.o里各个基本section都有,但是都并没有分配有效地址,而这里列出了所有relocatable文件统一存储和地址分配信息,从这里我们可以看到,链接器在整合各section的时候,都是以object文件为单位的,这意味着同一个object文件里的同一个section里的对象(变量/函数)在存储空间里的位置也是靠在一起的。

  另外一个有意思的信息是在第二节课链接文件(.icf)里,我们一共有四句block放置语句,在这里section也被分成了四个block:A0,P1,P2,P3。IDE给每个block重命名了,这些重命名的信息将会在第六节课可执行文件(.out/.elf)里被提到。


*******************************************************************************

*** PLACEMENT SUMMARY

***


define block Vectors with alignment = 256 { ro section .intvec };

"A0":  place at start of [0x00000000-0x0001ffff] { block Vectors };

define block CodeRelocate { section .textrw_init };

define block ApplicationFlash { ro, block CodeRelocate };

"P1":  place in [from 0x00000000 to 0x0001ffff] { block ApplicationFlash };

define block CodeRelocateRam { section .textrw };

define block HEAP with size = 1K, alignment = 8 { };

define block ApplicationRam { rw, block CodeRelocateRam, block HEAP };

"P2":  place in [from 0x10002000 to 0x1000ffff] { block ApplicationRam };

define block CSTACK with size = 8K, alignment = 8 { };

"P3":  place in [from 0x10000000 to 0x10001fff] { block CSTACK };

initialize manually with packing = copy, complex ranges { section .data };

initialize manually with packing = copy, complex ranges { section .textrw };


  Section                Kind        Address    Size  Object

  -------                ----        -------    ----  ------

"A0":                                           0x40

  Vectors                         0x00000000    0x40 

    .intvec              ro code  0x00000000    0x40  startup_MKL25Z4.o [1]

                                - 0x00000040    0x40


"P1":                                         0x1a3c

  ApplicationFlash                0x00000040  0x1a3c 

    .noinit              ro code  0x00000040    0x58  reset.o [1]

    .rodata              const    0x00000098     0x4  main.o [1]

    Veneer               ro code  0x0000009c    0x10  - Linker created -

    .text                ro code  0x000000ac    0x20  main.o [1]

    .text                ro code  0x000000cc    0x58  task.o [1]

    .text                ro code  0x00000124  0x16f8  dlmalloc.o [3]

    .text                ro code  0x0000181c    0x50  ABImemset.o [4]

    .text                ro code  0x0000186c    0x5c  ABImemcpy.o [4]

    .text                ro code  0x000018c8     0x8  heaptramp0.o [3]

    .text                ro code  0x000018d0     0xa  abort.o [3]

    .text                ro code  0x000018da     0x2  startup_MKL25Z4.o [1]

    .text                ro code  0x000018dc    0x2c  xgetmemchunk.o [3]

    .text                ro code  0x00001908     0xc  XXexit.o [4]

    .text                ro code  0x00001914    0x90  startup.o [1]

    .text                ro code  0x000019a4     0xc  system_MKL25Z4.o [1]

    .text                ro code  0x000019b0    0x1a  cmain.o [4]

    .text                ro code  0x000019ca     0x2  startup_MKL25Z4.o [1]

    .text                ro code  0x000019cc    0x28  data_init.o [4]

    .text                ro code  0x000019f4     0x8  exit.o [3]

    .text                ro code  0x000019fc     0xa  cexit.o [4]

    .text                ro code  0x00001a06     0x2  startup_MKL25Z4.o [1]

    CodeRelocate                  0x00001a08    0x10 

Initializer bytes co



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析