[CS:APP] Chapter 7. Linking

June 11, 2023, 7:02 p.m. ยท 12 min read ยท ๐ŸŒ๏ธŽ ko

CS:APP system programming

๋งํ‚น(Linking)์ด๋ž€ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ์˜ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์„ ํ•ฉ์นจ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌํ•ด ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด๋‹ค. ์ด ๊ณผ์ •์€ compile time์—, load time (loader์— ์˜ํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ฎ๊ฒจ์งˆ ๋•Œ), ๋˜๋Š” ์‹ฌ์ง€์–ด๋Š” run time์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ํ˜„๋Œ€ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ๋งํ‚น์€ ์ฃผ๋กœ ๋ง์ปค(linker)์— ์˜ํ•ด์„œ ์ˆ˜ํ–‰๋œ๋‹ค.
๋ถ„ํ•  ์ปดํŒŒ์ผ(separate compilation)๊ณผ ๊ฐ™์€ ๊ฐœ๋…์€ ์ „์ ์œผ๋กœ ๋ง์ปค๊ฐ€ ์žˆ๊ธฐ์— ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ๋ง์ปค๊ฐ€ ์—†์—ˆ๋”๋ผ๋ฉด, ์ปค๋‹ค๋ž€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ชจ๋“ˆ ํ•˜๋‚˜์— ์กฐ๊ทธ๋งŒ ๋ณ€ํ™”๋งŒ ์žˆ์–ด๋„ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ์žฌ์ปดํŒŒ์ผํ•ด์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

7.1. ์ปดํŒŒ์ผ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„

์ปดํŒŒ์ผ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„๋ž€ ์ „์ฒ˜๋ฆฌ๊ธฐ(preprocessor), ์ปดํŒŒ์ผ๋Ÿฌ, ์–ด์…ˆ๋ธ”๋Ÿฌ, ๊ทธ๋ฆฌ๊ณ  ๋ง์ปค๋ฅผ ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ์„œ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ gcc๊ฐ€ ๋ฐ”๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„์— ํ•ด๋‹นํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ, main.c๊ฐ€ sum.c์—์„œ ์ •์˜๋œ ํ•จ์ˆ˜ sum()์„ ์ฐธ์กฐ(reference)ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž. ํ„ฐ๋ฏธ๋„์—์„œ

gcc -Og -o prog main.c sum.c

๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด, gcc๋Š” ๋‹ค์Œ์˜ ๋„ค ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ executable object๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  1. cpp [other arguments] main.c /tmp/main.i์™€ ๊ฐ™์ด ์ „์ฒ˜๋ฆฌ๊ธฐ cpp(C Preprocessor)๋ฅผ ํ˜ธ์ถœํ•ด main.i ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.
  2. cc1 /tmp/main.i -Og [other arguments] -o tmp/main.s๋กœ ์ปดํŒŒ์ผ๋Ÿฌ cc1์„ ์‹คํ–‰์‹œ์ผœ์„œ ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ main.s๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  3. as [other arguments] -o /tmp/main.o /tmp/main.s๋กœ ์–ด์…ˆ๋ธ”๋Ÿฌ as๋ฅผ ํ˜ธ์ถœํ•ด ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ main.s๋ฅผ relocatable object file main.o๋กœ ๋ฒˆ์—ญํ•œ๋‹ค.
  4. sum.c์— ๋Œ€ํ•ด์„œ๋„ ์œ„ 1~3์˜ ๊ณผ์ •์ด ์ผ์–ด๋‚˜ relocatable object file sum.o๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋‘๊ฐœ๋ฅผ ๋ง์ปค ld๊ฐ€ ๋งํ‚นํ•ด์ค€๋‹ค. ld -o prog [system object files and args] /tmp/main.o /tmp/sum.o

์ด๋กœ์จ ๋ฐ”๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ executable object file prog๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋„ค ๊ฐ€์ง€ ๊ณผ์ •์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฌถ์–ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ปดํŒŒ์ผ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„์ด๋‹ค.

7.2. ์ •์  ๋งํ‚น

๋’ค์—์„œ ์‚ดํŽด๋ณด๊ฒ ์ง€๋งŒ ๋งํ‚น์—๋Š” ์ •์  ๋งํ‚น(static linking)๊ณผ ๋™์  ๋งํ‚น(dynamic linking)์ด ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๋™์  ๋งํ‚น์ด ํ›จ์”ฌ ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ๊นŒ๋‹ค๋กœ์šด ํŽธ์ด๋‹ค.

์šฐ์„  ์ •์  ๋ง์ปค๋ž€ relocatable object๋“ค์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„์„œ executable object๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค. ์ •์  ๋ง์ปค๊ฐ€ ํ•˜๋Š” ์ผ์„ ์„ค๋ช…ํ•˜๋ ค๋ฉด ๋จผ์ € relocatable object file์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, ์šฐ์„ ์€ ๊ทธ๋ƒฅ code์™€ data๊ฐ€ ์„น์…˜๋ณ„๋กœ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ linking์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ •๋„๋กœ๋งŒ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ •์  ๋งํ‚น์€ ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜์–ด ์ผ์–ด๋‚œ๋‹ค.

  1. symbol resolution: ์ฝ”๋“œ์—์„œ ์–ด๋–ค ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ฐพ์•„์„œ ๊ทธ ์ •์˜๋ฅผ ์ฐพ์•„ ๋ฌถ์–ด์ฃผ๋Š” ๊ณผ์ •์ด๋‹ค. ์ด๋•Œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” cnt๋‚˜func1๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•˜๋ฏ€๋กœ symbol์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  2. relocation: ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ๋งŒ๋“  code/data section๋“ค์€ ์ฃผ์†Œ๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๋ง์ปค๋Š” ์ด๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์žฌ๋ฐฐ์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด symbol์„ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ๋“ค์€ ๊ฐ์ž์˜ ๊ณ ์œ ํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์ฝ”๋“œ์—์„œ symbol์„ ์ฐธ์กฐํ•œ ๋ถ€๋ถ„์„ ๊ทธ ์ •์˜์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

7.3. ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ

์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์—๋Š” ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ์™€ ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ relocatable object๋ฅผ ๋งŒ๋“ค๋ฉด, ๋ง์ปค๋Š” ์ด๋“ค์„ ์ด์–ด๋ถ™์—ฌ executable object file์„ ๋งŒ๋“ ๋‹ค. ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ํ˜•์‹์€ ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋‹ค๋ฅธ๋ฐ, Linux๋Š” Executable and Linkable Format(ELF)๋ผ๋Š” ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ์œˆ๋„์šฐ์—์„œ๋Š” portable executable(PE), Mac์—์„œ๋Š” mach-o ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

7.4. Relocatable Object File

Relocatable object file์€ ์ฃผ์†Œ 0์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋‹ค์Œ์˜ ์„น์…˜๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

๋จผ์ € ELF header๋Š” word size์™€ byte ordering(little endian, big endian) ๋“ฑ์˜ ๊ทœ๊ฒฉ์„ ๋ช…์‹œํ•œ๋‹ค. ๋ง์ปค๊ฐ€ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ parsingํ•˜๊ณ  ํ•ด์„ํ•  ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด๋‹ค. ๋งจ ๋งˆ์ง€๋ง‰์—๋Š” section header file์ด ์˜ค๋Š”๋ฐ, ์ด๋Š” ๊ฐ section์˜ ์œ„์น˜์™€ ํฌ๊ธฐ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ๋‘ header ์‚ฌ์ด์— ์˜ค๋Š” ์„น์…˜๋“ค์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ด ์žฅ์—์„œ global๊ณผ static๊ณผ ๊ฐ™์€ ์šฉ์–ด๊ฐ€ ๊ณ„์† ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์—์„œ global์ด๋ผ ํ•จ์€ local variable(ํ•จ์ˆ˜๋‚˜ ์ฝ”๋“œ ๋ธ”๋Ÿญ ๋‚ด์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜)์˜ ๋ฐ˜๋Œ“๋ง์ธ ์ „์—ญ๋ณ€์ˆ˜(global variable)์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฐœ๋…์œผ๋กœ, ๋ชจ๋“  ํŒŒ์ผ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ static variable์€ ํ•ด๋‹น ํŒŒ์ผ์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์ด๋‹ค. ํ˜ผ๋™์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์•ž์œผ๋กœ static variable์˜ ๋ฐ˜๋Œ“๋ง๋กœ๋Š” global variable์ด ์•„๋‹Œ nonstatic variable์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค.

7.5. ์‹ฌ๋ณผ๊ณผ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”

๋ชจ๋“  relocatable object file์€ ์ž์‹ ์ด ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•˜๋Š” ์‹ฌ๋ณผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ด๋‘”๋‹ค. ์–ด๋–ค relocatable object file $m$์ด ์žˆ์„ ๋•Œ, $m$์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ง์ปค์˜ ์ž…์žฅ์—์„œ ์‹ฌ๋ณผ์€ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  1. $m$์ด ์ •์˜ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ์ฐธ์กฐํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ์‹ฌ๋ณผ: nonstatic์ธ function/global variable์ด ์—ฌ๊ธฐ ํ•ด๋‹นํ•œ๋‹ค.
  2. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ์ •์˜ํ•˜๊ณ  $m$์ด ์ฐธ์กฐํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ์‹ฌ๋ณผ: "externals"๋ผ ๋ถ€๋ฅด๋ฉฐ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ •์˜ํ•œ nonstatic์ธ function/global variable์ด ์—ฌ๊ธฐ ํ•ด๋‹นํ•œ๋‹ค.
  3. $m$์—์„œ ์ •์˜ํ•˜๊ณ  $m$์—์„œ๋งŒ ์ฐธ์กฐํ•˜๋Š” ๋กœ์ปฌ ์‹ฌ๋ณผ: static function์ด๋‚˜ static์œผ๋กœ ์ •์˜ํ•œ global/local variable.

ํ•œํŽธ, static์ธ local variable๋“ค์€ runtime stack์ด ์•„๋‹Œ .data๋‚˜ .bss(initialize ์—ฌ๋ถ€์— ๋”ฐ๋ผ)์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, ๊ฐ variable์˜ ๊ด€๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

COMMON๊ณผ .bss์˜ ์ € ์• ๋งคํ•œ ๊ตฌ๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ์ ˆ์— ๊ทธ ์ด์œ ๊ฐ€ ๋‚˜์˜จ๋‹ค.

# 7.6. Symbol Resolution
๋ง์ปค๋Š” ์‹ฌ๋ณผ์˜ ์ฐธ์กฐ๋งˆ๋‹ค ๊ทธ ์œ ์ผํ•œ ์ •์˜๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ symbol resolution์ด๋ผ๊ณ  ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹ฌ๋ณผ์˜ ์ •์˜๋Š” input์œผ๋กœ ๋“ค์–ด์˜ค๋Š” relocatable object file์˜ symbol table์—์„œ ์ฐพ๊ฒŒ ๋œ๋‹ค.

์•ž์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ global symbol๋งŒ symbol table์— COMMON์œผ๋กœ ์ •์˜ํ–ˆ๋˜ ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ global symbol์€ ์•ฝํ•œ ์‹ฌ๋ณผ์ด๋ฏ€๋กœ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋™๋ช…์˜ ๊ฐ•ํ•œ ์‹ฌ๋ณผ์ด ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๋‹ˆ ์ผ๋‹จ ํŒ๋‹จ์„ ๋ณด๋ฅ˜ํ•˜๊ณ  ๋ง์ปค์— ๋งก๊ธฐ๊ธฐ ์œ„ํ•ด symbol table์— (section=COMMON์œผ๋กœ) entry๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋ฉด ๊ฐ•ํ•œ ์‹ฌ๋ณผ์ด ๋˜๋ฏ€๋กœ ๊ทธ๋ƒฅ .bss์— ์ €์žฅํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ๋งํ‚น

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฐ๊ด€๋œ object module๋“ค์„ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Static Library)๋ผ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์น˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๊ทธ object file์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์„œ ๋ง์ปค์— ๋„ฃ์–ด์ฃผ๊ธฐ ๊ท€์ฐฎ์œผ๋ฏ€๋กœ, ์ „๋ถ€ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ object file๋กœ ํ•ฉ์ณ๋†“๊ณ  ๊ทธ๊ฑธ ๋งํ‚นํ•˜๋Š”๊ฑธ๋กœ ํ‰์น˜๋Š” ์…ˆ์ด๋‹ค. ์ฆ‰, ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„œ๋กœ ์—ฐ๊ด€ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์˜ object file์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋†“์•„, ๋ง์ปค์— ์ž…๋ ฅ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด๋†“์€ ํŒŒ์ผ์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ ์ด๋Š” archive(.a) ํ˜•์‹์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

Ar rcs libvector.a addvec.o multvec.o

๋ฅผ ์‹คํ–‰ํ•˜๋ฉด libvector.a๋ผ๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ Resolution

๋ง์ปค๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งํ‚นํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

  1. ๋จผ์ € ์ง‘ํ•ฉ $E$, $U$, $D$๋ฅผ ์ค€๋น„ํ•œ๋‹ค. $E$๋Š” ํ•ฉ์ณ์ค„ object file๋“ค์˜ ์ง‘ํ•ฉ, $U$๋Š” resolve๋˜์ง€ ์•Š์€ symbol๋“ค์˜ ์ง‘ํ•ฉ, $D$๋Š” ์ด์ „์— ์‚ดํŽด๋ณธ ํŒŒ์ผ๋“ค์—์„œ ์ด๋ฏธ ์ •์˜๋œ ์‹ฌ๋ณผ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ฒ˜์Œ์—๋Š” $E, D, U$๋ฅผ ๋ชจ๋‘ ๊ณต์ง‘ํ•ฉ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  2. ๋ง์ปค์— ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜จ ํŒŒ์ผ $f$ ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์‚ดํŽด๋ณด๋ฉด์„œ,

    • $f$๊ฐ€ object์ธ ๊ฒฝ์šฐ $E$์— $f$๋ฅผ ๋ฐ”๋กœ ์ถ”๊ฐ€ํ•˜๊ณ , $U, D$๋Š” ์ด์— ๋งž์ถฐ์„œ ์ ์ ˆํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    • $f$๊ฐ€ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค $m$์„ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•˜๋ฉด์„œ, $m$์— $U$์— ํฌํ•จ๋œ(์ฆ‰ ์ •์˜๋ฅผ ์ฐพ์•„์•ผํ•˜๋Š”) ์‹ฌ๋ณผ์˜ ์ •์˜๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณธ๋‹ค. ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด $m$์€ ํ•„์š”ํ•œ object์ด๋ฏ€๋กœ $E$์— $m$์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋˜ํ•œ $U, D$๋Š” ์ด์— ๋งž์ถฐ์„œ ์ ์ ˆํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  3. ๋ชจ๋“  ์ž…๋ ฅ ํŒŒ์ผ๋“ค์„ ์‚ดํŽด๋ณธ ํ›„์—๋„ $U \ne \phi$์ด๋ฉด, ์ฆ‰ unresolved reference๊ฐ€ ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋•Œ๋ฌธ์— ๋ง์ปค์— ์ž…๋ ฅ ํŒŒ์ผ์„ ์ „๋‹ฌํ•ด์ค„ ๋•Œ๋Š” ์ˆœ์„œ๋ฅผ ์ž˜ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปค๋งจ๋“œ๋ผ์ธ์˜ ๋งจ ๋งˆ์ง€๋ง‰์— ๋“ฑ์žฅํ•ด์•ผ ํ•˜๋ฉฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ„์˜ ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด ํ•ญ์ƒ ๊ฐ ์‹ฌ๋ณผ์˜ ์ฐธ์กฐ๊ฐ€ ์†ํ•œ ํŒŒ์ผ ๋‹ค์Œ์— ์ •์˜๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์ด ๋‚˜์˜ค๋„๋ก ์ˆœ์„œ๋ฅผ ์ž˜ ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

7.7. Relocation

์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ Symbol Resolution ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด, ์‹ฌ๋ณผ์— ๋Œ€ํ•œ ๊ฐ๊ฐ์˜ ์ฐธ์กฐ๊ฐ€ ๋ชจ๋‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ •์˜์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. Relocation์€ ์ด ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๋ฉฐ, ๋‘ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  1. Relocating section and symbol definitions
    ๋ง์ปค๋Š” ์ž…๋ ฅ ํŒŒ์ผ์„ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ™์€ ํƒ€์ž…์˜ ์„น์…˜๋ผ๋ฆฌ๋Š” ํ•ฉ์ณ์„œ executable object์˜ ๊ฐ ์„น์…˜์„ ๊ตฌ์„ฑํ•œ๋‹ค. Relocatable object file A์™€ B์˜ .data๋ฅผ ํ•ฉ์ณ์„œ ์ถœ๋ ฅ executable object file์˜ .data๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‹์ด๋‹ค. ์ด ๊ณผ์ •์ด ๋๋‚˜๋ฉด ๋ชจ๋“  instruction๊ณผ global variable์ด ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์น˜๋˜๋ฉฐ, ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด ์ด๋“ค์—๊ฒŒ ๊ณ ์œ ํ•œ runtime address๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. Relocating symbol references within sections
    ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฐ symbol๋“ค์˜ runtime์—์„œ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋  ์ง€ ์•Œ ์ˆ˜ ์—†์—ˆ์œผ๋‚˜, ์ด์ œ๋Š” runtime address๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด์ œ code์™€ data ์„น์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ฐธ์กฐ๋“ค์„ runtime address๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ relocation entry๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

Relocation Entry

์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ object ๋ชจ๋“ˆ์„ ๋งŒ๋“ค ๋•Œ์—๋Š”, ๊ฐ code์™€ data๊ฐ€ relocation์„ ๊ฑฐ์นœ ํ›„์— ์–ด๋–ค ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋  ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ relocation entry๋ผ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค์–ด ์ž„์‹œ๋กœ ์กฐ์น˜๋ฅผ ํ•ด์ค€๋‹ค. ์•ž์—์„œ ๋‚˜์˜จ .rel.text์™€ .rel.data๋ผ๋Š” ์„น์…˜์ด ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

Linux์˜ ELF์—์„œ, relocation entry๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ๋“ค์„ ํฌํ•จํ•œ๋‹ค.

๋ง์ปค๋Š” relocation entry์˜ ํ•ญ๋ชฉ๋“ค์„ ๋ณด๊ณ , type์— ๋”ฐ๋ผ ์ ˆ๋Œ€์ฃผ์†Œ ํ˜น์€ ์ƒ๋Œ€์ฃผ์†Œ๋กœ ๊ฐ ์ฐธ์กฐ์˜ ์ฃผ์†Œ๋“ค์„ ์ˆ˜์ •ํ•œ๋‹ค.

7.8. Executable Object File

์•ž์„œ object file์—๋Š” ๋ง์ปค์˜ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” relocatable object file๊ณผ, ์ถœ๋ ฅ์œผ๋กœ ๋‚˜์˜ค๋Š” executable object file์ด ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด ๋˜ํ•œ relocatable object file๊ณผ ๊ตฌ์กฐ๊ฐ€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์œผ๋‚˜, ์ด๋ฏธ relocation์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ .rel ์„น์…˜์ด ์—†๊ณ  ELF header์— entry point, ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๋Š” ์ง€์ ์ด ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๋˜ํ•œ, initialization code์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” __init์ด๋ผ๋Š” ์ž‘์€ ํ•จ์ˆ˜๊ฐ€ .init์— ์œ„์น˜ํ•œ๋‹ค.

Executable object file์€ memory์— ๊ทธ๋Œ€๋กœ load๋˜๊ธฐ ์•Œ๋งž์€ ํ˜•์‹์œผ๋กœ, ์ฝ”๋“œ์˜ ์—ฌ๋Ÿฌ (์—ฐ์†์ ์ธ) ๋ฉ์–ด๋ฆฌ๊ฐ€ ๊ทธ๋Œ€๋กœ virtual memory์˜ ์—ฐ์†์ ์ธ ๋ฉ์–ด๋ฆฌ๋“ค๋กœ ๋งคํ•‘๋œ๋‹ค. ์ด๋•Œ ๋งคํ•‘์€ program header์— ํ‘œ๋กœ ๋ช…์‹œ๋œ๋‹ค. (p. 732 ์ฐธ์กฐ)

7.9. Executable Object File์˜ ๋กœ๋”ฉ

Linux shell์—์„œ ./prog๋ผ๊ณ  ์ž…๋ ฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ํ‚ค๋ณด๋“œ๋กœ ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„, ๋กœ๋”(loader)๊ฐ€ ์‹คํ–‰๋œ๋‹ค. (์‚ฌ์‹ค Shell ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๋ฆฌ๋ˆ…์Šค ํ”„๋กœ๊ทธ๋žจ์€ execve๋ผ๋Š” ์‹œ์Šคํ…œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋“œํ•ด์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” 8์žฅ์—์„œ ์„ค๋ช…ํ•œ๋‹ค.) ๋กœ๋”๋Š” executable object file์—์„œ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ด์™€์„œ entry point๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐฐ์น˜๋Š” ์œ„์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์ด ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋กœ๋”ฉ๋œ ํ›„์—๋Š” entry point์— ์ง„์ž…ํ•œ๋‹ค. ์ด๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์—์„œ _start๋ผ๋Š” ํ•จ์ˆ˜์˜ ์œ„์น˜๋กœ ๋™์ผํ•˜๋‹ค. _start๋Š” __libc_start_main์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ, ์ด๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ์„ setupํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ main ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๊ทธ ๋ฐ˜ํ™˜๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋“ฑ์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

7.10. ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์  ๋งํ‚น

์•ž์—์„œ ์‚ดํŽด๋ณธ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(shared library)์ด๋‹ค. ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” runtime ๋˜๋Š” load time์— ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋กœ๋“œ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋งํ‚น์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ด ๋•Œ,

๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ โ€œ๊ณต์œ โ€๋ผ๊ณ  ์ด๋ฆ„๋ถ™์ธ ๋ฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

  1. ๋จผ์ €, ํ•˜๋‚˜์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์—๋Š” ๋™์ผํ•œ .so ํŒŒ์ผ์ด ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  executable object file์€ ์ด๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
  2. ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๋ฉด, ๊ทธ .text ์„น์…˜์€ ์‹คํ–‰์ค‘์ธ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์ด ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋งํ‚นํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปค๋งจ๋“œ๋ผ์ธ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

gcc -shared -fpic -o libvector.so addvec.c multvec.c
gcc -o prog main.c ./libvector.so

Load time์— prog๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ๋กœ๋”ฉ ๊ณผ์ •์„ ๊ฑฐ์น˜๋‹ค๊ฐ€, ๋กœ๋”๊ฐ€ .interp ์„น์…˜์— ๋™์  ๋ง์ปค์˜ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜์—ฌ ๋™์  ๋ง์ปค์— control์„ ๋„˜๊ฒจ์ค€๋‹ค. ๋™์  ๋ง์ปค๋Š” ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ๋งํ‚น์„ ์ง„ํ–‰์‹œํ‚จ๋‹ค.

7.11. ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋”ฉ/๋งํ‚นํ•˜๊ธฐ

์•ž ์ ˆ์—์„œ๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ load ํ›„, execute ์ „์— ๋งํ‚นํ•˜์˜€๋‹ค. ํ•œํŽธ, ๊ณต์œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘์—๋„ ๋ถˆ๋Ÿฌ์™€ ๋งํ‚นํ•  ์ˆ˜ ์žˆ๋‹ค.

Linux๋Š” dlfcn.h์—์„œ ๋™์  ๋งํ‚น์„ ์œ„ํ•œ

void *dlopen(const char *filename, int flag)

๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ runtime์—์„œ ๋งํ‚น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค(p.739 ์ฐธ๊ณ ).

7.12. ์œ„์น˜๋…๋ฆฝ ์ฝ”๋“œ

์•ž์„œ, ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•œ copy์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณต์œ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ์šฐ์„  ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งˆ๋‹ค ์•ฝ์†๋œ ์œ„์น˜์˜ ์ฃผ์†Œ์—๋งŒ ๋กœ๋“œ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Š” ๋‹น์—ฐํžˆ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค! ๋”ฐ๋ผ์„œ ๊ทธ ๋Œ€์‹ , ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์•„๋ฌด ์œ„์น˜์—๋‚˜ ๋กœ๋“œ๋˜์–ด๋„ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„์น˜๋…๋ฆฝ ์ฝ”๋“œ(Position-Independent Code, PIC)๋ผ๊ณ  ํ•œ๋‹ค.

PIC Data Segments

์ด๋ฅผ ์œ„ํ•ด .data ์„น์…˜์˜ ๋งจ ์•ž๋ถ€๋ถ„์— Global Offset Table(GOT)๋ผ๋Š” ํ‘œ๋ฅผ ์ž‘์„ฑํ•ด, ๊ฐ global variable๋งˆ๋‹ค 8๋ฐ”์ดํŠธ์”ฉ์„ ํ• ๋‹นํ•ด ๊ฐ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ฐ ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ์—๋Š”, ์ฐธ์กฐํ•˜๋Š” instruction์—์„œ GOT๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ผ์ •ํ•˜๋‹ค๋Š” ์„ฑ์งˆ์„ ์‚ฌ์šฉํ•ด %rip + ์ƒ์ˆ˜๋กœ GOT์˜ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•œ๋‹ค. GOT์˜ ํ•ด๋‹น ํ•ญ๋ชฉ์—๋Š” ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณ€์ˆ˜/ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๋‹ค์‹œ dereferenceํ•ด ๋ณ€์ˆ˜/ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

PIC Function Calls

๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ •์˜๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ์ปดํŒŒ์ผ ์‹œ๊ฐ„์—์„œ๋Š” ์ด ํ•จ์ˆ˜๊ฐ€ ์–ด๋”” ๋กœ๋“œ๋  ๊ฒƒ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ ๊ณณ์˜ ๋ชฉ๋ก์„ ๊ธฐ๋กํ•ด๋‘” ํ›„, ํ•จ์ˆ˜๊ฐ€ ๋กœ๋“œ๋œ ํ›„์— ๋™์  ๋งํฌ๊ฐ€ ๊ฐ ์ฐธ์กฐ๋งˆ๋‹ค ์ฃผ์†Œ๋ฅผ ๋ฐ”๊ฟ” ์จ์ฃผ๋ฉด ๋˜๊ฒ ์ง€๋งŒ, ์ด๋Ÿฌ๋ฉด PIC๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค. (๋กœ๋“œ ํ›„์— relocation์ด ๋ถˆํ•„์š”ํ•ด์•ผ PIC๋ผ๋Š” ์ ์„ ์ƒ๊ฐํ•˜์ž)

์ด ๋•Œ๋ฌธ์— lazy binding์ด๋ผ๋Š” ๊ฐœ๋…์ด ์‚ฌ์šฉ๋œ๋‹ค. Lazy binding์˜ ํ•ต์‹ฌ์€ ๊ฐ ํ•จ์ˆ˜์˜ binding์„ ์ฒซ ํ˜ธ์ถœ๋•Œ๊นŒ์ง€ ๋ฏธ๋ค„๋‘๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. Lazy binding์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋“ค๊นŒ์ง€ load time์— relocateํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

Lazy binding์€ GOT์™€ .text(์ฝ”๋“œ) ์„ธ๊ทธ๋จผํŠธ์˜ ์ผ๋ถ€์ธ PLT(procedure linkage table)์˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค. (p. 742 ์ฐธ๊ณ )

ํ”„๋กœ๊ทธ๋žจ์˜ machine code๊ฐ€ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ addvec()์„ ํ˜ธ์ถœํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•œ๋‹ค.

  1. ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ
    1. ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ถ€ํ„ฐ๊ฐ€ addvec()์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด์— ๋Œ€์‘๋˜๋Š” PLT[2]๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค. PLT[2]๋ฅผ ํ˜ธ์ถœ(์ฆ‰ ํ˜„์žฌ ์ฃผ์†Œ๋ฅผ pushํ•˜๊ณ  PLT[2]์˜ ์ฃผ์†Œ๋กœ ์ ํ”„)ํ•œ๋‹ค.
    2. PLT[2]์˜ ์ฒซ ์ค„์€ GOT[4]์— ์ €์žฅ๋œ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค. GOT[4]๋ฅผ ๋ณด๋ฉด, ์ดˆ๊ธฐ ์ƒํƒœ์—๋Š” ๊ทธ๋ƒฅ PLT[2]์˜ ๋‘ ๋ฒˆ์งธ ์ค„์˜ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ PC๊ฐ€ ๊ทธ๋ƒฅ PLT[2]์˜ ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    3. pushq $0x1์œผ๋กœ addvec()์˜ id์ธ 1์ด ์Šคํƒ์— ํ‘ธ์‹œ๋œ๋‹ค.
    4. ์ด์ œ ์Šคํƒ์—๋Š” relocation entry์˜ ์ฃผ์†Œ์™€ addvec()์˜ id(1)๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ์ด ๋•Œ ๋™์  ๋ง์ปค๊ฐ€ ์‹คํ–‰๋˜๋ฉด addvec()์— ๋Œ€์‘๋˜๋Š” ํ•ญ๋ชฉ์ธ GOT[4]๊ฐ€ ์‹ค์ œ addvec()์˜ ์ฃผ์†Œ๋กœ ๋ฐ”๋€๋‹ค. ๋‹ค์Œ ๋ฒˆ์˜ ํ˜ธ์ถœ์„ ์œ„ํ•ด ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค!
  2. ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ

    • ์ด์ œ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ๋ถ€ํ„ฐ๋Š” PLT[2]๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด jmpq *GOT[4]๋ฅผ ํ•˜์ž๋งˆ์ž addvec()์ด ๋ฐ”๋กœ ์‹คํ–‰๋œ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋™์  ๋งํ‚น์€ CSAPP์—์„œ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ธ ๊ฒƒ ๊ฐ™๋‹ค(์ด ๊ฒŒ์‹œ๋ฌผ์˜ ์„ค๋ช…๋„ ์™„๋ฒฝํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค) ์ฑ…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์ฝ๊ณ  ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ๋ณต์Šตํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

7.13. Library Interpositioning

Library interpositioning์€ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŒํผ ์ด ๋˜ํ•œ compile time, link time, run time ์ค‘ ์•„๋ฌด ๋•Œ์—๋‚˜ ๊ฐ€๋Šฅํ•˜๋‹ค.
Library interpositioning์˜ ์ „ํ˜•์ ์ธ ์‚ฌ์šฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ๊ธฐ์กด์˜ ํ•จ์ˆ˜์— print๋‚˜ counter ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋”ํ•œ โ€œwrapper functionโ€์„ ๋งŒ๋“ค์–ด ๋Œ€์‹  ํ˜ธ์ถœ๋˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Wrapper function์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์‹œ๊ฐ„์ด๋‚˜ ํšŸ์ˆ˜ ๋“ฑ์„ ์•Œ ์ˆ˜ ์žˆ์–ด ๋””๋ฒ„๊น…์— ์šฉ์ดํ•˜๋‹ค.