From 13f71bb636b3912952297c4b615edcc64c73a918 Mon Sep 17 00:00:00 2001 From: Matthew Lugg Date: Wed, 26 Aug 2026 09:53:34 +0100 Subject: [PATCH] Elf2: initialize GOT header entries properly Previously these weren't being written until flush, which meant we hadn't reserved capacity for them in `.rela.dyn`, so if they needed runtime relocations we might hit Illegal Behavior when adding that relocation in `updateGotEntry`. --- src/link/Elf2.zig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index 0f3656e6a13f7fa193b735361619e844526b7d26..95c76025570db13d8374c5b18132d0e1ade52aae 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -4376,6 +4376,12 @@ fn initHeaders( assert(elf.targetLoad(&shdr.size) == elf.got.count() * @sizeOf(Addr)); }, } + if (elf.shndx.dynamic != .UNDEF) { + try elf.shndx.rela_dyn.relaEnsureAdditionalCapacity(elf, elf.got.count()); + } + for (0..elf.got.count()) |got_index| { + elf.updateGotEntry(got_index); + } // Create any always-provided linker-defined symbols. The symbols marking the `INIT_ARRAY`/ // `FINI_ARRAY`/`PREINIT_ARRAY` sections are instead created by `createInitFiniArraySection` @@ -7187,6 +7193,7 @@ fn addGotRelocAssumeCapacity( }); } fn updateGotEntry(elf: *Elf, got_index: usize) void { + assert(elf.ehdrType() != .REL); const entry_value: union(enum) { unsigned: u64, signed: i64, -- 2.54.0