Skip to content

Commit a76ad90

Browse files
committed
elf: include LinkerDefined in symbol resolution
1 parent 3618824 commit a76ad90

File tree

2 files changed

+10
-17
lines changed

2 files changed

+10
-17
lines changed

src/link/Elf.zig

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,10 @@ pub fn init(self: *LinkerDefined, allocator: Allocator) !void {
4040
pub 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

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 {
9587
const comp = elf_file.base.comp;
9688
const gpa = comp.gpa;
9789
try self.symtab.ensureUnusedCapacity(gpa, 1);

0 commit comments

Comments
 (0)