//! Smoke test to check that that symbols of `extern "C"` functions and `#[no_mangle]` rust //! functions: //! //! 1. Are externally visible in the dylib produced. //! 2. That the symbol visibility is orthogonal to the Rust nameres visibility of the functions //! involved. //@ ignore-cross-compile use std::collections::BTreeSet; use run_make_support::object::{self, Object}; use run_make_support::{dynamic_lib_name, is_darwin, path, rfs, rustc}; fn main() { let dylib = dynamic_lib_name("dylib"); rustc().input("dylib.rs").output(&dylib).arg("-Cprefer-dynamic").run(); let expected_symbols = if is_darwin() { // Mach-O states that all exported symbols should have an underscore as prefix. At the // same time dlsym will implicitly add it, so outside of compilers, linkers and people // writing assembly, nobody needs to be aware of this. BTreeSet::from(["_fun1", "_fun2", "_fun3", "_fun4", "_fun5", "_fun6"]) } else { BTreeSet::from(["fun1", "fun2", "fun3", "fun4", "fun5", "fun6"]) }; let mut found_symbols = BTreeSet::new(); let blob = rfs::read(path(dylib)); let file = object::File::parse(&*blob).unwrap(); for export in file.exports().unwrap() { let sym_name = export.name(); let sym_name = std::str::from_utf8(sym_name).unwrap(); found_symbols.insert(sym_name); } println!("expected_symbols = {:?}", expected_symbols); println!("found_symbols = {:?}", found_symbols); if !found_symbols.is_superset(&expected_symbols) { for diff in expected_symbols.difference(&found_symbols) { eprintln!("missing symbol: {}", diff); } panic!("missing expected symbols"); } }