рд╢реБрдн рджреЛрдкрд╣рд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рдореИрдВ
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ - рдЬреАрдбреАрдмреА рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдХреЛрд░реНрдЯреЗрдХреНрд╕-рдПрдо рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдерд╛, рдФрд░ рдореИрдВ рдХрд┐рди рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рдЭрдВрдбреЗ рдПрдЖрд░рдПрдо рдкрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реИрд╕реЗрдмрд┐рд▓рд┐рдЯреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╢реЛрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдЖрдЗрдП рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рджреЛ рдореБрдЦреНрдп рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред
рдлреНрд░реЗрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрд▓рдирд╛ рдЦреЛрд▓рдирд╛
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреАрд╕реАрд╕реА рдореЗрдВ рдкрджрд╛рд╡рдирдд рд╕реНрдерд┐рддрд┐ рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд░реИрдо рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рдЗрд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рдКрдкрд░ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ (рдкреАрд╕реА) рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рд╕реВрдЪрдХ рдвреЗрд░ (рдПрд╕рдкреА) рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИред рдЕрдм, рдкрд┐рдЫрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдЯреИрдХ "рдЬрдВрдк" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдерд╛ рдФрд░ рд╣рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХрд╣рд╛рдВ рдХреВрджрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдЖрд░рдПрдо рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд░рдЬрд┐рд╕реНрдЯрд░ (рдПрд▓рдЖрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд▓рд┐рдВрдХ рд░рдЬрд┐рд╕реНрдЯрд░ (LR) рд░рдЬрд┐рд╕реНрдЯрд░ R14 рд╣реИред рдпрд╣ рдЙрдк-рд╕реВрдЪрдирд╛, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдкрд░, рдкреНрд░реЛрд╕реЗрд╕рд░ LR рдорд╛рди рдХреЛ 0xFFFFFFFF рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╕реНрдЯреИрдХ рд╕реЗ рдКрдкрд░ рдЬрд╛рдиреЗ рдФрд░ рд╕реНрдЯреИрдХ рд╕реЗ рдПрд▓рдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
/* The stack backtrace structure is as follows: fp points to here: | save code pointer | [fp] | return link value | [fp, #-4] | return sp value | [fp, #-8] | return fp value | [fp, #-12] [| saved r10 value |] [| saved r9 value |] [| saved r8 value |] ... [| saved r0 value |] r0-r3 are not normally saved in a C function. */
рдпрд╣ рд╡рд┐рд╡рд░рдг GCC рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ gcc / gcc / config / arm / arm.h рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╛рдиреА рд╕рдВрдХрд▓рдХ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреАрд╕реАрд╕реА) рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╣рд╛рдпрдХ рд╕рдВрд░рдЪрдирд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ LR рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ "рдЕрдЧрд▓рд╛" рдореВрд▓реНрдп рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП, рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЗрд╕рдореЗрдВ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХрд╛ рдкрддрд╛ рд╣реИ
| return fp value | [fp, #-12]
| return fp value | [fp, #-12]
рдпрд╣ рд╕рдВрдХрд▓рдХ рдореЛрдб -mapcs- рдлреНрд░реЗрдо рд╡рд┐рдХрд▓реНрдк рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдПрдХ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ "рдирд┐рд░реНрджрд┐рд╖реНрдЯ -fomit- рдлрд╝реНрд░реЗрдо-рдкреЙрдЗрдВрдЯрд░ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдлрд╝реНрд░реЗрдо рдкрддреНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред" рдпрд╣рд╛рдВ, рдкрддреНрддреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорддрд▓рдм рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдпрд╣ рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рдореИрдХреНрд░реЛрдЬрд╝ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ
рдЙрдкрдХрд░рдг / objtool / рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди / рд╕реНрдЯреИрдХ-рд╡реИрд▓рд┐рдбреЗрд╢рди.рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ:
рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ ELF рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ред Asm рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
ENTRY / ENDPROC рдореИрдХреНрд░реЛрдЬрд╝ред
рд▓реЗрдХрд┐рди рд╡рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдиреБрдХрд╕рд╛рди рднреА рд╣реИред рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рддреЛ objtool рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред
рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реЗ рд╕реНрдЯреИрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) int notrace unwind_frame(struct stackframe *frame) { unsigned long high, low; unsigned long fp = frame->fp; frame->fp = *(unsigned long *)(fp - 12); frame->sp = *(unsigned long *)(fp - 8); frame->pc = *(unsigned long *)(fp - 4); return 0; } #endif
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ
defined(CONFIG_ARM_UNWIND)
рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд╣ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рднреА рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ shr_frame, рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдПрдЖрд░рдПрдо рдЕрдиреБрджреЗрд╢ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП
-рдореИрдк-рдлреНрд░реЗрдо рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдорд╛рдиреНрдп рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдПрдЖрд░рдПрдо рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдФрд░ рд╕реЗрдЯ рд╣реИ - рдердореНрдм (рдердореНрдм -1 рдФрд░ рдердореНрдм -2, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП), рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдердВрдм рдореЛрдб рдХреЗ рд▓рд┐рдП рдлрд╝реНрд░реЗрдо рдЬрдирд░реЗрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
-mtpcs-рдлрд╝реНрд░реЗрдо рдФрд░
-mtpcs- рд▓реАрдлрд╝-рдлрд╝реНрд░реЗрдо рдлрд╝реНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ -рдореИрдкреНрд╕-рдлреНрд░реЗрдо рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд╡рд┐рдХрд▓реНрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ Cortex-M0 / M1 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рд╕рдордп рддрдХ рдореИрдВ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдпрд╛ рдХрд┐ рдореИрдВ рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо 3 / рдПрдо 4 / ... рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдЫрд╡рд┐ рдХреНрдпреЛрдВ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдЬрдм рдореИрдВрдиреЗ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬреАрд╕реАрд╕реА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдХреА, рддреЛ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдмрдЧ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╕реАрдзреЗ
рд╣рд╛рде-рдХреЛрдИ-рдИрдмреА-рдЬреАрд╕реАрд╕реА рд╕рдВрдХрд▓рдХ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЪрдврд╝ рдЧрдпрд╛ред рд╕рдВрдХрд▓рдХ рдиреЗ ARM, Thumb-1 рдФрд░ Thumb-2 рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ Thumb-2 рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛, рдпрд╛рдиреА рдлрд┐рд▓рд╣рд╛рд▓ рдлреНрд░реЗрдо рдХреЗрд╡рд▓ Thumb-1 рдФрд░ ARM рдХреЗ рд▓рд┐рдП рд╣реА рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
рдмрдЧ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреАрд╕реАрд╕реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╕рдордЭрд╛рдпрд╛ рдХрд┐ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкрд╣рд▓реЗ рд╣реА рдХрдИ рдмрд╛рд░ рдмрджрд▓ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдпреЗ рдЭрдВрдбреЗ рдмрд╣реБрдд рдкреБрд░рд╛рдиреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╡реЗ рд╕рднреА рдЕрднреА рднреА рд╕рдВрдХрд▓рдХ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рдиреАрдЪреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
static int my_func(int a) { my_func2(7); return 0; }
00008134 <my_func>: 8134: b084 sub sp, #16 8136: b580 push 8138: aa06 add r2, sp, #24 813a: 9203 str r2, [sp, #12] 813c: 467a mov r2, pc 813e: 9205 str r2, [sp, #20] 8140: 465a mov r2, fp 8142: 9202 str r2, [sp, #8] 8144: 4672 mov r2, lr 8146: 9204 str r2, [sp, #16] 8148: aa05 add r2, sp, #20 814a: 4693 mov fp, r2 814c: b082 sub sp, #8 814e: af00 add r7, sp, #0
рддреБрд▓рдирд╛ рдореЗрдВ, рдПрдЖрд░рдПрдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░
000081f8 <my_func>: 81f8: e1a0c00d mov ip, sp 81fc: e92dd800 push {fp, ip, lr, pc} 8200: e24cb004 sub fp, ip, #4 8204: e24dd008 sub sp, sp, #8
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлреНрд░реЗрдо рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдердореНрдм рдореЛрдб рдореЗрдВ, рдкреБрд╢ рдирд┐рд░реНрджреЗрд╢ рдХреЗрд╡рд▓ рдХрдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ (r0 - r7) рдФрд░ lr рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдвреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ mov рдФрд░ str, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИред
рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдвреЗрд░ рдЦреЛрд▓рдирд╛
рдПрдЖрд░рдПрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (
EHABI )
рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ ABI рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реНрдЯреИрдХ
рдЕрдирдЗрдВрдбрд┐рдВрдЧ рд╣реИ ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдЙрджрд╛рд╣рд░рдг рд╕реА ++ рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИред рд╕реНрдЯреИрдХ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдореЛрдб рд╡рд┐рдХрд▓реНрдк GCC
-fexception (рдпрд╛
-funwind- рдлреНрд░реЗрдо ) рдХреЗ рд╕рд╛рде рд╕рдХреНрд╖рдо рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ (EHABI) рд╕рд╣рд╛рдпрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ .ARM.ididx рдФрд░ .ARM.extabред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реИ .ARM.exidx рдЕрдиреБрднрд╛рдЧ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓
рдЖрд░реНрдХ / рдЖрд░реНрдо / рдХрд░реНрдиреЗрд▓ / vmlinux.lds.h рд╕реЗ :
/* Stack unwinding tables */ #define ARM_UNWIND_SECTIONS \ . = ALIGN(8); \ .ARM.unwind_idx : { \ __start_unwind_idx = .; \ *(.ARM.exidx*) \ __stop_unwind_idx = .; \ } \
рдПрдЖрд░рдПрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП "рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдПрдмреАрдЖрдИ" рдорд╛рдирдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ .ARM.exidx рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
struct unwind_idx { unsigned long addr_offset; unsigned long insn; };
рдкрд╣рд▓рд╛ рддрддреНрд╡ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рддрддреНрд╡ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдЯреИрдХ рдХреЛ рдЖрдЧреЗ рд╕реНрдкрд┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗрд╡рд▓ рд╢рдмреНрджреЛрдВ рдФрд░ рдЖрдзреЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ, рдЬреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рдкрд╣рд▓рд╛ рд╢рдмреНрдж рдЙрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЛ рд╕реНрдкрд┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпреЗ рдирд┐рд░реНрджреЗрд╢ рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦрд┐рдд EHABI рдорд╛рдирдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЗрд╕ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрд▓
рдЖрд░реНрдХ / рдЖрд░реНрдо / рдХрд░реНрдиреЗрд▓ / рдЦреЛрд▓ рдореЗрдВ рд╣реИрд▓реЗрдиреНрдбрд░рдлреНрд░реЗрдо рдлрдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди int unwind_frame(struct stackframe *frame) { unsigned long low; const struct unwind_idx *idx; struct unwind_ctrl_block ctrl; idx = unwind_find_idx(frame->pc); if (!idx) { pr_warn("unwind: Index not found %08lx\n", frame->pc); return -URC_FAILURE; } ctrl.vrs[FP] = frame->fp; ctrl.vrs[SP] = frame->sp; ctrl.vrs[LR] = frame->lr; ctrl.vrs[PC] = 0; if (idx->insn == 1) return -URC_FAILURE; else if ((idx->insn & 0x80000000) == 0) ctrl.insn = (unsigned long *)prel31_to_addr(&idx->insn); else if ((idx->insn & 0xff000000) == 0x80000000) ctrl.insn = &idx->insn; else { pr_warn("unwind: Unsupported personality routine %08lx in the index at %p\n", idx->insn, idx); return -URC_FAILURE; } if ((*ctrl.insn & 0xff000000) == 0x80000000) { ctrl.byte = 2; ctrl.entries = 1; } else if ((*ctrl.insn & 0xff000000) == 0x81000000) { ctrl.byte = 1; ctrl.entries = 1 + ((*ctrl.insn & 0x00ff0000) >> 16); } else { pr_warn("unwind: Unsupported personality routine %08lx at %p\n", *ctrl.insn, ctrl.insn); return -URC_FAILURE; } ctrl.check_each_pop = 0; while (ctrl.entries > 0) { int urc; if ((ctrl.sp_high - ctrl.vrs[SP]) < sizeof(ctrl.vrs)) ctrl.check_each_pop = 1; urc = unwind_exec_insn(&ctrl); if (urc < 0) return urc; if (ctrl.vrs[SP] < low || ctrl.vrs[SP] >= ctrl.sp_high) return -URC_FAILURE; } frame->fp = ctrl.vrs[FP]; frame->sp = ctrl.vrs[SP]; frame->lr = ctrl.vrs[LR]; frame->pc = ctrl.vrs[PC]; return URC_OK; }
рдпрд╣ рдЦреЛрд▓_рдлреНрд░реЗрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ CONFIG_ARM_UNWIND рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд░реВрд╕реА рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реНрд░реЛрдд рдкрд╛рда рдореЗрдВ рдбрд╛рд▓рд╛ред
рдирд┐рдореНрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ .ARM.exidx рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡ Embox рдореЗрдВ рдХрд░реНрдиреЗрд▓_рд╕реНрдЯрд╛рд░реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд┐рдЦрддрд╛ рд╣реИ:
$ arm-none-eabi-readelf -u build/base/bin/embox Unwind table index '.ARM.exidx' at offset 0xaa6d4 contains 2806 entries: <...> 0x1c3c <kernel_start>: @0xafe40 Compact model index: 1 0x9b vsp = r11 0x40 vsp = vsp - 4 0x84 0x80 pop {r11, r14} 0xb0 finish 0xb0 finish <...>
рдФрд░ рдпрд╣рд╛рдБ рдЙрд╕рдХреЗ disassembler рд╣реИ:
00001c3c <kernel_start>: void kernel_start(void) { 1c3c: e92d4800 push {fp, lr} 1c40: e28db004 add fp, sp, #4 <...>
рдЪрд▓реЛ рдЪрд░рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рд╣рдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ
vps = r11
рджреЗрдЦрддреЗ рд╣реИрдВред (рдЖрд░ 11 рдпрд╣ рдПрдлрдкреА рд╣реИ) рдФрд░ рдлрд┐рд░
vps = vps - 4
ред рдпрд╣
add fp, sp, #4
рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдкреЙрдк {r11, r14} рдЖрддрд╛ рд╣реИ, рдЬреЛ
push {fp, lr}
рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо
finish
рдирд┐рд░реНрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрдВрдд рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ (рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рд╡рд╣рд╛рдВ рджреЛ рдлрд┐рдирд┐рд╢ рдирд┐рд░реНрджреЗрд╢ рдХреНрдпреЛрдВ рд╣реИрдВ)ред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
-рдлрдВрдбрд╡рд┐рдВрдб-рдлреНрд░реЗрдо рдлреНрд▓реИрдЧ
рдИрдЯ рдХреЗ рд╕рд╛рде рдЕрд╕реЗрдВрдмрд▓реА рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдмрдирд╛рддреА
рд╣реИредрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ STM32F4-Discovery рдордВрдЪ рдХреЗ рд▓рд┐рдП Embox рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣рд╛рдБ objdump рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
-рдлрдВрдбрд╡рд┐рдВрдб-рдлреНрд░реЗрдо рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде:Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0005a600 08000000 08000000 00004000 2**14
CONTENTS, ALLOC, LOAD, CODE
1 .ARM.exidx 00003fd8 0805a600 0805a600 0005e600 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .ARM.extab 000049d0 0805e5d8 0805e5d8 000625d8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .rodata 0003e380 08062fc0 08062fc0 00066fc0 2**5
рдмрд┐рдирд╛ рдЭрдВрдбреЗ рдХреЗ:Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00058b1c 08000000 08000000 00004000 2**14
CONTENTS, ALLOC, LOAD, CODE
1 .ARM.exidx 00000008 08058b1c 08058b1c 0005cb1c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .rodata 0003e380 08058b40 08058b40 0005cb40 2**5
рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ .ARM.exidx рдФрд░ .ARM.extab рдЦрдВрдб рд▓рдЧрднрдЧ 1/10 рднрд╛рдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ ARM9 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ ARM рдЗрдВрдЯреАрдЧреНрд░реЗрдЯрд░ CP рдХреЗ рд▓рд┐рдП - рдПрдХ рдмрдбрд╝реА рдЫрд╡рд┐ рдПрдХрддреНрд░ рдХреА рдФрд░ рд╡рд╣рд╛рдВ рдпреЗ рдЕрдиреБрднрд╛рдЧ .text рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ 1/12 рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдкрд╛рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ -macps-рдлрд╝реНрд░реЗрдо рдлрд╝реНрд▓реИрдЧ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдЕрдкрд╡рд╛рдж рд╡рд┐рдХрд▓реНрдк (рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ) рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм .text рд╕реЗрдХреНрд╢рди рдХрд╛ рдЖрдХрд╛рд░ 600 Kb рдерд╛, рддреЛ .ARM.exidx + .ARM.extab рдХрд╛ рдХреБрд▓ рдЖрдХрд╛рд░ 50 Kb рдерд╛, рдФрд░ -рдореИрдк-рдлреНрд░реЗрдо рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ 10 Kb рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдКрдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд░реНрдЯреЗрдХреНрд╕-рдПрдо 1 (рдпрд╛рдж рд░рдЦреЗрдВ, mov / рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдердореНрдм рдореЛрдб рдХреЗ рд▓рд┐рдП
-mt рдкреАрд╕реА-рдлреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЕрдм рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ?
рдПрдХ рддреАрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреИрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ FreeRTOS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, NuttX рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрд░реЗрдЦрдг
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рджреЗрдЦрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВред
рдирддреАрдЬрддрди, рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рд╣рдерд┐рдпрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡рддрдГ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ (рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреИрдХ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ) рдХреЛ рдСрдлрд╝рд▓рд╛рдЗрди рдирд┐рдХрд╛рд▓рдирд╛ред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдУрдПрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C ++ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ .ARM.exvillx рдХреЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рд╣рд╛рдБ,
Embox рдореЗрдВ рд░реБрдХрд╛рд╡рдЯ рдореЗрдВ рдЧрд▓рдд рд╕реНрдЯреИрдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рдПрд▓рдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд┐рдХрд▓рд╛ред