Getting Detailed Information of MCU Memory Usage from .map File

AD Space

.map file, generated from GCC-toolchain, has almost all information needed to find memory usage in details. Symbols, including functions and variables, with memory address, size and memory section name that holds this symbol can be found there and much more.

We can find in .map file for example:

  •  memory configuration or the memory map
  • Used area of each memory section defined in linker script .ld. For example, the following is bss section definition in linker script. Linker script describes how memory and sections will be organized, and we could also define symbols to be used in the code like this one __bss_start__ = .;
The snippet above means that linker will assign current program counter value to __bss_start__  then fill the section as needed with variables and then supply the end address (PC) to __bss_end__  . We will find that in .map file, but instead of the dot we will find the real start and end address of bss section.
  • Even if you didn’t ask linker to give you the PC value in the beginning of a section and end of it in a variable, you can calculate the section size, as .map file states the section that each symbol belongs to it beside the symbol size.

From the points above, I found .map file has all information needed to find memory usage statistics, so I made a draft for Python script to scan .map file for these useful information mentioned above. The idea started with me while I was debugging my code functions size using nm tool with .out file, but I felt that more information can be obtained from .map file.

This script searches in .map file for information related to memory usage. User has to change settings in the associated file “map_settings.txt” to set:

  • Directory to .map file
  • Sections defined in linker script that has unique start and end address keywords (.i.e __bss_start__)
  • Sections defined in linker script with no unique start and end address keywords. User must specify start keyword and next section keyword … look to the bellow:
that was part from linker script. (.eh_frame) is the unique keyword that makes the map_file_analyzer.py knows where (.rodata) ends.

Script in Action

Download the script form Github repository. Note: More powerful .map file analyzing tools are there like MapViewer and AMAP.


AD Space

Yahya Tawil

Embedded Hardware Engineer interested in open hardware and was born in the same year as Linux. Yahya is the editor-in-chief of Atadiat and believes in the importance of sharing free, practical, spam-free and high quality written content with others. His experience with Embedded Systems includes developing firmware with bare-metal C and Arduino, designing PCB&schematic and content creation.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.