| ... | ... | @@ -970,7 +970,6 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { |
| 970 | 970 | try self.allocateDataSegment(); |
| 971 | 971 | self.allocateLinkeditSegment(); |
| 972 | 972 | try self.allocateTextBlocks(); |
| 973 | | self.printSymtabAndTextBlock(); |
| 974 | 973 | try self.flushZld(); |
| 975 | 974 | } |
| 976 | 975 | |
| ... | ... | @@ -2345,7 +2344,7 @@ fn resolveSymbols(self: *MachO) !void { |
| 2345 | 2344 | .n_strx = undef.n_strx, |
| 2346 | 2345 | .n_type = macho.N_UNDF | macho.N_EXT, |
| 2347 | 2346 | .n_sect = 0, |
| 2348 | | .n_desc = packDylibOrdinal(@intCast(u16, ordinal + 1)), |
| 2347 | .n_desc = @intCast(u16, ordinal + 1) * macho.N_SYMBOL_RESOLVER, |
| 2349 | 2348 | .n_value = 0, |
| 2350 | 2349 | }); |
| 2351 | 2350 | resolv.* = .{ |
| ... | ... | @@ -3021,7 +3020,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { |
| 3021 | 3020 | try pointers.append(.{ |
| 3022 | 3021 | .offset = base_offset + i * @sizeOf(u64), |
| 3023 | 3022 | .segment_id = segment_id, |
| 3024 | | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), |
| 3023 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 3025 | 3024 | .name = self.getString(sym.n_strx), |
| 3026 | 3025 | }); |
| 3027 | 3026 | } |
| ... | ... | @@ -3046,7 +3045,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { |
| 3046 | 3045 | try pointers.append(.{ |
| 3047 | 3046 | .offset = binding.offset + base_offset, |
| 3048 | 3047 | .segment_id = match.seg, |
| 3049 | | .dylib_ordinal = unpackDylibOrdinal(bind_sym.n_desc), |
| 3048 | .dylib_ordinal = @divExact(bind_sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 3050 | 3049 | .name = self.getString(bind_sym.n_strx), |
| 3051 | 3050 | }); |
| 3052 | 3051 | } |
| ... | ... | @@ -3093,7 +3092,7 @@ fn writeLazyBindInfoTableZld(self: *MachO) !void { |
| 3093 | 3092 | pointers.appendAssumeCapacity(.{ |
| 3094 | 3093 | .offset = base_offset + i * @sizeOf(u64), |
| 3095 | 3094 | .segment_id = segment_id, |
| 3096 | | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), |
| 3095 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 3097 | 3096 | .name = self.getString(sym.n_strx), |
| 3098 | 3097 | }); |
| 3099 | 3098 | } |
| ... | ... | @@ -4395,7 +4394,7 @@ pub fn populateMissingMetadata(self: *MachO) !void { |
| 4395 | 4394 | .n_strx = n_strx, |
| 4396 | 4395 | .n_type = macho.N_UNDF | macho.N_EXT, |
| 4397 | 4396 | .n_sect = 0, |
| 4398 | | .n_desc = packDylibOrdinal(1), |
| 4397 | .n_desc = @intCast(u8, 1) * macho.N_SYMBOL_RESOLVER, |
| 4399 | 4398 | .n_value = 0, |
| 4400 | 4399 | }); |
| 4401 | 4400 | try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ |
| ... | ... | @@ -4541,7 +4540,7 @@ pub fn addExternFn(self: *MachO, name: []const u8) !u32 { |
| 4541 | 4540 | .n_strx = n_strx, |
| 4542 | 4541 | .n_type = macho.N_UNDF | macho.N_EXT, |
| 4543 | 4542 | .n_sect = 0, |
| 4544 | | .n_desc = packDylibOrdinal(1), |
| 4543 | .n_desc = @intCast(u8, 1) * macho.N_SYMBOL_RESOLVER, |
| 4545 | 4544 | .n_value = 0, |
| 4546 | 4545 | }); |
| 4547 | 4546 | try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ |
| ... | ... | @@ -5423,7 +5422,7 @@ fn writeBindInfoTable(self: *MachO) !void { |
| 5423 | 5422 | try pointers.append(.{ |
| 5424 | 5423 | .offset = base_offset + i * @sizeOf(u64), |
| 5425 | 5424 | .segment_id = segment_id, |
| 5426 | | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), |
| 5425 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 5427 | 5426 | .name = self.getString(sym.n_strx), |
| 5428 | 5427 | }); |
| 5429 | 5428 | } |
| ... | ... | @@ -5448,7 +5447,7 @@ fn writeBindInfoTable(self: *MachO) !void { |
| 5448 | 5447 | try pointers.append(.{ |
| 5449 | 5448 | .offset = binding.offset + base_offset, |
| 5450 | 5449 | .segment_id = match.seg, |
| 5451 | | .dylib_ordinal = unpackDylibOrdinal(bind_sym.n_desc), |
| 5450 | .dylib_ordinal = @divExact(bind_sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 5452 | 5451 | .name = self.getString(bind_sym.n_strx), |
| 5453 | 5452 | }); |
| 5454 | 5453 | } |
| ... | ... | @@ -5507,7 +5506,7 @@ fn writeLazyBindInfoTable(self: *MachO) !void { |
| 5507 | 5506 | pointers.appendAssumeCapacity(.{ |
| 5508 | 5507 | .offset = base_offset + i * @sizeOf(u64), |
| 5509 | 5508 | .segment_id = segment_id, |
| 5510 | | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), |
| 5509 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 5511 | 5510 | .name = self.getString(sym.n_strx), |
| 5512 | 5511 | }); |
| 5513 | 5512 | } |
| ... | ... | @@ -5849,14 +5848,6 @@ pub fn symbolIsTemp(sym: macho.nlist_64, sym_name: []const u8) bool { |
| 5849 | 5848 | return mem.startsWith(u8, sym_name, "l") or mem.startsWith(u8, sym_name, "L"); |
| 5850 | 5849 | } |
| 5851 | 5850 | |
| 5852 | | fn packDylibOrdinal(ordinal: u16) u16 { |
| 5853 | | return ordinal * macho.N_SYMBOL_RESOLVER; |
| 5854 | | } |
| 5855 | | |
| 5856 | | fn unpackDylibOrdinal(pack: u16) u16 { |
| 5857 | | return @divExact(pack, macho.N_SYMBOL_RESOLVER); |
| 5858 | | } |
| 5859 | | |
| 5860 | 5851 | pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anytype) usize { |
| 5861 | 5852 | if (!@hasDecl(@TypeOf(predicate), "predicate")) |
| 5862 | 5853 | @compileError("Predicate is required to define fn predicate(@This(), T) bool"); |
| ... | ... | @@ -5869,70 +5860,3 @@ pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anyty |
| 5869 | 5860 | } |
| 5870 | 5861 | return i; |
| 5871 | 5862 | } |
| 5872 | | |
| 5873 | | fn printSymtabAndTextBlock(self: *MachO) void { |
| 5874 | | log.debug("locals", .{}); |
| 5875 | | for (self.locals.items) |sym, id| { |
| 5876 | | log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); |
| 5877 | | } |
| 5878 | | |
| 5879 | | log.debug("globals", .{}); |
| 5880 | | for (self.globals.items) |sym, id| { |
| 5881 | | log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); |
| 5882 | | } |
| 5883 | | |
| 5884 | | log.debug("tentatives", .{}); |
| 5885 | | for (self.tentatives.items) |sym, id| { |
| 5886 | | log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); |
| 5887 | | } |
| 5888 | | |
| 5889 | | log.debug("undefines", .{}); |
| 5890 | | for (self.undefs.items) |sym, id| { |
| 5891 | | log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); |
| 5892 | | } |
| 5893 | | |
| 5894 | | log.debug("imports", .{}); |
| 5895 | | for (self.imports.items) |sym, id| { |
| 5896 | | log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); |
| 5897 | | } |
| 5898 | | |
| 5899 | | { |
| 5900 | | log.debug("symbol resolver", .{}); |
| 5901 | | var it = self.symbol_resolver.keyIterator(); |
| 5902 | | while (it.next()) |key_ptr| { |
| 5903 | | const sym_name = self.getString(key_ptr.*); |
| 5904 | | log.debug(" {s} => {}", .{ sym_name, self.symbol_resolver.get(key_ptr.*).? }); |
| 5905 | | } |
| 5906 | | } |
| 5907 | | |
| 5908 | | log.debug("mappings", .{}); |
| 5909 | | for (self.objects.items) |object| { |
| 5910 | | log.debug(" in object {s}", .{object.name}); |
| 5911 | | for (object.symtab.items) |sym, sym_id| { |
| 5912 | | if (object.symbol_mapping.get(@intCast(u32, sym_id))) |local_id| { |
| 5913 | | log.debug(" | {d} => {d}", .{ sym_id, local_id }); |
| 5914 | | } else { |
| 5915 | | log.debug(" | {d} no local mapping for {s}", .{ sym_id, object.getString(sym.n_strx) }); |
| 5916 | | } |
| 5917 | | } |
| 5918 | | } |
| 5919 | | |
| 5920 | | { |
| 5921 | | var it = self.blocks.iterator(); |
| 5922 | | while (it.next()) |entry| { |
| 5923 | | const seg = self.load_commands.items[entry.key_ptr.seg].Segment; |
| 5924 | | const sect = seg.sections.items[entry.key_ptr.sect]; |
| 5925 | | |
| 5926 | | var block: *TextBlock = entry.value_ptr.*; |
| 5927 | | |
| 5928 | | log.debug("\n\n{s},{s} contents:", .{ commands.segmentName(sect), commands.sectionName(sect) }); |
| 5929 | | log.debug("{}", .{sect}); |
| 5930 | | log.debug("{}", .{block}); |
| 5931 | | |
| 5932 | | while (block.prev) |prev| { |
| 5933 | | block = prev; |
| 5934 | | log.debug("{}", .{block}); |
| 5935 | | } |
| 5936 | | } |
| 5937 | | } |
| 5938 | | } |