aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/LinkerDefined.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-11-15 19:00:13 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-11-15 19:00:13 +0100
commit6f3bbd5eaa61a93f96245bfec8d9429f4ea9f88e (patch)
tree2f2b618f5a59e9752cdadebf463ed778f86d71d5 /src/link/Elf/LinkerDefined.zig
parent760ce69734e8c6fca02356c53729909ccb5d8ff9 (diff)
downloadzig-6f3bbd5eaa61a93f96245bfec8d9429f4ea9f88e.tar.gz
zig-6f3bbd5eaa61a93f96245bfec8d9429f4ea9f88e.zip
elf: we were writing too many symbols in the symtab
Diffstat (limited to 'src/link/Elf/LinkerDefined.zig')
-rw-r--r--src/link/Elf/LinkerDefined.zig34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/link/Elf/LinkerDefined.zig b/src/link/Elf/LinkerDefined.zig
index 938f22985f..bc51cfc1f1 100644
--- a/src/link/Elf/LinkerDefined.zig
+++ b/src/link/Elf/LinkerDefined.zig
@@ -48,10 +48,42 @@ pub fn resolveSymbols(self: *LinkerDefined, elf_file: *Elf) void {
}
}
-pub fn globals(self: *LinkerDefined) []const Symbol.Index {
+pub fn globals(self: LinkerDefined) []const Symbol.Index {
return self.symbols.items;
}
+pub fn updateSymtabSize(self: *LinkerDefined, elf_file: *Elf) !void {
+ for (self.globals()) |global_index| {
+ const global = elf_file.symbol(global_index);
+ const file_ptr = global.file(elf_file) orelse continue;
+ if (file_ptr.index() != self.index) continue;
+ global.flags.output_symtab = true;
+ if (global.isLocal(elf_file)) {
+ try global.setOutputSymtabIndex(self.output_symtab_ctx.nlocals, elf_file);
+ self.output_symtab_ctx.nlocals += 1;
+ } else {
+ try global.setOutputSymtabIndex(self.output_symtab_ctx.nglobals, elf_file);
+ self.output_symtab_ctx.nglobals += 1;
+ }
+ self.output_symtab_ctx.strsize += @as(u32, @intCast(global.name(elf_file).len)) + 1;
+ }
+}
+
+pub fn writeSymtab(self: LinkerDefined, elf_file: *Elf) void {
+ for (self.globals()) |global_index| {
+ const global = elf_file.symbol(global_index);
+ const file_ptr = global.file(elf_file) orelse continue;
+ if (file_ptr.index() != self.index) continue;
+ const idx = global.outputSymtabIndex(elf_file) orelse continue;
+ const st_name = @as(u32, @intCast(elf_file.strtab.items.len));
+ elf_file.strtab.appendSliceAssumeCapacity(global.name(elf_file));
+ elf_file.strtab.appendAssumeCapacity(0);
+ const out_sym = &elf_file.symtab.items[idx];
+ out_sym.st_name = st_name;
+ global.setOutputSym(elf_file, out_sym);
+ }
+}
+
pub fn asFile(self: *LinkerDefined) File {
return .{ .linker_defined = self };
}