78 lines · c
1//===- MachOWriter.h --------------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H10#define LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H11 12#include "MachOLayoutBuilder.h"13#include "MachOObject.h"14#include "llvm/BinaryFormat/MachO.h"15#include "llvm/ObjCopy/MachO/MachOObjcopy.h"16#include "llvm/Object/MachO.h"17 18namespace llvm {19class Error;20 21namespace objcopy {22namespace macho {23 24class MachOWriter {25 Object &O;26 bool Is64Bit;27 bool IsLittleEndian;28 uint64_t PageSize;29 std::unique_ptr<WritableMemoryBuffer> Buf;30 raw_ostream &Out;31 MachOLayoutBuilder LayoutBuilder;32 33 size_t headerSize() const;34 size_t loadCommandsSize() const;35 size_t symTableSize() const;36 size_t strTableSize() const;37 38 void writeHeader();39 void writeLoadCommands();40 template <typename StructType>41 void writeSectionInLoadCommand(const Section &Sec, uint8_t *&Out);42 void writeSections();43 void writeSymbolTable();44 void writeStringTable();45 void writeRebaseInfo();46 void writeBindInfo();47 void writeWeakBindInfo();48 void writeLazyBindInfo();49 void writeExportInfo();50 void writeIndirectSymbolTable();51 void writeLinkData(std::optional<size_t> LCIndex, const LinkData &LD);52 void writeCodeSignatureData();53 void writeDataInCodeData();54 void writeLinkerOptimizationHint();55 void writeFunctionStartsData();56 void writeDylibCodeSignDRsData();57 void writeChainedFixupsData();58 void writeExportsTrieData();59 void writeTail();60 61public:62 MachOWriter(Object &O, bool Is64Bit, bool IsLittleEndian,63 StringRef OutputFileName, uint64_t PageSize, raw_ostream &Out)64 : O(O), Is64Bit(Is64Bit), IsLittleEndian(IsLittleEndian),65 PageSize(PageSize), Out(Out),66 LayoutBuilder(O, Is64Bit, OutputFileName, PageSize) {}67 68 size_t totalSize() const;69 Error finalize();70 Error write();71};72 73} // end namespace macho74} // end namespace objcopy75} // end namespace llvm76 77#endif // LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H78