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...@@ -1268,6 +1268,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
1268 self.linker_defined_index = index;1268 self.linker_defined_index = index;
1269 const object = self.linkerDefinedPtr().?;1269 const object = self.linkerDefinedPtr().?;
1270 try object.init(gpa);1270 try object.init(gpa);
1271 try object.initSymbols(self);
1271 }1272 }
12721273
1273 // Now, we are ready to resolve the symbols across all input files.1274 // 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...@@ -1276,9 +1277,6 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
1276 // Any qualifing unresolved symbol will be upgraded to an absolute, weak1277 // Any qualifing unresolved symbol will be upgraded to an absolute, weak
1277 // symbol for potential resolution at load-time.1278 // symbol for potential resolution at load-time.
1278 try self.resolveSymbols();1279 try self.resolveSymbols();
1279 if (self.linkerDefinedPtr()) |obj| {
1280 try obj.initSymbols(self);
1281 }
1282 self.markEhFrameAtomsDead();1280 self.markEhFrameAtomsDead();
1283 try self.resolveMergeSections();1281 try self.resolveMergeSections();
12841282
...@@ -1928,6 +1926,7 @@ pub fn resolveSymbols(self: *Elf) !void {...@@ -1928,6 +1926,7 @@ pub fn resolveSymbols(self: *Elf) !void {
1928 // Resolve symbols on the set of all objects and shared objects (even if some are unneeded).1926 // Resolve symbols on the set of all objects and shared objects (even if some are unneeded).
1929 for (self.objects.items) |index| self.file(index).?.resolveSymbols(self);1927 for (self.objects.items) |index| self.file(index).?.resolveSymbols(self);
1930 for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self);1928 for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self);
1929 if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self);
19311930
1932 // Mark live objects.1931 // Mark live objects.
1933 self.markLive();1932 self.markLive();
...@@ -1936,6 +1935,7 @@ pub fn resolveSymbols(self: *Elf) !void {...@@ -1936,6 +1935,7 @@ pub fn resolveSymbols(self: *Elf) !void {
1936 if (self.zigObjectPtr()) |zig_object| zig_object.asFile().resetGlobals(self);1935 if (self.zigObjectPtr()) |zig_object| zig_object.asFile().resetGlobals(self);
1937 for (self.objects.items) |index| self.file(index).?.resetGlobals(self);1936 for (self.objects.items) |index| self.file(index).?.resetGlobals(self);
1938 for (self.shared_objects.items) |index| self.file(index).?.resetGlobals(self);1937 for (self.shared_objects.items) |index| self.file(index).?.resetGlobals(self);
1938 if (self.linkerDefinedPtr()) |obj| obj.asFile().resetGlobals(self);
19391939
1940 // Prune dead objects and shared objects.1940 // Prune dead objects and shared objects.
1941 var i: usize = 0;1941 var i: usize = 0;
...@@ -1968,9 +1968,10 @@ pub fn resolveSymbols(self: *Elf) !void {...@@ -1968,9 +1968,10 @@ pub fn resolveSymbols(self: *Elf) !void {
1968 }1968 }
19691969
1970 // Re-resolve the symbols.1970 // 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);
1972 for (self.objects.items) |index| self.file(index).?.resolveSymbols(self);1972 for (self.objects.items) |index| self.file(index).?.resolveSymbols(self);
1973 for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self);1973 for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self);
1974 if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self);
1974}1975}
19751976
1976/// Traverses all objects and shared objects marking any object referenced by1977/// 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 {...@@ -40,12 +40,10 @@ pub fn init(self: *LinkerDefined, allocator: Allocator) !void {
40pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {40pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
41 const gpa = elf_file.base.comp.gpa;41 const gpa = elf_file.base.comp.gpa;
4242
43 // Look for entry address in objects if not set by the incremental compiler.43 if (elf_file.entry_name) |name| {
44 if (self.entry_index == null) {44 self.entry_index = try self.addGlobal(name, elf_file);
45 if (elf_file.entry_name) |name| {
46 self.entry_index = elf_file.globalByName(name);
47 }
48 }45 }
46
49 self.dynamic_index = try self.addGlobal("_DYNAMIC", elf_file);47 self.dynamic_index = try self.addGlobal("_DYNAMIC", elf_file);
50 self.ehdr_start_index = try self.addGlobal("__ehdr_start", elf_file);48 self.ehdr_start_index = try self.addGlobal("__ehdr_start", elf_file);
51 self.init_array_start_index = try self.addGlobal("__init_array_start", elf_file);49 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 {...@@ -62,11 +60,7 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
62 self.gnu_eh_frame_hdr_index = try self.addGlobal("__GNU_EH_FRAME_HDR", elf_file);60 self.gnu_eh_frame_hdr_index = try self.addGlobal("__GNU_EH_FRAME_HDR", elf_file);
63 }61 }
6462
65 if (elf_file.globalByName("__dso_handle")) |index| {63 self.dso_handle_index = try self.addGlobal("__dso_handle", elf_file);
66 if (elf_file.symbol(index).file(elf_file) == null)
67 self.dso_handle_index = try self.addGlobal("__dso_handle", elf_file);
68 }
69
70 self.rela_iplt_start_index = try self.addGlobal("__rela_iplt_start", elf_file);64 self.rela_iplt_start_index = try self.addGlobal("__rela_iplt_start", elf_file);
71 self.rela_iplt_end_index = try self.addGlobal("__rela_iplt_end", elf_file);65 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 {...@@ -87,11 +81,9 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
87 if (elf_file.getTarget().cpu.arch.isRISCV() and elf_file.isEffectivelyDynLib()) {81 if (elf_file.getTarget().cpu.arch.isRISCV() and elf_file.isEffectivelyDynLib()) {
88 self.global_pointer_index = try self.addGlobal("__global_pointer$", elf_file);82 self.global_pointer_index = try self.addGlobal("__global_pointer$", elf_file);
89 }83 }
90
91 self.resolveSymbols(elf_file);
92}84}
9385
94fn addGlobal(self: *LinkerDefined, name: [:0]const u8, elf_file: *Elf) !u32 {86fn addGlobal(self: *LinkerDefined, name: []const u8, elf_file: *Elf) !u32 {
95 const comp = elf_file.base.comp;87 const comp = elf_file.base.comp;
96 const gpa = comp.gpa;88 const gpa = comp.gpa;
97 try self.symtab.ensureUnusedCapacity(gpa, 1);89 try self.symtab.ensureUnusedCapacity(gpa, 1);