From 26da7c8207ff73927bcc8d5608703175074e266f Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Sat, 3 Aug 2024 13:12:52 +0200 Subject: [PATCH] elf: fix symbol resolution for Objects --- src/link/Elf/LinkerDefined.zig | 9 +++++++-- src/link/Elf/Object.zig | 12 +++++++++--- src/link/Elf/SharedObject.zig | 9 +++++++-- src/link/Elf/synthetic_sections.zig | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/link/Elf/LinkerDefined.zig b/src/link/Elf/LinkerDefined.zig index f28b94e3698b006232dc1b62224a9c3dfeb7958f..0ead1dba62d824672551d5b6f9ccb57e85e91ab2 100644 --- a/src/link/Elf/LinkerDefined.zig +++ b/src/link/Elf/LinkerDefined.zig @@ -447,8 +447,13 @@ fn formatSymtab( const self = ctx.self; const elf_file = ctx.elf_file; try writer.writeAll(" globals\n"); - for (self.symbols.items) |sym| { - try writer.print(" {}\n", .{sym.fmt(elf_file)}); + for (self.symbols.items, 0..) |sym, i| { + const ref = self.resolveSymbol(@intCast(i), elf_file); + if (elf_file.symbol(ref)) |ref_sym| { + try writer.print(" {}\n", .{ref_sym.fmt(elf_file)}); + } else { + try writer.print(" {s} : unclaimed\n", .{sym.name(elf_file)}); + } } } diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig index 03bc60d9377a48ad9dccbd3ccd5c8312c622b576..ef327dc9fbda118e6ea0d67fb560c6aade91e61b 100644 --- a/src/link/Elf/Object.zig +++ b/src/link/Elf/Object.zig @@ -612,7 +612,7 @@ pub fn resolveSymbols(self: *Object, elf_file: *Elf) !void { const first_global = self.first_global orelse return; for (self.globals(), first_global..) |_, i| { const esym = self.symtab.items[i]; - if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON) { + if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON and esym.st_shndx != elf.SHN_UNDEF) { const atom_index = self.atoms_indexes.items[esym.st_shndx]; const atom_ptr = self.atom(atom_index) orelse continue; if (!atom_ptr.alive) continue; @@ -1492,8 +1492,14 @@ fn formatSymtab( try writer.print(" {}\n", .{sym.fmt(elf_file)}); } try writer.writeAll(" globals\n"); - for (object.globals()) |sym| { - try writer.print(" {}\n", .{sym.fmt(elf_file)}); + for (object.globals(), 0..) |sym, i| { + const first_global = object.first_global.?; + const ref = object.resolveSymbol(@intCast(i + first_global), elf_file); + if (elf_file.symbol(ref)) |ref_sym| { + try writer.print(" {}\n", .{ref_sym.fmt(elf_file)}); + } else { + try writer.print(" {s} : unclaimed\n", .{sym.name(elf_file)}); + } } } diff --git a/src/link/Elf/SharedObject.zig b/src/link/Elf/SharedObject.zig index 4fa3bf6ee7d131eb55d53570f0c7dfbd93f53dc1..c4d84e29c915699fac879e0241313e76dc9bad13 100644 --- a/src/link/Elf/SharedObject.zig +++ b/src/link/Elf/SharedObject.zig @@ -493,8 +493,13 @@ fn formatSymtab( const shared = ctx.shared; const elf_file = ctx.elf_file; try writer.writeAll(" globals\n"); - for (shared.symbols.items) |sym| { - try writer.print(" {}\n", .{sym.fmt(elf_file)}); + for (shared.symbols.items, 0..) |sym, i| { + const ref = shared.resolveSymbol(@intCast(i), elf_file); + if (elf_file.symbol(ref)) |ref_sym| { + try writer.print(" {}\n", .{ref_sym.fmt(elf_file)}); + } else { + try writer.print(" {s} : unclaimed\n", .{sym.name(elf_file)}); + } } } diff --git a/src/link/Elf/synthetic_sections.zig b/src/link/Elf/synthetic_sections.zig index c767fb093c87f082096ad7cbff4ea925833371aa..e1ec90139eb52fb3ccc76b87e840c6f6d7ad14da 100644 --- a/src/link/Elf/synthetic_sections.zig +++ b/src/link/Elf/synthetic_sections.zig @@ -417,9 +417,9 @@ pub const ZigGotSection = struct { _ = unused_fmt_string; const zig_got = ctx.zig_got; const elf_file = ctx.elf_file; - const zo = elf_file.zigObjectPtr().?; try writer.writeAll(".zig.got\n"); for (zig_got.entries.items, 0..) |entry, index| { + const zo = elf_file.zigObjectPtr().?; const symbol = zo.symbol(entry); try writer.print(" {d}@0x{x} => {d}@0x{x} ({s})\n", .{ index, -- 2.54.0