Skip to content

Commit 47b54b5

Browse files
authored
Merge pull request #1345 from dpaoliello/rawdylib
Update raw-dylib documentation for stabilization
2 parents 5ddf52a + f0bb14c commit 47b54b5

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

src/items/external-blocks.md

+33-3
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,38 @@ resolution logic to find that import library. Alternatively, specifying
231231
`kind = "raw-dylib"` instructs the compiler to generate an import library
232232
during compilation and provide that to the linker instead.
233233

234-
`raw-dylib` is only supported on Windows and not supported on 32-bit x86
235-
(`target_arch="x86"`). Using it when targeting other platforms or
236-
x86 on Windows will result in a compiler error.
234+
`raw-dylib` is only supported on Windows. Using it when targeting other
235+
platforms will result in a compiler error.
236+
237+
#### The `import_name_type` key
238+
239+
On x86 Windows, names of functions are "decorated" (i.e., have a specific prefix
240+
and/or suffix added) to indicate their calling convention. For example, a
241+
`stdcall` calling convention function with the name `fn1` that has no arguments
242+
would be decorated as `_fn1@0`. However, the [PE Format] does also permit names
243+
to have no prefix or be undecorated. Additionally, the MSVC and GNU toolchains
244+
use different decorations for the same calling conventions which means, by
245+
default, some Win32 functions cannot be called using the `raw-dylib` link kind
246+
via the GNU toolchain.
247+
248+
To allow for these differences, when using the `raw-dylib` link kind you may
249+
also specify the `import_name_type` key with one of the following values to
250+
change how functions are named in the generated import library:
251+
252+
* `decorated`: The function name will be fully-decorated using the MSVC
253+
toolchain format.
254+
* `noprefix`: The function name will be decorated using the MSVC toolchain
255+
format, but skipping the leading `?`, `@`, or optionally `_`.
256+
* `undecorated`: The function name will not be decorated.
257+
258+
If the `import_name_type` key is not specified, then the function name will be
259+
fully-decorated using the target toolchain's format.
260+
261+
Variables are never decorated and so the `import_name_type` key has no effect on
262+
how they are named in the generated import library.
263+
264+
The `import_name_type` key is only supported on x86 Windows. Using it when
265+
targeting other platforms will result in a compiler error.
237266

238267
### The `link_name` attribute
239268

@@ -308,3 +337,4 @@ restrictions as [regular function parameters].
308337
[`whole-archive` documentation for rustc]: ../../rustc/command-line-arguments.html#linking-modifiers-whole-archive
309338
[`verbatim` documentation for rustc]: ../../rustc/command-line-arguments.html#linking-modifiers-verbatim
310339
[`dylib` versus `raw-dylib`]: #dylib-versus-raw-dylib
340+
[PE Format]: https://learn.microsoft.com/windows/win32/debug/pe-format#import-name-type

0 commit comments

Comments
 (0)