authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-10-02 13:32:13+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-09 12:38:53-07:00
log0e5cd112ef6e50cbebd7a65a048f541023dcb49c
tree769a3cbd9294babbe0267bb645d9900e790574f6
parentcf2e462d91cf1e07f5aedbae404cce311de6b664

elf: clear dynamic relocs before resolving relocs in atoms

When resolving and writing atoms to file, we may add dynamic relocs to the output buffer so clear the buffers before that happens.

1 files changed, 4 insertions(+), 4 deletions(-)

src/link/Elf.zig+4-4
......@@ -987,6 +987,9 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
987987 for (self.objects.items) |index| {
988988 self.file(index).?.object.dirty = false;
989989 }
990 // TODO: would state tracking be more appropriate here? perhaps even custom relocation type?
991 self.rela_dyn.clearRetainingCapacity();
992 self.rela_plt.clearRetainingCapacity();
990993
991994 if (self.zigObjectPtr()) |zo| {
992995 var has_reloc_errors = false;
......@@ -1017,6 +1020,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
10171020 try self.writeShdrTable();
10181021 try self.writeAtoms();
10191022 try self.writeMergeSections();
1023
10201024 self.writeSyntheticSections() catch |err| switch (err) {
10211025 error.RelocFailure => return error.FlushFailure,
10221026 error.UnsupportedCpuArch => {
......@@ -4236,8 +4240,6 @@ fn writeSyntheticSections(self: *Elf) !void {
42364240 }
42374241
42384242 if (self.rela_dyn_section_index) |shndx| {
4239 // TODO: would state tracking be more appropriate here? perhaps even custom relocation type?
4240 self.rela_dyn.clearRetainingCapacity();
42414243 const shdr = slice.items(.shdr)[shndx];
42424244 try self.got.addRela(self);
42434245 try self.copy_rel.addRela(self);
......@@ -4270,8 +4272,6 @@ fn writeSyntheticSections(self: *Elf) !void {
42704272 }
42714273
42724274 if (self.rela_plt_section_index) |shndx| {
4273 // TODO: would state tracking be more appropriate here? perhaps even custom relocation type?
4274 self.rela_plt.clearRetainingCapacity();
42754275 const shdr = slice.items(.shdr)[shndx];
42764276 try self.plt.addRela(self);
42774277 try self.base.file.?.pwriteAll(mem.sliceAsBytes(self.rela_plt.items), shdr.sh_offset);