From 2034ca82b474b34aaca57d49b1cff38a9f4ec9a5 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Tue, 15 Jun 2021 07:51:55 +0200 Subject: [PATCH 1/2] zld: stubs can also be part of unsigned relocs --- src/link/MachO/Zld.zig | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/link/MachO/Zld.zig b/src/link/MachO/Zld.zig index c0b5f03c58..dcaf86ed67 100644 --- a/src/link/MachO/Zld.zig +++ b/src/link/MachO/Zld.zig @@ -1891,7 +1891,6 @@ fn resolveStubsAndGotEntries(self: *Zld) !void { const relocs = sect.relocs orelse continue; for (relocs) |rel| { switch (rel.@"type") { - .unsigned => continue, .got_page, .got_page_off, .got_load, .got, .pointer_to_got => { const sym = rel.target.symbol.getTopmostAlias(); if (sym.got_index != null) continue; @@ -2025,12 +2024,9 @@ fn resolveRelocsAndWriteSections(self: *Zld) !void { const got = dc_seg.sections.items[self.got_section_index.?]; const final = rel.target.symbol.getTopmostAlias(); const got_index = final.got_index orelse { - // TODO remove this when we can link against TAPI files. - log.err("undefined reference to symbol '{s}'", .{final.name}); - log.err(" | referenced in {s}", .{ - rel.target.symbol.cast(Symbol.Unresolved).?.file.name.?, - }); - return error.UndefinedSymbolReference; + log.err("expected GOT index relocating symbol '{s}'", .{final.name}); + log.err("this is an internal linker error", .{}); + return error.FailedToResolveRelocationTarget; }; args.target_addr = got.addr + got_index * @sizeOf(u64); }, @@ -2099,16 +2095,14 @@ fn relocTargetAddr(self: *Zld, object: *const Object, target: reloc.Relocation.T const segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment; const stubs = segment.sections.items[self.stubs_section_index.?]; const stubs_index = proxy.base.stubs_index orelse { - // TODO remove this when we can link against TAPI files. - log.err("undefined reference to symbol '{s}'", .{final.name}); - log.err(" | referenced in {s}", .{ - sym.cast(Symbol.Unresolved).?.file.name.?, - }); - return error.UndefinedSymbolReference; + log.err("expected stubs index when relocating symbol '{s}'", .{final.name}); + log.err("this is an internal linker error", .{}); + return error.FailedToResolveRelocationTarget; }; break :blk stubs.addr + stubs_index * stubs.reserved2; } else { log.err("failed to resolve symbol '{s}' as a relocation target", .{sym.name}); + log.err("this is an internal linker error", .{}); return error.FailedToResolveRelocationTarget; } }, From 82047633281252aed14b44831e8920950f8c7dd6 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Tue, 15 Jun 2021 11:48:19 +0200 Subject: [PATCH 2/2] zld: use ld64 defaults for searching system libs By default, `ld64` uses `-search_paths_first` which firstly tries to find a dylib, followed by an archive in each directory. --- src/link/MachO.zig | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 4de1708ff8..8c1d092f12 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -758,10 +758,11 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void { } } - // Search for static libraries first, then dynamic libraries. - // TODO Respect flags such as -search_paths_first to the linker. + // Assume ld64 default: -search_paths_first + // Look in each directory for a dylib (tbd), and then for archive + // TODO implement alternative: -search_dylibs_first // TODO text-based API, or .tbd files. - const exts = &[_][]const u8{ "a", "dylib" }; + const exts = &[_][]const u8{ "dylib", "a" }; for (search_lib_names.items) |l_name| { var found = false;