Meaning of #[link] kinds

That's a good question. On one hand it is entirely valid for a DLL to re-export symbols provided by another DLL (this is actually used quite a bit on windows with the system DLLs, such as kernel32.dll re-exporting many functions from kernelbase.dll). On the other hand it is also valid for the import library for the DLL to export some symbols to the rust DLL and other symbols to the native DLL. The latter would be more efficient by avoiding a layer of indirection. Remember that since in case 3 the original import library for the native DLL is being bundled, that means it cannot be passed along to later linker invocations but rather the symbols have to be provided by the Rust DLL's import library. In both cases the Rust DLL's import library provides the symbols, it's just that in one case the exports redirect through the Rust DLL, and in the other case the exports point directly at the native DLL.