aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO/Object.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-05-05 09:21:32 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-05-06 17:09:58 +0200
commitef8a666797d6fb2849762dd157379ca227762c90 (patch)
tree53e7ddeef1dc091efad1ad53665b448ceba2c94f /src/link/MachO/Object.zig
parentad33e34836866e0528ca7601155c5dafe538347b (diff)
downloadzig-ef8a666797d6fb2849762dd157379ca227762c90.tar.gz
zig-ef8a666797d6fb2849762dd157379ca227762c90.zip
zld: cleanup relocs and flag errors on unhandled symbol types
Diffstat (limited to 'src/link/MachO/Object.zig')
-rw-r--r--src/link/MachO/Object.zig24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig
index 31cc63cfe0..3b8aa7a6cf 100644
--- a/src/link/MachO/Object.zig
+++ b/src/link/MachO/Object.zig
@@ -343,14 +343,22 @@ pub fn parseSymbols(self: *Object) !void {
_ = try self.file.?.preadAll(strtab, symtab_cmd.stroff);
for (slice) |sym| {
+ const sym_name = mem.spanZ(@ptrCast([*:0]const u8, strtab.ptr + sym.n_strx));
+
if (Symbol.isStab(sym)) {
- log.err("TODO handle stabs embedded within object files", .{});
- return error.HandleStabsInObjects;
+ log.err("stab {s} in {s}", .{ sym_name, self.name.? });
+ return error.UnhandledSymbolType;
+ }
+ if (Symbol.isIndr(sym)) {
+ log.err("indirect symbol {s} in {s}", .{ sym_name, self.name.? });
+ return error.UnhandledSymbolType;
+ }
+ if (Symbol.isAbs(sym)) {
+ log.err("absolute symbol {s} in {s}", .{ sym_name, self.name.? });
+ return error.UnhandledSymbolType;
}
- const sym_name = mem.spanZ(@ptrCast([*:0]const u8, strtab.ptr + sym.n_strx));
const name = try self.allocator.dupe(u8, sym_name);
-
const symbol: *Symbol = symbol: {
if (Symbol.isSect(sym)) {
const linkage: Symbol.Regular.Linkage = linkage: {
@@ -374,6 +382,14 @@ pub fn parseSymbols(self: *Object) !void {
break :symbol &regular.base;
}
+ if (sym.n_value != 0) {
+ log.err("common symbol {s} in {s}", .{ sym_name, self.name.? });
+ return error.UnhandledSymbolType;
+ // const comm_size = sym.n_value;
+ // const comm_align = (sym.n_desc >> 8) & 0x0f;
+ // log.warn("Common symbol: size 0x{x}, align 0x{x}", .{ comm_size, comm_align });
+ }
+
const undef = try self.allocator.create(Symbol.Unresolved);
errdefer self.allocator.destroy(undef);
undef.* = .{