рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП рдПрдЖрд░рдПрдо: рд╕рдВрдХрд▓рди рдФрд░ рд▓рд┐рдВрдХрд░ рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛


рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рдЦрд░реЛрдВрдЪ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдЖрдЬ рдореИрдВ GNU ld рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдХрд╡рд░ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рд╡рд┐рд╖рдп рди рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдореНрдмреЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХрд┐рд╕реА рддрд░рд╣ рдЖрд░реНрдо-рдиреЛ-рдИрдмреА рдЯреВрд▓рдХрд┐рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдЖрдЙрдЯ рдХрд╛ рд╕рд╛рд░ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд▓рд┐рдВрдХрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ:


рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг: https://github.com/farcaller/arm-demos



рдЬрдм рд╣рдо рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрдИ рдЦрдВрдб рд╣реЛрддреЗ рд╣реИрдВред рдЪрд╛рд░ рд╕рдмрд╕реЗ рдЖрдо рдЦрдВрдб рд╣реИрдВ:


рдЗрд╕ рдЪрдХреНрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ, рджреЛ рдФрд░ рдЦрдВрдб рдЕрдХреНрд╕рд░ рд╕рд╛рдордиреЗ рдЖрдПрдВрдЧреЗ:



рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЗрдХрд╛рдИ рд╣реИ: рдПрдХ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ред рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИрд╢: рдирд╛рдо - рдкрддрд╛ (рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ) рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдЙрдирдХреЗ рдкрддреЗ (рдЬреЛ рдХрд┐ .text рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХрд╣реАрдВ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ) рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓рд┐рдВрдХрд░ рдХреЛ рдКрдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджрд┐рдП рдЧрдП рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдЧрд╛, рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджреЗрдЧрд╛ рдФрд░ рдЕрдВрддрд┐рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рджреЗрдЧрд╛ред "рдорд╛рдирдХ" рдУрдПрд╕ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдлреНрд▓реИрд╢ рдФрд░ рд░реИрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдм рдХреБрдЫ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреБрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рднреАрддрд░ рджреЗрдЦ рд▓реЛ


рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд C рдХреЛрдб module_a.c : module_a.c :
 static int local_function(); int external_counter; static int counter; static int preset_counter = 5; const int constant = 10; int public_function() { volatile int i = 3 + constant; ++external_counter; return local_function() * i; } static int local_function() { ++counter; ++preset_counter; return counter + preset_counter; } 


рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреМрди рд╕реЗ рд╕реЗрдХреНрд╢рди рдорд┐рд▓реЗ:
 % rake 'show:sections[a]' arm-none-eabi-gcc -mthumb -O2 -mcpu=cortex-m0 -c module_a.c -o build/module_a.o arm-none-eabi-objdump build/module_a.o -h build/module_a.o: file format elf32-littlearm Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000034 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000004 00000000 00000000 00000068 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000004 00000000 00000000 0000006c 2**2 ALLOC 3 .rodata 00000004 00000000 00000000 0000006c 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .comment 00000071 00000000 00000000 00000070 2**0 CONTENTS, READONLY 5 .ARM.attributes 00000031 00000000 00000000 000000e1 2**0 CONTENTS, READONLY 


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЫрд╣ рдЦрдВрдб рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдЬреНрдЮрд╛рдд рд╣реИред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╕реЗрдХреНрд╢рди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВ, рд╡реЗ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╕рдордп рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдВрдЧреЗред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХреМрди рд╕реЗ рд╡рд░реНрдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ:

 % rake 'show:symbols:text[a]' arm-none-eabi-objdump build/module_a.o -j .text -t build/module_a.o: file format elf32-littlearm SYMBOL TABLE: 00000000 ld .text 00000000 .text 00000000 g F .text 00000034 public_function 


рдкрд░рд╛рдорд░реНрд╢ рдХреЗ рд▓рд┐рдП objdump рдкрд░ рдордиреБрд╖реНрдп рдХреЛ рдЦреЛрд▓реЗрдВред рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рджреЛ рд╡рд░реНрдгреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ: .text рдПрдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд░реНрдг рд╣реИ рдЬреЛ рдЕрдиреБрднрд╛рдЧ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, public_function рдПрдХ рдРрд╕рд╛ рдЪрд░рд┐рддреНрд░ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред local_function рд▓рд┐рдП local_function рдкреНрд░рддреАрдХ local_function , рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ static рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд╣рд░ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 % rake 'show:symbols:data[a]' arm-none-eabi-objdump build/module_a.o -j .data -j .bss -t build/module_a.o: file format elf32-littlearm SYMBOL TABLE: 00000000 ld .data 00000000 .data 00000000 ld .bss 00000000 .bss 00000000 l O .data 00000004 preset_counter 00000000 l O .bss 00000004 counter 


.bss рдФрд░ .bss рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреЛ рдХрд╛рдЙрдВрдЯрд░ рд╣реИрдВ - preset_counter рдФрд░ counter ред рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ preset_counter рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╣реИ, рдЬреЛ рдХрд┐ preset_counter рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред "

 % rake 'show:contents[a,.data]' arm-none-eabi-objdump build/module_a.o -j .data -s build/module_a.o: file format elf32-littlearm Contents of section .data: 0000 05000000 


counter рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢реВрдиреНрдп рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ .bss рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред .bss рдЦрдВрдб рд╕реНрд╡рдпрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╣рдореЗрд╢рд╛ рддрдп рд╣реЛрддреА рд╣реИ - рдпреЗ рд╢реВрдиреНрдп рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдХреЛрдб рдореЗрдВ char buffer[1024] рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рдЬрдЧрд╣ рдХреЗ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдмрд╛рд╣рд░реА_рдХрд╛рдЙрдВрдЯрд░ рдХрд╣рд╛рдВ рдЧрдпрд╛?

 % rake 'show:symbols:all[a]' arm-none-eabi-objdump build/module_a.o -t build/module_a.o: file format elf32-littlearm SYMBOL TABLE: 00000000 l df *ABS* 00000000 module_a.c 00000000 ld .text 00000000 .text 00000000 ld .data 00000000 .data 00000000 ld .bss 00000000 .bss 00000000 ld .rodata 00000000 .rodata 00000000 l O .data 00000004 preset_counter 00000000 l O .bss 00000004 counter 00000000 ld .comment 00000000 .comment 00000000 ld .ARM.attributes 00000000 .ARM.attributes 00000000 g F .text 00000034 public_function 00000004 O *COM* 00000004 external_counter 00000000 g O .rodata 00000004 constant 


external_counter *COM* рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рдЪрд░рдг рдореЗрдВ, ld рдпрд╣ рдкрддрд╛ .bss рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рддреАрдХ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдЙрд╕реЗ рд╕реНрд╡рдпрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, .bss рдЕрдиреБрднрд╛рдЧ рдореЗрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ .rodata const int constant ред рд╕рдВрдХрд▓рдХ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЗрд╕ рдкрддреЗ рдкрд░ рдореВрд▓реНрдп рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддрд╛рдХрд┐ рд▓рд┐рдВрдХрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рдореЗрдВ рд░рдЦ рд╕рдХреЗред

рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
 % rake 'show:contents[a,.comment]' arm-none-eabi-objdump build/module_a.o -j .comment -s build/module_a.o: file format elf32-littlearm Contents of section .comment: 0000 00474343 3a202847 4e552054 6f6f6c73 .GCC: (GNU Tools 0010 20666f72 2041524d 20456d62 65646465 for ARM Embedde 0020 64205072 6f636573 736f7273 2920342e d Processors) 4. 0030 372e3320 32303133 30333132 20287265 7.3 20130312 (re 0040 6c656173 6529205b 41524d2f 656d6265 lease) [ARM/embe 0050 64646564 2d345f37 2d627261 6e636820 dded-4_7-branch 0060 72657669 73696f6e 20313936 3631355d revision 196615] 0070 00 


рд╕рдВрдХрд▓рдХ рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо .ARM.attributes рдореЗрдВ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ objdump рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реИ:
 % rake 'show:attrs[a]' arm-none-eabi-readelf build/module_a.o -A Attribute Section: aeabi File Attributes Tag_CPU_name: "Cortex-M0" 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_align_preserved: 8-byte, except leaf SP Tag_ABI_enum_size: small Tag_ABI_optimization_goals: Aggressive Speed 


рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЯреИрдЧ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдПрдЖрд░рдПрдо рдЗрдиреНрдлреЛ рд╕реЗрдВрдЯрд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдЕрдм рдЬрдм рд╣рдордиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ ld рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдлрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

Ld рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ред рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЖрдЙрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдлрд╛рдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреНрд░реЙрд╕-рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред "рдорд╛рдирдХ" рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЛрдВ рдкрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реЗрдХреНрд╢рди рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд┐рдВрдХрд░ рднреА рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдореЛрд░реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрд░реЙрд╕-рд░реЗрдлрд░реЗрдВрд╕ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдПрдореНрдмреЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдЖрд╕рд╛рди рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдлрд░реНрдорд╡реЗрдпрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдкрдХреА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ USB рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдорд╛рдЪреЛ рдпрд╛ рдХрд▓реНрдкрд┐рдд рдмреМрдиреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдмрд╛рдЗрдирд░реА рдбрдВрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рд▓реЗ рдЬрд╛рдПрдВред layout.ld:
 MEMORY { rom(RX) : ORIGIN = 0x00000000, LENGTH = 0x8000 ram(WAIL) : ORIGIN = 0x10000000, LENGTH = 0x2000 } ENTRY(public_function) SECTIONS { .text : { *(.text) } > rom _data_start = .; .data : { *(.data) } > ram AT> rom _bss_start = .; .bss : { *(.bss) } > ram _bss_end = .; } 


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд┐рдВрдХрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдпрд╣ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА (рдХрд╣реАрдВ-рдХрд╣реАрдВ 32-рдмрд┐рдЯ рдПрдЖрд░рдПрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0xFFFFFFFF рдмрд╛рдЗрдЯреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЪрд▓реЛ рдЙрди рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: rom рдФрд░ ram ред рдХреЛрд╖реНрдардХ рдореЗрдВ рдЕрдХреНрд╖рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдкрдврд╝рдирд╛, рд▓рд┐рдЦрдирд╛, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛, рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрдиред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдЕрдиреБрднрд╛рдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдмрд┐рдЦрд░реЗ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рд▓рд┐рдВрдХрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛, рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддрд░реНрдХ рджреЗрдЧрд╛: error: no memory region specified for loadable section `.data' ред

рджреЛ рдкреИрд░рд╛рдореАрдЯрд░, ORIGIN рдФрд░ LENGTH , рдХреНрд░рдорд╢рдГ рдХреНрд╖реЗрддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдЕрднреА рднреА рд╡рд┐рдХрд▓реНрдк org , o , len рдФрд░ l рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред рдореВрд▓реНрдп рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдпрд╛рдиреА, рдпрд╣ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдкреНрд░рддреНрдпрдп K , M , рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП LENGTH = 0x8000 , рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: l = 32K ред

рдлрд╝рд╛рдЗрд▓ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╕реЗрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рджрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдЦрдВрдбреЛрдВ рдХреЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдмрдл рд╕реЗ рджреВрд╕рд░реЗ рдЖрдЙрдЯрдкреБрдЯ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ред

рд╕реНрд░реЛрдд рдЕрдиреБрднрд╛рдЧ _(_) рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, * рдЪрд░рд┐рддреНрд░ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ *(.text) рдЕрд░реНрде рд╣реИ: рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ .text рдЕрдиреБрднрд╛рдЧред

рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рджреЛ рдкрддреЗ рд╣реИрдВ: LMA (рд▓реЛрдб рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕) - рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ VMA (рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕) - рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдХрд┐рд╕ рдкрддреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, LMA рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдФрд░ VMA рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╡рд░реНрдг рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд, рдХреЛрдб рдореЗрдВ рд╡рд░реНрдг рдХрд╛ рд╕реВрдЪрдХ VMA рдкрддреЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ред

рд╣рдо рддреАрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдХреЛрдб, рдбреЗрдЯрд╛ рдФрд░ рдбреЗрдЯрд╛, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рдлреНрд▓реИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА, рдбреЗрдЯрд╛ ( .data ) рдХреЛ рдлреНрд▓реИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб ( .text ) рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдзрд╛рд░рдгрд╛ рдкрд░ рдХрд┐ рд╡реЗ рд░реИрдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рдФрд░ рд░реИрдо рдХреЗ рд▓рд┐рдПред

.bss , рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ ( UPD : рд╡реЗ рдореБрдЭреЗ рдмрддрд╛ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЬреИрдмрд░ рдореЗрдВ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╢реВрдиреНрдп рд╣реИрдВ, рди рдХрд┐ рдХрдЪрд░рд╛ рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реЛ), рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рд╕реНрдореГрддрд┐ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╢рд╛рдпрдж, рд╢реВрдиреНрдп рдкрд░ рд░реАрд╕реЗрдЯ рд╣реЛред рд▓реЗрдХрд┐рди .data рд╕рд╛рде .data рдЕрд▓рдЧ рд╕реЗ рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рджреЛ рдЧреБрдирд╛ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдПрдХ рддрд░рдл, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рд╡рд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( preset_counter рдореВрд▓реНрдп), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдЕрдиреБрднрд╛рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд░реИрдо рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рднрд┐рдиреНрди LMA рдФрд░ VMA рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХреА рдЧрдИ рд╣реИ, рд╕рд╛рде рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд C рдХреЛрдб рднреА рд╣реИ, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ LMA рд╕реЗ VMA рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдЧрд╛ред рдирд┐рд░рдВрддрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ .rodata рд╕реЗрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдРрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рд╕реЗ рд╕реАрдзреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд▓рд┐рдВрдХрд░ рдореЗрдВ рдПрдХ рдХрд░реНрд╕рд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ - рдпрд╣ рд╡рд░реНрддрдорд╛рди рдПрд▓рдПрдордП рд╣реИред рдЦрдВрдб рдЦрдВрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХрд░реНрд╕рд░ рд╢реВрдиреНрдп рд╣реИ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирдП рдЦрдВрдб рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдХрд░реНрд╕рд░ рдорд╛рди рдХреЛ рдПрдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ . (рдбреЙрдЯ)ред

рдЪрд▓рд┐рдП рд▓рд┐рдВрдХрд░ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
 % rake 'show:map[a]' arm-none-eabi-ld -T layout.ld -M -o build/out.elf build/module_a.o Allocating common symbols Common symbol size file external_counter 0x4 build/module_a.o Memory Configuration Name Origin Length Attributes rom 0x0000000000000000 0x0000000000008000 xr ram 0x0000000010000000 0x0000000000002000 awl *default* 0x0000000000000000 0xffffffffffffffff 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд▓рд┐рдВрдХрд░ "рд╕рд╛рдорд╛рдиреНрдп" external_counter рдкреНрд░рддреАрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╢реНрд░реЗрдгреА рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдЬреЛ рд╕рдВрдкреВрд░реНрдг рдкрддрд╛ рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред
 Linker script and memory map .text 0x0000000000000000 0x34 *(.text) .text 0x0000000000000000 0x34 build/module_a.o 0x0000000000000000 public_function 0x0000000000000034 _data_start = . 

рдЗрд╕рдХреЗ рдмрд╛рдж, рд▓рд┐рдВрдХрд░ рдореЗрдореЛрд░реА рдХреЛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗред
 .rodata 0x0000000000000034 0x4 .rodata 0x0000000000000034 0x4 build/module_a.o 0x0000000000000034 constant .glue_7 0x0000000000000038 0x0 .glue_7 0x0000000000000000 0x0 linker stubs .glue_7t 0x0000000000000038 0x0 .glue_7t 0x0000000000000000 0x0 linker stubs .vfp11_veneer 0x0000000000000038 0x0 .vfp11_veneer 0x0000000000000000 0x0 linker stubs .v4_bx 0x0000000000000038 0x0 .v4_bx 0x0000000000000000 0x0 linker stubs .iplt 0x0000000000000038 0x0 .iplt 0x0000000000000000 0x0 build/module_a.o .rel.dyn 0x0000000000000038 0x0 .rel.iplt 0x0000000000000000 0x0 build/module_a.o 

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдРрд╕реЗ рдЕрдиреБрднрд╛рдЧ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ - .rodata , .glue_7 , .glue_7t , .vfp11_veneer , .v4_bx , .iplt , .rel.dyn ред рдХреЗ рд╕рд╛рде .rodata рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рдорд╛рд░реЗ рдирд┐рд░рдВрддрд░ constant рдХреЛ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢реЗрд╖ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдирдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдЖрд░рдПрдо рд╕реЗ рдердореНрдм рддрдХ рдХреВрджрддрд╛ рд╣реИред рдпреЗ рд╕рднреА рдЕрдиреБрднрд╛рдЧ рдЦрд╛рд▓реА рд╣реИрдВ рдФрд░ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВред
 .data 0x0000000010000000 0x4 load address 0x0000000000000038 *(.data) .data 0x0000000010000000 0x4 build/module_a.o 0x0000000010000004 _data_end = . 

рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ .data рдЕрдиреБрднрд╛рдЧ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ 0x10000000 рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ 0x38 рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ (рдпрд╛рдиреА, рддреБрд░рдВрдд рдмрд╛рдж .rodata )ред рдпрд╣рд╛рдБ рд╣рдо рдХрд░реНрд╕рд░ рд╕реЗ рдкрдврд╝реЗ рдЧрдП рд╣рдорд╛рд░реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдорд╛рди рджреЗрдЦрддреЗ рд╣реИрдВ, _data_end ред
 .igot.plt 0x0000000010000004 0x0 load address 0x000000000000003c .igot.plt 0x0000000000000000 0x0 build/module_a.o .bss 0x0000000010000004 0x8 load address 0x000000000000003c *(.bss) .bss 0x0000000010000004 0x4 build/module_a.o COMMON 0x0000000010000008 0x4 build/module_a.o 0x0000000010000008 external_counter 0x000000001000000c _bss_end = . 

рдПрдХ рдФрд░ рдЦрд╛рд▓реА рдЦрдВрдб, рдЙрд╕рдХреЗ рдмрд╛рдж .bss
 LOAD build/module_a.o OUTPUT(build/out.elf elf32-littlearm) .comment 0x0000000000000000 0x70 .comment 0x0000000000000000 0x70 build/module_a.o 0x71 (size before relaxing) .ARM.attributes 0x0000000000000000 0x31 .ARM.attributes 0x0000000000000000 0x31 build/module_a.o 

рдЕрдВрдд рдореЗрдВ, ld рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдбрд┐рд╕реНрдХрд╕ рдХрд░рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдкрд╕рдВрдж рд╣реИ?

  0x0000000000000034 _data_start = . ... .data 0x0000000010000000 0x4 load address 0x0000000000000038 

.data рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЪрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рдЬрдЧрд╣ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐, .text рдмрд╛рдж рдХрд╛ рдХрд░реНрд╕рд░ рдЗрд╕рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдЪрд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗрдХреНрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЕрдВрджрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 .data : { _data_start = .; *(.data) _data_end = .; } > ram AT> rom 


рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:
 % rake 'show:map[a]' SCRIPT=layout2.ld arm-none-eabi-ld -T layout2.ld -M -o build/module_a.elf build/module_a.o ... .data 0x0000000010000000 0x4 load address 0x0000000000000038 0x0000000010000000 _data_start = . *(.data) .data 0x0000000010000000 0x4 build/module_a.o 0x0000000010000004 _data_end = . ... 

рдорд╣рд╛рди, рдЕрдм рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рд╣реИред

рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдмрд╛рдд рд╣реИ, рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдбреЗрдЯрд╛ рдПрдХ рдлреНрд▓реИрд╢ рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рд░реИрдо рд╕реЗ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдореЗрдВ рдмреВрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд░реИрдо рдХреЛ рдХреЙрдкреА рдХрд░реЗрдЧрд╛ред рдФрд░ рдпреЗ рдЪрд░ рд╣рдореЗрдВ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╕реЗрдХреНрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдЗрдП рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ


рд╣рдордиреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред рдЖрдЗрдП рдПрдХ рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд module_b.cpp рдФрд░ рдХреБрдЫ C ++ рдХреЛрдб: module_b.cpp
 int external_counter; extern "C" int public_function(); void function_b() { external_counter += public_function(); } void function_c() { } void function_d() { } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрдм C ++ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо "рдореИрдирд░рд┐рдВрдЧ" рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЬрдм рдирд╛рдо рдореЗрдВ рддрд░реНрдХреЛрдВ, рд╡рд░реНрдЧ рдФрд░ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
 % rake 'show:symbols:text[b]' arm-none-eabi-gcc -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -mthumb -O2 -mcpu=cortex-m0 -c module_b.cpp -o build/module_b.o arm-none-eabi-objdump build/module_b.o -j .text -t build/module_b.o: file format elf32-littlearm SYMBOL TABLE: 00000000 ld .text 00000000 .text 00000000 g F .text 00000014 _Z10function_bv 00000014 g F .text 00000002 _Z10function_cv 00000018 g F .text 00000002 _Z10function_dv 


рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдирдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рдо рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рдирдЪрд┐рддреНрд░ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╕реЗ public_function рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ a ред рд╣рдо рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛрдиреЛрдВ рдореЙрдбреНрдпреВрд▓реЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:
 % rake 'show:map[a|b]' SCRIPT=layout2.ld arm-none-eabi-ld -T layout2.ld -M -o build/out.elf build/module_a.o build/module_b.o ... .text 0x0000000000000000 0x34 build/module_a.o 0x0000000000000000 public_function .text 0x0000000000000034 0x1c build/module_b.o 0x0000000000000034 function_b() 0x0000000000000048 function_c() 0x000000000000004c function_d() ... 

рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдгреЛрдВ рдХрд╛ рдмреНрд▓реЙрдХ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ, рд╕рднреА рд╡рд░реНрдг рд╕рдВрдЧрдд рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред .text рдЕрдиреБрднрд╛рдЧ, рд╕рд╛рде рд╣реА рдЕрдиреНрдп, рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЪрд▓реЛ рдХрдЪрд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд░реЛ!



рдПрдореНрдмреЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдФрд░ рдореГрдд рдХреЛрдб рдХреА рдЕрдзрд┐рдХрддрдо рдорд╛рддреНрд░рд╛ рд╣рдЯрд╛ рджреА рдЬрд╛рдПред рд▓рд┐рдВрдХрд░ рдЙрди рдЦрдВрдбреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЬреЛ рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ - --gc-sections рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 % rake 'show:map[a|b]' SCRIPT=layout2.ld GC=1 arm-none-eabi-ld --gc-sections -T layout2.ld -M -o build/out.elf build/module_a.o build/module_b.o Discarded input sections .rodata 0x0000000000000000 0x4 build/module_a.o COMMON 0x0000000000000000 0x0 build/module_a.o .text 0x0000000000000000 0x1c build/module_b.o .data 0x0000000000000000 0x0 build/module_b.o ... .text 0x0000000000000000 0x34 *(.text) .text 0x0000000000000000 0x34 build/module_a.o 0x0000000000000000 public_function ... 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, build/module_b.o рд╕реЗрдХреНрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмреЗрдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдереЗ! рдЙрд╕реА рд╕рдордп, рд▓рд┐рдВрдХрд░ рдиреЗ рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдкрд╣рд▓реЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, module_c.cpp
 void function_b(); extern "C" int public_function() { function_b(); } 


рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ c рд╕рд╛рде рдмрджрд▓ рджреЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд▓рд┐рдВрдХрд░ рдЕрдиреБрднрд╛рдЧ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред

 % rake 'show:map[b|c]' SCRIPT=layout2.ld GC=1 arm-none-eabi-gcc -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -mthumb -O2 -mcpu=cortex-m0 -c module_c.cpp -o build/module_c.o arm-none-eabi-ld --gc-sections -T layout2.ld -M -o build/out.elf build/module_b.o build/module_c.o Discarded input sections .data 0x0000000000000000 0x0 build/module_b.o .data 0x0000000000000000 0x0 build/module_c.o .bss 0x0000000000000000 0x0 build/module_c.o ... .text 0x0000000000000000 0x24 *(.text) .text 0x0000000000000000 0x1c build/module_b.o 0x0000000000000000 function_b() 0x0000000000000014 function_c() 0x0000000000000018 function_d() .text 0x000000000000001c 0x8 build/module_c.o 0x000000000000001c public_function 


рдпрджреНрдпрдкрд┐ рдпрд╣ рд╡рд░реНрдЧреЛрдВ рдХреЗ рднрд╛рдЧ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдирд╛ рд╕рдВрднрд╡ рдерд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЦрд╛рд▓реА рд╡рд╛рд▓реЗ), рд╣рдо рдЕрднреА рднреА рдлрд╝рдВрдХреНрд╢рди function_c() рдФрд░ function_d() рд▓рд┐рдП рдЕрдирдореЛрд▓ рдмрд╛рдЗрдЯреНрд╕ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди_ function_b() рд░реВрдк рдореЗрдВ рдЙрд╕реА рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдЭрдВрдбреЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрдПрдВрдЧреЗ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ -ffunction-sections рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ -ffunction-sections рд╣реИрдВ: -ffunction-sections рдФрд░ -fdata-sections :
 % rake clean && rake 'show:symbols:all[b]' SPLIT_SECTIONS=1 arm-none-eabi-gcc -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -mthumb -O2 -mcpu=cortex-m0 -c module_b.cpp -o build/module_b.o arm-none-eabi-objdump build/module_b.o -t build/module_b.o: file format elf32-littlearm SYMBOL TABLE: 00000000 l df *ABS* 00000000 module_b.cpp 00000000 ld .text 00000000 .text 00000000 ld .data 00000000 .data 00000000 ld .bss 00000000 .bss 00000000 ld .text._Z10function_bv 00000000 .text._Z10function_bv 00000000 ld .text._Z10function_cv 00000000 .text._Z10function_cv 00000000 ld .text._Z10function_dv 00000000 .text._Z10function_dv 00000000 ld .bss.external_counter 00000000 .bss.external_counter 00000000 ld .comment 00000000 .comment 00000000 ld .ARM.attributes 00000000 .ARM.attributes 00000000 g F .text._Z10function_bv 00000014 _Z10function_bv 00000000 *UND* 00000000 public_function 00000000 g F .text._Z10function_cv 00000002 _Z10function_cv 00000000 g F .text._Z10function_dv 00000002 _Z10function_dv 00000000 g O .bss.external_counter 00000004 external_counter 

рдЕрдм рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рдЦрдВрдбреЛрдВ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реИ:
 % rake clean && rake 'show:map[b|c]' SCRIPT=layout2.ld GC=1 SPLIT_SECTIONS=1 arm-none-eabi-gcc -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -mthumb -O2 -mcpu=cortex-m0 -c module_b.cpp -o build/module_b.o arm-none-eabi-gcc -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -mthumb -O2 -mcpu=cortex-m0 -c module_c.cpp -o build/module_c.o arm-none-eabi-ld --gc-sections -T layout2.ld -M -o build/out.elf build/module_b.o build/module_c.o Discarded input sections .text 0x0000000000000000 0x0 build/module_b.o .data 0x0000000000000000 0x0 build/module_b.o .bss 0x0000000000000000 0x0 build/module_b.o .text._Z10function_cv 0x0000000000000000 0x4 build/module_b.o .text._Z10function_dv 0x0000000000000000 0x4 build/module_b.o .text 0x0000000000000000 0x0 build/module_c.o .data 0x0000000000000000 0x0 build/module_c.o .bss 0x0000000000000000 0x0 build/module_c.o ... 


рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдФрд░ рдлрд┐рд░, рд▓реЗрдЦ рдХрд╛ рд╡реЙрд▓реНрдпреВрдо рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рдЕрдм рдпрд╣ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рджреЛрдЧреБрдирд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдЖрдЙрдЯ рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд╖рдп рд╣реИ, рдФрд░ "рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐" рдХреЛ рдорд╛рд╕реНрдЯрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдПрдХ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ, рд╣рдо рд▓рд┐рдВрдХрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ рдФрд░ рдЕрдкрдиреЗ рдПрдореНрдмреЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдирд┐рд░реНрдорд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдБрдЧреЗред

PS рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░реВрдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред

рдХреНрд░рд┐рдПрдЯрд┐рд╡ рдХреЙрдордиреНрд╕ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдпрд╣ рдХрд╛рдо рдХреНрд░рд┐рдПрдЯрд┐рд╡ рдХреЙрдордиреНрд╕ рдПрдЯреНрд░рд┐рдмреНрдпреВрд╢рди-рдиреЙрди-рдХреЙрдорд░реНрд╢рд┐рдпрд▓-рдиреЛрдПрд░реНрдбреАрд╡реНрд╕ 3.0 рдЕрдирдкреЛрд░реНрдЯреЗрдб рдХреЗ рддрд╣рдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реИ ред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЯреЗрдХреНрд╕реНрдЯ рдпреВрдиреАрд▓реЗрдВрд╕ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдЙрдкрд▓рдмреНрдз рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпрд╣ рдХрд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд▓реЗрдЦрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рдпрд╛ рдкрд┐рдЫрд▓реЗ рдирд┐рдпреЛрдХреНрддрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реИред

Source: https://habr.com/ru/post/In191058/


All Articles