authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-02-07 02:54:18+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-02-07 03:14:26+01:00
log4b1a883d35565766d30f587d2cb2ccfe8c065c8b
treeb44064a12274e2b7adcfaea3adbca93ba8ce1af2
parentf63eda3f6ae4369e12b68bb13e36b23957a9d809

macho: ensure local syms buffer is nlist_64 aligned when re-reading from file


2 files changed, 5 insertions(+), 3 deletions(-)

src/link/MachO/Dylib.zig+2
...@@ -166,6 +166,8 @@ pub fn parseFromBinary(...@@ -166,6 +166,8 @@ pub fn parseFromBinary(
166 const symtab_cmd = cmd.cast(macho.symtab_command).?;166 const symtab_cmd = cmd.cast(macho.symtab_command).?;
167 const symtab = @ptrCast(167 const symtab = @ptrCast(
168 [*]const macho.nlist_64,168 [*]const macho.nlist_64,
169 // Alignment is guaranteed as a dylib is a final linked image and has to have sections
170 // properly aligned in order to be correctly loaded by the loader.
169 @alignCast(@alignOf(macho.nlist_64), &data[symtab_cmd.symoff]),171 @alignCast(@alignOf(macho.nlist_64), &data[symtab_cmd.symoff]),
170 )[0..symtab_cmd.nsyms];172 )[0..symtab_cmd.nsyms];
171 const strtab = data[symtab_cmd.stroff..][0..symtab_cmd.strsize];173 const strtab = data[symtab_cmd.stroff..][0..symtab_cmd.strsize];
src/link/MachO/zld.zig+3-3
...@@ -2697,12 +2697,12 @@ pub const Zld = struct {...@@ -2697,12 +2697,12 @@ pub const Zld = struct {
2697 // Exclude region comprising all symbol stabs.2697 // Exclude region comprising all symbol stabs.
2698 const nlocals = self.dysymtab_cmd.nlocalsym;2698 const nlocals = self.dysymtab_cmd.nlocalsym;
26992699
2700 const locals_buf = try self.gpa.alloc(u8, nlocals * @sizeOf(macho.nlist_64));2700 const locals = try self.gpa.alloc(macho.nlist_64, nlocals);
2701 defer self.gpa.free(locals_buf);2701 defer self.gpa.free(locals);
27022702
2703 const locals_buf = @ptrCast([*]u8, locals.ptr)[0 .. @sizeOf(macho.nlist_64) * nlocals];
2703 const amt = try self.file.preadAll(locals_buf, self.symtab_cmd.symoff);2704 const amt = try self.file.preadAll(locals_buf, self.symtab_cmd.symoff);
2704 if (amt != locals_buf.len) return error.InputOutput;2705 if (amt != locals_buf.len) return error.InputOutput;
2705 const locals = @ptrCast([*]macho.nlist_64, @alignCast(@alignOf(macho.nlist_64), locals_buf))[0..nlocals];
27062706
2707 const istab: usize = for (locals) |local, i| {2707 const istab: usize = for (locals) |local, i| {
2708 if (local.stab()) break i;2708 if (local.stab()) break i;