authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-08-02 19:48:23+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-08-02 19:49:32+02:00
log41d7787b69a437e21351d103353fc2eefafb5d17
tree4998363492bd09a1b25a83685c5cc3a6c0e115f9
parentbf25650974933cdb8c1314a85e0838257f6f4471

macho: remove obsolete pack/unpack dylib ordinal fns

Remove some unused debugging machinery such as full printing of the symtab after symbol resolution. It was there only for the time of rewriting the linker.

1 files changed, 9 insertions(+), 85 deletions(-)

src/link/MachO.zig+9-85
...@@ -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 }
976975
...@@ -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}
58515850
5852fn packDylibOrdinal(ordinal: u16) u16 {
5853 return ordinal * macho.N_SYMBOL_RESOLVER;
5854}
5855
5856fn unpackDylibOrdinal(pack: u16) u16 {
5857 return @divExact(pack, macho.N_SYMBOL_RESOLVER);
5858}
5859
5860pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anytype) usize {5851pub 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
5873fn 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}