aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-04-13 13:36:08 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-04-13 13:36:08 +0200
commit461543a5fd27415710f027d034b83ef196bc8a44 (patch)
treed94b91c8915261eb8bb239a9b7d2b846fc1bcd27 /src/link/MachO
parent65e4725aba5947a86c12c775b05a31cc1c08cfab (diff)
downloadzig-461543a5fd27415710f027d034b83ef196bc8a44.tar.gz
zig-461543a5fd27415710f027d034b83ef196bc8a44.zip
zld: fix symbol resolution from interdep archives
Fixes symbol resolution if an archive occurring later in the linker line depends on a object embedded within the archive that occurred before.
Diffstat (limited to 'src/link/MachO')
-rw-r--r--src/link/MachO/Zld.zig30
1 files changed, 9 insertions, 21 deletions
diff --git a/src/link/MachO/Zld.zig b/src/link/MachO/Zld.zig
index 56a35a3bca..ae475ab30d 100644
--- a/src/link/MachO/Zld.zig
+++ b/src/link/MachO/Zld.zig
@@ -1284,17 +1284,14 @@ fn resolveSymbols(self: *Zld) !void {
}
// Second pass, resolve symbols in static libraries.
- var next: usize = 0;
- var hit: bool = undefined;
- while (true) {
- var archive = &self.archives.items[next];
- hit = false;
-
- for (self.symtab.items()) |entry| {
- if (entry.value.tag != .undef) continue;
-
- const sym_name = entry.value.name;
-
+ var next_sym: usize = 0;
+ var nsyms: usize = self.symtab.items().len;
+ while (next_sym < nsyms) : (next_sym += 1) {
+ const sym = self.symtab.items()[next_sym];
+ if (sym.value.tag != .undef) continue;
+
+ const sym_name = sym.value.name;
+ for (self.archives.items) |archive| {
// Check if the entry exists in a static archive.
const offsets = archive.toc.get(sym_name) orelse {
// No hit.
@@ -1307,18 +1304,9 @@ fn resolveSymbols(self: *Zld) !void {
try self.objects.append(self.allocator, object);
try self.resolveSymbolsInObject(object_id);
- hit = true;
+ nsyms = self.symtab.items().len;
break;
}
-
- if (!hit) {
- // Next archive.
- next += 1;
- if (next == self.archives.items.len) {
- break;
- }
- archive = &self.archives.items[next];
- }
}
// Third pass, resolve symbols in dynamic libraries.