system hacking ๐Ÿ“ฑ/techniques โŒ principles

์ปดํŒŒ์ผ๋Ÿฌ ์ž‘๋™ ์›๋ฆฌ

Kortsec1 2024. 10. 31. 02:01

์†Œ๊ฐœ

์ปดํŒŒ์ผ๋Ÿฌ๋ž€ ๋ฌด์—‡์ผ๊นŒ? ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด ๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์–ธ์–ด๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, run ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ํ˜น์€ ์ง์ ‘ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‹คํ–‰์‹œ์ผœ๋ณธ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ…์ŠคํŠธ ํŒŒ์ผ ํ˜•ํƒœ์˜ ์†Œ์Šค ํŒŒ์ผ(source file)์ด ์‹คํ–‰ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ๊ณผ์ •์ด ๊ถ๊ธˆํ–ˆ๋˜ ์‚ฌ๋žŒ ๋˜ํ•œ ๋งŽ์„ ๊ฒƒ์ด๋‹ค(๋‚ด๊ฐ€ ๊ทธ๋ ‡๋‹ค). ๊ทธ๋ฆฌํ•˜์—ฌ ๊ทธ ๊ณผ์ • ไธญ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆผ1 โ˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ณผ์ •

๋‹ค์‹œ ๋ณธ ์งˆ๋ฌธ์œผ๋กœ ๋“ค์–ด์™€์„œ, ์ปดํŒŒ์ผ๋Ÿฌ๋ž€ ๋ฌด์—‡์ผ๊นŒ? ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ˆœํžˆ ๋ฒˆ์—ญ๊ธฐ ์ด์ž ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ(text processor)๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ฌด๊ด€ํ•˜๋‹ค. ์•ž์„œ ์Šคํฌํ–ˆ๋“ฏ ํ…์ŠคํŠธ ํŒŒ์ผ ํ˜•ํƒœ์˜ ์†Œ์Šค ํŒŒ์ผ(source file)์„ CPU๊ฐ€ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ฒˆ์—ญํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์œ„ ๊ทธ๋ฆผ1 ์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.
๋‹จ์ˆœํ•˜๊ฒŒ ์‹œ์ž‘๊ณผ ๊ฒฐ๊ณผ๋งŒ์„ ๋ณด๊ณ ์„ , ์ •ํ™•ํ•œ ๊ธฐ๋Šฅ์„ ์œ ์ถ”ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ํ•œ ๋‹จ๊ณ„์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๊ฐ€ ๋ณด๋„๋ก ํ•˜์ž.
 

์‹คํ–‰ ๊ณผ์ •

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์ผ๋ถ€ ๋‹จ๊ณ„๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณดํ†ต ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋ฅผ ๊ฑฐ์ณ ์‹คํ–‰๋œ๋‹ค.

  • ๊ตฌ๋ฌธ ๋ถ„์„
  • ์ตœ์ ํ™”
  • ์ฝ”๋“œ ์ƒ์„ฑ
  • ๋งํ‚น

๋˜ํ•œ, ๋ณธ ์„ธ๋ถ€ ๊ณผ์ •์„ ์‚ดํŽด ๋ณด๊ธฐ ์ „, ์ฐธ๊ณ ํ•˜์—ฌ ์‚ดํŽด๋ณผ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

int a=1;
int b=2;

while (a<b) {
  b = b - 1;
}

 

๊ตฌ๋ฌธ ๋ถ„์„(Syntax Analysis)

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋จผ์ € ๊ฐ ํ•ญ๋ชฉ์„ ์ž˜๊ฒŒ ์ชผ๊ฐ ๋‹ค(์—ฐ์‚ฐ์ž, ๊ด„ํ˜ธ, ์‹๋ณ„์ž ๋“ฑ). ์ด๋•Œ ๊ฐ ํ•ญ๋ชฉ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ int๋ฅผ ๋ณด๋ฉด, 'ํ‚ค์›Œ๋“œ(keyword)๋ผ๋Š” ์‚ฌ์‹ค'๊ณผ '๊ทธ์ค‘ int ํ‚ค์›Œ๋“œ๋ผ๋Š” ์‚ฌ์‹ค'์ด๋ผ๋Š” ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ ํ•ญ๋ชฉ์— ์ถ”๊ฐ€๋กœ ์ •๋ณด๋ฅผ ๊ฒฐํ•ฉํ•œ ๊ฒƒ์„ ์ „๋ฌธ์šฉ์–ด๋กœ ํ† ํฐ(token)์ด๋ผ๊ณ  ํ•œ๋‹ค.
์ด์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ€์žฅ ๋จผ์ € ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋Œ์•„๋‹ค๋‹ˆ๋ฉด์„œ ๋ชจ๋“  ํ† ํฐ์„ ์ฐพ์•„๋‚ธ๋‹ค. ์šฐ๋ฆฌ์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ฐ ์ค„์€ ํ•˜๋‚˜์˜ ํ† ํฐ์„ ์˜๋ฏธํ•œ๋‹ค.

T_Keyword     int
T_Identifier  a
T_Assign      =
T_Int         1
T_Semicolon   ;
T_Keyword     int
T_Identifier  b
T_Assign      =
T_Int         2
T_Semicolon   ;
T_While       while
T_LeftParen   (
T_Identifier  a
T_Less        <
T_Identifier  b
T_RightParen  )
T_OpenBrace   {
T_Identifier  b
T_Assign      =
T_Identifier  b
T_Minus       -
T_Int         1
T_Semicolon   ;
T_CloseBrace  }

 
์ด๋ ‡๊ฒŒ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํ† ํฐ์„ ์ถ”์ถœํ•˜๋Š” ๊ณผ์ •์„ ์–ดํœ˜ ๋ถ„์„(lexical analysis)๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋Š” ๊ตฌ๋ฌธ์— ๋”ฐ๋ผ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ตฌ๋ฌธ์— ๋”ฐ๋ผ ํ† ํฐ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. while ๊ตฌ๋ฌธ์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž.

while (ํ‘œํ˜„์‹) {
 ๋ฐ˜๋ณต ๋‚ด์šฉ
 }

์œ„ while ๊ตฌ๋ฌธ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 'while' ํ‚ค์›Œ๋“œ์˜ ํ† ํฐ์„ ์ฐพ์œผ๋ฉด ๋‹ค์Œ ํ† ํฐ์ด '('๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ์ƒํƒœ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋ฌผ๋ก  while ํ‚ค์›Œ๋“œ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ† ํฐ์ด ์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฌธ๋ฒ• ์˜ค๋ฅ˜(syntax error)๋ฅผ ๋‚ผ ๊ฒƒ์ด๋‹ค. '(' ํ† ํฐ์„ ์ •์ƒ์ ์œผ๋กœ ๋ฐ›์•˜๋‹ค๋ฉด, ๋‹ค์Œ ํ† ํฐ์€ ๋ถˆ(bool) ํ‘œํ˜„์‹์ด์–ด์•ผ ํ•œ๋‹ค. ๊ตฌ๋ฌธ์— ๋”ฐ๋ผ ๊ผผ๊ผผํ•˜๊ฒŒ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(abstract syntax tree, AST) ํ˜•ํƒœ๋กœ ๋นŒ๋“œ๋˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์€ ํ•ด์„(parsing)์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์•„๋ž˜ ๊ทธ๋ฆผ2 ๋Š” ๊ตฌ๋ฌธ ํŠธ๋ฆฌ์˜ ์˜ˆ์‹œ์ด๋‹ค.

๊ทธ๋ฆผ2 โ˜ ์ƒ์„ฑ๋œ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ

ํ† ํฐ ์ถ”์ถœ ๋ถ€ํ„ฐ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ ์ƒ์„ฑ๊นŒ์ง€์˜ ์ „์ฒด ๊ณผ์ •์„ ๊ตฌ๋ฌธ ๋ถ„์„(syntax analysis)๋ผ๊ณ  ํ•œ๋‹ค.
 

์ตœ์ ํ™”(Optimizing)

์ตœ์ ํ™” ๋‹จ๊ณ„๋Š” ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ , ์‚ฐ์ถœ๋˜๋Š” ๊ธฐ๊ณ„ ์ฝ”๋“œ์˜ ์งˆ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ณผ์ •์ด๋‹ค. ์ด์— ํ™œ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋‘ ๊ธฐ๋ฒ•๋งŒ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

1. Common Subexpression Elimination (CSE)

Common Subexpression Elimination, ์ดํ•˜ CSE, ๋Š” ํŠน์ • ํ‘œํ˜„์‹์„ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๋Š” ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋กœ ์น˜ํ™˜ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

๊ทธ๋ฆผ3 โ˜ Common Subexpression Elimination

์œ„ ๊ทธ๋ฆผ3์„ ์˜ˆ๋กœ ๋“ค๋ฉด, b*c๋ผ๋Š” ํฌํ˜„์‹์„ ํ•ด๋‹น ๊ฒฐ๊ด๊ฐ’์„ ๊ฐ€์ง„ tmp๋กœ ์น˜ํ™˜ํ•˜๋Š” ์‹์ด๋‹ค. ๊ณฑ์…ˆ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๋น„์šฉ๊ณผ tmp๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋”์šฑ ํšจ์œจ์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ ์„ ํƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

2. Constant Folding/Propagation

์ƒ์ˆ˜๋ผ๋Š” ๊ณตํ†ต์œผ๋กœ ๋‘ ๊ธฐ๋ฒ•์„ ๋ฌถ์–ด ๋ณด์•˜๋‹ค(์‹ค์ œ๋กœ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค).
์šฐ์„ , Constant Folding์€ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ƒ์ˆ˜ ํ‘œํ˜„์— ๋Œ€ํ•œ ์ธ์‹๊ณผ ๊ณ„์‚ฐ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

a = 150 * 50 * 12
b = "hel" + "lo"

๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์œ„ ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜ a์™€ ๊ฐ™์ด ๋‘๋ฒˆ์˜ ๊ณฑ์—ฐ์‚ฐ์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ์ธ 90000์„ ์ปดํŒŒ์ผ ๊ณผ์ •์— ์น˜ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ, ๋ณ€์ˆ˜ b์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ๋„ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ("hello")์™€ ์น˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
์ด์–ด์„œ Constant Propagation์€ ํŠน์ • ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ํ‘œํ˜„์‹์—์„œ ๊ฐ’(์„ ์–ธ๋œ ์ƒ์ˆ˜)์œผ๋กœ ์น˜ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” Constant Folding๊ณผ Constant Propagation์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.

int x = 16;
int y = 10 - x / 4;
return y * (32 / x + 1);

x๋ฅผ ์น˜ํ™˜ํ•œ๋‹ค

int x = 16;
int y = 10 - 16 / 4;
return y * (32 / 16 + 1);

๊ณ„์‚ฐ ํ›„ ์ด์–ด์„œ y๋„ ์น˜ํ™˜ํ•œ๋‹ค

int x = 16;
int y = 6;
return 6 * 3;

๊ฒฐ๊ณผ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค

int x = 16;
int y = 6;
return 18;

Dead Code Elimination, Loop Invariant Code Motion๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•๋“ค๋„ ์†Œ๊ฐœํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ธ€์˜ ์ „์ฒด์ ์ธ ๊ธธ์ด๋ฅผ ์œ„ํ•ด ๋”ฐ๋กœ ์ •๋ฆฌํ•˜์—ฌ ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‘ ๋ฒˆ์งธ ๊ณผ์ • ์ตœ์ ํ™”(Optimizing)๋ฅผ ๋งˆ์น˜๊ณ  ๋‹ค์Œ ๊ณผ์ •์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
 

์ฝ”๋“œ ์ƒ์„ฑ

int a=1;
int b=2;

while (a<b) {
  b = b - 1;
}

์œ„ ์ฝ”๋“œ๋ฅผ ๊ธฐ์–ตํ•˜๋Š”๊ฐ€? ๊ตฌ๋ฌธ ๋ถ„์„์ด ๋๋‚˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ตœ์ ํ™”๊ฐ€ ์ง„ํ–‰๋œ ์ค‘๊ฐ„ ์ฝ”๋“œ(Intermediate Representation Code, IR Code)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์ฝ”๋“œ๋ฅผ ๊ฑฐ์ณ ๊ธฐ๊ณ„ ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”๋ฐ, ์ง€๊ธˆ ๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ๋“ฏ ๊ต‰์žฅํžˆ ๋ณต์žกํ•˜๊ณ  ์ง€๋Šฅ์ ์ธ ๊ณผ์ •์ด๊ธฐ์— ๋„˜๊ธฐ๊ณ  ๊ฒฐ๊ณผ๋งŒ์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

๊ทธ๋ฆผ4 โ˜ ์ฝ”๋“œ ์ƒ์„ฑ ๊ณผ์ •

์ด๊ฒƒ์œผ๋กœ ์ „์ฒด ์ปดํŒŒ์ผ ๊ณผ์ •์ด ๋๋‚˜์ง„ ์•Š๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด ๋ฐ์ดํ„ฐ๋Š” .o ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง€๋Š” ํŒŒ์ผ์— ์ €์žฅ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋Œ€์ƒ ํŒŒ์ผ(object file)์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์— ๊ฐ๊ฐ์˜ ๋Œ€์ƒ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
 

๋งํ‚น

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋Œ€์ƒ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์˜€๋‹ค๋ฉด, ๋ง์ปค๋Š” ๋Œ€์ƒ ํŒŒ์ผ์„ ํ•œ๋ฐ ๋ฌถ์–ด ์ตœ์ข… ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์œˆ๋„์˜ EXE ๋‚˜ ๋ฆฌ๋ˆ…์Šค์˜ ELF ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์‹คํ–‰ ํŒŒ์ผ์ด ๊ทธ ์ตœ์ข… ํ˜•์‹์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ํŠน์ •ํ•œ ์†Œ์Šค ํŒŒ์ผ์ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์ •์˜๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์‹œ์ ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์–ด๋Š ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์œ„์น˜ํ• ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ N์œผ๋กœ ํ‘œ์‹œํ•ด ๋‘๊ณ  ์ดํ›„ ๋งํฌ ๊ณผ์ •์—์„œ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

๊ทธ๋ฆผ5 โ˜ ๋งํฌ์™€ ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ

๊ฐ„๋‹จํ•˜๊ฒŒ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋งํ‚น ๋˜ํ•œ ์„ธ๋ถ€์ ์ธ ๊ณผ์ •์ด ์กด์žฌํ•œ๋‹ค. ๋‹ค๊ฐ™์ด ์„ธ ๊ฐ€์ง€ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž

1. ์‹ฌ๋ฒŒ ํ•ด์„

์šฐ์„ , ์‹ฌ๋ฒŒ ํ•ด์„์˜ ๋‹จ๊ณ„๋‹ค. ์—ฌ๊ธฐ์„œ ์‹ฌ๋ฒŒ(symbol)์ด๋ž€ ์ „์—ญ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์˜๋ฏธํ•œ๋‹ค. ๋ง์ปค๋Š” ๋Œ€์ƒ ํŒŒ์ผ์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์™ธ๋ถ€ ์‹ฌ๋ฒŒ๋งˆ๋‹ค ํ•ด๋‹นํ•˜๋Š” ์ •์˜๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์‹ฌ๋ฒŒ ์ •๋ณด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋Œ€์ƒ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ ํฌํ•จ์‹œ์ผœ ๋ง์ปค๋กœ ์ „๋‹ฌ๋œ๋‹ค. 

๊ทธ๋ฆผ6 โ˜ ๋Œ€์ƒ ํŒŒ์ผ์˜ ๊ตฌ์กฐ

์œ„ ๊ทธ๋ฆผ6์€ ๋Œ€์ƒํŒŒ์ผ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋“ค์ด๋‹ค. ์†Œ์Šค ํŒŒ์ผ ๋‚ด ์ •์˜๋œ ํ•จ์ˆ˜์—์„œ ๋ณ€ํ™˜๋œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๊ฐ€ ์ €์žฅ๋˜๋Š” Code Segment. ์†Œ์Šค ํŒŒ์ผ์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ถ€๋ถ„์ธ Data Segment. ๊ทธ๋ฆฌ๊ณ  Symbol Table์—๋Š” ์†Œ์Šค ํŒŒ์ผ๋งˆ๋‹ค ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ์‹ฌ๋ฒŒ๊ณผ ์–ด๋–ค ์™ธ๋ถ€ ์‹ฌ๋ฒŒ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๊ธฐ๋ก๋œ๋‹ค. ์‹ฌ๋ฒŒ ํ•ด์„ ๋‹จ๊ณ„๋Š” ๋ง์ปค๊ฐ€ ๊ฐ ๋Œ€์ƒ ํŒŒ์ผ ๋‚ด ์‚ฌ์šฉํ•  ์™ธ๋ถ€ ์‹ฌ๋ฒŒ์ด Symbol Table๋‚ด์— ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ธ ๊ฒƒ์ด๋‹ค.

2. ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ

์‹คํ–‰ ํŒŒ์ผ์˜ ๊ตฌ์กฐ ์†์—๋„ ๋Œ€์ƒ ํŒŒ์ผ๊ณผ ๊ฐ™์€ Code Segment์™€ Data Segment๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ฌผ๋ก  ์„ธ๋ถ€์ ์ธ ์ž‘๋™ ๋ฐฉ์‹์—๋Š” ๋งŽ์€ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ, ๋ง์ปค๊ฐ€ ๋Œ€์ƒํŒŒ์ผ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€ ๋ณ€ํ•จ ์—†๋‹ค. ๋ง์ปค๊ฐ€ ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ Static Linking๊ณผ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ Dynamic Linking์ด ์กด์žฌํ•œ๋‹ค. 

๊ทธ๋ฆผ7 โ˜ ์ •์  ๋งํ‚น๊ณผ ๋™์  ๋งํ‚น

๋Œ€์ƒ ํŒŒ์ผ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ณต์‚ฌํ•˜๋Š” Static Linking. ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ด๋ฆ„, ์‹ฌ๋ฒŒ ํ…Œ์ด๋ธ”, ์žฌ๋ฐฐ์น˜ ์ •๋ณด ๋“ฑ ํ•„์ˆ˜์ •๋ณด๋งŒ์„ ํฌํ•จ์‹œํ‚ค๊ณ  ์‹คํ–‰ ํŒŒ์ผ์˜ ์‹ค์ œ ์‹คํ–‰ ์‹œ์  ์‹œ ๋ถˆ๋Ÿฌ์˜ค๋Š” Dynamic Linking. ์ด ๋‘˜ ๊ฐ„์˜ ์žฅ๋‹จ์ ๊ณผ Dynamic Linking์˜ ์„ธ๋ถ€ ์ž‘๋™ ๊ณผ์ •์€ ๋”ฐ๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ณ , ์šฐ์„ ์€ ์œ„ ๊ทธ๋ฆผ7๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๊ฐ„๋‹ค๊ณ  ์ดํ•ดํ•˜์ž.

3. ์žฌ๋ฐฐ์น˜

์ง€๊ธˆ๊นŒ์ง€ ์™ธ๋ถ€ ์ฐธ์กฐํ•  ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์ฆ์„ ํ•˜๊ณ (์‹ฌ๋ฒŒ ํ•ด์„), ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํŒŒ์ผ์„ ์กฐ๋ฆฝํ• ์ง€(์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ) ์•Œ์•„๋ณด์•˜๋‹ค. ์ด์ œ ๋‚จ์€ ๊ฒƒ์€ ๊ทธ๋ฆผ6์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ํ•ด์„ํ•˜์—ฌ ๋ง์ปค๊ฐ€ ์™ธ๋ถ€ ์ฐธ์กฐ ๋ถ€๋ถ„์„ ์‹ค์ œ ์ฃผ์†Œ๋กœ ์žฌ๋ฐฐ์น˜์‹œํ‚ค๋Š” ๊ณผ์ •์ด๋‹ค. ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ์ฃผ์†Œ๋ž€, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋œ ํ›„์˜ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ(Physical Memory) ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ(Virtual Memory)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์Šคํ‚ตํ•˜๊ฒ ๋‹ค.

call func1

๋ง์ปค๊ฐ€ ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์€ func1 ํ•จ์ˆ˜์˜ ์œ„์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋Œ€์ƒ ํŒŒ์ผ์„ ๋งŒ๋“ค๋•Œ์˜ ๊ณผ์ •์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆผ6์˜ ๋Œ€์ƒ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด Relocation Information์ด๋ผ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ™•์ •ํ•  ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ ๋งˆ๋‹ค .relo.text์—๋Š” ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ €์žฅํ•˜๊ณ  .relo.data.์—๋Š” ํ•ด๋‹น ๋ช…๋ น์–ด์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋ง์ปค๋Š” ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ์žฌ๋ฐฐ์น˜๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆผ8 โ˜ ๋ง์ปค์˜ ์žฌ๋ฐฐ์น˜ ๊ณผ์ •

์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ๋˜๋ฉด ๋ชจ๋“  ๊ธฐ๊ณ„ ๋ช…๋ น์–ด์™€ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ๊ฐ„์— ์œ„์น˜ํ•  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์œ„ ๊ทธ๋ฆผ8์† ์žฌ๋ฐฐ์น˜ ๊ณผ์ •์˜ 1๋ฒˆ์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ณด์ž. func1์˜ ์ฃผ์†Œ๊ฐ€ ํ™•์ •๋œ ์ƒํƒœ์—์„œ ๋ง์ปค๋Š” ์ด๋Ÿฌํ•œ ์ฃผ์†Œ๋ฅผ 2๋ฒˆ๊ณผ ๊ฐ™์ด Code Segment์— ์žฌ๋ฐฐ์น˜์‹œํ‚ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
 

๋งˆ๋ฌด๋ฆฌ

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ์™€ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ ๋น„๋ฐ€๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ๋‚˜๋งˆ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ํ˜„๋Œ€์— ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „๋˜๊ณ  ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ๊ณผ์ • ๊ทธ ์ž์ฒด์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ๋Š” ์•„๋‹ˆ๋”๋ผ๋„ ํ๋ฆ„์ •๋„๋Š” ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋งŒ์ผ ๋‹น์‹ ์ด ์ด๋Ÿฌํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์–ด๋– ํ•œ ๊ณผ์ •์„ ์–ด๋–ป๊ฒŒ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ง€ ์ƒ๊ฐํ•ด ๋ณด์ž.
 

์ฐธ๊ณ  ์ž๋ฃŒ

https://pages.cs.wisc.edu/~fischer/cs701.f05/lectures/Lecture02.4up.pdf
https://en.wikipedia.org/wiki/Copy_propagation#cite_note-dragonbook-1
https://en.wikipedia.org/wiki/Object_file
https://stackoverflow.com/questions/16749522/symbol-table-and-relocation-table-in-object-file