Repository navigation
Mangle personality symbol - #148413
Mangle personality symbol#148413
Conversation
|
Some changes occurred in compiler/rustc_codegen_ssa |
This comment has been minimized.
This comment has been minimized.
|
re: LLVM version-detection, do you mean |
This comment was marked as resolved.
This comment was marked as resolved.
LLVM needs to figure out the type of EH personality for various reasons. To do this, it currently matches against a hardcoded list of names. In Rust, we would like to mangle our personality function to better support linking multiple Rust standard libraries via staticlib. We have currently mangled all symbols except the personality, which remains unmangled because of this LLVM hardcoding. Instead, this now does a suffix match of the personality name, which will work with the mangling scheme used for these internal symbols (e.g. `_RNvCseCSg29WUqSe_7___rustc12___rust_alloc`). Companion Rust PR: rust-lang/rust#148413
…efix (#166095) LLVM needs to figure out the type of EH personality for various reasons. To do this, it currently matches against a hardcoded list of names. In Rust, we would like to mangle our personality function to better support linking multiple Rust standard libraries via staticlib. We have currently mangled all symbols except the personality, which remains unmangled because of this LLVM hardcoding. Instead, this now does a suffix match of the personality name, which will work with the mangling scheme used for these internal symbols (e.g. `_RNvCseCSg29WUqSe_7___rustc12___rust_alloc`). Companion Rust PR: rust-lang/rust#148413
f98da1c to
9ea88e3
Compare
This comment has been minimized.
This comment has been minimized.
9ea88e3 to
15d0368
Compare
78ccd7b to
e9c966b
Compare
This comment has been minimized.
This comment has been minimized.
e9c966b to
ee860b6
Compare
This comment has been minimized.
This comment has been minimized.
ee860b6 to
a74a260
Compare
This comment has been minimized.
This comment has been minimized.
a74a260 to
f0f210f
Compare
87fa7bb to
2233d39
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
|
This overall LGTM, however I cannot know of things that I should check or pay attention to (since it is not my expertise), so rerolling @rustbot reroll |
|
Can this theoretically break some stable |
|
Yes it can. Such code has been using unstable implementation details either way. We would just start requiring that the no_std projects acknowledge this. In any case if you are compiling for a no_std target, then the standard library would already be compiled with panic=abort and no personality function would be needed unless you use |
|
@bors r+ |
…uwer Rollup of 14 pull requests Successful merges: - #163132 (Test panics and wasm32-wasip3 in CI, not wasip1) - #164314 (Abby: use a smallvec for `And`/`Or` constraints) - #148413 (Mangle personality symbol) - #163688 (Add aarch64-unknown-qtee as a tier 3 target) - #164076 (Fix ICE when move expressions reference out-of-scope local bindings) - #164327 ([coff] Symbol renaming stored the original name, not the undecorated name) - #162432 (Improve diagnostics for non-well-formed associated items) - #164138 (cg_llvm: Use a callback to enforce scoped lifetimes in ModuleLlvm ) - #164210 (`incomplete` -> `unstable` for delegation feature) - #164225 (Point at assoc item for trait that needs to be implemented) - #164278 (Output remapped paths in rustdoc JSON with the `documentation` scope) - #164308 (format abby dsl errors better) - #164335 (expand and document tool attribute shadowing test) - #164342 (Use regular type parsing for argument-position const parameters)
Rollup merge of #148413 - Noratrieb:mangle-rust-eh-personality, r=petrochenkov Mangle personality symbol Previously, std-internal symbols (like `__rust_alloc` or `rust_panic`) were changed to now be mangled via a v0 scheme with the compiler version hash (`_RNvCs4CIB29Id3dw_7___rustc10rust_panic`) to make it possible to have multiple staticlibs (as long as they have different version hashes) in the same program without symbol conflicts. But the personality function remained unmangled, because LLVM hardcodes that name. I made a change in LLVM llvm/llvm-project#166095 that makes LLVM now check the suffix instead of an exact match, so we can mangle the personality function with this scheme. This removes the last completely unmangled symbol from Rust staticlibs! (though the mangling is still quite weak, so it's still not as nice as it would ideally be). Before, on a trivial staticlib: ``` readelf -s liblib.a | rg GLOBAL | rg -v " UND | HIDDEN " | rg -v ' _ZN' 8: 0000000000000000 5 FUNC GLOBAL DEFAULT 3 _RNvCseCSg29WUqSe_7___rustc12___rust_alloc 10: 0000000000000000 5 FUNC GLOBAL DEFAULT 5 _RNvCseCSg29WUqSe_7___rustc14___rust_dealloc 12: 0000000000000000 5 FUNC GLOBAL DEFAULT 7 _RNvCseCSg29WUqSe_7___rustc14___rust_realloc 14: 0000000000000000 5 FUNC GLOBAL DEFAULT 9 _RNvCseCSg29WUqSe_7___rustc19___rust_alloc_zeroed 16: 0000000000000000 3 FUNC GLOBAL DEFAULT 11 _RNvCseCSg29WUqSe_7___rustc42___rust_alloc_error_handler_should_panic_v2 17: 0000000000000000 1 FUNC GLOBAL DEFAULT 12 _RNvCseCSg29WUqSe_7___rustc35___rust_no_alloc_shim_is_unstable_v2 3383: 0000000000000000 111 FUNC GLOBAL DEFAULT 5 _RNvCseCSg29WUqSe_7___rustc10rust_panic 3387: 0000000000000000 93 FUNC GLOBAL DEFAULT 7 _RNvCseCSg29WUqSe_7___rustc11___rdl_alloc 3390: 0000000000000000 10 FUNC GLOBAL DEFAULT 9 _RNvCseCSg29WUqSe_7___rustc12___rust_abort 3391: 0000000000000000 6 FUNC GLOBAL DEFAULT 11 _RNvCseCSg29WUqSe_7___rustc13___rdl_dealloc 3393: 0000000000000000 167 FUNC GLOBAL DEFAULT 13 _RNvCseCSg29WUqSe_7___rustc13___rdl_realloc 3396: 0000000000000000 203 FUNC GLOBAL DEFAULT 15 _RNvCseCSg29WUqSe_7___rustc17___rust_drop_panic 3399: 0000000000000000 29 FUNC GLOBAL DEFAULT 18 _RNvCseCSg29WUqSe_7___rustc17rust_begin_unwind 3401: 0000000000000000 140 FUNC GLOBAL DEFAULT 20 _RNvCseCSg29WUqSe_7___rustc18___rdl_alloc_zeroed 3404: 0000000000000000 203 FUNC GLOBAL DEFAULT 22 _RNvCseCSg29WUqSe_7___rustc24___rust_foreign_exception 3405: 0000000000000000 19 FUNC GLOBAL DEFAULT 25 _RNvCseCSg29WUqSe_7___rustc26___rust_alloc_error_handler 4410: 0000000000000000 1471 FUNC GLOBAL DEFAULT 2752 rust_eh_personality 25: 0000000000000000 161 FUNC GLOBAL DEFAULT 5 _RNvCseCSg29WUqSe_7___rustc18___rust_start_panic 32: 0000000000000000 82 FUNC GLOBAL DEFAULT 8 _RNvCseCSg29WUqSe_7___rustc20___rust_panic_cleanup 249: 0000000000000000 182 FUNC GLOBAL DEFAULT 5 _RNvCseCSg29WUqSe_7___rustc25___rdl_alloc_error_handler 3: 0000000000000000 57 FUNC GLOBAL DEFAULT 3 _RNvCseCSg29WUqSe_7___rustc17___rust_probestack ``` After: ``` 8: 0000000000000000 5 FUNC GLOBAL DEFAULT 3 _RNvCs4CIB29Id3dw_7___rustc12___rust_alloc 10: 0000000000000000 5 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc14___rust_dealloc 12: 0000000000000000 5 FUNC GLOBAL DEFAULT 7 _RNvCs4CIB29Id3dw_7___rustc14___rust_realloc 14: 0000000000000000 5 FUNC GLOBAL DEFAULT 9 _RNvCs4CIB29Id3dw_7___rustc19___rust_alloc_zeroed 16: 0000000000000000 3 FUNC GLOBAL DEFAULT 11 _RNvCs4CIB29Id3dw_7___rustc42___rust_alloc_error_handler_should_panic_v2 17: 0000000000000000 1 FUNC GLOBAL DEFAULT 12 _RNvCs4CIB29Id3dw_7___rustc35___rust_no_alloc_shim_is_unstable_v2 422: 0000000000000000 19 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc26___rust_alloc_error_handler 429: 0000000000000000 308 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc19rust_eh_personality 349: 0000000000000000 10 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc12___rust_abort 164: 0000000000000000 93 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc11___rdl_alloc 167: 0000000000000000 11 FUNC GLOBAL DEFAULT 7 _RNvCs4CIB29Id3dw_7___rustc13___rdl_dealloc 169: 0000000000000000 167 FUNC GLOBAL DEFAULT 9 _RNvCs4CIB29Id3dw_7___rustc13___rdl_realloc 172: 0000000000000000 140 FUNC GLOBAL DEFAULT 11 _RNvCs4CIB29Id3dw_7___rustc18___rdl_alloc_zeroed 688: 0000000000000000 106 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc10rust_panic 693: 0000000000000000 207 FUNC GLOBAL DEFAULT 7 _RNvCs4CIB29Id3dw_7___rustc17___rust_drop_panic 696: 0000000000000000 29 FUNC GLOBAL DEFAULT 10 _RNvCs4CIB29Id3dw_7___rustc17rust_begin_unwind 698: 0000000000000000 207 FUNC GLOBAL DEFAULT 12 _RNvCs4CIB29Id3dw_7___rustc24___rust_foreign_exception 26: 0000000000000000 161 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc18___rust_start_panic 33: 0000000000000000 82 FUNC GLOBAL DEFAULT 8 _RNvCs4CIB29Id3dw_7___rustc20___rust_panic_cleanup 88: 0000000000000000 182 FUNC GLOBAL DEFAULT 5 _RNvCs4CIB29Id3dw_7___rustc25___rdl_alloc_error_handler 3: 0000000000000000 57 FUNC GLOBAL DEFAULT 3 _RNvCs4CIB29Id3dw_7___rustc17___rust_probestack ``` r? bjorn3
Since rust-lang/rust#148413 (in nightly 2026-10-16) the compiler mangles the personality symbol like the other std-internal symbols, so the pre-built `core`/`alloc` now reference `__rustc::rust_eh_personality` and the `#[no_mangle] extern "C" fn rust_eh_personality()` in no_std_test no longer satisfies the linker: error: linking with `cc` failed = note: Undefined symbols for architecture arm64: "__RNvCs6EUDi8WbMwz_7___rustc19rust_eh_personality" Every NoStdBuild job has failed with this since that nightly, on every branch. Declare the function as `#[lang = "eh_personality"]` instead (with `#![feature(lang_items)]`), the shape rust-lang/rust's own no_std binary fixture (tests/run-make/no-alloc-shim/foo.rs) moved to in that PR. The compiler then emits the symbol under whatever name it expects, so this builds on the nightlies before and after the change. The routine is still never called: every profile sets `panic = "abort"`. Built with nightly 2026-10-16 (fails without this change) and nightly 2026-10-09 (builds either way), `--profile unix` and `--profile macos`.
…uwer Rollup of 14 pull requests Successful merges: - rust-lang/rust#163132 (Test panics and wasm32-wasip3 in CI, not wasip1) - rust-lang/rust#164314 (Abby: use a smallvec for `And`/`Or` constraints) - rust-lang/rust#148413 (Mangle personality symbol) - rust-lang/rust#163688 (Add aarch64-unknown-qtee as a tier 3 target) - rust-lang/rust#164076 (Fix ICE when move expressions reference out-of-scope local bindings) - rust-lang/rust#164327 ([coff] Symbol renaming stored the original name, not the undecorated name) - rust-lang/rust#162432 (Improve diagnostics for non-well-formed associated items) - rust-lang/rust#164138 (cg_llvm: Use a callback to enforce scoped lifetimes in ModuleLlvm ) - rust-lang/rust#164210 (`incomplete` -> `unstable` for delegation feature) - rust-lang/rust#164225 (Point at assoc item for trait that needs to be implemented) - rust-lang/rust#164278 (Output remapped paths in rustdoc JSON with the `documentation` scope) - rust-lang/rust#164308 (format abby dsl errors better) - rust-lang/rust#164335 (expand and document tool attribute shadowing test) - rust-lang/rust#164342 (Use regular type parsing for argument-position const parameters)
…uwer Rollup of 14 pull requests Successful merges: - rust-lang/rust#163132 (Test panics and wasm32-wasip3 in CI, not wasip1) - rust-lang/rust#164314 (Abby: use a smallvec for `And`/`Or` constraints) - rust-lang/rust#148413 (Mangle personality symbol) - rust-lang/rust#163688 (Add aarch64-unknown-qtee as a tier 3 target) - rust-lang/rust#164076 (Fix ICE when move expressions reference out-of-scope local bindings) - rust-lang/rust#164327 ([coff] Symbol renaming stored the original name, not the undecorated name) - rust-lang/rust#162432 (Improve diagnostics for non-well-formed associated items) - rust-lang/rust#164138 (cg_llvm: Use a callback to enforce scoped lifetimes in ModuleLlvm ) - rust-lang/rust#164210 (`incomplete` -> `unstable` for delegation feature) - rust-lang/rust#164225 (Point at assoc item for trait that needs to be implemented) - rust-lang/rust#164278 (Output remapped paths in rustdoc JSON with the `documentation` scope) - rust-lang/rust#164308 (format abby dsl errors better) - rust-lang/rust#164335 (expand and document tool attribute shadowing test) - rust-lang/rust#164342 (Use regular type parsing for argument-position const parameters)
…uwer Rollup of 14 pull requests Successful merges: - rust-lang/rust#163132 (Test panics and wasm32-wasip3 in CI, not wasip1) - rust-lang/rust#164314 (Abby: use a smallvec for `And`/`Or` constraints) - rust-lang/rust#148413 (Mangle personality symbol) - rust-lang/rust#163688 (Add aarch64-unknown-qtee as a tier 3 target) - rust-lang/rust#164076 (Fix ICE when move expressions reference out-of-scope local bindings) - rust-lang/rust#164327 ([coff] Symbol renaming stored the original name, not the undecorated name) - rust-lang/rust#162432 (Improve diagnostics for non-well-formed associated items) - rust-lang/rust#164138 (cg_llvm: Use a callback to enforce scoped lifetimes in ModuleLlvm ) - rust-lang/rust#164210 (`incomplete` -> `unstable` for delegation feature) - rust-lang/rust#164225 (Point at assoc item for trait that needs to be implemented) - rust-lang/rust#164278 (Output remapped paths in rustdoc JSON with the `documentation` scope) - rust-lang/rust#164308 (format abby dsl errors better) - rust-lang/rust#164335 (expand and document tool attribute shadowing test) - rust-lang/rust#164342 (Use regular type parsing for argument-position const parameters)
View all comments
Previously, std-internal symbols (like
__rust_allocorrust_panic) were changed to now be mangled via a v0 scheme with the compiler version hash (_RNvCs4CIB29Id3dw_7___rustc10rust_panic) to make it possible to have multiple staticlibs (as long as they have different version hashes) in the same program without symbol conflicts. But the personality function remained unmangled, because LLVM hardcodes that name.I made a change in LLVM llvm/llvm-project#166095 that makes LLVM now check the suffix instead of an exact match, so we can mangle the personality function with this scheme.
This removes the last completely unmangled symbol from Rust staticlibs! (though the mangling is still quite weak, so it's still not as nice as it would ideally be).
Before, on a trivial staticlib:
After:
r? bjorn3