authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-09 12:02:20+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-09 12:02:20+01:00
log0efc4711220d98d8c0178dfe9d64dc897c6dee70
tree8c39e1bc95b52b798438ae4e423fa653959e374a
parent666ac6bf9be68a96d15085c016d123404e256d32

elf: calculate required size for .rela.eh_frame


2 files changed, 21 insertions(+), 0 deletions(-)

src/link/Elf.zig+5
......@@ -4245,6 +4245,11 @@ fn updateSectionSizesObject(self: *Elf) !void {
42454245
42464246 if (self.eh_frame_section_index) |index| {
42474247 self.shdrs.items[index].sh_size = try eh_frame.calcEhFrameSize(self);
4248
4249 if (self.eh_frame_rela_section_index) |rela_index| {
4250 const shdr = &self.shdrs.items[rela_index];
4251 shdr.sh_size = eh_frame.calcEhFrameRelocs(self) * shdr.sh_entsize;
4252 }
42484253 }
42494254
42504255 try self.updateSymtabSize();
src/link/Elf/eh_frame.zig+16
......@@ -282,6 +282,22 @@ pub fn calcEhFrameHdrSize(elf_file: *Elf) usize {
282282 return eh_frame_hdr_header_size + count * 8;
283283}
284284
285pub fn calcEhFrameRelocs(elf_file: *Elf) usize {
286 var count: usize = 0;
287 for (elf_file.objects.items) |index| {
288 const object = elf_file.file(index).?.object;
289 for (object.cies.items) |cie| {
290 if (!cie.alive) continue;
291 count += cie.relocs(elf_file).len;
292 }
293 for (object.fdes.items) |fde| {
294 if (!fde.alive) continue;
295 count += fde.relocs(elf_file).len;
296 }
297 }
298 return count;
299}
300
285301fn resolveReloc(rec: anytype, sym: *const Symbol, rel: elf.Elf64_Rela, elf_file: *Elf, contents: []u8) !void {
286302 const offset = std.math.cast(usize, rel.r_offset - rec.offset) orelse return error.Overflow;
287303 const P = @as(i64, @intCast(rec.address(elf_file) + offset));