zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 652ebf3b6a62007d37fb7fd4def393f11bb6159f (tree)
parent 9db472cff6573fd1d0f50c8ea1b5ecb536aeff1e
Author: Jakub Konka <kubkon@jakubkonka.com>
Date:   Tue, 12 Sep 2023 18:07:10 +0200

elf: allocate objects, currently atom-by-atom

Diffstat:
Msrc/link/Elf.zig | 20+++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/link/Elf.zig b/src/link/Elf.zig @@ -1053,7 +1053,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node try self.scanRelocs(); // Allocate atoms parsed from input object files - self.allocateObjects(); + try self.allocateObjects(); self.allocateLinkerDefinedSymbols(); // Beyond this point, everything has been allocated a virtual address and we can resolve @@ -1405,8 +1405,22 @@ fn scanRelocs(self: *Elf) !void { } } -fn allocateObjects(self: *Elf) void { - _ = self; +fn allocateObjects(self: *Elf) !void { + for (self.objects.items) |index| { + const object = self.file(index).?.object; + for (object.atoms.items) |atom_index| { + const atom_ptr = self.atom(atom_index) orelse continue; + if (!atom_ptr.alive) continue; + try atom_ptr.allocate(self); + } + + for (object.globals()) |global_index| { + const global = self.symbol(global_index); + if (global.file_index == index) { + global.value = global.atom(self).?.value; + } + } + } } fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !void {