authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-07-29 22:14:17+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-07-30 10:03:13+02:00
loga76ad907d0869d959fd954ff6edeff15942c3bc0
tree980e3c11acd21b347d96e9f60b7f1ab83273c9be
parent3618824ea36e22fda19c4adcf0cec3ce3254df4c

elf: include LinkerDefined in symbol resolution


2 files changed, 10 insertions(+), 17 deletions(-)

src/link/Elf.zig+5-4
......@@ -1268,6 +1268,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
12681268 self.linker_defined_index = index;
12691269 const object = self.linkerDefinedPtr().?;
12701270 try object.init(gpa);
1271 try object.initSymbols(self);
12711272 }
12721273
12731274 // 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
12761277 // Any qualifing unresolved symbol will be upgraded to an absolute, weak
12771278 // symbol for potential resolution at load-time.
12781279 try self.resolveSymbols();
1279 if (self.linkerDefinedPtr()) |obj| {
1280 try obj.initSymbols(self);
1281 }
12821280 self.markEhFrameAtomsDead();
12831281 try self.resolveMergeSections();
12841282
......@@ -1928,6 +1926,7 @@ pub fn resolveSymbols(self: *Elf) !void {
19281926 // Resolve symbols on the set of all objects and shared objects (even if some are unneeded).
19291927 for (self.objects.items) |index| self.file(index).?.resolveSymbols(self);
19301928 for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self);
1929 if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self);
19311930
19321931 // Mark live objects.
19331932 self.markLive();
......@@ -1936,6 +1935,7 @@ pub fn resolveSymbols(self: *Elf) !void {
19361935 if (self.zigObjectPtr()) |zig_object| zig_object.asFile().resetGlobals(self);
19371936 for (self.objects.items) |index| self.file(index).?.resetGlobals(self);
19381937 for (self.shared_objects.items) |index| self.file(index).?.resetGlobals(self);
1938 if (self.linkerDefinedPtr()) |obj| obj.asFile().resetGlobals(self);
19391939
19401940 // Prune dead objects and shared objects.
19411941 var i: usize = 0;
......@@ -1968,9 +1968,10 @@ pub fn resolveSymbols(self: *Elf) !void {
19681968 }
19691969
19701970 // Re-resolve the symbols.
1971 if (self.zigObjectPtr()) |zig_object| zig_object.resolveSymbols(self);
1971 if (self.zigObjectPtr()) |zig_object| zig_object.asFile().resolveSymbols(self);
19721972 for (self.objects.items) |index| self.file(index).?.resolveSymbols(self);
19731973 for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self);
1974 if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self);
19741975}
19751976
19761977/// Traverses all objects and shared objects marking any object referenced by
src/link/Elf/LinkerDefined.zig+5-13
......@@ -40,12 +40,10 @@ pub fn init(self: *LinkerDefined, allocator: Allocator) !void {
4040pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
4141 const gpa = elf_file.base.comp.gpa;
4242
43 // Look for entry address in objects if not set by the incremental compiler.
44 if (self.entry_index == null) {
45 if (elf_file.entry_name) |name| {
46 self.entry_index = elf_file.globalByName(name);
47 }
43 if (elf_file.entry_name) |name| {
44 self.entry_index = try self.addGlobal(name, elf_file);
4845 }
46
4947 self.dynamic_index = try self.addGlobal("_DYNAMIC", elf_file);
5048 self.ehdr_start_index = try self.addGlobal("__ehdr_start", elf_file);
5149 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 {
6260 self.gnu_eh_frame_hdr_index = try self.addGlobal("__GNU_EH_FRAME_HDR", elf_file);
6361 }
6462
65 if (elf_file.globalByName("__dso_handle")) |index| {
66 if (elf_file.symbol(index).file(elf_file) == null)
67 self.dso_handle_index = try self.addGlobal("__dso_handle", elf_file);
68 }
69
63 self.dso_handle_index = try self.addGlobal("__dso_handle", elf_file);
7064 self.rela_iplt_start_index = try self.addGlobal("__rela_iplt_start", elf_file);
7165 self.rela_iplt_end_index = try self.addGlobal("__rela_iplt_end", elf_file);
7266
......@@ -87,11 +81,9 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
8781 if (elf_file.getTarget().cpu.arch.isRISCV() and elf_file.isEffectivelyDynLib()) {
8882 self.global_pointer_index = try self.addGlobal("__global_pointer$", elf_file);
8983 }
90
91 self.resolveSymbols(elf_file);
9284}
9385
94fn addGlobal(self: *LinkerDefined, name: [:0]const u8, elf_file: *Elf) !u32 {
86fn addGlobal(self: *LinkerDefined, name: []const u8, elf_file: *Elf) !u32 {
9587 const comp = elf_file.base.comp;
9688 const gpa = comp.gpa;
9789 try self.symtab.ensureUnusedCapacity(gpa, 1);