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 --- /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 --- a/llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp +++ b/llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp @@ -121,6 +121,12 @@ // Otherwise, use the last section / reloction. for (const LoadCommand &LC : O.LoadCommands) for (const std::unique_ptr
&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 +