๋งํน(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๋ฅผ ์์ฑํ๋ค.
cpp [other arguments] main.c /tmp/main.i
์ ๊ฐ์ด ์ ์ฒ๋ฆฌ๊ธฐ cpp
(C Preprocessor)๋ฅผ ํธ์ถํด main.i
ํ์ผ์ ๋ง๋ ๋ค.
cc1 /tmp/main.i -Og [other arguments] -o tmp/main.s
๋ก ์ปดํ์ผ๋ฌ cc1
์ ์คํ์์ผ์ ์ด์
๋ธ๋ฆฌ ํ์ผ main.s
๋ฅผ ์์ฑํ๋ค.
as [other arguments] -o /tmp/main.o /tmp/main.s
๋ก ์ด์
๋ธ๋ฌ as
๋ฅผ ํธ์ถํด ์ด์
๋ธ๋ฆฌ ํ์ผ main.s
๋ฅผ relocatable object file main.o
๋ก ๋ฒ์ญํ๋ค.
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์ ํ์ํ ์ ๋ณด๋ค์ด ํฌํจ๋์ด ์๋ค๋ ์ ๋๋ก๋ง ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์ ์ ๋งํน์ ๋ ๋จ๊ณ๋ก ๋๋์ด ์ผ์ด๋๋ค.
- symbol resolution: ์ฝ๋์์ ์ด๋ค ๋ณ์๋ ํจ์๋ฅผ ์ฐธ์กฐํ ๋ถ๋ถ์ ๋ชจ๋ ์ฐพ์์ ๊ทธ ์ ์๋ฅผ ์ฐพ์ ๋ฌถ์ด์ฃผ๋ ๊ณผ์ ์ด๋ค. ์ด๋ ๋ณ์์ ํจ์๋
cnt
๋func1
๊ณผ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ๋ฏ๋ก symbol์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- relocation: ์ปดํ์ผ๋ฌ์ ์ด์
๋ธ๋ฌ๊ฐ ๋ง๋ code/data section๋ค์ ์ฃผ์๊ฐ 0๋ถํฐ ์์ํ๊ฒ ๋์ด ์๋ค. ๋ง์ปค๋ ์ด๋ค์ ์ฌ๋ฐฐ์นํ์ฌ ์คํ๊ฐ๋ฅํ ์ฝ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ฌ๋ฐฐ์น๊ฐ ์๋ฃ๋๋ฉด symbol์ ์ ์ํ๋ ์ฝ๋๋ค์ ๊ฐ์์ ๊ณ ์ ํ ์ฃผ์๋ฅผ ๊ฐ๊ฒ ๋๋ค. ์ฝ๋์์ symbol์ ์ฐธ์กฐํ ๋ถ๋ถ์ ๊ทธ ์ ์์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
7.3. ์ค๋ธ์ ํธ ํ์ผ
์ค๋ธ์ ํธ ํ์ผ์๋ ์ธ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
- Relocatable Object File: ๋ค๋ฅธ relocatable object file๊ณผ ํฉ์ณ์ executable object file์ด ๋ ์ ์๋๋ก ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ค๋ธ์ ํธ ํ์ผ
- Executable Object File: ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ก ๋ณต์ฌํด ์คํ์ํฌ ์ ์๋ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ค๋ธ์ ํธ ํ์ผ
- Shared Object File: load time ๋๋ run time์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋์์ผ, "๋์ ๋งํน"์ ์ํฌ ์ ์๋ ํน๋ณํ relocatable object file
์ปดํ์ผ๋ฌ์ ์ด์
๋ธ๋ฌ๊ฐ 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 ์ฌ์ด์ ์ค๋ ์น์
๋ค์ ๊ฐ๋จํ ์ค๋ช
ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
.text
: ํ๋ก๊ทธ๋จ์ ๊ธฐ๊ณ์ด ์ฝ๋
.rodata
: read-only data. printf์ format string (%d %d %s
์ ๊ฐ์ ๊ฒ), switch์ jump table๊ณผ ๊ฐ์ ๋ถ๋ถ๋ค.
.data
: ์ด๊ธฐํ๋ global ๋ณ์์ static ๋ณ์
.bss
: ์ด๊ธฐํ๋์ง ์์๊ฑฐ๋ 0์ผ๋ก ์ด๊ธฐํ๋ global/static ๋ณ์๋ค๋ก, ์ค์ ๊ณต๊ฐ์ ์ฐจ์งํ์ง๋ ์๋ ์ผ์ข
์ placeholder
.symtab
: ํจ์์ global ๋ณ์์ ๋ํ symbol table
.rel.text
: rel์ relocation์ ์๋ฏธํ๋ฉฐ, ๋ง์ปค๊ฐ ์ค๋ธ์ ํธ๋ค์ ํฉ์น๋ ์์
์ ์ํํ ๋ ์์ ๋์ด์ผ ํ ์ฐธ์กฐ ์์น๋ค์ ๋ชฉ๋ก. ์ธ๋ถ ํจ์๋ global variable์ ์ฐธ์กฐํ๋ ์ฝ๋๋ ๋ชจ๋ ์์ ์ด ํ์ํจ
.rel.data
: ํด๋น ํ์ผ์ ๋ชจ๋์ด ์ฐธ์กฐํ๊ฑฐ๋ ์ ์ํ๋ global ๋ณ์๋ค์ relocation ์ ๋ณด๋ก, ๋ค๋ฅธ global ๋ณ์/ํจ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ global ๋ณ์๋ค์ด ์ฌ๊ธฐ์ ํด๋น๋จ
.debug
: ๋๋ฒ๊น
์ ์ํ ์ต์
์ ์ค ๋ ์์ฑ๋๋ ๋ถ๋ถ
.line
: ์๋ณธ C ํ์ผ๊ณผ .text
์ ๊ธฐ๊ณ์ด ์ฝ๋์ ์ค ๋ฒํธ ์ฌ์ด์ ๋งคํ
.strtab
: string table. .symtab
์ ์ฌ๋ณผ ์ด๋ฆ๊ณผ 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$์ ์ฒ๋ฆฌํ๋ ๋ง์ปค์ ์
์ฅ์์ ์ฌ๋ณผ์ ์ธ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- $m$์ด ์ ์ํ๊ณ ๋ค๋ฅธ ๋ชจ๋์ด ์ฐธ์กฐํ๋ ๊ธ๋ก๋ฒ ์ฌ๋ณผ: nonstatic์ธ function/global variable์ด ์ฌ๊ธฐ ํด๋นํ๋ค.
- ๋ค๋ฅธ ๋ชจ๋์ด ์ ์ํ๊ณ $m$์ด ์ฐธ์กฐํ๋ ๊ธ๋ก๋ฒ ์ฌ๋ณผ: "externals"๋ผ ๋ถ๋ฅด๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋์์ ์ ์ํ nonstatic์ธ function/global variable์ด ์ฌ๊ธฐ ํด๋นํ๋ค.
- $m$์์ ์ ์ํ๊ณ $m$์์๋ง ์ฐธ์กฐํ๋ ๋ก์ปฌ ์ฌ๋ณผ: static function์ด๋ static์ผ๋ก ์ ์ํ global/local variable.
ํํธ, static์ธ local variable๋ค์ runtime stack์ด ์๋ .data
๋ .bss
(initialize ์ฌ๋ถ์ ๋ฐ๋ผ)์์ ๊ด๋ฆฌํ๋ค.
์ฌ๋ณผ ํ
์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๋ค.
name
์ .strtab
(string table)์์ symbol์ ์ด๋ฆ์ ๋ด์ string์ ์์น offset์ ์ ์ฅํ๋ค.
value
๋ ์ฌ๋ณผ์ ์ฃผ์์ด๋ฉฐ
- relocatable object file์์๋ ํด๋น ์ฌ๋ณผ์ด ์ ์๋ ์น์
์ ์์์ผ๋ก๋ถํฐ์ ์๋์ฃผ์๋ฅผ,
- executable object file์์๋ run-time์ ์ ๋์ฃผ์๋ฅผ ์ ์ฅํ๋ค
section
์ section header table์ index๋ฅผ ์ ์ฅํ๋ ๋ณ์์ธ๋ฐ, ํน์ํ ์ผ์ด์ค 3๊ฐ์ง๊ฐ ์๋ค.
ABS
: relocate๋๋ฉด ์๋๋ ์ฌ๋ณผ
UNDEF
: undefined symbol. ๋ค๋ฅธ ๋ชจ๋์์ ์ ์๋ ์ฌ๋ณผ์ ํ์ฌ์ ๋ชจ๋์์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ ํด๋น ์ฌ๋ณผ์ ์ ์๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ์ฒ๋ฆฌ๋๋ค.
COMMON
: ์ด๊ธฐํ๊ฐ ๋์ง ์์ object์ธ๋ฐ ์์ง ํ ๋น์ด ๋์ง ์์ ๊ฒฝ์ฐ
์ ๋ฆฌํ์๋ฉด, ๊ฐ variable์ ๊ด๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋ค.
- (nonstatic) global variable
- 0์ด ์๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ ๊ฒฝ์ฐ:
.data
์ ์ ์ฅ๋ ํ linker๊ฐ ์ฌ๋ณผ ํ
์ด๋ธ์ ์ด์ฉํ์ฌ ๊ด๋ฆฌ
- ์ด๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ: ์ฌ๋ณผ ํ
์ด๋ธ์
section
๊ฐ์ COMMON
์ผ๋ก ์ค์ ํด ์ ์ฅ (๋์ค์ ๋์ค๊ฒ ์ง๋ง ์ด๋ ์ฝํ ์ฌ๋ณผ์ด๊ธฐ ๋๋ฌธ์ด๋ค)
- 0์ผ๋ก ์ด๊ธฐํ๋ ๊ฒฝ์ฐ:
.bss
์ ์ ์ฅ(โbetter save storageโ๋ก ์ธ์ฐ์)
- (nonstatic) local variable
- ๋น์ฐํ์ง๋ง runtime stack์ด ๊ด๋ฆฌํ๋ค
- static variable๊ณผ static function
- nonzero๋ก ์ด๊ธฐํ๋ ๊ฒฝ์ฐ
.data
์ ์ ์ฅ.
- 0์ผ๋ก ์ด๊ธฐํ๋์๊ฑฐ๋ ์ด๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ
.bss
์ ์ ์ฅ
COMMON๊ณผ .bss
์ ์ ์ ๋งคํ ๊ตฌ๋ถ์ ๋ํด์๋ ๋ค์ ์ ์ ๊ทธ ์ด์ ๊ฐ ๋์จ๋ค.
# 7.6. Symbol Resolution
๋ง์ปค๋ ์ฌ๋ณผ์ ์ฐธ์กฐ๋ง๋ค ๊ทธ ์ ์ผํ ์ ์๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ์ด์ผ ํ๋ค. ์ด๋ฅผ symbol resolution์ด๋ผ๊ณ ํ๋ค. ์ฌ๊ธฐ์ ์ฌ๋ณผ์ ์ ์๋ input์ผ๋ก ๋ค์ด์ค๋ relocatable object file์ symbol table์์ ์ฐพ๊ฒ ๋๋ค.
- local symbol์ ๊ฒฝ์ฐ ํ ํ์ผ์ ์ ์์ ์ฐธ์กฐ๊ฐ ๋ชจ๋ ์กด์ฌํ๋ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ฒ๋ฆฌํด์ค๋ค.
- global symbol์ ๊ฒฝ์ฐ ์กฐ๊ธ ๋ ๋ณต์กํ๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋ชจ๋์ ์ฒ๋ฆฌํ ๋, ํ์ฌ ๋ชจ๋์ ์ ์๋์ง ์์ ์ฌ๋ณผ์ ๋ฐ๊ฒฌํ๋ฉด ๋ง์ปค๊ฐ ์ฒ๋ฆฌํ ์ ์๋๋ก symbol table์ entry๋ฅผ ๋ง๋ค์ด์ค๋ค. ์ด๋ ์๋ก ๋ค๋ฅธ ๋ชจ๋์์ ๊ฐ์ ์ด๋ฆ์ global symbol์ ์ ์ํ ์ ์์ผ๋ ๋ฌธ์ ๊ฐ ๋๋๋ฐ, GCC์ ๊ฒฝ์ฐ ๋ค์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- ๋จผ์ ์ฌ๋ณผ์ ๊ฐํ(strong) ์ฌ๋ณผ๊ณผ ์ฝํ(weak) ์ฌ๋ณผ์ผ๋ก ๋๋์ด ๊ตฌ๋ถํ๋ค. ๊ฐํ ์ฌ๋ณผ์๋ ํจ์, ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐํ๋ global variable์ด ๋ค์ด๊ฐ๋ฉฐ ์ฝํ ์ฌ๋ณผ์๋ ์ด๊ธฐํ๋์ง ์์ global variable์ด ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์์ ๊ท์น์ ์ ์ฉํ๋ค.
- ๊ท์น 1: ์ฌ๋ฌ ๊ฐ์ ๊ฐํ ์ฌ๋ณผ์ด ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ ธ์๋ ์๋๋ค.
- ๊ท์น 2: ์ฌ๋ฌ ๊ฐ์ ์ฝํ ์ฌ๋ณผ๊ณผ ํ๋์ ๊ฐํ ์ฌ๋ณผ์ด ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๋ค๋ฉด, ๊ฐํ ์ฌ๋ณผ์ ํํ๋ค.
- ๊ท์น 3: ์ฌ๋ฌ ๊ฐ์ ์ฝํ ์ฌ๋ณผ์ด ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๋ค๋ฉด, ๊ทธ ์ค ์๋ฌด๊ฑฐ๋ ํ๋ ํํ๋ค.
- ์ฝํ ์ฌ๋ณผ์ ์ด๊ธฐํ๋์ง ์์ global variable์ด๋ฏ๋ก, ์ด์ฐจํผ ์ด๊ธฐํ๋ ๊ฐ์ด ์์ผ๋ ์๋ฌด๊ฑฐ๋ ํํด๋ ๋๋ค๋ ๊ฒ์ด ์ด๋ ต์ง ์๊ฒ ๋ฐ์๋ค์ฌ์ง ๊ฒ์ด๋ค!
์์์ ์ด๊ธฐํ๋์ง ์์ 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
) ํ์์ผ๋ก ์ ์ฅํ๋ค.
- ์๋ฅผ ๋ค์ด์
addvec.c
์ multvec.c
๋ฅผ ํฉ์ณ์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, ์ปดํ์ผ๋ฌ๋ก ๋์ ๊ฐ๊ฐ .o
ํ์ผ๋ก ๋ง๋ค์ด์ค ํ
Ar rcs libvector.a addvec.o multvec.o
๋ฅผ ์คํํ๋ฉด libvector.a
๋ผ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๋ค.
์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Resolution
๋ง์ปค๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํนํ ๋ ๋ค์๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
-
๋จผ์ ์งํฉ $E$, $U$, $D$๋ฅผ ์ค๋นํ๋ค. $E$๋ ํฉ์ณ์ค object file๋ค์ ์งํฉ, $U$๋ resolve๋์ง ์์ symbol๋ค์ ์งํฉ, $D$๋ ์ด์ ์ ์ดํด๋ณธ ํ์ผ๋ค์์ ์ด๋ฏธ ์ ์๋ ์ฌ๋ณผ๋ค์ ์งํฉ์ด๋ค. ์ฒ์์๋ $E, D, U$๋ฅผ ๋ชจ๋ ๊ณต์งํฉ์ผ๋ก ์ด๊ธฐํํ๋ค.
-
๋ง์ปค์ ์
๋ ฅ์ผ๋ก ๋ค์ด์จ ํ์ผ $f$ ๋ค์ ์์๋๋ก ์ดํด๋ณด๋ฉด์,
- $f$๊ฐ object์ธ ๊ฒฝ์ฐ $E$์ $f$๋ฅผ ๋ฐ๋ก ์ถ๊ฐํ๊ณ , $U, D$๋ ์ด์ ๋ง์ถฐ์ ์ ์ ํ๊ฒ ์
๋ฐ์ดํธํ๋ค.
- $f$๊ฐ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๊ฒฝ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ค๋ธ์ ํธ ํ์ผ๋ค $m$์ ํ๋์ฉ ์ํํ๋ฉด์, $m$์ $U$์ ํฌํจ๋(์ฆ ์ ์๋ฅผ ์ฐพ์์ผํ๋) ์ฌ๋ณผ์ ์ ์๊ฐ ์๋์ง ์ฐพ์๋ณธ๋ค. ๋ง์ฝ ์๋ค๋ฉด $m$์ ํ์ํ object์ด๋ฏ๋ก $E$์ $m$์ ์ถ๊ฐํ๋ค. ๋ํ $U, D$๋ ์ด์ ๋ง์ถฐ์ ์ ์ ํ๊ฒ ์
๋ฐ์ดํธํ๋ค.
-
๋ชจ๋ ์
๋ ฅ ํ์ผ๋ค์ ์ดํด๋ณธ ํ์๋ $U \ne \phi$์ด๋ฉด, ์ฆ unresolved reference๊ฐ ์๋ค๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ ๋๋ฌธ์ ๋ง์ปค์ ์
๋ ฅ ํ์ผ์ ์ ๋ฌํด์ค ๋๋ ์์๋ฅผ ์ ์๊ฐํด์ผ ํ๋ค. ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปค๋งจ๋๋ผ์ธ์ ๋งจ ๋ง์ง๋ง์ ๋ฑ์ฅํด์ผ ํ๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ์ ์์กด์ฑ์ด ์๋ค๋ฉด ํญ์ ๊ฐ ์ฌ๋ณผ์ ์ฐธ์กฐ๊ฐ ์ํ ํ์ผ ๋ค์์ ์ ์๊ฐ ํฌํจ๋ ํ์ผ์ด ๋์ค๋๋ก ์์๋ฅผ ์ ๋ฐฐ์นํด์ผ ํ๋ค.
7.7. Relocation
์์ ๊ณผ์ ์ ๊ฑฐ์ณ Symbol Resolution ๋จ๊ณ๊ฐ ๋๋๋ฉด, ์ฌ๋ณผ์ ๋ํ ๊ฐ๊ฐ์ ์ฐธ์กฐ๊ฐ ๋ชจ๋ ์ ํํ ํ๋์ ์ ์์ ์ฐ๊ฒฐ๋์ด ์๋ ์ํ์ด๋ค. Relocation์ ์ด ์ํ์์ ์์ํ๋ฉฐ, ๋ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ค.
-
Relocating section and symbol definitions
๋ง์ปค๋ ์
๋ ฅ ํ์ผ์ ์ํํ๋ฉด์, ๊ฐ์ ํ์
์ ์น์
๋ผ๋ฆฌ๋ ํฉ์ณ์ executable object์ ๊ฐ ์น์
์ ๊ตฌ์ฑํ๋ค. Relocatable object file A์ B์ .data
๋ฅผ ํฉ์ณ์ ์ถ๋ ฅ executable object file์ .data
๋ฅผ ๊ตฌ์ฑํ๋ ์์ด๋ค. ์ด ๊ณผ์ ์ด ๋๋๋ฉด ๋ชจ๋ instruction๊ณผ global variable์ด ์์๋๋ก ๋ฐฐ์น๋๋ฉฐ, ๋ค๋ฅด๊ฒ ๋งํ๋ฉด ์ด๋ค์๊ฒ ๊ณ ์ ํ runtime address๊ฐ ๋ถ์ฌ๋๋ค๊ณ ํ ์ ์๋ค.
-
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๋ ๋ค์ ํญ๋ชฉ๋ค์ ํฌํจํ๋ค.
- offset: ์์ ํด์ผ ํ ์ฐธ์กฐ์ section offset, ์ฆ ํด๋น ์ฝ๋๊ฐ ์ํ๋ ์น์
์ ์์ ์ฃผ์๋ก๋ถํฐ์ ์๋ ์ฃผ์
- symbol: ๊ฐ๋ฆฌ์ผ์ผ ํ๋ ์ฌ๋ณผ์ symbol table index
- type: 32๊ฐ์ง๊ฐ ์กด์ฌํ๋ ์ฌ๊ธฐ์์๋
R_X86_64_PC32
(PC-relative 32b address)์ R_X86_64_32
(absolute 32b address)๋ง ๋ค๋ฃธ.
- append: type์ ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก, ์๋์ฃผ์์ ๊ฒฝ์ฐ
%rip
+ (์๋์ฃผ์)๋ก ํํ๋๋๋ฐ %rip
๋ ํ์ฌ instruction์ด ์๋, ๋ค์ instruction์ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ณด์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
๋ง์ปค๋ 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 ์ฐธ์กฐ)
- ์ฌ๊ธฐ์ mapping์๋ alignment requirement๋ผ๋ ๊ท์น์ด ์๋ค. ๊ฐ๊ฐ์ ์ฝ๋(๋๋ ๋ฐ์ดํฐ) ๋ฉ์ด๋ฆฌ๊ฐ object file์์ offset
off
๋ฅผ ๊ฐ์ก์๋๋ฐ ๋ง์ปค์ ์ํด vaddr
๋ผ๋ ๊ฐ์๋ฉ๋ชจ๋ฆฌ ์์น๋ก ๋งคํ๋์๋ค๋ฉด,
vaddr mod align = off mod align
์ด ์ฑ๋ฆฝํ๋ค. ์ด๋ align
์ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก, ์ ํด์ ธ ์๋ ์์ด๋ค. ์ฆ, executable object file์ ๊ฐ ์ฝ๋ ๋ฉ์ด๋ฆฌ๋ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ align
์ ๋ฐฐ์๋งํผ ์ด๋ํด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋๋ค. ์ด๋ 9์ฅ์ ๋์ฌ ๊ฐ์๋ฉ๋ชจ๋ฆฌ์์, ๋ฉ๋ชจ๋ฆฌ๊ฐ 2์ ๊ฑฐ๋ญ์ ๊ณฑ ํฌ๊ธฐ์ ์ฒญํฌ๋ก ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์ผ๋ก ํจ์จ์ ์ธ ๋ก๋๋ฅผ ์ํ ๊ท์น์ด๋ค.
7.9. Executable Object File์ ๋ก๋ฉ
Linux shell์์ ./prog
๋ผ๊ณ ์
๋ ฅํ๋ค๊ณ ๊ฐ์ ํ์. ํค๋ณด๋๋ก ์ํฐ๋ฅผ ๋๋ฅด๋ ์๊ฐ, ๋ก๋(loader)๊ฐ ์คํ๋๋ค. (์ฌ์ค Shell ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ๋ฆฌ๋
์ค ํ๋ก๊ทธ๋จ์ execve
๋ผ๋ ์์คํ
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ก๋ํด์ฌ ์ ์๋๋ฐ, ์ด๋ 8์ฅ์์ ์ค๋ช
ํ๋ค.) ๋ก๋๋ executable object file์์ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํด์์ entry point๋ถํฐ ์ฐจ๋ก๋๋ก ํ๋ก๊ทธ๋จ์ ์คํํ๋ ์ญํ ์ ํ๋ค.
๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ๊ฐ์๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋ ์์ ๊ฐ์ ๊ทธ๋ฆผ์ด ๋๋ค.
- ์ค์ ๋ก๋ alignment requirement์ ์ํด์ ๊ฐ ๋ถ๋ถ ์ฌ์ด์ ๊ฐญ์ด ์กด์ฌํ์ง๋ง ์ด๋ ๊ณ ๋ ค๋์ด ์์ง ์๋ค. ๋, ASLR(address space layout randomization) ๋ํ ๊ณ ๋ ค๋์ง ์์ ๊ทธ๋ฆผ์ด๋ค.
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ก๋ฉ๋ ํ์๋ entry point์ ์ง์
ํ๋ค. ์ด๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์์ _start
๋ผ๋ ํจ์์ ์์น๋ก ๋์ผํ๋ค. _start
๋ __libc_start_main
์ ์คํํ๋๋ฐ, ์ด๋ ์คํ ํ๊ฒฝ์ setupํ๊ณ ์ฌ์ฉ์๊ฐ ์ ์ํ main ํจ์๋ฅผ ์คํํ๋ฉฐ ๊ทธ ๋ฐํ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฑ์ ์ญํ ์ ํ๋ค.
7.10. ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ๋งํน
์์์ ์ดํด๋ณธ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์
๋ฐ์ดํธ๋ ๋๋ง๋ค ์๋์ผ๋ก ๋งํน์ ๋ค์ ์คํํด์ executable object๋ฅผ ๋ค์ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
printf
, scanf
์ฒ๋ผ ๊ฑฐ์ ๋ชจ๋ C ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ ํจ์๋ค์ ๊ฒฝ์ฐ์๋, ๋ชจ๋ ํ๋ก๊ทธ๋จ ๋ด์ ๊ทธ ๋ณต์ฌ๋ณธ์ด ์กด์ฌํ๊ฒ ๋๋ค. ์ด๋ ๋นํจ์จ์ ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์กด์ฌํ๋ ๊ฒ์ด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(shared library)์ด๋ค. ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ runtime ๋๋ load time์ ์์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ก๋๋์ด ํ๋ก๊ทธ๋จ๊ณผ ๋งํน์ํฌ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด ๋,
- ๋งํน์ํค๋ ๊ณผ์ ์ ๋์ ๋งํน(dynamic linking)์ด๋ผ ๋ถ๋ฅด๋ฉฐ
- ๋์ ๋ง์ปค(dynamic linker)์ ์ํด ์ํ๋๋ค.
- ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋
.so
(shared object) ํ์ฅ์๋ก ์ ์ฅ๋๋ฉฐ, ์๋์ฐ์์๋ .so
๋์ .dll
(dynamic link library)๋ฅผ ์ฌ์ฉํ๋ค.
๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ โ๊ณต์ โ๋ผ๊ณ ์ด๋ฆ๋ถ์ธ ๋ฐ์๋ ๋ ๊ฐ์ง ์ด์ ๊ฐ ์๋ค.
- ๋จผ์ , ํ๋์ ํ์ผ ์์คํ
์๋ ๋์ผํ
.so
ํ์ผ์ด ํ๋๋ง ์กด์ฌํ๋ค. ํด๋น ํ์ผ์ ์ฐธ์กฐํ๋ ๋ชจ๋ executable object file์ ์ด๋ฅผ ๊ณต์ ํ๋ค.
- ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋๋ฉด, ๊ทธ
.text
์น์
์ ์คํ์ค์ธ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ๊ณต์ ํ ์ ์๋ค.
๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด ๋งํนํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ปค๋งจ๋๋ผ์ธ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ๋๋ค.
gcc -shared -fpic -o libvector.so addvec.c multvec.c
gcc -o prog main.c ./libvector.so
- ์ฒซ ๋ฒ์งธ ์ค์ addvec.c์ multvec.c๋ฅผ ์ปดํ์ผํด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ์ญํ ์ ํ๋ค.
-fpic
์ต์
์ ํ์ ํ position-independent code(PIC)๋ก ์ปดํ์ผํ๋ผ๋ ๋ช
๋ น์ด๋ค.
- ๋์งธ ์ค์ ๋ง๋ค์ด์ง ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
libvector.so
๋ฅผ main.c์ ๋งํน์ํค๋ ๋ถ๋ถ์ด๋ค. ๋ฌธ๋ฒ์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ผํ๋ ์ด ๊ฒฝ์ฐ libvector.so
๊ฐ executable object file๋ก ๋ณต์ฌ๋์ง ์๊ณ , .rel
๊ณผ ์ฌ๋ณผ ํ
์ด๋ธ๋ง์ ์ผ๋ถ ๋ณต์ฌํด์ load time์ resolve๋ ์ ์๋๋ก ๋ด๋ฒ๋ ค๋๋ค.
Load time์ prog
๋ฅผ ์คํํ๋ฉด ์ผ๋ฐ์ ์ธ ๋ก๋ฉ ๊ณผ์ ์ ๊ฑฐ์น๋ค๊ฐ, ๋ก๋๊ฐ .interp
์น์
์ ๋์ ๋ง์ปค์ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ฌ ๋์ ๋ง์ปค์ control์ ๋๊ฒจ์ค๋ค. ๋์ ๋ง์ปค๋ ๋ค์ ์์
์ผ๋ก ๋งํน์ ์งํ์ํจ๋ค.
- ๊ธฐ๋ณธ C ํจ์๋ค์ ๋ด์
libc.so
์ libvector.so
์ .text
์ .data
๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์จ๋ค
- ๋ ํ์ผ์ ์ฌ๋ณผ์ ๋ํ
prog
์ ์ฐธ์กฐ๋ฅผ relocation์ํจ๋ค.
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
- Global variable์ โPICํโ ๋ฐฉ๋ฒ์ผ๋ก ์ฐธ์กฐํ๊ธฐ ์ํด์๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ์ด์์
.data
์ .code
์ธ๊ทธ๋จผํธ์ ๊ฑฐ๋ฆฌ, ์ฆ ์ฃผ์์ ์ฐจ์ด๊ฐ ํญ์ ๊ฐ๋ค๋ ์ ์ ์ด์ฉํ๋ค.
์ด๋ฅผ ์ํด .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()
์ ํธ์ถํ๋ ์ํฉ์ ๊ฐ์ ํ๋ค.
- ์ฒซ ๋ฒ์งธ ํธ์ถ
- ์ด์
๋ธ๋ฆฌ ์ฝ๋๋ถํฐ๊ฐ
addvec()
์ ์ฃผ์๋ฅผ ์ฐพ์ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ, ์ด์ ๋์๋๋ PLT[2]
๋ฅผ ํธ์ถํ๋๋ก ๋์ด ์๋ค. PLT[2]
๋ฅผ ํธ์ถ(์ฆ ํ์ฌ ์ฃผ์๋ฅผ pushํ๊ณ PLT[2]
์ ์ฃผ์๋ก ์ ํ)ํ๋ค.
PLT[2]
์ ์ฒซ ์ค์ GOT[4]
์ ์ ์ฅ๋ ์ฃผ์๋ก ์ ํํ๋๋ก ๋์ด ์๋ค. GOT[4]
๋ฅผ ๋ณด๋ฉด, ์ด๊ธฐ ์ํ์๋ ๊ทธ๋ฅ PLT[2]
์ ๋ ๋ฒ์งธ ์ค์ ์ฃผ์๊ฐ ์ ์ฅ๋์ด ์๋ค. ๋ฐ๋ผ์ PC๊ฐ ๊ทธ๋ฅ PLT[2]
์ ๋ค์ ์ค๋ก ๋์ด๊ฐ๋ค.
pushq $0x1
์ผ๋ก addvec()
์ id์ธ 1์ด ์คํ์ ํธ์๋๋ค.
- ์ด์ ์คํ์๋ relocation entry์ ์ฃผ์์
addvec()
์ id(1)๊ฐ ์ ์ฅ๋์ด ์๋ ์ํ์ด๋ค. ์ด ๋ ๋์ ๋ง์ปค๊ฐ ์คํ๋๋ฉด addvec()
์ ๋์๋๋ ํญ๋ชฉ์ธ GOT[4]
๊ฐ ์ค์ addvec()
์ ์ฃผ์๋ก ๋ฐ๋๋ค. ๋ค์ ๋ฒ์ ํธ์ถ์ ์ํด ์ค๋น๊ฐ ์๋ฃ๋์๋ค!
-
๋ ๋ฒ์งธ ํธ์ถ
- ์ด์ ๋ ๋ฒ์งธ ํธ์ถ๋ถํฐ๋
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์ ์ฌ์ฉํ๋ฉด ํจ์์ ํธ์ถ ์๊ฐ์ด๋ ํ์ ๋ฑ์ ์ ์ ์์ด ๋๋ฒ๊น
์ ์ฉ์ดํ๋ค.