From 0efc4711220d98d8c0178dfe9d64dc897c6dee70 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 9 Nov 2023 12:02:20 +0100 Subject: [PATCH] elf: calculate required size for .rela.eh_frame --- src/link/Elf.zig | 5 +++++ src/link/Elf/eh_frame.zig | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 13ea069a3a..009207ba09 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -4245,6 +4245,11 @@ fn updateSectionSizesObject(self: *Elf) !void { if (self.eh_frame_section_index) |index| { self.shdrs.items[index].sh_size = try eh_frame.calcEhFrameSize(self); + + if (self.eh_frame_rela_section_index) |rela_index| { + const shdr = &self.shdrs.items[rela_index]; + shdr.sh_size = eh_frame.calcEhFrameRelocs(self) * shdr.sh_entsize; + } } try self.updateSymtabSize(); diff --git a/src/link/Elf/eh_frame.zig b/src/link/Elf/eh_frame.zig index 8c0fa0f769..d15af3489a 100644 --- a/src/link/Elf/eh_frame.zig +++ b/src/link/Elf/eh_frame.zig @@ -282,6 +282,22 @@ pub fn calcEhFrameHdrSize(elf_file: *Elf) usize { return eh_frame_hdr_header_size + count * 8; } +pub fn calcEhFrameRelocs(elf_file: *Elf) usize { + var count: usize = 0; + for (elf_file.objects.items) |index| { + const object = elf_file.file(index).?.object; + for (object.cies.items) |cie| { + if (!cie.alive) continue; + count += cie.relocs(elf_file).len; + } + for (object.fdes.items) |fde| { + if (!fde.alive) continue; + count += fde.relocs(elf_file).len; + } + } + return count; +} + fn resolveReloc(rec: anytype, sym: *const Symbol, rel: elf.Elf64_Rela, elf_file: *Elf, contents: []u8) !void { const offset = std.math.cast(usize, rel.r_offset - rec.offset) orelse return error.Overflow; const P = @as(i64, @intCast(rec.address(elf_file) + offset));