[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