authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-09 15:39:24+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-13 10:56:03+02:00
logb377e0b370252e08d55dd384e23ed3fd05aea5c5
tree16328acb2bd39becee88a9471efee52994b57fb2
parentb0a4e1fa46267e913ab9de77cf4b61907d418810

zld: fix indirect symtab


1 files changed, 12 insertions(+), 30 deletions(-)

src/link/MachO/Zld.zig+12-30
......@@ -2082,7 +2082,6 @@ fn flush(self: *Zld) !void {
20822082 try self.populateStringTable();
20832083 try self.writeDebugInfo();
20842084 try self.writeSymbolTable();
2085 try self.writeDynamicSymbolTable();
20862085 try self.writeStringTable();
20872086
20882087 {
......@@ -2604,6 +2603,10 @@ fn writeSymbolTable(self: *Zld) !void {
26042603 var undefs = std.ArrayList(macho.nlist_64).init(self.allocator);
26052604 defer undefs.deinit();
26062605
2606 var undefs_ids = std.StringHashMap(u32).init(self.allocator);
2607 defer undefs_ids.deinit();
2608
2609 var undef_id: u32 = 0;
26072610 for (self.symtab.items()) |entry| {
26082611 switch (entry.value.tag) {
26092612 .Weak, .Strong => {
......@@ -2611,6 +2614,8 @@ fn writeSymbolTable(self: *Zld) !void {
26112614 },
26122615 .Import => {
26132616 try undefs.append(entry.value.inner);
2617 try undefs_ids.putNoClobber(entry.key, undef_id);
2618 undef_id += 1;
26142619 },
26152620 else => unreachable,
26162621 }
......@@ -2645,17 +2650,13 @@ fn writeSymbolTable(self: *Zld) !void {
26452650 dysymtab.nextdefsym = @intCast(u32, nexports);
26462651 dysymtab.iundefsym = dysymtab.nlocalsym + dysymtab.nextdefsym;
26472652 dysymtab.nundefsym = @intCast(u32, nundefs);
2648}
26492653
2650fn writeDynamicSymbolTable(self: *Zld) !void {
2651 const seg = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment;
26522654 const text_segment = &self.load_commands.items[self.text_segment_cmd_index.?].Segment;
26532655 const stubs = &text_segment.sections.items[self.stubs_section_index.?];
26542656 const data_const_segment = &self.load_commands.items[self.data_const_segment_cmd_index.?].Segment;
26552657 const got = &data_const_segment.sections.items[self.got_section_index.?];
26562658 const data_segment = &self.load_commands.items[self.data_segment_cmd_index.?].Segment;
26572659 const la_symbol_ptr = &data_segment.sections.items[self.la_symbol_ptr_section_index.?];
2658 const dysymtab = &self.load_commands.items[self.dysymtab_cmd_index.?].Dysymtab;
26592660
26602661 const nstubs = @intCast(u32, self.stubs.items().len);
26612662 const ngot_entries = @intCast(u32, self.got_entries.items().len);
......@@ -2679,15 +2680,15 @@ fn writeDynamicSymbolTable(self: *Zld) !void {
26792680
26802681 stubs.reserved1 = 0;
26812682 for (self.stubs.items()) |entry| {
2682 const symtab_idx = @intCast(u32, dysymtab.iundefsym + entry.value);
2683 try writer.writeIntLittle(u32, symtab_idx);
2683 const id = undefs_ids.get(entry.key) orelse unreachable;
2684 try writer.writeIntLittle(u32, dysymtab.iundefsym + id);
26842685 }
26852686
26862687 got.reserved1 = nstubs;
26872688 for (self.got_entries.items()) |entry| {
26882689 if (entry.value.tag == .import) {
2689 const symtab_idx = @intCast(u32, dysymtab.iundefsym + entry.value.index + nstubs);
2690 try writer.writeIntLittle(u32, symtab_idx);
2690 const id = undefs_ids.get(entry.key) orelse unreachable;
2691 try writer.writeIntLittle(u32, dysymtab.iundefsym + id);
26912692 } else {
26922693 try writer.writeIntLittle(u32, macho.INDIRECT_SYMBOL_LOCAL);
26932694 }
......@@ -2695,8 +2696,8 @@ fn writeDynamicSymbolTable(self: *Zld) !void {
26952696
26962697 la_symbol_ptr.reserved1 = got.reserved1 + ngot_entries;
26972698 for (self.stubs.items()) |entry| {
2698 const symtab_idx = @intCast(u32, dysymtab.iundefsym + entry.value);
2699 try writer.writeIntLittle(u32, symtab_idx);
2699 const id = undefs_ids.get(entry.key) orelse unreachable;
2700 try writer.writeIntLittle(u32, dysymtab.iundefsym + id);
27002701 }
27012702
27022703 try self.file.?.pwriteAll(buf, dysymtab.indirectsymoff);
......@@ -2887,22 +2888,3 @@ pub fn parseName(name: *const [16]u8) []const u8 {
28872888 const len = mem.indexOfScalar(u8, name, @as(u8, 0)) orelse name.len;
28882889 return name[0..len];
28892890}
2890
2891fn printDebug(self: Zld) void {
2892 log.warn("symtab", .{});
2893 for (self.symtab.items()) |entry| {
2894 log.warn(" | {s} => {any}", .{ entry.key, entry.value });
2895 }
2896
2897 log.warn("\n", .{});
2898 log.warn("GOT entries", .{});
2899 for (self.got_entries.items()) |entry| {
2900 log.warn(" | {s} => {any}", .{ entry.key, entry.value });
2901 }
2902
2903 log.warn("\n", .{});
2904 log.warn("stubs", .{});
2905 for (self.stubs.items()) |entry| {
2906 log.warn(" | {s} => {any}", .{ entry.key, entry.value });
2907 }
2908}