authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-03 13:12:52+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-07 10:21:02+02:00
log26da7c8207ff73927bcc8d5608703175074e266f
tree0adac21b5b90faf37e02a3f4d3ea2b7fa7463495
parent04f8f8ad3e5c00927a5eb64e03b5381a988ed472

elf: fix symbol resolution for Objects


4 files changed, 24 insertions(+), 8 deletions(-)

src/link/Elf/LinkerDefined.zig+7-2
......@@ -447,8 +447,13 @@ fn formatSymtab(
447447 const self = ctx.self;
448448 const elf_file = ctx.elf_file;
449449 try writer.writeAll(" globals\n");
450 for (self.symbols.items) |sym| {
451 try writer.print(" {}\n", .{sym.fmt(elf_file)});
450 for (self.symbols.items, 0..) |sym, i| {
451 const ref = self.resolveSymbol(@intCast(i), elf_file);
452 if (elf_file.symbol(ref)) |ref_sym| {
453 try writer.print(" {}\n", .{ref_sym.fmt(elf_file)});
454 } else {
455 try writer.print(" {s} : unclaimed\n", .{sym.name(elf_file)});
456 }
452457 }
453458}
454459
src/link/Elf/Object.zig+9-3
......@@ -612,7 +612,7 @@ pub fn resolveSymbols(self: *Object, elf_file: *Elf) !void {
612612 const first_global = self.first_global orelse return;
613613 for (self.globals(), first_global..) |_, i| {
614614 const esym = self.symtab.items[i];
615 if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON) {
615 if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON and esym.st_shndx != elf.SHN_UNDEF) {
616616 const atom_index = self.atoms_indexes.items[esym.st_shndx];
617617 const atom_ptr = self.atom(atom_index) orelse continue;
618618 if (!atom_ptr.alive) continue;
......@@ -1492,8 +1492,14 @@ fn formatSymtab(
14921492 try writer.print(" {}\n", .{sym.fmt(elf_file)});
14931493 }
14941494 try writer.writeAll(" globals\n");
1495 for (object.globals()) |sym| {
1496 try writer.print(" {}\n", .{sym.fmt(elf_file)});
1495 for (object.globals(), 0..) |sym, i| {
1496 const first_global = object.first_global.?;
1497 const ref = object.resolveSymbol(@intCast(i + first_global), elf_file);
1498 if (elf_file.symbol(ref)) |ref_sym| {
1499 try writer.print(" {}\n", .{ref_sym.fmt(elf_file)});
1500 } else {
1501 try writer.print(" {s} : unclaimed\n", .{sym.name(elf_file)});
1502 }
14971503 }
14981504}
14991505
src/link/Elf/SharedObject.zig+7-2
......@@ -493,8 +493,13 @@ fn formatSymtab(
493493 const shared = ctx.shared;
494494 const elf_file = ctx.elf_file;
495495 try writer.writeAll(" globals\n");
496 for (shared.symbols.items) |sym| {
497 try writer.print(" {}\n", .{sym.fmt(elf_file)});
496 for (shared.symbols.items, 0..) |sym, i| {
497 const ref = shared.resolveSymbol(@intCast(i), elf_file);
498 if (elf_file.symbol(ref)) |ref_sym| {
499 try writer.print(" {}\n", .{ref_sym.fmt(elf_file)});
500 } else {
501 try writer.print(" {s} : unclaimed\n", .{sym.name(elf_file)});
502 }
498503 }
499504}
500505
src/link/Elf/synthetic_sections.zig+1-1
......@@ -417,9 +417,9 @@ pub const ZigGotSection = struct {
417417 _ = unused_fmt_string;
418418 const zig_got = ctx.zig_got;
419419 const elf_file = ctx.elf_file;
420 const zo = elf_file.zigObjectPtr().?;
421420 try writer.writeAll(".zig.got\n");
422421 for (zig_got.entries.items, 0..) |entry, index| {
422 const zo = elf_file.zigObjectPtr().?;
423423 const symbol = zo.symbol(entry);
424424 try writer.print(" {d}@0x{x} => {d}@0x{x} ({s})\n", .{
425425 index,