mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 21:08:36 +00:00
elf: include LinkerDefined in symbol resolution
This commit is contained in:
parent
3618824ea3
commit
a76ad907d0
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user