diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-04-19 21:53:30 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-04-21 22:44:28 +0200 |
| commit | d6e66cff12d9f446c592e90db31642d503e29ade (patch) | |
| tree | 062207e4591cfec78ba79f1645bbd2e7d0ed1bfa /src/link | |
| parent | f9e9974c8f67a7452a08973e963f2c06f85424b3 (diff) | |
| download | zig-d6e66cff12d9f446c592e90db31642d503e29ade.tar.gz zig-d6e66cff12d9f446c592e90db31642d503e29ade.zip | |
macho: fix dirtying of GOT entries
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/MachO.zig | 13 |
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; |
