ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ ํ์ธ์?
๋๊ตฌ๋ฆฌ์ ๋๋ค.
์ ๋ฒ ํฌ์คํ ์์ Xcode Build System์ ๋ํ ๊ธ์ ์ผ๋๋ฐ,
๋ง์ปค์ ๋ํด ์กฐ๊ธ๋ง ๋ ์์ธํ ๊ณต๋ถํด๋ณด๋ ค ์์๋ณด๋์ค
WWDC22์ ๋งํน์ ๋ํ ์์์ด ์์ด ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค.
๊ฐ๋ณด์์ฃ
๋ชฉ์ ํ์ผ์ด๋ ๋ฌด์์ธ๊ฐ?(์ฌ์ ์ง์)
๋จผ์ ์๊ณ ๊ฐ์ผํ ๋ด์ฉ์ด ์๋๋ฐ ๋ฐ๋ก ๋ชฉ์ ํ์ผ ์ ๋๋ค.
๋ชฉ์ ํ์ผ์ ์ปดํ์ผ๋ฌ๋ ์ด์๋ธ๋ฌ์์ ์์ค์ฝ๋๋ฅผ ์ปดํ์ผ์ด๋ ์ด์ ๋ธํด์ ์์ฑํ๋ ํ์ผ์ด๋ค.
์ ๋ฒ ํฌ์คํ Xcode Build System์์ ํด๋น ๋จ๊ณ์์ Mach-Oํ์ผ์ ์์ฑํ๋ค๊ณ ํ๋๋ฐ
๊ทธ๊ฒ ๋ฐ๋ก ๋ชฉ์ ํ์ผ ์ค ํ๋์ ๋๋ค.
Linker๋?

๋ง์ปค๋ ๋ชฉ์ ํ์ผ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ํฉ์ณ ์คํ ํ์ผ๋ก ๋ง๋๋ ์ญํ ์ ํ๊ณ
์ด ๊ณผ์ ์ ๋งํน์ด๋ผ๊ณ ํฉ๋๋ค.
์ด ๊ณผ์ ์ 2๊ฐ์ ์ข ๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค.

Static Linking(์ ์ ๋งํน): ์ฑ์ด ๋น๋๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ์ฑ์ ํฌ๊ธฐ์ ์ํฅ
Dynamic Linking(๋์ ๋งํน): ์ฑ์ด ์คํ๋ ๋ ๋ฐ์ํ์ฌ ์ฑ ์์ ๋๊ธฐ ์๊ฐ์ ์ํฅ
# What is static linking?

์์ ์๋ ํ๋ก๊ทธ๋จ๋ค์ด ๊ฐ๋จํ๊ณ , ์์คํ์ผ ๋ํ ํ๋์๊ธฐ ๋๋ฌธ์ ๋น๋๊ฐ ์ฌ์ ์ต๋๋ค.
๊ทธ๋์ ํ๋์ ์์ค ํ์ผ์ ์ปดํ์ผ ํ๋ฉด ์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํ๋์ ์์ค ํ์ผ์ ๋ง์ ์ฝ๋๋ฅผ ๋ฃ๊ณ ์์ ํ๊ฒ ๋๋ค๋ฉด ๋ชจ๋ ๋ถ๋ถ์ ๋ค์ ์ปดํ์ผ ํด์ผํฉ๋๋ค.
๊ทธ๋์ ์์ค ํ์ผ์ ๋ถ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.

๊ทธ๋ฐ๋ฐ ์ฌ๋ฌ ์์ค ํ์ผ์ ๊ฐ์ง๋ฉด ์ด๋ป๊ฒ ๋น๋ ํ ๊น์?

์ปดํ์ผ๋ฌ๋ฅผ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๊ฒ ๋ฉ๋๋ค.
์ฒซ๋ฒ์งธ ๋ถ๋ถ์์๋ ์์ค ์ฝ๋๋ฅผ intermediate "relocatable object" file(.o)๋ก ์ปดํ์ผ ํ๊ณ
๋๋ฒ์งธ ๋ถ๋ถ์์๋ (.o) ํ์ผ์ ์ฝ๊ณ ์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ๋ถ๋ถ์ ld(์ ์ ๋ง์ปค)๋ผ ๋ถ๋ฆ ๋๋ค.

์ํํธ์จ์ด๊ฐ ๋ฐ์ ํ๋ฉด ์ฌ๋๋ค์ .o ํ์ผ์ ๊ณต์ ํ๊ธฐ ์์ํฉ๋๋ค.
ํ์ง๋ง ์ด ์์ ์ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ๋๋ค.
๊ทธ๋์ ๋๊ตฐ๊ฐ ์ด ํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง๋ค๋ฉด ์ด๋จ๊น? ๋ผ๋ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋์๊ณ

๋น์ ํ์ผ์ ๋ฌถ๋ ํ์ค ๋ฐฉ์์ ar์ด๋ผ๋ ๋๊ตฌ์์ต๋๋ค.
๊ทธ๋์ ar์ ์ฌ์ฉํ์ฌ .oํ์ผ์ ์์นด์ด๋ธ๋ก ๋ฌถ์ ํ ๋ง์ปค๊ฐ ์ด ์ํค์ด๋ธ ํ์ผ์์ .o ํ์ผ์ ์ฝ์ ์ ์๋๋ก ๊ฐ์ ๋์์ต๋๋ค.
๋น์์๋ ์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์นด์ด๋ธ๋ก ๋ถ๋ ธ์ง๋ง
ํ์ฌ ์ฐ๋ฆฌ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Static Library)๋ผ ๋ถ๋ฆ ๋๋ค.

์ต๊ทผ์๋ ์คํ ํ๋ก๊ทธ๋จ๋ค์ด ๋ฌด๊ฑฐ์์ก์ต๋๋ค.
์ค์ ์ผ๋ถ ์ฝ๋๋ง ์ฌ์ฉํ๋๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฒ๊ฐ ํจ์๊ฐ ๋ณต์ฌ๋ฉ๋๋ค.

๊ทธ๋์ ๋ง์ปค๋ ์ต์ ํ๋ฅผ ํ๊ธฐ ์ํด
์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ชจ๋ .o ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ,
์ ์๋์ง ์์ ์ฌ๋ณผ๋ฌธ์ (Undefined Symbol)๊ฐ ํด๊ฒฐ๋ .o ํ์ผ๋ง ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, C ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๊ฐ ๋ชจ๋ ํฌํจ๋ libc.a๊ฐ ๋ง๋ค์ด์ก์ต๋๋ค.
๊ฐ ํ๋ก๊ทธ๋จ์ libc.a๋ฅผ ์ฐ๊ฒฐํ์ง๋ง, ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ก ํ์ํ ๋ถ๋ถ๋ง ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ
์ ์๋์ง ์์ ์ฌ๋ณผ ๋ฌธ์ : ์ปดํ์ผ๋ฌ๊ฐ ํ์ฌ ๋ชจ๋์์ ์ ์๋์ง ์์ ๋ณ์๋ ํจ์ ์ด๋ฆ ๋ฑ์ ์ฌ๋ณผ์ ์๋ณํ ์ ์์ ๋ ๋ฐ์
์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ์ ๋ก๋ฉ์ ์๋๋ฆฌ์ค๋ฅผ ํตํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์์ค ํ์ผ์ด ์์ต๋๋ค.

์ด ํ์ผ๋ค์ .o ํ์ผ๋ค๋ก ์ปดํ์ผ ํฉ๋๋ค.

๊ทธ ๋ค์ bar.o์ baz.o๊ฐ libbarbaz.a์ธ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฌถ์ธ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.

๊ทธ๋ผ ์ค์ ๋ก linking์ด ์ด๋ป๊ฒ ๋๋์ง ์์๋ด ์๋ค.
linker๋ ๋ช ๋ น์ด ๋ผ์ธ ์์๋๋ก ํ์ผ์ ์ฝ์ด ๋๊ฐ๋๋ค.

๋จผ์ main.o๋ฅผ ์ฐพ์ต๋๋ค.
main.o๋ฅผ ๋ก๋ํ๊ณ ์ฌ๋ณผ ํ ์ด๋ธ์์ main์ ๋ํ ์ ์๋ฅผ ์ฐพ์ต๋๋ค.
๊ทธ๋ ์ง๋ง main ์์ ์ ์๋์ง ์์(Undefined) foo๊ฐ ์๋ค๋ ๊ฒ๋ ์ฐพ์ต๋๋ค.

๊ทธ ๋ค์ linker๋ ๋ช ๋ น์ด ๋ค์ ๋ผ์ธ์ ๋ค์ ํ์ผ foo.o๋ฅผ ํ์ฑํฉ๋๋ค.
foo์ ๋ํ ์ ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.(Undefined ํด๊ฒฐ)
ํ์ง๋ง ์ ์๋์ง ์์ ์ ์ฌ๋ณผ 'bar'๋ฅผ ์ถ๊ฐํฉ๋๋ค.

๋ช ๋ น์ด ๋ผ์ธ์ ๋ชจ๋ .oํ์ผ์ด ๋ก๋๋์์ผ๋ฏ๋ก
linker๋ ์ ์๋์ง ์์ ์ฌ๋ณผ์ด ๋จ์ ์๋์ง ํ์ธํฉ๋๋ค.
'bar'๊ฐ ๋จ์ ์์ผ๋ฏ๋ก linker๋ ๋ช ๋ น์ด ๋ผ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ดํด๋ณด๋ฉด์
ํด๋น ์ฌ๋ณผ์ ์ถฉ์กฑํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์ต๋๋ค.
linker๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ bar.o์์ 'bar' ์ฌ๋ณผ ์ ์๋ฅผ ์ฐพ์๊ณ
์์นด์ด๋ธ๋ก ๋ถํฐ bar.o๋ฅผ ๋ก๋ํฉ๋๋ค.
์ ์๋์ง ์์ ์ฌ๋ณผ ๋ฌธ์ ๊ฐ ๋ชจ๋ ํด๊ฒฐ๋์์ผ๋ฏ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์์ ์ข ๋ฃํฉ๋๋ค.

๋ง์ปค๋ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ
ํ๋ก๊ทธ๋จ์ ํฌํจ๋ ๋ชจ๋ ํจ์์ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ํ ๋นํฉ๋๋ค.

๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ ํ์ผ์ ๋ณต์ฌํ๊ณ ์ถ๋ ฅ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค.
bar.o๋ ๋ง์ปค๊ฐ ์ ํ์ ๋ก๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ง๋ง ํ๋ก๊ทธ๋จ์ ๋ก๋๋์ง ์์ต๋๋ค.

# Recent ld64 improvements
์ ํ์ static linker์ธ ld64์ ๊ฐ์ ์ ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฌํด์ ld64๋ ๋ง์ ํ๋ก์ ํธ์์ 2๋ฐฐ ๋น ๋ฆ ๋๋ค.
๋ง์ปค ์์ ์ ๋ณ๋ ฌ๋ก ์ํํ๋๋ก ์ฌ๋ฌ๊ฐ์ ์ฝ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ์์ญ์ ์ฐพ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ ๋ ฅ ํ์ผ์ ๋ด์ฉ์ ์ถ๋ ฅ ํ์ผ๋ก ๋ณต์ฌํ๊ณ LINKEDIT์ ๋ถ๋ถ๋ค์ ๋ณ๋ ฌ๋ก ๊ตฌ์ถํ๊ณ UUID ๊ณ์ฐ์ ๋ณ๊ฒฝํ๊ณ ์ฝ๋ ์๋ช ํด์๋ฅผ ๋ณ๋ ฌ๋ก ์ํํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
๋ค์์ผ๋ก ์ฌ๋ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ํ์ต๋๋ค. ๊ฐ ์ฌ๋ณผ์ ๋ฌธ์์ด ์ฌ๋ผ์ด์ค๋ฅผ ๋ํ๋ด๋๋ฐ C++์ string_view ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด exports-trie builder๊ฐ ๊ต์ฅํ ์ ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ํ ๋ฐ์ด๋๋ฆฌ์ UUID๋ฅผ ๊ณ์ฐํ ๋ ์ต์ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํ๋์จ์ด์ ๊ฐ์์ ํ์ฉํ์ต๋๋ค ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ๋ ์์์ฃ
# Static Linking best practices
๋ง์ปค์ ์ฑ๋ฅ ๊ฐ์ ์์ ์ ์ฐ์ตํด๋ด ์๋ค.
๋งํฌ ์๊ฐ์ ๊ฐ์ ํ๊ธฐ ์ํด 5๊ฐ์ง ์ฃผ์ ์ ๋ํด ๋ค๋ฃจ์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ
- ์ ์๋ ค์ง์ง ์์ ๋งํฌ ์๊ฐ์ ํฐ ์ํฅ์ ์ฃผ๋ ์ธ๊ฐ์ง ์ต์
- ๋ช๊ฐ์ง ์ ์ ๋งํฌ์ ์์ฑ

์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ
์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๋๋๋ ์์ค ํ์ผ์ ์ด์ฌํ ์์ ํด์ ๋น๋ ์๊ฐ์ด ๋๋ ค์ง๋ ๊ฒฝ์ฐ์ ๋๋ค.
ํ์ผ์ด ์ปดํ์ผ ๋๊ณ ๋๋ฉด ๋ชฉ์ฐจ๋ฅผ ํฌํจํ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ๋น๋ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋จ์ง ์ถ๊ฐ์ ์ธ I/O๊ฐ ๋ง์๊ฒ๋๋ค.
์ฝ๋๊ฐ ์์ฃผ ์์ ๋์ง ์๊ณ ์์ ์ ์ธ ์ฝ๋์๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
-all_load
์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋๋ ๋น๋ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด์๋
ํ์ฌ ์์ ์ค์ธ ์ฝ๋๋ฅผ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์์์ ์์นด์ด๋ธ์ ์ ํ์ ๋ก๋ฉ์ ๋ดค์๋๋ฐ ์ด ๊ธฐ๋ฅ์ ๋จ์ ์ ๋ง์ปค๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋ ๋ค๋ ์ ์ ๋๋ค.
๊ทธ ์ด์ ๋ ๋น๋๋ฅผ ์ฌํ ๊ฐ๋ฅํ๋๋ก ํ๋ฉด์ ์ ํต์ ์ธ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ฏธ๋ฅผ ๋ฐ๋ฅด๊ธฐ ์ํด์๋ ๋ง์ปค๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ
๊ณ ์ ๋ ์ง๋ ฌ ์์๋ก ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๊น ld64์ ์ฅ์ ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ผ ํ๋๋ฐ ์ง๋ ฌ๋ก ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ ค์ง๋ ๊ฒ์ด์ฃ .
ํ์ง๋ง ์ด๋ฐ ์ ํต์ ์ธ ๋์์ด ํ์ํ์ง ์๋ค๋ฉด ๋ง์ปค ์ต์ ์ ํตํด ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ก -all_load ์ต์ ์ ํตํด์ ๋ง์ด์ฃ .

์ด ์ต์ ์ ๋ง์ปค์๊ฒ ๋ชจ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ .o ํ์ผ์ ๋ฌด์กฐ๊ฑด ๋ก๋ํ๋๋ก ์ง์ํฉ๋๋ค.
๋ง์ฝ ์ฑ์ด ๋๋ถ๋ถ์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์ฉ์ ์ ํ์ ์ผ๋ก ๋ก๋ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฌ์ฉํ๊ธฐ ์ ์ ํฉ๋๋ค.
ํด๋น ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ง์ปค๊ฐ ๋ชจ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ทธ ๋ด์ฉ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฑ์ด ๋์ผํ Symbol์ ๊ตฌํํ๋ ์ฌ๋ฌ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋ช ๋ น์ด ๋ผ์ธ ์์์ ๋ฐ๋ผ ์ด๋ค ๊ตฌํ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ค๋ฉด ์ฌ์ฉํ๊ธฐ์ ์ ์ ํ์ง ์์ต๋๋ค.
๋ง์ปค๊ฐ ๋ชจ๋ ๊ตฌํ์ ๋ก๋ํ๋ฉฐ ๊ธฐ์กด ์ ์ ๋งํฌ ๋ชจ๋์์ ์ป์ ์ ์์๋ Symbol Sementics๊ฐ ๋ณด์ฅ๋์ง ์์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ํ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ถ๊ฐํ๋ค ๋ณด๋ ํ๋ก๊ทธ๋จ ํฌ๊ธฐ๊ฐ ์ปค์ง ์ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.(unused ์ฝ๋๊ฐ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ)
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด -dead_strip์ต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์ต์ ์ ํตํด ๋ง์ปค๊ฐ ์ ๊ทผ ํ ์ ์๋ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ปค๊ฐ ์ ๊ฑฐํฉ๋๋ค.
-dead_strip์ ์๊ณ ๋ฆฌ์ฆ์ ๋น ๋ฅด๋ฉฐ, ๊ฒฐ๊ณผ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์์ผ๋ก์จ ์ฑ๋ฅ์ ๋ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
-all_load์ -dead_strip์ ํจ๊ป ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด ์ด ์ต์ ๋ค์ ์ฌ์ฉํ์ ๋์ ์ฌ์ฉํ์ง ์์์ ๋์ ๋งํฌ ์๊ฐ์ ์ธก์ ํ์ฌ ์ด๋ ์ ํ์ง๊ฐ ๋ ๋น ๋ฅธ์ง ํ์ธํ ํ์๊ฐ ์์ต๋๋ค.
-no_exported_symbols
๋ค์ ๋งํฌ ์ต์ ์ -no_exported_symbols์ ๋๋ค.
๋จผ์ ๊ฐ๋จํ ๋ฐฐ๊ฒฝ์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๋ง์ปค๊ฐ ์์ฑํ๋ LINKEDIT ์ธ๊ทธ๋จผํธ์ ์ผ๋ถ๋ ๋ด๋ณด๋ธ ์ฌ๋ณผ ์ด๋ฆ, ์ฃผ์, ํ๋๊ทธ๋ฅผ ์ธ์ฝ๋ฉํ๋ ์ ๋์ด ํธ๋ฆฌ์ธ exports trie์ ๋๋ค. ๋ชจ๋ dylib๋ ๋ด๋ณด๋ธ ์ฌ๋ณผ์ ๊ฐ์ ธ์ผ ํ์ง๋ง, ๋ฉ์ธ ์ฑ ๋ฐ์ด๋๋ฆฌ๋ ๋ณดํต ๋ด๋ณด๋ธ ์ฌ๋ณผ์ด ํ์ํ์ง ์์ต๋๋ค.
์ฆ, ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์ธ ์คํ ํ์ผ์์ ์ฌ๋ณผ์ ์กฐํํ๋ ์ผ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์ฑ ํ๊ฒ์ด์ -no_exported_symbols ์ต์ ์ ์ฌ์ฉํ์ฌ LINKEDIT์์ trie ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ฑ์ ๊ฑด๋๋ธ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋งํฌ ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค.
๋ค๋ง ์ฑ์ด ๋ฉ์ธ ์คํ ํ์ผ๋ก ๋ค์ ๋งํฌ๋๋ ํ๋ฌ๊ทธ์ธ์ ๋ก๋ํ๊ฑฐ๋, ์ฑ์ ํธ์คํธ ํ๊ฒฝ์ผ๋ก ์ฌ์ฉํ๋ xctest ๋ฒ๋ค์ ์คํํ๋ ๊ฒฝ์ฐ, ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ฏ๋ก ์ด ์ต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
exports trie๋ฅผ ์ต์ ํ๋ ๊ฒ์ ์ด ๊ตฌ์กฐ๊ฐ ํฐ ๊ฒฝ์ฐ์๋ง ์ ํจํฉ๋๋ค. dyld_info -exports /path/to/binary | wc -l ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๋ณด๋ธ ์ฌ๋ณผ์ ์๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค. ํ ๋๊ท๋ชจ ์ฑ์์๋ ์ฝ 100๋ง๊ฐ์ ๋ด๋ณด๋ธ ์ฌ๋ณผ์ด ์์๊ณ , ๋ง์ปค๊ฐ exported trie๋ฅผ ๋น๋ํ๋๋ฐ 2~3์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ด๋ ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด 2~3์ด๋ฅผ ๋จ์ถํ ์ ์์ต๋๋ค.

-no_deduplicate
๋ค์ ๋งํฌ ์ต์ ์ -no_deduplicate์ ๋๋ค. ๋งํฌ ๊ณผ์ ์์ ์ค๋ณต๋ ์ฝ๋๋ ๋ฐ์ดํฐ์ ์ ๊ฑฐ๋ฅผ ํ์ง ์๋๋ก ํ๋ ์ต์ ์ ๋๋ค. ์ต์ข ์คํ ํ์ผ์ ์ด๋นํ ์ค์ผ ์ ์์ด ์ ์ฉ ํ์ง๋ง ๋ง์ปค๊ฐ ๋ชจ๋ ํจ์์ ์ง์นจ์ ์ฌ๊ท์ ์ผ๋ก ํด์ฑํ์ฌ ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ๋ฐ๋ผ์ ๋น๋ ์๋๊ฐ ์ค์ํ ๋๋ฒ๊ทธ ๋น๋์์ ์ฌ์ฉํ๋๊ฒ์ด ํจ์จ์ ์ ๋๋ค.

# What is dynamic linking?
์๊ฐ์ด ์ง๋๋ฉด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปค์ง๊ณ ๋ง์์ก์ผ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ ์์ฐ์ค๋ฝ๊ฒ ์คํผ ํ๋ก๊ทธ๋จ์ ์ปค์ง๊ฒ ๋์์ต๋๋ค.
์๊ฐ์ ๋ฐ๋ผ ํด๋น ํ๋ก๊ทธ๋จ ๋น๋์ ๋๋ ์ ์ ๋งํฌ ์๊ฐ๋ ์ฆ๊ฐํ์ฃ

์๊ฐ์ ๋ฐ๋ผ ์๋์ ๊ฐ์ด ar์ด ld๋ก ๋ฐ๋๋ ๊ณผ์ ์ด ์๊น๋๋ค.
๊ทธ๋ผ ์ถ๋ ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด์ ์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ๊ฐ ๋๋๊ฒ์ด์ฃ . ๊ทธ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์คํ ํ๋ก๊ทธ๋จ์ ์ฌ์ด์ฆ๊ฐ ์ค์ด๋ค๊ฒ ๋๊ณ ์ด๊ฒ์ด ๋ฐ๋ก ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๋ฐ์ ๋๋ค.
๋์ ๋ผ์ด๋ธ๋ฌ๋ฅผ ํต์นญ dylib ๋ผ๊ณ ํฉ๋๋ค.

์ฌ๊ธฐ์๋ ์ด๋ค ์ผ์ด ์ผ์ด๋๊ณ ํ์ฅ์ฑ์ ์ด๋ค ๋์์ด ๋ ๊น์?
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ต์ข ํ๋ก๊ทธ๋จ์ผ๋ก ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ๊ฒ ๋์ ๋ง์ปค๊ฐ promise๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
์ฆ, ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๋ ์ฌ๋ณผ ์ด๋ฆ๊ณผ ๋ฐํ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ ์ด์ ์ด ๋ ๊น์? ํ๋ก๊ทธ๋จ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ ์ดํ ์ ์๋ค๋ ๋ป์ ๋๋ค. ํ๋ก๊ทธ๋จ์๋ ์์ ์ ์ฝ๋์ ๋ฐํ์์ ํ์ํ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก๋ง ํฌํจ๋ฉ๋๋ค. ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๊ฐ ํ๋ก๊ทธ๋จ์ ๋ณต์ฌ๋์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ ์ ์ ๋งํฌ ์๊ฐ์ ์ฝ๋ ํฌ๊ธฐ์ ๋น๋กํ๋ฉฐ, ๋งํฌ๋ dylib ์์๋ ๋ ๋ฆฝ์ ์ ๋๋ค.

๋ํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์คํ (Virtual Memory system)์ด ๋น์ ๋ฐํ ์ ์์ต๋๋ค. ๋์ผํ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ ๋ชจ๋ ํ๋ก์ธ์ค์์ ๋์ผํ dylib์ ๋ํด ๋์ผํ ๋ฌผ๋ฆฌ์ RAM ํ์ด์ง๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.

๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์๊ณผ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ "ํํ"์๋ ์ด๋ค "๋น์ฉ"์ด ๋ฐ๋ฅผ๊น์?
์ฒซ ๋ฒ์งธ ํํ์ ๋น๋ ์๊ฐ์ด ๋จ์ถ๋๋ค๋ ์ ์
๋๋ค. ๊ทธ๋ฌ๋ ๋น์ฉ์ ์ฑ ์คํ ์๋๊ฐ ๋๋ ค์ง๋ค๋ ๊ฒ์
๋๋ค. ์คํ์ ๋ ์ด์ ํ๋์ ํ๋ก๊ทธ๋จ ํ์ผ๋ง ๋ก๋ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ด์ ๋ชจ๋ dylibs๋ ๋ก๋๋๊ณ ์ฐ๊ฒฐ๋์ด์ผ ํฉ๋๋ค. ์ฆ, ๋น๋ ์๊ฐ์ ์ผ๋ถ ๋งํฌ ๋น์ฉ์ด ์คํ ์๊ฐ์ผ๋ก ์ฐ๊ธฐ๋ ๊ฒ์
๋๋ค.
๋ ๋ฒ์งธ๋ก, ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ ๋ ๋ง์ ๋ํฐ ํ์ด์ง๋ฅผ ๊ฐ์ง๋๋ค. ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ, ๋ง์ปค๋ ๋ชจ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ญ ๋ณ์(globals)๋ฅผ ์ฃผ ์คํ ํ์ผ์ ๋์ผํ DATA ํ์ด์ง์ ๋ฐฐ์นํฉ๋๋ค. ๊ทธ๋ฌ๋ dylib์ ๊ฒฝ์ฐ, ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฒด DATA ํ์ด์ง๋ฅผ ๊ฐ์ง๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋์ ๋งํฌ์ ๋น์ฉ์ ์๋ก์ด ์์, ์ฆ ๋์ ๋ง์ปค๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค! ๋น๋ ์๊ฐ์ ์คํ ํ์ผ์ ๊ธฐ๋ก๋ ์ฝ์์ ๊ธฐ์ตํ์๋์? ์ด์ ๋ฐํ์์ ํด๋น ์ฝ์์ ์ดํํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋์ ๋ง์ปค(dyld)์ ์ญํ ์ ๋๋ค. ์ด์ ๋์ ๋งํฌ๊ฐ ๋ฐํ์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.

์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ๋ TEXT, DATA, LINKEDIT์ ๊ฐ์ ์ธ๊ทธ๋จผํธ๋ก ๋๋ฉ๋๋ค. ์ธ๊ทธ๋จผํธ๋ ํญ์ OS ํ์ด์ง ํฌ๊ธฐ์ ๋ฐฐ์์ด๋ฉฐ, ๊ฐ ์ธ๊ทธ๋จผํธ๋ ๋ค๋ฅธ ๊ถํ์ ๊ฐ์ง๋๋ค. ์๋ฅผ ๋ค์ด, TEXT ์ธ๊ทธ๋จผํธ๋ "์คํ" ๊ถํ์ ๊ฐ์ง๋๋ค. ์ฆ, CPU๊ฐ ํด๋น ํ์ด์ง์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๊ณ์ด ๋ช ๋ น์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐํ์ ์, dyld๋ mmap()์ ์ฌ์ฉํ์ฌ ๊ฐ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๊ณ ๊ถํ์ ์ค์ ํฉ๋๋ค.

๊ทธ๋ฌ๋ ๋จ์ํ ๋งคํํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด dylib์ "์ฐ๊ฒฐ"๋๊ฑฐ๋ ๊ฒฐํฉ๋์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด "์์ (fix-ups)"์ด๋ผ๋ ๊ฐ๋ ์ด ๋์ ๋ฉ๋๋ค.

๋ค์ด์ด๊ทธ๋จ์์ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ dylib์ ์ผ๋ถ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ค์ด ์ค์ ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด์ ์์ ์์ (fix-ups)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ ์ฐ๋ฆฌ๊ฐ ์ต์ํ Mach-O ํ์ผ์ด ์์ต๋๋ค.
TEXT ์ธ๊ทธ๋จผํธ๋ ๋ณ๊ฒฝํ ์ ์๋(immutable) ์์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ ์ฝ๋ ์๋ช ์ด ๊ธฐ๋ฐ์ด ๋๋ ์์คํ ์์ ๋ฐ๋์ ๊ทธ๋์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด malloc()์ ํธ์ถํ๋ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ์๋ํ ๊น์? ํ๋ก๊ทธ๋จ์ด ๋น๋๋ ๋ _malloc์ ์๋ ์ฃผ์๋ ์ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๋์ํ๋ ๊ฑธ๊น์? ์ ์ ๋ง์ปค(static linker)๋ malloc์ด dylib์ ์๋ค๋ ๊ฒ์ ์ธ์งํ๊ณ ํธ์ถ ์์น๋ฅผ ๋ณํํฉ๋๋ค. ํธ์ถ ์์น๋ ๋์ผํ TEXT ์ธ๊ทธ๋จผํธ์ ๋งํฌ์ ์ํด ์์ฑ๋ ์คํ (stub)์ ํธ์ถํ๋๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ ์ฃผ์๋ฅผ ๋น๋ ์์ ์ ์ ์ ์๊ฒ ๋๋ฉฐ, BL(Branch with Link) ๋ช ๋ น์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฑํ ์ ์์ต๋๋ค.
์ด ๊ณผ์ ์ด ์ ์ฉํ ์ด์ ๋ ์คํ ์ด DATA์์ ํฌ์ธํฐ๋ฅผ ๋ถ๋ฌ์ ํด๋น ์์น๋ก ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ ์ TEXT ์ธ๊ทธ๋จผํธ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๊ณ , ๋จ์ง dyld๊ฐ DATA๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
์ฌ์ค dyld๋ฅผ ์ดํดํ๋ ํต์ฌ์ dyld๊ฐ ์ํํ๋ ๋ชจ๋ ์์ ์์ ์ด ๋จ์ง DATA ๋ด์ ํฌ์ธํฐ๋ฅผ ์ค์ ํ๋ ์์ ์ด๋ผ๋ ์ ์ ๋๋ค.

์ด์ dyld๊ฐ ์ํํ๋ ์์ (fixup)์ ๋ํด ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. LINKEDIT์๋ dyld๊ฐ ์ด๋ค ์์ ์์ ์ ์ํํ ์ง ๊ฒฐ์ ํ๋ ๋ฐ ํ์ํ ์ ๋ณด๊ฐ ์์ต๋๋ค. ์์ ์ ๋ ๊ฐ์ง ์ ํ์ผ๋ก ๋๋ฉ๋๋ค.
์ฒซ ๋ฒ์งธ๋ ๋ฆฌ๋ฒ ์ด์ค(rebase)๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฒ์ผ๋ก, ์ด๋ dylib(๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ ์ฑ ๋ด๋ถ์ ํฌ์ธํฐ๊ฐ ์์ ์ ๊ฐ๋ฆฌํฌ ๋ ๋ฐ์ํฉ๋๋ค. ASLR(Address Space Layout Randomization)์ด๋ผ๋ ๋ณด์ ๊ธฐ๋ฅ์ด ์์ด dyld๋ dylib๋ฅผ ๋ฌด์์ ์ฃผ์์ ๋ก๋ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๋ด๋ถ ํฌ์ธํฐ๋ ๋น๋ ์์ ์ ๋ฏธ๋ฆฌ ์ค์ ํ ์ ์์ต๋๋ค. ๋์ dyld๋ ์คํ ์์ ์ ์ด๋ฌํ ํฌ์ธํฐ๋ฅผ ์กฐ์ ํ๊ฑฐ๋ "๋ฆฌ๋ฒ ์ด์ค"ํด์ผ ํฉ๋๋ค. ๋์คํฌ์ ์ ์ฅ๋ ์ํ์์ ์ด๋ฌํ ํฌ์ธํฐ๋ dylib๊ฐ ์ฃผ์ 0์ ๋ก๋๋๋ค๊ณ ๊ฐ์ ํ ๋์ ๋์ ์ฃผ์๋ฅผ ํฌํจํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด LINKEDIT์๋ ๊ฐ ๋ฆฌ๋ฒ ์ด์ค ์์น์ ์์น๋ง ๊ธฐ๋กํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ dyld๋ dylib์ ์ค์ ๋ก๋ ์ฃผ์๋ฅผ ๊ฐ ๋ฆฌ๋ฒ ์ด์ค ์์น์ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ํ ์ ์์ต๋๋ค.

๋ ๋ฒ์งธ ์ ํ์ ๋ฐ์ธ๋(bind)์ ๋๋ค. ๋ฐ์ธ๋๋ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ์ ๋๋ค. ์ฆ, ๊ทธ ๋์์ด ์ซ์๊ฐ ์๋๋ผ ์ฌ๋ณผ ์ด๋ฆ์ ๋๋ค. ์๋ฅผ ๋ค์ด, "malloc" ํจ์์ ๋ํ ํฌ์ธํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ์๋ค. "_malloc" ๋ฌธ์์ด์ ์ค์ ๋ก LINKEDIT์ ์ ์ฅ๋๋ฉฐ, dyld๋ ์ด ๋ฌธ์์ด์ ์ฌ์ฉํด libSystem.dylib์ exports trie์์ malloc์ ์ค์ ์ฃผ์๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ dyld๋ ๋ฐ์ธ๋๋ก ์ง์ ๋ ์์น์ ํด๋น ๊ฐ์ ์ ์ฅํฉ๋๋ค. ์ฌํด ์ฐ๋ฆฌ๋ ์์ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ธ "์ฒด์ธ๋ ์์ (chained fixups)"์ ๋ฐํํ์ต๋๋ค.

์ฒซ ๋ฒ์งธ ์ฅ์ ์ LINKEDIT์ ํฌ๊ธฐ๊ฐ ์์์ง๋ค๋ ๊ฒ์ ๋๋ค. LINKEDIT์ ํฌ๊ธฐ๊ฐ ์ค์ด๋๋ ์ด์ ๋ ๋ชจ๋ ์์ ์์น๋ฅผ ์ ์ฅํ๋ ๋์ , ์๋ก์ด ํฌ๋งท์์๋ ๊ฐ DATA ํ์ด์ง์์ ์ฒซ ๋ฒ์งธ ์์ ์์น์ ๊ฐ์ ธ์จ ์ฌ๋ณผ ๋ชฉ๋ก๋ง ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋จธ์ง ์ ๋ณด๋ DATA ์ธ๊ทธ๋จผํธ ์์ฒด์ ์ธ์ฝ๋ฉ๋์ด ์ต์ข ์ ์ผ๋ก ์์ ์์ ์ด ์ค์ ๋ ์์น์ ์ ์ฅ๋ฉ๋๋ค. ์ด ์๋ก์ด ํฌ๋งท์ ์์ ์์น๊ฐ ์๋ก "์ฒด์ธ"์ผ๋ก ์ฐ๊ฒฐ๋๋ค๋ ์ ์์ ์ฒด์ธ๋ ์์ ์ด๋ผ๋ ์ด๋ฆ์ ์ป์์ต๋๋ค. LINKEDIT๋ ์ฒซ ๋ฒ์งธ ์์ ์์น๋ง ๊ธฐ๋กํ๋ฉฐ, DATA์ 64๋นํธ ํฌ์ธํฐ ์์น์ ์ผ๋ถ ๋นํธ๋ ๋ค์ ์์ ์์น์ ์คํ์ ์ ํฌํจํฉ๋๋ค. ๋ํ ํด๋น ๋นํธ๋ ์์ ์ด ๋ฐ์ธ๋์ธ์ง ๋ฆฌ๋ฒ ์ด์ค์ธ์ง ๋ํ๋ ๋๋ค. ๋ง์ฝ ๋ฐ์ธ๋๋ผ๋ฉด ๋๋จธ์ง ๋นํธ๋ ์ฌ๋ณผ์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ ๋๋ค. ๋ฆฌ๋ฒ ์ด์ค๋ผ๋ฉด ๋๋จธ์ง ๋นํธ๋ ์ด๋ฏธ์ง ๋ด์ ๋์ ์คํ์ ์ ๋ํ๋ ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ฒด์ธ๋ ์์ ์ ๋ํ ๋ฐํ์ ์ง์์ iOS 13.4 ์ด์์์ ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก, ๋ฐฐํฌ ๋์์ด iOS 13.4 ์ด์์ด๋ผ๋ฉด ์ค๋๋ถํฐ ์ด ์๋ก์ด ํฌ๋งท์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฒด์ธ๋ ์์ ํฌ๋งท์ ์ฌํด ๋ฐํ๋ ์๋ก์ด OS ๊ธฐ๋ฅ๋ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ฅผ ์ดํดํ๋ ค๋ฉด dyld์ ์๋ ๋ฐฉ์์ ์์์ผ ํฉ๋๋ค.

dyld๋ ๋ฉ์ธ ์คํ ํ์ผ(์: ์ฑ)๋ก๋ถํฐ ์์ํฉ๋๋ค. mach-o๋ฅผ ํ์ฑํด ํ์ํ ์์กด dylib(์ฝ์๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ dylib๋ฅผ mmap()ํ์ฌ ๋ก๋ํฉ๋๋ค. ๊ฐ๊ฐ์ ๋ํด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ dylib๋ฅผ ๋ก๋ํ๋๋ก mach-o ๊ตฌ์กฐ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์ฑํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋ก๋๋๋ฉด dyld๋ ํ์ํ ๋ฐ์ธ๋ ์ฌ๋ณผ์ ์ฐพ์ ์์ ์์ ์ ์ํํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก dyld๋ ์ด๊ธฐํ ์์ ์ ํํฅ์(bottom-up)์ผ๋ก ์คํํฉ๋๋ค. 5๋ ์ , ์ฐ๋ฆฌ๋ ์ด ๊ณผ์ ์์ ์ด๋ก์์ผ๋ก ํ์๋ ๋จ๊ณ๋ค์ด ์ฑ์ด ์คํ๋ ๋๋ง๋ค ๋์ผํ๋ค๋ ์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ๊ณผ dylib๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ, ์ด๋ก์ ๋จ๊ณ๋ค์ ์ฒซ ์คํ ์ ์บ์ฑํ์ฌ ์ดํ ์คํ ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.

# Recent dyld improvements
์ฌํด ์ฐ๋ฆฌ๋ ์ถ๊ฐ์ ์ธ dyld ์ฑ๋ฅ ํฅ์์ ๋ฐํํ์ต๋๋ค. "ํ์ด์ง-์ธ ๋งํฌ(page-in linking)"๋ผ๋ ์๋ก์ด dyld ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ dyld๊ฐ ์คํ ์ ๋ชจ๋ dylib์ ๋ํด ์์ ์์ ์ ์ํํ๋ ๋์ , ์ปค๋์ด ํ์ํ DATA ํ์ด์ง๋ฅผ ํ์ด์ง-์ธ(page-in) ์์ ์์ ์์ ์์ ์ ์ํํ ์ ์๊ฒ ํฉ๋๋ค.
๊ธฐ์กด์๋ mmap()๋ ์์ญ์ ํ์ด์ง ์ค ์ผ๋ถ ์ฃผ์๊ฐ ์ฒ์ ์ฌ์ฉ๋๋ฉด ์ปค๋์ด ํด๋น ํ์ด์ง๋ฅผ ์ฝ์ด์ค๋ ๋ฐฉ์์ด์์ต๋๋ค. ์ด์ DATA ํ์ด์ง์ ๊ฒฝ์ฐ, ์ปค๋์ด ํด๋น ํ์ด์ง์ ํ์ํ ์์ ์์ ๋ ์ํํ ์ ์์ต๋๋ค. ์ด ๋ฉ์ปค๋์ฆ์ ์ง๋ 10๋ ๊ฐ dyld ๊ณต์ ์บ์์ ์๋ OS dylib์ ๋ํด ํน๋ณํ ๊ฒฝ์ฐ๋ก ์กด์ฌํ์ง๋ง, ์ฌํด ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ผ๋ฐํํ์ฌ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ์ต๋๋ค. ์ด ๋ฉ์ปค๋์ฆ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํฐ ์ํ๋ฅผ ์ค์ด๊ณ ์คํ ์๊ฐ์ ๋จ์ถํฉ๋๋ค. ๋ํ DATA_CONST ํ์ด์ง๊ฐ ๊นจ๋(clean)ํด์ง๋ฏ๋ก TEXT ํ์ด์ง์ฒ๋ผ ํด์ถ๋๊ณ ๋ค์ ์์ฑ๋ ์ ์์ด ๋ฉ๋ชจ๋ฆฌ ์๋ฐ์ด ์ค์ด๋ญ๋๋ค. ํ์ด์ง-์ธ ๋งํฌ ๊ธฐ๋ฅ์ ํฅํ iOS, macOS, watchOS ๋ฆด๋ฆฌ์ค์ ํฌํจ๋ ์์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ์ด์ง-์ธ ๋งํฌ๋ ์ฒด์ธ๋ ์์ ์ผ๋ก ๋น๋๋ ๋ฐ์ด๋๋ฆฌ์์๋ง ์๋ํฉ๋๋ค. ์ฒด์ธ๋ ์์ ์ ํตํด ๋๋ถ๋ถ์ ์์ ์ ๋ณด๊ฐ ๋์คํฌ์ DATA ์ธ๊ทธ๋จผํธ์ ์ธ์ฝ๋ฉ๋๋ฏ๋ก, ํ์ด์ง-์ธ ์์ ์์ ์ปค๋์ด ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋จ, dyld๋ ์คํ ์ค์๋ง ์ด ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ดํ์ dlopen()์ผ๋ก ๋ก๋๋ dylib์ ๊ฒฝ์ฐ ํ์ด์ง-์ธ ๋งํฌ๋ ์ ์ฉ๋์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ dyld๋ ์ ํต์ ์ธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ dlopen ํธ์ถ ์ค ์์ ์์ ์ ์ํํฉ๋๋ค.

์ง๋ 5๋ ๊ฐ dyld๋ ์ด๋ก์์ผ๋ก ํ์๋ ๋จ๊ณ๋ฅผ ์ต์ ํํ์ฌ ์ฒซ ์คํ ์ ์์ ์ ์บ์ฑํ๊ณ ์ดํ ์คํ์์ ์ด๋ฅผ ์ฌ์ฌ์ฉํ์ต๋๋ค. ์ด์ dyld๋ "apply fixup" ๋จ๊ณ๋ ์ต์ ํํ์ฌ ์ค์ ์์ ์์ ์ ์ํํ์ง ์๊ณ , ์ปค๋์ด ์ด๋ฅผ ํ์ด์ง-์ธ ์์ ์์ ์ง์ฐ ์ํํ๊ฒ ํฉ๋๋ค.

# Dynamic linking best practices
dyld๋ ์ด๋ฏธ ๋์ ๋งํฌ ๋จ๊ณ ๋๋ถ๋ถ์ ๊ฐ์ํํ์ผ๋ฏ๋ก, ์ฌ๋ฌ๋ถ์ด ์ ์ดํ ์ ์๋ ๊ฒ์ dylib์ ์์ ๋๋ค. dylib๊ฐ ๋ง์์๋ก dyld๊ฐ ๋ก๋ ์์ ์ ์ํํ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๋ฐ๋๋ก dylib๊ฐ ์ ์ผ๋ฉด ์์ ๋์ด ์ค์ด๋ญ๋๋ค. ๋ ํ๋ ํ์ธํด์ผ ํ ๊ฒ์ ์ ์ ์ด๊ธฐํ์(static initializer)์ ๋๋ค. ์ด๋ ๋ฉ์ธ ํจ์ ์คํ ์ ํญ์ ์คํ๋๋ ์ฝ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ์ด๊ธฐํ์์์ I/O ์์ ์ด๋ ๋คํธ์ํฌ ์์ ์ ์ํํ์ง ๋ง์ญ์์ค. ๋ช ๋ฐ๋ฆฌ์ด ์ด์ ๊ฑธ๋ฆด ์ ์๋ ์์ ์ ์ ๋ ์ด๊ธฐํ์์์ ์คํํ์ง ์์์ผ ํฉ๋๋ค. ์ฌ๋ฌ๋ถ์ ์ค์น ๊ธฐ๋ฐ์ ์ ํฉํ๋ค๋ฉด ๋ ๋์ ๋ฐฐํฌ ๋์(iOS 13.4 ์ด์)์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ ์ฒด์ธ๋ ์์ ์ ํ์ฑํํ๊ณ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ ์๊ฒ ๋ง๋ค๊ณ ์คํ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์์ต๋๋ค.

# New Tools
์ฒซ ๋ฒ์งธ ๋๊ตฌ๋ dyld_usage์
๋๋ค. ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด dyld๊ฐ ์ํํ๋ ์์
์ ์ถ์ ํ ์ ์์ต๋๋ค.
์ด ๋๊ตฌ๋ macOS์์๋ง ์ฌ์ฉํ ์ ์์ง๋ง, ์๋ฎฌ๋ ์ดํฐ์์ ์ฑ์ ์คํํ๊ฑฐ๋ Mac Catalyst๋ก ๋น๋๋ ์ฑ์ ๋ํด ์ถ์ ํ๋ ๋ฐ ํ์ฉํ ์ ์์ต๋๋ค.
๋ค์์ macOS์์ TextEdit์ ๋์์ผ๋ก ์คํํ ์์ ๋๋ค.
์์ ์๋จ ๋ช ์ค์์ ์ ์ ์๋ฏ์ด, ์ ์ฒด ์คํ ์๊ฐ์ 15ms๊ฐ ๊ฑธ๋ ธ์ผ๋ฉฐ, ๊ทธ์ค fixup ์์
์๋ 1ms๋ง ์์๋์์ต๋๋ค.
์ด๋ page-in linking ๋๋ถ์
๋๋ค. ํ์ฌ ์คํ ์๊ฐ์ ๋๋ถ๋ถ์ ์ ์ ์ด๊ธฐํ ์ฝ๋(static initializers) ์คํ์ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.

๋ค์ ๋๊ตฌ๋ dyld_info์
๋๋ค. ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์คํฌ์ ์๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด๋ ํ์ฌ dyld ์บ์์ ์๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
์ด ๋๊ตฌ์๋ ๋ค์ํ ์ต์
์ด ์์ง๋ง, ์ฌ๊ธฐ์๋ exports์ fixups๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฝ๋๋ค.
-fixup ์ต์ ์ ์ฌ์ฉํ๋ฉด dyld๊ฐ ์ฒ๋ฆฌํ ๋ชจ๋ fixup ์์น์ ๊ทธ ๋์(target)์ ํ์ํฉ๋๋ค. ์ถ๋ ฅ ํ์์ ํด๋น ํ์ผ์ด ๊ธฐ์กด ๋ฐฉ์์ fixups์ธ์ง, ์๋๋ฉด ์๋ก์ด chained fixups์ธ์ง์ ์๊ด์์ด ๋์ผํฉ๋๋ค.
-exports ์ต์
์ ์ฌ์ฉํ๋ฉด ํด๋น dylib์์ ๋ด๋ณด๋ด์ง ๋ชจ๋ ์ฌ๋ณผ(exported symbols)๊ณผ, ๊ฐ ์ฌ๋ณผ์ด dylib ์์ ์ง์ ์์ ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ, Foundation.framework๋ผ๋ dyld ์บ์์ ์๋ dylib ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋์คํฌ์ ํ์ผ์ด ์กด์ฌํ์ง ์๋๋ผ๋, dyld_info ๋๊ตฌ๋ dyld์ ๋์ผํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฐพ์๋ผ ์ ์์ต๋๋ค.

# ์ ๋ฆฌ
์ด์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ญ์ฌ์ ๊ทธ ์ฅ๋จ์ ์ ์ดํดํ์
จ์ผ๋, ์ฌ๋ฌ๋ถ์ ์ฑ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ฒํ ํ๊ณ ์ ์ ํ sweet spot์ ์ฐพ์ผ์ธ์.
๋ค์์ผ๋ก, ๋ง์ฝ ์ฑ์ด ํฌ๊ณ ๋งํฌ ์์
์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด, Xcode 14์ faster linker๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์.
๋งํฌ ์๋๋ฅผ ๋ ๊ฐ์ ํ๊ณ ์ถ๋ค๋ฉด ์ ๊ฐ ์ค๋ช
ํ ์ธ ๊ฐ์ง ๋ง์ปค ์ต์
์ ๊ฒํ ํ์ฌ ์ฌ๋ฌ๋ถ์ ๋น๋์ ์ ํฉํ์ง ํ์ธํ๊ณ , ์ด๋ฅผ ํตํด ๋งํฌ ์๊ฐ์ ๋จ์ถํ์ธ์.
๋ง์ง๋ง์ผ๋ก, ์ฑ๊ณผ ํฌํจ๋ ํ๋ ์์ํฌ๋ฅผ iOS 13.4 ์ด์์ผ๋ก ๋น๋ํ์ฌ chained fixups๋ฅผ ํ์ฑํํ ํ, ์ฑ์ด iOS 16์์ ๋ ์์์ง๊ณ ์คํ ์๋๊ฐ ๋ ๋นจ๋ผ์ง๋์ง ํ์ธํด ๋ณด์ธ์.
์ฐธ์กฐ
https://developer.apple.com/videos/play/wwdc2022/110362
Link fast: Improve build and launch times - WWDC22 - Videos - Apple Developer
Discover how to improve your app's build and runtime linking performance. We'll take you behind the scenes to learn more about linking,...
developer.apple.com
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Xcode] Xcode Build System ์ดํดํ๊ธฐ (0) | 2025.01.03 |
|---|---|
| [Xcode] build configuration file(xcconfig) ์์๋ณด๊ธฐ (0) | 2025.01.01 |
| [Xcode] Project, Target, Build Settings ๋ฑ ๊ฐ ๊ฐ๋ ์ ๋ฆฌ (0) | 2024.12.23 |
| [iOS] Keychain (1) | 2024.11.04 |
| [iOS] UserDefaults (0) | 2024.11.03 |
- Total
- Today
- Yesterday
- xcode
- func
- Clean
- test
- set
- RX
- ๊ณต๋ถ
- autolayout
- swift
- Protocol
- observable
- ์คํ ๋ ์ด์์
- Unit Test
- ์ค์ํํธ map
- swift ๊ณต๋ถ
- ios
- swift ํ๋กํ ์ฝ
- Swift Network
- ํ ์คํธ
- swift urlsession
- ์ค์ํํธ ํ๋กํ ์ฝ
- Property
- RxSwift
- XCTest
- ์ค์ํํธ ๊ณต๋ถ
- ํ๋กํผํฐ
- ํ๋กํ ์ฝ
- network
- ์ค์ํํธ
- URLSession
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |