Rust: LLD์™€ ์—ฐ๋™

์— ๋งŒ๋“  2017๋…„ 02์›” 17์ผ  ยท  94์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

LLVM 4.0์€ LLD๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ๋ฐฐ์†ก๋˜์ง€๋งŒ AFAIK๋Š” ์•„์ง ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  AVR/emscripten ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณง LLVM ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๊ณ„ํš๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ด์ œ ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์•ผ ํ•  ์ผ, ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ/๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ/๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ง์ปค ๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ.

ํ˜„ํ™ฉ(2020-04-24) ์š”์•ฝ https://github.com/rust-lang/rust/issues/39915#issuecomment -618726211

A-linkage C-feature-request I-compiletime T-compiler

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ๋ฒ„๊ทธ๋Š” ์•ฝ๊ฐ„ ์—‰๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์„ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ํ˜„์žฌ ์ƒํ™ฉ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์š”์•ฝ์— ์ตœ์„ ์„ ๋‹คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

lld ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‘ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋ฐ”๋žŒ์งํ•œ llvm ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€์ธ ๋ง์ปค:

  • ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์— ๋งค์šฐ ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ž„๋ฒ ๋””๋“œ ๋Œ€์ƒ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค).
  • ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค(์ข…์ข… Gold์˜ ์ ˆ๋ฐ˜ ์‹œ๊ฐ„์œผ๋กœ ์‹คํ–‰ -- ์—ฐ๊ฒฐ์€ ํฐ ํ”„๋กœ์ ํŠธ(rustc, ์„œ๋ณด ๋“ฑ)์˜ ๊ฒฝ์šฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฐ๊ฒฐ์€ ์ฆ๋ถ„ ๋นŒ๋“œ๋กœ ์ปดํŒŒ์ผ์˜ ์—„์ฒญ๋‚œ %๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋Ÿฐํƒ€์ž„์„ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์€ ํฐ ๊ฑฐ๋ž˜.)

์˜ค๋Š˜๋‚  Rust๊ฐ€ lld๋กœ ํ•˜๋Š” ์ผ

  • Rust๋Š” ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋žซํผ์—์„œ ์ž์ฒด์ ์ธ lld ๋ณต์‚ฌ๋ณธ์„ rust-lld๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Rust-lld๋Š” ๋งŽ์€ ๋ฒ ์–ด ๋ฉ”ํƒˆ ํƒ€๊ฒŸ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Rust-lld๋Š” wasm์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • (?) "-C linker-flavor"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rust-lld๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ๊ณณ(์˜ˆ: ๋ฐ์Šคํฌํƒ‘ linux/mac/windows)์—์„œ rust-lld๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋ฌธ์ œ

  • lld์šฉ macOS(Mach-O) ๋ฐฑ์—”๋“œ๊ฐ€ ์ค‘๋‹จ๋˜์–ด ์ค‘๋‹จ๋จ

    • ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์“ฐ๊ธฐ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์ง€๋งŒ ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  • linux/unix ํ”Œ๋žซํผ์—์„œ๋Š” ld/lld๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ c ์ปดํŒŒ์ผ๋Ÿฌ(์˜ˆ: gcc)๋ฅผ ํ†ตํ•ด ๋ง์ปค๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฑ…์ž„์€ crt1.o์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ๊ธฐํ˜ธ๋ฅผ ์ฐพ์•„ ld์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ "๊ทธ๋ƒฅ" Rust-lld๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ gcc/clang/๋ฌด์—‡์ด๋“  ๊ณต๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ์ด ์‹œ์Šคํ…œ ๊ธฐํ˜ธ ๋…ผ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ง์ปค๋ฅผ ๊ฒฝ๋กœ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์—†์œผ๋ฉฐ C ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ์— "ld"๋กœ ์‚ฝ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋˜๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "ld.lld"๋กœ ์‚ฝ์ž…ํ•˜๊ณ  "-fuse-ld=lld"๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.



      • ์ด๊ฒƒ์€ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ lld๋Š” "ld" ๋˜๋Š” "ld.lld"๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ clang ์Šคํƒ€์ผ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฆ„ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์กฐ์‚ฌ ํ•„์š”)


      • ๋ถˆํ–‰ํžˆ๋„ -fuse-ld=lld๋Š” GCC 9์˜ ์ผ๋ถ€์ผ ๋ฟ์ด๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋Šฅ/๋ฒ„์ „ ๊ฐ์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(clang์€ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค)



  • ์ฐฝ - MSVC๋Š” ์ข‹์€ ๋ชจ์–‘ ๋ถ„๋ช…ํžˆํ•˜๊ณ , ๋ฐฑ์—”๋“œ์— ๋…น LLD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์ œํ•œ๋œ ์ง€์›์„ ๊ฐ–๊ณ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”,ํ•˜์ง€๋งŒ ๋‚œ ์—ฌ๊ธฐ์—ํ•ด์•ผํ•  ์ผ๋“ค์— ๋Œ€ํ•œ ๋ถˆ๋ถ„๋ช… ํ•ด์š”.
  • windows-mingw๋Š” ๊ณ ๋Œ€ GCC๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” linux/unix์™€ ๊ฑฐ์˜ ๊ฐ™์€ ์œ„์น˜์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  pseudo-windows-linux๊ฐ€ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋œ ๊ตฌ์„ฑ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ lld๋Š” ์ตœ์‹  ๋ฒ„์ „์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ OS์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ณณ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ž„์˜์˜ ํ˜ธํ™˜ ๋ฒ„๊ทธ๊ฐ€ ๊ฑฐ์˜ ํ™•์‹คํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ (rust-)lld๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ๋ฉ”ํƒ€๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

  • #71515 - x64 Ubuntu 20.04 LTS(๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ๋Š” ๋ชจ๋“  x64 ELF ํ”Œ๋žซํผ)
  • #71520 - x64 MSVC ์ฐฝ

๋ชจ๋“  94 ๋Œ“๊ธ€

# 36120์˜ PoC๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

LLD๋Š” ํ˜„์žฌ ๋ง์ปค๋ฅผ ์–ด์จŒ๋“  ๋ฒˆ๋“ค๋กœ ๋ฌถ๊ณ  ์žˆ๊ณ  MinGW์˜ ๋ง์ปค์—๋Š” ASLR ๋ถ€์กฑ์—์„œ bigobj ์ง€์› ์—†์Œ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— LLD๋Š” MinGW ๋Œ€์ƒ์— ๋Œ€ํ•œ ๋งค์šฐ ์ข‹์€ ํ›„๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ํƒ€๊ฒŸํŒ…(ํ˜„์žฌ Rustup์˜ mingw ํŒจํ‚ค์ง€๋Š” ํ˜„์žฌ ์ œํ•œ๋˜์–ด ์žˆ์Œ)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํฌ๋กœ์Šค ์ปดํŒŒ์ผํ•  ๋•Œ ํ•„์š”ํ•œ mingw ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Linux์—์„œ Rust ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์—„์ฒญ๋‚œ ๊ฐœ์„ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋ฐฐํฌํŒ์—์„œ MinGW๋ฅผ ์–ป์€ ๋‹ค์Œ ๋ฐฐํฌํŒ์ด ๊ฑฐ์˜ ํ•ญ์ƒ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” MinGW๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์กด ์ƒํ™ฉ๋ณด๋‹ค.

LLD๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ธํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ MSVC ๋Œ€์ƒ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ข‹์€ ํ›„๋ณด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค . ์ฃผ๋œ ์ด์œ ๋Š” debuginfo ์ง€์›์ด ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. MSVC ๋Œ€์ƒ์œผ๋กœ ํฌ๋กœ์Šค ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ์žฌ๋ฐฐํฌํ•  ์ˆ˜ ์—†๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

LLVM 4.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์  ๋ฌธ์ œ๋Š” https://github.com/rust-lang/rust/issues/37609 ์ž…๋‹ˆ๋‹ค.

๋ ˆ์ฝ”๋“œ lld๋Š” ํ™•์‹คํžˆ Solaris ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ค€๋น„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Solaris์—์„œ๋Š” ๊ธฐ๋ณธ ld ๋Œ€์‹  lld๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ Rust๊ฐ€ ๋งํฌ๋ฅผ ์œ„ํ•ด gcc๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  Solaris์—์„œ Solaris ld๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€ Solaris์—์„œ, Solaris ์šฉ ๋นŒ๋“œ ํ•  ๋•Œ ์‚ฌ์šฉ LLD์— @binarycrusader ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

PR Rust-lang/rust#40018์€ LLD๋ฅผ ๋ง์ปค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก rustc์— -Z linker-flavor ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น PR์€ Rustc์— LLD๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ์™ธ๋ถ€ ์‹คํ—˜์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

@binarycrusader ^ gcc ๋Œ€์‹  Solaris์˜ ld๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ—˜์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ LLVM 4.0์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. @japaric , ์ด๊ฒƒ์€ ์ด์ œ ๋ง์ปค ํ’๋ฏธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‹œ์Šคํ…œ ๋ง์ปค์™€ LLD๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋Œ€์กฐํ•˜๋Š” ๋ฐ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@bstrie #40018์ด ๋ช‡ ์ฃผ ์ „์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ฐฉ๋ฅ™ ์ดํ›„๋กœ -Z linker-flavor=ld -C linker=ld.lld ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ LLD ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ง์ปค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. gcc์™€ ๋‹ฌ๋ฆฌ LLD๋Š” ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งํฌํ•˜๋Š” ๊ฒฝ์šฐ -C link-args='-L ...' ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ๋ง์ปค์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

LLVM 4.0์ด ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ LLD๋ฅผ rustc๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์œผ๋กœ MUSL ๋ฐ”์ด๋„ˆ๋ฆฌ ๋˜๋Š” ๋ฒ ์–ด๋ฉ”ํƒˆ ํ”„๋กœ๊ทธ๋žจ ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์™ธ๋ถ€ ๋ง์ปค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ๋ฌธ์ œ์— ๋ถ€๋”ชํž ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๋Œ€์ƒ์— ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋Œ€์ƒ์˜ ๊ฒฝ์šฐ LLD๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ„์น˜๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ์—†์œผ๋ฉด ๊ฐ€์žฅ ์ค‘์š”ํ•œ(๊ณ„์ธต 1) ๋Œ€์ƒ์— ๋Œ€ํ•ด LLD๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@japaric (sysroot ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ์™€ -lc -lpthread crt0.o ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์ง์ ‘ rustc์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฃผ์žฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฒฐ๊ตญ ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ํ‘œ์ค€์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋„๊ตฌ ์ฒด์ธ์˜ ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ์— ํฌํ•จํ•ด์•ผ ํ•˜๋ฉฐ binutils๋Š” ์ด๋Ÿฌํ•œ ์ง€์‹์˜ ์ข‹์€ ํ™ฉ๊ธˆ ์†Œ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋‹จ์ ์€ ๋™์ผํ•œ ํŠธ๋ฆฌํ”Œ์ด ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์‹œ์Šคํ…œ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ๊ฐ–๋Š” ์ƒํ™ฉ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด๋Š” Linux/glibc ํŠธ๋ฆฌํ”Œ์—๋งŒ ํ•ด๋‹น๋˜๋ฉฐ ํŠนํžˆ multilib๊ฐ€ ์žˆ๋Š” ํ”Œ๋žซํผ์—์„œ๋Š” ์ข‹์ง€ ์•Š์Œ). ์ด ๊ฒฝ์šฐ, ๋‚˜๋Š” clang์ด OS ์ด๋ฆ„์„ ์Šค๋ˆ„ํ•‘ํ•˜๊ณ  OS๋ณ„ ๊ทœ์น™์„ ํ•˜๋“œ์ฝ”๋”ฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ข‹์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Linux์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(์‹œ์Šคํ…œ ๋ง์ปค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@retep998 ๋ช‡ ๋‹ฌ ์ „์— lld๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. Linux์—์„œ .exe๋ฅผ ํฌ๋กœ์Šค ์ปดํŒŒ์ผ(ํฌ๋กœ์Šค ๋งํฌ?)ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. lld๋Š” ํ”Œ๋žซํผ ๊ธฐ๋ณธ ํ˜•์‹๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ‹€๋ ธ์œผ๋ฉด ์ข‹๊ฒ ์–ด.

LLD์˜ ๋ฒค์น˜๋งˆํฌ์— ๋”ฐ๋ฅด๋ฉด GNU ld๋ณด๋‹ค ์„ฑ๋Šฅ์ด 10๋ฐฐ ๋” ์šฐ์ˆ˜ํ•˜๊ณ  ์—ฐ๊ฒฐ ์„ฑ๋Šฅ์ด ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ ์†๋„์˜ ํฐ ๊ตฌ์„ฑ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์„ฑ๋Šฅ ๋ฒ„๊ทธ๋กœ ํƒœ๊ทธ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์–ด, ๋ฒค์น˜๋งˆํฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค: https://lld.llvm.org/#performance

(LLVM 5.0์ด ๋ฐฉ๊ธˆ ์ถœ์‹œ๋œ ์ดํ›„ ์˜ค๋Š˜ ๊ด€๋ จ๋จ.)

LLD์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด bfd๋‚˜ gold๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ์ง€๋Š” ์˜๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ €๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์ค‘์š”ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@tpimh ์‹ค์ œ๋กœ I-slow ํƒœ๊ทธ๊ฐ€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฒ„๊ทธ ๋˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ์„ฑ๋Šฅ ๋ฒ„๊ทธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์™„์ „ํžˆ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ›„์ž๋กœ ์˜๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์‹œ๊ฐ„ ๊ฒฝ๊ณผ ์ถœ๋ ฅ ์—ฐ๊ฒฐ์„ ๋ณผ ๋•Œ IME๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ธด ์ƒ์œ„ 3๊ฐœ์˜ ๊ฐ€์žฅ ๊ธด ๋‹จ๊ณ„์— ์žˆ์œผ๋ฏ€๋กœ ์—ฐ๊ฒฐ ์‹œ๊ฐ„์„ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์กฐ์ฐจ ์•„๋งˆ๋„ ํฐ ์Šน๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํŠนํžˆ Servo ๋ฐ rustc์™€ ๊ฐ™์€ ํฐ ๊ฒฝ์šฐ).

@bstrie I-slow๋Š” ๋‚˜์œ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ์œ„ํ•œ

Linux์—์„œ Windows๋กœ์˜ ๊ต์ฐจ ๋งํฌ๋ผ๋Š” ๋ชจํ˜ธํ•œ ์ฃผ์ œ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํฌ์†Œ์‹์ž…๋‹ˆ๋‹ค. ์ด์ „์— lld๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ–ˆ์ง€๋งŒ ์ด๋Š” lld์˜ ld ํ’๋ฏธ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. lld์˜ link.exe ๋ง›(lld-link)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ Rust์˜ ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ์˜ค๋Š˜ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. mingw-w64 CRT์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ .o ๊ฐœ์ฒด ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๋ถ€ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์ €์žฅ์†Œ ์ดˆ๊ธฐํ™”. chkstk๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  2. lld๋Š” MinGW์˜ ์ผ๋ฐ˜์ ์ธ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  lld-link ๋˜๋Š” llvm-dlltool์„ ์‚ฌ์šฉํ•˜์—ฌ .def ํŒŒ์ผ์„ .lib ํŒŒ์ผ๋กœ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. IMPORT_NAME_NOPREFIX๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜๋„๋ก lld๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
    IMPORT_NAME_UNDECORATE, 2๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•ด๋„ .libs๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  4. Rust์˜ seh.rs๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ TYPE_INFO_VTABLE์„ ptr::null()๋กœ ๋ฐ”๊พธ์„ธ์š”. ??_7type_info@@6B@ ๊ธฐํ˜ธ๊ฐ€ MinGW์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Rust๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  5. .cargo/config๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋ž˜ํผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ง์ปค๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ๋ž˜ํผ ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ๋Š” ๋Œ€๋ถ€๋ถ„ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ lld-link๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์กฐ์ •์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    a) ํŒŒ์ผ ์ด๋ฆ„ ๋Œ€์†Œ๋ฌธ์ž ์ˆ˜์ •(์˜ˆ: AdvAPI32.Lib์„ advapi32.lib๋กœ ๋ณ€๊ฒฝ)

    b) Rust๊ฐ€ ์ƒ์„ฑํ•˜๋Š” .def ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ๊ธฐํ˜ธ์— ์ถ”๊ฐ€ ๋ฐ‘์ค„์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

    c) ์ง„์ž…์ (/entry)์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋งน๊ธ€๋ง ๋ฌธ์ œ๋กœ ์ธํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    d) 1๋‹จ๊ณ„์—์„œ ์ปดํŒŒ์ผํ•œ mingw-crt ๊ฐœ์ฒด ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  7. xargo --target=i686-pc-windows-msvc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Rust ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด Rust ์ฝ”๋“œ๋ฅผ ๊ต์ฐจ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rust์˜ SEH ๊ธฐ๋ฐ˜ ํ•ด์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจ๋‹‰์— ๋น ์ง€๊ณ  ํŒจ๋‹‰์„ ์žก์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@iainnicol msvc ๋Œ€์ƒ์„ MinGW ๋น„ํŠธ์™€ ํ˜ผํ•ฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ด์ƒํ•œ ์ˆ˜์ •์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด VC++ ์„ค์น˜์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ชจ๋“  ์ˆ˜์ •์ด๋‚˜ MinGW ๋น„ํŠธ ์—†์ด lld-link๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ธฐ์กด VC++ ์„ค์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜๋Š” ๋ฐ 8์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๊ณ  ์žฌ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ›จ์”ฌ ๋” ์ ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋นŒ๋“œ ๋„๊ตฌ๋Š” ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ํ›จ์”ฌ ๋” ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ MinGW๊ฐ€ ์‹ค์ œ๋กœ MSVC์™€ ํ˜ธํ™˜๋˜๋„๋ก ๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋นŒ๋“œ ๋„๊ตฌ๋Š” ํ›จ์”ฌ ๋” ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ๋ฐฐํฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋“ค๊ณผ ์—ฐ๊ฒฐํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์„ค์น˜ ์•„์นด์ด๋ธŒ๋ฅผ ์ถ”์ถœํ•˜๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ฆ‰, msi ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค: http://landinghub.visualstudio.com/visual-cpp-build-tools

2015 ๋ฐ 2017 ๋ฒ„์ „ ๋ชจ๋‘ exe์ด์ง€๋งŒ ๋‹ค์Œ์„ ํ†ตํ•ด 2017 exe๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•˜๋„๋ก ์„ค๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://docs.microsoft.com/en-us/visualstudio/install/install-vs- ์ผ๊ด€์„ฑ ์—†๋Š” ํ’ˆ์งˆ ๋„คํŠธ์›Œํฌ

Windows์—์„œ ์ด ์ž‘์—…์„ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋จผ์ € Windows SDK ๋˜๋Š” MinGW์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก https://github.com/rust-lang/rust/issues/30027 ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ์—๊ฒŒ ๋‚จ์€ ๊ฒƒ์€ CRT ๋น„ํŠธ๋ฅผ ์šฐ๋ฆฌ์˜ ์ˆœ์ˆ˜ํ•œ Rust ๋ฒ„์ „(์ˆ˜ํ•™/๊ธฐ์–ต ํ•จ์ˆ˜, ์ง„์ž…์ , Rust๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๋น„ํŠธ)์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. Windows ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค! ์ด๊ฒƒ์˜ ๋‹จ์ ์€ C/C++ ์ฝ”๋“œ๋ฅผ ์ •์ ์œผ๋กœ ๋งํฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์ด MinGW ๋˜๋Š” VC++์—์„œ ์ ์ ˆํ•œ CRT์— ๋งํฌํ•˜๋Š” ๋ฐ ๋งค์šฐ ํฌ๊ฒŒ ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  Rust์˜ ์š”์ ์€ Rust์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Linux์—์„œ Windows๋กœ์˜ ๊ต์ฐจ ๋งํฌ๋ผ๋Š” ๋ชจํ˜ธํ•œ ์ฃผ์ œ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํฌ์†Œ์‹์ž…๋‹ˆ๋‹ค. ์ด์ „์— lld๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ–ˆ์ง€๋งŒ ์ด๋Š” lld์˜ ld ํ’๋ฏธ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. lld์˜ link.exe ๋ง›(lld-link)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ld ๋ง›์œผ๋กœ๋„ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://reviews.llvm.org/rL312926

์ƒˆ๋กœ์šด lld์˜ MinGW ํ˜ธํ™˜ ๋“œ๋ผ์ด๋ฒ„๋Š” lld-link ๋ง์ปค์— ๋Œ€ํ•œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ Unix-ish ์˜ต์…˜์„ Windows-ish ์˜ต์…˜์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ lld-link์˜ ์ง„์ž…์ ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๋ž˜ํผ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋ถˆ์™„์ „ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ) MinGW์šฉ Makefile์ด ์ด๋ฏธ ์žˆ์ง€ ์•Š๋Š” ํ•œ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์— ๋Œ€ํ•ด (์•„๋งˆ๋„ ์–ด๋ฆฌ์„์€) ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Windows์—์„œ dllimport๋œ ๋ชจ๋“  ๊ธฐํ˜ธ์—๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์˜ DLL ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. MSVC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ dllimport'ed ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์— ๋Œ€ํ•ด (์•„๋งˆ๋„ ์–ด๋ฆฌ์„์€) ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Windows์—์„œ dllimport๋œ ๋ชจ๋“  ๊ธฐํ˜ธ์—๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์˜ DLL ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. MSVC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ dllimport'ed ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ https://github.com/rust-lang/rust/issues/30027์„ ๊ตฌํ˜„ํ•˜์—ฌ winapi ๊ฐ€ ๋ชจ๋“  ์–ด๋ ค์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ธฐํ˜ธ๊ฐ€ ์„œ์ˆ˜์™€ ๊ฐ™์€ ์—‰๋šฑํ•จ๊ณผ ํ•จ๊ป˜ ์–ด๋–ค DLL์—์„œ ์™”๋Š”์ง€ ์ง€์ •ํ•˜๋Š” ์ž‘์—…. ๋ญ”๊ฐ€๋Š” ์ฝ”๋“œ์—์„œ ๊ฐ€์ ธ ์˜ค๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚˜ ์ฃผ์„์ด๋“ , DLL์˜ ์‹ฌ๋ณผ / ์„œ์ˆ˜์— ๋งํฌ์‹œ์˜ ์‹ฌ๋ณผ ๋งคํ•‘์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://reviews.llvm.org/rL311734 ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ macOS์—์„œ lld๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rustc๋ฅผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋Š” dylib ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/36120 ์„ ๋ถ€ํ™œ์‹œํ‚ค๋Š” ๋ถ„๊ธฐ๊ฐ€ https://github.com/rust-lang/rust/issues/43370์—์„œ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค

@tamird : #43370์ด ํ์‡„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

LLD๊ฐ€ https://github.com/rust-lang/rust/pull/48125 ์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ ํ˜„์žฌ Tier 1 ํ”Œ๋žซํผ(mac, linux, windows)๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด -Z linker-flavor ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MSVC์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

$ RUSTFLAGS='-Z linker-flavor=lld-link' cargo build

Cargo์˜ ์ž์ฒด ๋งํฌ ์‹œ๊ฐ„์„ 2.5์ดˆ์—์„œ 1.5์ดˆ๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค.

@alexcrichton , ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ LLD๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ณ (์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž‘์—…์ด ์†Œ์š”๋ ์ง€์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†์Œ), ์ปดํŒŒ์ผ ์‹œ๊ฐ„/๋Ÿฐํƒ€์ž„ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ LLD๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”Œ๋žซํผ. ํŠนํžˆ ์ฆ๋ถ„ ์ปดํŒŒ์ผ์—์„œ๋Š” ์—ฐ๊ฒฐ ์„ฑ๋Šฅ์ด ๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค ์ค‘์š”ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ์ฆ๋ถ„ ์ปดํŒŒ์ผ์—์„œ๋Š” ์—ฐ๊ฒฐ ์„ฑ๋Šฅ์ด ๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค ์ค‘์š”ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ์„ฑ๋Šฅ์ด ์—ฌ์ „ํžˆ ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ์—์„œ ์ฆ๋ถ„ ์—ฐ๊ฒฐ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/37543

@bstrie ์ €๋Š” ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

๊ทธ๊ฒƒ์ด ์ˆ˜๋ฐ˜ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•ด์„œ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋ฏธ MSVC์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. MinGW/Linux์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๊ณ  OSX์—์„œ๋Š” ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ต์ฐจ ์•„ํ‚คํ…์ฒ˜ ์ง€์›์— ๊ด€ํ•ด์„œ๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— wasm ํ”Œ๋žซํผ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•ด "์•ˆ์ •ํ™”"ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@alexcrichton "์•ˆ์ •ํ™”"๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”? ์™œ ๋‹ค๋ฅธ ์ฃผ์š” ํ”Œ๋žซํผ ๋…น ์ง€์›์— ๋Œ€ํ•ด lld์™€์˜ ์—ฐ๊ฒฐ์„ "์•ˆ์ •ํ™”"ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? (์˜ˆ: macOS์šฉ Linux์—์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ต์ฐจ ์ปดํŒŒ์ผ).

์˜ˆ๋ฅผ ๋“ค์–ด Linux์—์„œ macOS(x86_64-apple-darwin)์šฉ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ต์ฐจ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…์€ xcode sdk๋ฅผ ํš๋“ํ•˜๊ณ  ์ „์ฒด ๋„๊ตฌ ์ฒด์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@cynecx ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค! ๋ณ„๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์€ ๊ฒƒ ์ค‘ ํ•˜๋‚˜. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์— LLD๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ LLD๋ฅผ ์‚ฌ์‹ค์ƒ ์•ˆ์ •ํ™”ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. LLD๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œํ•˜๊ณ  ์ œ๋Œ€๋กœ ๋…ธ์ถœํ•˜๋ ค๋ฉด ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Linux์—์„œ macOS(x86_64-apple-darwin)์šฉ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ต์ฐจ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…์—๋Š” xcode sdk๋ฅผ ํš๋“ํ•˜๊ณ  ์ „์ฒด ๋„๊ตฌ ์ฒด์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

LLD๋Š” ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์žฌ๋ฐฐํฌํ•  ์ˆ˜ ์—†๋Š” ํ—ค๋”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ Xcode SDK๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œํ•˜๋Š” ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ SDK ๋„๊ตฌ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค).

์ด์ œ ์•ผ๊ฐ„์— ๋‚ด์žฅ๋œ LLD์˜ ์ •๋ง ์ข‹์€ ์ ์€ RUSTFLAGS='-Z linker-flavor=ld.lld' cargo build --target x86_64-unknown-linux-musl ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ˆ˜ํ•œ Rust ํ”„๋กœ์ ํŠธ๋ฅผ Windows์—์„œ Linux๋กœ ์‰ฝ๊ฒŒ ๊ต์ฐจ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ Rust๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋Š” Linux ๋จธ์‹ ์„ ์œ„ํ•œ ์ž‘์€ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— wasm ํ”Œ๋žซํผ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•ด "์•ˆ์ •ํ™”"ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rkarp๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ปจํ…Œ์ด๋„ˆํ™”๋œ Linux ์›Œํฌ๋กœ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด x86_64-unknown-linux-musl(๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ์—๋Š” ๊ตฐ๋งˆ)์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ด๋™์€ ์ •๋ง ์ž˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ๊ฐ€๊นŒ์šด ๋…น ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค ๊ณณ. ์‹ค์ œ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ x86_64-unknown-linux-musl์— ๋Œ€ํ•œ LLD๊ฐ€ ์‹ค์ œ๋กœ wasm๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ์ผ๋ฐ˜์ ์œผ๋กœ, ๊ต์ฐจ ๊ตฌ์ถ•์— ๊ด€ํ•ด์„œ๋Š” "๋ชจ๋“  ํ˜ธ์ŠคํŠธ ๋ฐ/๋˜๋Š” ๋ชจ๋“  ๋Œ€์ƒ์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•จ" ์ ‘๊ทผ ๋ฐฉ์‹์ด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ๋ชฉํ‘œ๋ณ„๋กœ ์ด๋ฅผ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ x86_64-unknown-linux-musl ํƒ€๊ฒŸ์— ๋Œ€ํ•œ LLD๋ฅผ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์•ˆ์ •ํ™”ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์— ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์—๋Š” 37๊ฐœ์˜ ์ƒ์ž๊ฐ€ ์žˆ๊ณ  ๋นŒ๋“œ ๋งํฌ๋Š” ์•ฝ 70๊ฐœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ(๋งŽ์€ ํ…Œ์ŠคํŠธ)์ž…๋‹ˆ๋‹ค. ๋น„๊ณผํ•™์ ์œผ๋กœ ( top ) ๋นŒ๋“œ ์‹œ๊ฐ„์˜ ์ ์–ด๋„ ์ ˆ๋ฐ˜์€ ld ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. lld๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์†๋„๊ฐ€ ๋งŽ์ด ๋นจ๋ผ์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ˆ์ •์ ์ธ Rust๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ์•„์ง lld 6.0์„ ์ž‘๋™์‹œํ‚ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@briansmith musl๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด LLD๋ฅผ ํ…Œ์ŠคํŠธํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์ด๋ก ์ƒ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์•ผ ํ•  ์ผ์€ -Z linker-flavor=ld.lld ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋ฉฐ, ์ด๊ฒƒ์ด ๊ทธ๋Ÿด๋“ฏํ•ด ๋ณด์ธ๋‹ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

@rocallahan ํ™•์ธ์„ ์œ„ํ•ด ํ˜„์žฌ ๊ณจ๋“œ ๋ง์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  -Z linker-flavor=ld.lld ์ž‘๋™ํ•˜๊ณ  ๋” ๋น ๋ฅด๋‹ค๋ฉด ์•ˆ์ •ํ™”๋ฅผ ๋ชจ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์–ด๋–ค ํ”Œ๋žซํผ์— ์žˆ์—ˆ๋‚˜์š”?

๋น„๊ณผํ•™์ ์œผ๋กœ(๋ˆˆ๋ถ€์‹  ์ •์ƒ) ๋นŒ๋“œ ์‹œ๊ฐ„์˜ ์ตœ์†Œ ์ ˆ๋ฐ˜์€ ld๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ ๋นŒ๋“œ BTW์šฉ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์€ ํ˜„์žฌ ๊ณจ๋“œ ๋ง์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹œ์ฃ ? (afaik์œผ๋กœ์„œ ํ‘œ์ค€ binutils ๋ง์ปค๋ณด๋‹ค ๋น ๋ฆ„)

์•„๋‹ˆ์š”, ํ‘œ์ค€ GNU ๋ง์ปค์ธ Fedora ์‹œ์Šคํ…œ ๋ง์ปค์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ํ”Œ๋žซํผ์— ์žˆ์—ˆ๋‚˜์š”?

Fedora 27, SSD๊ฐ€ ํƒ‘์žฌ๋œ ์ฟผ๋“œ ์ฝ”์–ด Skylake ๋…ธํŠธ๋ถ. ๋ช‡ ๊ฐ€์ง€ ์„ฑ๋Šฅ ์ˆ˜์น˜๋ฅผ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„ ๊ทธ๋ ‡๊ตฐ์š” ์•Œ์•„๋‘์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค! ๋””๋ฒ„๊ทธ ๋นŒ๋“œ๋Š” ๋ง์ปค ๊ฐœ์„ ๋ณด๋‹ค๋Š” ๋ถ„ํ•  ๋“œ์›Œํ”„(https://github.com/rust-lang/rust/issues/34651)์˜ ๋งํฌ ์‹œ๊ฐ„์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ด๋ฐ ์ •๋ณด์˜ ๊ฒฝ์šฐ ld.gold ๋ฐ ld.lld ๋งˆ์ธ๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋ฉด @rocallahan ?

ํ™•์‹ ํ•˜๋Š”. ๋˜ํ•œ ๋ฌธ์ œ #48762๋Š” Linux ๋””๋ฒ„๊ทธ ๋งํฌ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๋งค์šฐ ๋‚ฎ์€ ๊ฒฐ๊ณผ์ž„์„ ์ƒ๊ธฐ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์‹คํ–‰ ํŒŒ์ผ์—์„œ .debug_pubnames / .debug_pubtypes ์„ ์‚ญ์ œํ•˜๋Š” ํ•ดํ‚น๋œ ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

๋ถ„ํ•  DWARF๋Š” ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผํ‰ํ•  ๊ฒƒ์ด๋‹ค.

@briansmith musl๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด LLD๋ฅผ ํ…Œ์ŠคํŠธํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์ด๋ก ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์€ -Z linker-flavor=ld.lld๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ด ๊ทธ๋Ÿด๋“ฏํ•ด ๋ณด์ธ๋‹ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ฒ˜์Œ์—๋Š” "default"์™€ "only on nightly" ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ง€์ ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -Z ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ LLD๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•˜๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ž‘๋™ํ•˜๋ ค๋ฉด -Z ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ๋นŒ๋“œ์—์„œ.

๊ทธ๋Ÿฌ๋‚˜ ์•ˆ์ •์ ์ธ ๋นŒ๋“œ์—์„œ ์ž‘๋™ํ•˜๋„๋ก -Z๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

RUSTC_BOOTSTRAP=1 RUSTFLAGS="-Z linker-flavor=foo" cargo build ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”์ฒœํ•˜์ง€ ์•Š์œผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ถฉ๋ถ„ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ๋ฌผ์— ์˜์กดํ•œ๋‹ค๋ฉด ์ „์ฒด ์•ˆ์ •์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์š”์ ์„ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋ฉด์„œ ์‚ฌ์‹ค์ƒ ์•ˆ์ •์ ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค =/

๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋กœ, Rust ์ €์žฅ์†Œ ์ž์ฒด์—์„œ rustc_trans ํฌ๋ ˆ์ดํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ 78์ดˆ ๋งํฌ ์‹œ๊ฐ„์—์„œ 1์ดˆ ๋งํฌ ์‹œ๊ฐ„์œผ๋กœ ๊ธ‰๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์„ฑ๋Šฅ์€ ํฌ๋ ˆ์ดํŠธ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋งจ ์•„๋ž˜ ๊ทผ์ฒ˜์— ์žˆ๋Š” ํฌ๋ ˆ์ดํŠธ๋กœ ๊ณต๋ฐฑ์„ ๋ณ€๊ฒฝํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ฟผ๋“œ ์ฝ”์–ด Skylake ๋…ธํŠธ๋ถ, 16GB RAM, rustc 1.24.0, LLD 7.0.0, GNU ld 2.29-13. .debug_pubnames ๋ฐ .debug_pubtypes ๋ฅผ ๋ฒ„๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. LLD๋Š” ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์„ ๋•Œ ๋งค์šฐ ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GNU ID:

real    2m39.138s
user    8m18.992s
sys 1m37.513s

LLD:

real    2m19.164s
user    6m4.477s
sys 0m56.858s

Gold๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ณ  ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ์— ๋ฐฉํ•ด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์ƒ๋‹นํžˆ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. LLD๋Š” ์ข…๋‹จ ๊ฐ„ ์‹œ๊ฐ„์— ๊ทธ๋‹ค์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ๋นŒ๋“œ๊ฐ€ lds๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋งŽ์€ CPU ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.

GNU ld์—์„œ lld๋กœ ์ „ํ™˜ํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ "์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ ๋ฐ ์žฌ๊ตฌ์ถ•" ์ž‘์—… ๋ถ€ํ•˜๊ฐ€ 2.5๋ฐฐ ์ด์ƒ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š” ์‹ค์ œ ์˜ˆ๋Š” #50584๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Er https://github.com/rust-lang/rust/issues/50584#issuecomment -400918647์ด ๋” ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.


LLD๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ชจ๋“  ๋Œ€์ƒ(Windows + Mac + Linux)์—์„œ ์ž‘๋™ํ•˜๋Š” -Z linker-flavor=lld์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์™„๋ฃŒ๋˜๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ด‘๊ณ ํ•˜์—ฌ ํ”ผ๋“œ๋ฐฑ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํƒ€์ด๋ฐ ์ •๋ณด์™€ LLD์— ๋ณด๋‚ผ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ˆœ์กฐ๋กญ๊ฒŒ ์ง„ํ–‰๋œ๋‹ค๋ฉด(์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ง์ปค์—์„œ๋Š” ์˜์‹ฌ์Šค๋Ÿฝ๊ธด ํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ ˆ๋Œ€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค!) ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์„ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด LLD ์„ ํƒ์„ ์•ˆ์ •ํ™”ํ•œ ๋‹ค์Œ Cargo์— ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์ตœ์†Œํ•œ ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก toml.

์ผ๋ถ€ ๋Œ€์ƒ์— ๋Œ€ํ•ด lld๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. https://rust-embedded.github.io/blog/2018-08-2x-psa-cortex-m-breakage/

๋‚˜๋Š” wass๋ฅผ ์œ„ํ•ด ๋˜ํ•œ ๋ฏฟ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” ์™ธ๋ถ€ lld ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•˜๊ณ  rustc ์ž์ฒด์— ๋‚ด์žฅ๋œ ๋‚ด๋ถ€ lld ์ง€์›๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ „์ž๋งŒ?

์ด ๋ฌธ์ œ๋Š” ์™ธ๋ถ€ lld ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•˜๊ณ  rustc ์ž์ฒด์— ๋‚ด์žฅ๋œ ๋‚ด๋ถ€ lld ์ง€์›๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ „์ž๋งŒ?

์™ธ๋ถ€ lld ๋ฐ”์ด๋„ˆ๋ฆฌ, IIUC.

@nnethercote ๋‚ด๋ถ€ ๋ง์ปค ์‚ฌ์šฉ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ณ„๋„๋กœ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด์•ผ ํ•˜๋‚˜์š”?

๋‚ด๋ถ€ ๋ง์ปค ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ PR์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/57514 LLD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LLVM์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ฒ˜์Œ์—๋Š” "๊ธฐ๋ณธ"๊ณผ "์•ผ๊ฐ„ ์ „์šฉ" ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ง€์ ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, -Z์™€ ๊ฐ™์ด LLD๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•˜์ง€๋งŒ ์•ˆ์ •์ ์ธ ๋นŒ๋“œ์—์„œ ์ž‘๋™ํ•˜๋„๋ก -Z๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/56351 ์ถ”๊ฐ€ -C linker-flavor .

์ด ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์„ ์ถ”์ ํ•˜๋ ค๋Š” ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "Microsoft์˜ ๋„๊ตฌ ๋ชจ์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ -msvc ๋Œ€์ƒ์— ๋Œ€ํ•œ LLD์™€ ์—ฐ๊ฒฐ"๊ณผ ๊ฐ™์€ ํŠน์ • ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋‹ซ๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด ๋ฌธ์ œ๋Š” ๋ชจ๋“  ๋Œ€์ƒ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๋ง์ปค๋กœ LLD๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. LLD๋Š” ๋งค์šฐ ๋น ๋ฅด๊ณ  ๋งํฌ ์‹œ๊ฐ„์€ ์ข…์ข… ์ปดํŒŒ์ผ ์‹œ๊ฐ„์˜ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ ์ปดํŒŒ์ผ ์†๋„๋Š” ์˜์›ํ•œ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š” ๊ทธ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

FWIW BMO ์—์„œ macOS ์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๊ฒƒ์€ WONTFIX์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”Œ๋žซํผ์˜ LLD๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด๊ณ  macOS์˜ LLD๊ฐ€ ์ง€์—ฐ๋œ ๊ฐœ๋ฐœ๋กœ ์ธํ•ด ์†์ƒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ“๊ธ€์—์„œ "LLD๋Š” ๋งค์šฐ ๋น ๋ฆ„"๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@briansmith ๋Š” ๋‹ค๋ฅธ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ด ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ์ „์šฉ ๋ฌธ์ œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ ์ด๊ฒƒ์„ ๋‹ซ๋Š” ๋Œ€์‹  ๋ฉ”ํƒ€๋ฒ„๊ทธ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋Œ€์ƒ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ LLD ์ง€์› ์ƒํƒœ์— ๋Œ€ํ•œ ๋ฃจํ”„๋ฅผ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž์œ ๋กญ๊ฒŒ ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

LLD์™€์˜ ์—ฐ๊ฒฐ์ด ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? (Linux์—์„œ) rustc -C linker-flavor=ld.lld hello.rs ๊ฐ€ ์žˆ์ง€๋งŒ ์šด์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” LLD๊ฐ€ ์šฐ๋ฆฌ์˜ LLVM ์‚ฌ๋ณธ๊ณผ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋˜ํ•œ apt๋ฅผ ํ†ตํ•ด LLD๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ rustc๋Š” ์—ฌ์ „ํžˆ ์ˆ˜์ˆ˜๊ป˜๋ผ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ Rust ์ฝ”๋“œ๋กœ LLD๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด ์ทจํ•ด์•ผ ํ•  ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@bstrie -C linker=rust-lld ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™”๋ฌผ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋…น๊ณผ ํ™”๋ฌผ์˜ ์ตœ์‹  ์•ผ๊ฐ„ ๋นŒ๋“œ์—์„œ ๋นˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ํ˜„์žฌ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

$ RUSTFLAGS='-C linker=rust-lld' cargo build
   Compiling rust3 v0.1.0 (/home/carado/tmp/rust3)
error: linking with `rust-lld` failed: exit code: 1
  |
  = note: "rust-lld" "-flavor" "gnu" "-L" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55.2ualxzb8lqn4ho3y.rcgu.o" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55.32vfyq64cfbzv618.rcgu.o" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55.4rbt3m5y8o8cl09t.rcgu.o" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55.ben0932xzwyt64v.rcgu.o" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55.fzsdnygvstiwzxo.rcgu.o" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55.x0rq6ifodcf11zi.rcgu.o" "-o" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55" "/home/carado/tmp/rust3/target/debug/deps/rust3-c4f8c40972021c55.1m259ox4uzrzk583.rcgu.o" "--gc-sections" "-pie" "-zrelro" "-znow" "-L" "/home/carado/tmp/rust3/target/debug/deps" "-L" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "--start-group" "-Bstatic" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-44988553032616b2.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-607feef6be9150b2.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace-a8dbf6d92401e34a.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-9a4716f5e8a3e722.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-988a64d96b043c6d.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-cadd6177b8c6d586.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-8f1d8efc92b45369.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-1e76014677816767.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-cc28bce38cb195d9.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-4123e9e89add689a.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-4d259c17788c1fb5.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-9495dbda85bb8f16.rlib" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-793d0026c575805f.rlib" "--end-group" "/home/carado/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-33c3162edae6574e.rlib" "-Bdynamic" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"
  = note: rust-lld: error: unable to find library -ldl
          rust-lld: error: unable to find library -lrt
          rust-lld: error: unable to find library -lpthread
          rust-lld: error: unable to find library -lgcc_s
          rust-lld: error: unable to find library -lc
          rust-lld: error: unable to find library -lm
          rust-lld: error: unable to find library -lrt
          rust-lld: error: unable to find library -lpthread
          rust-lld: error: unable to find library -lutil
          rust-lld: error: unable to find library -lutil


error: aborting due to previous error

error: Could not compile `rust3`.

To learn more, run the command again with --verbose.

carado์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. "shoehorn" -L /usr/lib ๋ง์ปค ํ˜ธ์ถœ๋กœ ๊ด€๋ฆฌ๋˜์ง€๋งŒ ๋ˆ„๋ฝ๋œ libs ๋ชฉ๋ก์ด libgcc ๋กœ ์‹œ์Šคํ…œ์˜ ์–ด๋””์—๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” -lgcc ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค( libgcc_s.a ) ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ถ€ gnu-ism์˜ ๊ฒฐ๊ณผ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์„ ๊ณ ์น  ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@almindor RUSTFLAGS='-C linker=rust-lld -L /usr/lib -L /usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0' ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. ๊ฒฝ๋กœ๋Š” ๋ฐฐํฌํŒ ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด ์˜๊ฒฌ์ด LLD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ? ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์ด SIGSEGV ์ถฉ๋Œํ•˜๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Reading symbols from target/debug/hello...
(gdb) show directories
Source directories searched: ~/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/etc:$cdir:$cwd
(gdb) r
Starting program: target/debug/hello 

Program received signal SIGSEGV, Segmentation fault.
core::ops::function::FnOnce::call_once{{vtable-shim}} () at /rustc/a7f28678bbf4e16893bb6a718e427504167a9494/src/libcore/ops/function.rs:231
(gdb) l
226     #[stable(feature = "fn_once_output", since = "1.12.0")]
227     type Output;
228 
229     /// Performs the call operation.
230     #[unstable(feature = "fn_traits", issue = "29625")]
231     extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
232 }
233 
234 mod impls {
235     #[stable(feature = "rust1", since = "1.0.0")] 
(gdb) info reg
rax            0x0                 0
rbx            0x0                 0
rcx            0x0                 0
rdx            0x0                 0
rsi            0x0                 0
rdi            0x0                 0
rbp            0x0                 0x0
rsp            0x7fffffffddb0      0x7fffffffddb0
r8             0x0                 0
r9             0x0                 0
r10            0x0                 0
r11            0x0                 0
r12            0x0                 0
r13            0x0                 0
r14            0x0                 0
r15            0x0                 0
rip            0x7ffff7ffc000      0x7ffff7ffc000 <core::ops::function::FnOnce::call_once{{vtable-shim}}>
eflags         0x10202             [ IF RF ]
cs             0x33                51
ss             0x2b                43
ds             0x0                 0
es             0x0                 0
fs             0x0                 0
gs             0x0                 0
(gdb) disassemble 
Dump of assembler code for function core::ops::function::FnOnce::call_once{{vtable-shim}}:
=> 0x00007ffff7ffc000 <+0>: mov    (%rdi),%rax
   0x00007ffff7ffc003 <+3>: mov    (%rax),%rdi
   0x00007ffff7ffc006 <+6>: jmpq   *0x11d4(%rip)        # 0x7ffff7ffd1e0
End of assembler dump.

์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ GCC 9 ๋˜๋Š” Clang์„ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋งˆ๋ฒ•์˜ ์ฃผ๋ฌธ์€ RUSTFLAGS="-C link-arg=-fuse-ld=lld" cargo build ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” -C linker=clang ๋Š” GCC ๋ฒ„์ „์— ๊ด€๊ณ„์—†์ด ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ ํ˜ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜๊ตฌ์ ์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ํŠน์ • ํ”„๋กœ์ ํŠธ์˜ ~/.cargo/config ๋˜๋Š” .cargo/config ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[build]
rustflags = ["-C", "linker=clang"]
# rustflags = ["-C", "link-arg=-fuse-ld=lld"]

@lnicola๋Š” GCC 9 ๋˜๋Š” Clang์„ CC๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@bstrie ์ด๊ฑฐ ํ˜„์žฌ ์ƒํ™ฉ์ด ์–ด๋–ค์ง€ ์•„์„ธ์š”? ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ์š”์†Œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@mati865 ์˜ค๋ž˜๋œ GCC๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋Œ€์ฒด ํ˜ธ์ถœ์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

@lnicola ๋‚ด ๋ชจ๋“  ํ”Œ๋žซํผ์—๋Š” Clang + GCC 9๊ฐ€ ์žˆ์œผ๋ฉฐ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@jonhoo ๋‚˜๋Š” ์ด ๋ถ„์•ผ์˜ ์–ด๋–ค ์ผ์—๋„ ๋’ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ปดํŒŒ์ผ๋Ÿฌ ํŒ€์— ๋ฌผ์–ด๋ณด๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒ€์— ํƒœ๊ทธ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๋“ค์—๊ฒŒ๋„ ๊ณผ๋„ํ•œ ์†Œ์Œ์„ ์ผ์œผํ‚ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋ถ„๋ฅ˜; @rust-lang/compiler ์ด ๋ฌธ์ œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

LLD๊ฐ€ Rust์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด ํ”Œ๋žซํผ ๋ฐ ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํŠน์ • ๋ฒ„์ „์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ์กฐ์–ธ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ์‚ฌ๋žŒ๋“ค์„ ์—ฌ์ „ํžˆ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์— ๊ฒŒ์‹œํ•œ ๋ช…๋ น์€ GCC 9.2.0 ๋ฐ LLD 9.0.0์ด ์„ค์น˜๋œ Linux์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ Windows์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ -fuse=lld๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” Windows์šฉ GCC 9๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ฒŒ์‹œ๋œ ์ผ๋ถ€ ๋งํฌ์— ๋”ฐ๋ฅด๋ฉด MacOS์—์„œ๋Š” ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

LLD๊ฐ€ Rust์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด ํ”Œ๋žซํผ ๋ฐ ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํŠน์ • ๋ฒ„์ „์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ์กฐ์–ธ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ์‚ฌ๋žŒ๋“ค์„ ์—ฌ์ „ํžˆ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์–‘์ด /etc/system-release
Fedora ๋ฆด๋ฆฌ์Šค 30(์„œ๋ฅธ)

์ฐธ์กฐ --๋ฒ„์ „
CC(GCC) 9.2.1 20190827(๋ ˆ๋“œํ–‡ 9.2.1-1)

ld.lld --๋ฒ„์ „
LLD 8.0.0(GNU ๋ง์ปค์™€ ํ˜ธํ™˜)

์ด๊ฒƒ์ด ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ -fuse=lld๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” Windows์šฉ GCC 9๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

@lnicola
Windows GCC 9 ๋นŒ๋“œ๋Š” -fuse-ld=lld ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(์ง€์›ํ•˜์ง€ ์•Š๋„๋ก ํŒจ์น˜๋˜์—ˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ง€์›ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?).
rust-mingw ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์„ค์น˜๋˜์—ˆ๊ณ  ๋ง์ปค๊ฐ€ .cargo/config ์—์„œ ์žฌ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ Rustc๋Š” ์‹œ์Šคํ…œ ๋Œ€์‹  GCC 6์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Windows์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” LLD 9 ๋ฐ ์ด์ „ ๋ฒ„์ „์ด ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ง์ปค ํ”Œ๋ž˜๊ทธ --enable-long-section-names ์ž…๋‹ˆ๋‹ค(ํ–ฅํ›„ ์ง€์›ํ•  ๊ณ„ํš ์žˆ์Œ). ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ž˜ํผ ์ƒ์„ฑ
  • ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ no-op์œผ๋กœ ํ—ˆ์šฉํ•˜๋„๋ก LLD๋ฅผ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒจ์น˜๋œ ๋กœ์ปฌ Rust ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Windows์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” LLD 9 ๋ฐ ์ด์ „ ๋ฒ„์ „์ด ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ง์ปค ํ”Œ๋ž˜๊ทธ --enable-long-section-names์ž…๋‹ˆ๋‹ค(ํ–ฅํ›„ ์ง€์›ํ•  ๊ณ„ํš ์žˆ์Œ).

์ด ๋ถ€๋ถ„์€ https://github.com/rust-lang/rust/pull/66257์— ์˜ํ•ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Windows-gnu ์‚ฌ์šฉ์ž๋Š” -fuse-ld=lld ๋ฅผ ์ง€์›ํ•˜๋Š” C ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ์ˆ˜๋™ ์ž‘์—…์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@bstrie : ์ด๊ฒƒ์€ Windows-MSVC์˜ Stable ๋ฐ Nightly์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด gamedev-wg ๋ฌธ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ: https://github.com/rust-gamedev/wg/issues/50

๋˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ: rustc ์ž์ฒด๋ฅผ ๋นŒ๋“œํ•  ๋•Œ RUSTFLAGS="-C link-arg=-fuse-ld=lld" ํ•˜๋ฉด ๋น ๋ฅธ 14์ฝ”์–ด Linux ์ƒ์ž์—์„œ ์—ฐ๊ฒฐ ์‹œ๊ฐ„์ด 93์ดˆ์—์„œ 41์ดˆ๋กœ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.

@nnethercote : ์„ค์ • ๋‹ค๋ฅด์ง€๋Š” linker=lld (์˜ˆ๋ฅผ ๋“ค์–ด)์„์— [target.x86_64-unknown-linux-gnu] ์˜ ๋‹จ๋ฉด config.toml ?

@Aaron1011 : ๋‚ด ์ถ”์ธก์œผ๋กœ๋Š” ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ์ง์ ‘ ํ™•์ธํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@Aaron1011 ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/39915#issuecomment -538049306์„ ์ฐธ์กฐ

@mati865
LLD๋ฅผ ๋ง์ปค๋กœ ์‚ฌ์šฉํ•˜์—ฌ x86_64-pc-windows-gnu ์— rustc ๋นŒ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๊นŒ?

์˜ค๋Š˜ ์‹œ๋„ํ–ˆ๋Š”๋ฐ LLD๊ฐ€ ๋นŒ๋“œ ์ค‘๊ฐ„์— ๋ฉˆ์ถ”๊ณ  ์ž‘์—…์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ unknown argument: --version-script=... ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.
LLD๊ฐ€ LLVM ์—ฐ๊ฒฐ์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

[llvm]
use-linker = "lld"

๋„๊ตฌ ๋ฒ„์ „:

$ ld.lld --version
LLD 9.0.1 (https://github.com/msys2/MINGW-packages.git 5e3b8820ed9f04221affee4197e458aca2612e87) (compatible with GNU linkers)

$ gcc --version
gcc.exe (Rev2, Built by MSYS2 project) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

@petrochenkov ์˜ˆ, ๋ช‡ ๊ฐ€์ง€ ํ•ดํ‚น์œผ๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • LLD COFF ๋ฐฑ์—”๋“œ๋Š” ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ LD์™€ LLD๋Š” ๋ชจ๋‘ MSVC ์Šคํƒ€์ผ .def ํŒŒ์ผ์—์„œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•˜๊ธฐ ์‰ฌ์šด
  • LLD๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ lib (UNIX ์„ธ๊ณ„์˜ ํ‘œ์ค€)๋กœ ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ๋“  Rust๋Š” ๋ชจ๋“  windows-* ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค: https://github.com/rust-lang/ ๋…น/๋ธ”๋กญ/9ebf47851a357faa4cd97f4b1dc7835f6376e639/src/libstd/sys/windows/env.rs#L4
    LD๋Š” ์–ด๋Š ์ชฝ์ด๋“  ์ƒ๊ด€ํ•˜์ง€ ์•Š์œผ๋ฉฐ LLD ๋˜๋Š” Rust ์ธก์„ ๋ˆŒ๋Ÿฌ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋ฏธ๋ž˜ ๊ฐ€๋Šฅ์„ฑ์„ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ตฌํ˜„ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€๋งŒ, ์ด๊ฒƒ์ด Rust ๊ฐœ๋ฐœ์˜ ์˜ค๋žœ ๊ณ ์ถฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ์™ธ๋ถ€์—์„œ ์ œ๊ณตํ•˜๋Š” lld๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  Rustc ๋‚ด์—์„œ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋นŒ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฅผ ํ†ตํ•ด Rustc ์ž์ฒด์— ๋” ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ๊ธฐ๋ณธ ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋ฉฐ ๋ฏธ๋ž˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.
  • ๋ง์ปค ๋ช…๋ น์œผ๋กœ lld์— ๋งŽ์€ ๊ฒฝ๋กœ ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ๊ฐ€์ƒ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜ํ–‰ํ•  ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋””์Šคํฌ IO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์˜ ๋””์Šคํฌ IO๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋ง์ปค ๋ช…๋ น์œผ๋กœ lld์— ๋งŽ์€ ๊ฒฝ๋กœ ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ๊ฐ€์ƒ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜ํ–‰ํ•  ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋””์Šคํฌ IO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์˜ ๋””์Šคํฌ IO๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

IO ๋Œ€์—ญํญ์˜ ๋ฌธ์ œ๋งŒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Windows์™€ ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ, ํŠนํžˆ Windows Defender๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์ž‘์—…ํ•˜๋ ค๋Š” ๊ฐ ํŒŒ์ผ์€ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„ ํŒจ๋„ํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Rust์˜ codegen ๋‹จ์œ„ ๋ชจ๋ธ์€ ํฌ๋ ˆ์ดํŠธ๊ฐ€ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ž‘์€ ๊ฐœ์ฒด ํŒŒ์ผ๋กœ ๋ถ„ํ• ๋˜์–ด ๋งŽ์€ ์ปดํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ์Œ“์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ.

์ด ๋ฒ„๊ทธ๋Š” ์•ฝ๊ฐ„ ์—‰๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์„ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ํ˜„์žฌ ์ƒํ™ฉ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์š”์•ฝ์— ์ตœ์„ ์„ ๋‹คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

lld ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‘ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋ฐ”๋žŒ์งํ•œ llvm ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€์ธ ๋ง์ปค:

  • ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์— ๋งค์šฐ ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ž„๋ฒ ๋””๋“œ ๋Œ€์ƒ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค).
  • ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค(์ข…์ข… Gold์˜ ์ ˆ๋ฐ˜ ์‹œ๊ฐ„์œผ๋กœ ์‹คํ–‰ -- ์—ฐ๊ฒฐ์€ ํฐ ํ”„๋กœ์ ํŠธ(rustc, ์„œ๋ณด ๋“ฑ)์˜ ๊ฒฝ์šฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฐ๊ฒฐ์€ ์ฆ๋ถ„ ๋นŒ๋“œ๋กœ ์ปดํŒŒ์ผ์˜ ์—„์ฒญ๋‚œ %๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋Ÿฐํƒ€์ž„์„ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์€ ํฐ ๊ฑฐ๋ž˜.)

์˜ค๋Š˜๋‚  Rust๊ฐ€ lld๋กœ ํ•˜๋Š” ์ผ

  • Rust๋Š” ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋žซํผ์—์„œ ์ž์ฒด์ ์ธ lld ๋ณต์‚ฌ๋ณธ์„ rust-lld๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Rust-lld๋Š” ๋งŽ์€ ๋ฒ ์–ด ๋ฉ”ํƒˆ ํƒ€๊ฒŸ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Rust-lld๋Š” wasm์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • (?) "-C linker-flavor"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rust-lld๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ๊ณณ(์˜ˆ: ๋ฐ์Šคํฌํƒ‘ linux/mac/windows)์—์„œ rust-lld๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋ฌธ์ œ

  • lld์šฉ macOS(Mach-O) ๋ฐฑ์—”๋“œ๊ฐ€ ์ค‘๋‹จ๋˜์–ด ์ค‘๋‹จ๋จ

    • ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์“ฐ๊ธฐ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์ง€๋งŒ ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  • linux/unix ํ”Œ๋žซํผ์—์„œ๋Š” ld/lld๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ c ์ปดํŒŒ์ผ๋Ÿฌ(์˜ˆ: gcc)๋ฅผ ํ†ตํ•ด ๋ง์ปค๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฑ…์ž„์€ crt1.o์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ๊ธฐํ˜ธ๋ฅผ ์ฐพ์•„ ld์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ "๊ทธ๋ƒฅ" Rust-lld๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ gcc/clang/๋ฌด์—‡์ด๋“  ๊ณต๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ์ด ์‹œ์Šคํ…œ ๊ธฐํ˜ธ ๋…ผ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ง์ปค๋ฅผ ๊ฒฝ๋กœ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์—†์œผ๋ฉฐ C ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ์— "ld"๋กœ ์‚ฝ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋˜๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "ld.lld"๋กœ ์‚ฝ์ž…ํ•˜๊ณ  "-fuse-ld=lld"๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.



      • ์ด๊ฒƒ์€ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ lld๋Š” "ld" ๋˜๋Š” "ld.lld"๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ clang ์Šคํƒ€์ผ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฆ„ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์กฐ์‚ฌ ํ•„์š”)


      • ๋ถˆํ–‰ํžˆ๋„ -fuse-ld=lld๋Š” GCC 9์˜ ์ผ๋ถ€์ผ ๋ฟ์ด๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋Šฅ/๋ฒ„์ „ ๊ฐ์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(clang์€ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค)



  • ์ฐฝ - MSVC๋Š” ์ข‹์€ ๋ชจ์–‘ ๋ถ„๋ช…ํžˆํ•˜๊ณ , ๋ฐฑ์—”๋“œ์— ๋…น LLD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์ œํ•œ๋œ ์ง€์›์„ ๊ฐ–๊ณ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”,ํ•˜์ง€๋งŒ ๋‚œ ์—ฌ๊ธฐ์—ํ•ด์•ผํ•  ์ผ๋“ค์— ๋Œ€ํ•œ ๋ถˆ๋ถ„๋ช… ํ•ด์š”.
  • windows-mingw๋Š” ๊ณ ๋Œ€ GCC๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” linux/unix์™€ ๊ฑฐ์˜ ๊ฐ™์€ ์œ„์น˜์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  pseudo-windows-linux๊ฐ€ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋œ ๊ตฌ์„ฑ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ lld๋Š” ์ตœ์‹  ๋ฒ„์ „์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ OS์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ณณ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ž„์˜์˜ ํ˜ธํ™˜ ๋ฒ„๊ทธ๊ฐ€ ๊ฑฐ์˜ ํ™•์‹คํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ (rust-)lld๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ๋ฉ”ํƒ€๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

  • #71515 - x64 Ubuntu 20.04 LTS(๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ๋Š” ๋ชจ๋“  x64 ELF ํ”Œ๋žซํผ)
  • #71520 - x64 MSVC ์ฐฝ

windows-msvc๋Š” ์ƒํƒœ๊ฐ€ ์–‘ํ˜ธํ•˜๊ณ  ๋ฐฑ์—”๋“œ์—์„œ rust-lld ์‚ฌ์šฉ์„ ์ œํ•œ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

LLD + windows-msvc ์ƒํƒœ๊ฐ€ ์ƒ๋‹นํžˆ ์–‘ํ˜ธํ•˜๋ฉฐ ํ˜„์žฌ rustc ๊ฐœ๋ฐœ์— ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

lld-link ํ•„์š”ํ•œ ๋ชจ๋“  ์ง€์›์€ rustc ๋ฐฑ์—”๋“œ์— ์žˆ์ง€๋งŒ https://github.com/rust-lang/rust/issues/68647 ๊ณผ ๊ฐ™์€ ๋ฒ„๊ทธ๊ฐ€

  • ์ด๊ฒƒ์€ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ lld๋Š” "ld" ๋˜๋Š” "ld.lld"๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ clang ์Šคํƒ€์ผ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฆ„ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์กฐ์‚ฌ ํ•„์š”)

ํ•˜์ง€๋งŒ ld์™€ ld.lld๋Š” ๊ฐ™์€ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค: https://github.com/rust-lang/llvm-project/blob/rustc/10.0-2020-02-05/lld/tools/lld/lld. cpp (8.0-2019-01-16๋ถ€ํ„ฐ ๋™์ผ)

  • ๋ถˆํ–‰ํžˆ๋„ -fuse-ld=lld๋Š” GCC 9์˜ ์ผ๋ถ€์ผ ๋ฟ์ด๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋Šฅ/๋ฒ„์ „ ๊ฐ์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(clang์€ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค)

ld.lld๋Š” ld์™€ ๋™์ผํ•˜๊ณ  https://patches-gcc.linaro.org/patch/11148/ ์— ๋”ฐ๋ฅด๋ฉด -fuse-ld=lld์˜ ์œ ์ผํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ld ๋Œ€์‹  ld.lld๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” PATH ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ gcc 9+๋กœ ์ž ๊ทธ๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋น„์•ˆ ์•ˆ์ • ๋ฒ„์ „์€ 8.3๋งŒ ์žˆ๊ณ  ๋ถˆ์Šค์•„์ด๋Š” ์•„๋งˆ๋„ 2021๋…„๊นŒ์ง€ ์ถœ์‹œ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • windows-mingw๋Š” ๊ณ ๋Œ€ GCC๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” linux/unix์™€ ๊ฑฐ์˜ ๊ฐ™์€ ์œ„์น˜์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  pseudo-windows-linux๊ฐ€ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋œ ๊ตฌ์„ฑ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค.

mingw-w64 6.0.0(2018-09-16 ์ถœ์‹œ)์—๋Š” gcc 8.3.0์ด ์žˆ์œผ๋ฉฐ -fuse-ld=lld๊ฐ€ ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ์ƒˆ๋กญ์Šต๋‹ˆ๋‹ค. mingw-w64 7.0.0(2019-11-11 ๋ฆด๋ฆฌ์Šค)์—๋Š” -fuse-ld=lld๊ฐ€ ์žˆ๋Š” gcc 9.3.0์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ๋น„์•ˆ ๋ฒ„์Šคํ„ฐ(์•ˆ์ •)๋Š” 6.0.0์ด๊ณ  ๋ถˆ์Šค์•„์ด(ํ…Œ์ŠคํŠธ)๋Š” 7.0.0์ž…๋‹ˆ๋‹ค. ๋ฐ๋น„์•ˆ ์ŠคํŠธ๋ ˆ์น˜(oldstable)์—๋Š” gcc 6.3.0์ด ํฌํ•จ๋œ 5.0.1๋งŒ ์žˆ์ง€๋งŒ, gcc 6.3์— ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ lld ์ง€์›์„ ์œ„ํ•ด ์ตœ์‹  ๋ฐ๋น„์•ˆ ์•ˆ์ •์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‘ ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ (rust-)lld๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ๋ฉ”ํƒ€๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

  • #71515 - x64 Ubuntu 20.04 LTS(๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ๋Š” ๋ชจ๋“  x64 ELF ํ”Œ๋žซํผ)
  • #71520 - x64 MSVC ์ฐฝ

lld์˜ macOS(Mach-O) ํฌํŠธ ์ •๋ณด: https://github.com/rust-lang/rust/issues/39915#issuecomment -618726211 ์ดํ›„๋กœ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ํ›จ์”ฌ ๋” ๋‚˜์€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์ด LLVM ์ปค๋ฐ‹์„ ์‚ฌ์šฉํ•˜์—ฌ lld ๋นŒ๋“œํ•˜๊ณ  tokio-rs/tracing์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ๋ณ„ ๋ง์ปค๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ nightly-x86_64-apple-darwin ์— ๋Œ€ํ•œ ์ถ”์ ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋””๋ฒ„๊ทธ) ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ํŠนํžˆ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

  • ld ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊นจ๋—ํ•œ cargo build ์— 35์ดˆ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.
  • lld ๋กœ ๊นจ๋—ํ•œ cargo build ๋Š” 20์ดˆ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ :

@davidbarsky ๋ฉ‹์ง€๋‹ค! ํ˜ธ๊ธฐ์‹ฌ์— ๊ทธ ์„ฑ๋Šฅ์„ zld ์™€ ๋น„๊ตํ•˜๋ฉด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ( https://github.com/michaeleisel/zld )

๋˜ํ•œ ์—ด์„ ๊ณ ๋ ค ํ–ˆ์Šต๋‹ˆ๊นŒ? MBP๋Š” ํŠนํžˆ ๊ธฐ๋ณธ ํŒฌ ์†๋„ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์—ด ์กฐ์ ˆ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ๊ธฐ๋ฅผ ํ•˜๊ธฐ ์ „์— ๊ฒฝ์ฒฉ ๊ทผ์ฒ˜์— ์žˆ๋Š” ๊ธฐ๊ณ„ ๋ฐ”๋‹ฅ์ด ๋งŒ์กŒ์„ ๋•Œ ์‹์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Ubuntu 16 i686์—์„œ ๊ทธ๋Ÿฐ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰