aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-02-07 02:54:18 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-02-07 03:14:26 +0100
commit4b1a883d35565766d30f587d2cb2ccfe8c065c8b (patch)
treeb44064a12274e2b7adcfaea3adbca93ba8ce1af2 /src/link
parentf63eda3f6ae4369e12b68bb13e36b23957a9d809 (diff)
downloadzig-4b1a883d35565766d30f587d2cb2ccfe8c065c8b.tar.gz
zig-4b1a883d35565766d30f587d2cb2ccfe8c065c8b.zip
macho: ensure local syms buffer is nlist_64 aligned when re-reading from file
Diffstat (limited to 'src/link')
-rw-r--r--src/link/MachO/Dylib.zig2
-rw-r--r--src/link/MachO/zld.zig6
2 files changed, 5 insertions, 3 deletions
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;