From ef9aea75d0b1a0727cbf52be9344cd4c04954f9a Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 12 Jan 2024 11:40:07 +0100 Subject: [PATCH] macho: fix dead stripping logic to exclude debug sections --- src/link/MachO/Atom.zig | 1 + src/link/MachO/dead_strip.zig | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig index 7cd44b162e..98f417dd51 100644 --- a/src/link/MachO/Atom.zig +++ b/src/link/MachO/Atom.zig @@ -173,6 +173,7 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { pub fn scanRelocs(self: Atom, macho_file: *MachO) !void { const tracy = trace(@src()); defer tracy.end(); + assert(self.flags.alive); const object = self.getFile(macho_file).object; const relocs = self.getRelocs(macho_file); diff --git a/src/link/MachO/dead_strip.zig b/src/link/MachO/dead_strip.zig index 7356e65a60..e91682ca58 100644 --- a/src/link/MachO/dead_strip.zig +++ b/src/link/MachO/dead_strip.zig @@ -91,7 +91,12 @@ fn mark(roots: []*Atom, objects: []const File.Index, macho_file: *MachO) void { for (macho_file.getFile(index).?.getAtoms()) |atom_index| { const atom = macho_file.getAtom(atom_index).?; const isec = atom.getInputSection(macho_file); - if (isec.isDontDeadStripIfReferencesLive() and !atom.flags.alive and refersLive(atom, macho_file)) { + if (isec.isDontDeadStripIfReferencesLive() and + !(mem.eql(u8, isec.sectName(), "__eh_frame") or + mem.eql(u8, isec.sectName(), "__compact_unwind") or + isec.attrs() & macho.S_ATTR_DEBUG != 0) and + !atom.flags.alive and refersLive(atom, macho_file)) + { markLive(atom, macho_file); loop = true; }