diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2021-11-26 17:04:04 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2021-11-26 17:04:04 +0100 |
| commit | a956958ba9186edb612fbecc5205d6b35cd419a6 (patch) | |
| tree | 2cf45a139527b487322a6a56b09648aca66baaed /src | |
| parent | 8317dbd1cb32eaeafa509e7142766f3d9a82de5f (diff) | |
| download | zig-a956958ba9186edb612fbecc5205d6b35cd419a6.tar.gz zig-a956958ba9186edb612fbecc5205d6b35cd419a6.zip | |
macho: define __mh_execute_header as a linker synthetic global
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index b718afe1f7..37f905cdd4 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -154,6 +154,7 @@ tentatives: std.AutoArrayHashMapUnmanaged(u32, void) = .{}, locals_free_list: std.ArrayListUnmanaged(u32) = .{}, globals_free_list: std.ArrayListUnmanaged(u32) = .{}, +mh_execute_header_index: ?u32 = null, dyld_stub_binder_index: ?u32 = null, dyld_private_atom: ?*Atom = null, stub_helper_preamble_atom: ?*Atom = null, @@ -863,6 +864,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { sect.offset = self.tlv_bss_file_offset; } + try self.createMhExecuteHeaderAtom(); for (self.objects.items) |*object, object_id| { if (object.analyzed) continue; try self.resolveSymbolsInObject(@intCast(u16, object_id)); @@ -2725,6 +2727,42 @@ fn resolveSymbolsInDylibs(self: *MachO) !void { } } +fn createMhExecuteHeaderAtom(self: *MachO) !void { + if (self.mh_execute_header_index != null) return; + + const match: MatchingSection = .{ + .seg = self.text_segment_cmd_index.?, + .sect = self.text_section_index.?, + }; + const n_strx = try self.makeString("__mh_execute_header"); + const local_sym_index = @intCast(u32, self.locals.items.len); + var nlist = macho.nlist_64{ + .n_strx = n_strx, + .n_type = macho.N_SECT, + .n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1), + .n_desc = 0, + .n_value = 0, + }; + try self.locals.append(self.base.allocator, nlist); + + nlist.n_type |= macho.N_EXT; + const global_sym_index = @intCast(u32, self.globals.items.len); + try self.globals.append(self.base.allocator, nlist); + try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ + .where = .global, + .where_index = global_sym_index, + .local_sym_index = local_sym_index, + .file = null, + }); + + const atom = try self.createEmptyAtom(local_sym_index, 0, 0); + const sym = &self.locals.items[local_sym_index]; + const vaddr = try self.allocateAtom(atom, 0, 1, match); + sym.n_value = vaddr; + atom.dirty = false; + self.mh_execute_header_index = local_sym_index; +} + fn resolveDyldStubBinder(self: *MachO) !void { if (self.dyld_stub_binder_index != null) return; |
