diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-13 12:51:17 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-13 13:30:24 +0200 |
| commit | 97ab420dcf9bdfe954d6bff730a7492abaeb90bb (patch) | |
| tree | 1629c1830fd80a320966f547c4abdb222ba67e7c | |
| parent | 49d78cc793f6dd987d2a51c7a96333713264691f (diff) | |
| download | zig-97ab420dcf9bdfe954d6bff730a7492abaeb90bb.tar.gz zig-97ab420dcf9bdfe954d6bff730a7492abaeb90bb.zip | |
elf: do not emit zig jump table in relocatables
| -rw-r--r-- | src/link/Elf/ZigObject.zig | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index 865f4118d3..4a3bdd6049 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -1036,14 +1036,16 @@ pub fn updateFunc( const ip = &zcu.intern_pool; const gpa = elf_file.base.comp.gpa; const func = zcu.funcInfo(func_index); - const jump_table = self.jumpTablePtr() orelse try self.initJumpTable(gpa, elf_file); + if (elf_file.base.isRelocatable() and self.jumpTablePtr() == null) { + try self.initJumpTable(gpa, elf_file); + } log.debug("updateFunc {}({d})", .{ ip.getNav(func.owner_nav).fqn.fmt(ip), func.owner_nav }); const sym_index = try self.getOrCreateMetadataForNav(elf_file, func.owner_nav); self.symbol(sym_index).atom(elf_file).?.freeRelocs(elf_file); - { + if (self.jumpTablePtr()) |jump_table| { const sym = self.symbol(sym_index); if (!sym.flags.has_zjt) { const index = try jump_table.addSymbol(gpa, sym_index); @@ -1100,21 +1102,23 @@ pub fn updateFunc( // Exports will be updated by `Zcu.processExports` after the update. - if (jump_table.dirty) { - // TODO write in bulk - for (jump_table.entries.items(.dirty), 0..) |*dirty, i| { - try jump_table.writeEntry(@intCast(i), self, elf_file); - dirty.* = false; - } - } else { - const sym = self.symbol(sym_index); - const jt_index = sym.extra(elf_file).zjt; - var jt_entry = jump_table.entries.get(jt_index); - if (jt_entry.dirty) { - try jump_table.writeEntry(jt_index, self, elf_file); - jt_entry.dirty = false; + if (self.jumpTablePtr()) |jump_table| { + if (jump_table.dirty) { + // TODO write in bulk + for (jump_table.entries.items(.dirty), 0..) |*dirty, i| { + try jump_table.writeEntry(@intCast(i), self, elf_file); + dirty.* = false; + } + } else { + const sym = self.symbol(sym_index); + const jt_index = sym.extra(elf_file).zjt; + var jt_entry = jump_table.entries.get(jt_index); + if (jt_entry.dirty) { + try jump_table.writeEntry(jt_index, self, elf_file); + jt_entry.dirty = false; + } + jump_table.entries.set(jt_index, jt_entry); } - jump_table.entries.set(jt_index, jt_entry); } } @@ -1474,7 +1478,7 @@ pub fn jumpTablePtr(self: *ZigObject) ?*JumpTable { return if (self.jump_table) |*jt| jt else null; } -fn initJumpTable(self: *ZigObject, allocator: Allocator, elf_file: *Elf) error{OutOfMemory}!*JumpTable { +fn initJumpTable(self: *ZigObject, allocator: Allocator, elf_file: *Elf) error{OutOfMemory}!void { const name_off = try self.addString(allocator, "__zig_jump_table"); const sym_index = try self.newSymbolWithAtom(allocator, name_off); const sym = self.symbol(sym_index); @@ -1485,7 +1489,6 @@ fn initJumpTable(self: *ZigObject, allocator: Allocator, elf_file: *Elf) error{O atom_ptr.alignment = Atom.Alignment.fromNonzeroByteUnits(JumpTable.alignment(elf_file.getTarget().cpu.arch)); atom_ptr.output_section_index = elf_file.zig_text_section_index.?; self.jump_table = JumpTable{ .sym_index = sym_index }; - return &(self.jump_table.?); } pub fn asFile(self: *ZigObject) File { |
