authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-03-28 11:07:30+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-13 10:56:03+02:00
log116ea1bf2c7b3dd722beb1b4cf8d6e7e9755294f
tree50c4fdeaa662072cbc7275be8463485147d35c06
parentb0105029caafda4668f788387270ee8fcc1ac175

zld: assume remaining undefs are from libSystem


1 files changed, 37 insertions(+), 1 deletions(-)

src/link/MachO/Zld.zig+37-1
......@@ -75,6 +75,7 @@ bss_section_index: ?u16 = null,
7575
7676globals: std.StringArrayHashMapUnmanaged(Symbol) = .{},
7777undefs: std.StringArrayHashMapUnmanaged(Symbol) = .{},
78externs: std.StringArrayHashMapUnmanaged(Symbol) = .{},
7879strtab: std.ArrayListUnmanaged(u8) = .{},
7980
8081// locals: std.StringArrayHashMapUnmanaged(std.ArrayListUnmanaged(Symbol)) = .{},
......@@ -223,6 +224,11 @@ pub fn deinit(self: *Zld) void {
223224 self.allocator.free(entry.key);
224225 }
225226 self.undefs.deinit(self.allocator);
227
228 for (self.externs.items()) |*entry| {
229 self.allocator.free(entry.key);
230 }
231 self.externs.deinit(self.allocator);
226232}
227233
228234pub fn closeFiles(self: Zld) void {
......@@ -1215,7 +1221,11 @@ fn resolveSymbolsInObject(self: *Zld, object_id: u16) !void {
12151221 .file = object_id,
12161222 .index = @intCast(u32, sym_id),
12171223 });
1218 _ = self.undefs.swapRemove(sym_name);
1224
1225 if (self.undefs.swapRemove(sym_name)) |undef| {
1226 self.allocator.free(undef.key);
1227 }
1228
12191229 continue;
12201230 };
12211231
......@@ -1252,6 +1262,7 @@ fn resolveSymbols(self: *Zld) !void {
12521262 try self.resolveSymbolsInObject(@intCast(u16, object_id));
12531263 }
12541264
1265 // Second pass, resolve symbols in static libraries.
12551266 var next: usize = 0;
12561267 while (true) {
12571268 var archive = &self.archives.items[next];
......@@ -1285,6 +1296,26 @@ fn resolveSymbols(self: *Zld) !void {
12851296 archive = &self.archives.items[next];
12861297 }
12871298 }
1299
1300 // Third pass, resolve symbols in dynamic libraries.
1301 // TODO Implement libSystem as a hard-coded library, or ship with
1302 // a libSystem.B.tbd definition file?
1303 while (self.undefs.items().len > 0) {
1304 const entry = self.undefs.pop();
1305 try self.externs.putNoClobber(self.allocator, entry.key, .{
1306 .inner = entry.value.inner,
1307 .file = 0,
1308 });
1309 }
1310
1311 // If there are any undefs left, flag an error.
1312 if (self.undefs.items().len > 0) {
1313 for (self.undefs.items()) |entry| {
1314 log.err("undefined reference to symbol '{s}'", .{entry.key});
1315 }
1316
1317 return error.UndefinedSymbolReference;
1318 }
12881319}
12891320
12901321fn doRelocs(self: *Zld) !void {
......@@ -3203,6 +3234,11 @@ fn printSymtab(self: Zld) void {
32033234 log.warn(" | {s} => {any}", .{ entry.key, entry.value });
32043235 }
32053236
3237 log.warn("externs", .{});
3238 for (self.externs.items()) |entry| {
3239 log.warn(" | {s} => {any}", .{ entry.key, entry.value });
3240 }
3241
32063242 log.warn("undefs", .{});
32073243 for (self.undefs.items()) |entry| {
32083244 log.warn(" | {s} => {any}", .{ entry.key, entry.value });