diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-18 15:35:18 +0200 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-08-21 01:43:21 -0400 |
| commit | 517721bbccbbbe571c90226197948a9ae2430d8f (patch) | |
| tree | 8e727b31609dcc56b94a3304d79a2d7734e98c82 /src | |
| parent | 56e1ae21e42b63ea4409b68950691fb89bfd1d21 (diff) | |
| download | zig-517721bbccbbbe571c90226197948a9ae2430d8f.tar.gz zig-517721bbccbbbe571c90226197948a9ae2430d8f.zip | |
elf: start unraveling Dwarf relocs into Elf relocs
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Dwarf.zig | 2 | ||||
| -rw-r--r-- | src/link/Elf/ZigObject.zig | 14 |
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, + }); + } } } |
