diff --git a/llvm/tools/dsymutil/MachOUtils.cpp b/llvm/tools/dsymutil/MachOUtils.cpp --- a/llvm/tools/dsymutil/MachOUtils.cpp +++ b/llvm/tools/dsymutil/MachOUtils.cpp @@ -304,7 +304,7 @@ } // Write the __DWARF segment load command to the output file. -static void createDwarfSegment(uint64_t VMAddr, uint64_t FileOffset, +static bool createDwarfSegment(uint64_t VMAddr, uint64_t FileOffset, uint64_t FileSize, unsigned NumSections, MCAsmLayout &Layout, MachObjectWriter &Writer) { Writer.writeSegmentLoadCommand("__DWARF", NumSections, VMAddr, @@ -321,12 +321,15 @@ if (Align > 1) { VMAddr = alignTo(VMAddr, Align); FileOffset = alignTo(FileOffset, Align); + if (FileOffset > UINT32_MAX) + return error("section " + Sec->getName() + "'s file offset exceeds 4GB and will produce an invalid mach-o file"); } Writer.writeSection(Layout, *Sec, VMAddr, FileOffset, 0, 0, 0); FileOffset += Layout.getSectionAddressSize(Sec); VMAddr += Layout.getSectionAddressSize(Sec); } + return true; } static bool isExecutable(const object::MachOObjectFile &Obj) { @@ -564,8 +567,9 @@ } // Write the load command for the __DWARF segment. - createDwarfSegment(DwarfVMAddr, DwarfSegmentStart, DwarfSegmentSize, - NumDwarfSections, Layout, Writer); + if (!createDwarfSegment(DwarfVMAddr, DwarfSegmentStart, DwarfSegmentSize, + NumDwarfSections, Layout, Writer)) + return false; assert(OutFile.tell() == LoadCommandSize + HeaderSize); OutFile.write_zeros(SymtabStart - (LoadCommandSize + HeaderSize)); diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp --- a/llvm/tools/dsymutil/dsymutil.cpp +++ b/llvm/tools/dsymutil/dsymutil.cpp @@ -735,19 +735,6 @@ Options.LinkOpts, SDKPath)) return EXIT_FAILURE; } - - // The Mach-O object file format is limited to 4GB. Make sure that we print - // an error when we emit an invalid Mach-O companion file. Leave the - // invalid object file around on disk for inspection. - ErrorOr stat = - Options.LinkOpts.VFS->status(OutputLocationOrErr->DWARFFile); - if (stat) { - if (stat->getSize() > std::numeric_limits::max()) { - WithColor::error() << "the linked debug info exceeds the 4GB Mach-O " - "object file format."; - return EXIT_FAILURE; - } - } } return EXIT_SUCCESS;