๐Ÿ”—Computer System : 7.๋ง์ปค Linking_part1

A Yeon Jangยท2025๋…„ 8์›” 15์ผ

Computer System : 7.๋ง์ปค Linking_part1

โš™๏ธ ์ปดํŒŒ์ผ ์‹œ์Šคํ…œ


7๋‹จ์›์˜ ๋ง์ปค๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์— 1๋‹จ์›์—์„œ ์‚ดํŽด๋ดค๋˜ ์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณด์—ฌ์ง€๋Š” ์ปดํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋จผ์ € ์‚ดํŽด๋ณด์ž.
์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” hello.c๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์€
์ „์ฒ˜๋ฆฌ๊ธฐ โžก๏ธ ์ปดํŒŒ์ผ๋Ÿฌ โžก๏ธ ์–ด์…ˆ๋ธ”๋Ÿฌ โžก๏ธ ๋ง์ปค ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์„œ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์œ„ ๋‹จ๊ณ„ ์ค‘ ๋ง์ปค ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ’ญ Linking ์ด๋ž€?

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ์žˆ๊ณ  ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—…

  • ์ด๋“ค์ด ๋…๋ฆฝ์ ์ธ ์ปดํŒŒ์ผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์‹œ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋งํ‚น์€ ๋Œ€๊ฒŒ ๋ง์ปค์— ์˜ํ•ด ์ฒ˜๋ฆฌ

โฑ๏ธ Linking ํƒ€์ด๋ฐ

๋งํ‚น์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์‹œ์ ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

1.Compile Time(์ปดํŒŒ์ผ์‹œ) : ์ „ํ†ต์ ์ธ ์ •์  ๋งํฌ
2.Load Time(๋กœ๋“œ์‹œ) : ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ „ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋”ฉ
3.Run Time(์‹คํ–‰์‹œ) : ํ”Œ๋Ÿฌ๊ทธ์ธ, .so ๋“ฑ ์‹คํ–‰ ์ค‘ ๋กœ๋”ฉ

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป Linking ์„ ๋ฐฐ์šฐ๋Š” ์ด์œ 

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

โ‰๏ธ ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ๋ฐฐ์šฐ๋Š”๊ฐ€?

  • ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ์— ๋„์›€์ด ๋œ๋‹ค.
    • ์ข…์ข… ๋ชจ๋“ˆ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ
      ๋ง์ปค์˜ ์ฐธ์กฐ ํ•ด๊ฒฐ ๋ฐฉ์‹์„ ์•Œ๋ฉด ๋„์›€์ด ๋œ๋‹ค.
  • ์œ„ํ—˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—๋Ÿฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ง์ปค๊ฐ€ ์‹ฌ๋ณผ ์ฐธ์กฐ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ์— ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์— ๋ฏธ๋ฏธํ•œ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์–ธ์–ด์˜ ๋ณ€์ˆ˜ ์˜์—ญ ๊ทœ์น™์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • ์ „์—ญ/์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? / static์€ ๋ฌด์Šจ ์˜๋ฏธ์ธ๊ฐ€?
  • ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ง์ปค๊ฐ€ ๋งŒ๋“  ํŒŒ์ผ์€ ์‹œ์Šคํ…œ ํ•จ์ˆ˜, ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ, ํŽ˜์ด์ง• ๋“ฑ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
  • ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„๋Œ€ ์šด์˜์ฒด์ œ์—์„œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์  ๋งํ‚น์˜ ์ค‘์š”์„ฑ์ด ๋†’์•„์กŒ๋‹ค.

๐Ÿ’ฌ ์ด๋Ÿฌํ•œ ๋งํ‚น์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ด ๊ณผ์ •์„ ๋ˆ„๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•˜๋Š”์ง€๋„ ์•Œ์•„์•ผ ํ•˜๋ฉฐ
๊ทธ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„์ด๋‹ค.


๐Ÿค– ์ปดํŒŒ์ผ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„

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

๐Ÿ”ข GCC ์ปดํŒŒ์ผ ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„

1๏ธโƒฃ cpp [other arguments] main.c /tmp/main.i

  • ๋ช…๋ น์–ด: cpp
    GNU C PreProcessor(์ „์ฒ˜๋ฆฌ๊ธฐ) ์‹คํ–‰
  • [other arguments]: GCC๊ฐ€ ์ž๋™์œผ๋กœ ๋„˜๊ธฐ๋Š” ์ „์ฒ˜๋ฆฌ ์˜ต์…˜๋“ค
    (์˜ˆ: ๋งคํฌ๋กœ ์ •์˜ -D, ์ธํด๋ฃจ๋“œ ๊ฒฝ๋กœ -I ๋“ฑ)
  • main.c: ์ „์ฒ˜๋ฆฌํ•  C ์†Œ์Šค ํŒŒ์ผ
  • /tmp/main.i: ์ „์ฒ˜๋ฆฌ๋œ C ์ฝ”๋“œ ์ถœ๋ ฅ ๊ฒฝ๋กœ (.i ํ™•์žฅ์ž)

๐Ÿ“Œ ์š”์•ฝ: main.c๋ฅผ ์ฝ์–ด ๋งคํฌ๋กœ/ํ—ค๋” ํฌํ•จ์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ /tmp/main.i์— ์ €์žฅ


2๏ธโƒฃ cc1 /tmp/main.i -Og [other arguments] -o /tmp/main.s

  • ๋ช…๋ น์–ด: cc1
    GNU C Compiler ์‹คํ–‰ (C โ†’ ์–ด์…ˆ๋ธ”๋ฆฌ)
  • /tmp/main.i: ์ „์ฒ˜๋ฆฌ๋œ ์ž…๋ ฅ C ํŒŒ์ผ
  • -Og: ๋””๋ฒ„๊น… ์นœํ™”์  ์ตœ์ ํ™” ์ˆ˜์ค€ (์ผ๋ถ€ ์ตœ์ ํ™” ์ ์šฉ, ๋””๋ฒ„๊ทธ ์ •๋ณด ์œ ์ง€)
  • [other arguments]: GCC ๋‚ด๋ถ€ ์ตœ์ ํ™”/๊ฒฝ๊ณ  ์˜ต์…˜ ๋“ฑ
  • -o /tmp/main.s: ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ์ถœ๋ ฅ ๊ฒฝ๋กœ ์ง€์ • (.s ํ™•์žฅ์ž)

๐Ÿ“Œ ์š”์•ฝ: ์ „์ฒ˜๋ฆฌ๋œ C ์ฝ”๋“œ(/tmp/main.i)๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ(/tmp/main.s)๋กœ ๋ณ€ํ™˜


3๏ธโƒฃ as [other arguments] -o /tmp/main.o /tmp/main.s

  • ๋ช…๋ น์–ด: as
    GNU Assembler(์–ด์…ˆ๋ธ”๋Ÿฌ) ์‹คํ–‰
  • [other arguments]: ์•„ํ‚คํ…์ฒ˜/๊ฒฝ๊ณ  ์ œ์–ด ๋“ฑ์˜ ์–ด์…ˆ๋ธ”๋Ÿฌ ์˜ต์…˜
  • -o /tmp/main.o: ์ถœ๋ ฅ ๋ชฉ์  ํŒŒ์ผ ๊ฒฝ๋กœ (.o ํ™•์žฅ์ž)
  • /tmp/main.s: ์ž…๋ ฅ ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ

๐Ÿ“Œ ์š”์•ฝ: ์–ด์…ˆ๋ธ”๋ฆฌ(/tmp/main.s)๋ฅผ ๊ธฐ๊ณ„์–ด ๋ชฉ์  ํŒŒ์ผ(/tmp/main.o)๋กœ ๋ณ€ํ™˜


4๏ธโƒฃ ld -o prog [system object files and args] /tmp/main.o /tmp/sum.o

  • ๋ช…๋ น์–ด: ld
    GNU Linker(๋ง์ปค) ์‹คํ–‰
  • -o prog: ์ถœ๋ ฅ ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„์„ prog๋กœ ์ง€์ •
  • [system object files and args]:
    ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์‹œ์ž‘ ์ฝ”๋“œ(startup code, ์˜ˆ: _start ์ •์˜)์™€ ๊ด€๋ จ๋œ ์‹œ์Šคํ…œ ๋ชฉ์  ํŒŒ์ผ๋“ค
    (์˜ˆ: /usr/lib/crt1.o, /usr/lib/libc.so ๋งํฌ ์˜ต์…˜ ๋“ฑ)
  • /tmp/main.o /tmp/sum.o: ๋งํฌํ•  ์‚ฌ์šฉ์ž ๋ชฉ์  ํŒŒ์ผ ๋ชฉ๋ก

๐Ÿ“Œ ์š”์•ฝ: main.o, sum.o์™€ ์‹œ์Šคํ…œ ๋ชฉ์  ํŒŒ์ผยท๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•ด ์‹คํ–‰ ํŒŒ์ผ prog ์ƒ์„ฑ


5๏ธโƒฃ linux> ./prog

  • linux ์‰˜์€ ์šด์˜์ฒด์ œ ๋‚ด์˜ ํ•จ์ˆ˜์ธ Loader๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋กœ๋”๋Š” ์‹คํ–‰ํŒŒ์ผ prog์˜ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌํ•˜๊ณ  ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ ์ „ํ™˜

๐Ÿ“Œ ์ „์ฒด ํ๋ฆ„

  1. cpp: ๋งคํฌ๋กœ/ํ—ค๋” ์ „์ฒ˜๋ฆฌ โ†’ .i
  2. cc1: C โ†’ ์–ด์…ˆ๋ธ”๋ฆฌ โ†’ .s
  3. as: ์–ด์…ˆ๋ธ”๋ฆฌ โ†’ ๊ธฐ๊ณ„์–ด(.o)
  4. ld: ์—ฌ๋Ÿฌ .o + ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ โ†’ ์‹คํ–‰ ๊ฐ€๋Šฅ ํŒŒ์ผ

๐Ÿ’ฌ ์ฆ‰, ์ปดํŒŒ์ผ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋งํ‚น๊นŒ์ง€ ํฌํ•จํ•œ ์ „์ฒด ๋นŒ๋“œ ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์ด์ œ ์ด ์ค‘์—์„œ๋„ ์šฐ๋ฆฌ๊ฐ€ ์ง‘์ค‘ํ•  ์ •์  ๋งํฌ ๊ณผ์ •์˜ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์„ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


โœ‹๐Ÿป ์ •์  ๋งํฌ

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

โžก๏ธ ์ด๋ ‡๊ฒŒ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋ง์ปค๋Š” ๋‘๊ฐ€์ง€ ์ฃผ์š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ’ฌ ์‹ฌ๋ณผ ํ•ด์„(symbol resolution)

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ,
๊ฐ ์‹ฌ๋ณผ(ํ•จ์ˆ˜, ์ „์—ญ ๋ณ€์ˆ˜, ์ •์  ๋ณ€์ˆ˜ ๋“ฑ)์˜ ์ฐธ์กฐ๋ฅผ ํ•ด๋‹น ์‹ฌ๋ณผ์ด ์ •์˜๋œ ์œ„์น˜์™€ ์—ฐ๊ฒฐํ•œ๋‹ค.
์ด ๋‹จ๊ณ„์—์„œ ์‹ฌ๋ณผ ์ด๋ฆ„ โ†’ ์‹ฌ๋ณผ ์ •์˜(์„น์…˜, ์˜คํ”„์…‹) ๋งคํ•‘์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

๐Ÿ”„ ์žฌ๋ฐฐ์น˜(Relocation)

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

๐Ÿ’ฌ ์ •์  ๋งํฌ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด, ๋งํฌ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ์–ด๋–ค ํ˜•์‹์˜ ํŒŒ์ผ์ธ์ง€๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•˜๋ฉฐ,
์ด๋ฅผ ์œ„ํ•ด ๋ชฉ์  ํŒŒ์ผ(Object File)์˜ ์ข…๋ฅ˜๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ—ƒ๏ธ ๋ชฉ์  ํŒŒ์ผ

๐Ÿ“ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ(Relocatable object file)

  • ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ผ๋กœ ๋‹ค๋ฅธ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ๋“ค๊ณผ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.

๐Ÿ“ ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ(Executable object file)

  • ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๋ณต์‚ฌ๋  ์ˆ˜ ์žˆ๊ณ  ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.

๐Ÿ“ ๊ณต์œ  ๋ชฉ์ ํŒŒ์ผ(Shared object file)

  • ๋กœ๋“œํƒ€์ž„ ๋˜๋Š” ๋Ÿฐํƒ€์ž„์‹œ์— ๋™์ ์œผ๋กœ ๋งํฌ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ์œ ํ˜•์˜ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ์ด๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ์™€ ์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ์„, ๋ง์ปค๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

cf) ๋ชฉ์ ํŒŒ์ผ๋“ค์€ ํŠน์ • ๋ชฉ์ ํŒŒ์ผ ํ˜•์‹์— ๋”ฐ๋ผ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋“ค์€ ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

  • Unix - a.out / Windows - PE / Linux,Unix - ELF

๐Ÿ“‚ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ

์œ„์˜ ๊ทธ๋ฆผ์€ ์ „ํ˜•์ ์ธ ELF ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ์˜ ํฌ๋งท์„ ๋ณด์—ฌ์ค€๋‹ค
( ELF : ๋ฆฌ๋ˆ…์Šค๋‚˜ ์œ ๋‹‰์Šค ๊ณ„์—ด ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ ํŒŒ์ผ, ๋ชฉ์  ํŒŒ์ผ(.o), ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.so), ์ฝ”์–ด ๋คํ”„๋ฅผ ์ €์žฅํ•˜๋Š” ํ‘œ์ค€ ํŒŒ์ผ ํฌ๋งท )

์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ์€ ํฌ๊ฒŒ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

1๏ธโƒฃ ELF header

ํŒŒ์ผ ๋งจ ์•ž์— ์œ„์น˜ํ•˜๋ฉฐ, ๋ง์ปค๊ฐ€ ๋ชฉ์ ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„์„ ํ•˜๊ณ  ํ•ด์„ํ•˜๋„๋ก ํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

  • ๋ชฉ์  ํŒŒ์ผ ํƒ€์ž…(์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ/์‹คํ–‰ ๊ฐ€๋Šฅ/๊ณต์œ  ๊ฐ์ฒด)
  • CPU ์•„ํ‚คํ…์ฒ˜(x86-64 ๋“ฑ)
  • ์—”๋””์•ˆ(little/big)
  • ์„น์…˜ ํ—ค๋” ์œ„์น˜, ํ”„๋กœ๊ทธ๋žจ ํ—ค๋” ์œ„์น˜, ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ(์‹คํ–‰ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ) ๋“ฑ

2๏ธโƒฃ Section

๊ฐ ์„น์…˜์—๋Š” ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ์‹ฌ๋ณผ ์ •๋ณด, ์žฌ๋ฐฐ์น˜ ์ •๋ณด ๋“ฑ์ด ๋“ค์–ด๊ฐ„๋‹ค.

์„น์…˜ ์ด๋ฆ„๋‚ด์šฉ
.text์ปดํŒŒ์ผ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์ฝ”๋“œ(ํ•จ์ˆ˜ ๋ณธ๋ฌธ)
.rodata์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ (๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด, const ์ƒ์ˆ˜ ๋“ฑ)
.data์ดˆ๊ธฐํ™”๋œ ์ „์—ญยท์ •์  ๋ณ€์ˆ˜
.bss์ดˆ๊ธฐ๊ฐ’์ด ์—†๋Š” ์ „์—ญยท์ •์  ๋ณ€์ˆ˜ (ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋Š” ์—†์Œ, ํฌ๊ธฐ ์ •๋ณด๋งŒ)
.symtab์‹ฌ๋ณผ ํ…Œ์ด๋ธ” (ํ•จ์ˆ˜ยท๋ณ€์ˆ˜ยท์„น์…˜ ์ด๋ฆ„๊ณผ ์†์„ฑ, ์ฃผ์†Œ ๋“ฑ)
.rel.text / .rela.text.text ์„น์…˜ ๋‚ด ์žฌ๋ฐฐ์น˜ ์ •๋ณด (์™ธ๋ถ€ ์‹ฌ๋ณผ ์ฐธ์กฐ ์œ„์น˜, ์ˆ˜์ • ๋ฐฉ๋ฒ•)
.rel.data / .rela.data.data ์„น์…˜ ๋‚ด ์žฌ๋ฐฐ์น˜ ์ •๋ณด
.debug๋””๋ฒ„๊ทธ ์ •๋ณด(DWARF ๋“ฑ)
.line์†Œ์Šค ์ฝ”๋“œ ๋ผ์ธ ๋งคํ•‘ ์ •๋ณด
.strtab๋ฌธ์ž์—ด ํ…Œ์ด๋ธ”(์‹ฌ๋ณผ ์ด๋ฆ„ ์ €์žฅ)

3๏ธโƒฃ Section header table

ํŒŒ์ผ ๋๋ถ€๋ถ„์— ์œ„์น˜ํ•˜๋ฉฐ, ๋ชจ๋“  ์„น์…˜์˜ ์ด๋ฆ„, ํƒ€์ž…, ํฌ๊ธฐ, ํŒŒ์ผ ์˜คํ”„์…‹, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ์„น์…˜์ด๋‹ค.
๋ง์ปคยท๋””๋ฒ„๊ฑฐ๊ฐ€ ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ, ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ ์„น์…˜์„ ์ฐพ์•„๊ฐ„๋‹ค.

๐Ÿ“ฆ .data vs .bss ๋น„๊ต ์ •๋ฆฌ

๊ตฌ๋ถ„.data.bss
์šฉ๋„์ดˆ๊ธฐ๊ฐ’์ด ์žˆ๋Š” ์ „์—ญ/์ •์  ๋ณ€์ˆ˜ ์ €์žฅ์ดˆ๊ธฐ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ/์ •์  ๋ณ€์ˆ˜ ์ €์žฅ
ํŒŒ์ผ ํฌ๊ธฐ ๋ฐ˜์˜์‹ค์ œ ์ดˆ๊ธฐ๊ฐ’ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๋ฏ€๋กœ ํŒŒ์ผ ํฌ๊ธฐ์— ๋ฐ˜์˜๋จ๋ฐ์ดํ„ฐ ์—†์ด ํฌ๊ธฐ ์ •๋ณด๋งŒ ๊ธฐ๋ก๋˜๋ฏ€๋กœ ํŒŒ์ผ ํฌ๊ธฐ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ
์˜ˆ์‹œ ์ฝ”๋“œint count = 5;int total; (์ž๋™์œผ๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”)
๋ฉ”๋ชจ๋ฆฌ ๋กœ๋”ฉ ์‹œ ๋™์ž‘ํŒŒ์ผ์— ์ €์žฅ๋œ ์ดˆ๊ธฐ๊ฐ’์„ ๋กœ๋”ฉOS๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น ํ›„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • ๋ชฉ์ ํŒŒ์ผ ํฌ๋งท์€ ๊ณต๊ฐ„ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์ดˆ๊ธฐํ™”ํ•œ, ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
    • ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” ์‹ค์ œ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๐Ÿ’ฌ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ์˜ ํ•ต์‹ฌ์—๋Š” ์‹ฌ๋ณผ๊ณผ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค.
๊ฒฐ๊ตญ ์ด ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ๋ง์ปค๊ฐ€ ์‹ฌ๋ณผ์˜ ์ฐธ์กฐ์™€ ์ •์˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“œ ์‹ฌ๋ณผ๊ณผ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”(Symbol Table)

๊ฐ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์  ๋ชจ๋“ˆ(relocatable object module) m์€
m์—์„œ ์ •์˜๋˜๊ฑฐ๋‚˜ ์ฐธ์กฐ๋˜๋Š” ์‹ฌ๋ณผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์€ ์‹ฌ๋ณผ
ํ…Œ์ด๋ธ”
์„ ๊ฐ€์ง„๋‹ค.

๋ง์ปค ๊ด€์ ์—์„œ ์‹ฌ๋ณผ์€ 3๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰œ๋‹ค.


๐Ÿ”น 3๊ฐ€์ง€ ์‹ฌ๋ณผ ์ข…๋ฅ˜

  1. Global Symbols (์ •์˜๋œ ๊ธ€๋กœ๋ฒŒ ์‹ฌ๋ณผ)
    • ์ •์˜: ๋ชจ๋“ˆ m์—์„œ ์ •์˜๋˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋„ ์ฐธ์กฐ ๊ฐ€๋Šฅ
    • ๋Œ€์‘: nonstatic C ํ•จ์ˆ˜, ์ „์—ญ ๋ณ€์ˆ˜
      ๐Ÿ“ ์ฆ‰, ๋‚ด๊ฐ€ ๋งŒ๋“  ์‹ฌ๋ณผ์ด๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋„ ์“ธ ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ณผ
  2. External Symbols (์™ธ๋ถ€ ๊ธ€๋กœ๋ฒŒ ์‹ฌ๋ณผ)
    • ์ •์˜: ๋ชจ๋“ˆ m์—์„œ ์ฐธ์กฐํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ •์˜๋จ
    • ๋Œ€์‘: nonstatic C ํ•จ์ˆ˜, ์ „์—ญ ๋ณ€์ˆ˜ (๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์ •์˜)
      ๐Ÿ“ ์ฆ‰, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“ค์—ˆ๊ณ  ๋‚ด๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ณผ
  3. Local Symbols (๋กœ์ปฌ ์‹ฌ๋ณผ)
    • ์ •์˜: ๋ชจ๋“ˆ m์—์„œ๋งŒ ์ •์˜ ๋ฐ ์ฐธ์กฐ
    • ๋Œ€์‘: static ํ•จ์ˆ˜, static ์ „์—ญ ๋ณ€์ˆ˜
    • ํŠน์ง•: ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
      ๐Ÿ“ ์ฆ‰, ๋‚ด๊ฐ€ ๋งŒ๋“ค์—ˆ๊ณ  ๋‚˜๋งŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ณผ

โš ๏ธ ์ฃผ์˜: Local Symbol โ‰  ์ง€์—ญ ๋ณ€์ˆ˜

  • .symtab ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์—๋Š” ์ง€์—ญ(nonstatic) ๋ณ€์ˆ˜๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Œ
    (๋Ÿฐํƒ€์ž„์— ์Šคํƒ์— ํ• ๋‹น๋˜๋ฉฐ ๋ง์ปค์™€ ๋ฌด๊ด€)
  • static ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์˜ˆ์™ธ์ ์œผ๋กœ .data ๋˜๋Š” .bss์— ์ €์žฅ๋˜๊ณ ,
    ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์— ๊ณ ์œ ํ•œ ์ด๋ฆ„์œผ๋กœ ๊ธฐ๋ก๋จ

๐Ÿ›  ์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ (ELF .symtab)

ํ•„๋“œ์„ค๋ช…
name๋ฌธ์ž์—ด ํ…Œ์ด๋ธ”(.strtab) ๋‚ด ์ด๋ฆ„์˜ ์˜คํ”„์…‹ ๊ฐ’
value์‹ฌ๋ณผ์˜ ์ฃผ์†Œ
- ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ํŒŒ์ผ: ์„น์…˜ ์‹œ์ž‘์œผ๋กœ๋ถ€ํ„ฐ์˜ ์˜คํ”„์…‹
- ์‹คํ–‰ ํŒŒ์ผ: ์ ˆ๋Œ€ ๋Ÿฐํƒ€์ž„ ์ฃผ์†Œ
size๊ฐ์ฒด ํฌ๊ธฐ(๋ฐ”์ดํŠธ)
type๋ฐ์ดํ„ฐ(data) ๋˜๋Š” ํ•จ์ˆ˜(function)
binding๋กœ์ปฌ(local) ๋˜๋Š” ๊ธ€๋กœ๋ฒŒ(global)
section์‹ฌ๋ณผ์ด ์†ํ•œ ์„น์…˜์˜ ํ—ค๋” ์ธ๋ฑ์Šค
(ํŠน์ˆ˜ ๊ฐ’: ABS = ์ ˆ๋Œ€ ์ฃผ์†Œ, UNDEF = ์™ธ๋ถ€ ์ •์˜, COMMON = ๋ฏธํ• ๋‹น ์ „์—ญ ๋ณ€์ˆ˜)



๐Ÿ“Œ COMMON vs .bss

๊ตฌ๋ถ„์˜๋ฏธ
COMMON์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜
.bss์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ static ๋ณ€์ˆ˜, 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ์ „์—ญยท์ •์  ๋ณ€์ˆ˜

๐Ÿ’ก ์ •๋ฆฌ

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

์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ํŒŒ์ผ๋กœ ์™„์„ฑ๋˜๊ธฐ ์ „, ๋ง์ปค๊ฐ€ ๋‹ค๋ฃจ๋Š” โ€˜์žฌ๋ฃŒโ€™์™€ ๊ทธ โ€˜์žฌ๋ฃŒ์˜ ์ •๋ณดโ€™๋ฅผ ํ™•์ธํ•œ ์…ˆ์ด๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ด ์žฌ๋ฃŒ๋“ค์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๊ณ  ๋ฐฐ์น˜๋˜๋Š”์ง€์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ, ์‹ฌ๋ณผ ํ•ด์„(Symbol Resolution) ๊ณผ์ •์—์„œ ๋ง์ปค๊ฐ€ ์ฐธ์กฐ์™€ ์ •์˜๋ฅผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š”์ง€,
์žฌ๋ฐฐ์น˜(Relocation)๋ฅผ ํ†ตํ•ด ์ฃผ์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•˜๋Š”์ง€,
๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ์ด ์™„์„ฑ๋˜๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ด๋‹ค.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 8์›” 15์ผ

LGTM :)

1๊ฐœ์˜ ๋‹ต๊ธ€