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...@@ -1286,8 +1286,6 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
1286 try positionals.append(.{ .path = ssp.full_object_path });1286 try positionals.append(.{ .path = ssp.full_object_path });
1287 }1287 }
12881288
1289 if (self.isStaticLib()) return self.flushStaticLib(comp, positionals.items);
1290
1291 for (positionals.items) |obj| {1289 for (positionals.items) |obj| {
1292 var parse_ctx: ParseErrorCtx = .{ .detected_cpu_arch = undefined };1290 var parse_ctx: ParseErrorCtx = .{ .detected_cpu_arch = undefined };
1293 self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|1291 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...@@ -1393,6 +1391,16 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
1393 try self.handleAndReportParseError(obj.path, err, &parse_ctx);1391 try self.handleAndReportParseError(obj.path, err, &parse_ctx);
1394 }1392 }
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
1396 // Dedup shared objects1404 // Dedup shared objects
1397 {1405 {
1398 var seen_dsos = std.StringHashMap(void).init(gpa);1406 var seen_dsos = std.StringHashMap(void).init(gpa);
...@@ -1522,18 +1530,8 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node...@@ -1522,18 +1530,8 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
1522 }1530 }
1523}1531}
15241532
1525pub fn flushStaticLib(1533pub fn flushStaticLib(self: *Elf, comp: *Compilation) link.File.FlushError!void {
1526 self: *Elf,
1527 comp: *Compilation,
1528 positionals: []const Compilation.LinkObject,
1529) link.File.FlushError!void {
1530 _ = comp;1534 _ = 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 }
1537 const gpa = self.base.allocator;1535 const gpa = self.base.allocator;
15381536
1539 // First, we flush relocatable object file generated with our backends.1537 // 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 {...@@ -96,7 +96,9 @@ pub fn parse(self: *Object, elf_file: *Elf) !void {
96 sym.st_name + strtab_bias;96 sym.st_name + strtab_bias;
97 }97 }
98 }98 }
99}
99100
101pub fn init(self: *Object, elf_file: *Elf) !void {
100 try self.initAtoms(elf_file);102 try self.initAtoms(elf_file);
101 try self.initSymtab(elf_file);103 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 {...@@ -72,7 +72,6 @@ pub fn parse(self: *SharedObject, elf_file: *Elf) !void {
72 }72 }
7373
74 try self.parseVersions(elf_file);74 try self.parseVersions(elf_file);
75 try self.initSymtab(elf_file);
76}75}
7776
78fn parseVersions(self: *SharedObject, elf_file: *Elf) !void {77fn parseVersions(self: *SharedObject, elf_file: *Elf) !void {
...@@ -120,7 +119,7 @@ fn parseVersions(self: *SharedObject, elf_file: *Elf) !void {...@@ -120,7 +119,7 @@ fn parseVersions(self: *SharedObject, elf_file: *Elf) !void {
120 }119 }
121}120}
122121
123fn initSymtab(self: *SharedObject, elf_file: *Elf) !void {122pub fn init(self: *SharedObject, elf_file: *Elf) !void {
124 const gpa = elf_file.base.allocator;123 const gpa = elf_file.base.allocator;
125 const symtab = self.getSymtabRaw();124 const symtab = self.getSymtabRaw();
126 const strtab = self.getStrtabRaw();125 const strtab = self.getStrtabRaw();