Post

๐Ÿข chap4. ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

โญ 4.1 ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒI

โ“ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š” ์ด์œ ?

โ†’ C์–ธ์–ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜, ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ ํ•˜๋Š” ์ผ์€ ๊ฐœ๋ฐœ์ž๋งŒ์ด ๋‹ด๋‹นํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

โ˜‘๏ธ ํ”„๋กœ์„ธ์Šค = ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ

โ†’ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ (ํ˜ธ์ถœ)์ด ๋˜๋ฉฐ, ํŠน์ • ํ”„๋กœ์„ธ์Šค๋“ค์„ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ๋ฒˆํ˜ธ์ธ PID (ํ”„๋กœ์„ธ์Šค ์‹๋ณ„์ž)๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

โ†’ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์šด์˜์ฒด์ œ๋Š” ๋จผ์ € ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ๋‹ค์Œ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ˜‘๏ธ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ

โ†’ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์€ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋ถ„ํ•  ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ ๋ถ€๋ถ„์€ ์„ธ๊ทธ๋จผํŠธ๋ผ ํ•ฉ๋‹ˆ๋‹ค.

โ†’ ์„ธ๊ทธ๋จผํŠธ๋“ค์€ ์ •ํ•ด์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํŠน์ • ์ž๋ฃŒํ˜•์„ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ

    15.png

    • ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ์„ธ๊ทธ๋จผํŠธ = ์Šคํƒ ๊ณผ ํž™
    • ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ์„ธ๊ทธ๋จผํŠธ = BSS, DATA, TEXT
    • ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋Š” ์ด ์„ธ๊ทธ๋จผํŠธ์—์„œ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

โญ 4.2 ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์•Œ์•„๋ณด๊ธฐ

โ˜‘๏ธ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ vs ํ”„๋กœ์„ธ์Šค

ย ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผํ”„๋กœ์„ธ์Šค
ย ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ํฌํ•จํ•˜๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์ด๋ฉฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์— ์˜ํ•ด ์Šคํฐ(ํ”„๋กœ์„ธ์„œ๋ฅผ ํ˜ธ์ถœ)๋œ ๊ฒƒ
ย ย ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์†Œ๋น„ํ•˜๋ฉฐ, CPU๋Š” ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ช…๋ น์–ด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‹คํ–‰
์„ธ๊ทธ๋จผํŠธ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์— ํƒ‘์žฌ๋œ ์„ธ๊ทธ๋จผํŠธํ”„๋กœ์„ธ์Šค๊ฐ€ ๋กœ๋”ฉ๋˜๋Š” ๋™์•ˆ ๋งŒ๋“ค์–ด์ง€๋Š” ์„ธ๊ทธ๋จผํŠธ
ย BSS , DATA , TEXT์Šคํƒ , ํž™

โ˜‘๏ธ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ vs ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ

๋ ˆ์ด์•„์›ƒ ์ข…๋ฅ˜์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ
์„ธ๊ทธ๋จผํŠธ์„ธ๊ทธ๋จผํŠธ์˜ ์ง‘ํ•ฉ์„ธ๊ทธ๋จผํŠธ์˜ ์ง‘ํ•ฉ
ย BSS, DATA, TEXT์Šคํƒ , ํž™
๋ ˆ์ด์•„์›ƒ ์ƒ์„ฑ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์•„์›ƒ์—์„œ, ํ† ๋Œ€๊ฐ€ ๋˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์—์„œ ์ง์ ‘ ์ƒ์„ฑํ”„๋กœ์„ธ์Šค๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋™์ ์œผ๋กœ ์ƒ์„ฑ
๋ ˆ์ด์•„์›ƒ ๋‚ด์šฉ๋‚ด์šฉ์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์— ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.๋‚ด์šฉ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ช…๋ น์–ด์— ๋”ฐ๋ผ ์ž‘์„ฑ
ย ย ํ”„๋กœ๊ทธ๋žจ ๋ช…๋ น์–ด โ†’ ๋ณ€์ˆ˜์™€ ๋ฐฐ์—ด์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋กœ์ง์— ๋”ฐ๋ผ ๋ณ€์ˆ˜์™€ ๋ฐฐ์—ด์„ ์ˆ˜์ •
๋ ˆ์ด์•„์›ƒ ๋‚ด์šฉ์„ ์ถ”์ธก ๊ฐ€๋Šฅํ• ๊นŒ?์†Œ์Šค ์ฝ”๋“œ๋‚˜ ์ปดํŒŒ์ผ๋œ ๋ชฉ์  ํŒŒ์ผ๋งŒ ๋ด๋„ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์˜ ๋‚ด์šฉ์„ ์ถ”์ธก ๊ฐ€๋Šฅ๋‚ด์šฉ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ์ •๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์—†์Œ. ๊ฒŒ๋‹ค๊ฐ€ ๊ฐ™์€ ์‹คํ–‰ ํŒŒ์ผ์ด๋”๋ผ๋„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ง
ย ย ๋™์  ๋‚ด์šฉ์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผํ•จ

โญ 4.3 ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ๊ฒ€์‚ฌํ•˜๊ธฐ

โ˜‘๏ธ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ๊ฒ€์‚ฌํ•˜๊ธฐ

  1. gcc๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํŒŒ์ผํ•˜๊ธฐ
1
gcc ExtremeC_examples_chapter4_1.c -o ex4_1-linux.out
1
 โ†’ ex4_1-linux.out์ด๋ผ๋Š” ์‹คํ–‰๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ํ–ฅํ›„ ์ด ์‹คํ–‰ ํŒŒ์ผ์— ๊ธฐ๋ฐ˜ํ•ด ์Šคํฐ๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์— ์ด ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์ด ์กด์žฌํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
  1. size ๋ช…๋ น์–ด
  • ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์˜ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ์ถœ๋ ฅํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ์ œ 4-1 linux.out์˜ ์ •์  ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์‚ดํŽด๋ณด๋Š” ์‚ฌ์ด์ฆˆ ๋ช…๋ น์–ด์˜ ์‚ฌ์šฉ

    1
    
    size ex4_1-linux.out
    
    • ์˜ˆ์ œ 4-1์˜ linux.out์˜ ์ •์  ์„ธ๊ทธ๋จผํŠธ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
      int main(int argc, char** argv) {
        return 0;
      }
      
      /*********************************************************
      text    data     bss     dec     hex filename
      110       0       0     110      6e ex4_1-linux.out
      *********************************************************/
      -> ํ‘œ์‹œ๋œ ์ˆซ์ž๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
      

โ˜‘๏ธ BSS ์„ธ๊ทธ๋จผํŠธ

BSS๋ž€ โ†’ ์‹ฌ๋ฒŒ๋กœ ์‹œ์ž‘๋˜๋Š” ๋ธ”๋ก์ด๋ผ๋Š” ๋œป

๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ 0์œผ๋กœ ์„ค์ •ํ•œ ์ „์—ญ ๋ณ€์ˆ˜์— BSS ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ญ์‹œ์ ์œผ๋กœ๋Š” ์ด ์ด๋ฆ„์€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์›Œ๋“œ๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋œ ์˜์—ญ์„ ๋‚˜ํƒ€๋‚ด๊ณ ์ž ์‚ฌ์šฉ

  • ์˜ˆ์ œ 4-2 ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ 0์œผ๋กœ ์„ค์ •๋œ ์ „์—ญ ๋ณ€์ˆ˜ ๋ช‡ ๊ฐœ๋ฅผ ๊ฐ–๋Š” ํ”„๋กœ๊ทธ๋žจ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    int global_var1;
    int global_var2;
    int global_var3 = 0;
    
    int main(int argc, char** argv) {
      return 0;
    }
    
    /******************************************************
    text    data     bss     dec     hex filename
    110       0      12     122      7a ex4_2-linux.out
    ******************************************************/
    
    • ์ด๋•Œ golbal_var1, 2, 3๋Š” ์ดˆ๊ธฐํ™” ๋˜์ง€์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜

    • ์•„๋ž˜ ๋‚˜์™€์žˆ๋Š” ๊ฐ’์€ size ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉ

    1
    2
    3
    
    gcc ExtremeC_example.chapter4_2.c -o ex4_2-linux.out
    
    size ex4_2-linux.out
    
    • ์˜ˆ์ œ 4-1๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ BSS ์„ธ๊ทธ๋จผํŠธ์˜ ๊ฐ’์˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Œ โ†’ BSS๊ฐ’์ด 12๋ฐ”์ดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•œ ์ด์œ ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜ 3๊ฐœ๊ฐ€ ์ด 12๋ฐ”์ดํŠธ์ด ๋ฏ€๋กœ 12๋ฐ”์ดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์Œ โ†’ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ 0์œผ๋กœ ์„ค์ •ํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด BSS ์„ธ๊ทธ๋จผํŠธ์— ์ถ”๊ฐ€๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋“ค์€ ์ •์  ๋ ˆ์ด์•„์›ƒ์— ์†ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. โ†’ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ ๋ฏธ๋ฆฌ ํ• ๋‹น ๋˜๊ณ , ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ด์•„์žˆ๋Š” ํ•œ ์ ˆ๋Œ€๋กœ ํ• ๋‹น์ด ํ•ด์ œ๋˜์ง€ ์•Š์Œ

โ˜‘๏ธ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ

โ“๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

  • 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์–ด ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐํ™”๋œ ๊ฒƒ๊ณผ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    int global_var1;
    int global_var2;
    int global_var3 = 0;
    
    double global_var4 = 4.5;
    char global_var5 = 'A';
    
    int main(int argc, char** argv) {
      return 0;
    }
    
    /*******************************************************
    text    data     bss     dec     hex filename
    110       9      12     131      83 ex4_3-linux.out
    *******************************************************/
    
    • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์— ์ €์žฅ๋˜๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์•Œ์•„๋ณด๊ณ ์ž 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ ๋ณ€์ˆ˜ 2๊ฐœ๋ฅผ ์˜ˆ์ œ 4-2์— ์ถ”๊ฐ€ํ–ˆ์Œ
    1
    2
    3
    
    gcc ExtremeC_examples_chapter4_3.c -o ex4_3-linux.out
    
    size ex4_3-linux.out
    
    • ์˜ˆ์ œ 4-2์™€ ์˜ˆ์ œ 4-3์„ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ 9๋ฐ”์ดํŠธ๋กœ ์ฆ๊ฐ€ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ โ†’ 9๋ฐ”์ดํŠธ๋Š” ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ „์—ญ ๋ณ€์ˆ˜ 2๊ฐœ(double- 8๋ฐ”์ดํŠธ , char-1๋ฐ”์ดํŠธ) 8๋ฐ”์ดํŠธ์™€ 1๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

โ“size ๋ช…๋ น์–ด๋Š” ์„ธ๊ทธ๋จผํŠธ์˜ ํฌ๊ธฐ๋งŒ์„ ๋ณด์—ฌ์ค„ ๋ฟ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์Œ

  • ๋ชฉ์  ํŒŒ์ผ์— ์žˆ๋Š” ์„ธ๊ทธ๋จผํŠธ์˜ ๋‚ด์šฉ์„ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ex) in Linux _ ELF ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ณด๋Š” redelf์™€ objdump ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ชฉ์  ํŒŒ์ผ ๋‚ด๋ถ€์˜ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—๋Š” ์ „์—ญ ๋ณ€์ˆ˜ ์™ธ์—๋„ ์ •์  ๋ณ€์ˆ˜๋„ ์กด์žฌํ•˜๊ธฐ ํ•˜๊ณ , ์ •์  ๋ณ€์ˆ˜๋Š” ํ”Œ๋žซํผ ๋ฐ ์ดˆ๊ธฐํ™” ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ ๋˜๋Š” BSS ์„ธ๊ทธ๋จผํŠธ์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Œ

  • ์ดˆ๊ธฐํ™”๋œ ๊ฒƒ๊ณผ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ •์  ๋ณ€์ˆ˜ 2๊ฐœ ์„ ์–ธ

    1
    2
    3
    4
    
    void func (){       //์ •์  ๋ณ€์ˆ˜ j, i
    static int i;       //์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ i
    static int j = 1;   //์ดˆ๊ธฐํ™”๋œ j
    }
    
    • ๋Ÿฐํƒ€์ž„ ์‹œ์— func() ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์™€ BSS์„ธ๊ทธ๋จผํŠธ์— ์œ„์น˜ํ•œ ๋‘ ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
    • ์ •์  ๋ณ€์ˆ˜ i๋Š” ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ BSS์„ธ๊ทธ๋จผํŠธ์— ์กด์žฌํ•˜๊ณ , ์ •์  ๋ณ€์ˆ˜ J๋Š” ์ดˆ๊ธฐํ™” ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ๋‚ด์— ์กด์žฌ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์— ์ž‘์„ฑ๋œ ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ ๋ณ€์ˆ˜

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    int     x = 33;            // 0x00000021
    int     y = 0x12153467;
    char z[6] = "ABCDE";
    
    int main(int argc, char**argv) {
      return 0;
    }
    
    /********************************************************
    ex4_4.out:     file format elf64-x86-64
    
    Contents of section .data:
     4000 00000000 00000000 08400000 00000000  .........@......
     4010 21000000 67341512 41424344 4500      !...g4..ABCDE.
    *********************************************************/
    
    • BSS ์„ธ๊ทธ๋จผํŠธ์˜ ๋‚ด์šฉ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋‘๋ฒˆ์งธ ๋ช…๋ น์–ด๋Š” objdump์ž…๋‹ˆ๋‹ค.
    1
    2
    3
    
    gcc ExtremeC_examples_chapter4_4.c -o ex4_4.out
    
    objdump -s -j .data ex4_4.out
    
    • ์™ผ์ชฝ ์ฒซ ๋ฒˆ์งธ ์—ด์€ ์ฃผ์†Œ ์—ด์ž…๋‹ˆ๋‹ค.
    • ๋‹ค์Œ 4๊ฐœ์˜ ์—ด์€ ๋‚ด์šฉ์ด๋ฉฐ, ๊ฐ๊ฐ์€ 4๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.(ํ•œ ํ–‰์— 16)
    • ์˜ค๋ฅธ์ชฝ์— ๋ณด์ด๋Š” ๋งˆ์ง€๋ง‰ ์—ด์€ ์ค‘๊ฐ„ ์—ด์—์„œ ๋ณด์ด๋Š” ๋ฐ”์ดํŠธ์™€ ๊ฐ™์€ ํฌ๊ธฐ์˜ ์•„์Šคํ‚ค ํ‘œํ˜„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ค‘๊ฐ„๋งˆ๋‹ค ๋ณด์ด๋Š” ์ ์€ ์•ŒํŒŒ๋ฒณ์ด๋‚˜ ์ˆซ์ž๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
    • ์ฃผ์†Œ 0x004010์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์˜ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์—ด์€ ๋ณ€์ˆ˜ ์— ์ €์žฅ๋œ ๊ฐ’, ๋‘๋ฒˆ์งธ๋Š” y์— ์ €์žฅ๋œ ๊ฐ’, ์„ธ๋ฒˆ์งธ๋Š” z์— ์ €์žฅ๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค.
    • ๋ณ€์ˆ˜ x ๊ฐ’์ธ 33์€ 16์ง„์ˆ˜๋กœ 0x00000021์ด ์•„๋‹Œ 0x21000000์œผ๋กœ ํ‘œํ˜„๋˜์—ˆ๊ณ  ๋ณ€์ˆ˜ y์˜ ๊ฐ’์ธ 0x12153467์ด 0x67341512๋กœ ๋˜์–ด์žˆ๋Š”๊ฒƒ์ด ๋ณด์ž…๋‹ˆ๋‹ค. โ†’ ์ด๋Š” ์—”๋””์–ธ ๊ฐœ๋…์œผ๋กœ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ”์ดํŠธ์ธ 67์ด ๋จผ์ € ์˜ค๋ฏ€๋กœ 0x67341412๋กœ ํ‘œํ˜„์ด ๋ฉ๋‹ˆ๋‹ค. โ†’ ์—”๋””์–ธ์€ cpu์˜ ์†์„ฑ์ด๋ฉฐ, cpu๊ฐ€ ๋‹ค๋ฅด๋ฉด ์ตœ์ข… ๋ชฉ์  ํŒŒ์ผ์—์„œ ๋ฐ”์ดํŠธ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋‹ค๋ฅธ ์—”๋””์–ธ์ด ์žˆ๋Š” ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์„ ์‹คํ–‰ ํ•  ์ˆ˜ ์—†์Œ
    • objdump์—์„œ -s ์˜ต์…˜์€ ์„น์…˜์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • objdump์—์„œ -j .data์˜ต์…˜์€ .data ์„น์…˜์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

โ˜‘๏ธ ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ ๋˜๋Š” ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ

  • ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ ๋˜๋Š” ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ๊ธฐ๊ณ„ ์ˆ˜์ค€ ๋ช…๋ น์–ด๋ฅผ ํฌํ•จ

  • ์ด๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์— ์œ„์น˜ํ•ด์•ผ ํ•˜๊ณ  ๋ช…๋ น์–ด๋ฅผ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๊ฐ€์ ธ์™€์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•จ๊ป˜ ์‹คํ–‰

  • ์˜ˆ์ œ 4-5 ์‹ค์ œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์˜ ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ ํ™•์ธ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    
    int main(int agrc, char** argv) {
      return 0;
    }
    
    /*******************************************************************
    ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์„ ๋คํ”„ํ•˜๊ธฐ ์œ„ํ•ด objdump๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ 
    ํ•˜๋‹จ์˜ ๊ฒฐ๊ณผ๋Š” ์‹คํ•ด ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์— ์กด์žฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ์„น์…˜์˜ ๋‚ด์šฉ์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ์˜ˆ์‹œ๋กœ ๋‚˜์™”์Œ
    
    ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์€ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ mainํ•จ์ˆ˜๋งŒ ๋‚˜ํƒ€๋‚ด์—ˆ์Šต๋‹ˆ๋‹ค.
    
    ex4_5.out:     file format elf64-x86-64
    
    Disassembly of section .init:
    
    0000000000001000 <_init>:
        1000:       f3 0f 1e fa             endbr64
        1004:       48 83 ec 08             sub    $0x8,%rsp
        1008:       48 8b 05 d9 2f 00 00    mov    0x2fd9(%rip),%rax        # 3fe8 <__gmon_start__@Base>
        100f:       48 85 c0                test   %rax,%rax
        1012:       74 02                   je     1016 <_init+0x16>
        1014:       ff d0                   call   *%rax
        1016:       48 83 c4 08             add    $0x8,%rsp
        101a:       c3                      ret
    
    Disassembly of section .plt:
    
    0000000000001020 <.plt>:
        1020:       ff 35 a2 2f 00 00       push   0x2fa2(%rip)        # 3fc8 <_GLOBAL_OFFSET_TABLE_+0x8>
        1026:       f2 ff 25 a3 2f 00 00    bnd jmp *0x2fa3(%rip)        # 3fd0 <_GLOBAL_OFFSET_TABLE_+0x10>
        102d:       0f 1f 00                nopl   (%rax)
    
    Disassembly of section .plt.got:
    
    0000000000001030 <__cxa_finalize@plt>:
        1030:       f3 0f 1e fa             endbr64
        1034:       f2 ff 25 bd 2f 00 00    bnd jmp *0x2fbd(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
        103b:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
    
    Disassembly of section .text:
    
    0000000000001040 <_start>:
        1040:       f3 0f 1e fa             endbr64
        1044:       31 ed                   xor    %ebp,%ebp
        1046:       49 89 d1                mov    %rdx,%r9
        1049:       5e                      pop    %rsi
        104a:       48 89 e2                mov    %rsp,%rdx
        104d:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
        1051:       50                      push   %rax
        1052:       54                      push   %rsp
        1053:       45 31 c0                xor    %r8d,%r8d
        1056:       31 c9                   xor    %ecx,%ecx
        1058:       48 8d 3d ca 00 00 00    lea    0xca(%rip),%rdi        # 1129 <main>
        105f:       ff 15 73 2f 00 00       call   *0x2f73(%rip)        # 3fd8 <__libc_start_main@GLIBC_2.34>
        1065:       f4                      hlt
        1066:       66 2e 0f 1f 84 00 00    cs nopw 0x0(%rax,%rax,1)
        106d:       00 00 00
    
    0000000000001070 <deregister_tm_clones>:
        1070:       48 8d 3d 99 2f 00 00    lea    0x2f99(%rip),%rdi        # 4010 <__TMC_END__>
        1077:       48 8d 05 92 2f 00 00    lea    0x2f92(%rip),%rax        # 4010 <__TMC_END__>
        107e:       48 39 f8                cmp    %rdi,%rax
        1081:       74 15                   je     1098 <deregister_tm_clones+0x28>
        1083:       48 8b 05 56 2f 00 00    mov    0x2f56(%rip),%rax        # 3fe0 <_ITM_deregisterTMCloneTable@Base>
        108a:       48 85 c0                test   %rax,%rax
        108d:       74 09                   je     1098 <deregister_tm_clones+0x28>
        108f:       ff e0                   jmp    *%rax
        1091:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
        1098:       c3                      ret
        1099:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    
    00000000000010a0 <register_tm_clones>:
        10a0:       48 8d 3d 69 2f 00 00    lea    0x2f69(%rip),%rdi        # 4010 <__TMC_END__>
        10a7:       48 8d 35 62 2f 00 00    lea    0x2f62(%rip),%rsi        # 4010 <__TMC_END__>
        10ae:       48 29 fe                sub    %rdi,%rsi
        10b1:       48 89 f0                mov    %rsi,%rax
        10b4:       48 c1 ee 3f             shr    $0x3f,%rsi
        10b8:       48 c1 f8 03             sar    $0x3,%rax
        10bc:       48 01 c6                add    %rax,%rsi
        10bf:       48 d1 fe                sar    %rsi
        10c2:       74 14                   je     10d8 <register_tm_clones+0x38>
        10c4:       48 8b 05 25 2f 00 00    mov    0x2f25(%rip),%rax        # 3ff0 <_ITM_registerTMCloneTable@Base>
        10cb:       48 85 c0                test   %rax,%rax
        10ce:       74 08                   je     10d8 <register_tm_clones+0x38>
        10d0:       ff e0                   jmp    *%rax
        10d2:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
        10d8:       c3                      ret
        10d9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    
    00000000000010e0 <__do_global_dtors_aux>:
        10e0:       f3 0f 1e fa             endbr64
        10e4:       80 3d 25 2f 00 00 00    cmpb   $0x0,0x2f25(%rip)        # 4010 <__TMC_END__>
        10eb:       75 2b                   jne    1118 <__do_global_dtors_aux+0x38>
        10ed:       55                      push   %rbp
        10ee:       48 83 3d 02 2f 00 00    cmpq   $0x0,0x2f02(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
        10f5:       00
        10f6:       48 89 e5                mov    %rsp,%rbp
        10f9:       74 0c                   je     1107 <__do_global_dtors_aux+0x27>
        10fb:       48 8b 3d 06 2f 00 00    mov    0x2f06(%rip),%rdi        # 4008 <__dso_handle>
        1102:       e8 29 ff ff ff          call   1030 <__cxa_finalize@plt>
        1107:       e8 64 ff ff ff          call   1070 <deregister_tm_clones>
        110c:       c6 05 fd 2e 00 00 01    movb   $0x1,0x2efd(%rip)        # 4010 <__TMC_END__>
        1113:       5d                      pop    %rbp
        1114:       c3                      ret
        1115:       0f 1f 00                nopl   (%rax)
        1118:       c3                      ret
        1119:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    
    0000000000001120 <frame_dummy>:
        1120:       f3 0f 1e fa             endbr64
        1124:       e9 77 ff ff ff          jmp    10a0 <register_tm_clones>
    
    0000000000001129 <main>:
        1129:       f3 0f 1e fa             endbr64
        112d:       55                      push   %rbp
        112e:       48 89 e5                mov    %rsp,%rbp
        1131:       89 7d fc                mov    %edi,-0x4(%rbp)
        1134:       48 89 75 f0             mov    %rsi,-0x10(%rbp)
        1138:       b8 00 00 00 00          mov    $0x0,%eax
        113d:       5d                      pop    %rbp
        113e:       c3                      ret
    
    Disassembly of section .fini:
    
    0000000000001140 <_fini>:
        1140:       f3 0f 1e fa             endbr64
        1144:       48 83 ec 08             sub    $0x8,%rsp
        1148:       48 83 c4 08             add    $0x8,%rsp
        114c:       c3
    
    ***********************************************************************/
    
    1
    2
    3
    
    gcc ExtremeC_example.chapter4_5.c -o ex4_5.out
    
    objdump -S ex4_5.out
    
    • .text , .init, .plt์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์„น์…˜์€ ๋ชจ๋‘ ํ”„๋กœ๊ทธ๋žจ์ด ๋กœ๋“œ ๋ฐ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ
    • ์ด๋Š” ๋ชจ๋‘ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ ๋‚ด๋ถ€์— ์žˆ๋Š” ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋™์ผํ•œ ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ์— ์†ํ•จ
    • main ํ•จ์ˆ˜๊ฐ€ cํ”„๋กœ๊ทธ๋žจ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์  ๊ทธ๋ฆฌ๊ณ  main ํ•จ์ˆ˜ ์ „ํ›„๋กœ ์‹คํ–‰๋˜๋Š” ๋กœ์ง๋„ ์žˆ์Œ
    • ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ๋ณดํ†ต ๋ฆฌ๋ˆ…์Šค์—์„  glibc๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋นŒ๋ ค ์˜ค๋ฉฐ, ๋ง์ปค๊ฐ€ ์ด๋“ค์„ ๋ชจ๋‘ ํ•ฉ์ณ์„œ ์ตœ์ข… ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์„ ํ˜•์„ฑ

โญ 4.4 ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ๊ฒ€์‚ฌํ•˜๊ธฐ

โœ… ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ

  • ํ”„๋กœ์„ธ์Šค์˜ ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌruntime memory, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์กด์žฌ

  • ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์—๋Š” 5๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์กด์žฌ

    • ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์— ์žˆ๋Š” ์ •์  ๋ ˆ์ด์•„์›ƒ์—์„œ ์ง์ ‘ ๋ณต์ œ๋œ ์„ธ๊ทธ๋จผํŠธ 3๊ฐœ
    • ์Šคํƒ๊ณผ ํž™ ์„ธ๊ทธ๋จผํŠธ 2๊ฐœ: ๋™์  ์„ธ๊ทธ๋จผํŠธ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ๋งŒ ์กด์žฌ
      • ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ: ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ, ํฌ๊ธฐ ์ œํ•œ, ํฐ ๊ฐ์ฒดx
      • ํž™ ์„ธ๊ทธ๋จผํŠธ: ์กฐ์ • ๊ฐ€๋Šฅํ•œ ํฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ, ํฐ ๊ฐ์ฒด๋‚˜ ๋ณ€์ˆ˜, ๊ณ ์œ  API ํ•„์š”
  • 5๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๋Š” ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์†ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐธ์กฐ

    โ†’ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์— ์ด๋ฏธ ํ• ๋‹น๋œallocated, ์ „์šฉdedicated and private ๋ฉ”๋ชจ๋ฆฌ

  • ๋Ÿฐํƒ€์ž„ ์‹œ ๋‚ด์šฉ์ด ํ•ญ์ƒ ๋ณ€ํ•˜๋ฏ€๋กœ ๋™์ , ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ๋™์•ˆ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๊ณ„์† ์ˆ˜์ •๋จ

4.4.1 ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘

  • ์˜ˆ์ œ 4-6

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    #include <unistd.h> // ์œˆ๋„์šฐ์ฒ˜๋Ÿผ POSIX ๊ทœ๊ฒฉ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” windows.h๋ฅผ ๋Œ€์‹  ํฌํ•จํ•ด์•ผ ํ•จ
    
    int main(int argc, char** argv) {
      // Infinite loop
      while (1) {
        sleep(1); // Sleep 1 second
      };
      return 0;
    }
    

    ๋ฌดํ•œํžˆ ์‹คํ–‰๋˜๋Š” ์˜ˆ์ œ๋กœ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๊ณ„์† ๋Œ์•„๊ฐ€๋Š” ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฒ€์‚ฌ ๊ฐ€๋Šฅ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    //1.์˜ˆ์ œ 4-6 ์ปดํŒŒ์ผํ•˜๊ธฐ
    gcc ExtremeC_examples_chapter4_6.c -o ex4_6.out
    
    //2.๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์˜ˆ์ œ 4-6 ์‹คํ–‰ํ•˜๊ธฐ
    ./ex4_6.out &
    
    //kill ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒํ•˜๊ธฐ
    kill -9 402
    
    //3.procfs๋กœ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ํ™•์ธํ•˜๊ธฐ
    ls -l /proc/402
    
    //4.maps์˜ ๋‚ด์šฉ์„ ๋คํ”„ํ•˜๊ธฐ
    cat /proc/402/maps
    
    • ์ฃผ์†Œ ๋ฒ”์œ„address range
    • ํ—ˆ๊ฐ€permission
    • ์˜คํ”„์…‹offset
    • ์žฅ์น˜device
    • ์•„์ด๋…ธ๋“œinode
    • ๊ฒฝ๋กœ๋ช… ๋ฐ ์„ค๋ช…pathname or description

4.4.2 ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ

โœ… ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ

  • ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋˜๋Š” ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ญ
  • ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘์—์„œ [stack]์ด๋ผ๊ณ  ์ ํžŒ ๋ถ€๋ถ„
  • ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด gdb์™€ ๊ฐ™์€ ๋””๋ฒ„๊ฑฐ ํ•„์š”

โœ… ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ

  • ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ์— ์˜ํ•ด ์ข…๋ฃŒ๋จ
  • ํ•จ์ˆ˜์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ ์‚ฌ์šฉ, ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ฒซ๋ฒˆ์งธ ์žฅ์†Œ
  • ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์˜ ๊ฐ€์žฅ ์œ—๋ถ€๋ถ„์— ํ• ๋‹นํ•œ ์—”ํŠธ๋ฆฌ๋Š” ๊ทธ ์œ„์˜ ์—”ํŠธ๋ฆฌ๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์œผ๋ฉด ๊บผ๋‚ผ ์ˆ˜ ์—†์Œ
  • ์Šคํƒ์˜ ํฌ๊ธฐ๋Š” ์ œํ•œ์ โ†’์ž‘์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ํŽธ์ด ๊ฐ€์žฅ ์ข‹์Œ, ๋ฌดํ•œํ•œ ์žฌ๊ท€๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ง€์–‘
  • ์‹ ์ค‘ํ•˜๊ฒŒ ์ž‘์—…โ†’์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐฉํ•ด๋ฐ›๊ฑฐ๋‚˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•จ
  • ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ๋ถ€๋ถ„์€ ์ „์šฉ ๋ฐ์ดํ„ฐprivate data๋ฅผ ํฌํ•จํ•˜๋ฉฐ ๋ฏผ๊ฐํ•  ์ˆ˜ ์žˆ์Œ
  • ์Šคํƒ์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค ์ „์šฉโ†’๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ • ๋ถˆ๊ฐ€

4.4.3 ํž™ ์„ธ๊ทธ๋จผํŠธ

  • ์˜ˆ์ œ 4-7

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    #include <unistd.h> // Needed for sleep function
    #include <stdlib.h> // Needed for malloc function
    #include <stdio.h> // Needed for printf
    
    int main(int argc, char** argv) {
      void* ptr = malloc(1024); // ํž™์—์„œ 1KB ํ• ๋‹นํ•˜๊ธฐ
      printf("Address: %p\n", ptr);
      fflush(stdout); // ๊ฐ•์ œ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ
      // Infinite loop
      while (1) {
        sleep(1); // Sleep 1 second
      };
      return 0;
    }
    

    ๋ฌดํ•œ ๋ฃจํ”„์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ํž™ ์„ธ๊ทธ๋จผํŠธ์—์„œ ๋‹ค์ˆ˜์˜ ๋ฐ”์ดํŠธ๋ฅผ ํ• ๋‹น

    1
    2
    3
    4
    5
    6
    
    //1.์˜ˆ์ œ 4-7์„ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ
    g++ ExtremeC_examples_chapter4_7.c -o ex4_7.out
    ./ex4_7.out &
    
    //2.maps์˜ ๋‚ด์šฉ์„ ๋คํ”„ํ•˜๊ธฐ
    cat /proc/3451/maps
    

    malloc ์‚ฌ์šฉโ†’์ƒˆ๋กœ์šด ๋งคํ•‘ [heap]์ด ์ถ”๊ฐ€, 0x21000๋ฐ”์ดํŠธ ํ• ๋‹น๋จ ํž™ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

  • ์˜ˆ์ œ 4-8

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    #include <stdio.h>   // For printf function
    #include <stdlib.h>  // For malloc and free function
    
    void fill(char* ptr) {
      ptr[0] = 'H';
      ptr[1] = 'e';
      ptr[2] = 'l';
      ptr[3] = 'l';
      ptr[5] = 0;
    }
    
    int main(int argc, char** argv) {
      void* gptr = malloc(10 * sizeof(char));
      char* ptr = (char*)gptr;
      fill(ptr);
      printf("%s!\n", ptr);
      free(ptr);
      return 0;
    }
    

    gptr๊ณผ ptr์€ ์ง€์—ญ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜โ†’์Šคํƒ์— ํ• ๋‹น ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œโ†’ํž™ ์„ธ๊ทธ๋จผํŠธ ๋‚ด๋ถ€ fill ํ•จ์ˆ˜ ๋‚ด ptrํฌ์ธํ„ฐ์™€ main ํ•จ์ˆ˜ ๋‚ด ptrํฌ์ธํ„ฐ๋Š” ๋‹ค๋ฅธ ๊ฒƒ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นโ†’๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜memory leak ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ฆ๊ฐ€โ†’ํ—ˆ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋ชจ๋‘ ์‚ฌ์šฉโ†’ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ freeํ•จ์ˆ˜ ํ˜ธ์ถœโ†’ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ํ•ด์ œ

โญ 4.5 ๋งˆ๋ฌด๋ฆฌ

โœ… ๋ฉ”๋ชจ๋ฆฌ

  • ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค์˜ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์˜ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ๋Š” ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • size์™€ objdump ๋ช…๋ น์–ด๋กœ ๋ชฉ์  ํŒŒ์ผ์˜ ๋‚ด๋ถ€๋ฅผ ๊ฒ€์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๋ชฉ์  ํŒŒ์ผ์˜ ๋‚ด๋ถ€์—์„œ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด readelf ๊ฐ™์€ ๋ชฉ์  ํŒŒ์ผ ๋คํผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ

  • ํ”„๋กœ์„ธ์Šค์˜ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๊ฒ€์‚ฌ ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์„ธ๊ทธ๋จผํŠธ๋Š” ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์—์„œ ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณต์ œ๋จ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

    ํ•˜์ง€๋งŒ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์—๋Š” ์ƒˆ๋กœ์šด ์„ธ๊ทธ๋จผํŠธ๊ฐ€ 2๊ฐ€์ง€ ์Šคํƒ๊ณผ ํž™ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ๋Š” ํ• ๋‹น์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋ผ๊ณ  ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์–ธ์ œ๋‚˜ ์Šคํƒ ์˜์—ญ์˜ ๋งจ ์œ„์— ํ• ๋‹น๋œ๋‹ค๊ณ  ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ ๋‚ด์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋น„๋ฐ€๊ณผ ๊ทธ ์ž‘๋™ ๋ฐฉ์‹์„ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.
  • ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ• ๋‹น ๋ฐ ํ•ด์ œํ•˜๋ ค๋ฉด ํŠน์ • API ๋˜๋Š” ํ•จ์ˆ˜ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ์ด API๋Š” C์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์„ค๋ช…ํ–ˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ญ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”์ง€๋„ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.