From 584e4acae6fa8562eaf6bc0e24069f17487efab6 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Mon, 10 Jul 2023 09:45:47 +0200 Subject: [PATCH] elf: handle _end synthetic symbol --- src/Elf.zig | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Elf.zig b/src/Elf.zig index 6c73ccda..79c24ce8 100644 --- a/src/Elf.zig +++ b/src/Elf.zig @@ -49,6 +49,7 @@ dso_handle_index: ?u32 = null, gnu_eh_frame_hdr_index: ?u32 = null, rela_iplt_start_index: ?u32 = null, rela_iplt_end_index: ?u32 = null, +end_index: ?u32 = null, start_stop_indexes: std.ArrayListUnmanaged(u32) = .{}, entry_index: ?u32 = null, @@ -1404,6 +1405,17 @@ fn allocateSyntheticSymbols(self: *Elf) void { end_sym.shndx = shndx; } + // _end + { + const end_symbol = self.getSymbol(self.end_index.?); + for (self.sections.items(.shdr), 0..) |shdr, shndx| { + if (shdr.sh_flags & elf.SHF_ALLOC != 0) { + end_symbol.value = shdr.sh_addr + shdr.sh_size; + end_symbol.shndx = @intCast(shndx); + } + } + } + // __start_*, __stop_* { var index: usize = 0; @@ -1759,6 +1771,7 @@ fn resolveSyntheticSymbols(self: *Elf) !void { self.preinit_array_end_index = try internal.addSyntheticGlobal("__preinit_array_end", self); self.got_index = try internal.addSyntheticGlobal("_GLOBAL_OFFSET_TABLE_", self); self.plt_index = try internal.addSyntheticGlobal("_PROCEDURE_LINKAGE_TABLE_", self); + self.end_index = try internal.addSyntheticGlobal("_end", self); if (self.options.eh_frame_hdr) { self.gnu_eh_frame_hdr_index = try internal.addSyntheticGlobal("__GNU_EH_FRAME_HDR", self);