beryllium icon indicating copy to clipboard operation
beryllium copied to clipboard

Statically linking in a dll which a cdylib links to results in explosive linker error

Open sanbox-irl opened this issue 3 years ago • 2 comments

Hello!

I have a crate graph like this:

[CORE] -> [SHARED] -> [THING]

Core is a rust library that uses beryllium with the static linking feature on. Shared is a cdylib which has a cargo.toml like this:

[dependencies]
core = { path = "../core-user" }

[lib]
crate-type = ["cdylib"]

CORE is a single line lib.rs like this:

pub use beryllium::*;

(this makes sure that symbols are exported)

and SHARED shows just this function (to make sure that symbols are exported again):

pub use sdl2_user::*;

pub extern "C" fn hello() {
    unsafe {
        sdl2_user::get_error_unchecked();
    }
}

This results in a linker error like so:

          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol SetLastError referenced in function _ZN3std3env11current_dir17he5f1b836db8a0198E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetCurrentDirectoryW referenced in function _ZN3std3env11current_dir17he5f1b836db8a0198E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetEnvironmentStringsW referenced in function _ZN3std3env4vars17h42ceee9b38973e62E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetEnvironmentVariableW referenced in function _ZN3std3env7_var_os17h3c8a99eea2980dd6E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol SetEnvironmentVariableW referenced in function _ZN3std3env8_set_var17he7a29a0d59dc6953E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetTempPathW referenced in function _ZN3std3env8temp_dir17h4bada281cbece498E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetCommandLineW referenced in function _ZN3std3env7args_os17h1ecce28037ed8d46E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol strlen referenced in function _ZN3std3ffi5c_str7CString8from_raw17h4728d381ff641ef8E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol WriteFile referenced in function _ZN3std2fs5write5inner17h3b47f92fd53ddf45E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol FlushFileBuffers referenced in function _ZN3std2fs4File8sync_all17h82624ce9851eb942E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol DuplicateHandle referenced in function _ZN3std2fs4File9try_clone17h0ac83dbacd68725fE
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol ReadFile referenced in function _ZN47_$LT$std..fs..File$u20$as$u20$std..io..Read$GT$4read17h025336fbc570c147E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol SetFilePointerEx referenced in function _ZN47_$LT$std..fs..File$u20$as$u20$std..io..Seek$GT$4seek17h83cd02b5dc4d18f2E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol EnterCriticalSection referenced in function _ZN3std2io5stdio6Stdout4lock17h5715c9b1b9fabe02E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol WaitForSingleObject referenced in function _ZN3std7process7Command6status17h3c88f12b0a48c645E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetExitCodeProcess referenced in function _ZN3std7process7Command6status17h3c88f12b0a48c645E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol TerminateProcess referenced in function _ZN3std7process5Child4kill17he184217fdd10741aE
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetProcessId referenced in function _ZN3std7process5Child2id17h06ca3cd212f03301E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol CreateEventW referenced in function _ZN3std7process5Child16wait_with_output17h43ad5107058e3ca9E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol WaitForMultipleObjects referenced in function _ZN3std7process5Child16wait_with_output17h43ad5107058e3ca9E
          libstd-0087fff1d6c84113.rlib(std-0087fff1d6c84113.std.rcc8w0m2-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol GetOverlapp`
          ```
          
          and on and on.

Using the DLL, these problems go away

sanbox-irl avatar Mar 11 '21 07:03 sanbox-irl

That's quite the wild linker error. I'm not eve slightly sure how you'd fix it. If using the DLL fixes things then you should do that.

Lokathor avatar Mar 11 '21 14:03 Lokathor

👍 I get a very similar error with SDL2-rs as well

sanbox-irl avatar Mar 12 '21 02:03 sanbox-irl