diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2021-12-08 17:07:58 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2021-12-08 20:48:12 +0100 |
| commit | 98e36ea6b9aff3403685af3a76ffa998249c9b84 (patch) | |
| tree | f9c7f968eea4be85d8114af3e2df4323bda075ba /src | |
| parent | f0ec70edd1ab632ab25d48f7b27a444d9ac444bd (diff) | |
| download | zig-98e36ea6b9aff3403685af3a76ffa998249c9b84.tar.gz zig-98e36ea6b9aff3403685af3a76ffa998249c9b84.zip | |
macho: handle non-extern UNSIGNED relocs on arm64
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO/Atom.zig | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig index 6e3655d438..99693a7da3 100644 --- a/src/link/MachO/Atom.zig +++ b/src/link/MachO/Atom.zig @@ -393,11 +393,15 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC try addGotEntry(target, context); }, .ARM64_RELOC_UNSIGNED => { - assert(rel.r_extern == 1); addend = if (rel.r_length == 3) mem.readIntLittle(i64, self.code.items[offset..][0..8]) else mem.readIntLittle(i32, self.code.items[offset..][0..4]); + if (rel.r_extern == 0) { + const seg = context.object.load_commands.items[context.object.segment_cmd_index.?].Segment; + const target_sect_base_addr = seg.sections.items[rel.r_symbolnum - 1].addr; + addend -= @intCast(i64, target_sect_base_addr); + } try self.addPtrBindingOrRebase(rel, target, context); }, else => {}, |
