elf: actually write synthetic globals to output symtab

This commit is contained in:
Jakub Konka 2023-11-15 15:07:09 +01:00
parent 0c6cb8d8c8
commit 760ce69734
2 changed files with 11 additions and 18 deletions

View File

@ -4819,15 +4819,12 @@ fn updateSymtabSize(self: *Elf) !void {
const gpa = self.base.allocator;
var files = std.ArrayList(File.Index).init(gpa);
defer files.deinit();
try files.ensureTotalCapacityPrecise(self.objects.items.len + self.shared_objects.items.len + 1);
try files.ensureTotalCapacityPrecise(self.objects.items.len + self.shared_objects.items.len + 2);
if (self.zig_object_index) |index| files.appendAssumeCapacity(index);
for (self.objects.items) |index| {
files.appendAssumeCapacity(index);
}
for (self.shared_objects.items) |index| {
files.appendAssumeCapacity(index);
}
for (self.objects.items) |index| files.appendAssumeCapacity(index);
for (self.shared_objects.items) |index| files.appendAssumeCapacity(index);
if (self.linker_defined_index) |index| files.appendAssumeCapacity(index);
// Section symbols
for (self.output_sections.keys()) |_| {
@ -5166,6 +5163,11 @@ fn writeSymtab(self: *Elf) !void {
file_ptr.writeSymtab(self);
}
if (self.linker_defined_index) |index| {
const file_ptr = self.file(index).?;
file_ptr.writeSymtab(self);
}
if (self.zig_got_section_index) |_| {
self.zig_got.writeSymtab(self);
}
@ -5182,11 +5184,6 @@ fn writeSymtab(self: *Elf) !void {
self.plt_got.writeSymtab(self);
}
if (self.linker_defined_index) |index| {
const file_ptr = self.file(index).?;
file_ptr.writeSymtab(self);
}
const foreign_endian = self.base.options.target.cpu.arch.endian() != builtin.cpu.arch.endian();
switch (self.ptr_width) {
.p32 => {

View File

@ -917,8 +917,7 @@ pub const PltSection = struct {
}
pub fn writeSymtab(plt: PltSection, elf_file: *Elf) void {
var ilocal = plt.output_symtab_ctx.ilocal;
for (plt.symbols.items) |sym_index| {
for (plt.symbols.items, plt.output_symtab_ctx.ilocal..) |sym_index, ilocal| {
const sym = elf_file.symbol(sym_index);
const st_name = @as(u32, @intCast(elf_file.strtab.items.len));
elf_file.strtab.appendSliceAssumeCapacity(sym.name(elf_file));
@ -932,7 +931,6 @@ pub const PltSection = struct {
.st_value = sym.pltAddress(elf_file),
.st_size = 16,
};
ilocal += 1;
}
}
@ -1046,8 +1044,7 @@ pub const PltGotSection = struct {
}
pub fn writeSymtab(plt_got: PltGotSection, elf_file: *Elf) void {
var ilocal = plt_got.output_symtab_ctx.ilocal;
for (plt_got.symbols.items) |sym_index| {
for (plt_got.symbols.items, plt_got.output_symtab_ctx.ilocal..) |sym_index, ilocal| {
const sym = elf_file.symbol(sym_index);
const st_name = @as(u32, @intCast(elf_file.strtab.items.len));
elf_file.strtab.appendSliceAssumeCapacity(sym.name(elf_file));
@ -1061,7 +1058,6 @@ pub const PltGotSection = struct {
.st_value = sym.pltGotAddress(elf_file),
.st_size = 16,
};
ilocal += 1;
}
}
};