bool generateUniversalBinary(SmallVectorImpl<ArchAndFilename> &ArchFiles, StringRef OutputFileName, const LinkOptions &Options) { // No need to merge one file into a universal fat binary. First, try // to move it (rename) to the final location. If that fails because // of cross-device link issues then copy and delete. if (ArchFiles.size() == 1) { StringRef From(ArchFiles.front().Path); if (sys::fs::rename(From, OutputFileName)) { if (std::error_code EC = sys::fs::copy_file(From, OutputFileName)) { errs() << "error: while copying " << From << " to " << OutputFileName << ": " << EC.message() << "\n"; return false; } sys::fs::remove(From); } return true; } SmallVector<const char *, 8> Args; Args.push_back("lipo"); Args.push_back("-create"); for (auto &Thin : ArchFiles) Args.push_back(Thin.Path.c_str()); // Align segments to match dsymutil-classic alignment for (auto &Thin : ArchFiles) { Thin.Arch = getArchName(Thin.Arch); Args.push_back("-segalign"); Args.push_back(Thin.Arch.c_str()); Args.push_back("20"); } Args.push_back("-output"); Args.push_back(OutputFileName.data()); Args.push_back(nullptr); if (Options.Verbose) { outs() << "Running lipo\n"; for (auto Arg : Args) outs() << ' ' << ((Arg == nullptr) ? "\n" : Arg); } return Options.NoOutput ? true : runLipo(Args); }
void MachODebugMapParser::dumpOneBinaryStab(const MachOObjectFile &MainBinary, StringRef BinaryPath) { loadMainBinarySymbols(MainBinary); MainBinaryStrings = MainBinary.getStringTableData(); raw_ostream &OS(llvm::outs()); dumpSymTabHeader(OS, getArchName(MainBinary)); uint64_t Idx = 0; for (const SymbolRef &Symbol : MainBinary.symbols()) { const DataRefImpl &DRI = Symbol.getRawDataRefImpl(); if (MainBinary.is64Bit()) dumpSymTabEntry(OS, Idx, MainBinary.getSymbol64TableEntry(DRI)); else dumpSymTabEntry(OS, Idx, MainBinary.getSymbolTableEntry(DRI)); Idx++; } OS << "\n\n"; resetParserState(); }