| ... | @@ -4228,20 +4228,34 @@ fn allocateAtom(self: *MachO, atom: *Atom, new_atom_size: u64, alignment: u64, m | ... | @@ -4228,20 +4228,34 @@ fn allocateAtom(self: *MachO, atom: *Atom, new_atom_size: u64, alignment: u64, m |
| 4228 | return vaddr; | 4228 | return vaddr; |
| 4229 | } | 4229 | } |
| 4230 | | 4230 | |
| 4231 | pub fn addExternFn(self: *MachO, name: []const u8) !u32 { | 4231 | const AddExternFnRes = struct { |
| | 4232 | where: enum { |
| | 4233 | local, |
| | 4234 | undef, |
| | 4235 | }, |
| | 4236 | where_index: u32, |
| | 4237 | }; |
| | 4238 | |
| | 4239 | pub fn addExternFn(self: *MachO, name: []const u8) !AddExternFnRes { |
| 4232 | const sym_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{name}); | 4240 | const sym_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{name}); |
| 4233 | defer self.base.allocator.free(sym_name); | 4241 | defer self.base.allocator.free(sym_name); |
| | 4242 | const n_strx = try self.makeString(sym_name); |
| 4234 | | 4243 | |
| 4235 | if (self.strtab_dir.getKeyAdapted(@as([]const u8, sym_name), StringIndexAdapter{ | 4244 | if (self.symbol_resolver.get(n_strx)) |resolv| { |
| 4236 | .bytes = &self.strtab, | 4245 | return switch (resolv.where) { |
| 4237 | })) |n_strx| { | 4246 | .global => AddExternFnRes{ |
| 4238 | const resolv = self.symbol_resolver.get(n_strx) orelse unreachable; | 4247 | .where = .local, |
| 4239 | return resolv.where_index; | 4248 | .where_index = resolv.local_sym_index, |
| | 4249 | }, |
| | 4250 | .undef => AddExternFnRes{ |
| | 4251 | .where = .undef, |
| | 4252 | .where_index = resolv.where_index, |
| | 4253 | }, |
| | 4254 | }; |
| 4240 | } | 4255 | } |
| 4241 | | 4256 | |
| 4242 | log.debug("adding new extern function '{s}'", .{sym_name}); | 4257 | log.debug("adding new extern function '{s}'", .{sym_name}); |
| 4243 | const sym_index = @intCast(u32, self.undefs.items.len); | 4258 | const sym_index = @intCast(u32, self.undefs.items.len); |
| 4244 | const n_strx = try self.makeString(sym_name); | | |
| 4245 | try self.undefs.append(self.base.allocator, .{ | 4259 | try self.undefs.append(self.base.allocator, .{ |
| 4246 | .n_strx = n_strx, | 4260 | .n_strx = n_strx, |
| 4247 | .n_type = macho.N_UNDF, | 4261 | .n_type = macho.N_UNDF, |
| ... | @@ -4255,7 +4269,10 @@ pub fn addExternFn(self: *MachO, name: []const u8) !u32 { | ... | @@ -4255,7 +4269,10 @@ pub fn addExternFn(self: *MachO, name: []const u8) !u32 { |
| 4255 | }); | 4269 | }); |
| 4256 | try self.unresolved.putNoClobber(self.base.allocator, sym_index, .stub); | 4270 | try self.unresolved.putNoClobber(self.base.allocator, sym_index, .stub); |
| 4257 | | 4271 | |
| 4258 | return sym_index; | 4272 | return AddExternFnRes{ |
| | 4273 | .where = .undef, |
| | 4274 | .where_index = sym_index, |
| | 4275 | }; |
| 4259 | } | 4276 | } |
| 4260 | | 4277 | |
| 4261 | const NextSegmentAddressAndOffset = struct { | 4278 | const NextSegmentAddressAndOffset = struct { |