authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-13 23:07:21+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-13 23:07:21+01:00
log028bfdbca3961de8ac3e78b62ba210fb37200744
tree809308dbf833943ee8974ddd110abb0c0092e81b
parent8c748d5fd792f6481075a186ed97fe9b3618b561

coff: mark dirty any reloc target at [addr,..) inclusive


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

src/link/Coff.zig+4-3
......@@ -920,7 +920,7 @@ fn markRelocsDirtyByTarget(self: *Coff, target: SymbolWithLoc) void {
920920fn markRelocsDirtyByAddress(self: *Coff, addr: u32) void {
921921 const got_moved = blk: {
922922 const sect_id = self.got_section_index orelse break :blk false;
923 break :blk self.sections.items(.header)[sect_id].virtual_address > addr;
923 break :blk self.sections.items(.header)[sect_id].virtual_address >= addr;
924924 };
925925
926926 // TODO: dirty relocations targeting import table if that got moved in memory
......@@ -931,7 +931,7 @@ fn markRelocsDirtyByAddress(self: *Coff, addr: u32) void {
931931 reloc.dirty = reloc.dirty or got_moved;
932932 } else {
933933 const target_vaddr = reloc.getTargetAddress(self) orelse continue;
934 if (target_vaddr > addr) reloc.dirty = true;
934 if (target_vaddr >= addr) reloc.dirty = true;
935935 }
936936 }
937937 }
......@@ -939,7 +939,7 @@ fn markRelocsDirtyByAddress(self: *Coff, addr: u32) void {
939939 // TODO: dirty only really affected GOT cells
940940 for (self.got_table.entries.items) |entry| {
941941 const target_addr = self.getSymbol(entry).value;
942 if (target_addr > addr) {
942 if (target_addr >= addr) {
943943 self.got_table_contents_dirty = true;
944944 break;
945945 }
......@@ -1722,6 +1722,7 @@ pub fn flushModule(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
17221722 var code = std.ArrayList(u8).init(gpa);
17231723 defer code.deinit();
17241724 try code.resize(math.cast(usize, atom.size) orelse return error.Overflow);
1725 assert(atom.size > 0);
17251726
17261727 const amt = try self.base.file.?.preadAll(code.items, file_offset);
17271728 if (amt != code.items.len) return error.InputOutput;