Commit 3e73a3c29b

Jakub Konka <kubkon@jakubkonka.com>
2021-04-13 22:48:31
zld: treat priv extern as weak symbol
1 parent be551d8
Changed files (2)
src
link
src/link/MachO/Zld.zig
@@ -1236,11 +1236,12 @@ fn resolveSymbolsInObject(self: *Zld, object_id: u16) !void {
             continue;
         } else if (Symbol.isGlobal(sym)) {
             const sym_name = object.getString(sym.n_strx);
+            const is_weak = Symbol.isWeakDef(sym) or Symbol.isPext(sym);
             const global = self.symtab.getEntry(sym_name) orelse {
                 // Put new global symbol into the symbol table.
                 const name = try self.allocator.dupe(u8, sym_name);
                 try self.symtab.putNoClobber(self.allocator, name, .{
-                    .tag = if (Symbol.isWeakDef(sym)) .weak else .strong,
+                    .tag = if (is_weak) .weak else .strong,
                     .name = name,
                     .address = 0,
                     .section = 0,
@@ -1251,10 +1252,15 @@ fn resolveSymbolsInObject(self: *Zld, object_id: u16) !void {
             };
 
             switch (global.value.tag) {
-                .weak => continue, // If symbol is weak, nothing to do.
+                .weak => {
+                    if (is_weak) continue; // Nothing to do for weak symbol.
+                },
                 .strong => {
-                    log.err("symbol '{s}' defined multiple times", .{sym_name});
-                    return error.MultipleSymbolDefinitions;
+                    if (!is_weak) {
+                        log.err("symbol '{s}' defined multiple times", .{sym_name});
+                        return error.MultipleSymbolDefinitions;
+                    }
+                    continue;
                 },
                 else => {},
             }
@@ -1340,6 +1346,21 @@ fn resolveSymbols(self: *Zld) !void {
         .section = 0,
         .file = 0,
     });
+
+    {
+        log.warn("symtab", .{});
+        for (self.symtab.items()) |sym| {
+            switch (sym.value.tag) {
+                .weak, .strong => {
+                    log.warn("    | {s} => {s}", .{ sym.key, self.objects.items[sym.value.file.?].name.? });
+                },
+                .import => {
+                    log.warn("    | {s} => libSystem.B.dylib", .{sym.key});
+                },
+                else => unreachable,
+            }
+        }
+    }
 }
 
 fn resolveStubsAndGotEntries(self: *Zld) !void {
src/link/MachO.zig
@@ -645,8 +645,7 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void {
                 break :blk true;
             }
 
-            if (self.base.options.link_libcpp or
-                self.base.options.output_mode == .Lib or
+            if (self.base.options.output_mode == .Lib or
                 self.base.options.linker_script != null)
             {
                 // Fallback to LLD in this handful of cases on x86_64 only.