keil生成map文件不明白的地方,求解

2019-12-22 13:49发布

本帖最后由 caiwei_cs 于 2014-11-12 14:54 编辑

1.
guidev_writealpha.o(.text) refers to lcd_getpixelcolor.o(.text) for LCD_GetPixelColor

    .text                                    0x0000017a   Section        0  strlen.o(.text)
    .text                                    0x0000018a   Section        0  fadd.o(.text)

这里面text什么意思?我知道bss,data,heap,stack。但是这个没有查到。

2.
libinit5.o(.ARM.Collect$$libinit$$00000004) refers to libinit5.o(.ARM.Collect$$libinit$$00002715) for __lit__00000000
exit.o(.text) refers to rtexit.o(.ARM.Collect$$rtexit$$00000000) for __rt_exit

这里面的$$libinit$$00000004什么意思?我看到很多此类含有“$$”的表达,不知道是什么意思?、

3.
    printf7.o(i.__0printf$7) refers to printf7.o(i._printf_core) for _printf_core
    printf7.o(i.__0printf$7) refers to fputc.o(i.fputc) for fputc
    printf7.o(i.__0printf$7) refers to stdout.o(.data) for __stdout
很多符号,有前面一个“i.”这个是什么意思?还有就是有很多以“_“为前缀的符号比如”_printf_core“这些符号是哪里来的?

4.
==============================================================================

Adding Veneers to the image

    Adding AT veneer (8 bytes, Inline) for call to '_printf_int_dec' from _printf_d.o(.ARM.Collect$$_printf_percent$$00000009).
    Adding AT veneer (8 bytes, Inline) for call to '_printf_int_hex' from _printf_x.o(.ARM.Collect$$_printf_percent$$0000000C).
    Adding AT veneer (8 bytes, Inline) for call to '__set_errno' from sqrt.o(i.sqrt).
    Adding AT veneer (8 bytes, Inline) for call to '_printf_char' from _printf_c.o(.ARM.Collect$$_printf_percent$$00000013).
    Adding AT veneer (8 bytes, Long) for call to '_printf_string' from _printf_s.o(.ARM.Collect$$_printf_percent$$00000014).

5 Veneer(s) (total 40 bytes) added to the image.

一个9g45的map文件里面有这个部分,但是一个lpc1788就没有,这个是什么?

5.
Image Symbol Table
里面 symbol 的类型有几种
../../microlib/fpflt.c                   0x00000000   Number         0  ffltui.o ABSOLUTE
    ../../microlib/malloc/malloc.c           0x00000000   Number         0  mallocra.o ABSOLUTE
    ../../microlib/malloc/mvars.c            0x00000000   Number         0  mvars.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf2.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf4.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf5.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf7.o ABSOLUTE

Number         是什么?为什么大小是0? 后面的”ABSOLUTE“是什么?
我查到:Number是指它并不占据程序空间,而只是一个具有一定数值的符号,类似于程序中用define和EQU定义的。但还是不理解。比如:../../microlib/printf/printf.c  怎么会不占空间呢?难道这里给的是一个跳转?

    VECTOR                                   0x00300000   Section      112  board_cstartup_keil.o(VECTOR)
    cstartup                                 0x70000000   Section      148  board_cstartup_keil.o(cstartup)
    label                                    0x70000004   ARM Code       0  board_cstartup_keil.o(cstartup)
    !!!main                                  0x70000094   Section        8  __main.o(!!!main)
    !!!scatter                               0x7000009c   Section       60  __scatter.o(!!!scatter)
    !!handler_copy                           0x700000d8   Section       40  __scatter_copy.o(!!handler_copy)
    !!handler_zi                             0x70000100   Section       44  __scatter_zi.o(!!handler_zi)
    .ARM.Collect$$_printf_percent$$00000000  0x7000012c   Section        0  _printf_percent.o(.ARM.Collect$$_printf_percent$$00000000)
    .ARM.Collect$$_printf_percent$$00000009  0x7000012c   Section        8  _printf_d.o(.ARM.Collect$$_printf_percent$$00000009)
    .ARM.Collect$$_printf_percent$$0000000A  0x70000134   Section        8  _printf_u.o(.ARM.Collect$$_printf_percent$$0000000A)

"Section"是什么?      "VECTOR"是什么?      "cstartup"是什么?       "!!!main"是什么?       ".ARM.Collect$$_printf_percent$$00000000"是什么?      

目前我碰到的问题是:

keil编译完了以后,link时显示ram不够,不能连接,我要从哪方面开始精简,是要从类型为Data里面精简么?
例如:SD_Buf                                   0x100054e4   Data        1620  persistence.o(.bss)

6.
Image component sizes


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

         0          0          0          0          0       1184   ac97c.o
       532         48         12          0          0       1910   adc.o

里面“Debug”是什么意思,还占空间?
前面几个知道

7.
      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Library Member Name

        76          0          0          0          0          0   sqrt.o
        92          0          0          0          0          0   __dczerorl2.o
         0          0          0          0          0          0   entry.o
         8          4          0          0          0          0   entry2.o
         4          0          0          0          0          0   entry5.o
         8          4          0          0          0          0   entry7.o
        12          6          0          4          0          0   errno.o
        18          0          0          0          0          0   fputc.o
        30          0          0          0          0          0   handlers.o

这里面的“Library Member Name”和“Object Name”的区别是不是:Object Name是我们自己写的程序生成的o文件,而Library Member Name是系统自动的库文件生成的大小?


8.
在最后部分有:

    Total RO  Size (Code + RO Data)                42544 (  41.55kB)
    Total RW  Size (RW Data + ZI Data)             24304 (  23.73kB)
    Total ROM Size (Code + RO Data + RW Data)      42616 (  41.62kB)

我这里对ro,rw和rom的理解是:
rom是在flash中固态的,程序运行的时候ram中存在的是ro和rw。ro不可改动,rw和zi可以变动。
那么就是说这个map对应的程序运行需要。ro size + rw size 大小的ram来运行程序: 41.55+23.73k  
还是 (ro size + rw size )- Code size 就是说运行的时候不需要加载code到ram,只要保留在rom里面了?我觉得是前者。

但是看scf文件介绍里面是这样的:(见附图)
里面加载以后把ro部分还是存在rom里面,rw和zi部分加载到了ram里面。和我之前的理解不符。我理解是就算是代码也需要加载到内存中运行。难道是代码存放在flashrom里面?还是两种都可以。根据需要决定?

另:
romsize的flashrom是需要来来烧录 bin文件(41.62kB)就是说mcu的flashrom至少要这么大?

问题较多,把不懂得地方都列出来了,还请大家不理赐教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。