diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-04-28 01:25:02 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-28 01:25:02 +0200 |
| commit | be8976022efde25f4890a3833dd5c609aa2bd956 (patch) | |
| tree | fafd8045869d5e4bdc33e66ec6ba6b87b41c090d | |
| parent | 088753cb9a39b69d5cb345f7c8c1301bfad3fd68 (diff) | |
| parent | fa73ebb303d3c6416c6e67d3184506b6a7883335 (diff) | |
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``
| -rw-r--r-- | library/std/src/sys/pal/unix/args.rs | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/library/std/src/sys/pal/unix/args.rs b/library/std/src/sys/pal/unix/args.rs index acf8100d47f..afe703bcb2f 100644 --- a/library/std/src/sys/pal/unix/args.rs +++ b/library/std/src/sys/pal/unix/args.rs @@ -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. |
