Skip to content

Commit

Permalink
[dsymutil] Fix offset calculation for universal binaries
Browse files Browse the repository at this point in the history
The Mach-O file format uses 32-bit values to encodes offsets which they
cannot exceed UIN32_MAX (4GB). The Mach-O file itself can be larger than
4GB as long as none of the offsets fall within this limit.

For universal binaries, dsymutil determines if the offset is going to
exceed the 4GB limit by computing the size of the header and adding it
to the size of all the slices. This is incorrect because it computes the
end offset of the final slice. For the purpose of the 4GB limit, only
the starting offset matters. The size of the last slice is irrelevant as
long as it itself is a valid Mach-O.

rdar://104435018

Differential revision: https://reviews.llvm.org/D145637
  • Loading branch information
JDevlieghere committed Mar 9, 2023
1 parent 78ea3cb commit 244a6ac
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions llvm/tools/dsymutil/dsymutil.cpp
Expand Up @@ -35,6 +35,7 @@
#include "llvm/Support/CrashRecoveryContext.h"
#include "llvm/Support/FileCollector.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/LLVMDriver.h"
#include "llvm/Support/Path.h"
Expand Down Expand Up @@ -801,12 +802,14 @@ int main(int argc, char **argv) {
ErrorOr<vfs::Status> stat = Options.LinkOpts.VFS->status(File.path());
if (!stat)
break;
FileOffset += stat->getSize();
if (FileOffset > UINT32_MAX) {
WithColor::error() << "the universal binary has a slice with an "
"offset exceeds 4GB and will produce an invalid Mach-O file.";
WithColor::error() << formatv(
"the universal binary has a slice with a starting offset ({0:x}) "
"that exceeds 4GB and will produce an invalid Mach-O file.",
FileOffset);
return EXIT_FAILURE;
}
FileOffset += stat->getSize();
}
if (!MachOUtils::generateUniversalBinary(TempFiles,
OutputLocationOrErr->DWARFFile,
Expand Down

0 comments on commit 244a6ac

Please sign in to comment.