[llvm-objcopy] Reorder --dump-section for MachO
authorSameer Arora <sameerarora101@fb.com>
Fri, 5 Jun 2020 17:47:05 +0000 (10:47 -0700)
committerShoaib Meenai <smeenai@fb.com>
Fri, 5 Jun 2020 17:49:22 +0000 (10:49 -0700)
Reorder `DumpSection` under `handleArgs` in file `MachOObjcopy.cpp`. The
operation to dump a section is now performed before both add and remove
section operations for MachO file format.

Change for the ELF format at D81097. Together fixes
https://bugs.llvm.org/show_bug.cgi?id=44283

Reviewed By: jhenderson

Differential Revision: https://reviews.llvm.org/D81123

llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test [new file with mode: 0644]
llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp

diff --git a/llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test b/llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test
new file mode 100644 (file)
index 0000000..2c6b90d
--- /dev/null
@@ -0,0 +1,62 @@
+# RUN: yaml2obj %s -o %t
+
+## Verify that section is dumped before it is removed.
+# RUN: llvm-objcopy --dump-section __TEXT,__text=%t1.dump --remove-section __TEXT,__text %t %t1
+# RUN: FileCheck %s --input-file=%t1.dump --check-prefix=CONTENTS --implicit-check-not={{.}}
+
+# CONTENTS: abcd
+
+## Verify that the newly added section is not dumped.
+# RUN: echo CAFE > %t2.txt
+# RUN: not llvm-objcopy --dump-section __TEXT,__const=%t2.dump --add-section __TEXT,__const=%t2.txt %t %t2 2>&1 | \
+# RUN:     FileCheck %s --check-prefix=NODUMP -DINPUT=%t
+
+# NODUMP: error: '[[INPUT]]': section '__TEXT,__const' not found
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACF
+  cputype:    0x01000007
+  cpusubtype: 0x00000003
+  filetype:   0x00000001
+  ncmds:      1
+  sizeofcmds: 312
+  flags:      0x00002000
+  reserved:   0x00000000
+LoadCommands:
+  - cmd:      LC_SEGMENT_64
+    cmdsize:  312
+    segname:  ''
+    vmaddr:   0
+    vmsize:   12
+    fileoff:  344
+    filesize: 12
+    maxprot:  7
+    initprot: 7
+    nsects:   3
+    flags:    0
+    Sections:
+      - sectname:   __text
+        segname:    __TEXT
+        addr:       0x0000000000000000
+        content:    '61626364'
+        size:       4
+        offset:     344
+        align:      0
+        reloff:     0x00000000
+        nreloc:     0
+        flags:      0x80000400
+        reserved1:  0x00000000
+        reserved2:  0x00000000
+      - sectname:   __data
+        segname:    __DATA
+        addr:       0x0000000000000004
+        content:    'EEFFEEFF'
+        size:       4
+        offset:     348
+        align:      0
+        reloff:     0x00000000
+        nreloc:     0
+        flags:      0x00000000
+        reserved1:  0x00000000
+        reserved2:  0x00000000
index ae8889a..d6889c1 100644 (file)
@@ -187,6 +187,15 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
                              "option not supported by llvm-objcopy for MachO");
   }
 
+  // Dump sections before add/remove for compatibility with GNU objcopy.
+  for (StringRef Flag : Config.DumpSection) {
+    StringRef SectionName;
+    StringRef FileName;
+    std::tie(SectionName, FileName) = Flag.split('=');
+    if (Error E = dumpSectionToFile(SectionName, FileName, Obj))
+      return E;
+  }
+
   if (Error E = removeSections(Config, Obj))
     return E;
 
@@ -201,14 +210,6 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
       for (std::unique_ptr<Section> &Sec : LC.Sections)
         Sec->Relocations.clear();
 
-  for (const StringRef &Flag : Config.DumpSection) {
-    std::pair<StringRef, StringRef> SecPair = Flag.split("=");
-    StringRef SecName = SecPair.first;
-    StringRef File = SecPair.second;
-    if (Error E = dumpSectionToFile(SecName, File, Obj))
-      return E;
-  }
-
   for (const auto &Flag : Config.AddSection) {
     std::pair<StringRef, StringRef> SecPair = Flag.split("=");
     StringRef SecName = SecPair.first;