Skip to content

Linking static lib to dylib can cause symbols to be missing from import lib #72319

Closed
@mati865

Description

@mati865

I tried this code:

[package]
name = "test5"
version = "0.1.0"
authors = ["Mateusz Mikuła <[email protected]>"]
edition = "2018"

[lib]
crate-type = ["cdylib"]
// LLVM unwind library from MSYS2 repo
#[link(name = "unwind", kind = "static")]
extern "C" {}

#[no_mangle]
pub fn foo() {
    println!("Hello, world!");
}

I expected to see this happen:

$ cargo +stage2 b && nm target/debug/libtest5.dll.a | grep foo || echo "not found"
   Compiling test5 v0.1.0 (D:\msys64\tmp\test5)
    Finished dev [unoptimized + debuginfo] target(s) in 0.87s
0000000000000000 I __imp_foo
0000000000000000 T foo

stage2 is #72049

Instead, this happened:

$ cargo b && nm target/debug/libtest5.dll.a | grep foo || echo "not found"
   Compiling test5 v0.1.0 (D:\msys64\tmp\test5)
    Finished dev [unoptimized + debuginfo] target(s) in 0.57s
not found

Meta

rustc --version --verbose:

$ rustc -vV
rustc 1.45.0-nightly (a74d1862d 2020-05-14)
binary: rustc
commit-hash: a74d1862d4d87a56244958416fd05976c58ca1a8
commit-date: 2020-05-14
host: x86_64-pc-windows-gnu
release: 1.45.0-nightly
LLVM version: 9.0

All symbols from import libraries
$ cargo b && nm target/debug/libtest5.dll.a
   Compiling test5 v0.1.0 (D:\msys64\tmp\test5)
    Finished dev [unoptimized + debuginfo] target(s) in 0.60s

d000034.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$7
0000000000000000 I test5_dll_iname

d000000.o:
0000000000000000 i .idata$2
0000000000000000 b .idata$4
0000000000000000 b .idata$5
0000000000000000 I _head_test5_dll
                 U test5_dll_iname

d000033.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_step
                 U _head_test5_dll
0000000000000000 T unw_step

d000032.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_set_reg
                 U _head_test5_dll
0000000000000000 T unw_set_reg

d000031.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_set_fpreg
                 U _head_test5_dll
0000000000000000 T unw_set_fpreg

d000030.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_resume
                 U _head_test5_dll
0000000000000000 T unw_resume

d000029.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_regname
                 U _head_test5_dll
0000000000000000 T unw_regname

d000028.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_local_addr_space
0000000000000000 I __nm_unw_local_addr_space
                 U _head_test5_dll

d000027.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_is_signal_frame
                 U _head_test5_dll
0000000000000000 T unw_is_signal_frame

d000026.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_is_fpreg
                 U _head_test5_dll
0000000000000000 T unw_is_fpreg

d000025.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_init_local
                 U _head_test5_dll
0000000000000000 T unw_init_local

d000024.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_getcontext
                 U _head_test5_dll
0000000000000000 T unw_getcontext

d000023.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_reg
                 U _head_test5_dll
0000000000000000 T unw_get_reg

d000022.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_proc_name
                 U _head_test5_dll
0000000000000000 T unw_get_proc_name

d000021.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_proc_info
                 U _head_test5_dll
0000000000000000 T unw_get_proc_info

d000020.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_fpreg
                 U _head_test5_dll
0000000000000000 T unw_get_fpreg

d000019.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_SetIP
                 U _head_test5_dll
0000000000000000 T _Unwind_SetIP

d000018.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_SetGR
                 U _head_test5_dll
0000000000000000 T _Unwind_SetGR

d000017.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Resume_or_Rethrow
                 U _head_test5_dll
0000000000000000 T _Unwind_Resume_or_Rethrow

d000016.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Resume
                 U _head_test5_dll
0000000000000000 T _Unwind_Resume

d000015.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_RaiseException
                 U _head_test5_dll
0000000000000000 T _Unwind_RaiseException

d000014.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetTextRelBase
                 U _head_test5_dll
0000000000000000 T _Unwind_GetTextRelBase

d000013.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetRegionStart
                 U _head_test5_dll
0000000000000000 T _Unwind_GetRegionStart

d000012.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetLanguageSpecificData
                 U _head_test5_dll
0000000000000000 T _Unwind_GetLanguageSpecificData

d000011.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetIPInfo
                 U _head_test5_dll
0000000000000000 T _Unwind_GetIPInfo

d000010.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetIP
                 U _head_test5_dll
0000000000000000 T _Unwind_GetIP

d000009.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetGR
                 U _head_test5_dll
0000000000000000 T _Unwind_GetGR

d000008.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetDataRelBase
                 U _head_test5_dll
0000000000000000 T _Unwind_GetDataRelBase

d000007.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetCFA
                 U _head_test5_dll
0000000000000000 T _Unwind_GetCFA

d000006.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_ForcedUnwind
                 U _head_test5_dll
0000000000000000 T _Unwind_ForcedUnwind

d000005.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Find_FDE
                 U _head_test5_dll
0000000000000000 T _Unwind_Find_FDE

d000004.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_FindEnclosingFunction
                 U _head_test5_dll
0000000000000000 T _Unwind_FindEnclosingFunction

d000003.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_DeleteException
                 U _head_test5_dll
0000000000000000 T _Unwind_DeleteException

d000002.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Backtrace
                 U _head_test5_dll
0000000000000000 T _Unwind_Backtrace

d000001.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__GCC_specific_handler
0000000000000000 T _GCC_specific_handler
                 U _head_test5_dll
$ cargo +stage2 b && nm target/debug/libtest5.dll.a
   Compiling test5 v0.1.0 (D:\msys64\tmp\test5)
    Finished dev [unoptimized + debuginfo] target(s) in 0.84s

d000036.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$7
0000000000000000 I test5_dll_iname

d000000.o:
0000000000000000 i .idata$2
0000000000000000 b .idata$4
0000000000000000 b .idata$5
0000000000000000 I _head_test5_dll
                 U test5_dll_iname

d000035.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_step
                 U _head_test5_dll
0000000000000000 T unw_step

d000034.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_set_reg
                 U _head_test5_dll
0000000000000000 T unw_set_reg

d000033.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_set_fpreg
                 U _head_test5_dll
0000000000000000 T unw_set_fpreg

d000032.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_resume
                 U _head_test5_dll
0000000000000000 T unw_resume

d000031.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_regname
                 U _head_test5_dll
0000000000000000 T unw_regname

d000030.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_local_addr_space
0000000000000000 I __nm_unw_local_addr_space
                 U _head_test5_dll

d000029.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_is_signal_frame
                 U _head_test5_dll
0000000000000000 T unw_is_signal_frame

d000028.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_is_fpreg
                 U _head_test5_dll
0000000000000000 T unw_is_fpreg

d000027.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_init_local
                 U _head_test5_dll
0000000000000000 T unw_init_local

d000026.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_getcontext
                 U _head_test5_dll
0000000000000000 T unw_getcontext

d000025.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_reg
                 U _head_test5_dll
0000000000000000 T unw_get_reg

d000024.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_proc_name
                 U _head_test5_dll
0000000000000000 T unw_get_proc_name

d000023.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_proc_info
                 U _head_test5_dll
0000000000000000 T unw_get_proc_info

d000022.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_unw_get_fpreg
                 U _head_test5_dll
0000000000000000 T unw_get_fpreg

d000021.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_rust_eh_personality
                 U _head_test5_dll
0000000000000000 T rust_eh_personality

d000020.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp_foo
                 U _head_test5_dll
0000000000000000 T foo

d000019.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_SetIP
                 U _head_test5_dll
0000000000000000 T _Unwind_SetIP

d000018.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_SetGR
                 U _head_test5_dll
0000000000000000 T _Unwind_SetGR

d000017.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Resume_or_Rethrow
                 U _head_test5_dll
0000000000000000 T _Unwind_Resume_or_Rethrow

d000016.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Resume
                 U _head_test5_dll
0000000000000000 T _Unwind_Resume

d000015.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_RaiseException
                 U _head_test5_dll
0000000000000000 T _Unwind_RaiseException

d000014.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetTextRelBase
                 U _head_test5_dll
0000000000000000 T _Unwind_GetTextRelBase

d000013.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetRegionStart
                 U _head_test5_dll
0000000000000000 T _Unwind_GetRegionStart

d000012.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetLanguageSpecificData
                 U _head_test5_dll
0000000000000000 T _Unwind_GetLanguageSpecificData

d000011.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetIPInfo
                 U _head_test5_dll
0000000000000000 T _Unwind_GetIPInfo

d000010.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetIP
                 U _head_test5_dll
0000000000000000 T _Unwind_GetIP

d000009.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetGR
                 U _head_test5_dll
0000000000000000 T _Unwind_GetGR

d000008.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetDataRelBase
                 U _head_test5_dll
0000000000000000 T _Unwind_GetDataRelBase

d000007.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_GetCFA
                 U _head_test5_dll
0000000000000000 T _Unwind_GetCFA

d000006.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_ForcedUnwind
                 U _head_test5_dll
0000000000000000 T _Unwind_ForcedUnwind

d000005.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Find_FDE
                 U _head_test5_dll
0000000000000000 T _Unwind_Find_FDE

d000004.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_FindEnclosingFunction
                 U _head_test5_dll
0000000000000000 T _Unwind_FindEnclosingFunction

d000003.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_DeleteException
                 U _head_test5_dll
0000000000000000 T _Unwind_DeleteException

d000002.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__Unwind_Backtrace
                 U _head_test5_dll
0000000000000000 T _Unwind_Backtrace

d000001.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__GCC_specific_handler
0000000000000000 T _GCC_specific_handler
                 U _head_test5_dll

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-linkageArea: linking into static, shared libraries and binariesC-bugCategory: This is a bug.O-windows-gnuToolchain: GNU, Operating system: WindowsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions