authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-05 12:37:15+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-05 12:37:15+01:00
log5c482361034a0b1575ecb719724c942b5709b449
tree88b92023adfe7d8c80fb0af59247aee3f7f06d8a
parent8d7ec05070ba5798adbeaf9a7153b6316fa6dcc3

elf: init objects after parsing them


3 files changed, 14 insertions(+), 15 deletions(-)

src/link/Elf.zig+11-13
......@@ -1286,8 +1286,6 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
12861286 try positionals.append(.{ .path = ssp.full_object_path });
12871287 }
12881288
1289 if (self.isStaticLib()) return self.flushStaticLib(comp, positionals.items);
1290
12911289 for (positionals.items) |obj| {
12921290 var parse_ctx: ParseErrorCtx = .{ .detected_cpu_arch = undefined };
12931291 self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
......@@ -1393,6 +1391,16 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
13931391 try self.handleAndReportParseError(obj.path, err, &parse_ctx);
13941392 }
13951393
1394 if (self.isStaticLib()) return self.flushStaticLib(comp);
1395
1396 // Init all objects
1397 for (self.objects.items) |index| {
1398 try self.file(index).?.object.init(self);
1399 }
1400 for (self.shared_objects.items) |index| {
1401 try self.file(index).?.shared_object.init(self);
1402 }
1403
13961404 // Dedup shared objects
13971405 {
13981406 var seen_dsos = std.StringHashMap(void).init(gpa);
......@@ -1522,18 +1530,8 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
15221530 }
15231531}
15241532
1525pub fn flushStaticLib(
1526 self: *Elf,
1527 comp: *Compilation,
1528 positionals: []const Compilation.LinkObject,
1529) link.File.FlushError!void {
1533pub fn flushStaticLib(self: *Elf, comp: *Compilation) link.File.FlushError!void {
15301534 _ = comp;
1531 if (positionals.len > 0) {
1532 var err = try self.addErrorWithNotes(1);
1533 try err.addMsg(self, "fatal linker error: too many input positionals", .{});
1534 try err.addNote(self, "TODO implement linking objects into an static library", .{});
1535 return;
1536 }
15371535 const gpa = self.base.allocator;
15381536
15391537 // First, we flush relocatable object file generated with our backends.
src/link/Elf/Object.zig+2
......@@ -96,7 +96,9 @@ pub fn parse(self: *Object, elf_file: *Elf) !void {
9696 sym.st_name + strtab_bias;
9797 }
9898 }
99}
99100
101pub fn init(self: *Object, elf_file: *Elf) !void {
100102 try self.initAtoms(elf_file);
101103 try self.initSymtab(elf_file);
102104
src/link/Elf/SharedObject.zig+1-2
......@@ -72,7 +72,6 @@ pub fn parse(self: *SharedObject, elf_file: *Elf) !void {
7272 }
7373
7474 try self.parseVersions(elf_file);
75 try self.initSymtab(elf_file);
7675}
7776
7877fn parseVersions(self: *SharedObject, elf_file: *Elf) !void {
......@@ -120,7 +119,7 @@ fn parseVersions(self: *SharedObject, elf_file: *Elf) !void {
120119 }
121120}
122121
123fn initSymtab(self: *SharedObject, elf_file: *Elf) !void {
122pub fn init(self: *SharedObject, elf_file: *Elf) !void {
124123 const gpa = elf_file.base.allocator;
125124 const symtab = self.getSymtabRaw();
126125 const strtab = self.getStrtabRaw();