aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-04-19 21:53:30 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-04-21 22:44:28 +0200
commitd6e66cff12d9f446c592e90db31642d503e29ade (patch)
tree062207e4591cfec78ba79f1645bbd2e7d0ed1bfa /src/link
parentf9e9974c8f67a7452a08973e963f2c06f85424b3 (diff)
downloadzig-d6e66cff12d9f446c592e90db31642d503e29ade.tar.gz
zig-d6e66cff12d9f446c592e90db31642d503e29ade.zip
macho: fix dirtying of GOT entries
Diffstat (limited to 'src/link')
-rw-r--r--src/link/MachO.zig13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index acf6e057d9..4a3b76dd27 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -1335,17 +1335,20 @@ fn markRelocsDirtyByAddress(self: *MachO, addr: u64) void {
for (self.relocs.values()) |*relocs| {
for (relocs.items) |*reloc| {
const target_addr = reloc.getTargetBaseAddress(self) orelse continue;
- if (target_addr == 0) continue;
if (target_addr < addr) continue;
reloc.dirty = true;
}
}
- // Dirty synthetic table sections if necessary
- {
- const target_addr = self.getSegment(self.got_section_index.?).vmaddr;
- if (target_addr >= addr) self.got_table_contents_dirty = true;
+ // TODO: dirty only really affected GOT cells
+ for (self.got_table.entries.items) |entry| {
+ const target_addr = self.getSymbol(entry).n_value;
+ if (target_addr >= addr) {
+ self.got_table_contents_dirty = true;
+ break;
+ }
}
+
{
const stubs_addr = self.getSegment(self.stubs_section_index.?).vmaddr;
const stub_helper_addr = self.getSegment(self.stub_helper_section_index.?).vmaddr;