aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO/Object.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-06-25 16:36:59 +0200
committerAndrew Kelley <andrew@ziglang.org>2023-06-25 14:33:00 -0700
commit852eb272bf895ee6fc242e298e31d666caa9d0df (patch)
treecef7aa1fe4ecbe34d4e92559c1e89fa67e32fced /src/link/MachO/Object.zig
parentdf389b62de4430434a6518580e27208101ae2fc8 (diff)
downloadzig-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.zig6
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,