| author | |
| committer | |
| log | a76ad907d0869d959fd954ff6edeff15942c3bc0 |
| tree | 980e3c11acd21b347d96e9f60b7f1ab83273c9be |
| parent | 3618824ea36e22fda19c4adcf0cec3ce3254df4c |
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 | 1268 | self.linker_defined_index = index; |
| 1269 | 1269 | const object = self.linkerDefinedPtr().?; |
| 1270 | 1270 | try object.init(gpa); |
| 1271 | try object.initSymbols(self); | |
| 1271 | 1272 | } |
| 1272 | 1273 | |
| 1273 | 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 | 1277 | // Any qualifing unresolved symbol will be upgraded to an absolute, weak |
| 1277 | 1278 | // symbol for potential resolution at load-time. |
| 1278 | 1279 | try self.resolveSymbols(); |
| 1279 | if (self.linkerDefinedPtr()) |obj| { | |
| 1280 | try obj.initSymbols(self); | |
| 1281 | } | |
| 1282 | 1280 | self.markEhFrameAtomsDead(); |
| 1283 | 1281 | try self.resolveMergeSections(); |
| 1284 | 1282 | |
| ... | ... | @@ -1928,6 +1926,7 @@ pub fn resolveSymbols(self: *Elf) !void { |
| 1928 | 1926 | // Resolve symbols on the set of all objects and shared objects (even if some are unneeded). |
| 1929 | 1927 | for (self.objects.items) |index| self.file(index).?.resolveSymbols(self); |
| 1930 | 1928 | for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self); |
| 1929 | if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self); | |
| 1931 | 1930 | |
| 1932 | 1931 | // Mark live objects. |
| 1933 | 1932 | self.markLive(); |
| ... | ... | @@ -1936,6 +1935,7 @@ pub fn resolveSymbols(self: *Elf) !void { |
| 1936 | 1935 | if (self.zigObjectPtr()) |zig_object| zig_object.asFile().resetGlobals(self); |
| 1937 | 1936 | for (self.objects.items) |index| self.file(index).?.resetGlobals(self); |
| 1938 | 1937 | for (self.shared_objects.items) |index| self.file(index).?.resetGlobals(self); |
| 1938 | if (self.linkerDefinedPtr()) |obj| obj.asFile().resetGlobals(self); | |
| 1939 | 1939 | |
| 1940 | 1940 | // Prune dead objects and shared objects. |
| 1941 | 1941 | var i: usize = 0; |
| ... | ... | @@ -1968,9 +1968,10 @@ pub fn resolveSymbols(self: *Elf) !void { |
| 1968 | 1968 | } |
| 1969 | 1969 | |
| 1970 | 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 | 1972 | for (self.objects.items) |index| self.file(index).?.resolveSymbols(self); |
| 1973 | 1973 | for (self.shared_objects.items) |index| self.file(index).?.resolveSymbols(self); |
| 1974 | if (self.linkerDefinedPtr()) |obj| obj.asFile().resolveSymbols(self); | |
| 1974 | 1975 | } |
| 1975 | 1976 | |
| 1976 | 1977 | /// 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 | 40 | pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void { |
| 41 | 41 | const gpa = elf_file.base.comp.gpa; |
| 42 | 42 | |
| 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); | |
| 48 | 45 | } |
| 46 | ||
| 49 | 47 | self.dynamic_index = try self.addGlobal("_DYNAMIC", elf_file); |
| 50 | 48 | self.ehdr_start_index = try self.addGlobal("__ehdr_start", elf_file); |
| 51 | 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 | 60 | self.gnu_eh_frame_hdr_index = try self.addGlobal("__GNU_EH_FRAME_HDR", elf_file); |
| 63 | 61 | } |
| 64 | 62 | |
| 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); | |
| 70 | 64 | self.rela_iplt_start_index = try self.addGlobal("__rela_iplt_start", elf_file); |
| 71 | 65 | self.rela_iplt_end_index = try self.addGlobal("__rela_iplt_end", elf_file); |
| 72 | 66 | |
| ... | ... | @@ -87,11 +81,9 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void { |
| 87 | 81 | if (elf_file.getTarget().cpu.arch.isRISCV() and elf_file.isEffectivelyDynLib()) { |
| 88 | 82 | self.global_pointer_index = try self.addGlobal("__global_pointer$", elf_file); |
| 89 | 83 | } |
| 90 | ||
| 91 | self.resolveSymbols(elf_file); | |
| 92 | 84 | } |
| 93 | 85 | |
| 94 | fn addGlobal(self: *LinkerDefined, name: [:0]const u8, elf_file: *Elf) !u32 { | |
| 86 | fn addGlobal(self: *LinkerDefined, name: []const u8, elf_file: *Elf) !u32 { | |
| 95 | 87 | const comp = elf_file.base.comp; |
| 96 | 88 | const gpa = comp.gpa; |
| 97 | 89 | try self.symtab.ensureUnusedCapacity(gpa, 1); |