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

Alexander Shaposhnikov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 18 17:11:54 PDT 2020


alexshap created this revision.
alexshap added reviewers: MaskRay, smeenai, jhenderson.
alexshap created this object with visibility "All Users".
Herald added a reviewer: rupprecht.
Herald added a subscriber: abrachet.
Herald added a project: LLVM.
alexshap requested review of this revision.

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

Test plan: make check-all


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D89661

Files:
  llvm/test/tools/llvm-objcopy/MachO/virtual-section.test
  llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp


Index: llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
===================================================================
--- llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
+++ llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
@@ -121,6 +121,11 @@
   // 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) && "Virtual section's offset must be zero");
+        continue;
+      }
+      assert((S->Offset != 0) && "Non-virtual section's cannot be zero");
       Ends.push_back(S->Offset + S->Size);
       if (S->RelOff)
         Ends.push_back(S->RelOff +
Index: llvm/test/tools/llvm-objcopy/MachO/virtual-section.test
===================================================================
--- /dev/null
+++ 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
+...


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89661.298910.patch
Type: text/x-patch
Size: 2093 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201019/76d14fbb/attachment.bin>


More information about the llvm-commits mailing list