diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-15 19:00:13 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-15 19:00:13 +0100 |
| commit | 6f3bbd5eaa61a93f96245bfec8d9429f4ea9f88e (patch) | |
| tree | 2f2b618f5a59e9752cdadebf463ed778f86d71d5 /src/link/Elf/LinkerDefined.zig | |
| parent | 760ce69734e8c6fca02356c53729909ccb5d8ff9 (diff) | |
| download | zig-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.zig | 34 |
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 }; } |
