Rollup merge of #89025 - ricobbe:raw-dylib-link-ordinal, r=michaelwoerister
Implement `#[link_ordinal(n)]` Allows the use of `#[link_ordinal(n)]` with `#[link(kind = "raw-dylib")]`, allowing Rust to link against DLLs that export symbols by ordinal rather than by name. As long as the ordinal matches, the name of the function in Rust is not required to match the name of the corresponding function in the exporting DLL. Part of #58713.
This commit is contained in:
commit
6c17601a2e
20 changed files with 201 additions and 23 deletions
18
src/test/run-make/raw-dylib-link-ordinal/Makefile
Normal file
18
src/test/run-make/raw-dylib-link-ordinal/Makefile
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Test the behavior of #[link(.., kind = "raw-dylib")] and #[link_ordinal] on windows-msvc
|
||||
|
||||
# only-windows-msvc
|
||||
|
||||
-include ../../run-make-fulldeps/tools.mk
|
||||
|
||||
all:
|
||||
$(call COMPILE_OBJ,"$(TMPDIR)"/exporter.obj,exporter.c)
|
||||
$(CC) "$(TMPDIR)"/exporter.obj exporter.def -link -dll -out:"$(TMPDIR)"/exporter.dll
|
||||
$(RUSTC) --crate-type lib --crate-name raw_dylib_test lib.rs
|
||||
$(RUSTC) --crate-type bin driver.rs -L "$(TMPDIR)"
|
||||
"$(TMPDIR)"/driver > "$(TMPDIR)"/output.txt
|
||||
|
||||
ifdef RUSTC_BLESS_TEST
|
||||
cp "$(TMPDIR)"/output.txt output.txt
|
||||
else
|
||||
$(DIFF) output.txt "$(TMPDIR)"/output.txt
|
||||
endif
|
||||
5
src/test/run-make/raw-dylib-link-ordinal/driver.rs
Normal file
5
src/test/run-make/raw-dylib-link-ordinal/driver.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
extern crate raw_dylib_test;
|
||||
|
||||
fn main() {
|
||||
raw_dylib_test::library_function();
|
||||
}
|
||||
5
src/test/run-make/raw-dylib-link-ordinal/exporter.c
Normal file
5
src/test/run-make/raw-dylib-link-ordinal/exporter.c
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#include <stdio.h>
|
||||
|
||||
void exported_function() {
|
||||
printf("exported_function\n");
|
||||
}
|
||||
3
src/test/run-make/raw-dylib-link-ordinal/exporter.def
Normal file
3
src/test/run-make/raw-dylib-link-ordinal/exporter.def
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
LIBRARY exporter
|
||||
EXPORTS
|
||||
exported_function @13 NONAME
|
||||
13
src/test/run-make/raw-dylib-link-ordinal/lib.rs
Normal file
13
src/test/run-make/raw-dylib-link-ordinal/lib.rs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#![feature(raw_dylib)]
|
||||
|
||||
#[link(name = "exporter", kind = "raw-dylib")]
|
||||
extern {
|
||||
#[link_ordinal(13)]
|
||||
fn imported_function();
|
||||
}
|
||||
|
||||
pub fn library_function() {
|
||||
unsafe {
|
||||
imported_function();
|
||||
}
|
||||
}
|
||||
1
src/test/run-make/raw-dylib-link-ordinal/output.txt
Normal file
1
src/test/run-make/raw-dylib-link-ordinal/output.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
exported_function
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#![feature(raw_dylib)]
|
||||
//~^ WARN the feature `raw_dylib` is incomplete
|
||||
|
||||
#[link(name = "foo")]
|
||||
extern "C" {
|
||||
#[link_ordinal()]
|
||||
//~^ ERROR incorrect number of arguments to `#[link_ordinal]`
|
||||
fn foo();
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
warning: the feature `raw_dylib` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/link-ordinal-missing-argument.rs:1:12
|
||||
|
|
||||
LL | #![feature(raw_dylib)]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #58713 <https://github.com/rust-lang/rust/issues/58713> for more information
|
||||
|
||||
error: incorrect number of arguments to `#[link_ordinal]`
|
||||
--> $DIR/link-ordinal-missing-argument.rs:6:5
|
||||
|
|
||||
LL | #[link_ordinal()]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the attribute requires exactly one argument
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
13
src/test/ui/rfc-2627-raw-dylib/link-ordinal-multiple.rs
Normal file
13
src/test/ui/rfc-2627-raw-dylib/link-ordinal-multiple.rs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
// only-windows-msvc
|
||||
#![feature(raw_dylib)]
|
||||
//~^ WARN the feature `raw_dylib` is incomplete
|
||||
|
||||
#[link(name = "foo", kind = "raw-dylib")]
|
||||
extern "C" {
|
||||
#[link_ordinal(1)]
|
||||
#[link_ordinal(2)]
|
||||
//~^ ERROR multiple `link_ordinal` attributes on a single definition
|
||||
fn foo();
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
17
src/test/ui/rfc-2627-raw-dylib/link-ordinal-multiple.stderr
Normal file
17
src/test/ui/rfc-2627-raw-dylib/link-ordinal-multiple.stderr
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
warning: the feature `raw_dylib` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/link-ordinal-multiple.rs:2:12
|
||||
|
|
||||
LL | #![feature(raw_dylib)]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #58713 <https://github.com/rust-lang/rust/issues/58713> for more information
|
||||
|
||||
error: multiple `link_ordinal` attributes on a single definition
|
||||
--> $DIR/link-ordinal-multiple.rs:8:5
|
||||
|
|
||||
LL | #[link_ordinal(2)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
#[link(name = "foo")]
|
||||
extern "C" {
|
||||
#[link_ordinal(18446744073709551616)]
|
||||
//~^ ERROR ordinal value in `link_ordinal` is too large: `18446744073709551616`
|
||||
#[link_ordinal(72436)]
|
||||
//~^ ERROR ordinal value in `link_ordinal` is too large: `72436`
|
||||
fn foo();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,13 +7,13 @@ LL | #![feature(raw_dylib)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #58713 <https://github.com/rust-lang/rust/issues/58713> for more information
|
||||
|
||||
error: ordinal value in `link_ordinal` is too large: `18446744073709551616`
|
||||
error: ordinal value in `link_ordinal` is too large: `72436`
|
||||
--> $DIR/link-ordinal-too-large.rs:6:5
|
||||
|
|
||||
LL | #[link_ordinal(18446744073709551616)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
LL | #[link_ordinal(72436)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the value may not exceed `usize::MAX`
|
||||
= note: the value may not exceed `u16::MAX`
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
#![feature(raw_dylib)]
|
||||
//~^ WARN the feature `raw_dylib` is incomplete
|
||||
|
||||
#[link(name = "foo")]
|
||||
extern "C" {
|
||||
#[link_ordinal(3, 4)]
|
||||
//~^ ERROR incorrect number of arguments to `#[link_ordinal]`
|
||||
fn foo();
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
warning: the feature `raw_dylib` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/link-ordinal-too-many-arguments.rs:1:12
|
||||
|
|
||||
LL | #![feature(raw_dylib)]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #58713 <https://github.com/rust-lang/rust/issues/58713> for more information
|
||||
|
||||
error: incorrect number of arguments to `#[link_ordinal]`
|
||||
--> $DIR/link-ordinal-too-many-arguments.rs:6:5
|
||||
|
|
||||
LL | #[link_ordinal(3, 4)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the attribute requires exactly one argument
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue