From 594e4c0b0a1bcfa4c75c0d8167ace98e86c57734 Mon Sep 17 00:00:00 2001 From: binarycat Date: Sun, 28 Jul 2024 14:04:55 -0400 Subject: [PATCH 1/3] port tests/run-make/extern-fn-reachable to rmake uses helper functions added in #128147, must not be merged before that PR. --- .../src/external_deps/rustc.rs | 5 ++++ src/tools/run-make-support/src/symbols.rs | 26 +++++++++++++++++++ .../tidy/src/allowed_run_make_makefiles.txt | 1 - tests/run-make/extern-fn-reachable/Makefile | 26 ------------------- tests/run-make/extern-fn-reachable/rmake.rs | 7 +++++ 5 files changed, 38 insertions(+), 27 deletions(-) delete mode 100644 tests/run-make/extern-fn-reachable/Makefile create mode 100644 tests/run-make/extern-fn-reachable/rmake.rs diff --git a/src/tools/run-make-support/src/external_deps/rustc.rs b/src/tools/run-make-support/src/external_deps/rustc.rs index 71d28dd9675fb..584aa1191465f 100644 --- a/src/tools/run-make-support/src/external_deps/rustc.rs +++ b/src/tools/run-make-support/src/external_deps/rustc.rs @@ -193,6 +193,11 @@ impl Rustc { self } + /// Make `rustc` prefere dynamic linking + pub fn prefer_dynamic(&mut self) -> &mut Self { + self.arg("-Cprefer-dynamic") + } + /// Specify directory path used for profile generation pub fn profile_generate>(&mut self, path: P) -> &mut Self { let mut arg = OsString::new(); diff --git a/src/tools/run-make-support/src/symbols.rs b/src/tools/run-make-support/src/symbols.rs index fd0c866bcc927..4ac74f9014f19 100644 --- a/src/tools/run-make-support/src/symbols.rs +++ b/src/tools/run-make-support/src/symbols.rs @@ -42,3 +42,29 @@ pub fn any_symbol_contains(path: impl AsRef, substrings: &[&str]) -> bool false }) } + +/// Check if an object file contains *all* of the given symbols. +/// +/// The symbol names must match exactly. +/// +/// Panics if `path` is not a valid object file readable by the current user. +pub fn contains_exact_symbols(path: impl AsRef, symbol_names: &[&str]) -> bool { + let mut found = vec![false; symbol_names.len()]; + with_symbol_iter(path, |syms| { + for sym in syms { + for (i, symbol_name) in symbol_names.iter().enumerate() { + found[i] |= sym.name_bytes().unwrap() == symbol_name.as_bytes(); + } + } + }); + let result = found.iter().all(|x| *x); + if !result { + eprintln!("does not contain symbol(s): "); + for i in 0..found.len() { + if !found[i] { + eprintln!("* {}", symbol_names[i]); + } + } + } + result +} diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt index a7c8df3e27478..bd6963e491c42 100644 --- a/src/tools/tidy/src/allowed_run_make_makefiles.txt +++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt @@ -8,7 +8,6 @@ run-make/dep-info-doesnt-run-much/Makefile run-make/dep-info-spaces/Makefile run-make/dep-info/Makefile run-make/emit-to-stdout/Makefile -run-make/extern-fn-reachable/Makefile run-make/foreign-double-unwind/Makefile run-make/foreign-exceptions/Makefile run-make/incr-add-rust-src-component/Makefile diff --git a/tests/run-make/extern-fn-reachable/Makefile b/tests/run-make/extern-fn-reachable/Makefile deleted file mode 100644 index 3297251bfd1aa..0000000000000 --- a/tests/run-make/extern-fn-reachable/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# ignore-cross-compile -include ../tools.mk - -# ignore-windows-msvc - -NM=nm -D - -ifeq ($(UNAME),Darwin) -NM=nm -gU -endif - -ifdef IS_WINDOWS -NM=nm -g -endif - -# This overrides the LD_LIBRARY_PATH for RUN -TARGET_RPATH_DIR:=$(TARGET_RPATH_DIR):$(TMPDIR) - -all: - $(RUSTC) dylib.rs -o $(TMPDIR)/libdylib.so -C prefer-dynamic - - [ "$$($(NM) $(TMPDIR)/libdylib.so | grep -v __imp_ | grep -c fun1)" -eq "1" ] - [ "$$($(NM) $(TMPDIR)/libdylib.so | grep -v __imp_ | grep -c fun2)" -eq "1" ] - [ "$$($(NM) $(TMPDIR)/libdylib.so | grep -v __imp_ | grep -c fun3)" -eq "1" ] - [ "$$($(NM) $(TMPDIR)/libdylib.so | grep -v __imp_ | grep -c fun4)" -eq "1" ] - [ "$$($(NM) $(TMPDIR)/libdylib.so | grep -v __imp_ | grep -c fun5)" -eq "1" ] diff --git a/tests/run-make/extern-fn-reachable/rmake.rs b/tests/run-make/extern-fn-reachable/rmake.rs new file mode 100644 index 0000000000000..c9c822f01150f --- /dev/null +++ b/tests/run-make/extern-fn-reachable/rmake.rs @@ -0,0 +1,7 @@ +//@ ignore-cross-compile +use run_make_support::{rustc, symbols::contains_exact_symbols}; + +fn main() { + rustc().input("dylib.rs").output("dylib.so").prefer_dynamic().run(); + assert!(contains_exact_symbols("dylib.so", &["fun1", "fun2", "fun3", "fun4", "fun5"])); +} From 3d7de9fbd4cdb7e043e95f3adb23147acb5af804 Mon Sep 17 00:00:00 2001 From: binarycat Date: Fri, 2 Aug 2024 12:11:02 -0400 Subject: [PATCH 2/3] fmt --- tests/run-make/extern-fn-reachable/rmake.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/run-make/extern-fn-reachable/rmake.rs b/tests/run-make/extern-fn-reachable/rmake.rs index c9c822f01150f..1a37909368566 100644 --- a/tests/run-make/extern-fn-reachable/rmake.rs +++ b/tests/run-make/extern-fn-reachable/rmake.rs @@ -1,5 +1,6 @@ //@ ignore-cross-compile -use run_make_support::{rustc, symbols::contains_exact_symbols}; +use run_make_support::rustc; +use run_make_support::symbols::contains_exact_symbols; fn main() { rustc().input("dylib.rs").output("dylib.so").prefer_dynamic().run(); From 9c8f0c7b0a73852d2144abfd3e0c1dc676385873 Mon Sep 17 00:00:00 2001 From: binarycat Date: Fri, 2 Aug 2024 15:20:10 -0400 Subject: [PATCH 3/3] Migrate `symbol-mangling-hashed` to rmake --- .../src/external_deps/rustc.rs | 7 +++ src/tools/run-make-support/src/symbols.rs | 11 +++- .../tidy/src/allowed_run_make_makefiles.txt | 1 - .../run-make/symbol-mangling-hashed/Makefile | 48 --------------- .../run-make/symbol-mangling-hashed/rmake.rs | 61 +++++++++++++++++++ 5 files changed, 78 insertions(+), 50 deletions(-) delete mode 100644 tests/run-make/symbol-mangling-hashed/Makefile create mode 100644 tests/run-make/symbol-mangling-hashed/rmake.rs diff --git a/src/tools/run-make-support/src/external_deps/rustc.rs b/src/tools/run-make-support/src/external_deps/rustc.rs index 584aa1191465f..0d476ca23ac2d 100644 --- a/src/tools/run-make-support/src/external_deps/rustc.rs +++ b/src/tools/run-make-support/src/external_deps/rustc.rs @@ -269,6 +269,13 @@ impl Rustc { self } + /// Enable `-Z unstable-options` and set `-C symbol-mangling-version`. + pub fn symbol_mangling_version(&mut self, v: &str) -> &mut Self { + self.cmd.arg("-Zunstable-options"); + self.cmd.arg(format!("-Csymbol-mangling-version={v}")); + self + } + /// Specify the edition year. pub fn edition(&mut self, edition: &str) -> &mut Self { self.cmd.arg("--edition"); diff --git a/src/tools/run-make-support/src/symbols.rs b/src/tools/run-make-support/src/symbols.rs index 4ac74f9014f19..b5805052a607b 100644 --- a/src/tools/run-make-support/src/symbols.rs +++ b/src/tools/run-make-support/src/symbols.rs @@ -25,6 +25,7 @@ where /// /// Panics if `path` is not a valid object file readable by the current user. pub fn any_symbol_contains(path: impl AsRef, substrings: &[&str]) -> bool { + let path = path.as_ref(); with_symbol_iter(path, |syms| { for sym in syms { for substring in substrings { @@ -34,7 +35,7 @@ pub fn any_symbol_contains(path: impl AsRef, substrings: &[&str]) -> bool .windows(substring.len()) .any(|x| x == substring.as_bytes()) { - eprintln!("{:?} contains {}", sym, substring); + eprintln!("{:?} contains {} in {}", sym, substring, path.display()); return true; } } @@ -68,3 +69,11 @@ pub fn contains_exact_symbols(path: impl AsRef, symbol_names: &[&str]) -> } result } + +pub fn print_symbols(path: impl AsRef) { + let path = path.as_ref(); + println!("symbols in {}:", path.display()); + with_symbol_iter(path, |syms| { + syms.for_each(|sym| println!(" {}", &sym.name().unwrap())); + }); +} diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt index bd6963e491c42..583029f2ef44e 100644 --- a/src/tools/tidy/src/allowed_run_make_makefiles.txt +++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt @@ -42,7 +42,6 @@ run-make/simd-ffi/Makefile run-make/split-debuginfo/Makefile run-make/stable-symbol-names/Makefile run-make/staticlib-dylib-linkage/Makefile -run-make/symbol-mangling-hashed/Makefile run-make/sysroot-crates-are-unstable/Makefile run-make/thumb-none-cortex-m/Makefile run-make/thumb-none-qemu/Makefile diff --git a/tests/run-make/symbol-mangling-hashed/Makefile b/tests/run-make/symbol-mangling-hashed/Makefile deleted file mode 100644 index c95036ead9587..0000000000000 --- a/tests/run-make/symbol-mangling-hashed/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -include ../tools.mk - -# ignore-cross-compile -# only-linux -# only-x86_64 - -NM=nm -D -RLIB_NAME=liba_rlib.rlib -DYLIB_NAME=liba_dylib.so -SO_NAME=libb_dylib.so -BIN_NAME=b_bin - -ifeq ($(UNAME),Darwin) -NM=nm -gU -RLIB_NAME=liba_rlib.rlib -DYLIB_NAME=liba_dylib.dylib -SO_NAME=libb_dylib.dylib -BIN_NAME=b_bin -endif - -ifdef IS_WINDOWS -NM=nm -g -RLIB_NAME=liba_rlib.dll.a -DYLIB_NAME=liba_dylib.dll -SO_NAME=libb_dylib.dll -BIN_NAME=b_bin.exe -endif - -all: - $(RUSTC) -C prefer-dynamic -Z unstable-options -C symbol-mangling-version=hashed -C metadata=foo a_dylib.rs - $(RUSTC) -C prefer-dynamic -Z unstable-options -C symbol-mangling-version=hashed -C metadata=bar a_rlib.rs - $(RUSTC) -C prefer-dynamic -L $(TMPDIR) b_dylib.rs - $(RUSTC) -C prefer-dynamic -L $(TMPDIR) b_bin.rs - - # Check hashed symbol name - - [ "$$($(NM) $(TMPDIR)/$(DYLIB_NAME) | grep -c hello)" -eq "0" ] - [ "$$($(NM) $(TMPDIR)/$(DYLIB_NAME) | grep _RNxC7a_dylib | grep -c ' T ')" -eq "2" ] - - [ "$$($(NM) $(TMPDIR)/$(SO_NAME) | grep b_dylib | grep -c hello)" -eq "1" ] - [ "$$($(NM) $(TMPDIR)/$(SO_NAME) | grep _RNxC6a_rlib | grep -c ' T ')" -eq "2" ] - [ "$$($(NM) $(TMPDIR)/$(SO_NAME) | grep _RNxC7a_dylib | grep -c ' U ')" -eq "1" ] - - [ "$$($(NM) $(TMPDIR)/$(BIN_NAME) | grep _RNxC6a_rlib | grep -c ' U ')" -eq "1" ] - [ "$$($(NM) $(TMPDIR)/$(BIN_NAME) | grep _RNxC7a_dylib | grep -c ' U ')" -eq "1" ] - [ "$$($(NM) $(TMPDIR)/$(BIN_NAME) | grep b_dylib | grep hello | grep -c ' U ')" -eq "1" ] - - $(call RUN,$(BIN_NAME)) diff --git a/tests/run-make/symbol-mangling-hashed/rmake.rs b/tests/run-make/symbol-mangling-hashed/rmake.rs new file mode 100644 index 0000000000000..ed3d06dad7789 --- /dev/null +++ b/tests/run-make/symbol-mangling-hashed/rmake.rs @@ -0,0 +1,61 @@ +//@ ignore-cross-compile +//@ only-linux +//@ only-x86_64 + +use run_make_support::object::ObjectSymbol; +use run_make_support::symbols::*; +use run_make_support::{bin_name, cwd, dynamic_lib_name, run, rust_lib_name, rustc}; + +fn main() { + rustc() + .prefer_dynamic() + .symbol_mangling_version("hashed") + .metadata("foo") + .input("a_dylib.rs") + .run(); + rustc() + .prefer_dynamic() + .symbol_mangling_version("hashed") + .metadata("bar") + .input("a_rlib.rs") + .run(); + /*println!("{}", cwd().display()); + dbg!(cwd().display()); + use std::io::Write; + std::io::stdout().flush().unwrap(); + std::fs::write("/tmp/the_dir", cwd().display().to_string()).unwrap(); + loop {}*/ + //run("sh"); + //run("pwd"); + rustc().prefer_dynamic().library_search_path(cwd()).input("b_dylib.rs").run(); + rustc().prefer_dynamic().library_search_path(cwd()).input("b_bin.rs").run(); + let a_dylib = dynamic_lib_name("a_dylib"); + assert!(!any_symbol_contains(&a_dylib, &["hello"])); + assert!(contains_exact_symbols( + &a_dylib, + &["_RNxC7a_dylib12H98WkzJ7B2nk", "_RNxC7a_dylib12HjermeVgSqiY",] + )); + let b_dylib = dynamic_lib_name("b_dylib"); + // b_dylib was compiled with regular symbol mangling. + assert!(any_symbol_contains(&b_dylib, &["hello"])); + // it depends on a_rlib, which was compiled with + // hashed symbol mangling. + assert!(contains_exact_symbols( + &b_dylib, + &[ + "_RNxC6a_rlib12H85r05hDVgWS", + "_RNxC6a_rlib12HeiQWRC1rtuF", + "_RNxC7a_dylib12HjermeVgSqiY", + ] + )); + let b_bin = bin_name("b_bin"); + assert!(contains_exact_symbols( + &b_bin, + &[ + "_RNxC6a_rlib12HeiQWRC1rtuF", + "_RNxC7a_dylib12HjermeVgSqiY", + "_ZN7b_dylib5hello17h3a39df941aa66c40E", + ] + )); + print_symbols(b_bin); +}