[llvm] f79b81f - [llvm-objcopy] Enable --discard-all for MachO
Alexander Shaposhnikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 26 12:51:45 PST 2020
Author: Alexander Shaposhnikov
Date: 2020-02-26T12:51:15-08:00
New Revision: f79b81fbe2870ff631ad72a75f7e077b15b52a22
URL: https://github.com/llvm/llvm-project/commit/f79b81fbe2870ff631ad72a75f7e077b15b52a22
DIFF: https://github.com/llvm/llvm-project/commit/f79b81fbe2870ff631ad72a75f7e077b15b52a22.diff
LOG: [llvm-objcopy] Enable --discard-all for MachO
In this diff we enable the option --discard-all for MachO.
Test plan: make check-all
Differential revision: https://reviews.llvm.org/D75104
Added:
llvm/test/tools/llvm-objcopy/MachO/discard-all.test
Modified:
llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
Removed:
################################################################################
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
index 000000000000..3fb49b62c04e
--- /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
index 24b1a9edfd2f..8f159ca11632 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
+++ b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
@@ -66,7 +66,11 @@ static void updateAndRemoveSymbols(const CopyConfig &Config, Object &Obj) {
auto RemovePred = [Config](const std::unique_ptr<SymbolEntry> &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,8 +176,8 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
Config.StripNonAlloc || Config.StripSections || Config.Weaken ||
Config.DecompressDebugSections || Config.StripNonAlloc ||
Config.StripSections || Config.StripUnneeded ||
- Config.DiscardMode != DiscardType::None || !Config.SymbolsToAdd.empty() ||
- Config.EntryExpr) {
+ Config.DiscardMode == DiscardType::Locals ||
+ !Config.SymbolsToAdd.empty() || Config.EntryExpr) {
return createStringError(llvm::errc::invalid_argument,
"option not supported by llvm-objcopy for MachO");
}
More information about the llvm-commits
mailing list