GCC C / C++ ์ธ์ด๋ฅผ ์ปดํ์ผ ํด ์ฃผ๋ ๋๊ตฌ์ด๋ค. ๋ฆฌ๋
์ค์์๋ apt ๋ช
๋ น์ผ๋ก ์ค์น ๊ฐ๋ฅํ๋ฉฐ, ์๋์ฐ์์๋ Mingw์ ์ด์ฉํ์ฌ ์ค์น ๊ฐ๋ฅํ๋ค. gcc๋ ์ปดํ์ผ๋ฌ๋ฅผ ํฌํจํ ํจํค์ง์ผ ๋ฟ, ๋ด๋ถ์ ์ธ ์ปดํ์ผ๋ฌ๋ ๋ฐ๋ก ์๋ค. (cc1 ๋ฑ)
GCC ์ปดํ์ผ ๋์ ์์ gcc main.c ํ์ผ์ ๋์์ํค๋ฉด main.cํ์ผ์ ์ปดํ์ผํ์ฌ ์คํํ์ผ์ธ a.out ํ์ผ์ ์์ฑํ๊ฒ ๋๋ค.
ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
์ ์ฒ๋ฆฌ : c์ธ์ด๋ก ๊ตฌํ๋ .c ํ์ผ์ ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ .i ํ์ผ๋ก ๋ณํํ๋ค.
gcc -E main.c -o a.i : main.c ํ์ผ์ a.i ํ์ผ๋ก ์ ์ฒ๋ฆฌ ์ปดํ์ผ : ์ ์ฒ๋ฆฌ๋ .i ํ์ผ์ ์ด์
๋ธ๋ฆฌ์ด๋ก ๋ณํ
gcc -S a.i -o a.s : a.i ํ์ผ์ a.s ์ด์
๋ธ๋ฆฌ์ด๋ก ์ด์
๋ธ ์ด์
๋ธ: ๊ฐ ๋ฒค๋๋ค์ด ๋ง๋ ์ด์
๋ธ๋ฆฌ์ด๋ฅผ ๋ชฉ์ ํ์ผ๋ก ๋ณํ(์ด์
๋ธ๋ฆฌ ์ธ์ด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํ) gcc -c a.s -o a.o : ์ด์
๋ธ๋ฆฌ ํ์ผ์ ๋ชฉ์ ํ์ผ EOL(Executable Linux File)๋ก ๋ณํ. ํ์ง๋ง ๋ฐ๋ก ์คํํ ์๋ ์๋ค. file a.o ๋ช
๋ น์ด๋ฅผ ์
๋ ฅ ํด ๋ณด๋ฉด โLSB relocatableโ ์ด๋ผ๊ณ ํ์๋๋ค. ์ฆ, ์ฌ๋ฐฐ์น ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ๋ก, ์คํ ํ ์ ์๋ ์ํ๋ ์๋๋ผ๋ ๋ป์ด๋ค. ๋งํน: ๋ชฉ์ ํ์ผ์์ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๋ชฉ์ ํ์ผ๋ค์ linkingํ์ฌ ์ต์ข
์คํํ์ผ์ ์์ฑํ๋ค.
gcc a.o -o out : a.o ๋ชฉ์ ํ์ผ๋ก ์คํ ๊ฐ๋ฅํ ํ์ผ์ ์์ฑํ๋ค. file out ๋ช
๋ น์ด๋ฅผ ์
๋ ฅ ํด ๋ณด๋ฉด โLBS executableโ ๋ผ๊ณ ์ถ๋ ฅ๋๋ค. gcc -v --save-temps -o out : ์ ์ ์ฒด ๊ณผ์ ์ ์คํํ๋ฉฐ ์ค๊ฐ ์์ฑ๋ฌผ์ ๋จ๊ธฐ๊ณ , ์คํ ๊ฒฐ๊ณผ๋ ์ถ๋ ฅ ๋ฆฌ๋
์ค์์ ldd ๋ช
๋ น์ผ๋ก ๋งํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ํ์ธํ ์ ์๋ค. ASLR์ ์ง์ํ๋ ์ปค๋์ ๊ฒฝ์ฐ, -no-pie ์ต์
์ ๋ฃ์ผ๋ฉด PIE( position independent executable) ์์ญ์ ์์ฑํ์ง ์์ ASLR ๊ธฐ๋ฅ์ ๋ ์ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํค๋ํ์ผ์์ include๋ฅผ ํ์ฌ ์ฌ์ฉํ ์ ์๋ ๋ชฉ์ ํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์นญํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งํน์ ํตํด ํ๋ก๊ทธ๋จ์ ํฌํจ๋๋ฉฐ, ๋งํน ๋ฐฉ์์ ๋ฐ๋ผ โ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌโ์ โ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌโ๋ก ๋ถ๋ฅ๋๋ค. ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์ ๋งํน์ ์ํด ์์ฑ๋๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฝ๋์ object ํ์ผ์ด ์์ฒด์ ํฌํจ๋๋ ํํ์ด๋ค. ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๋ณ๊ฒฝ์ ํ์ผ์ด ๋งค๋ฒ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๋จ์ ์ด ์๋ค. gcc -static ์ ๊ฐ์ด static ์ต์
์ ๋ฃ์ด ์ค์ ๊ฐ๋ฅํ๋ค. ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋์ ๋งํน์ ์ํด ์์ฑ๋๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ object ํ์ผ์ด ๋ณ๋๋ก ์กด์ฌํ๊ณ , ๋ง์ปค๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ์ฃผ์๋ฅผ ์ฌ์ฉ์์ ์ฝ๋์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ํํ์ด๋ค. ๋น๋์ ๋ณ๋ ์ต์
์ ๋ฃ์ง ์์ผ๋ฉด dynamic linking ์ผ๋ก ๋์ํ๋ค. ๋์ ํ ๋น์ ์ํํ๋ฉด ๊ฐ ํ๋ก์ธ์ค๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ํจ์๋ฅผ PLT(Procedure Linkage Table) ์ GOT(Global Offsets Table)๋ฅผ ํตํด ์ ๊ทผํ๊ฒ ๋๋ค. C์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ lib ์ผ๋ก ์์ํ๋ ๊ท์น์ ์ง๋๋ฉฐ .a ํ์ฅ์๋ฅผ ๊ฐ์ง๋ค gcc -c CFILE.c -o OBJ.o ๋ช
๋ น์ผ๋ก OBJ.o ๋ชฉ์ ํ์ผ์ ์์ฑํ๋ค๋ฉด, ar rcv libmylib.a OBJ.o ๋ช
๋ น์ผ๋ก libmylib.a๋ผ๋ ์ฌ์ฉ์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑ ๊ฐ๋ฅํ๋ค. ar t libmylib.a ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ผ์ ๊ฒ์ํ๋ฉด OBJ.j ํ์ผ์ ํ์ธํ ์ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ปดํ์ผ ํ ๋ gcc main.c libmylib.a ์ ๊ฐ์ด ์ปดํ์ผ ํ ์๋ ์์ง๋ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๋๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ gcc main.c -lmylib ์ ๊ฐ์ด -l ์ต์
์ ์ด์ฉํ๋ค. ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ์์ ์์ชฝ์ lib ๋ถ๋ถ๊ณผ ๋ค์ชฝ์ .a ๋ถ๋ถ์ ์ ์ธํ ๋ถ๋ถ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ์ด๋ค. ์ ์์์์๋ mylib์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ์ด๋ค.
...