Skip to content

bad alignment cast in macho linking code #14558

@andrewrk

Description

@andrewrk

A user on IRC reported the following stack trace against zig 0.10.1:

thread 473118 panic: incorrect alignment
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/link/MachO/Object.zig:114:72: 0x1030338ab in link.MachO.Object.parse (zig2)
                    @alignCast(@alignOf(macho.nlist_64), &self.contents[symtab.symoff]),
                                                                       ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/link/MachO/Archive.zig:230:21: 0x1030485f7 in link.MachO.Archive.parseObject (zig2)
    try object.parse(gpa, cpu_arch);
                    ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/link/MachO/zld.zig:1056:55: 0x102d4af7f in link.MachO.zld.Zld.resolveSymbolsInArchives (zig2)
                const object = try archive.parseObject(gpa, cpu_arch, offsets.items[0]);
                                                      ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/link/MachO/zld.zig:4219:41: 0x102ad5443 in link.MachO.zld.linkWithZld (zig2)
        try zld.resolveSymbolsInArchives(&resolver);
                                        ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/link/MachO.zig:427:44: 0x10281667f in link.MachO.flush (zig2)
        .one_shot => return zld.linkWithZld(self, comp, prog_node),
                                           ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/link.zig:797:72: 0x10281345b in link.File.flush (zig2)
            .macho => return @fieldParentPtr(MachO, "base", base).flush(comp, prog_node),
                                                                       ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/Compilation.zig:2516:24: 0x10278ca2f in Compilation.flush (zig2)
    comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
                       ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/Compilation.zig:2480:27: 0x10277fb67 in Compilation.update (zig2)
            try comp.flush(main_progress_node);
                          ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/main.zig:3361:20: 0x102701857 in main.updateModule (zig2)
    try comp.update();
                   ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/main.zig:3028:17: 0x10263e09f in main.buildOutputType (zig2)
    updateModule(gpa, comp, hook) catch |err| switch (err) {
                ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/main.zig:230:31: 0x1025c6f6b in main.mainArgs (zig2)
        return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                              ^
/private/tmp/nix-build-zig-0.10.1.drv-0/source/src/stage1.zig:56:24: 0x1025c68a3 in main (zig2)
        stage2.mainArgs(gpa, arena, args) catch unreachable;
                       ^

I examined the corresponding master branch code, and it looks to me like the problem is still there:

@alignCast(@alignOf(macho.nlist_64), &self.contents[symtab.symoff]),

Note that this field is marked align(1), so the alignment cast is completely unnecessary:

in_symtab: ?[]align(1) const macho.nlist_64 = null,

cc @kubkon

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behaviorlinkingos-macosmacOS

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions