| //@ run-pass | |
| //@ compile-flags: -Ctarget-feature=-crt-static -Zexport-executable-symbols | |
| //@ ignore-wasm | |
| //@ ignore-cross-compile | |
| //@ edition: 2024 | |
| // Regression test for <https://github.com/rust-lang/rust/issues/101610>. | |
| #![feature(rustc_private)] | |
| #[unsafe(no_mangle)] | |
| fn hack() -> u64 { | |
| 998244353 | |
| } | |
| fn main() { | |
| #[cfg(unix)] | |
| unsafe { | |
| extern crate libc; | |
| let handle = libc::dlopen(std::ptr::null(), libc::RTLD_NOW); | |
| let ptr = libc::dlsym(handle, c"hack".as_ptr()); | |
| let ptr: Option<unsafe fn() -> u64> = std::mem::transmute(ptr); | |
| if let Some(f) = ptr { | |
| assert!(f() == 998244353); | |
| println!("symbol `hack` is found successfully"); | |
| } else { | |
| panic!("symbol `hack` is not found"); | |
| } | |
| } | |
| #[cfg(windows)] | |
| unsafe { | |
| type PCSTR = *const u8; | |
| type HMODULE = *mut core::ffi::c_void; | |
| type FARPROC = Option<unsafe extern "system" fn() -> isize>; | |
| #[link(name = "kernel32", kind = "raw-dylib")] | |
| unsafe extern "system" { | |
| fn GetModuleHandleA(lpmodulename: PCSTR) -> HMODULE; | |
| fn GetProcAddress(hmodule: HMODULE, lpprocname: PCSTR) -> FARPROC; | |
| } | |
| let handle = GetModuleHandleA(std::ptr::null_mut()); | |
| let ptr = GetProcAddress(handle, b"hack\0".as_ptr()); | |
| let ptr: Option<unsafe fn() -> u64> = std::mem::transmute(ptr); | |
| if let Some(f) = ptr { | |
| assert!(f() == 998244353); | |
| println!("symbol `hack` is found successfully"); | |
| } else { | |
| panic!("symbol `hack` is not found"); | |
| } | |
| } | |
| } |