์ธํฐํ๋ฆฌํฐ์ ๊ฐ์ ๋จธ์ ์ ์ฌ์ฉํ์ง ์๊ณ ๋ค์ํ ์ด์ ์ฒด์ ์ฉ ํ๋ก๊ทธ๋จ์ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ํ์ค C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ฉ ์คํ ํ์ผ ํ์์ ๊ฐ๋ฐํ๋ Cosmopolitan 2.0 ํ๋ก์ ํธ ๋ฆด๋ฆฌ์ค๊ฐ ๋ฐํ๋์์ต๋๋ค. GCC ๋ฐ Clang์์ ์ปดํ์ผํ์ฌ ์ป์ ๊ฒฐ๊ณผ๋ ๋ชจ๋ Linux ๋ฐฐํฌํ, macOS, Windows, FreeBSD, OpenBSD, NetBSD์์ ์คํ๋ ์ ์๊ณ ์ฌ์ง์ด BIOS์์๋ ํธ์ถํ ์ ์๋ ์ ์ ์ผ๋ก ๋งํฌ๋ ๋ฒ์ฉ ์คํ ํ์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค. ํ๋ก์ ํธ ์ฝ๋๋ ISC ๋ผ์ด์ผ์ค(MIT/BSD์ ๋จ์ํ๋ ๋ฒ์ )์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค.
๋ฒ์ฉ ์คํ ํ์ผ์ ์์ฑํ๊ธฐ ์ํ ์ปจํ ์ด๋๋ Unix, Windows ๋ฐ macOS์์ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ๊ฐ์ง ํ์์ ๊ฒฐํฉํ์ฌ ํ๋์ ํ์ผ์ ๋ค์ํ ์ด์ ์ฒด์ (PE, ELF, MACHO, OPENBSD)์ ํน์ ํ ์ธ๊ทธ๋จผํธ์ ํค๋๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋จ์ผ ์คํ ํ์ผ์ด Windows ๋ฐ Unix ์์คํ ์์ ์คํ๋๋๋ก ํ๋ ค๋ฉด Thompson Shell์ด โโ"#!" ์คํฌ๋ฆฝํธ ๋ง์ปค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ฌ์ค์ ํ์ฉํ์ฌ Windows PE ํ์ผ์ ์ ์คํฌ๋ฆฝํธ๋ก ์ธ์ฝ๋ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ๋ฌ ํ์ผ์ ํฌํจํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ธฐ ์ํด(๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํ๋์ ํ์ผ๋ก ์ฐ๊ฒฐ) ํน๋ณํ ์ค๊ณ๋ ZIP ์์นด์ด๋ธ ํํ์ ์คํ ํ์ผ ํ์ฑ์ ์ง์ํฉ๋๋ค. ์ ์๋ ํ์์ ๊ตฌ์ฑํ(์: hello.com ์ ํ๋ฆฌ์ผ์ด์ ):
MZqFpD='BIOS ๋ถํธ ์นํฐ' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" 1๋ฒ ์ถ๊ตฌ REAL ๋ชจ๋โฆ ELF ์ธ๊ทธ๋จผํธโฆ OPENBSD ์ฐธ๊ณ โฆ MACHO ํค๋โฆ ์ฝ๋ ๋ฐ ๋ฐ์ดํฐโฆ ZIP ๋๋ ํ ๋ฆฌโฆ
ํ์ผ ์์ ๋ถ๋ถ์๋ Windows PE ํ์ ํค๋๋ก ์ธ์๋๋ "MZqFpD"๋ผ๋ ๋ ์ด๋ธ์ด ํ์๋ฉ๋๋ค. ์ด ์ํ์ค๋ "pop %r10;" ๋ช ๋ น์์๋ ๋์ฝ๋ฉ๋ฉ๋๋ค. jno0x4a; jo 0x4a", "jg 177x0" ๋ช ๋ น์ด์ ๋ํ "\47ELF" ๋ผ์ธ์ ์ง์ ์ ์ผ๋ก ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Unix ์์คํ ์ exec ๋ช ๋ น์ ์ฌ์ฉํ๋ ์ ์ฝ๋๋ฅผ ์คํํ์ฌ ์ด๋ฆ ์๋ ํ์ดํ๋ฅผ ํตํด ์คํ ์ฝ๋๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ ์๋ ๋ฐฉ๋ฒ์ ํ๊ณ๋ Thompson Shell ํธํ ๋ชจ๋๋ฅผ ์ง์ํ๋ ์๋ง ์ฌ์ฉํ์ฌ Unix ๊ณ์ด ์ด์ ์ฒด์ ์์ ์คํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
qemu-x86_64 ํธ์ถ์ ์ถ๊ฐ ์ด์์ฑ์ ์ ๊ณตํ๋ฉฐ x86_64 ์ํคํ ์ฒ์ฉ์ผ๋ก ์ปดํ์ผ๋ ์ฝ๋๊ฐ ARM ํ๋ก์ธ์๊ฐ ์ฅ์ฐฉ๋ Raspberry Pi ๋ณด๋ ๋ฐ Apple ์ฅ์น์ ๊ฐ์ ๋น x86 ํ๋ซํผ์์ ์คํ๋ ์ ์๋๋ก ํฉ๋๋ค. ๋ํ ์ด ํ๋ก์ ํธ๋ ์ด์ ์ฒด์ (๋ฒ ์ด๋ฉํ) ์์ด ์คํ๋๋ ๋ ๋ฆฝํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ๋ถํธ๋ก๋๊ฐ ์คํ ํ์ผ์ ์ฐ๊ฒฐ๋๊ณ ํ๋ก๊ทธ๋จ์ ๋ถํ ๊ฐ๋ฅํ ์ด์ ์ฒด์ ์ญํ ์ ํฉ๋๋ค.
ํ๋ก์ ํธ์์ ๊ฐ๋ฐ๋ ํ์ค C ๋ผ์ด๋ธ๋ฌ๋ฆฌ libc๋ 2024๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค(์ฒซ ๋ฒ์งธ ๋ฆด๋ฆฌ์ค์๋ ์ฝ 1400๊ฐ์ ๊ธฐ๋ฅ์ด ์์์ต๋๋ค). ์ฑ๋ฅ ์ธก๋ฉด์์ Cosmopolitan์ glibc๋งํผ ๋น ๋ฅด๊ฒ ์๋ํ๋ฉฐ Musl ๋ฐ Newlib๋ณด๋ค ๋์ ๋๊ฒ ์์ ์์ต๋๋ค. ํ์ง๋ง Cosmopolitan์ glibc๋ณด๋ค ์ฝ๋ ํฌ๊ธฐ๊ฐ ํจ์ฌ ์๊ณ ๋๋ต Musl ๋ฐ Newlib์ ํด๋นํฉ๋๋ค. memcpy, strlen ๋ฑ ์์ฃผ ํธ์ถ๋๋ ํจ์๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ๋งคํฌ๋ก ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ํธ์ถํ๋ "ํธ๋ฆฌํด๋ค์ด ์ฑ๋ฅ" ๊ธฐ์ ์ด ์ถ๊ฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ปดํ์ผ๋ฌ๋ ์ฝ๋ ์คํ๊ณผ ๊ด๋ จ๋ CPU ๋ ์ง์คํฐ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ต๋๋ค. ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ ์ง์คํฐ๋ง ์ ์ฅํ์ฌ CPU ์ํ๋ฅผ ์ ์ฅํ ๋ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ ์ ์๋ ํ๋ก์ธ์ค์ ๋๋ค.
์ ๋ฆด๋ฆฌ์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- zip ํ์ผ ๋ด์ ๋ด๋ถ ๋ฆฌ์์ค์ ์ก์ธ์คํ๊ธฐ ์ํ ๊ตฌ์ฑํ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค(ํ์ผ์ ์ด ๋ ์ด์ zip:.. ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ผ๋ฐ์ ์ธ /zip/... ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋ฉ๋๋ค). ๋ง์ฐฌ๊ฐ์ง๋ก Windows์์ ๋์คํฌ์ ์ก์ธ์คํ๋ ค๋ฉด "C:/..." ๋์ "/c/..."์ ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฒ์ฉ ์คํ ํ์ผ์ ํ์์ ์ ์ํ๋ ์๋ก์ด APE(Actually Portable Executable) ๋ก๋๊ฐ ์ ์๋์์ต๋๋ค. ์๋ก์ด ๋ก๋๋ mmap์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์นํ๊ณ ๋ ์ด์ ๋ด์ฉ์ ์ฆ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ๋ฒ์ฉ ์คํ ํ์ผ์ ๊ฐ๋ณ ํ๋ซํผ์ ๋ฌถ์ธ ์ผ๋ฐ ์คํ ํ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
- Linux ํ๋ซํผ์์๋ binfmt_misc ์ปค๋ ๋ชจ๋์ ์ฌ์ฉํ์ฌ APE ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์์ต๋๋ค. binfmt_misc๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋น ๋ฅธ ์์ ๋ฐฉ๋ฒ์ ๋๋ค.
- Linux์ ๊ฒฝ์ฐ OpenBSD ํ๋ก์ ํธ์์ ๊ฐ๋ฐํ promise() ๋ฐ unveil() ์์คํ ํธ์ถ ๊ธฐ๋ฅ ๊ตฌํ์ด ์ ์๋์์ต๋๋ค. C, C++, Python ๋ฐ Redbean ํ๋ก๊ทธ๋จ์์ ์ด๋ฌํ ํธ์ถ์ ์ฌ์ฉํ๊ธฐ ์ํ API์ ์์ ํ๋ก์ธ์ค๋ฅผ ๊ฒฉ๋ฆฌํ๊ธฐ ์ํ promise.com ์ ํธ๋ฆฌํฐ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
- ๋น๋์์๋ Landlock Make ์ ํธ๋ฆฌํฐ(๋ณด๋ค ์๊ฒฉํ ์ข ์์ฑ ๊ฒ์ฌ ๊ธฐ๋ฅ๊ณผ Landlock ์์คํ ํธ์ถ์ ์ฌ์ฉํ๋ GNU Make ๋ฒ์ )๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์์คํ ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌํ๊ณ ์บ์ฑ ํจ์จ์ฑ์ ํฅ์์ํต๋๋ค. ์ต์ ์ผ๋ก ์ผ๋ฐ GNU Make๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ํ๋ ๊ธฐ๋ฅ์ด ์ ์ง๋ฉ๋๋ค.
- ๋ฉํฐ์ค๋ ๋ฉ์ ์ํ ํจ์(_spawn() ๋ฐ _join())๊ฐ ๊ตฌํ๋์์ต๋๋ค. ์ด๋ ๋ค์ํ ์ด์ ์ฒด์ ์ ํน์ ํ API๋ฅผ ํตํ ๋ฒ์ฉ ๋ฐ์ธ๋ฉ์ ๋๋ค. POSIX ์ค๋ ๋ ์ง์์ ๊ตฌํํ๊ธฐ ์ํ ์์ ๋ ์งํ ์ค์ ๋๋ค.
- _Thread_local ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ ๋๋ณ๋ก ๋ณ๋์ ์ ์ฅ์(TLS, Thread-Local Storage)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก C ๋ฐํ์์ ๊ธฐ๋ณธ ์ค๋ ๋์ ๋ํด TLS๋ฅผ ์ด๊ธฐํํ๋ฏ๋ก ์ต์ ์คํ ํ์ผ ํฌ๊ธฐ๊ฐ 12KB์์ 16KB๋ก ๋์ด๋ฌ์ต๋๋ค.
- ๋ชจ๋ ํจ์ ํธ์ถ ๋ฐ stderr์ ๋ํ ์์คํ ํธ์ถ์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด "--ftrace" ๋ฐ "--strace" ๋งค๊ฐ๋ณ์์ ๋ํ ์ง์์ด ์คํ ํ์ผ์ ์ถ๊ฐ๋์์ต๋๋ค.
- Linux 5.9+, FreeBSD 8+ ๋ฐ OpenBSD์์ ์ง์๋๋ closefrom() ์์คํ ํธ์ถ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- Linux ํ๋ซํผ์์๋ vDSO(๊ฐ์ ๋์ ๊ณต์ ๊ฐ์ฒด) ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ clock_gettime ๋ฐ gettimeofday ํธ์ถ์ ์ฑ๋ฅ์ด ์ต๋ 10๋ฐฐ ํฅ์๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์คํ ํธ์ถ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ์ด๋ํ๊ณ ์ปจํ ์คํธ ์ ํ์ ํผํ ์ ์์ต๋๋ค.
- ๋ณต์์ ์์ ์ ์ํ ์ํ ํจ์๊ฐ Musl ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋๋์์ต๋๋ค. ๋ง์ ์ํ ํจ์์ ์์ ์ด ๊ฐ์ํ๋์์ต๋๋ค.
- ๋คํธ์ํฌ ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๊ธฐ ์ํด nointernet() ํจ์๊ฐ ์ ์๋์์ต๋๋ค.
- ํจ์จ์ ์ผ๋ก ๋ฌธ์์ด์ ์ถ๊ฐํ๊ธฐ ์ํ ์๋ก์ด ํจ์ ์ถ๊ฐ:append,appendf,appendr,appends,appendw,appendz,kappendf,kvappendf,vappendf.
- ๋์ ๊ถํ์ผ๋ก ์๋ํ๋๋ก ์ค๊ณ๋ kprintf() ํจ์ ๊ณ์ด์ ๋ณดํธ ๋ฒ์ ์ ์ถ๊ฐํ์ต๋๋ค.
- SSL, SHA, curve25519 ๋ฐ RSA ๊ตฌํ์ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค.
์ถ์ฒ : opennet.ru