authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-06-15 07:51:55+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-06-15 11:51:59+02:00
log2034ca82b474b34aaca57d49b1cff38a9f4ec9a5
tree5f9de388ea55a78d7156883bec1cd9e4550690f2
parentdb08d4c3d63cfee9da0e4c6825c906d4083e8303

zld: stubs can also be part of unsigned relocs


1 files changed, 7 insertions(+), 13 deletions(-)

src/link/MachO/Zld.zig+7-13
......@@ -1891,7 +1891,6 @@ fn resolveStubsAndGotEntries(self: *Zld) !void {
18911891 const relocs = sect.relocs orelse continue;
18921892 for (relocs) |rel| {
18931893 switch (rel.@"type") {
1894 .unsigned => continue,
18951894 .got_page, .got_page_off, .got_load, .got, .pointer_to_got => {
18961895 const sym = rel.target.symbol.getTopmostAlias();
18971896 if (sym.got_index != null) continue;
......@@ -2025,12 +2024,9 @@ fn resolveRelocsAndWriteSections(self: *Zld) !void {
20252024 const got = dc_seg.sections.items[self.got_section_index.?];
20262025 const final = rel.target.symbol.getTopmostAlias();
20272026 const got_index = final.got_index orelse {
2028 // TODO remove this when we can link against TAPI files.
2029 log.err("undefined reference to symbol '{s}'", .{final.name});
2030 log.err(" | referenced in {s}", .{
2031 rel.target.symbol.cast(Symbol.Unresolved).?.file.name.?,
2032 });
2033 return error.UndefinedSymbolReference;
2027 log.err("expected GOT index relocating symbol '{s}'", .{final.name});
2028 log.err("this is an internal linker error", .{});
2029 return error.FailedToResolveRelocationTarget;
20342030 };
20352031 args.target_addr = got.addr + got_index * @sizeOf(u64);
20362032 },
......@@ -2099,16 +2095,14 @@ fn relocTargetAddr(self: *Zld, object: *const Object, target: reloc.Relocation.T
20992095 const segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment;
21002096 const stubs = segment.sections.items[self.stubs_section_index.?];
21012097 const stubs_index = proxy.base.stubs_index orelse {
2102 // TODO remove this when we can link against TAPI files.
2103 log.err("undefined reference to symbol '{s}'", .{final.name});
2104 log.err(" | referenced in {s}", .{
2105 sym.cast(Symbol.Unresolved).?.file.name.?,
2106 });
2107 return error.UndefinedSymbolReference;
2098 log.err("expected stubs index when relocating symbol '{s}'", .{final.name});
2099 log.err("this is an internal linker error", .{});
2100 return error.FailedToResolveRelocationTarget;
21082101 };
21092102 break :blk stubs.addr + stubs_index * stubs.reserved2;
21102103 } else {
21112104 log.err("failed to resolve symbol '{s}' as a relocation target", .{sym.name});
2105 log.err("this is an internal linker error", .{});
21122106 return error.FailedToResolveRelocationTarget;
21132107 }
21142108 },