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(...@@ -447,8 +447,13 @@ fn formatSymtab(
447 const self = ctx.self;447 const self = ctx.self;
448 const elf_file = ctx.elf_file;448 const elf_file = ctx.elf_file;
449 try writer.writeAll(" globals\n");449 try writer.writeAll(" globals\n");
450 for (self.symbols.items) |sym| {450 for (self.symbols.items, 0..) |sym, i| {
451 try writer.print(" {}\n", .{sym.fmt(elf_file)});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 }
452 }457 }
453}458}
454459
src/link/Elf/Object.zig+9-3
...@@ -612,7 +612,7 @@ pub fn resolveSymbols(self: *Object, elf_file: *Elf) !void {...@@ -612,7 +612,7 @@ pub fn resolveSymbols(self: *Object, elf_file: *Elf) !void {
612 const first_global = self.first_global orelse return;612 const first_global = self.first_global orelse return;
613 for (self.globals(), first_global..) |_, i| {613 for (self.globals(), first_global..) |_, i| {
614 const esym = self.symtab.items[i];614 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) {
616 const atom_index = self.atoms_indexes.items[esym.st_shndx];616 const atom_index = self.atoms_indexes.items[esym.st_shndx];
617 const atom_ptr = self.atom(atom_index) orelse continue;617 const atom_ptr = self.atom(atom_index) orelse continue;
618 if (!atom_ptr.alive) continue;618 if (!atom_ptr.alive) continue;
...@@ -1492,8 +1492,14 @@ fn formatSymtab(...@@ -1492,8 +1492,14 @@ fn formatSymtab(
1492 try writer.print(" {}\n", .{sym.fmt(elf_file)});1492 try writer.print(" {}\n", .{sym.fmt(elf_file)});
1493 }1493 }
1494 try writer.writeAll(" globals\n");1494 try writer.writeAll(" globals\n");
1495 for (object.globals()) |sym| {1495 for (object.globals(), 0..) |sym, i| {
1496 try writer.print(" {}\n", .{sym.fmt(elf_file)});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 }
1497 }1503 }
1498}1504}
14991505
src/link/Elf/SharedObject.zig+7-2
...@@ -493,8 +493,13 @@ fn formatSymtab(...@@ -493,8 +493,13 @@ fn formatSymtab(
493 const shared = ctx.shared;493 const shared = ctx.shared;
494 const elf_file = ctx.elf_file;494 const elf_file = ctx.elf_file;
495 try writer.writeAll(" globals\n");495 try writer.writeAll(" globals\n");
496 for (shared.symbols.items) |sym| {496 for (shared.symbols.items, 0..) |sym, i| {
497 try writer.print(" {}\n", .{sym.fmt(elf_file)});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 }
498 }503 }
499}504}
500505
src/link/Elf/synthetic_sections.zig+1-1
...@@ -417,9 +417,9 @@ pub const ZigGotSection = struct {...@@ -417,9 +417,9 @@ pub const ZigGotSection = struct {
417 _ = unused_fmt_string;417 _ = unused_fmt_string;
418 const zig_got = ctx.zig_got;418 const zig_got = ctx.zig_got;
419 const elf_file = ctx.elf_file;419 const elf_file = ctx.elf_file;
420 const zo = elf_file.zigObjectPtr().?;
421 try writer.writeAll(".zig.got\n");420 try writer.writeAll(".zig.got\n");
422 for (zig_got.entries.items, 0..) |entry, index| {421 for (zig_got.entries.items, 0..) |entry, index| {
422 const zo = elf_file.zigObjectPtr().?;
423 const symbol = zo.symbol(entry);423 const symbol = zo.symbol(entry);
424 try writer.print(" {d}@0x{x} => {d}@0x{x} ({s})\n", .{424 try writer.print(" {d}@0x{x} => {d}@0x{x} ({s})\n", .{
425 index,425 index,