aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-11-09 12:02:20 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-11-09 12:02:20 +0100
commit0efc4711220d98d8c0178dfe9d64dc897c6dee70 (patch)
tree8c39e1bc95b52b798438ae4e423fa653959e374a /src
parent666ac6bf9be68a96d15085c016d123404e256d32 (diff)
downloadzig-0efc4711220d98d8c0178dfe9d64dc897c6dee70.tar.gz
zig-0efc4711220d98d8c0178dfe9d64dc897c6dee70.zip
elf: calculate required size for .rela.eh_frame
Diffstat (limited to 'src')
-rw-r--r--src/link/Elf.zig5
-rw-r--r--src/link/Elf/eh_frame.zig16
2 files changed, 21 insertions, 0 deletions
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));