diff --git a/llvm/test/tools/llvm-objcopy/MachO/discard-all.test b/llvm/test/tools/llvm-objcopy/MachO/discard-all.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/discard-all.test @@ -0,0 +1,132 @@ +# RUN: yaml2obj %s -o %t +# RUN: cp %t %t1 +# RUN: llvm-objcopy --discard-all %t %t2 +## Verify that llvm-objcopy has not modified the input. +# RUN: cmp %t %t1 +# RUN: llvm-readobj --symbols %t2 | FileCheck %s + +# RUN: llvm-objcopy -x %t %t3 +## Verify that llvm-objcopy has not modified the input. +# RUN: cmp %t %t1 +# RUN: cmp %t2 %t3 + +## Verify that llvm-strip modifies the symbol table the same way. +# RUN: cp %t %t4 +# RUN: llvm-strip --discard-all %t4 +# RUN: cmp %t2 %t4 +# RUN: llvm-strip -x %t +# RUN: cmp %t2 %t + +# CHECK: Symbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _b (1) +# CHECK-NEXT: Extern +# CHECK-NEXT: Type: Undef (0x0) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x220) +# CHECK-NEXT: AltEntry (0x200) +# CHECK-NEXT: NoDeadStrip (0x20) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x4 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x00000001 + ncmds: 4 + sizeofcmds: 360 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 232 + segname: '' + vmaddr: 0 + vmsize: 4 + fileoff: 392 + filesize: 0 + maxprot: 7 + initprot: 7 + nsects: 2 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000000000000 + size: 0 + offset: 0x00000188 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + content: '' + - sectname: __bss + segname: __DATA + addr: 0x0000000000000000 + size: 4 + offset: 0x00000000 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000001 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - cmd: LC_BUILD_VERSION + cmdsize: 24 + platform: 1 + minos: 658944 + sdk: 658944 + ntools: 0 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 392 + nsyms: 2 + stroff: 424 + strsize: 8 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 1 + iextdefsym: 1 + nextdefsym: 0 + iundefsym: 1 + nundefsym: 1 + tocoff: 0 + ntoc: 0 + modtaboff: 0 + nmodtab: 0 + extrefsymoff: 0 + nextrefsyms: 0 + indirectsymoff: 0 + nindirectsyms: 0 + extreloff: 0 + nextrel: 0 + locreloff: 0 + nlocrel: 0 +LinkEditData: + NameList: + - n_strx: 4 + n_type: 0x0E + n_sect: 2 + n_desc: 32 + n_value: 0 + - n_strx: 1 + n_type: 0x01 + n_sect: 0 + n_desc: 544 + n_value: 4 + StringTable: + - '' + - _b + - _a + - '' +... diff --git a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp --- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp @@ -66,7 +66,11 @@ auto RemovePred = [Config](const std::unique_ptr &N) { if (N->Referenced) return false; - return Config.StripAll; + if (Config.StripAll) + return true; + if (Config.DiscardMode == DiscardType::All && !(N->n_type & MachO::N_EXT)) + return true; + return false; }; Obj.SymTable.removeSymbols(RemovePred); @@ -172,7 +176,7 @@ Config.StripNonAlloc || Config.StripSections || Config.Weaken || Config.DecompressDebugSections || Config.StripNonAlloc || Config.StripSections || Config.StripUnneeded || - Config.DiscardMode != DiscardType::None || !Config.SymbolsToAdd.empty() || + Config.DiscardMode == DiscardType::Locals || Config.SymbolsToAdd.empty() || Config.EntryExpr) { return createStringError(llvm::errc::invalid_argument, "option not supported by llvm-objcopy for MachO");