diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-12 22:51:33 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-13 13:30:24 +0200 |
| commit | e3f6ebaea94bb11c2e990e1fa17b48e51e598b5c (patch) | |
| tree | b8114bfb6d2eef489674bcc3108480583d85ef29 /src/link | |
| parent | 16abf51ceef2ba2ebb38f27270af676387435f05 (diff) | |
| download | zig-e3f6ebaea94bb11c2e990e1fa17b48e51e598b5c.tar.gz zig-e3f6ebaea94bb11c2e990e1fa17b48e51e598b5c.zip | |
x86_64+elf: fix jump table indirection for functions
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/Elf/ZigObject.zig | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index f289e0ad19..0cb47d7473 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -107,23 +107,17 @@ pub fn deinit(self: *ZigObject, allocator: Allocator) void { } self.relocs.deinit(allocator); - { - var it = self.navs.iterator(); - while (it.next()) |entry| { - entry.value_ptr.exports.deinit(allocator); - } - self.navs.deinit(allocator); + for (self.navs.values()) |*meta| { + meta.exports.deinit(allocator); } + self.navs.deinit(allocator); self.lazy_syms.deinit(allocator); - { - var it = self.uavs.iterator(); - while (it.next()) |entry| { - entry.value_ptr.exports.deinit(allocator); - } - self.uavs.deinit(allocator); + for (self.uavs.values()) |*meta| { + meta.exports.deinit(allocator); } + self.uavs.deinit(allocator); for (self.tls_variables.values()) |*tlv| { tlv.deinit(allocator); @@ -1721,8 +1715,8 @@ const TlsVariable = struct { }; const AtomList = std.ArrayListUnmanaged(Atom.Index); -const NavTable = std.AutoHashMapUnmanaged(InternPool.Nav.Index, AvMetadata); -const UavTable = std.AutoHashMapUnmanaged(InternPool.Index, AvMetadata); +const NavTable = std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, AvMetadata); +const UavTable = std.AutoArrayHashMapUnmanaged(InternPool.Index, AvMetadata); const LazySymbolTable = std.AutoArrayHashMapUnmanaged(InternPool.Index, LazySymbolMetadata); const TlsTable = std.AutoArrayHashMapUnmanaged(Atom.Index, TlsVariable); @@ -1874,9 +1868,9 @@ pub const OffsetTable = struct { const x86_64 = struct { fn writeEntry(source_addr: i64, target_addr: i64, buf: *[max_jump_seq_len]u8) ![]u8 { - const disp = @as(i64, @intCast(target_addr)) - source_addr - 4; + const disp = @as(i64, @intCast(target_addr)) - source_addr - 5; var bytes = [_]u8{ - 0xe8, 0x00, 0x00, 0x00, 0x00, // jmp rel32 + 0xe9, 0x00, 0x00, 0x00, 0x00, // jmp rel32 }; assert(bytes.len == entrySize(.x86_64)); mem.writeInt(i32, bytes[1..][0..4], @intCast(disp), .little); |
