aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-05-14 10:05:01 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-05-14 11:02:43 +0200
commit8eea5eddf773a8d1f9f883e71d00409e454ee0bd (patch)
treead94c3581a3e8a93d44b05d8abedb35820ee2152 /src/link/MachO.zig
parent826179bff40fdbd8c3b11138897fcfbb3367def8 (diff)
downloadzig-8eea5eddf773a8d1f9f883e71d00409e454ee0bd.tar.gz
zig-8eea5eddf773a8d1f9f883e71d00409e454ee0bd.zip
macho: fix bug with symbol growth and realloc
Diffstat (limited to 'src/link/MachO.zig')
-rw-r--r--src/link/MachO.zig8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 2ae9575b7e..d8518c4894 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -1193,7 +1193,9 @@ pub fn updateDecl(self: *MachO, module: *Module, decl: *Module.Decl) !void {
const need_realloc = code.len > capacity or !mem.isAlignedGeneric(u64, symbol.n_value, required_alignment);
if (need_realloc) {
const vaddr = try self.growTextBlock(&decl.link.macho, code.len, required_alignment);
- log.debug("growing {s} from 0x{x} to 0x{x}", .{ decl.name, symbol.n_value, vaddr });
+
+ log.debug("growing {s} and moving from 0x{x} to 0x{x}", .{ decl.name, symbol.n_value, vaddr });
+
if (vaddr != symbol.n_value) {
log.debug(" (writing new offset table entry)", .{});
self.offset_table.items[decl.link.macho.offset_table_index] = .{
@@ -1203,6 +1205,8 @@ pub fn updateDecl(self: *MachO, module: *Module, decl: *Module.Decl) !void {
};
try self.writeOffsetTableEntry(decl.link.macho.offset_table_index);
}
+
+ symbol.n_value = vaddr;
} else if (code.len < decl.link.macho.size) {
self.shrinkTextBlock(&decl.link.macho, code.len);
}
@@ -1219,7 +1223,9 @@ pub fn updateDecl(self: *MachO, module: *Module, decl: *Module.Decl) !void {
const decl_name = mem.spanZ(decl.name);
const name_str_index = try self.makeString(decl_name);
const addr = try self.allocateTextBlock(&decl.link.macho, code.len, required_alignment);
+
log.debug("allocated text block for {s} at 0x{x}", .{ decl_name, addr });
+
errdefer self.freeTextBlock(&decl.link.macho);
symbol.* = .{