๊ณต๋ถ€/์–ธ์–ด

์ปดํŒŒ์ผ(Compile)์— ๋Œ€ํ•œ ์ดํ•ด

Bradbury 2021. 8. 28. 04:07
728x90

์„œ๋ก 

C, C++, Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ดค์œผ๋ฉด ์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œ(Build) ํ˜น์€ ์ปดํŒŒ์ผ(Compile)ํ•ด์„œ ์‹คํ–‰ํ•ด๋ดค๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ์ž‘์„ฑํ•˜์—ฌ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋˜ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ •ํ™•ํ•˜๊ฒŒ ์ปดํŒŒ์ผ์ด ์–ด๋– ํ•œ ์ผ์„ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ๋ง‰์—ฐํ•˜๊ฒŒ "์ปดํŒŒ์ผ์„ ํ•˜๋ฉด ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ฌธ๋ฒ•์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์‹คํ–‰ํ•˜๋‚˜ ๋ณด๋‹ค"๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค๋ฉด ์ด์ฐธ์— ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

โ€ป ๊ทธ๋ฆผ์ด๋‚˜ ์˜ˆ์‹œ๋Š” ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์˜ C์–ธ์–ด ์ปดํŒŒ์ผ ๊ณผ์ •์„ ์ค‘์‹ฌ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๋ฏ€๋กœ ์–ธ์–ด, ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 


์ปดํŒŒ์ผ์˜ ์ •์˜

์ปดํŒŒ์ผ์€ ์ธ๊ฐ„์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค ์ฝ”๋“œ(๊ณ ์ˆ˜์ค€ ์–ธ์–ด : C, C++, Java ๋“ฑ)๋ฅผ CPU๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด(์ €์ˆ˜์ค€ ์–ธ์–ด : ๊ธฐ๊ณ„์–ด)๋กœ ๋ฒˆ์—ญ(๋ณ€ํ™˜)ํ•˜๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ C, C++, Java๋กœ ์ž‘์„ฑํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค. ์ปดํ“จํ„ฐ๋Š” 0, 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธฐ๊ณ„์–ด๋งŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ 0, 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ์ปดํŒŒ์ผ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์†Œ์Šค ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ์„ ํ†ตํ•ด ๊ธฐ๊ณ„์–ด๋กœ ์ด๋ฃจ์–ด์ง„ ์‹คํ–‰ ํŒŒ์ผ์ด ๋œ๋‹ค. ์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ์‹คํ–‰ ํŒŒ์ผ ๋‚ด์šฉ์ด ์šด์˜์ฒด์ œ์˜ Loader๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•œ๋‹ค.

 

 


์ปดํŒŒ์ผ ๊ณผ์ •

์ปดํŒŒ์ผ ๊ณผ์ •์€ 4๊ฐ€์ง€ ๋‹จ๊ณ„(์ „์ฒ˜๋ฆฌ ๊ณผ์ • - ์ปดํŒŒ์ผ ๊ณผ์ • - ์–ด์…ˆ๋ธ”๋ฆฌ ๊ณผ์ • - ๋งํ‚น ๊ณผ์ •)๋กœ ๋‚˜๋ˆ„์–ด ์ง„๋‹ค.

์ด 4๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๋ฌถ์–ด์„œ ์ปดํŒŒ์ผ ๊ณผ์ •, ๋นŒ๋“œ ๊ณผ์ •์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๊ณ  ์ปดํŒŒ์ผ ๊ณผ์ •๊ณผ ๋งํ‚น ๊ณผ์ •์„ ๋”ฐ๋กœ ๋‚˜๋ˆ ์„œ ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.

๋ณดํ†ต ๋นŒ๋“œ ๊ณผ์ •์€ ์ปดํŒŒ์ผ ๊ณผ์ •๋ณด๋‹ค ๋„“์€ ์˜๋ฏธ(๋นŒ๋“œ=์ปดํŒŒ์ผ+๋งํ‚น)๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฑฐ ๊ฐ™๋‹ค.

๊ทธ๋Ÿผ ๊ฐ ๋‹จ๊ณ„๋ณ„ ๊ณผ์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

 


1. ์ „์ฒ˜๋ฆฌ(Pre-processing) ๊ณผ์ •

์ „์ฒ˜๋ฆฌ(Pre-processing) ๊ณผ์ •์€ ์ „์ฒ˜๋ฆฌ๊ธฐ(Preprocessor)๋ฅผ ํ†ตํ•ด ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ(*.c)์„ ์ „์ฒ˜๋ฆฌ๋œ ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ(*.i)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

์ด ๊ณผ์ •์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฃผ์„ ์ œ๊ฑฐ : ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ฃผ์„์„ ์ „๋ถ€ ์ œ๊ฑฐํ•œ๋‹ค. ์ฃผ์„์€ ์‚ฌ๋žŒ๋“ค์ด ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋‚จ๊ธด ๋‚ด์šฉ์ด์ง€ ์ปดํ“จํ„ฐ๊ฐ€ ์•Œ ํ•„์š”๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ—ค๋” ํŒŒ์ผ ์‚ฝ์ž… : #include ์ง€์‹œ๋ฌธ์„ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹นํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ์„ ์ฐพ์•„ ํ—ค๋” ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด์„œ ์†Œ์Šค ์ฝ”๋“œ์— ์‚ฝ์ž…ํ•œ๋‹ค. ์ฆ‰, ํ—ค๋” ํŒŒ์ผ์€ ์ปดํŒŒ์ผ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ ๋‚ด์— ์ „๋ถ€ ๋ณต์‚ฌ๋œ๋‹ค. ํ—ค๋” ํŒŒ์ผ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜ ์›ํ˜•์€ ํ›„์— ๋งํ‚น ๊ณผ์ •์„ ํ†ตํ•ด ์‹ค์ œ๋กœ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(์ปดํŒŒ์ผ๋œ ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ)๊ณผ ๊ฒฐํ•ฉํ•œ๋‹ค.

๋งคํฌ๋กœ ์น˜ํ™˜ ๋ฐ ์ ์šฉ : #define ์ง€์‹œ๋ฌธ์— ์ •์˜๋œ ๋งคํฌ๋กœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ๋งŒ๋‚˜๋ฉด #define ๋œ ๋‚ด์šฉ์œผ๋กœ ์น˜ํ™˜ํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•ด ๋งคํฌ๋กœ ์ด๋ฆ„์„ ์ฐพ์•„์„œ ์ •์˜ํ•œ ๊ฐ’์œผ๋กœ ์ „๋ถ€ ๋ฐ”๊ฟ”์ค€๋‹ค.

 


2. ์ปดํŒŒ์ผ(Compilation) ๊ณผ์ •

 

์ปดํŒŒ์ผ(Compilation) ๊ณผ์ •์€ ์ปดํŒŒ์ผ๋Ÿฌ(Compiler)๋ฅผ ํ†ตํ•ด ์ „์ฒ˜๋ฆฌ๋œ ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ(*.i)์„ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํŒŒ์ผ(*.s)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

์ด ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์ƒ๊ฐํ•˜๋Š” ์–ธ์–ด์˜ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋˜ํ•œ Staticํ•œ ์˜์—ญ(Data, BSS ์˜์—ญ)๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌ์กฐ 

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์„ธ ๋‹จ๊ณ„(ํ”„๋ก ํŠธ์—”๋“œ - ๋ฏธ๋“ค์—”๋“œ - ๋ฐฑ์—”๋“œ)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ(Front-end)

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ์–ธ์–ด ์ข…์†์ ์ธ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ํ•ด๋‹น ์–ธ์–ด๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ(์–ดํœ˜/๊ตฌ๋ฌธ/์˜๋ฏธ ๋ถ„์„)ํ•˜๊ณ  ๋ฏธ๋“ค์—”๋“œ์— ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•œ GIMPLE ํŠธ๋ฆฌ(์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ด ๊ณผ์ •์—์„œ C, C++, Java์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋“ค์ด ๊ฐ ์–ธ์–ด์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌ๋œ ํ›„ ๊ณตํ†ต๋œ ์ค‘๊ฐ„ ํ‘œํ˜„(IR : Intermediate representation)์ธ GIMPLE ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜๋˜๋ฏ€๋กœ ์–ธ์–ด ์ข…์†์ ์ธ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฏธ๋“ค์—”๋“œ(Middle-end)

๋ฏธ๋“ค์—”๋“œ์—์„œ๋Š” ์•„ํ‚คํ…์ณ ๋น„์ข…์†์ ์ธ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์•„ํ‚คํ…์ณ ๋น„์ข…์†์ ์ธ ์ตœ์ ํ™”๋ž€ CPU ์•„ํ‚คํ…์ณ๊ฐ€ ๋ฌด์—‡์ด๋“ (arm, x86 ๋“ฑ) ์ƒ๊ด€์—†์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™”๋ฅผ ๋งํ•œ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋„˜๊ฒจ๋ฐ›์€ GIMPLE ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์•„ํ‚คํ…์ณ ๋น„์ข…์†์ ์ธ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋ฐฑ์—”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” RTL(Register Transfer Language : ๊ณ ๊ธ‰ ์–ธ์–ด์™€ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์˜ ์ค‘๊ฐ„ ํ˜•ํƒœ)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

๋ฐฑ์—”๋“œ(Back-end)

๋ฐฑ์—”๋“œ์—์„œ๋Š” ์•„ํ‚คํ…์ณ ์ข…์†์ ์ธ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

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

๋ฏธ๋“ค์—”๋“œ์—์„œ ๋„˜๊ฒจ๋ฐ›์€ RTL์„ ์ด์šฉํ•ด ์•„ํ‚คํ…์ณ ์ข…์†์ ์ธ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ตœ์ ํ™”๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์•„ํ‚คํ…์ณ ์ข…์†์ ์ธ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•ด๋‹น ์•„ํ‚คํ…์ณ๋งŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„ํ‚คํ…์ณ๊ฐ€ ๋งž์ง€ ์•Š์œผ๋ฉด ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์—†๋‹ค.

 

์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์ •์˜

๊ธฐ๊ณ„์–ด๋Š” ๋‹ค๋ฅธ ๋ง๋กœ ๋ช…๋ น์–ด(Machine Instruction)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ ๋ช…๋ น์–ด๋Š” 0101010๊ณผ ๊ฐ™์€ ์ด์ง„์ˆ˜๋กœ ์ด๋ค„์ง„ ์ˆซ์ž๋กœ CPU ์ข…๋ฅ˜๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๋‚ด์šฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋Š” ์ด๋Ÿฐ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ถ€ํ˜ธํ™”ํ•œ ๊ฒƒ์œผ๋กœ CPU ๋ช…๋ น์–ด(๊ธฐ๊ณ„์–ด)์™€ 1๋Œ€1๋กœ ๋งค์นญ๋œ๋‹ค.

 

๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•ž์„œ ์„ค๋ช…ํ•œ ์„ธ ๋‹จ๊ณ„์˜ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๋งˆ๋‹ค ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.

GNU์—์„œ ๋งŒ๋“  C ์ปดํŒŒ์ผ๋Ÿฌ์ธ gcc๋Š” ํ”„๋ก ํŠธ์—”๋“œ/๋ฏธ๋“ค์—”๋“œ/๋ฐฑ์—”๋“œ ๋‹จ๊ณ„๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ์˜์กด์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ์— ๋น„ํ•ด ์˜คํ”ˆ ์†Œ์Šค C ์ปดํŒŒ์ผ๋Ÿฌ์ธ Clang(ํ”„๋ก ํŠธ์—”๋“œ) + LLVM(๋ฏธ๋“ค์—”๋“œ, ๋ฐฑ์—”๋“œ)๋Š” ๋‹จ๊ณ„๊ฐ€ ์ž˜ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค.

 


3. ์–ด์…ˆ๋ธ”๋ฆฌ(Assembly) ๊ณผ์ •

์–ด์…ˆ๋ธ”๋ฆฌ(Assembly) ๊ณผ์ •์€ ์–ด์…ˆ๋ธ”๋Ÿฌ(Assembler)๋ฅผ ํ†ตํ•ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํŒŒ์ผ(*.s)์„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(*.o)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

๊ทธ๋Ÿผ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

 

์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(Object File) ์ •์˜

์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋Š” ์ด์ œ ๋” ์ด์ƒ ์‚ฌ๋žŒ์ด ์•Œ์•„๋ณผ ์ˆ˜ ์—†๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋˜๋Š”๋ฐ ์ด๋ฅผ ์˜ค๋ธŒ์ ํŠธ ์ฝ”๋“œ๋ผ ๋ถ€๋ฅธ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํŒŒ์ผ์„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(Object File)์ด๋ผ ๋ถ€๋ฅด๋ฉฐ ์ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์€ ํŠน์ •ํ•œ ํŒŒ์ผ ํฌ๋งท์„ ๊ฐ€์ง„๋‹ค.

โ€ป ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ํฌ๋งท์˜ ์ข…๋ฅ˜๋Š” Windows์˜ ๊ฒฝ์šฐ PE(Portable Executable), Linux์˜ ๊ฒฝ์šฐ ELF(Executable and Linking Format)๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.

 

์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ํฌ๋งท(Object File Format)

์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ํฌ๋งท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ํ—ค๋”(Object File Header) : ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ๊ธฐ์ดˆ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ—ค๋”

ํ…์ŠคํŠธ ์„น์…˜(Text Section) : ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋ถ€๋ถ„

๋ฐ์ดํ„ฐ ์„น์…˜(Data Section) : ๋ฐ์ดํ„ฐ(์ „์—ญ ๋ณ€์ˆ˜, ์ •์  ๋ณ€์ˆ˜)๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋ถ€๋ถ„

์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ์„น์…˜(Symbol Table Section) : ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ฐธ์กฐ๋˜๋Š” ์‹ฌ๋ณผ๋“ค์˜ ์ด๋ฆ„๊ณผ ์ฃผ์†Œ๊ฐ€ ์ •์˜ ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„.

์žฌ๋ฐฐ์น˜ ์ •๋ณด ์„น์…˜(Relocation Information Section) : ๋งํ‚น ์ „๊นŒ์ง€ ์‹ฌ๋ณผ์˜ ์œ„์น˜๋ฅผ ํ™•์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹ฌ๋ณผ์˜ ์œ„์น˜๊ฐ€ ํ™•์ • ๋‚˜๋ฉด ๋ฐ”๊ฟ”์•ผ ํ•  ๋‚ด์šฉ์„ ์ ์–ด๋†“์€ ๋ถ€๋ถ„

๋””๋ฒ„๊น… ์ •๋ณด ์„น์…˜(Debugging Information Secion) : ๋””๋ฒ„๊น…์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ์„น์…˜๊ณผ ์žฌ๋ฐฐ์น˜ ์ •๋ณด ์„น์…˜์ด๋‹ค.

์‹ฌ๋ณผ(Symbol)์€ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์‹๋ณ„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”(Symbol Table) ์•ˆ์—๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์—์„œ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ์‹ฌ๋ณผ ์ •๋ณด(์ด๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ ๋“ฑ)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด๋•Œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์—๋Š” ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ์‹ฌ๋ณผ ์ •๋ณด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ์‹ฌ๋ณผ ์ •๋ณด์˜ ๊ฒฝ์šฐ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค.

 

#include<stdio.h> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ printf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์šฐ๋ฆฐ ์ด ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ์ด ํŒŒ์ผ ์•ˆ์—๋Š” printf ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ ๋‚ด์šฉ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ „์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํ†ตํ•ด #include<stdio.h>๋กœ๋ถ€ํ„ฐ printf ํ•จ์ˆ˜์˜ ์›ํ˜•์€ ๋ณต์‚ฌํ–ˆ์ง€๋งŒ printf๋ฅผ ๊ตฌํ˜„ํ•œ ๋‚ด์šฉ์€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๊ตฌ์กฐ์—์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์—๋Š” ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ์‹ฌ๋ณผ ์ •๋ณด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•˜๋Š” printf ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์‹ฌ๋ณผ ์ •๋ณด๋Š” ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค.

์ฆ‰, ์ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” printf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๊ณผ printf ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(libc.a ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ ๊ณผ์ •์„ ๋งํ‚น(Linking)์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ๊ทธ๋Ÿผ ๋งํ‚น์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

 


4. ๋งํ‚น(Linking) ๊ณผ์ •

๋งํ‚น(Linking) ๊ณผ์ •์€ ๋ง์ปค(Linker)๋ฅผ ํ†ตํ•ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(*.o)๋“ค์„ ๋ฌถ์–ด ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด๋‹ค.

์ด ๊ณผ์ •์—์„œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค๊ณผ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋“ค์„ ๋งํฌํ•˜์—ฌ ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

์ด๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์ •์  ๋งํ‚น(Static Linking)๊ณผ ๋™์  ๋งํ‚น(Dynamic Linking)์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ๋งํ‚น ๋ฐฉ์‹์˜ ์ฐจ์ด๋Š” ์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Library)์— ๋Œ€ํ•œ ์ดํ•ด

์„œ๋ก  ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ๋งŽ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์ •ํ™•ํ•œ ๊ฐœ๋…์€ ๋ชฐ๋ผ๋„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋„๊ตฌ๋ผ๋Š” ๊ฒƒ์€ ์–ด๋ ดํ’‹์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค

bradbury.tistory.com

 

๋ง์ปค์˜ ์—ญํ• 

๋ง์ปค์˜ ์—ญํ• ์€ ํฌ๊ฒŒ ์‹ฌ๋ณผ ํ•ด์„๊ณผ ์žฌ๋ฐฐ์น˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

์‹ฌ๋ณผ ํ•ด์„(Symbol Resolution)

์‹ฌ๋ณผ ํ•ด์„์€ ๊ฐ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์— ์žˆ๋Š” ์‹ฌ๋ณผ ์ฐธ์กฐ๋ฅผ ์–ด๋–ค ์‹ฌ๋ณผ ์ •์˜์— ์—ฐ๊ด€์‹œํ‚ฌ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์— ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•จ์ˆ˜ ๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์„ ๋•Œ ์–ด๋–ค ํŒŒ์ผ์˜ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

 

์žฌ๋ฐฐ์น˜(Relocation)

์žฌ๋ฐฐ์น˜๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋‚˜ ์ฝ”๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ ์ฃผ์†Œ๋ฅผ ์•Œ๋งž๊ฒŒ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

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

์ด๋ฅผ ์œ„ํ•ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ์•ˆ์— ์žฌ๋ฐฐ์น˜ ์ •๋ณด ์„น์…˜(Relocation Information Section)์ด ์กด์žฌํ•œ๋‹ค. 

๋งํ‚น ๊ณผ์ •์—์„œ ๊ฐ™์€ ์„ธ์…˜๋ผ๋ฆฌ ํ•ฉ์ณ์ง„ ํ›„ ์žฌ๋ฐฐ์น˜๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ํ˜•์‹์€ ๋งํ‚น ๊ณผ์ •์—์„œ ๋ง์ปค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋ฌถ์„ ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

๋งํ‚น์„ ํ•˜๊ธฐ ์ „ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(Relocatable Object File)์ด๋ผ ๋ถ€๋ฅด๊ณ  ๋งํ‚น์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(Executable Object File)์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

 

 

 


๊ฒฐ๋ก 

์ด๋กœ์จ ์ปดํŒŒ์ผ์„ ํ†ตํ•ด ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ์ด ์‹คํ–‰ ํŒŒ์ผ์ด ๋˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

์ด ๊ธ€์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์กฐ๊ธˆ์€ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

โ€ป ์ปดํŒŒ์ผ ๊ณผ์ • ๋™์•ˆ ์—ฐ์‡„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ ๋„๊ตฌ๋“ค(์ „์ฒ˜๋ฆฌ๊ธฐ-์ปดํŒŒ์ผ๋Ÿฌ-์–ด์…ˆ๋ธ”๋ฆฌ-๋ง์ปค)์„ ๋ฌถ์–ด์„œ ํˆด์ฒด์ธ(Toolchain)์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

๋๐Ÿค”

728x90