Rollup merge of #124447 - workingjubilee:set-argv-twice-on-gnu, r=ChrisDenton

Unconditionally call `really_init` on GNU/Linux

This makes miri not diverge in behavior, it fixes running Rust linux-gnu binaries on musl with gcompat, it fixes dlopen edge-cases that cranelift somehow hits, etc.

Fixes #124126

thou hast gazed into this abyss with me:
r? ``@ChrisDenton``
This commit is contained in:
Matthias Krüger 2024-04-28 01:25:02 +02:00 committed by GitHub
commit be8976022e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -98,12 +98,10 @@ mod imp {
}
#[inline(always)]
pub unsafe fn init(_argc: isize, _argv: *const *const u8) {
// On Linux-GNU, we rely on `ARGV_INIT_ARRAY` below to initialize
// `ARGC` and `ARGV`. But in Miri that does not actually happen so we
// still initialize here.
#[cfg(any(miri, not(all(target_os = "linux", target_env = "gnu"))))]
really_init(_argc, _argv);
pub unsafe fn init(argc: isize, argv: *const *const u8) {
// on GNU/Linux if we are main then we will init argv and argc twice, it "duplicates work"
// BUT edge-cases are real: only using .init_array can break most emulators, dlopen, etc.
really_init(argc, argv);
}
/// glibc passes argc, argv, and envp to functions in .init_array, as a non-standard extension.