C рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд╛рдЗрдирд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреИрд╕реЗ рдмрдиреЗ

рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реА рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде extern рд╕рд░рдгреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 extern int external_array[]; int array_get (long int index) { return external_array[index]; } 

External_array рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:

 int external_array[3] = { 1, 2, 3 }; 

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЕрд▓рдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рддреА рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

 int external_array[4] = { 1, 2, 3, 4 }; 

рдпрд╛ рддреЛ:

 int external_array[2] = { 1, 2 }; 

рдХреНрдпрд╛ рдмрд╛рдЗрдирд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдмрд╢рд░реНрддреЗ рдХрд┐ рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░рди рд╕рдордп рдкрд░ рд╕рд░рдгреА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)?

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

рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рдбреЗрдЯрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд▓рд┐рдВрдХ


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

X86-64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐, рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд░рдгреА рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдП рдЧрдП array_get рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдПрдХрд▓ movl рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 array_get: movl external_array(,%rdi,4), %eax ret 

рдЗрд╕рд╕реЗ, рдХреЛрдбрд╛рдВрддрд░рдХ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ R_X86_64_32S рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд R_X86_64_32S ред

 0000000000000000 : 0: mov 0x0(,%rdi,4),%eax 3: R_X86_64_32S external_array 7: retq 

рдпрд╣ рдЪрд╛рд▓ рд▓рд┐рдВрдХрд░ ( ld ) рдХреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╕рдордп рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди external_array рдЪрд░ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд╛рди рдХреЛ рдХреИрд╕реЗ рдкреЙрдкреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЗрд╕рдХреЗ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред

  • рдЪреВрдВрдХрд┐ рдЪрд░ рдХреА рдСрдлрд╕реЗрдЯ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рд░рди рд╕рдордп рдкрд░ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдореВрд▓реНрдп рд╣реА рд╕реНрдореГрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред
  • рдСрдлрд╕реЗрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рдЪрд░ рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рд▓реЗрдЖрдЙрдЯ рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП GNU / Linux рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдФрд░ рд▓рд┐рдВрдХ рдкреНрд░рд╛рд░реВрдк (ELF) рдХреЗ рд▓рд┐рдП рдЙрдиреНрдореБрдЦ, extern рдЪрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред array_get рдЙрджрд╛рд╣рд░рдг рдореЗрдВ array_get рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЬреНрдЮрд╛рдд рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреВрд░реА рдЕрд╕реЗрдВрдмрд▓рд░ рдлрд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ ( -fno-asynchronous-unwind-tables рд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рдЪрд╛рд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ -fno-asynchronous-unwind-tables , рдЬреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ psabi рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ):

  .file "get.c" .text .p2align 4,,15 .globl array_get .type array_get, @function array_get: movl external_array(,%rdi,4), %eax ret .size array_get, .-array_get .ident "GCC: (GNU) 8.3.1 20190223 (Red Hat 8.3.1-2)" .section .note.GNU-stack,"",@progbits 

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

рдпрджрд┐ ELF рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЪрд░ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ array_get рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рднреА рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

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

рдЖрдо ELF рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕


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

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

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

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

 array_get: movq external_array@GOTPCREL(%rip), %rax movl (%rax,%rdi,4), %eax ret 

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

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

рдЗрд╕рдХреЗ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ external_array рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 int external_array[3] = { 1, 2, 3 }; 

рдпрд╣рд╛рдВ рдПрдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдкреНрд░рддреАрдХ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред readelf -rW рдЗрд╕реЗ R_X86_64_COPY рд░реВрдк рдореЗрдВ R_X86_64_COPY ред

  0x408 рдСрдлрд╕реЗрдЯ рдкрд░ '' .rela.dyn 'рдЦрдВрдб 3 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
     рдСрдлрд╕реЗрдЯ рдЬрд╛рдирдХрд╛рд░реА рдЯрд╛рдЗрдк рд╕рд┐рдВрдмрд▓ рдХреА рд╡реИрд▓реНрдпреВ рд╕рд┐рдВрдмрд▓ рдХрд╛ рдирд╛рдо + рдПрдбреЗрдВрдб
 0000000000403ff0 0000000100000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0
 0000000000403ff8 0000000200000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
 0000000000404020 0000000300000005 R_X86_64_COPY 0000000000404020 external_array + 0 

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

  рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ '.dynsym' рдореЗрдВ 4 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╣реИрдВ:
    рд╕рдВрдЦреНрдпрд╛: рдорд╛рди рдЖрдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдмрд╛рдЗрдВрдб рд╡рд┐рдЬрд╝ рдирд┐рдбрдХреНрд╕ рдирд╛рдо
      0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 
      1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
      2: 0000000000000000 0 рдиреЛрдЯ рдирд╣реАрдВ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдЕрдВрдХ __gmon_start__
      3: 0000000000404020 12 рдУрдмреНрдЬреИрдХреНрдЯ рдЧреНрд▓реЛрдмрд▓ рдбрд┐рдлреЙрд▓реНрдЯ 22 рдПрдХреНрд╕рдЯрд░реНрдирд▓_рдЕрд░реЗ 

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

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

рдмрд╛рдЗрдирд░реА рд╕рдВрдЧрддрддрд╛ рдкрд░ рдкреНрд░рднрд╛рд╡


рдпрджрд┐ рд╣рдо рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд▓рд┐рдВрдХ рдХрд┐рдП рдмрд┐рдирд╛ (рдпрд╛ рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг) рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ external_array рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕рд░рдгреА рддрддреНрд╡ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 int external_array[4] = { 1, 2, 3, 4 }; 

рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд░ рд╕реЗ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:

main-program: Symbol `external_array' has different size in shared object, consider re-linking

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЕрднреА рднреА рдХреЗрд╡рд▓ 12 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП external_array рд╕рд╛рде рдПрдХ external_array рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЕрдзреВрд░реА рд╣реИ: рд╕рд░рдгреА рдХреЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рддреАрди рддрддреНрд╡ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд░рдгреА рддрддреНрд╡ extern_array[3] рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рди рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреВрд░реЗ рдХреЛрдб рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ extern_array рд╕рднреА рд╕рдВрджрд░реНрдн рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред рдЗрд╕рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдПрдХ extern_array рдкрд░рд┐рднрд╛рд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рд╢рд╛рдпрдж рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рддрддреНрд╡ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

 int external_array[2] = { 1, 2 }; 

рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрд░реЗ рддрддреНрд╡ рдХреЛ extern_array[2] рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ extern_array[2] , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдПрд░реЗ рдХреА рдХрдо рд▓рдВрдмрд╛рдИ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╕рд░рдгреА рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдЕрдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝ рджреЗрдЧрд╛ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

  • рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд░рдгреА рдЪрд░ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рдВрдЧрддрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИред
  • рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрдЗрдЯрдореЛрдВ рдХреЛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рд╕реЗ рдмрдЪрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рддрдВрддреНрд░ рди рд╣реЛрдиреЗ рдкрд░ рдЖрдЗрдЯрдо рдирд┐рдХрд╛рд▓рдирд╛ рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рджрд┐рдЦрддреА рд╣реИ, рдФрд░ рджреВрд░рджрд░рд╛рдЬ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рдЬрд╛рдП


рдПрдмреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд▓рд┐рдореНрдмрд┐рдЧреЗрд▓ рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕рд░рдгреА рдХрд╛ рдкрддрд╛ рджреЗрддрд╛ рд╣реИ:

 static int local_array[3] = { 1, 2, 3 }; int * get_external_array (void) { return local_array; } 

рдпрджрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рд╕рд░рдгреА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЗрд╕рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рднреА рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХрдЯрд╛рд╡ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪреЗрдВ:

 int local_array[3] __attribute__ ((visibility ("hidden"))) = { 1, 2, 3 }; 

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

рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрднреА рднреА рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗред рдЗрд╕ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдирдП рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣рдореЗрд╢рд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рдеред рдЪреВрдВрдХрд┐ рдкреНрд░рддреАрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЖрдХрд╛рд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓рд┐рдВрдХ рд╕рдВрдкрд╛рджрдХ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╡реЗ рд╣рдореЗрд╢рд╛ рд╕реБрд╕рдВрдЧрдд рд╣реЛрддреЗ рд╣реИрдВред GNU C рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдЪрд░ sys_errlist рдФрд░ sys_siglist рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ sys_siglist ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрднреА рднреА рдПрдХ рднреА рдирд┐рд░рдВрддрд░ рд╕рд░рдгреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рднреА рдЪреАрдЬреЗрдВ рдорд╛рдиреА рдЬрд╛рддреА рд╣реИрдВ, рдПрдХ get_external_array рдлрд╝рдВрдХреНрд╢рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, get_external_array рдлрд╝рдВрдХреНрд╢рди рдКрдкрд░) рдЗрд╕ ABI рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

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


All Articles