Skip to content

Commit 92bf516

Browse files
authored
Rollup merge of #145820 - mati865:raw-elf-verdefnum, r=bjorn3
raw-dylib-elf: set correct `DT_VERDEFNUM` Previously it indicated a single version, regardless of their count. Observed in: davidlattimore/wild#1041
2 parents 0bc1024 + b1be775 commit 92bf516

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

compiler/rustc_codegen_ssa/src/back/link/raw_dylib.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,11 +307,14 @@ fn create_elf_raw_dylib_stub(sess: &Session, soname: &str, symbols: &[DllImport]
307307
stub.reserve_section_headers();
308308
stub.reserve_dynsym();
309309
stub.reserve_dynstr();
310+
let verdef_count = 1 + vers.len();
311+
let mut dynamic_entries = 2; // DT_SONAME, DT_NULL
310312
if !vers.is_empty() {
311313
stub.reserve_gnu_versym();
312-
stub.reserve_gnu_verdef(1 + vers.len(), 1 + vers.len());
314+
stub.reserve_gnu_verdef(verdef_count, verdef_count);
315+
dynamic_entries += 1; // DT_VERDEFNUM
313316
}
314-
stub.reserve_dynamic(2); // DT_SONAME, DT_NULL
317+
stub.reserve_dynamic(dynamic_entries);
315318

316319
// First write the ELF header with the arch information.
317320
let e_machine = match (arch, sub_arch) {
@@ -443,9 +446,13 @@ fn create_elf_raw_dylib_stub(sess: &Session, soname: &str, symbols: &[DllImport]
443446
// .dynamic
444447
// the DT_SONAME will be used by the linker to populate DT_NEEDED
445448
// which the loader uses to find the library.
446-
// DT_NULL terminates the .dynamic table.
447449
stub.write_align_dynamic();
448450
stub.write_dynamic_string(elf::DT_SONAME, soname);
451+
// LSB section "2.7. Symbol Versioning" requires `DT_VERDEFNUM` to be reliable.
452+
if verdef_count > 1 {
453+
stub.write_dynamic(elf::DT_VERDEFNUM, verdef_count as u64);
454+
}
455+
// DT_NULL terminates the .dynamic table.
449456
stub.write_dynamic(elf::DT_NULL, 0);
450457

451458
stub_buf

0 commit comments

Comments
 (0)