рд╣рдо ELF рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА (DWARF) рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ (ARM рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП) рдмрдирд╛рддреЗ рд╣реИрдВ

рдкрд░рд┐рдЪрдп


рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИред рдкрд╣рд▓реЗ рдПрд╡реАрдЖрд░, рдлрд┐рд░ рдПрдЖрд░рдПрдоред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджреЛ рдореБрдЦреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░: рдЕрд╕реЗрдВрдмрд▓рд░ рдФрд░ рд╕реАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдлреЛрд░реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЗрди рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдмреЗрд╢рдХ, рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рдерд╛ рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП: рдЬреАрдбреАрдмреА рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧред рдФрд░ рдореИрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ (рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП)ред рдореЗрд░реЗ рдкрд╛рд╕ 32-рдмрд┐рдЯ рдПрдЖрд░рдПрдо рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо 3 рдкреНрд░реЛрд╕реЗрд╕рд░, 128kB рдлреНрд▓реИрд╢ рдФрд░ 8k рд░реИрдо рдХреЗ рд╕рд╛рде рдПрдХ stm32vldiscovery рдмреЛрд░реНрдб рдерд╛, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреАред
рдореИрдВрдиреЗ рдлреЛрд░реНрдЯ рдкрд░ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдЯреНрд░рд╛рдВрд╕-рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯрд░ рдХреЛ рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рд▓реЗрдЦ рдореЗрдВ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рд╡рд┐рджреЗрд╢реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЦреБрдж рдХреЛ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░реВрдВрдЧрд╛ред рд╡рд┐рд╖рдп рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд▓рдЧрднрдЧ рдХреЛрдИ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИрдВ, рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЪрдпрди рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреБрдЫ рдореЗрдВ рдЬреАрд╕реАрд╕реА рд╕рдВрдХрд▓рдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдмрд┐рдирд╛ рд╕реНрдкрд░реНрд╢ рдХреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рдПрд╕ рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЗрдВред рд╡рд┐рд╖рдп рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИ рдФрд░, рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ 30 рдкреНрд░рддрд┐рд╢рдд рд╕рдордЭ рд▓рд┐рдпрд╛, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред

рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдпрд╣рд╛рдВ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

ELF рд╕рдореАрдХреНрд╖рд╛


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

рдлрд╝рд╛рдЗрд▓ рдФрд░ рдЗрд╕рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред
2. рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╢реАрд░реНрд╖рдХ (рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИрдбрд░ рдЯреЗрдмрд▓)

рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЕрдиреБрднрд╛рдЧреЛрдВ рдФрд░ рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ; рдпрд╣ рд▓реЛрдбрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рд▓рд┐рдЦрдирд╛ рд╣реИред
3. рдзрд╛рд░рд╛

рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ (рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдбреЗрдЯрд╛, рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА, рдЖрджрд┐) рдХреА рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ
рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░, рдирд╛рдо рдФрд░ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред ".Text" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдХреЛрдб рдЖрдорддреМрд░ рдкрд░, ".symtab" - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рддреАрдХреЛрдВ (рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЪрд░) рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛, ".strtab" рдореЗрдВ - рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛, рдЙрдкрд╕рд░реНрдЧ "ред Debug_" - рдбрд┐рдмрдЧ рдЬрд╛рдирдХрд╛рд░реА, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред .Dред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ 0 рдХреЗ рд╕рд╛рде рдПрдХ рдЦрд╛рд▓реА рдЕрдиреБрднрд╛рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

4. рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖рдХ рддрд╛рд▓рд┐рдХрд╛

рдпрд╣ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред
рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдИрдПрд▓рдПрдл рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред

DWARF рд╕рдореАрдХреНрд╖рд╛


DWARF рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдкреНрд░рд╛рд░реВрдк рд╣реИред рдорд╛рдирдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдПрдХ рдЕрджреНрднреБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рднреА рд╣реИ: DWARF рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк (рдорд╛рдЗрдХрд▓ рдЬреЗред рдИрдЧрд░) рдХрд╛ рдкрд░рд┐рдЪрдп ред
рдореБрдЭреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

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

  1. рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░:
    • рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░ DW_TAG_base_type рдХреЗ рд╕рд╛рде рдиреЛрдб), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рд╕реА рдореЗрдВ рдЯрд╛рдЗрдк рдЗрдВрдЯред
    • рдорд┐рд╢реНрд░рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рд╕рдВрдХреЗрдд, рдЖрджрд┐)
    • рд╕рд░рдгрд┐рдпреЛрдВ
    • рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдХрдХреНрд╖рд╛рдПрдВ, рдпреВрдирд┐рдпрдиреЛрдВ, рдЗрдВрдЯрд░рдлреЗрд╕

  2. рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ:
    • рд╕реНрдерд┐рд░рд╛рдВрдХ
    • рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░
    • рдЪрд░
    • рдЖрджрд┐


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

рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдб:

  1. рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐рдпрд╛рдБ (рдлрд╝рдВрдХреНрд╢рдВрд╕) - рдиреЛрдбреНрд╕ рдЯреИрдЧ DW_TAG_subprogram рдХреЗ рд╕рд╛рдеред рд╡рдВрд╢рдЬ рдиреЛрдбреНрд╕ рдореЗрдВ рдЪрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдЪрд░ред
  2. рд╕рдВрдХрд▓рди рдЗрдХрд╛рдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рд╕рднреА рдиреЛрдбреНрд╕ рдХрд╛ рдЬрдирдХ рд╣реИред

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЬрд╛рдирдХрд╛рд░реА ".debug_info" рдФрд░ ".debug_abbrev" рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рд╣реИред

рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА:



рдИрдПрд▓рдПрдл рдмрдирд╛рдирд╛


рд╣рдо рдПрд▓реНрдлреБрдЯрд┐рд▓реНрд╕ рдкреИрдХреЗрдЬ рд╕реЗ рдПрдмреНрд▓реЗрдЬрдлреБрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдИрдПрдлрдПрд▓ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП libble - LibELF рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ) рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреНрд░рд▓реЗрдЦрди рднреА ред
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:
  1. рд▓рд┐рдмреЗрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
  2. рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдмрдирд╛рдирд╛ (ELF Header)
  3. рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдмрдирд╛рдирд╛ (рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИрдбрд░ рдЯреЗрдмрд▓)
  4. рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдПрдВ
  5. рдлрд╝рд╛рдЗрд▓ рд░рд┐рдХреЙрд░реНрдб

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд▓рд┐рдмреЗрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ elf_version рдлрд╝рдВрдХреНрд╢рди (EV_CURRENT) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреАред рдпрджрд┐ рдпрд╣ EV_NONE рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИ рдФрд░ рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдлрд┐рд░ рд╣рдореЗрдВ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдбрд┐рд╕реНрдХ рдкрд░ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХрд╛ рд╣реИрдВрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ elf_begin рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ:
Elf * elf_begin( int fd, Elf_Cmd cmd, Elf *elf) 


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

рдПрдХ рд╢реАрд░реНрд╖рдХ рдмрдирд╛рдПрдБ

рдирдпрд╛ рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ elf32_newehdr рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 Elf32_Ehdr * elf32_newehdr( Elf *elf); 


рддреНрд░реБрдЯрд┐ рдкрд░ 0 рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ - ELF рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░:
 #define EI_NIDENT 16 typedef struct { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr; 




рдЗрд╕рдХреЗ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рднрд░реЗ рдЧрдП рд╣реИрдВ, рдХреБрдЫ рдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реАрд░реНрд╖рдХ рдмрдирд╛рдПрдБ

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ (рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИрдбрд░ рдЯреЗрдмрд▓) рдлрд╛рдЗрд▓ рд╕реЗрдХреНрд╢рди рдФрд░ рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЬреЛ рд▓реЛрдбрд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╢реАрд░реНрд╖рдХ elf32_newphdr рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 Elf32_Phdr * elf32_newphdr( Elf *elf, size_t count); 


рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдкрд░ рддреНрд░реБрдЯрд┐ рдпрд╛ рдкреЙрдЗрдВрдЯрд░ рдкрд░ 0 рджреЗрддрд╛ рд╣реИред
рд╢реАрд░реНрд╖ рд▓реЗрдЦ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ:
 typedef struct { Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; Elf32_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align; } Elf32_Phdr; 


рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдПрдБ

рд╣реЗрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕реЗрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЦрд╛рд▓реА рдЦрдВрдб elf_newscn рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 Elf_Scn * elf_newscn( Elf *elf); 


рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдкреЙрдЗрдВрдЯрд░ рдХреЛ рддреНрд░реБрдЯрд┐ рдкрд░ рдЦрдВрдб рдпрд╛ 0 рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рд╕реЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕реЗрдХреНрд╢рди рд╣реЗрдбрд░ рдХреЛ рднрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реЗрдХреНрд╢рди рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рдо elf32_getshdr рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрднрд╛рдЧ рд╣реЗрдбрд░ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 Elf32_Shdr * elf32_getshdr( Elf_Scn *scn); 


рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖рдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 typedef struct { Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags; Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; } Elf32_Shdr; 


рд╣реЗрдбрд░ рдореЗрдВ рднрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ elf_newdata рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрднрд╛рдЧ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛:
 Elf_Data * elf_newdata( Elf_Scn *scn); 


рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ 0 рдпрд╛ Elf_Data рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рднрд░рдирд╛ рд╣реЛрдЧрд╛:
 typedef struct { void* d_buf; Elf_Type d_type; size_t d_size; off_t d_off; size_t d_align; unsigned d_version; } Elf_Data; 



рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб

рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

рд╕рднреА рдЕрдиреБрднрд╛рдЧ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб рдХреА рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред


рдЕрдиреБрднрд╛рдЧ

рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ SHT_PROGBITS, sh_flags рдХреЛ SHF_EXECINSTR + SHF_ALLOC, sh_addr рдХреЛ рдЙрд╕ рдкрддреЗ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХреЛрдб рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдзрд╛рд░рд╛ .symtab

рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рднреА рдкреНрд░рддреАрдХреЛрдВ (рдХрд╛рд░реНрдпреЛрдВ) рдФрд░ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рд▓рдВрдмрд╛рдИ рдореЗрдВ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдРрд╕реЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ:
 typedef struct { Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; unsigned char st_info; unsigned char st_other; Elf32_Half st_shndx; } Elf32_Sym; 


рд╕реНрд░реЛрдд рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╕рдордп рдХрд┐рд╕реА рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╕реВрдЪрдХ рддрдм рдЕрдиреБрднрд╛рдЧ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (d_buf) рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдЦрдВрдб рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ sh_type рдХреЛ SHT_SYMTAB рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ .strtab рдЦрдВрдб рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ sh_link рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпреЗ рдЦрдВрдб рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред

рдзрд╛рд░рд╛ .strtab

рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ .symtab рдЕрдиреБрднрд╛рдЧ рд╕реЗ рд╕рднреА рд╡рд░реНрдгреЛрдВ рдХреЗ рдирд╛рдо рд╣реИрдВред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдиреБрднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди sh_type рдХреЛ SHT_STRTAB, sh_flags рд╕реЗ SHF_STRINGS рддрдХ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЦрдВрдб рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╕рдордп рдХрд┐рд╕реА рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╕реВрдЪрдХ рддрдм рдЕрдиреБрднрд╛рдЧ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (d_buf) рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдзрд╛рд░рд╛ .shstrtab

рдЕрдиреБрднрд╛рдЧ - рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛, рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╢реАрд░реНрд╖рдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рдХрд╛ рд╢реАрд░реНрд╖рдХ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ .strtab рд╕реЗрдХреНрд╢рди рдХреА рддрд░рд╣ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдХреЗ e_shstrndx рдлреАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред


рд░реЛ рдЯреЗрдмрд▓

рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдПрдХ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд▓рдЧрд╛рддрд╛рд░ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд╣рд▓реА рдмрд╛рдЗрдЯ рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рдСрдлрд╕реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ 'рдирд╛рдо' рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ 1, рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ 'рд╣реИ' var 'рдореЗрдВ 6 рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред
  рд╕реВрдЪрдХрд╛рдВрдХ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
        \ 0 рдирд╛рдо \ 0 var \ 0 


рдлрд╝рд╛рдЗрд▓ рд░рд┐рдХреЙрд░реНрдб

рдЗрд╕рд▓рд┐рдП, рд╣реЗрдбрд░ рдФрд░ рд╕реЗрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдиреЗ рд╣реБрдП рд╣реИрдВ, рдЕрдм рдЙрдиреНрд╣реЗрдВ рдПрдХ рдлрд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрдиреЗ рдФрд░ рдПрдХреНрдЬрд┐рдЯ рд▓реАрдл рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд░рд┐рдХреЙрд░реНрдб elf_update рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рд╣реИ:
 off_t elf_update( Elf *elf, Elf_Cmd cmd); 


рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ -1 рд▓реМрдЯрддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдкрд╛рда рдХреЛ elf_errmsg (-1) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реМрдЯрд╛рдПрдЧрд╛ред
рд╣рдо elf_end рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рд╡рд░рдгрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдорд╛рд░реА рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗред

DWARF рдмрдирд╛рдирд╛


рд╣рдо libdwarf рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдмрдирд╛рдПрдВрдЧреЗ , рдЬреЛ рдХрд┐ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ (libdwarf2p.1.pdf - рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдВрдЯрд░рдлреЗрд╕ рдЯреВ DWARF) рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред
рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдмрдирд╛рдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:
  1. рдХрд╛рдордЪрд▓рд╛рдК рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн
  2. рдиреЛрдбреНрд╕ рдмрдирд╛рдирд╛ (рдбреАрдЖрдИрдИ - рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реВрдЪрдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐)
  3. рдиреЛрдб рдПрдЯреНрд░реАрдмреНрдпреВрдЯ рдмрдирд╛рдирд╛
  4. рдПрдХ рд╕рдВрдХрд▓рди рдЗрдХрд╛рдИ рдмрдирд╛рдирд╛
  5. рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрдирд╛рдирд╛
  6. рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдирд╛
  7. рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ (рдХрд╛рд░реНрдпреЛрдВ) рдХрд╛ рдирд┐рд░реНрдорд╛рдг
  8. рдЪрд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдирд╛
  9. рдбрд┐рдмрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдирд╛
  10. рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рдирд╛

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдХрд╛рдордЪрд▓рд╛рдК рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн

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

 Dwarf_P_Debug dwarf_producer_init_c( Dwarf_Unsigned flags, Dwarf_Callback_Func_c func, Dwarf_Handler errhand, Dwarf_Ptr errarg, void * user_data, Dwarf_Error *error) 


рдлрд╝рдВрдХреНрд╢рди Dwarf_P_Debug рджреЗрддрд╛ рд╣реИ - рдмрд╛рдж рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░, рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ -1, рдФрд░ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╣реЛрдЧрд╛ (рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ dff_errmsg рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХрд╛ рдкрд╛рда рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)


рдиреЛрдбреНрд╕ рдмрдирд╛рдирд╛ (рдбреАрдЖрдИрдИ - рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реВрдЪрдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐)

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рдкреЗрдбрд╝ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддреА рд╣реИред рдЗрд╕ рдкреЗрдбрд╝ рдХрд╛ рдПрдХ рдиреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:

рдиреЛрдб dwarf_new_die рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 Dwarf_P_Die dwarf_new_die( Dwarf_P_Debug dbg, Dwarf_Tag new_tag, Dwarf_P_Die parent, Dwarf_P_Die child, Dwarf_P_Die left_sibling, Dwarf_P_Die right_sibling, Dwarf_Error *error) 


рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ DW_DLV_BADADDR, рдпрд╛ Dwarf_P_Die рдиреЛрдб рдХреЛ рд╣реИрдВрдбрд▓ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ

рдиреЛрдб рдПрдЯреНрд░реАрдмреНрдпреВрдЯ рдмрдирд╛рдирд╛

рдиреЛрдб рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреМрдиреЗ_рджрд╛рдб_AT_xxxx рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдкрд░рд┐рд╡рд╛рд░ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрдИ рдмрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рднреА рджреЗрд░реА рдХреАред рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреБрдЫ рдиреАрдЪреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВред рд╡реЗ рд╕рднреА рдорд╛рд▓рд┐рдХ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, рдиреЛрдб рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рддреНрд░реБрдЯрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд▓реМрдЯрд╛рдПрдЧрд╛ред
Dwarf_add_AT_name рдлрд╝рдВрдХреНрд╢рди рдиреЛрдб рдореЗрдВ рдирд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛ (DW_AT_name) рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЛрдбреНрд╕ рдореЗрдВ рдПрдХ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ, рдЪрд░, рд╕реНрдерд┐рд░рд╛рдВрдХ), рдХреБрдЫ рдореЗрдВ рдирд╛рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рди рдЗрдХрд╛рдИ)
 Dwarf_P_Attribute dwarf_add_AT_name( Dwarf_P_Die ownerdie, char *name, Dwarf_Error *error) 


рд╕рдлрд▓рддрд╛ рдкрд░ рддреНрд░реБрдЯрд┐ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рд╡рд░рдгрдХ рдкрд░ DW_DLV_BADADDR рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдХрд╛рд░реНрдп dwarf_add_AT_signed_const, dwarf_add_AT_unsigned_const рдиреЛрдб рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд) рдорд╛рди рдЬреЛрдбрд╝реЗрдВред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдФрд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд░рдВрддрд░ рдорд╛рди, рдЖрдХрд╛рд░, рд░реЗрдЦрд╛ рд╕рдВрдЦреНрдпрд╛ рдЖрджрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд╛рд░реЛрд╣ рдкреНрд░рд╛рд░реВрдк:
 Dwarf_P_Attribute dwarf_add_AT_(un)signed_const( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_Signed value, Dwarf_Error *error) 


рд╕рдлрд▓рддрд╛ рдкрд░ рддреНрд░реБрдЯрд┐ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рд╡рд░рдгрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ DW_DLV_BADADDR рд▓реМрдЯрд╛рдПрдВред

рдПрдХ рд╕рдВрдХрд▓рди рдЗрдХрд╛рдИ рдмрдирд╛рдирд╛

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

рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдЬрд╛рдирдХрд╛рд░реА

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

рд╕рдВрдХрд▓рдХ рдЬрд╛рдирдХрд╛рд░реА

рд╣рдо dwarf_add_AT_producer рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 Dwarf_P_Attribute dwarf_add_AT_name( Dwarf_P_Die ownerdie, char *producer_string, Dwarf_Error *error) 


рд╕рдлрд▓рддрд╛ рдкрд░ рддреНрд░реБрдЯрд┐ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рд╡рд░рдгрдХ рдкрд░ DW_DLV_BADADDR рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрдирд╛рдирд╛

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

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

.Debug_frame рдЕрдиреБрднрд╛рдЧ рдХреЗ рддрддреНрд╡ рдРрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ рдЬреЛ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ (CIE) рдФрд░ рдлрд╝реНрд░реЗрдо рд╡рд┐рд╡рд░рдг рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ (FDE)ред CIE рдореЗрдВ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬреЛ рдХрдИ FDE рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред FDE рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп, рдбреАрдмрдЧрд░ рдкрд╣рд▓реЗ CIE рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ FDE рд╕реЗред
рдореЗрд░рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реАрдПрдлрдП рд╕реНрдк (рдЖрд░ 13) рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ CIE рдмрдирд╛рдПрдБред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ dwarf_add_frame_cie рдлрд╝рдВрдХреНрд╢рди рд╣реИ:
 Dwarf_Unsigned dwarf_add_frame_cie( Dwarf_P_Debug dbg, char *augmenter, Dwarf_Small code_align, Dwarf_Small data_align, Dwarf_Small ret_addr_reg, Dwarf_Ptr init_bytes, Dwarf_Unsigned init_bytes_len, Dwarf_Error *error); 


DW_DLV_NOCOUNT CIE, FDE , ┬л FDE ┬╗


, , , . , ( int, double .), .
тАФ DW_TAG_base_type. :

.
, 32- ┬лint┬╗, DW_TAG_base_type DW_AT_name тАФ ┬лint┬╗, DW_AT_encoding тАФ DW_ATE_signed, DW_AT_byte_size тАФ 4.
. DW_AT_type тАФ . int тАФ DW_TAG_pointer_type DW_AT_type ┬лint┬╗.
dwarf_add_AT_reference:
 Dwarf_P_Attribute dwarf_add_AT_reference( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_P_Die otherdie, Dwarf_Error *error) 




рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реАред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдбреАрдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА .debug_line рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рд╣реИ, рддреЛ рдпрд╣ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдРрд╕реЗ рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐:

, . -, , -, , . , , ┬л┬╗ . , : DW_LNS_advance_pc тАФ , DW_LNS_set_file тАФ , , DW_LNS_const_add_pc тАФ ..
, libdwarf , .
рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдирд╛рдо рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ dwarf_add_file_decl рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 Dwarf_Unsigned dwarf_add_file_decl( Dwarf_P_Debug dbg, char *name, Dwarf_Unsigned dir_idx, Dwarf_Unsigned time_mod, Dwarf_Unsigned length, Dwarf_Error *error) 


рдлрд╝рдВрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдпрд╛ DW_DLV_NOCOUNT рдХреЛ рддреНрд░реБрдЯрд┐ рдкрд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рддреАрди рдХрд╛рд░реНрдп рд╣реИрдВ dwarf_add_line_entry_b, dwarf_lne_set_address, dwarf_lne_end_fter_ence, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдиреАрдЪреЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдмрдирд╛рдирд╛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ:


рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддреАрдХ рдмрдирд╛рдирд╛

┬л .symtab┬╗. . , . , , .


dwarf_new_die (. ┬л ┬╗), DW_TAG_subprogram, тАФ Compilation Unit ( ) DIE ( ). :

DW_AT_low_pc DW_AT_high_pc dwarf_add_AT_targ_address_b:
 Dwarf_P_Attribute dwarf_add_AT_targ_address_b( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_Unsigned pc_value, Dwarf_Unsigned sym_index, Dwarf_Error *error) 


рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ DW_DLV_BADADDR рд▓реМрдЯрд╛рдПрдЧрд╛ред

FDE рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдмрдирд╛рдирд╛

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

рдЖрдк dwarf_new_fde рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ FDE рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 Dwarf_P_Fde dwarf_new_fde( Dwarf_P_Debug dbg, Dwarf_Error *error) 

рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ рдПрдХ рдирдпрд╛ FDE рд╡рд┐рд╡рд░рдгрдХ рдпрд╛ DW_DLV_BADADDR рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдЖрдк dwarf_add_frame_fde рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ FDE рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 Dwarf_Unsigned dwarf_add_frame_fde( Dwarf_P_Debug dbg, Dwarf_P_Fde fde, Dwarf_P_Die die, Dwarf_Unsigned cie, Dwarf_Addr virt_addr, Dwarf_Unsigned code_len, Dwarf_Unsigned sym_idx, Dwarf_Error* error) 


рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ DW_DLV_NOCOUNT рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред
рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рдж, рдЖрдк рд╣рдорд╛рд░реЗ FDE рдореЗрдВ DW_CFA_xxxx рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ dwarf_add_fde_inst рдФрд░ dwarf_fde_cfa_offset рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рд╕реВрдЪреА рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
 Dwarf_P_Fde dwarf_add_fde_inst( Dwarf_P_Fde fde, Dwarf_Small op, Dwarf_Unsigned val1, Dwarf_Unsigned val2, Dwarf_Error *error) 


Dwarf_fde_cfa_offset рдлрд╝рдВрдХреНрд╢рди DW_CFA_offset рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
 Dwarf_P_Fde dwarf_fde_cfa_offset( Dwarf_P_Fde fde, Dwarf_Unsigned reg, Dwarf_Signed offset, Dwarf_Error *error) 


, , lr (r14). DW_CFA_advance_loc , 1, pc 2 (. Common Information Entry, code_align), DW_CFA_def_cfa_offset 4 ( 4 ) dwarf_fde_cfa_offset reg=14 offset=1, r14 -4 CFA.


, . ┬л ┬╗


C

:

Dwarf_lne_set_address рдлрд╝рдВрдХреНрд╢рди рдЙрд╕ рдкрддреЗ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдирд┐рд░реНрджреЗрд╢ рдмреНрд▓реЙрдХ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
 Dwarf_Unsigned dwarf_lne_set_address( Dwarf_P_Debug dbg, Dwarf_Addr offs, Dwarf_Unsigned symidx, Dwarf_Error *error) 


рд░рд┐рдЯрд░реНрди 0 (рд╕рдлрд▓рддрд╛) рдпрд╛ DW_DLV_NOCOUNT (рддреНрд░реБрдЯрд┐)ред
Dwarf_add_line_entry_b рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ .debug_line рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ:
 Dwarf_Unsigned dwarf_add_line_entry_b( Dwarf_P_Debug dbg, Dwarf_Unsigned file_index, Dwarf_Addr code_offset, Dwarf_Unsigned lineno, Dwarf_Signed column_number, Dwarf_Bool is_source_stmt_begin, Dwarf_Bool is_basic_block_begin, Dwarf_Bool is_epilogue_begin, Dwarf_Bool is_prologue_end, Dwarf_Unsigned isa, Dwarf_Unsigned discriminator, Dwarf_Error *error) 


рдлрд╝рдВрдХреНрд╢рди 0 (рд╕рдлрд▓рддрд╛) рдпрд╛ DW_DLV_NOCOUNT (рддреНрд░реБрдЯрд┐) рджреЗрддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, dwarf_lne_end_fterence рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ:
 Dwarf_Unsigned dwarf_lne_end_sequence( Dwarf_P_Debug dbg, Dwarf_Addr address; Dwarf_Error *error) 


рд░рд┐рдЯрд░реНрди 0 (рд╕рдлрд▓рддрд╛) рдпрд╛ DW_DLV_NOCOUNT (рддреНрд░реБрдЯрд┐)ред
рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред

рдЪрд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдирд╛

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЪрд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдирд╛рдо, рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ (рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░) рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдирдХрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд┐рдд рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА рд╣реИред рдпрджрд┐ рд╡реИрд░рд┐рдПрдмрд▓ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрднрд┐рднрд╛рд╡рдХ рд╕рдВрдХрд▓рди рдЗрдХрд╛рдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рд╕реНрдерд╛рдиреАрдп - рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдб (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЙрдирдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)ред рдЖрдк рдпрд╣ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░ рдШреЛрд╖рдгрд╛ рдХрд┐рд╕ рдлрд╝рд╛рдЗрд▓, рд▓рд╛рдЗрди рдФрд░ рдХреЙрд▓рдо рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
, , . , тАФ (location expressions). тАФ ( DW_OP_) - , , . , :

, (dwarf_new_expr), (dwarf_add_expr_addr, dwarf_add_expr_gen .) DW_AT_location (dwarf_add_AT_location_expression).
0 :
 Dwarf_Expr dwarf_new_expr( Dwarf_P_Debug dbg, Dwarf_Error *error) 

dwarf_add_expr_gen:
 Dwarf_Unsigned dwarf_add_expr_gen( Dwarf_P_Expr expr, Dwarf_Small opcode, Dwarf_Unsigned val1, Dwarf_Unsigned val2, Dwarf_Error *error) 


рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ DW_DLV_NOCOUNT рджреЗрддрд╛ рд╣реИред
рдХрд┐рд╕реА рдЪрд░ рдХрд╛ рдкрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдмрдЬрд╛рдп dwarf_add_expr_addr рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
 Dwarf_Unsigned dwarf_add_expr_addr( Dwarf_P_Expr expr, Dwarf_Unsigned address, Dwarf_Signed sym_index, Dwarf_Error *error) 


рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ DW_DLV_NOCOUNT рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдЖрдк рдмреМрдиреЗ_add_AT_location_expr рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рдкрддрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
 Dwarf_P_Attribute dwarf_add_AT_location_expr( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_P_Expr loc_expr, Dwarf_Error *error) 


DW_DLV_NOCOUNT .
( ) тАФ DW_TAG_variable, DW_TAG_formal_parameter DW_TAG_const_type . :



рдбрд┐рдмрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдирд╛

рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реВрдЪрдирд╛ рдЯреНрд░реА рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдпреЛрдЧрд┐рдиреА-рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ:

рд╕рдорд╛рд░реЛрд╣
 dwarf_transform_to_disk_form ( Dwarf_P_Debug dbg, Dwarf_Error* error) 

рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣рдо рдмрд╛рдЗрдирд░реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд┐рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкрд░ рдмрдирд╛рдП рдЧрдП рдпреЛрдЧрд┐рдиреА рдЦрдВрдб рдпрд╛ DW_DLV_NOCOUNT рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ dwarf_producer_init_c рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╕рдордп рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рд╣рдореЗрдВ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 typedef int (*Dwarf_Callback_Func_c)( char* name, int size, Dwarf_Unsigned type, Dwarf_Unsigned flags, Dwarf_Unsigned link, Dwarf_Unsigned info, Dwarf_Unsigned* sect_name_index, void * user_data, int* error) 


рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:

рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, dwarf_transform_to_disk_form рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред рд╣рдореЗрдВ рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдХреЗ рд▓рд┐рдП 0 рд╕реЗ рдПрдХ рдЪрдХреНрд░ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛:


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рдирд╛

рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рдмрди рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк libdwarf рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреМрдирд╛_рдкреНрд░реЛрдбреНрдпреВрд╕рд░_рдлрд┐рдирд┐рд╢ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 Dwarf_Unsigned dwarf_producer_finish( Dwarf_P_Debug dbg, Dwarf_Error* error) 

рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкрд░ DW_DLV_NOCOUNT рджреЗрддрд╛ рд╣реИред
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдбрд┐рд╕реНрдХ рдкрд░ рд▓реЗрдЦрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ "рдИрдПрд▓рдПрдл - рдлрд╛рдЗрд▓ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдмрдирд╛рдирд╛" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдирд┐рд╖реНрдХрд░реНрд╖


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


рд╕рдВрджрд░реНрдн


ELF



рдмреМрдирд╛

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


All Articles