Rollup merge of #81598 - sivadeilra:windows_dll_imports_fix_x86, r=m-ou-se
Fix calling convention for CRT startup My PR #81478 used the wrong calling convention for a set of functions that are called by the CRT. These functions need to use `extern "C"`. This would only affect x86, which is the only target (that I know of) that has multiple calling conventions. ```@bors``` r? ```@m-ou-se```
This commit is contained in:
commit
2622227208
@ -74,9 +74,9 @@ pub mod $symbol {
|
|||||||
/// used, and would remove it.
|
/// used, and would remove it.
|
||||||
#[used]
|
#[used]
|
||||||
#[link_section = ".CRT$XCU"]
|
#[link_section = ".CRT$XCU"]
|
||||||
static INIT_TABLE_ENTRY: fn() = init;
|
static INIT_TABLE_ENTRY: unsafe extern "C" fn() = init;
|
||||||
|
|
||||||
fn init() {
|
unsafe extern "C" fn init() {
|
||||||
// There is no locking here. This code is executed before main() is entered, and
|
// There is no locking here. This code is executed before main() is entered, and
|
||||||
// is guaranteed to be single-threaded.
|
// is guaranteed to be single-threaded.
|
||||||
//
|
//
|
||||||
@ -84,16 +84,14 @@ fn init() {
|
|||||||
// any Rust functions or CRT functions, if those functions touch any global state,
|
// any Rust functions or CRT functions, if those functions touch any global state,
|
||||||
// because this function runs during global initialization. For example, DO NOT
|
// because this function runs during global initialization. For example, DO NOT
|
||||||
// do any dynamic allocation, don't call LoadLibrary, etc.
|
// do any dynamic allocation, don't call LoadLibrary, etc.
|
||||||
unsafe {
|
let module_name: *const u8 = concat!($module, "\0").as_ptr();
|
||||||
let module_name: *const u8 = concat!($module, "\0").as_ptr();
|
let symbol_name: *const u8 = concat!(stringify!($symbol), "\0").as_ptr();
|
||||||
let symbol_name: *const u8 = concat!(stringify!($symbol), "\0").as_ptr();
|
let module_handle = $crate::sys::c::GetModuleHandleA(module_name as *const i8);
|
||||||
let module_handle = $crate::sys::c::GetModuleHandleA(module_name as *const i8);
|
if !module_handle.is_null() {
|
||||||
if !module_handle.is_null() {
|
match $crate::sys::c::GetProcAddress(module_handle, symbol_name as *const i8) as usize {
|
||||||
match $crate::sys::c::GetProcAddress(module_handle, symbol_name as *const i8) as usize {
|
0 => {}
|
||||||
0 => {}
|
n => {
|
||||||
n => {
|
PTR = Some(mem::transmute::<usize, F>(n));
|
||||||
PTR = Some(mem::transmute::<usize, F>(n));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user