๐ข chap4. ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
โญ 4.1 ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์I
โํ๋ก์ธ์ค ๋ด๋ถ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ์ด์ผ ํ๋ ์ด์ ?
โ C์ธ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ ์๋์ผ๋ก ๊ด๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋นํ๊ฑฐ๋, ๋ ์ด์ ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์ผ์ ๊ฐ๋ฐ์๋ง์ด ๋ด๋นํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
โ๏ธ ํ๋ก์ธ์ค = ์คํ์ค์ธ ํ๋ก๊ทธ๋จ
โ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ (ํธ์ถ)์ด ๋๋ฉฐ, ํน์ ํ๋ก์ธ์ค๋ค์ ๊ตฌ๋ณํ๊ธฐ ์ํ ๊ณ ์ ๋ฒํธ์ธ PID (ํ๋ก์ธ์ค ์๋ณ์)๋ฅผ ๊ฐ์ง๋๋ค.
โ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ๋ ์ด์์ฒด์ ๋ ๋จผ์ ํ๋ก์ธ์ค๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋ค์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ ์ฉํฉ๋๋ค.
โ๏ธ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์
โ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋ถํ ๋ฉ๋๋ค. ์ด๋ ๊ฐ ๋ถ๋ถ์ ์ธ๊ทธ๋จผํธ๋ผ ํฉ๋๋ค.
โ ์ธ๊ทธ๋จผํธ๋ค์ ์ ํด์ง ์์ ์ ์ํํ๋ฉฐ ํน์ ์๋ฃํ์ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ๊ตฌ์กฐ
- ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ์ธ๊ทธ๋จผํธ = ์คํ ๊ณผ ํ
- ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ์ธ๊ทธ๋จผํธ = BSS, DATA, TEXT
- ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ ์ด ์ธ๊ทธ๋จผํธ์์ ์ผ์ด๋ฉ๋๋ค.
โญ 4.2 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์์๋ณด๊ธฐ
โ๏ธ ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ vs ํ๋ก์ธ์ค
ย | ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ | ํ๋ก์ธ์ค |
---|---|---|
ย | ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ํฌํจํ๋ฉฐ ์ปดํ์ผ๋ฌ์ ์ํด ์์ฑ | ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ด๋ฉฐ ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์ ์ํด ์คํฐ(ํ๋ก์ธ์๋ฅผ ํธ์ถ)๋ ๊ฒ |
ย | ย | ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๋นํ๋ฉฐ, CPU๋ ๊ณ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ ธ์์ ์คํ |
์ธ๊ทธ๋จผํธ | ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์ ํ์ฌ๋ ์ธ๊ทธ๋จผํธ | ํ๋ก์ธ์ค๊ฐ ๋ก๋ฉ๋๋ ๋์ ๋ง๋ค์ด์ง๋ ์ธ๊ทธ๋จผํธ |
ย | BSS , DATA , TEXT | ์คํ , ํ |
โ๏ธ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ vs ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์
๋ ์ด์์ ์ข ๋ฅ | ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ | ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ |
---|---|---|
์ธ๊ทธ๋จผํธ | ์ธ๊ทธ๋จผํธ์ ์งํฉ | ์ธ๊ทธ๋จผํธ์ ์งํฉ |
ย | BSS, DATA, TEXT | ์คํ , ํ |
๋ ์ด์์ ์์ฑ | ์คํ ์ค์ธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์์์์, ํ ๋๊ฐ ๋๋ ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์์ ์ง์ ์์ฑ | ํ๋ก์ธ์ค๊ฐ ๋ก๋ฉ๋ ๋, ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ๋์ ์ผ๋ก ์์ฑ |
๋ ์ด์์ ๋ด์ฉ | ๋ด์ฉ์ ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์ ๋ฏธ๋ฆฌ ์์ฑํฉ๋๋ค. | ๋ด์ฉ์ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ฐ๋ผ ์์ฑ |
ย | ย | ํ๋ก๊ทธ๋จ ๋ช ๋ น์ด โ ๋ณ์์ ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ๋ก์ง์ ๋ฐ๋ผ ๋ณ์์ ๋ฐฐ์ด์ ์์ |
๋ ์ด์์ ๋ด์ฉ์ ์ถ์ธก ๊ฐ๋ฅํ ๊น? | ์์ค ์ฝ๋๋ ์ปดํ์ผ๋ ๋ชฉ์ ํ์ผ๋ง ๋ด๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ๋ด์ฉ์ ์ถ์ธก ๊ฐ๋ฅ | ๋ด์ฉ์ ํ๋ก๊ทธ๋จ์ ์คํํ์ง ์์ผ๋ฉด ๊ฒฐ์ ๋์ง ์์ผ๋ฏ๋ก ์ฝ๊ฒ ์ ์ ์์. ๊ฒ๋ค๊ฐ ๊ฐ์ ์คํ ํ์ผ์ด๋๋ผ๋ ์คํํ ๋๋ง๋ค ๋ด์ฉ์ด ๋ฌ๋ผ์ง |
ย | ย | ๋์ ๋ด์ฉ์ ํด๋น ํ๋ก์ธ์ค๋ง๋ค ๋ค๋ฅด๋ฏ๋ก ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ ๋์ ๊ฒ์ฌ๊ฐ ์ด๋ฃจ์ด์ ธ์ผํจ |
โญ 4.3 ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ๊ฒ์ฌํ๊ธฐ
โ๏ธ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ๊ฒ์ฌํ๊ธฐ
- gcc๋ฅผ ์ฌ์ฉํด ์ปดํ์ผํ๊ธฐ
1
gcc ExtremeC_examples_chapter4_1.c -o ex4_1-linux.out
1
โ ex4_1-linux.out์ด๋ผ๋ ์คํ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค. ํฅํ ์ด ์คํ ํ์ผ์ ๊ธฐ๋ฐํด ์คํฐ๋๋ ๋ชจ๋ ํ๋ก์ธ์ค์ ์ด ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ด ์กด์ฌํ ๊ฒ ์
๋๋ค.
- 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์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ค๋ช ํ์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ํ ๋ฉ๋ชจ๋ฆฌ ์ง์ญ์์ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง๋ ์์๋ดค์ต๋๋ค.