Description
Currently the compiler makes basically no attempt to correctly use dllimport
. As a bit of a refresher, the Windows linker requires that if you're importing symbols from a DLL that they're tagged with dllimport
. This helps wire things up correctly at runtime and link-time. To help us out, though, the linker will patch up a few cases where dllimport
is missing where it would otherwise be required. If a function in another DLL is linked to without dllimport
then the linker will inject a local shim which adds a bit of indirection and runtime overhead but allows the crate to link correctly. For importing constants from other DLLs, however, MSVC linker requires that dllimport is annotated correctly. MinGW linkers can sometimes workaround it (see this commit description.
If we're targeting windows, then the compiler currently puts dllimport
on all imported constants from external crates, regardless of whether it's actually being imported from another crate. We rely on the linker fixing up all imports of functions. This ends up meaning that some crates don't link correctly, however (see this comment: #26591 (comment)).
We should fix the compiler's handling of dllimport in a few ways:
- Functions should be tagged with
dllimport
where appropriate - FFI functions should also be tagged with
dllimport
where appropriate - Constants should not always be tagged with
dllimport
if they're not actually being imported from a DLL.
I currently have a few thoughts running around in my head for fixing this, but nothing seems plausible enough to push on.