authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-13 13:36:08+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-13 13:36:08+02:00
log461543a5fd27415710f027d034b83ef196bc8a44
treed94b91c8915261eb8bb239a9b7d2b846fc1bcd27
parent65e4725aba5947a86c12c775b05a31cc1c08cfab

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.

1 files changed, 9 insertions(+), 21 deletions(-)

src/link/MachO/Zld.zig+9-21
...@@ -1284,17 +1284,14 @@ fn resolveSymbols(self: *Zld) !void {...@@ -1284,17 +1284,14 @@ fn resolveSymbols(self: *Zld) !void {
1284 }1284 }
12851285
1286 // Second pass, resolve symbols in static libraries.1286 // Second pass, resolve symbols in static libraries.
1287 var next: usize = 0;1287 var next_sym: usize = 0;
1288 var hit: bool = undefined;1288 var nsyms: usize = self.symtab.items().len;
1289 while (true) {1289 while (next_sym < nsyms) : (next_sym += 1) {
1290 var archive = &self.archives.items[next];1290 const sym = self.symtab.items()[next_sym];
1291 hit = false;1291 if (sym.value.tag != .undef) continue;
12921292
1293 for (self.symtab.items()) |entry| {1293 const sym_name = sym.value.name;
1294 if (entry.value.tag != .undef) continue;1294 for (self.archives.items) |archive| {
1295
1296 const sym_name = entry.value.name;
1297
1298 // Check if the entry exists in a static archive.1295 // Check if the entry exists in a static archive.
1299 const offsets = archive.toc.get(sym_name) orelse {1296 const offsets = archive.toc.get(sym_name) orelse {
1300 // No hit.1297 // No hit.
...@@ -1307,18 +1304,9 @@ fn resolveSymbols(self: *Zld) !void {...@@ -1307,18 +1304,9 @@ fn resolveSymbols(self: *Zld) !void {
1307 try self.objects.append(self.allocator, object);1304 try self.objects.append(self.allocator, object);
1308 try self.resolveSymbolsInObject(object_id);1305 try self.resolveSymbolsInObject(object_id);
13091306
1310 hit = true;1307 nsyms = self.symtab.items().len;
1311 break;1308 break;
1312 }1309 }
1313
1314 if (!hit) {
1315 // Next archive.
1316 next += 1;
1317 if (next == self.archives.items.len) {
1318 break;
1319 }
1320 archive = &self.archives.items[next];
1321 }
1322 }1310 }
13231311
1324 // Third pass, resolve symbols in dynamic libraries.1312 // Third pass, resolve symbols in dynamic libraries.