| ... | @@ -970,7 +970,6 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { | ... | @@ -970,7 +970,6 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { |
| 970 | try self.allocateDataSegment(); | 970 | try self.allocateDataSegment(); |
| 971 | self.allocateLinkeditSegment(); | 971 | self.allocateLinkeditSegment(); |
| 972 | try self.allocateTextBlocks(); | 972 | try self.allocateTextBlocks(); |
| 973 | self.printSymtabAndTextBlock(); | | |
| 974 | try self.flushZld(); | 973 | try self.flushZld(); |
| 975 | } | 974 | } |
| 976 | | 975 | |
| ... | @@ -2345,7 +2344,7 @@ fn resolveSymbols(self: *MachO) !void { | ... | @@ -2345,7 +2344,7 @@ fn resolveSymbols(self: *MachO) !void { |
| 2345 | .n_strx = undef.n_strx, | 2344 | .n_strx = undef.n_strx, |
| 2346 | .n_type = macho.N_UNDF | macho.N_EXT, | 2345 | .n_type = macho.N_UNDF | macho.N_EXT, |
| 2347 | .n_sect = 0, | 2346 | .n_sect = 0, |
| 2348 | .n_desc = packDylibOrdinal(@intCast(u16, ordinal + 1)), | 2347 | .n_desc = @intCast(u16, ordinal + 1) * macho.N_SYMBOL_RESOLVER, |
| 2349 | .n_value = 0, | 2348 | .n_value = 0, |
| 2350 | }); | 2349 | }); |
| 2351 | resolv.* = .{ | 2350 | resolv.* = .{ |
| ... | @@ -3021,7 +3020,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { | ... | @@ -3021,7 +3020,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { |
| 3021 | try pointers.append(.{ | 3020 | try pointers.append(.{ |
| 3022 | .offset = base_offset + i * @sizeOf(u64), | 3021 | .offset = base_offset + i * @sizeOf(u64), |
| 3023 | .segment_id = segment_id, | 3022 | .segment_id = segment_id, |
| 3024 | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), | 3023 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 3025 | .name = self.getString(sym.n_strx), | 3024 | .name = self.getString(sym.n_strx), |
| 3026 | }); | 3025 | }); |
| 3027 | } | 3026 | } |
| ... | @@ -3046,7 +3045,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { | ... | @@ -3046,7 +3045,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { |
| 3046 | try pointers.append(.{ | 3045 | try pointers.append(.{ |
| 3047 | .offset = binding.offset + base_offset, | 3046 | .offset = binding.offset + base_offset, |
| 3048 | .segment_id = match.seg, | 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 | .name = self.getString(bind_sym.n_strx), | 3049 | .name = self.getString(bind_sym.n_strx), |
| 3051 | }); | 3050 | }); |
| 3052 | } | 3051 | } |
| ... | @@ -3093,7 +3092,7 @@ fn writeLazyBindInfoTableZld(self: *MachO) !void { | ... | @@ -3093,7 +3092,7 @@ fn writeLazyBindInfoTableZld(self: *MachO) !void { |
| 3093 | pointers.appendAssumeCapacity(.{ | 3092 | pointers.appendAssumeCapacity(.{ |
| 3094 | .offset = base_offset + i * @sizeOf(u64), | 3093 | .offset = base_offset + i * @sizeOf(u64), |
| 3095 | .segment_id = segment_id, | 3094 | .segment_id = segment_id, |
| 3096 | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), | 3095 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 3097 | .name = self.getString(sym.n_strx), | 3096 | .name = self.getString(sym.n_strx), |
| 3098 | }); | 3097 | }); |
| 3099 | } | 3098 | } |
| ... | @@ -4395,7 +4394,7 @@ pub fn populateMissingMetadata(self: *MachO) !void { | ... | @@ -4395,7 +4394,7 @@ pub fn populateMissingMetadata(self: *MachO) !void { |
| 4395 | .n_strx = n_strx, | 4394 | .n_strx = n_strx, |
| 4396 | .n_type = macho.N_UNDF | macho.N_EXT, | 4395 | .n_type = macho.N_UNDF | macho.N_EXT, |
| 4397 | .n_sect = 0, | 4396 | .n_sect = 0, |
| 4398 | .n_desc = packDylibOrdinal(1), | 4397 | .n_desc = @intCast(u8, 1) * macho.N_SYMBOL_RESOLVER, |
| 4399 | .n_value = 0, | 4398 | .n_value = 0, |
| 4400 | }); | 4399 | }); |
| 4401 | try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ | 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,7 +4540,7 @@ pub fn addExternFn(self: *MachO, name: []const u8) !u32 { |
| 4541 | .n_strx = n_strx, | 4540 | .n_strx = n_strx, |
| 4542 | .n_type = macho.N_UNDF | macho.N_EXT, | 4541 | .n_type = macho.N_UNDF | macho.N_EXT, |
| 4543 | .n_sect = 0, | 4542 | .n_sect = 0, |
| 4544 | .n_desc = packDylibOrdinal(1), | 4543 | .n_desc = @intCast(u8, 1) * macho.N_SYMBOL_RESOLVER, |
| 4545 | .n_value = 0, | 4544 | .n_value = 0, |
| 4546 | }); | 4545 | }); |
| 4547 | try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ | 4546 | try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ |
| ... | @@ -5423,7 +5422,7 @@ fn writeBindInfoTable(self: *MachO) !void { | ... | @@ -5423,7 +5422,7 @@ fn writeBindInfoTable(self: *MachO) !void { |
| 5423 | try pointers.append(.{ | 5422 | try pointers.append(.{ |
| 5424 | .offset = base_offset + i * @sizeOf(u64), | 5423 | .offset = base_offset + i * @sizeOf(u64), |
| 5425 | .segment_id = segment_id, | 5424 | .segment_id = segment_id, |
| 5426 | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), | 5425 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 5427 | .name = self.getString(sym.n_strx), | 5426 | .name = self.getString(sym.n_strx), |
| 5428 | }); | 5427 | }); |
| 5429 | } | 5428 | } |
| ... | @@ -5448,7 +5447,7 @@ fn writeBindInfoTable(self: *MachO) !void { | ... | @@ -5448,7 +5447,7 @@ fn writeBindInfoTable(self: *MachO) !void { |
| 5448 | try pointers.append(.{ | 5447 | try pointers.append(.{ |
| 5449 | .offset = binding.offset + base_offset, | 5448 | .offset = binding.offset + base_offset, |
| 5450 | .segment_id = match.seg, | 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 | .name = self.getString(bind_sym.n_strx), | 5451 | .name = self.getString(bind_sym.n_strx), |
| 5453 | }); | 5452 | }); |
| 5454 | } | 5453 | } |
| ... | @@ -5507,7 +5506,7 @@ fn writeLazyBindInfoTable(self: *MachO) !void { | ... | @@ -5507,7 +5506,7 @@ fn writeLazyBindInfoTable(self: *MachO) !void { |
| 5507 | pointers.appendAssumeCapacity(.{ | 5506 | pointers.appendAssumeCapacity(.{ |
| 5508 | .offset = base_offset + i * @sizeOf(u64), | 5507 | .offset = base_offset + i * @sizeOf(u64), |
| 5509 | .segment_id = segment_id, | 5508 | .segment_id = segment_id, |
| 5510 | .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), | 5509 | .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), |
| 5511 | .name = self.getString(sym.n_strx), | 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,14 +5848,6 @@ pub fn symbolIsTemp(sym: macho.nlist_64, sym_name: []const u8) bool { |
| 5849 | return mem.startsWith(u8, sym_name, "l") or mem.startsWith(u8, sym_name, "L"); | 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 | pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anytype) usize { | 5851 | pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anytype) usize { |
| 5861 | if (!@hasDecl(@TypeOf(predicate), "predicate")) | 5852 | if (!@hasDecl(@TypeOf(predicate), "predicate")) |
| 5862 | @compileError("Predicate is required to define fn predicate(@This(), T) bool"); | 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,70 +5860,3 @@ pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anyty |
| 5869 | } | 5860 | } |
| 5870 | return i; | 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 | } | | |