diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-06-25 16:36:59 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-25 14:33:00 -0700 |
| commit | 852eb272bf895ee6fc242e298e31d666caa9d0df (patch) | |
| tree | cef7aa1fe4ecbe34d4e92559c1e89fa67e32fced /src/link/MachO/Object.zig | |
| parent | df389b62de4430434a6518580e27208101ae2fc8 (diff) | |
| download | zig-852eb272bf895ee6fc242e298e31d666caa9d0df.tar.gz zig-852eb272bf895ee6fc242e298e31d666caa9d0df.zip | |
macho: add fixes to __eh_frame parsing emitted by Nix C++ compiler
Diffstat (limited to 'src/link/MachO/Object.zig')
| -rw-r--r-- | src/link/MachO/Object.zig | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig index 29fe2988b6..3e752d4a19 100644 --- a/src/link/MachO/Object.zig +++ b/src/link/MachO/Object.zig @@ -740,7 +740,11 @@ fn parseEhFrameSection(self: *Object, zld: *Zld, object_id: u32) !void { .aarch64 => { assert(rel_pos.len > 0); // TODO convert to an error as the FDE eh frame is malformed // Find function symbol that this record describes - const rel = relocs[rel_pos.start..][rel_pos.len - 1]; + const rel = for (relocs[rel_pos.start..][0..rel_pos.len]) |rel| { + if (rel.r_address - @as(i32, @intCast(offset)) == 8 and + @as(macho.reloc_type_arm64, @enumFromInt(rel.r_type)) == .ARM64_RELOC_UNSIGNED) + break rel; + } else unreachable; const target = Atom.parseRelocTarget(zld, .{ .object_id = object_id, .rel = rel, |
