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.
This commit is contained in:
Alex Rønne Petersen 2024-07-25 01:15:46 +02:00
parent e33af8e902
commit d6c637c36b
No known key found for this signature in database

View File

@ -455,7 +455,6 @@ fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn {
if (native_os == .linux) { if (native_os == .linux) {
// Find the beginning of the auxiliary vector // Find the beginning of the auxiliary vector
const auxv: [*]elf.Auxv = @ptrCast(@alignCast(envp.ptr + envp_count + 1)); const auxv: [*]elf.Auxv = @ptrCast(@alignCast(envp.ptr + envp_count + 1));
std.os.linux.elf_aux_maybe = auxv;
var at_hwcap: usize = 0; var at_hwcap: usize = 0;
const phdrs = init: { const phdrs = init: {
@ -479,6 +478,10 @@ fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn {
std.os.linux.pie.relocate(phdrs); 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) { if (!builtin.single_threaded) {
// ARMv6 targets (and earlier) have no support for TLS in hardware. // ARMv6 targets (and earlier) have no support for TLS in hardware.
// FIXME: Elide the check for targets >= ARMv7 when the target feature API // FIXME: Elide the check for targets >= ARMv7 when the target feature API