Commit a76ad907d0
Changed files (2)
src
link
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