[llvm] 12e5b02 - [llvm-objcopy] Reorder --dump-section for MachO

Shoaib Meenai via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 5 10:49:42 PDT 2020


Author: Sameer Arora
Date: 2020-06-05T10:49:22-07:00
New Revision: 12e5b02687af0ddc21abfdd17afbc2176fdaa3f9

URL: https://github.com/llvm/llvm-project/commit/12e5b02687af0ddc21abfdd17afbc2176fdaa3f9
DIFF: https://github.com/llvm/llvm-project/commit/12e5b02687af0ddc21abfdd17afbc2176fdaa3f9.diff

LOG: [llvm-objcopy] Reorder --dump-section for MachO

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

Added: 
    llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test

Modified: 
    llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp

Removed: 
    


################################################################################
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
index 000000000000..2c6b90d6fa05
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test
@@ -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

diff  --git a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
index ae8889af8c42..d6889c1ac6e0 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
+++ b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
@@ -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;


        


More information about the llvm-commits mailing list