历史上的今天
今天是:2024年12月19日(星期四)
2019年12月19日 | 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
2019-12-19 来源:eefocus
第四节课里,痞子衡给大家介绍了第一种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 const 0x00001a08 0x10 .data_init 0x00001a18 0x4 Initializer bytes const 0x00001a18 0x4 .text ro code 0x00001a1c 0x2 startup_MKL25Z4.o [1] .text ro code 0x00001a1e 0x2 startup_MKL25Z4.o [1] .text ro code 0x00001a20 0xc cstartup_M.o [4] .text ro code 0x00001a2c 0x40 zero_init3.o [4] .iar.init_table const 0x00001a6c 0x10 - Linker created - .rodata const 0x00001a7c 0x0 zero_init3.o [4] - 0x00001a7c 0x1a3c "P3": 0x2000
史海拾趣
|
3G时代,能否替代原有的固定宽带 2009年元月,中国3张3G牌照发放 电信 cdma2000 推出天翼品牌,声称测试速度已经达到3.3Mbps,年底升级到9Mbps。 联通 WCDMA 声称速度达到7.2Mbps,号称最成熟的3G制式。 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 今年的元器件清单公布时间是29号? 不会提前公布出来么 早点公布也好早点猜题啊? … 查看全部问答> |
|
大型ARM+linux+android嵌入式技术专题公益讲座 华清远见武汉华嵌中心将于2010年4月24日下午1:00-5:00在武汉大学联手ARM中国公司,开展“基于ARM平台的嵌入式系统设计专题讲座”。 详情请点击: http://www.embedhq.org/html/mianfei/2010/0408/382.html… 查看全部问答> |
|
本系统侧重点在微信号的采集,通过设计一个微信号采集和分析的系统,通过特定的集成电路对微小信号放大,转变为标准电流信号并能够传输到远端。通过模数转换器将其转换为数字量。利用相应软件对采集到的数字进行修正,使之能够比较准 ...… 查看全部问答> |
|
各位大侠: 自己定制了一个WinCE6.0 的操作系统,启动时间大约在10秒钟左右,想在CE系统真正起来之前,加一个画面,以免看着不舒服。看帖子发现一般解决都是在eboot 或者OAL层加。不解。问问大家。 我用的Atmel 公司 ...… 查看全部问答> |




