From 4b1a883d35565766d30f587d2cb2ccfe8c065c8b Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Tue, 7 Feb 2023 02:54:18 +0100 Subject: macho: ensure local syms buffer is nlist_64 aligned when re-reading from file --- src/link/MachO/Dylib.zig | 2 ++ src/link/MachO/zld.zig | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'src/link') diff --git a/src/link/MachO/Dylib.zig b/src/link/MachO/Dylib.zig index 1c1842aaed..a2c4bad942 100644 --- a/src/link/MachO/Dylib.zig +++ b/src/link/MachO/Dylib.zig @@ -166,6 +166,8 @@ pub fn parseFromBinary( const symtab_cmd = cmd.cast(macho.symtab_command).?; const symtab = @ptrCast( [*]const macho.nlist_64, + // Alignment is guaranteed as a dylib is a final linked image and has to have sections + // properly aligned in order to be correctly loaded by the loader. @alignCast(@alignOf(macho.nlist_64), &data[symtab_cmd.symoff]), )[0..symtab_cmd.nsyms]; const strtab = data[symtab_cmd.stroff..][0..symtab_cmd.strsize]; diff --git a/src/link/MachO/zld.zig b/src/link/MachO/zld.zig index 6a83de0c19..095ac9b5ce 100644 --- a/src/link/MachO/zld.zig +++ b/src/link/MachO/zld.zig @@ -2697,12 +2697,12 @@ pub const Zld = struct { // Exclude region comprising all symbol stabs. const nlocals = self.dysymtab_cmd.nlocalsym; - const locals_buf = try self.gpa.alloc(u8, nlocals * @sizeOf(macho.nlist_64)); - defer self.gpa.free(locals_buf); + const locals = try self.gpa.alloc(macho.nlist_64, nlocals); + defer self.gpa.free(locals); + const locals_buf = @ptrCast([*]u8, locals.ptr)[0 .. @sizeOf(macho.nlist_64) * nlocals]; const amt = try self.file.preadAll(locals_buf, self.symtab_cmd.symoff); if (amt != locals_buf.len) return error.InputOutput; - const locals = @ptrCast([*]macho.nlist_64, @alignCast(@alignOf(macho.nlist_64), locals_buf))[0..nlocals]; const istab: usize = for (locals) |local, i| { if (local.stab()) break i; -- cgit v1.2.3