From a76ad907d0869d959fd954ff6edeff15942c3bc0 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Mon, 29 Jul 2024 22:14:17 +0200 Subject: [PATCH] elf: include LinkerDefined in symbol resolution --- src/link/Elf.zig | 9 +++++---- src/link/Elf/LinkerDefined.zig | 18 +++++------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 97812e9c19..5ca4ec7ff2 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1268,6 +1268,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod self.linker_defined_index = index; const object = self.linkerDefinedPtr().?; try object.init(gpa); + try object.initSymbols(self); } // Now, we are ready to resolve the symbols across all input files. @@ -1276,9 +1277,6 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod // Any qualifing unresolved symbol will be upgraded to an absolute, weak // symbol for potential resolution at load-time. try self.resolveSymbols(); - if (self.linkerDefinedPtr()) |obj| { - try obj.initSymbols(self); - } self.markEhFrameAtomsDead(); try self.resolveMergeSections(); @@ -1928,6 +1926,7 @@ pub fn resolveSymbols(self: *Elf) !void { // Resolve symbols on the set of all objects and shared objects (even if some are unneeded). for (self.objects.items) |index| self.file(index).?.resolveSymbols(self); for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self); + if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self); // Mark live objects. self.markLive(); @@ -1936,6 +1935,7 @@ pub fn resolveSymbols(self: *Elf) !void { if (self.zigObjectPtr()) |zig_object| zig_object.asFile().resetGlobals(self); for (self.objects.items) |index| self.file(index).?.resetGlobals(self); for (self.shared_objects.items) |index| self.file(index).?.resetGlobals(self); + if (self.linkerDefinedPtr()) |obj| obj.asFile().resetGlobals(self); // Prune dead objects and shared objects. var i: usize = 0; @@ -1968,9 +1968,10 @@ pub fn resolveSymbols(self: *Elf) !void { } // Re-resolve the symbols. - if (self.zigObjectPtr()) |zig_object| zig_object.resolveSymbols(self); + if (self.zigObjectPtr()) |zig_object| zig_object.asFile().resolveSymbols(self); for (self.objects.items) |index| self.file(index).?.resolveSymbols(self); for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self); + if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self); } /// Traverses all objects and shared objects marking any object referenced by diff --git a/src/link/Elf/LinkerDefined.zig b/src/link/Elf/LinkerDefined.zig index b937005f04..676c49cc7d 100644 --- a/src/link/Elf/LinkerDefined.zig +++ b/src/link/Elf/LinkerDefined.zig @@ -40,12 +40,10 @@ pub fn init(self: *LinkerDefined, allocator: Allocator) !void { pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void { const gpa = elf_file.base.comp.gpa; - // Look for entry address in objects if not set by the incremental compiler. - if (self.entry_index == null) { - if (elf_file.entry_name) |name| { - self.entry_index = elf_file.globalByName(name); - } + if (elf_file.entry_name) |name| { + self.entry_index = try self.addGlobal(name, elf_file); } + self.dynamic_index = try self.addGlobal("_DYNAMIC", elf_file); self.ehdr_start_index = try self.addGlobal("__ehdr_start", elf_file); self.init_array_start_index = try self.addGlobal("__init_array_start", elf_file); @@ -62,11 +60,7 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void { self.gnu_eh_frame_hdr_index = try self.addGlobal("__GNU_EH_FRAME_HDR", elf_file); } - if (elf_file.globalByName("__dso_handle")) |index| { - if (elf_file.symbol(index).file(elf_file) == null) - self.dso_handle_index = try self.addGlobal("__dso_handle", elf_file); - } - + self.dso_handle_index = try self.addGlobal("__dso_handle", elf_file); self.rela_iplt_start_index = try self.addGlobal("__rela_iplt_start", elf_file); self.rela_iplt_end_index = try self.addGlobal("__rela_iplt_end", elf_file); @@ -87,11 +81,9 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void { if (elf_file.getTarget().cpu.arch.isRISCV() and elf_file.isEffectivelyDynLib()) { self.global_pointer_index = try self.addGlobal("__global_pointer$", elf_file); } - - self.resolveSymbols(elf_file); } -fn addGlobal(self: *LinkerDefined, name: [:0]const u8, elf_file: *Elf) !u32 { +fn addGlobal(self: *LinkerDefined, name: []const u8, elf_file: *Elf) !u32 { const comp = elf_file.base.comp; const gpa = comp.gpa; try self.symtab.ensureUnusedCapacity(gpa, 1);