[Rust] 1.97.0 업데이트 발표 (번역)

[원본 링크]

https://blog.rust-lang.org/2026/07/09/Rust-1.97.0

러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.

만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.

rustup update stable

rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.

미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.

버그를 발견했다면 리포트해주세요!




1.97.0 stable에는 무엇이 있나요?


Symbol Mangling v0가 디폴트로 활성화됨

Rust는 오브젝트 파일과 실행 파일을 생성할 때, 각 항목(함수, 정적 변수 등)에 대해 전역적으로 고유한 심볼 이름을 부여해야 합니다.
이렇게 해야 여러 파일을 링크할 때 이름 충돌이 발생하지 않기 때문이죠

이를 위해 Rust는 원래의 이름을 mangling해서 모듈 path, crate, 제네릭 정보 등과 같은 추가 문맥을 포함한 새로운 심볼 이름을 만듭니다.
지금까지는 이 변환에 Itanium ABI라는 ABI를 사용했고, 이 ABI는 C++에서도 경우에 따라 호환됐습니다.

이 새로운 mangling 방식은 기존 방식의 여러 문제점을 해결합니다.

  1. 제네릭 타입의 구체화 값이 단순히 hash 뒤에 숨겨지는 것이 아니라, 실제 값이 심볼 이름에 보존됩니다.
  2. 구현이 일관되지 않았던 문제가 해결됩니다. 이전에는 모든 parts가 Itanium ABI를 사용하는 것이 아니었기 때문에, 별도의 Rust 전용 demangler가 여전히 필요했습니다.

Rust 1.59부터는 -Csymbol-mangling-version=v0 옵션을 사용하여 Rust 전용 mangling 방식(v0) 을 선택할 수 있었습니다.

그리고 2025년 11월부터는 이 방식이 nightly 버전에서 기본값으로 사용되기 시작했으며, Rust 1.97부터는 stable 버전에서도 기본으로 활성화됩니다.

기존의 legacy mangling 방식은 이제 nightly에서만 사용할 수 있으며, 앞으로는 완전히 제거될 예정입니다.

이에 대한 더 자세한 내용은 이전 블로그 글을 참고해주세요.



Cargo에서 warning을 오류로 처리하는 기능 지원

CI 환경에서는 warning을 오류로 간주하여 빌드를 실패시키는 것이 일반적인 관행입니다.
지금까지는 보통 RUSTFLAGS=-Dwarnings를 설정하는 방식으로 이를 구현했습니다.

Rust 1.97부터는 Cargo가 경고가 빌드 성공 여부에 어떤 영향을 미칠지를 직접 제어합니다. 경고는 다음 세 가지 방식으로 처리할 수 있습니다.

  1. allow: 경고를 표시하지 않습니다.
  2. warn(기본값): 경고를 출력하지만 빌드는 실패하지 않습니다.
  3. deny: 경고를 오류로 간주하여 빌드를 실패시킵니다.

이 기능은 Cargo의 설정으로 동작을 제어하기 때문에, 설정을 변경하더라도 기존 빌드 캐시가 무효화되지 않습니다. 따라서 필요할 때만 손쉽게 동작을 변경할 수 있습니다.

예를 들어, 리팩터링 후 발생한 오류를 수정하는 과정에서 경고가 너무 많아 방해가 된다면, 메세지들을 일시적으로 숨길 수 있습니다.
이렇게요.
CARGO_BUILD_WARNINGS=allow cargo check

반대로 CI 환경에서는 다음과 같이 경고를 오류로 처리할 수 있습니다.
CARGO_BUILD_WARNINGS=deny

그리고 이 설정은 --keep-going 옵션과 함께 사용할 수 있습니다. 그러면 첫 번째 실패한 패키지에서 즉시 중단하지 않고, 프로젝트 전체의 모든 오류와 경고를 수집하여 한 번에 확인할 수 있습니다.

이에 대한 자세한 내용은 공식 문서를 참고해주세요.



이제 링커 출력이 숨겨지지 않습니다

rustc는 사용자 대신 linker를 실행합니다. 지금까지는 링크 작업이 성공적으로 완료되면, rustc가 링커의 출력 메시지를 숨기는 것이 기본 설정이었습니다.

이러한 동작은 실제 문제를 가릴 수 있다는 단점이 있었습니다. 따라서 Rust 1.97부터는 링커가 출력하는 메시지가 기본적으로 표시됩니다.

이런 메시지는 warning lint 형태로 출력됩니다. 예를 들면 다음과 같습니다.

warning: linker stderr: ignoring deprecated linker optimization setting '1'
** |**
** = note: #[warn(linker_messages)] on by default**

rustc는 오탐(false positive)으로 확인되었거나 의도된 동작으로 인해 발생하는 일반적인 링커 메시지는 미리 필터링하여 출력하지 않습니다.

실제로 nightly 버전에서 더 이상 링커 출력을 숨기지 않도록 변경한 이후, 이러한 출력 덕분에 여러 결함을 발견하고 수정했습니다.

현재 linker_messages는 특수한 lint로 취급되며, 일반적인 warnings lint 그룹의 영향을 받지 않습니다. 이는 의도적인 설계입니다.
rustc는 링커의 출력을 완전히 제어할 수 없고, 일부 링커 메시지는 특정 플랫폼에서만 나타나는 경우도 흔하기 때문입니다.

만약 출력된 링커의 메시지가 불필요한 오탐이라고 판단된다면, 이슈를 등록해 주세요.

불필요한 경고를 숨기기를 원한다면 linker_messages lint의 수준을 allow로 설정할 수 있습니다.
예를 들어 Cargo.toml에 다음과 같이 lints 섹션을 추가하여 설정할 수 있습니다.

[lints.rust]
linker_messages = "allow"




Stable이 된 API

Default for RepeatN
Copy for ffi::FromBytesUntilNulError
Send for std::fs::File on UEFI
<{integer}>::isolate_highest_one
<{integer}>::isolate_lowest_one
<{integer}>::highest_one
<{integer}>::lowest_one
<{uN}>::bit_width
NonZero<{integer}>::isolate_highest_one
NonZero<{integer}>::isolate_lowest_one
NonZero<{integer}>::highest_one
NonZero<{integer}>::lowest_one
NonZero<{uN}>::bit_width

다음의 API들은 이제 const context에서 사용 가능합니다.

char::is_control




기타 변경점

이외의 모든 변경사항은 각 Rust, Cargo, Clippy 페이지를 확인하세요




1.97.0의 컨트리뷰터들에게

1.97.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.

고마워요!