From 47e08b1f0328036590ea0b8b445b7d49dfe1de5e Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Thu, 6 Aug 2020 21:11:39 +0100 Subject: [PATCH] Set DT_SONAME when building dylibs Forwarded: no In Rust, library filenames include a version-specific hash to help the run-time linker find the correct version. Unlike in C/C++, the compiler looks for all libraries matching a glob that ignores the hash and reads embedded metadata to work out versions, etc. The upshot is that there is no need for the usual "libfoo.so -> libfoo-1.2.3.so" symlink common with C/C++ when building with Rust, and no need to communicate an alternate filename to use at run-time vs compile time. If linking to a Rust dylib from C/C++ however, a "libfoo.so -> libfoo-$hash.so" symlink may well be useful and in this case DT_SONAME=libfoo-$hash.so would be required. More mundanely, various tools (eg: dpkg-shlibdeps) complain if they don't find DT_SONAME on shared libraries in public directories. This patch passes -Wl,-soname=$outfile when building dylibs (and using a GNU linker). Gbp-Pq: Name d-add-soname.patch --- src/librustc_codegen_ssa/back/link.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs index dcce1d4529..8de8720800 100644 --- a/src/librustc_codegen_ssa/back/link.rs +++ b/src/librustc_codegen_ssa/back/link.rs @@ -1623,6 +1623,13 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>( // OBJECT-FILES-NO, AUDIT-ORDER add_rpath_args(cmd, sess, codegen_results, out_filename); + if (crate_type == config::CrateType::Dylib || crate_type == config::CrateType::Cdylib) + && sess.target.target.options.linker_is_gnu { + let filename = String::from(out_filename.file_name().unwrap().to_str().unwrap()); + let soname = [String::from("-Wl,-soname=") + &filename]; + cmd.args(&soname); + } + // OBJECT-FILES-MAYBE, CUSTOMIZATION-POINT add_user_defined_link_args(cmd, sess, codegen_results); -- 2.30.2