Я пытаюсь создать разделяемую библиотеку rust cdylib на Mac, где некоторые символы определены только в главной программе, которая в конечном итоге загрузит ее.Я получаю кучу ошибок при сборке неразрешенных символов, но символы должны быть неразрешенными во время сборки.Если есть какая-то неразрешенная ошибка символа, это должно произойти во время выполнения dlopen () в программе хоста.
Мой ящик работает и прекрасно работает на Ubuntu с gcc-7.4 или clang-6.0, но не работает на Mac.
extern "C" {
pub static mut unresolved_symbol: i32;
}
#[export_name="some_func"]
pub extern "C" fn some_func() {
unsafe {
println!("{}", unresolved_symbol);
}
}
[package]
name = "sharedlib"
version = "0.1.0"
authors = ["Jeff Davis <jeff@j-davis.com>"]
edition = "2018"
[lib]
crate-type = ["cdylib"]
Ошибки:
$ cc --version
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ cargo build
Compiling sharedlib v0.1.0 (/Users/ABCWXYZ/code/rust/sharedlib)
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-m64" "-L" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/ABCWXYZ/code/rust/sharedlib/target/debug/deps/sharedlib.1fuvldog2z497idd.rcgu.o" "/Users/ABCWXYZ/code/rust/sharedlib/target/debug/deps/sharedlib.1qjfsnlmqnj43b7e.rcgu.o" "/Users/ABCWXYZ/code/rust/sharedlib/target/debug/deps/sharedlib.4t85wgccdhlen7ed.rcgu.o" "-o" "/Users/ABCWXYZ/code/rust/sharedlib/target/debug/deps/libsharedlib.dylib" "-Wl,-exported_symbols_list,/var/folders/yn/ps5k_p2j7_g7gfzdc_4jvqf80000gn/T/rustcONVtkx/list" "/Users/ABCWXYZ/code/rust/sharedlib/target/debug/deps/sharedlib.512ryopkdhq7yt5h.rcgu.o" "-Wl,-dead_strip" "-nodefaultlibs" "-L" "/Users/ABCWXYZ/code/rust/sharedlib/target/debug/deps" "-L" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libstd-1dfdd87ff6e60945.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libpanic_unwind-2afa3d9ef23111d9.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libbacktrace_sys-36ad4a075c8befe6.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/librustc_demangle-5af683adadcc6add.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libunwind-11930efa977c702c.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/liblibc-ebd54b7045c72e75.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/liballoc-f9e1c7e0a4778297.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/librustc_std_workspace_core-06903edfb4cff5d5.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libcore-9becee61e6692014.rlib" "/Users/ABCWXYZ/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libcompiler_builtins-f3814eca990faded.rlib" "-lSystem" "-lresolv" "-lc" "-lm" "-dynamiclib" "-Wl,-dylib"
= note: Undefined symbols for architecture x86_64:
"_unresolved_symbol", referenced from:
_some_func in sharedlib.1qjfsnlmqnj43b7e.rcgu.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: aborting due to previous error
error: Could not compile `sharedlib`.
To learn more, run the command again with --verbose.
В Ubuntu он просто собирается, и библиотека правильно содержит экспортированный символ и неразрешенный символ.Я мог бы загрузить его в хост-программу с определенным неразрешенным символом.