diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-29 18:08:10 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-30 10:03:13 +0200 |
| commit | 3618824ea36e22fda19c4adcf0cec3ce3254df4c (patch) | |
| tree | 99416970bf9fc9b87c3c9bc02e4bed02acbacab4 /src/link/Elf | |
| parent | 5ceac8ebbae5fedc56c74e2b3d4918742089ec45 (diff) | |
| download | zig-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.zig | 7 | ||||
| -rw-r--r-- | src/link/Elf/gc.zig | 8 |
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| { |
