Commit a76ad907d0

Jakub Konka <kubkon@jakubkonka.com>
2024-07-29 22:14:17
elf: include LinkerDefined in symbol resolution
1 parent 3618824
Changed files (2)
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);
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