I tried this code(compiling in release mode):
use std::mem::transmute;
#[no_mangle]
pub unsafe extern "system" fn foo_bar_baz(ptr: i64) -> i8 {
let ptr: *mut i8 = transmute(ptr);
ptr.read()
}
in with the following Cargo.toml:
[package]
name = "repro_dynamic"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
crate-type = ["cdylib"]
[dependencies]
I expected to see this happen:
I expected a dynamic executable with a function labelled foo_bar_baz in it.
Instead, this happened:
I get a label for the function foo_bar_baz, but it is an undefined instruction only. On older rust versions I get the expected assembly.
I have a much larger project which is affected by this, and it seems to be broadly the same, affects many no_mangle unsafe extern functions(but not all such functions, not really clear as to what the deciding factor is but probably has something to do with function body).
$ objdump -D target/release/librepro_dynamic.so | grep -C 25 foo_bar_baz
00000000000126c0 <frame_dummy>:
126c0: f3 0f 1e fa endbr64
126c4: e9 77 ff ff ff jmp 12640 <register_tm_clones>
126c9: cc int3
126ca: cc int3
126cb: cc int3
126cc: cc int3
126cd: cc int3
126ce: cc int3
126cf: cc int3
00000000000126d0 <foo_bar_baz>:
126d0: 0f 0b ud2
126d2: cc int3
126d3: cc int3
126d4: cc int3
126d5: cc int3
126d6: cc int3
126d7: cc int3
126d8: cc int3
126d9: cc int3
126da: cc int3
126db: cc int3
126dc: cc int3
126dd: cc int3
126de: cc int3
126df: cc int3
00000000000126e0 <__rust_alloc>:
126e0: e9 bb 9b 01 00 jmp 2c2a0 <__rdl_alloc>
126e5: cc int3
126e6: cc int3
126e7: cc int3
126e8: cc int3
126e9: cc int3
Meta
Repros in latest stable and nightly. cargo-rustc-bisect says:
Regression in 317d14a56cb8c748bf0e2f2afff89c2249ab4423
rustc --version --verbose:
francis@francis-desktop::~/RustroverProjects/repro$ rustc --version --verbose
rustc 1.78.0 (9b00956e5 2024-04-29)
binary: rustc
commit-hash: 9b00956e56009bab2aa15d7bff10916599e3d6d6
commit-date: 2024-04-29
host: x86_64-unknown-linux-gnu
release: 1.78.0
LLVM version: 18.1.2
Edit:
Clarified that I was compiling in release mode.
I tried this code(compiling in release mode):
in with the following Cargo.toml:
I expected to see this happen:
I expected a dynamic executable with a function labelled foo_bar_baz in it.
Instead, this happened:
I get a label for the function foo_bar_baz, but it is an undefined instruction only. On older rust versions I get the expected assembly.
I have a much larger project which is affected by this, and it seems to be broadly the same, affects many no_mangle unsafe extern functions(but not all such functions, not really clear as to what the deciding factor is but probably has something to do with function body).
Meta
Repros in latest stable and nightly. cargo-rustc-bisect says:
rustc --version --verbose:Edit:
Clarified that I was compiling in release mode.