authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-09-24 11:45:01+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-09-25 17:54:50+02:00
log992c6c3f68dba24c1ca92cd7e78716d2fd336495
tree8466ddc8351bc912f30be863a4b728fab0fedcae
parent82cf762b0205f036677d234abb35bf1deafb5c7e

elf: reset output symtab contexts before re-updating


1 files changed, 17 insertions(+), 1 deletions(-)

src/link/Elf.zig+17-1
...@@ -4127,6 +4127,7 @@ pub fn updateSymtabSize(self: *Elf) !void {...@@ -4127,6 +4127,7 @@ pub fn updateSymtabSize(self: *Elf) !void {
4127 nlocals += @intCast(self.sections.slice().len);4127 nlocals += @intCast(self.sections.slice().len);
41284128
4129 if (self.requiresThunks()) for (self.thunks.items) |*th| {4129 if (self.requiresThunks()) for (self.thunks.items) |*th| {
4130 th.output_symtab_ctx.reset();
4130 th.output_symtab_ctx.ilocal = nlocals;4131 th.output_symtab_ctx.ilocal = nlocals;
4131 th.calcSymtabSize(self);4132 th.calcSymtabSize(self);
4132 nlocals += th.output_symtab_ctx.nlocals;4133 nlocals += th.output_symtab_ctx.nlocals;
...@@ -4138,6 +4139,7 @@ pub fn updateSymtabSize(self: *Elf) !void {...@@ -4138,6 +4139,7 @@ pub fn updateSymtabSize(self: *Elf) !void {
4138 const ctx = switch (file_ptr) {4139 const ctx = switch (file_ptr) {
4139 inline else => |x| &x.output_symtab_ctx,4140 inline else => |x| &x.output_symtab_ctx,
4140 };4141 };
4142 ctx.reset();
4141 ctx.ilocal = nlocals;4143 ctx.ilocal = nlocals;
4142 ctx.iglobal = nglobals;4144 ctx.iglobal = nglobals;
4143 try file_ptr.updateSymtabSize(self);4145 try file_ptr.updateSymtabSize(self);
...@@ -4147,6 +4149,7 @@ pub fn updateSymtabSize(self: *Elf) !void {...@@ -4147,6 +4149,7 @@ pub fn updateSymtabSize(self: *Elf) !void {
4147 }4149 }
41484150
4149 if (self.got_section_index) |_| {4151 if (self.got_section_index) |_| {
4152 self.got.output_symtab_ctx.reset();
4150 self.got.output_symtab_ctx.ilocal = nlocals;4153 self.got.output_symtab_ctx.ilocal = nlocals;
4151 self.got.updateSymtabSize(self);4154 self.got.updateSymtabSize(self);
4152 nlocals += self.got.output_symtab_ctx.nlocals;4155 nlocals += self.got.output_symtab_ctx.nlocals;
...@@ -4154,6 +4157,7 @@ pub fn updateSymtabSize(self: *Elf) !void {...@@ -4154,6 +4157,7 @@ pub fn updateSymtabSize(self: *Elf) !void {
4154 }4157 }
41554158
4156 if (self.plt_section_index) |_| {4159 if (self.plt_section_index) |_| {
4160 self.plt.output_symtab_ctx.reset();
4157 self.plt.output_symtab_ctx.ilocal = nlocals;4161 self.plt.output_symtab_ctx.ilocal = nlocals;
4158 self.plt.updateSymtabSize(self);4162 self.plt.updateSymtabSize(self);
4159 nlocals += self.plt.output_symtab_ctx.nlocals;4163 nlocals += self.plt.output_symtab_ctx.nlocals;
...@@ -4161,6 +4165,7 @@ pub fn updateSymtabSize(self: *Elf) !void {...@@ -4161,6 +4165,7 @@ pub fn updateSymtabSize(self: *Elf) !void {
4161 }4165 }
41624166
4163 if (self.plt_got_section_index) |_| {4167 if (self.plt_got_section_index) |_| {
4168 self.plt_got.output_symtab_ctx.reset();
4164 self.plt_got.output_symtab_ctx.ilocal = nlocals;4169 self.plt_got.output_symtab_ctx.ilocal = nlocals;
4165 self.plt_got.updateSymtabSize(self);4170 self.plt_got.updateSymtabSize(self);
4166 nlocals += self.plt_got.output_symtab_ctx.nlocals;4171 nlocals += self.plt_got.output_symtab_ctx.nlocals;
...@@ -4359,6 +4364,9 @@ pub fn writeSymtab(self: *Elf) !void {...@@ -4359,6 +4364,9 @@ pub fn writeSymtab(self: *Elf) !void {
43594364
4360 try self.symtab.resize(gpa, nsyms);4365 try self.symtab.resize(gpa, nsyms);
4361 const needed_strtab_size = math.cast(usize, strtab_shdr.sh_size - 1) orelse return error.Overflow;4366 const needed_strtab_size = math.cast(usize, strtab_shdr.sh_size - 1) orelse return error.Overflow;
4367 // TODO we could resize instead and in ZigObject/Object always access as slice
4368 self.strtab.clearRetainingCapacity();
4369 self.strtab.appendAssumeCapacity(0);
4362 try self.strtab.ensureUnusedCapacity(gpa, needed_strtab_size);4370 try self.strtab.ensureUnusedCapacity(gpa, needed_strtab_size);
43634371
4364 for (slice.items(.shdr), 0..) |shdr, shndx| {4372 for (slice.items(.shdr), 0..) |shdr, shndx| {
...@@ -5330,7 +5338,7 @@ fn fmtDumpState(...@@ -5330,7 +5338,7 @@ fn fmtDumpState(
5330 {5338 {
5331 try writer.writeAll("atom lists\n");5339 try writer.writeAll("atom lists\n");
5332 for (slice.items(.shdr), slice.items(.atom_list_2), 0..) |shdr, atom_list, shndx| {5340 for (slice.items(.shdr), slice.items(.atom_list_2), 0..) |shdr, atom_list, shndx| {
5333 try writer.print("shdr({d}) : {s} : {}", .{ shndx, self.getShString(shdr.sh_name), atom_list.fmt(self) });5341 try writer.print("shdr({d}) : {s} : {}\n", .{ shndx, self.getShString(shdr.sh_name), atom_list.fmt(self) });
5334 }5342 }
5335 }5343 }
53365344
...@@ -5462,6 +5470,14 @@ pub const SymtabCtx = struct {...@@ -5462,6 +5470,14 @@ pub const SymtabCtx = struct {
5462 nlocals: u32 = 0,5470 nlocals: u32 = 0,
5463 nglobals: u32 = 0,5471 nglobals: u32 = 0,
5464 strsize: u32 = 0,5472 strsize: u32 = 0,
5473
5474 pub fn reset(ctx: *SymtabCtx) void {
5475 ctx.ilocal = 0;
5476 ctx.iglobal = 0;
5477 ctx.nlocals = 0;
5478 ctx.nglobals = 0;
5479 ctx.strsize = 0;
5480 }
5465};5481};
54665482
5467pub const null_sym = elf.Elf64_Sym{5483pub const null_sym = elf.Elf64_Sym{