mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[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:
parent
edaf326d53
commit
68bd594dad
42
test/tools/llvm-objcopy/MachO/virtual-section.test
Normal file
42
test/tools/llvm-objcopy/MachO/virtual-section.test
Normal 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
|
||||
...
|
@ -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 +
|
||||
|
Loading…
Reference in New Issue
Block a user