ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

iOS

Linker ์•Œ์•„๋ณด๊ธฐ

Neoguri๐Ÿฆ 2025. 1. 12. 17:05

์•ˆ๋…•ํ•˜์„ธ์š”?

๋„ˆ๊ตฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ 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

 

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ