| ... | ... | @@ -4228,20 +4228,34 @@ fn allocateAtom(self: *MachO, atom: *Atom, new_atom_size: u64, alignment: u64, m |
| 4228 | 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 | 4240 | const sym_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{name}); |
| 4233 | 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{ |
| 4236 | | .bytes = &self.strtab, |
| 4237 | | })) |n_strx| { |
| 4238 | | const resolv = self.symbol_resolver.get(n_strx) orelse unreachable; |
| 4239 | | return resolv.where_index; |
| 4244 | if (self.symbol_resolver.get(n_strx)) |resolv| { |
| 4245 | return switch (resolv.where) { |
| 4246 | .global => AddExternFnRes{ |
| 4247 | .where = .local, |
| 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 | 4257 | log.debug("adding new extern function '{s}'", .{sym_name}); |
| 4243 | 4258 | const sym_index = @intCast(u32, self.undefs.items.len); |
| 4244 | | const n_strx = try self.makeString(sym_name); |
| 4245 | 4259 | try self.undefs.append(self.base.allocator, .{ |
| 4246 | 4260 | .n_strx = n_strx, |
| 4247 | 4261 | .n_type = macho.N_UNDF, |
| ... | ... | @@ -4255,7 +4269,10 @@ pub fn addExternFn(self: *MachO, name: []const u8) !u32 { |
| 4255 | 4269 | }); |
| 4256 | 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 | 4278 | const NextSegmentAddressAndOffset = struct { |