В составе пакета binutils есть волшебная программа size, которая по
elf-файлу может выдать итоговые размеры прошивки. Именно её или её
аналог в зависимости от выбранного компилера зовет keil в конце
сборки:
[100%] Linking CXX executable blink.elf text data bss dec hex filename 1356 120 1736 3212 c8c blink.elf
И есть даже более классная readelf, именно которой вам и надо пользоваться (возможно, позвал для прошивки под другую плату). Как видим, там есть все: размеры секций, кто сколько места занимает и много другого полезного.
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: ARM Version: 0x1 Entry point address: 0x8000151 Start of program headers: 52 (bytes into file) Start of section headers: 565272 (bytes into file) Flags: 0x5000200, Version5 EABI, soft-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 4 Size of section headers: 40 (bytes) Number of section headers: 24 Section header string table index: 23 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .isr_flash PROGBITS 08000000 010000 0000bc 00 A 0 0 4 [ 2] .text PROGBITS 080000bc 0100bc 000490 00 AX 0 0 4 [ 3] .rodata PROGBITS 0800054c 01054c 000004 00 A 0 0 4 [ 4] .ARM.exidx ARM_EXIDX 08000550 010550 000008 00 AL 2 0 4 [ 5] .data PROGBITS 20000000 020000 000070 00 WA 0 0 4 [ 6] .init_array INIT_ARRAY 08000558 010558 000004 04 WA 0 0 4 [ 7] .fini_array FINI_ARRAY 0800055c 01055c 000004 04 WA 0 0 4 [ 8] .bss NOBITS 20000070 020070 0000c8 00 WA 0 0 4 [ 9] ._user_heap_stack NOBITS 20000138 020138 000600 00 WA 0 0 1 [10] .ARM.attributes ARM_ATTRIBUTES 00000000 020070 000028 00 0 0 1 [11] .comment PROGBITS 00000000 020098 00001e 01 MS 0 0 1 [12] .debug_info PROGBITS 00000000 0200b6 002a37 00 0 0 1 [13] .debug_abbrev PROGBITS 00000000 022aed 000c91 00 0 0 1 [14] .debug_loc PROGBITS 00000000 02377e 0000aa 00 0 0 1 [15] .debug_aranges PROGBITS 00000000 023828 000088 00 0 0 1 [16] .debug_ranges PROGBITS 00000000 0238b0 0000e8 00 0 0 1 [17] .debug_macro PROGBITS 00000000 023998 00ee36 00 0 0 1 [18] .debug_line PROGBITS 00000000 0327ce 001ee9 00 0 0 1 [19] .debug_str PROGBITS 00000000 0346b7 05436f 01 MS 0 0 1 [20] .debug_frame PROGBITS 00000000 088a28 0002f0 00 0 0 4 [21] .symtab SYMTAB 00000000 088d18 000b30 10 22 121 4 [22] .strtab STRTAB 00000000 089848 0006cf 00 0 0 1 [23] .shstrtab STRTAB 00000000 089f17 000100 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), y (purecode), p (processor specific) There are no section groups in this file. Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x010550 0x08000550 0x08000550 0x00008 0x00008 R 0x4 LOAD 0x010000 0x08000000 0x08000000 0x00560 0x00560 RWE 0x10000 LOAD 0x020000 0x20000000 0x08000560 0x00070 0x00138 RW 0x10000 LOAD 0x000138 0x20000138 0x080005d0 0x00000 0x00600 RW 0x10000 Section to Segment mapping: Segment Sections... 00 .ARM.exidx 01 .isr_flash .text .rodata .ARM.exidx .init_array .fini_array 02 .data .bss 03 ._user_heap_stack There is no dynamic section in this file. There are no relocations in this file. Unwind section '.ARM.exidx' at offset 0x10550 contains 1 entry: 0x80000bc <_stack_init>: 0x1 [cantunwind] Symbol table '.symtab' contains 179 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 08000000 0 SECTION LOCAL DEFAULT 1 2: 080000bc 0 SECTION LOCAL DEFAULT 2 3: 0800054c 0 SECTION LOCAL DEFAULT 3 4: 08000550 0 SECTION LOCAL DEFAULT 4 5: 20000000 0 SECTION LOCAL DEFAULT 5 6: 08000558 0 SECTION LOCAL DEFAULT 6 7: 0800055c 0 SECTION LOCAL DEFAULT 7 8: 20000070 0 SECTION LOCAL DEFAULT 8 9: 20000138 0 SECTION LOCAL DEFAULT 9 10: 00000000 0 SECTION LOCAL DEFAULT 10 11: 00000000 0 SECTION LOCAL DEFAULT 11 12: 00000000 0 SECTION LOCAL DEFAULT 12 13: 00000000 0 SECTION LOCAL DEFAULT 13 14: 00000000 0 SECTION LOCAL DEFAULT 14 15: 00000000 0 SECTION LOCAL DEFAULT 15 16: 00000000 0 SECTION LOCAL DEFAULT 16 17: 00000000 0 SECTION LOCAL DEFAULT 17 18: 00000000 0 SECTION LOCAL DEFAULT 18 19: 00000000 0 SECTION LOCAL DEFAULT 19 20: 00000000 0 SECTION LOCAL DEFAULT 20 21: 00000000 0 FILE LOCAL DEFAULT ABS startup_gcc.cpp 22: 0800014c 0 NOTYPE LOCAL DEFAULT 2 $t 23: 080001a0 0 NOTYPE LOCAL DEFAULT 2 $d 24: 080002c0 0 NOTYPE LOCAL DEFAULT 2 $t 25: 08000000 0 NOTYPE LOCAL DEFAULT 1 $d 26: 08000000 188 OBJECT LOCAL DEFAULT 1 _ZL14InterruptTable 27: 00000000 0 FILE LOCAL DEFAULT ABS /usr/lib/gcc/arm[...] 28: 08000534 0 NOTYPE LOCAL DEFAULT 2 $t 29: 08000540 0 NOTYPE LOCAL DEFAULT 2 $t 30: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 31: 08000530 0 OBJECT LOCAL DEFAULT 2 __EH_FRAME_BEGIN__ 32: 20000000 0 NOTYPE LOCAL DEFAULT 5 $d 33: 08000238 0 NOTYPE LOCAL DEFAULT 2 $t 34: 08000239 0 FUNC LOCAL DEFAULT 2 __do_global_dtors_aux 35: 08000254 0 NOTYPE LOCAL DEFAULT 2 $d 36: 20000080 0 OBJECT LOCAL DEFAULT 8 completed.1 37: 0800055c 0 NOTYPE LOCAL DEFAULT 7 $d 38: 0800055c 0 OBJECT LOCAL DEFAULT 7 __do_global_dtor[...] 39: 08000260 0 NOTYPE LOCAL DEFAULT 2 $t 40: 08000261 0 FUNC LOCAL DEFAULT 2 frame_dummy 41: 08000274 0 NOTYPE LOCAL DEFAULT 2 $d 42: 20000084 0 OBJECT LOCAL DEFAULT 8 object.0 43: 08000558 0 NOTYPE LOCAL DEFAULT 6 $d 44: 08000558 0 OBJECT LOCAL DEFAULT 6 __frame_dummy_in[...] 45: 20000080 0 NOTYPE LOCAL DEFAULT 8 $d 46: 20000084 0 NOTYPE LOCAL DEFAULT 8 $d 47: 00000000 0 FILE LOCAL DEFAULT ABS /usr/lib/gcc/arm[...] 48: 080000bc 0 NOTYPE LOCAL DEFAULT 2 $t 49: 08000550 0 NOTYPE LOCAL DEFAULT 4 $d 50: 08000114 0 NOTYPE LOCAL DEFAULT 2 $d 51: 00000000 0 FILE LOCAL DEFAULT ABS main.cpp 52: 08000280 0 NOTYPE LOCAL DEFAULT 2 $t 53: 080002bc 0 NOTYPE LOCAL DEFAULT 2 $d 54: 20000070 0 NOTYPE LOCAL DEFAULT 8 $d 55: 00000000 0 FILE LOCAL DEFAULT ABS cortex_m.cpp 56: 08000130 0 NOTYPE LOCAL DEFAULT 2 $t 57: 08000138 0 NOTYPE LOCAL DEFAULT 2 $d 58: 0800013c 0 NOTYPE LOCAL DEFAULT 2 $t 59: 08000148 0 NOTYPE LOCAL DEFAULT 2 $d 60: 2000007c 0 NOTYPE LOCAL DEFAULT 8 $d 61: 00000000 0 FILE LOCAL DEFAULT ABS bsp.cpp 62: 080001b8 0 NOTYPE LOCAL DEFAULT 2 $t 63: 08000220 0 NOTYPE LOCAL DEFAULT 2 $d 64: 00000000 0 FILE LOCAL DEFAULT ABS atexit.c 65: 080002c8 0 NOTYPE LOCAL DEFAULT 2 $t 66: 00000000 0 FILE LOCAL DEFAULT ABS exit.c 67: 080002d8 0 NOTYPE LOCAL DEFAULT 2 $t 68: 080002fc 0 NOTYPE LOCAL DEFAULT 2 $d 69: 00000000 0 FILE LOCAL DEFAULT ABS fini.c 70: 08000304 0 NOTYPE LOCAL DEFAULT 2 $t 71: 08000324 0 NOTYPE LOCAL DEFAULT 2 $d 72: 00000000 0 FILE LOCAL DEFAULT ABS impure.c 73: 20000004 0 NOTYPE LOCAL DEFAULT 5 $d 74: 20000008 96 OBJECT LOCAL DEFAULT 5 impure_data 75: 20000008 0 NOTYPE LOCAL DEFAULT 5 $d 76: 0800054c 0 NOTYPE LOCAL DEFAULT 3 $d 77: 00000000 0 FILE LOCAL DEFAULT ABS init.c 78: 0800032c 0 NOTYPE LOCAL DEFAULT 2 $t 79: 08000364 0 NOTYPE LOCAL DEFAULT 2 $d 80: 00000000 0 FILE LOCAL DEFAULT ABS memcpy-stub.c 81: 08000374 0 NOTYPE LOCAL DEFAULT 2 $t 82: 00000000 0 FILE LOCAL DEFAULT ABS memset.c 83: 08000386 0 NOTYPE LOCAL DEFAULT 2 $t 84: 00000000 0 FILE LOCAL DEFAULT ABS __atexit.c 85: 08000398 0 NOTYPE LOCAL DEFAULT 2 $t 86: 08000450 0 NOTYPE LOCAL DEFAULT 2 $d 87: 2000009c 140 OBJECT LOCAL DEFAULT 8 _global_atexit0 88: 2000009c 0 NOTYPE LOCAL DEFAULT 8 $d 89: 20000068 0 NOTYPE LOCAL DEFAULT 5 $d 90: 00000000 0 FILE LOCAL DEFAULT ABS __call_atexit.c 91: 08000464 0 NOTYPE LOCAL DEFAULT 2 $t 92: 0800050c 0 NOTYPE LOCAL DEFAULT 2 $d 93: 20000128 0 NOTYPE LOCAL DEFAULT 8 $d 94: 2000006c 0 NOTYPE LOCAL DEFAULT 5 $d 95: 00000000 0 FILE LOCAL DEFAULT ABS lock.c 96: 08000514 0 NOTYPE LOCAL DEFAULT 2 $t 97: 08000516 0 NOTYPE LOCAL DEFAULT 2 $t 98: 08000518 0 NOTYPE LOCAL DEFAULT 2 $t 99: 0800051a 0 NOTYPE LOCAL DEFAULT 2 $t 100: 0800051c 0 NOTYPE LOCAL DEFAULT 2 $t 101: 0800051e 0 NOTYPE LOCAL DEFAULT 2 $t 102: 08000520 0 NOTYPE LOCAL DEFAULT 2 $t 103: 08000524 0 NOTYPE LOCAL DEFAULT 2 $t 104: 08000528 0 NOTYPE LOCAL DEFAULT 2 $t 105: 0800052a 0 NOTYPE LOCAL DEFAULT 2 $t 106: 00000000 0 FILE LOCAL DEFAULT ABS _exit.c 107: 0800052c 0 NOTYPE LOCAL DEFAULT 2 $t 108: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 109: 08000530 0 NOTYPE LOCAL DEFAULT 2 $d 110: 08000530 0 OBJECT LOCAL DEFAULT 2 __FRAME_END__ 111: 00000000 0 FILE LOCAL DEFAULT ABS /usr/lib/gcc/arm[...] 112: 08000538 0 NOTYPE LOCAL DEFAULT 2 $t 113: 08000544 0 NOTYPE LOCAL DEFAULT 2 $t 114: 00000000 0 FILE LOCAL DEFAULT ABS 115: 08000560 0 NOTYPE LOCAL DEFAULT 7 __fini_array_end 116: 0800055c 0 NOTYPE LOCAL DEFAULT 7 __fini_array_start 117: 0800055c 0 NOTYPE LOCAL DEFAULT 6 __init_array_end 118: 08000558 0 NOTYPE LOCAL DEFAULT 6 __preinit_array_end 119: 08000558 0 NOTYPE LOCAL DEFAULT 6 __init_array_start 120: 08000558 0 NOTYPE LOCAL DEFAULT 6 __preinit_array_start 121: 20000070 12 OBJECT GLOBAL DEFAULT 8 tim 122: 20000000 0 NOTYPE GLOBAL DEFAULT 5 __data_start__ 123: 2000012c 1 OBJECT GLOBAL DEFAULT 8 __lock___atexit_[...] 124: 2000012d 1 OBJECT GLOBAL DEFAULT 8 __lock___arc4ran[...] 125: 2000006c 4 OBJECT GLOBAL DEFAULT 5 __atexit_recursi[...] 126: 08000519 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_close 127: 0800054c 0 NOTYPE GLOBAL DEFAULT 2 _etext 128: 08000375 18 FUNC GLOBAL DEFAULT 2 memcpy 129: 20000070 0 NOTYPE GLOBAL DEFAULT 8 __bss_start__ 130: 20000000 0 OBJECT GLOBAL HIDDEN 5 __dso_handle 131: 00000200 0 NOTYPE GLOBAL DEFAULT ABS __MinHeapSize 132: 080001b9 128 FUNC GLOBAL DEFAULT 2 _ZN3bsp4InitEv 133: 08000151 104 FUNC GLOBAL DEFAULT 2 ResetHandler 134: 2000012e 1 OBJECT GLOBAL DEFAULT 8 __lock___env_rec[...] 135: 2000012f 1 OBJECT GLOBAL DEFAULT 8 __lock___sinit_r[...] 136: 0800054c 4 OBJECT GLOBAL DEFAULT 3 _global_impure_ptr 137: 2000007c 4 OBJECT GLOBAL DEFAULT 8 _ZN3mpp4core9__p[...] 138: 0800032d 72 FUNC GLOBAL DEFAULT 2 __libc_init_array 139: 080000c9 0 FUNC GLOBAL DEFAULT 2 _mainCRTStartup 140: 0800014d 4 FUNC GLOBAL DEFAULT 2 DefaultHandler 141: 08000535 0 FUNC GLOBAL DEFAULT 2 _init 142: 08000131 12 FUNC GLOBAL DEFAULT 2 _ZN3mpp4core9__p[...] 143: 08000305 40 FUNC GLOBAL DEFAULT 2 __libc_fini_array 144: 20000130 1 OBJECT GLOBAL DEFAULT 8 __lock___malloc_[...] 145: 0800013d 16 FUNC GLOBAL DEFAULT 2 _ZN3mpp4core9__p[...] 146: 08000560 0 NOTYPE GLOBAL DEFAULT 1 __firmware_end__ 147: 0800052b 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 148: 20000070 0 NOTYPE GLOBAL DEFAULT 5 __data_end__ 149: 08000525 4 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 150: 20000138 0 NOTYPE GLOBAL DEFAULT 8 __bss_end__ 151: 20000128 4 OBJECT GLOBAL DEFAULT 8 _global_atexit 152: 08000465 176 FUNC GLOBAL DEFAULT 2 __call_exitprocs 153: 080000c9 0 FUNC GLOBAL DEFAULT 2 _start 154: 08000521 4 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 155: 08000399 204 FUNC GLOBAL DEFAULT 2 __register_exitproc 156: 080000bd 0 FUNC WEAK DEFAULT 2 _stack_init 157: 20000068 4 OBJECT GLOBAL DEFAULT 5 __atexit_dummy 158: 08000560 0 NOTYPE GLOBAL DEFAULT ABS __data_load__ 159: 080002c1 8 FUNC WEAK DEFAULT 2 _ZN3mpp4core8cor[...] 160: 00000400 0 NOTYPE GLOBAL DEFAULT ABS __MinStackSize 161: 0800051b 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 162: 0800051f 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 163: 08000387 16 FUNC GLOBAL DEFAULT 2 memset 164: 08000281 64 FUNC GLOBAL DEFAULT 2 main 165: 08000517 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 166: 08000515 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_init 167: 08000541 0 FUNC GLOBAL DEFAULT 2 _fini 168: 080002c9 16 FUNC GLOBAL DEFAULT 2 atexit 169: 20009000 0 NOTYPE GLOBAL DEFAULT 1 __initial_sp__ 170: 20000004 4 OBJECT GLOBAL DEFAULT 5 _impure_ptr 171: 20000131 1 OBJECT GLOBAL DEFAULT 8 __lock___at_quic[...] 172: 080002d9 44 FUNC GLOBAL DEFAULT 2 exit 173: 0800051d 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 174: 08000529 2 FUNC GLOBAL DEFAULT 2 __retarget_lock_[...] 175: 0800052d 2 FUNC GLOBAL DEFAULT 2 _exit 176: 20000132 1 OBJECT GLOBAL DEFAULT 8 __lock___dd_hash[...] 177: 20000133 1 OBJECT GLOBAL DEFAULT 8 __lock___tz_mutex 178: 20000134 1 OBJECT GLOBAL DEFAULT 8 __lock___sfp_rec[...] No version information found in this file. Attribute Section: aeabi File Attributes Tag_CPU_name: "6S-M" Tag_CPU_arch: v6S-M Tag_CPU_arch_profile: Microcontroller Tag_THUMB_ISA_use: Thumb-1 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte Tag_ABI_enum_size: small
-
- Выхлоп функции можно сократить, например, распечатав только таблицу
функций. За подробностями в man - evgeniy1294(09.01.2021 21:59)
- Спасибо. Но я не настолько заморочен на этом неудобстве. Можно и в
map посмотреть, тем более, что проект не слишком сложный. Просто
думал, что где то в среде имеется. - my504(09.01.2021 22:03)
- Т.е разбираться в нечеловеческом формате map-файла вам проще, чем
позвать: evgeniy1294(652 знак., 09.01.2021 22:14)
- У armcc(компилятор из коробки с кейлом) есть утилита fromelf,
которая потенциально может делать тоже, что и readelf - evgeniy1294(09.01.2021 22:37, ссылка)
- +1 fromelf рулит, но кейла крайне мало позиций "after
Build/Rebuild", у меня оба окна заняты, а при подключении батника с
fromelfими не работает, видимо контекст теряется! Aleksey_75(81 знак., 09.01.2021 22:55)
- fromelf умеет вывод в файл как минимум. Вообще я бы задал этот вопрос разрабам кейла, уж очень убого выглядит ограничение на две позиции, скорее всего таки не умеете готовить. - evgeniy1294(09.01.2021 22:59)
- В документации на кейловский компилятор есть целый раздел по теме
(рекомендую скачать pdf-ку) - evgeniy1294(09.01.2021 22:43, ссылка)
- Вам нужен пункт 16.6 Using fromelf to find where a symbol is placed in an executable ELF image - все есть в коробке - evgeniy1294(09.01.2021 22:47)
- +1 fromelf рулит, но кейла крайне мало позиций "after
Build/Rebuild", у меня оба окна заняты, а при подключении батника с
fromelfими не работает, видимо контекст теряется! Aleksey_75(81 знак., 09.01.2021 22:55)
- У armcc(компилятор из коробки с кейлом) есть утилита fromelf,
которая потенциально может делать тоже, что и readelf - evgeniy1294(09.01.2021 22:37, ссылка)
- Т.е разбираться в нечеловеческом формате map-файла вам проще, чем
позвать: evgeniy1294(652 знак., 09.01.2021 22:14)
- Спасибо. Но я не настолько заморочен на этом неудобстве. Можно и в
map посмотреть, тем более, что проект не слишком сложный. Просто
думал, что где то в среде имеется. - my504(09.01.2021 22:03)
- Выхлоп функции можно сократить, например, распечатав только таблицу
функций. За подробностями в man - evgeniy1294(09.01.2021 21:59)