aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-08-18 15:35:18 +0200
committerJacob Young <jacobly0@users.noreply.github.com>2024-08-21 01:43:21 -0400
commit517721bbccbbbe571c90226197948a9ae2430d8f (patch)
tree8e727b31609dcc56b94a3304d79a2d7734e98c82 /src/link
parent56e1ae21e42b63ea4409b68950691fb89bfd1d21 (diff)
downloadzig-517721bbccbbbe571c90226197948a9ae2430d8f.tar.gz
zig-517721bbccbbbe571c90226197948a9ae2430d8f.zip
elf: start unraveling Dwarf relocs into Elf relocs
Diffstat (limited to 'src/link')
-rw-r--r--src/link/Dwarf.zig2
-rw-r--r--src/link/Elf/ZigObject.zig14
2 files changed, 13 insertions, 3 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index f74d8e82a4..a6b73421ba 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -415,7 +415,7 @@ const Unit = struct {
return entry;
}
- fn getEntry(unit: *Unit, entry: Entry.Index) *Entry {
+ pub fn getEntry(unit: *Unit, entry: Entry.Index) *Entry {
return &unit.entries.items[@intFromEnum(entry)];
}
diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig
index a82d1f8809..28cc84da35 100644
--- a/src/link/Elf/ZigObject.zig
+++ b/src/link/Elf/ZigObject.zig
@@ -180,6 +180,7 @@ pub fn flushModule(self: *ZigObject, elf_file: *Elf, tid: Zcu.PerThread.Id) !voi
if (self.dwarf) |*dwarf| {
const pt: Zcu.PerThread = .{ .zcu = elf_file.base.comp.module.?, .tid = tid };
try dwarf.flushModule(pt);
+ try dwarf.resolveRelocs();
// TODO invert this logic so that we manage the output section with the atom, not the
// other way around
@@ -213,8 +214,17 @@ pub fn flushModule(self: *ZigObject, elf_file: *Elf, tid: Zcu.PerThread.Id) !voi
const relocs = &self.relocs.items[atom_ptr.relocsShndx().?];
_ = relocs;
- for (sect.units.items) |unit| {
- _ = unit;
+ for (sect.units.items) |*unit| {
+ for (unit.external_relocs.items) |reloc| {
+ const tsym = self.symbol(reloc.target_sym);
+ const r_offset = unit.off + unit.header_len + unit.getEntry(reloc.source_entry).off + reloc.source_off;
+ const r_addend = reloc.target_off;
+ std.debug.print("{s} <- r_off={x}, r_add={x}\n", .{
+ tsym.name(elf_file),
+ r_offset,
+ r_addend,
+ });
+ }
}
}