Google์ ๊ฐ๋ฐ์ ์ค ํ ๋ช
LLVM ๊ฐ๋ฐ์ ์ต๊ทผ Google์ ์ด์ ๋ธ๋ฆฌ ๋๊ตฌ ๊ตฌ์ถ์ ์ํ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ๋์์ต๋๋ค. ์ฃผ์ ์์ด๋์ด๋ Google์ด ์ด๋ฏธ libc ๊ฐ๋ฐ์ ์์ํ๋ค๋ฉด ์์ฒด C++(Libc++)์ฉ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ฏธ ์ ๊ณตํ์ง๋ง ์ ์ฌํ C์ฉ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ LLVM์ ์ผ๋ถ๋ก ์์คํ ์ ์ฆ์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ด๋ป๊ฒ ์ต๋๊น? (libc).
๊ฐ๋ฐ์ ๋จ๊ณ์ ์ผ๋ก ์งํ๋์ด ์ ์ฐจ์ ์ผ๋ก ๊ธฐ๋ฅ์ด ํฅ์๋ ์์ ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์ต์ ์ ์์ง ๊ตฌํ๋์ง ์์ ๊ธฐ๋ฅ์ ์ฐจ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์์คํ Libc ์ฌ์ด์ ๊ณ์ธต์ผ๋ก ์ค๊ณ๋๋๋ก ์ ์๋์์ต๋๋ค. ํน์ ์์ค์ ๊ธฐ๋ฅ์ ๋๋ฌํ ํ์๋ ์๋ก์ด Libc๋ฅผ ์์คํ Libc์ ์์ ํ ๋์ฒดํ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. x86-64 ์ํคํ ์ฒ, Linux, ์ ์ ๋งํฌ ์ง์๋ถํฐ ์์ํ ๊ณํ์ ๋๋ค(๋์ ๋ก๋ฉ, ๋งํฌ ๋ฐ ์ถ๊ฐ ์ํคํ ์ฒ๋ ๋ถ์ฐจ์ ์ผ๋ก ๊ตฌํ๋ ์์ ์ ๋๋ค).
์ด ํ๋ก์ ํธ๋ ์์ง ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ์ ์์ง๋ง ๊ธฐ๋ณธ ๋ชฉํ๋ ์ด๋ฏธ ์ ์๋์์ต๋๋ค.
- ๋ชจ๋๋ฆฌ์ ์ธํธ๊ฐ ์๋ ์ธ๋ถํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค๋ ์ฒ ํ์ ๋ฐ๋ฅธ ๋ชจ๋ํ ๋ฐ ๊ฐ๋ฐ
- ๋ชจ๋์ ์ ์ ๋งํฌ ์ง์
PIE (์์น ๋ ๋ฆฝ์ ์คํ ํ์ผ) ๋ฐ PIE๊ฐ ์์ต๋๋ค. ์ ์ ์ผ๋ก ๋งํฌ๋ ์คํ ํ์ผ์ ์ํ CRT(C ๋ฐํ์) ๋ฐ PIE ๋ก๋ ์ ๊ณต - POSIX ์ถ๊ฐ ๋ฐ ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ์ผ๋ถ ์์คํ ๋ณ ํ์ฅ์ ํตํด ๋๋ถ๋ถ์ ํ์ค C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
- ๊ณต๊ธ์ ์ฒด๋ณ ํ์ฅ์ ์ฃผ์ํ๊ณ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ถ๊ฐํ์ธ์. ํ์ฌ ํ์ฅ ์ง์๊ณผ ๊ด๋ จํ์ฌ Clang ๋ฐ libc++ ํ๋ก์ ํธ์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์๋ฉ๋๋ค.
- ์ฒ์๋ถํฐ ์๋ํ์ด์ ๋ฐ ํผ์ง ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฑ LLVM ํดํท์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ๋์ ์ธ LLVM ๊ฐ๋ฐ์ ์ค ํ ๋ช
๋น์ ์ ์๊ฒฌ๋
- ์ ํํ๊ณ ํธํ ๊ฐ๋ฅํ๋ฉฐ ๊ณ ํ์ง์ Libc๋ฅผ ๊ฐ๋ฐํ๊ณ ์ ์งํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ค์ด ์์ ์ ๋๋ค. ๋ฌธ์ ๋ ์ฝ๋์ ์์ ์๋ ๊ฒ์ด ์๋๋ผ C/C++๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑฐ๋ํ ๊ณ์ธต๊ณผ ๋ฐํ์์ด ์ฌ์ฉ๋๋ ๋ค๋ฅธ ์ธ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ ๋ คํ์ฌ ์ฌ๋ฐ๋ฅธ ๋์์ ๋ณด์ฅํ๊ณ ์ธํฐํ์ด์ค ๊ตฌํ์ ์ด๋ ค์์ ๋ณด์ฅํ๋ ๋ฐ ์์ต๋๋ค. Libc์ ์ํด. ๋์์ค๋ฅผ ๊ณ ๋ คํ์ง ์์ ์ ๋ฉด ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ์กด์ ๋ง์ ํ๋ก๊ทธ๋จ์ด Libc์ ํจ๊ป ์๋ํ ์ ์๋ค๋ ์ฌ์ค๋ก ์ด์ด์ง ๋ฟ์ด์ง๋ง ๊ทธ๋ฌํ ํ๋ก์ ํธ๋ ์๋น์์๊ฒ ๊ด์ฌ์ด ์์ ๊ฒ์ ๋๋ค.
- ๊ธฐ์ ๊ฐ๋ฐ์ Libc๋ฅผ ๋ง์น ์ ์์ง๋ง ์ด๋ฅผ ๋๋ฆฌ ์ฌ์ฉํ๊ฒ ๋๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํดํน์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ธฐ์ ์คํ ์์ค ํ๋ก์ ํธ์ ํ์์ ๋ฐ๋ฅธ ๊ฐ๋ฐ์ ํ์ฌ์ ์๊ตฌ์ ์๋ฃจ์ ์ชฝ์ผ๋ก ๋ด์๋ฅผ ๋์ด๋น๊ฒจ ์ปค๋ฎค๋ํฐ์ ์ด์ต์ ์์์ํฌ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ๋ก ์ธํด ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ์๋ณํ ๊ฒฝ์ฐ ์ ์ด ๊ฐ๋ฐ์์๋ ๋ฒ๊ทธ ์์ฒด๋ฅผ ์์ ํ๋ ๊ฒ๋ณด๋ค Libc๊ฐ ์ด ๋ฒ๊ทธ์ ํธํ๋๋์ง ํ์ธํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. Apple์ ์ด๋ฌํ ๋ชฉ์ ์ผ๋ก BSD libc ํฌํฌ๋ฅผ ์ฌ์ฉํ๊ณ Google์ Fuchsia์์ musl ํฌํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. musl ๊ฐ๋ฐ์์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๋ผ์ด์ผ์ฑ ๋ฌธ์ ๋ฅผ ๋ช ํํ ํ๊ธฐ ์ํด ์ฃผ๋ก ๋ณํธ์ฌ๋ก๋ถํฐ ์ฐ๋ฝ์ ๋ฐ์์ง๋ง ์ง์ ์ ์ธ๋ชจ์๊ณ ํ๊ดด์ ์ธ ๋ณ๊ฒฝ์ ํ๊ธฐ ์ ์ ๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ ๋ช ํํ ํ๊ธฐ ์ํด ์ฐ๋ฝ์ ๋ฐ์ ์ ์ ํ ๋ฒ๋ ์์์ต๋๋ค.
- libc ๊ฐ๋ฐ์์ ๋จ์ผ ๋ฌธํ๊ฐ ์๊ณ ๊ฐ๋ณ ์ ์ด๋ณด๋ค๋ ํฉ์ ๊ธฐ๋ฐ ํ์ค์ ์ค์ ์ ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๊ฐ ํน์ ๊ตฌํ์ ์ฝ๋งค์ด๊ธฐ๋ณด๋ค๋ ํ์ค์ ์ฌ์ฉํ๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก musl์ ์์ฑ์๊ฐ LLVM์ ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ ๊ฒ๊ณผ LLVM ๋ด์์ libc๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์ ๋ฐ๋ํ๋ ์ด์ ์ ๋๋ค. ์ด ๊ฒฝ์ฐ libc์ ๋ ๋ฆฝ์ ์ธ ํน์ฑ์ด ์์ค๋๊ณ ํน์ ๊ตฌํ์ด LLVM์ ๋ํ ์ผ๋ฅ ์๋ฃจ์ ์ด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. LLVM ๋ฐ ๊ธฐํ ๋ชจ๋ ์๋ฃจ์ ์ 2๊ธ ์๋ฃจ์ ์ด ๋ฉ๋๋ค.
์ถ์ฒ : opennet.ru