[llvm] 8614291 - [llvm-objcopy][MachO] Fix the calculation of the output size

Alexander Shaposhnikov via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 22 13:58:25 PDT 2020


Author: Alexander Shaposhnikov
Date: 2020-10-22T13:58:11-07:00
New Revision: 861429160ca74b1530ffa961b60b2b4fdb75eec2

URL: https://github.com/llvm/llvm-project/commit/861429160ca74b1530ffa961b60b2b4fdb75eec2
DIFF: https://github.com/llvm/llvm-project/commit/861429160ca74b1530ffa961b60b2b4fdb75eec2.diff

LOG: [llvm-objcopy][MachO] Fix the calculation of the output size

Virtual sections do not contribute to the final output size.
This diff fixes the corresponding calculations in the method MachOWriter::totalSize.

Test plan: make check-all

Differential revision: https://reviews.llvm.org/D89661

Added: 
    llvm/test/tools/llvm-objcopy/MachO/virtual-section.test

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

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-objcopy/MachO/virtual-section.test b/llvm/test/tools/llvm-objcopy/MachO/virtual-section.test
new file mode 100644
index 000000000000..6e53702791b4
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/MachO/virtual-section.test
@@ -0,0 +1,42 @@
+## This test verifies that a virtual section does not contribute to the final
+## output size.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy %t %t.copy
+# RUN: cmp %t %t.copy
+
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACE
+  cputype:         0x00000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000001
+  ncmds:           1
+  sizeofcmds:      124
+  flags:           0x00002000
+LoadCommands:
+  - cmd:             LC_SEGMENT
+    cmdsize:         124
+    segname:         __DATA
+    vmaddr:          4096
+    vmsize:          4096
+    fileoff:         152
+    filesize:        0
+    maxprot:         7
+    initprot:        7
+    nsects:          1
+    flags:           0
+    Sections:
+      - sectname:        __bss
+        segname:         __DATA
+        addr:            0x0000000000001000
+        size:            4096
+        offset:          0x00000000
+        align:           2
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000001
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+...

diff  --git a/llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp b/llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
index 3c41e73b2b01..78e03c818fd0 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
+++ b/llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
@@ -121,6 +121,12 @@ size_t MachOWriter::totalSize() const {
   // Otherwise, use the last section / reloction.
   for (const LoadCommand &LC : O.LoadCommands)
     for (const std::unique_ptr<Section> &S : LC.Sections) {
+      if (S->isVirtualSection()) {
+        assert((S->Offset == 0) && "Zero-fill section's offset must be zero");
+        continue;
+      }
+      assert((S->Offset != 0) &&
+             "Non-zero-fill section's offset cannot be zero");
       Ends.push_back(S->Offset + S->Size);
       if (S->RelOff)
         Ends.push_back(S->RelOff +


        


More information about the llvm-commits mailing list