diff options
| author | Mateusz Mikuła <oss@mateuszmikula.dev> | 2025-08-23 18:26:11 +0200 |
|---|---|---|
| committer | Mateusz Mikuła <oss@mateuszmikula.dev> | 2025-08-24 18:19:31 +0200 |
| commit | b1be775dd67b2b9a871f6e7076d7d2f2c7f1c8ee (patch) | |
| tree | 9ff9e417c76503ee9250bac0ff8db227cee8f840 /compiler/rustc_codegen_ssa/src/back | |
| parent | 8df154bffddcb6bbb543ad69aff971795c5adbc2 (diff) | |
| download | rust-b1be775dd67b2b9a871f6e7076d7d2f2c7f1c8ee.tar.gz rust-b1be775dd67b2b9a871f6e7076d7d2f2c7f1c8ee.zip | |
raw-dylib-elf: set correct `DT_VERDEFNUM`
Previously it indicated a single version, regardless of their count. Observed in: https://github.com/davidlattimore/wild/pull/1041
Diffstat (limited to 'compiler/rustc_codegen_ssa/src/back')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/back/link/raw_dylib.rs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/link/raw_dylib.rs b/compiler/rustc_codegen_ssa/src/back/link/raw_dylib.rs index b9e0c957363..509168b2cd2 100644 --- a/compiler/rustc_codegen_ssa/src/back/link/raw_dylib.rs +++ b/compiler/rustc_codegen_ssa/src/back/link/raw_dylib.rs @@ -307,11 +307,14 @@ fn create_elf_raw_dylib_stub(sess: &Session, soname: &str, symbols: &[DllImport] stub.reserve_section_headers(); stub.reserve_dynsym(); stub.reserve_dynstr(); + let verdef_count = 1 + vers.len(); + let mut dynamic_entries = 2; // DT_SONAME, DT_NULL if !vers.is_empty() { stub.reserve_gnu_versym(); - stub.reserve_gnu_verdef(1 + vers.len(), 1 + vers.len()); + stub.reserve_gnu_verdef(verdef_count, verdef_count); + dynamic_entries += 1; // DT_VERDEFNUM } - stub.reserve_dynamic(2); // DT_SONAME, DT_NULL + stub.reserve_dynamic(dynamic_entries); // First write the ELF header with the arch information. let e_machine = match (arch, sub_arch) { @@ -443,9 +446,13 @@ fn create_elf_raw_dylib_stub(sess: &Session, soname: &str, symbols: &[DllImport] // .dynamic // the DT_SONAME will be used by the linker to populate DT_NEEDED // which the loader uses to find the library. - // DT_NULL terminates the .dynamic table. stub.write_align_dynamic(); stub.write_dynamic_string(elf::DT_SONAME, soname); + // LSB section "2.7. Symbol Versioning" requires `DT_VERDEFNUM` to be reliable. + if verdef_count > 1 { + stub.write_dynamic(elf::DT_VERDEFNUM, verdef_count as u64); + } + // DT_NULL terminates the .dynamic table. stub.write_dynamic(elf::DT_NULL, 0); stub_buf |
