authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-19 21:53:30+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-21 22:44:28+02:00
logd6e66cff12d9f446c592e90db31642d503e29ade
tree062207e4591cfec78ba79f1645bbd2e7d0ed1bfa
parentf9e9974c8f67a7452a08973e963f2c06f85424b3

macho: fix dirtying of GOT entries


1 files changed, 8 insertions(+), 5 deletions(-)

src/link/MachO.zig+8-5
...@@ -1335,17 +1335,20 @@ fn markRelocsDirtyByAddress(self: *MachO, addr: u64) void {...@@ -1335,17 +1335,20 @@ fn markRelocsDirtyByAddress(self: *MachO, addr: u64) void {
1335 for (self.relocs.values()) |*relocs| {1335 for (self.relocs.values()) |*relocs| {
1336 for (relocs.items) |*reloc| {1336 for (relocs.items) |*reloc| {
1337 const target_addr = reloc.getTargetBaseAddress(self) orelse continue;1337 const target_addr = reloc.getTargetBaseAddress(self) orelse continue;
1338 if (target_addr == 0) continue;
1339 if (target_addr < addr) continue;1338 if (target_addr < addr) continue;
1340 reloc.dirty = true;1339 reloc.dirty = true;
1341 }1340 }
1342 }1341 }
13431342
1344 // Dirty synthetic table sections if necessary1343 // TODO: dirty only really affected GOT cells
1345 {1344 for (self.got_table.entries.items) |entry| {
1346 const target_addr = self.getSegment(self.got_section_index.?).vmaddr;1345 const target_addr = self.getSymbol(entry).n_value;
1347 if (target_addr >= addr) self.got_table_contents_dirty = true;1346 if (target_addr >= addr) {
1347 self.got_table_contents_dirty = true;
1348 break;
1349 }
1348 }1350 }
1351
1349 {1352 {
1350 const stubs_addr = self.getSegment(self.stubs_section_index.?).vmaddr;1353 const stubs_addr = self.getSegment(self.stubs_section_index.?).vmaddr;
1351 const stub_helper_addr = self.getSegment(self.stub_helper_section_index.?).vmaddr;1354 const stub_helper_addr = self.getSegment(self.stub_helper_section_index.?).vmaddr;