commit 2d10c52b3cfac9516f5548b04528bb7c31a0a6e7 (tree)
parent 792fd9c4a362f44f900007562504bfaceffbcc82
Author: Jakub Konka <kubkon@jakubkonka.com>
Date: Sat, 21 Aug 2021 11:51:50 +0200
macho: create an explicit symbol and atom for dyld entry in __data
This way, we will be able to refer to that atom dynamically via
relocations rather than requiring hardcoded addressing upfront.
Diffstat:
1 file changed, 26 insertions(+), 0 deletions(-)
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
@@ -143,6 +143,7 @@ unresolved: std.AutoArrayHashMapUnmanaged(u32, void) = .{},
locals_free_list: std.ArrayListUnmanaged(u32) = .{},
globals_free_list: std.ArrayListUnmanaged(u32) = .{},
+dyld_private_sym_index: ?u32 = null,
dyld_stub_binder_index: ?u32 = null,
stub_helper_stubs_start_off: ?u64 = null,
@@ -758,6 +759,7 @@ pub fn flush(self: *MachO, comp: *Compilation) !void {
try self.parseLibs(libs.items, self.base.options.sysroot);
try self.resolveSymbols();
try self.resolveDyldStubBinder();
+ try self.createDyldPrivateAtom();
if (!use_stage1) {
// TODO this should be made common when I figure out how to prealloc space for traditional linker path.
@@ -1963,7 +1965,31 @@ fn createEmptyAtom(
return block;
}
+fn createDyldPrivateAtom(self: *MachO) !void {
+ if (self.dyld_private_sym_index != null) return;
+
+ const match = MatchingSection{
+ .seg = self.data_segment_cmd_index.?,
+ .sect = self.data_section_index.?,
+ };
+ const local_sym_index = @intCast(u32, self.locals.items.len);
+ try self.locals.append(self.base.allocator, .{
+ .n_strx = try self.makeString("dyld_private"),
+ .n_type = macho.N_SECT,
+ .n_sect = 0,
+ .n_desc = 0,
+ .n_value = 0,
+ });
+ _ = try self.createEmptyAtom(match, local_sym_index, @sizeOf(u64), 3);
+
+ self.dyld_private_sym_index = local_sym_index;
+}
+
// fn createStubHelperPreambleAtom(self: *MachO) !void {
+// const match = MatchingSection{
+// .seg = self.text_segment_cmd_index.?,
+// .sect = self.stub_helper_section_index.?,
+// };
// switch (self.base.options.target.cpu.arch) {
// .x86_64 => {
// const code_size = 15;