From 8bd0687713855a41578605a3e1a6c9686a702bfe Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 26 Aug 2021 16:16:34 +0200 Subject: [PATCH] macho: port mechanism for allocating symbols within atoms such as entire sections represented as a single atom. --- src/link/MachO.zig | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 1dd369c98191c11c023b3d35f9c32cc98e8e6b9d..390d4c243e42d9eea65f80d4485c0a2011633658 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -1908,8 +1908,23 @@ pub fn allocateAtom(self: *MachO, atom: *TextBlock, match: MatchingSection) !u64 // TODO we should check if we need to expand the section or not like we // do in `allocateTextBlock`. + const n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1); sym.n_value = vaddr; - sym.n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1); + sym.n_sect = n_sect; + + // Update each alias (if any) + for (atom.aliases.items) |index| { + const alias_sym = &self.locals.items[index]; + alias_sym.n_value = vaddr; + alias_sym.n_sect = n_sect; + } + + // Update each symbol contained within the TextBlock + for (atom.contained.items) |sym_at_off| { + const contained_sym = &self.locals.items[sym_at_off.local_sym_index]; + contained_sym.n_value = vaddr + sym_at_off.offset; + contained_sym.n_sect = n_sect; + } if (self.blocks.getPtr(match)) |last| { last.*.next = atom; -- 2.54.0