Commit d6c637c36b

Alex Rønne Petersen <alex@alexrp.com>
2024-07-25 01:15:46
start: Set std.os.linux.elf_aux_maybe after PIE relocations.
Accesses to this global variable can require relocations on some platforms (e.g. MIPS). If we do it before PIE relocations have been applied, we'll crash.
1 parent e33af8e
Changed files (1)
lib
lib/std/start.zig
@@ -455,7 +455,6 @@ fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn {
     if (native_os == .linux) {
         // Find the beginning of the auxiliary vector
         const auxv: [*]elf.Auxv = @ptrCast(@alignCast(envp.ptr + envp_count + 1));
-        std.os.linux.elf_aux_maybe = auxv;
 
         var at_hwcap: usize = 0;
         const phdrs = init: {
@@ -479,6 +478,10 @@ fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn {
             std.os.linux.pie.relocate(phdrs);
         }
 
+        // This must be done after PIE relocations have been applied or we may crash
+        // while trying to access the global variable (happens on MIPS at least).
+        std.os.linux.elf_aux_maybe = auxv;
+
         if (!builtin.single_threaded) {
             // ARMv6 targets (and earlier) have no support for TLS in hardware.
             // FIXME: Elide the check for targets >= ARMv7 when the target feature API