diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-13 23:07:21 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-13 23:07:21 +0100 |
| commit | 028bfdbca3961de8ac3e78b62ba210fb37200744 (patch) | |
| tree | 809308dbf833943ee8974ddd110abb0c0092e81b /src | |
| parent | 8c748d5fd792f6481075a186ed97fe9b3618b561 (diff) | |
| download | zig-028bfdbca3961de8ac3e78b62ba210fb37200744.tar.gz zig-028bfdbca3961de8ac3e78b62ba210fb37200744.zip | |
coff: mark dirty any reloc target at [addr,..) inclusive
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Coff.zig | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig index e9cd5f8609..4d3ad83663 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -920,7 +920,7 @@ fn markRelocsDirtyByTarget(self: *Coff, target: SymbolWithLoc) void { fn markRelocsDirtyByAddress(self: *Coff, addr: u32) void { const got_moved = blk: { const sect_id = self.got_section_index orelse break :blk false; - break :blk self.sections.items(.header)[sect_id].virtual_address > addr; + break :blk self.sections.items(.header)[sect_id].virtual_address >= addr; }; // TODO: dirty relocations targeting import table if that got moved in memory @@ -931,7 +931,7 @@ fn markRelocsDirtyByAddress(self: *Coff, addr: u32) void { reloc.dirty = reloc.dirty or got_moved; } else { const target_vaddr = reloc.getTargetAddress(self) orelse continue; - if (target_vaddr > addr) reloc.dirty = true; + if (target_vaddr >= addr) reloc.dirty = true; } } } @@ -939,7 +939,7 @@ fn markRelocsDirtyByAddress(self: *Coff, addr: u32) void { // TODO: dirty only really affected GOT cells for (self.got_table.entries.items) |entry| { const target_addr = self.getSymbol(entry).value; - if (target_addr > addr) { + if (target_addr >= addr) { self.got_table_contents_dirty = true; break; } @@ -1722,6 +1722,7 @@ pub fn flushModule(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod var code = std.ArrayList(u8).init(gpa); defer code.deinit(); try code.resize(math.cast(usize, atom.size) orelse return error.Overflow); + assert(atom.size > 0); const amt = try self.base.file.?.preadAll(code.items, file_offset); if (amt != code.items.len) return error.InputOutput; |
