[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
This commit is contained in:
Alexander Shaposhnikov 2020-10-22 13:25:13 -07:00
parent 3580a45014
commit 861429160c
2 changed files with 48 additions and 0 deletions

View File

@ -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
...

View File

@ -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 +