aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO/Object.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-08-10 22:26:29 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-08-10 22:28:05 -0700
commitfa620ef710bbbf7f642fd1d6d24a188d02902988 (patch)
tree3831b8ef6ef96938dd9f3d678dd3e353e6e92cf6 /src/link/MachO/Object.zig
parentcc56400e62ae7d59cccf78d0cfe2e4b990d53abc (diff)
downloadzig-fa620ef710bbbf7f642fd1d6d24a188d02902988.tar.gz
zig-fa620ef710bbbf7f642fd1d6d24a188d02902988.zip
link.MachO: use accurate alignment attribute on pointers
Also adds a new method to ArrayList: appendUnalignedSlice
Diffstat (limited to 'src/link/MachO/Object.zig')
-rw-r--r--src/link/MachO/Object.zig25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig
index 996a85ed4b..935183bbc6 100644
--- a/src/link/MachO/Object.zig
+++ b/src/link/MachO/Object.zig
@@ -24,7 +24,7 @@ mtime: u64,
contents: []align(@alignOf(u64)) const u8,
header: macho.mach_header_64 = undefined,
-in_symtab: []const macho.nlist_64 = undefined,
+in_symtab: []align(1) const macho.nlist_64 = undefined,
in_strtab: []const u8 = undefined,
symtab: std.ArrayListUnmanaged(macho.nlist_64) = .{},
@@ -99,12 +99,13 @@ pub fn parse(self: *Object, allocator: Allocator, cpu_arch: std.Target.Cpu.Arch)
},
.SYMTAB => {
const symtab = cmd.cast(macho.symtab_command).?;
+ // Sadly, SYMTAB may be at an unaligned offset within the object file.
self.in_symtab = @ptrCast(
- [*]const macho.nlist_64,
- @alignCast(@alignOf(macho.nlist_64), &self.contents[symtab.symoff]),
+ [*]align(1) const macho.nlist_64,
+ self.contents.ptr + symtab.symoff,
)[0..symtab.nsyms];
self.in_strtab = self.contents[symtab.stroff..][0..symtab.strsize];
- try self.symtab.appendSlice(allocator, self.in_symtab);
+ try self.symtab.appendUnalignedSlice(allocator, self.in_symtab);
},
else => {},
}
@@ -196,10 +197,10 @@ fn filterSymbolsByAddress(
}
fn filterRelocs(
- relocs: []const macho.relocation_info,
+ relocs: []align(1) const macho.relocation_info,
start_addr: u64,
end_addr: u64,
-) []const macho.relocation_info {
+) []align(1) const macho.relocation_info {
const Predicate = struct {
addr: u64,
@@ -303,8 +304,8 @@ pub fn splitIntoAtomsOneShot(self: *Object, macho_file: *MachO, object_id: u32)
// Read section's list of relocations
const relocs = @ptrCast(
- [*]const macho.relocation_info,
- @alignCast(@alignOf(macho.relocation_info), &self.contents[sect.reloff]),
+ [*]align(1) const macho.relocation_info,
+ self.contents.ptr + sect.reloff,
)[0..sect.nreloc];
// Symbols within this section only.
@@ -472,7 +473,7 @@ fn createAtomFromSubsection(
size: u64,
alignment: u32,
code: ?[]const u8,
- relocs: []const macho.relocation_info,
+ relocs: []align(1) const macho.relocation_info,
indexes: []const SymbolAtIndex,
match: u8,
sect: macho.section_64,
@@ -538,7 +539,7 @@ pub fn getSourceSection(self: Object, index: u16) macho.section_64 {
return self.sections.items[index];
}
-pub fn parseDataInCode(self: Object) ?[]const macho.data_in_code_entry {
+pub fn parseDataInCode(self: Object) ?[]align(1) const macho.data_in_code_entry {
var it = LoadCommandIterator{
.ncmds = self.header.ncmds,
.buffer = self.contents[@sizeOf(macho.mach_header_64)..][0..self.header.sizeofcmds],
@@ -549,8 +550,8 @@ pub fn parseDataInCode(self: Object) ?[]const macho.data_in_code_entry {
const dice = cmd.cast(macho.linkedit_data_command).?;
const ndice = @divExact(dice.datasize, @sizeOf(macho.data_in_code_entry));
return @ptrCast(
- [*]const macho.data_in_code_entry,
- @alignCast(@alignOf(macho.data_in_code_entry), &self.contents[dice.dataoff]),
+ [*]align(1) const macho.data_in_code_entry,
+ self.contents.ptr + dice.dataoff,
)[0..ndice];
},
else => {},