From 4931a291f86410d5c43dd9471d23b7e890f91246 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Sat, 20 Apr 2024 22:58:54 +0200 Subject: [PATCH] link/elf: keep track of sh_entsize per MergeSubsection --- src/link/Elf.zig | 9 +++++++++ src/link/Elf/Object.zig | 1 + src/link/Elf/merge_section.zig | 1 + src/link/Elf/relocatable.zig | 8 ++++++++ 4 files changed, 19 insertions(+) diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 1677daa64f..5af7c7d6aa 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -3337,6 +3337,7 @@ pub fn addCommentString(self: *Elf) !void { msub.string_index = res.key.pos; msub.alignment = .@"1"; msub.size = res.key.len; + msub.entsize = 1; msub.alive = true; res.sub.* = msub_index; } @@ -3428,6 +3429,14 @@ fn initOutputSections(self: *Elf) !void { .flags = msec.flags, }); msec.output_section_index = shndx; + + var entsize = self.mergeSubsection(msec.subsections.items[0]).entsize; + for (msec.subsections.items) |index| { + const msub = self.mergeSubsection(index); + entsize = @min(entsize, msub.entsize); + } + const shdr = &self.shdrs.items[shndx]; + shdr.sh_entsize = entsize; } } diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig index f4aeb9b4c9..57531916eb 100644 --- a/src/link/Elf/Object.zig +++ b/src/link/Elf/Object.zig @@ -759,6 +759,7 @@ pub fn resolveMergeSubsections(self: *Object, elf_file: *Elf) !void { msub.string_index = res.key.pos; msub.alignment = atom_ptr.alignment; msub.size = res.key.len; + msub.entsize = math.cast(u32, isec.sh_entsize) orelse return error.Overflow; msub.alive = !elf_file.base.gc_sections or isec.sh_flags & elf.SHF_ALLOC == 0; res.sub.* = msub_index; } diff --git a/src/link/Elf/merge_section.zig b/src/link/Elf/merge_section.zig index 50f4194f19..ab716794fc 100644 --- a/src/link/Elf/merge_section.zig +++ b/src/link/Elf/merge_section.zig @@ -168,6 +168,7 @@ pub const MergeSubsection = struct { string_index: u32 = 0, size: u32 = 0, alignment: Atom.Alignment = .@"1", + entsize: u32 = 0, alive: bool = false, pub fn address(msub: MergeSubsection, elf_file: *Elf) i64 { diff --git a/src/link/Elf/relocatable.zig b/src/link/Elf/relocatable.zig index eb8569d252..e1e87ce8af 100644 --- a/src/link/Elf/relocatable.zig +++ b/src/link/Elf/relocatable.zig @@ -289,6 +289,14 @@ fn initSections(elf_file: *Elf) !void { .flags = msec.flags, }); msec.output_section_index = shndx; + + var entsize = elf_file.mergeSubsection(msec.subsections.items[0]).entsize; + for (msec.subsections.items) |index| { + const msub = elf_file.mergeSubsection(index); + entsize = @min(entsize, msub.entsize); + } + const shdr = &elf_file.shdrs.items[shndx]; + shdr.sh_entsize = entsize; } const needs_eh_frame = for (elf_file.objects.items) |index| {