aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-07-29 18:08:10 +0200
committerJakub Konka <kubkon@jakubkonka.com>2024-07-30 10:03:13 +0200
commit3618824ea36e22fda19c4adcf0cec3ce3254df4c (patch)
tree99416970bf9fc9b87c3c9bc02e4bed02acbacab4 /src/link/Elf
parent5ceac8ebbae5fedc56c74e2b3d4918742089ec45 (diff)
downloadzig-3618824ea36e22fda19c4adcf0cec3ce3254df4c.tar.gz
zig-3618824ea36e22fda19c4adcf0cec3ce3254df4c.zip
elf: move entry tracking into LinkerDefined
Diffstat (limited to 'src/link/Elf')
-rw-r--r--src/link/Elf/LinkerDefined.zig7
-rw-r--r--src/link/Elf/gc.zig8
2 files changed, 12 insertions, 3 deletions
diff --git a/src/link/Elf/LinkerDefined.zig b/src/link/Elf/LinkerDefined.zig
index dbca64d325..b937005f04 100644
--- a/src/link/Elf/LinkerDefined.zig
+++ b/src/link/Elf/LinkerDefined.zig
@@ -4,6 +4,7 @@ symtab: std.ArrayListUnmanaged(elf.Elf64_Sym) = .{},
strtab: std.ArrayListUnmanaged(u8) = .{},
symbols: std.ArrayListUnmanaged(Symbol.Index) = .{},
+entry_index: ?Symbol.Index = null,
dynamic_index: ?Symbol.Index = null,
ehdr_start_index: ?Symbol.Index = null,
init_array_start_index: ?Symbol.Index = null,
@@ -39,6 +40,12 @@ 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);
+ }
+ }
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);
diff --git a/src/link/Elf/gc.zig b/src/link/Elf/gc.zig
index 79a632d07e..de2d43f738 100644
--- a/src/link/Elf/gc.zig
+++ b/src/link/Elf/gc.zig
@@ -16,9 +16,11 @@ pub fn gcAtoms(elf_file: *Elf) !void {
}
fn collectRoots(roots: *std.ArrayList(*Atom), files: []const File.Index, elf_file: *Elf) !void {
- if (elf_file.entry_index) |index| {
- const global = elf_file.symbol(index);
- try markSymbol(global, roots, elf_file);
+ if (elf_file.linkerDefinedPtr()) |obj| {
+ if (obj.entry_index) |index| {
+ const global = elf_file.symbol(index);
+ try markSymbol(global, roots, elf_file);
+ }
}
for (files) |index| {