Ошибка компоновщика при сборке общей библиотеки на Mac - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь создать разделяемую библиотеку 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 он просто собирается, и библиотека правильно содержит экспортированный символ и неразрешенный символ.Я мог бы загрузить его в хост-программу с определенным неразрешенным символом.

...