Wild version 0.11.0 released
Wild 0.11.0 공개: Wasm 기본 지원과 링커 스크립트 확장
Rust로 작성한 링커 Wild 0.11.0이 Wasm 기능을 기본 활성화하고 GNU 링커 스크립트와 Mach-O 지원을 넓혔습니다. Linux 커널 모듈 링크가 가능해졌으며, 기본 스레드 수를 32개로 제한해 Linux 파일시스템의 inode 뮤텍스 경합을 줄입니다.
- 주제
에디터 노트
Wild의 호환성 확장은 GNU 링커 스크립트와 Wasm, Mach-O라는 서로 다른 영역에서 실제 기능으로 확인됩니다. 특히 커널 모듈 링크 지원은 스크립트 문법을 더 처리한다는 수준을 넘어 구체적인 사용 사례를 제시합니다. 다만 Linux 커널 전체 링크는 아직 완료된 기능이 아니며 Wasm 디버그 정보도 지원하지 않습니다. 성능 개선과 회귀를 함께 기록한 점도 이 릴리스의 범위를 잘 보여줍니다. 기본 스레드 제한은 Linux inode 뮤텍스 경합을 줄이려는 선택이고, COMDAT의 정확한 처리는 심볼 해석을 느리게 합니다. MaskRay는 파일시스템과 커널을 살피는 I/O 최적화 방식에도 우려를 표했지만, 릴리스 노트는 최적화의 적용 조건별 성능 수치를 제시하지 않습니다. GNU 옵션 확장이 실제 호환성을 넓히는지, 드물게 쓰이는 옵션까지 추가하는지에 관한 댓글의 비판은 이 수치와 사용 사례가 공개될 때 더 구체적으로 판단할 수 있습니다.
AI 요약
Wild 0.11.0은 여러 플랫폼과 입력 형식으로 포팅 작업을 넓힌 릴리스입니다. Wasm 지원을 기본 활성화해 Wasm 바이너리를 링크할 수 있지만 디버그 정보는 아직 지원하지 않습니다. GNU 링커 스크립트 구문을 확장해 Linux 커널 모듈 링크가 가능해졌고 Linux 커널 자체도 링크할 수 있는 단계에 가까워졌습니다. macOS 포트는 Wild 자체를 링크할 수 있으며, 유지보수자 한 명은 Rust 개발용 기본 링커로 사용하고 있습니다. 다만 macOS 포트는 기본 활성화할 만큼 준비되지는 않았습니다.
GNU 링크와 플랫폼 지원
링커 스크립트에서 FILEHDR와 PHDRS 명령, 섹션 속성, 복합 대입 연산자와 ASSERT 식을 처리합니다. 위치 카운터에서 심볼 값을 조회하고 정의할 수 있으며, 정렬 식과 최대 2^21 정렬도 지원합니다. LDEMULATION 환경 변수와 --image-base, --orphan-handling, --only-keep-debug 등 GNU ld 호환 옵션도 추가했습니다. AArch64에서는 ADRP+ADD를 NOP+ADR로 완화하고 Cortex-A53 erratum 수정 옵션을 구현했습니다. ppc64le 동적 호출에는 eager PLT stub을 추가합니다.
Mach-O 포트는 임의 세그먼트와 동적 심볼 내보내기, 최소 dylib 출력, -framework, -exported_symbols_list 등을 지원합니다. TLV(Thread Local Variable) 접근 완화와 재배치 수정도 포함합니다. Wasm 링커는 함수와 데이터, 전역 변수, 가져온 항목의 GC를 지원하며 shared memory와 TLS, 메모리 내보내기, --whole-archive, --strip-debug 같은 옵션을 처리합니다. 디버그 정보는 출력 바이너리에 연결할 수 있지만 Wasm 링크에서 디버그 정보 지원은 아직 제한되어 있습니다.
성능과 호환성
아카이브 멤버의 열기와 파싱, 부분 링크 단계, 종료 시 입력 매핑 해제를 병렬화했습니다. ext4와 xfs에서는 fallocate와 huge pages를 사용하고, 충분히 새 커널을 쓰는 Btrfs에서는 mmap을 활성화합니다. 다만 모든 파일시스템에 huge pages를 기본 적용하는 최적화와 같은 I/O 경로는 환경별 차이가 있을 수 있습니다. Linux의 inode별 뮤텍스 경합 때문에 스레드가 많을수록 성능이 나빠지는 경우를 줄이려고 기본 스레드 수를 최대 32개로 제한했습니다. --threads로 직접 지정하면 이 제한을 바꿀 수 있습니다. COMDAT 그룹을 제대로 처리하도록 바꾸면서 심볼 해석은 일부 느려졌습니다. 벤치마크에는 파일시스템 종류와 출력 파일의 기존 존재 여부를 포함했습니다.
그 밖에 RISC-V 완화 과정과 디버그 재배치, ELF TLS, LTO, 심볼 내보내기와 관련한 수정이 들어갔습니다. 빌드에 필요한 최소 Rust 버전은 1.99.0입니다.
Lobsters 반응
- @patchunwrap — 새 규칙에서는 코드 저장소 제출을 허용하지 않는다고 해서 이 글이 규칙에 어긋나는지 조금 확신이 없습니다. 프로그래밍 중심 커뮤니티에서 이상해 보일 수 있지만 저노력 자기 홍보 게시물을 대거 없앨 수 있습니다. 새 코드베이스에 바로 들어가면 독자가 무엇이 새롭거나 이야기할 가치가 있는지 알아볼 만큼 해당 분야 경험이 있어야 하므로 토론이 시작되지 않습니다. 코드베이스가 왜 만들어졌는지, 어떤 목적을 맡는지, 어떤 어려움을 해결했는지, 생태계에 왜 쓸모 있는지 설명하는 글에 더 관심이 있습니다. 프로젝트 저장소 대신 릴리스 페이지를 연결했으니 괜찮다고 생각합니다. macOS 개발자의 개발 경험을 개선할 수 있으니 주제에도 맞는다고 봅니다.
- @pervognsen — 관리자가 뭐라고 할지 궁금합니다. Wild가 하는 일을 좋아하지만 코드 저장소 금지 규칙이 있다면 저장소 첫 페이지든 릴리스 노트든 링크 위치가 중요한지 모르겠습니다. 직관적으로 둘 다 허용하거나 둘 다 허용하지 않는 편이 맞아 보입니다. 새 정책을 이해한 바로는 둘 다 허용하지 않는 쪽입니다. 저장소의 릴리스 노트와 블로그 게시물 링크 사이에 본질적인 차이를 찾기 어렵지만 규칙이 그렇게 정해질 수도 있습니다.
- @gnyeki — 릴리스 노트는 주제에 맞는다고 이해했습니다. 활성화된 릴리스 태그가 있고 릴리스 노트가 저장소 첫 페이지보다 집중된 토론에 더 많은 맥락을 줍니다.
- @pervognsen — 감사합니다. 집중된 토론을 위한 맥락이라는 설명이 설득력 있고 정책 변경 취지와도 맞는 것 같습니다.
- @Wilfred — 개선 사항이 인상적입니다. 링커 스크립트 옵션이 늘고 GNU 플래그와 일부 아키텍처 지원도 좋아졌습니다. 소프트웨어 툴체인에서 가장 오래된 구성 요소 중 하나인 링커가 2026년에도 큰 엔지니어링 프로젝트라는 점이 흥미롭습니다. 소프트웨어는 완성되는 법이 없습니다.
- @fzakaria — 링커는 복잡합니다. 대규모 바이너리를 만드는 일을 공식적으로 약 1년 해왔는데 기술적인 부분이 많은 것을 알려줬습니다. 이번 주 관련 주제로 발표합니다.
- @MaskRay — 흥미로운 업데이트가 많습니다. COMDAT 섹션 그룹 지원은 lld, mold, Wild의 성능 비교를 더 공정하게 만드는 큰 추가 기능입니다. 다만 심볼 해석을 상당히 느리게 합니다. 세 링커가 일부 예외 사례에서 서로 다른 COMDAT 승자를 고르는 것 같지만 실제로는 받아들일 만한 차이라고 봅니다. I/O 최적화를 위해 호스트 커널과 파일시스템을 조사하는 방식은 아쉽습니다. GNU ld에서 거의 쓰이지 않는 LDEMULATION과 --error-execstack 같은 기능 구현도 아쉽습니다. 요청자는 어떤 옵션이 중요한지 모를 수 있고 LLM이 만든 링커 비교표에 이끌려 요청했을 가능성도 있습니다. 몇 년 전 mold에서도 Gentoo Linux 패키지를 모두 빌드해도 거의 필요하지 않은 옵션이 구현되는 비슷한 경향을 봤습니다. Rui Ueyama가 lld/ELF를 유지보수하던 때라면 거절했을 것 같습니다.
원문: Wild GitHub 릴리스 노트 / 번역·요약: Trawling