Commit 4b1a883d35

Jakub Konka <kubkon@jakubkonka.com>
2023-02-07 02:54:18
macho: ensure local syms buffer is nlist_64 aligned when re-reading from file
1 parent f63eda3
Changed files (2)
src
link
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];
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;