15ffd83dbSDimitry Andric //===- Writer.cpp ---------------------------------------------------------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #include "Writer.h" 10fe6060f1SDimitry Andric #include "ConcatOutputSection.h" 115ffd83dbSDimitry Andric #include "Config.h" 125ffd83dbSDimitry Andric #include "InputFiles.h" 135ffd83dbSDimitry Andric #include "InputSection.h" 14fe6060f1SDimitry Andric #include "MapFile.h" 155ffd83dbSDimitry Andric #include "OutputSection.h" 165ffd83dbSDimitry Andric #include "OutputSegment.h" 1704eeddc0SDimitry Andric #include "SectionPriorities.h" 185ffd83dbSDimitry Andric #include "SymbolTable.h" 195ffd83dbSDimitry Andric #include "Symbols.h" 205ffd83dbSDimitry Andric #include "SyntheticSections.h" 215ffd83dbSDimitry Andric #include "Target.h" 22e8d8bef9SDimitry Andric #include "UnwindInfoSection.h" 235ffd83dbSDimitry Andric 24fe6060f1SDimitry Andric #include "lld/Common/Arrays.h" 2504eeddc0SDimitry Andric #include "lld/Common/CommonLinkerContext.h" 265ffd83dbSDimitry Andric #include "llvm/BinaryFormat/MachO.h" 27e8d8bef9SDimitry Andric #include "llvm/Config/llvm-config.h" 285ffd83dbSDimitry Andric #include "llvm/Support/LEB128.h" 29fe6060f1SDimitry Andric #include "llvm/Support/Parallel.h" 305ffd83dbSDimitry Andric #include "llvm/Support/Path.h" 31fe6060f1SDimitry Andric #include "llvm/Support/TimeProfiler.h" 32*0fca6ea1SDimitry Andric #include "llvm/Support/thread.h" 33e8d8bef9SDimitry Andric #include "llvm/Support/xxhash.h" 34e8d8bef9SDimitry Andric 35e8d8bef9SDimitry Andric #include <algorithm> 365ffd83dbSDimitry Andric 375ffd83dbSDimitry Andric using namespace llvm; 385ffd83dbSDimitry Andric using namespace llvm::MachO; 39e8d8bef9SDimitry Andric using namespace llvm::sys; 405ffd83dbSDimitry Andric using namespace lld; 415ffd83dbSDimitry Andric using namespace lld::macho; 425ffd83dbSDimitry Andric 435ffd83dbSDimitry Andric namespace { 44e8d8bef9SDimitry Andric class LCUuid; 455ffd83dbSDimitry Andric 465ffd83dbSDimitry Andric class Writer { 475ffd83dbSDimitry Andric public: 485ffd83dbSDimitry Andric Writer() : buffer(errorHandler().outputBuffer) {} 495ffd83dbSDimitry Andric 50fe6060f1SDimitry Andric void treatSpecialUndefineds(); 515ffd83dbSDimitry Andric void scanRelocations(); 52e8d8bef9SDimitry Andric void scanSymbols(); 53fe6060f1SDimitry Andric template <class LP> void createOutputSections(); 54fe6060f1SDimitry Andric template <class LP> void createLoadCommands(); 55fe6060f1SDimitry Andric void finalizeAddresses(); 56fe6060f1SDimitry Andric void finalizeLinkEditSegment(); 575ffd83dbSDimitry Andric void assignAddresses(OutputSegment *); 585ffd83dbSDimitry Andric 595ffd83dbSDimitry Andric void openFile(); 605ffd83dbSDimitry Andric void writeSections(); 61bdd1243dSDimitry Andric void applyOptimizationHints(); 62bdd1243dSDimitry Andric void buildFixupChains(); 63e8d8bef9SDimitry Andric void writeUuid(); 64fe6060f1SDimitry Andric void writeCodeSignature(); 65fe6060f1SDimitry Andric void writeOutputFile(); 665ffd83dbSDimitry Andric 67fe6060f1SDimitry Andric template <class LP> void run(); 685ffd83dbSDimitry Andric 695ffd83dbSDimitry Andric std::unique_ptr<FileOutputBuffer> &buffer; 705ffd83dbSDimitry Andric uint64_t addr = 0; 715ffd83dbSDimitry Andric uint64_t fileOff = 0; 72e8d8bef9SDimitry Andric MachHeaderSection *header = nullptr; 735ffd83dbSDimitry Andric StringTableSection *stringTableSection = nullptr; 745ffd83dbSDimitry Andric SymtabSection *symtabSection = nullptr; 75e8d8bef9SDimitry Andric IndirectSymtabSection *indirectSymtabSection = nullptr; 76fe6060f1SDimitry Andric CodeSignatureSection *codeSignatureSection = nullptr; 77fe6060f1SDimitry Andric DataInCodeSection *dataInCodeSection = nullptr; 78fe6060f1SDimitry Andric FunctionStartsSection *functionStartsSection = nullptr; 79fe6060f1SDimitry Andric 80e8d8bef9SDimitry Andric LCUuid *uuidCommand = nullptr; 81fe6060f1SDimitry Andric OutputSegment *linkEditSegment = nullptr; 825ffd83dbSDimitry Andric }; 835ffd83dbSDimitry Andric 845ffd83dbSDimitry Andric // LC_DYLD_INFO_ONLY stores the offsets of symbol import/export information. 85fe6060f1SDimitry Andric class LCDyldInfo final : public LoadCommand { 865ffd83dbSDimitry Andric public: 87e8d8bef9SDimitry Andric LCDyldInfo(RebaseSection *rebaseSection, BindingSection *bindingSection, 88e8d8bef9SDimitry Andric WeakBindingSection *weakBindingSection, 895ffd83dbSDimitry Andric LazyBindingSection *lazyBindingSection, 905ffd83dbSDimitry Andric ExportSection *exportSection) 91e8d8bef9SDimitry Andric : rebaseSection(rebaseSection), bindingSection(bindingSection), 92e8d8bef9SDimitry Andric weakBindingSection(weakBindingSection), 93e8d8bef9SDimitry Andric lazyBindingSection(lazyBindingSection), exportSection(exportSection) {} 945ffd83dbSDimitry Andric 955ffd83dbSDimitry Andric uint32_t getSize() const override { return sizeof(dyld_info_command); } 965ffd83dbSDimitry Andric 975ffd83dbSDimitry Andric void writeTo(uint8_t *buf) const override { 985ffd83dbSDimitry Andric auto *c = reinterpret_cast<dyld_info_command *>(buf); 995ffd83dbSDimitry Andric c->cmd = LC_DYLD_INFO_ONLY; 1005ffd83dbSDimitry Andric c->cmdsize = getSize(); 101e8d8bef9SDimitry Andric if (rebaseSection->isNeeded()) { 102e8d8bef9SDimitry Andric c->rebase_off = rebaseSection->fileOff; 103e8d8bef9SDimitry Andric c->rebase_size = rebaseSection->getFileSize(); 104e8d8bef9SDimitry Andric } 1055ffd83dbSDimitry Andric if (bindingSection->isNeeded()) { 1065ffd83dbSDimitry Andric c->bind_off = bindingSection->fileOff; 1075ffd83dbSDimitry Andric c->bind_size = bindingSection->getFileSize(); 1085ffd83dbSDimitry Andric } 109e8d8bef9SDimitry Andric if (weakBindingSection->isNeeded()) { 110e8d8bef9SDimitry Andric c->weak_bind_off = weakBindingSection->fileOff; 111e8d8bef9SDimitry Andric c->weak_bind_size = weakBindingSection->getFileSize(); 112e8d8bef9SDimitry Andric } 1135ffd83dbSDimitry Andric if (lazyBindingSection->isNeeded()) { 1145ffd83dbSDimitry Andric c->lazy_bind_off = lazyBindingSection->fileOff; 1155ffd83dbSDimitry Andric c->lazy_bind_size = lazyBindingSection->getFileSize(); 1165ffd83dbSDimitry Andric } 1175ffd83dbSDimitry Andric if (exportSection->isNeeded()) { 1185ffd83dbSDimitry Andric c->export_off = exportSection->fileOff; 1195ffd83dbSDimitry Andric c->export_size = exportSection->getFileSize(); 1205ffd83dbSDimitry Andric } 1215ffd83dbSDimitry Andric } 1225ffd83dbSDimitry Andric 123e8d8bef9SDimitry Andric RebaseSection *rebaseSection; 1245ffd83dbSDimitry Andric BindingSection *bindingSection; 125e8d8bef9SDimitry Andric WeakBindingSection *weakBindingSection; 1265ffd83dbSDimitry Andric LazyBindingSection *lazyBindingSection; 1275ffd83dbSDimitry Andric ExportSection *exportSection; 1285ffd83dbSDimitry Andric }; 1295ffd83dbSDimitry Andric 130fe6060f1SDimitry Andric class LCSubFramework final : public LoadCommand { 131fe6060f1SDimitry Andric public: 132fe6060f1SDimitry Andric LCSubFramework(StringRef umbrella) : umbrella(umbrella) {} 133fe6060f1SDimitry Andric 134fe6060f1SDimitry Andric uint32_t getSize() const override { 135bdd1243dSDimitry Andric return alignToPowerOf2(sizeof(sub_framework_command) + umbrella.size() + 1, 136fe6060f1SDimitry Andric target->wordSize); 137fe6060f1SDimitry Andric } 138fe6060f1SDimitry Andric 139fe6060f1SDimitry Andric void writeTo(uint8_t *buf) const override { 140fe6060f1SDimitry Andric auto *c = reinterpret_cast<sub_framework_command *>(buf); 141fe6060f1SDimitry Andric buf += sizeof(sub_framework_command); 142fe6060f1SDimitry Andric 143fe6060f1SDimitry Andric c->cmd = LC_SUB_FRAMEWORK; 144fe6060f1SDimitry Andric c->cmdsize = getSize(); 145fe6060f1SDimitry Andric c->umbrella = sizeof(sub_framework_command); 146fe6060f1SDimitry Andric 147fe6060f1SDimitry Andric memcpy(buf, umbrella.data(), umbrella.size()); 148fe6060f1SDimitry Andric buf[umbrella.size()] = '\0'; 149fe6060f1SDimitry Andric } 150fe6060f1SDimitry Andric 151fe6060f1SDimitry Andric private: 152fe6060f1SDimitry Andric const StringRef umbrella; 153fe6060f1SDimitry Andric }; 154fe6060f1SDimitry Andric 155fe6060f1SDimitry Andric class LCFunctionStarts final : public LoadCommand { 156fe6060f1SDimitry Andric public: 157fe6060f1SDimitry Andric explicit LCFunctionStarts(FunctionStartsSection *functionStartsSection) 158fe6060f1SDimitry Andric : functionStartsSection(functionStartsSection) {} 159fe6060f1SDimitry Andric 160fe6060f1SDimitry Andric uint32_t getSize() const override { return sizeof(linkedit_data_command); } 161fe6060f1SDimitry Andric 162fe6060f1SDimitry Andric void writeTo(uint8_t *buf) const override { 163fe6060f1SDimitry Andric auto *c = reinterpret_cast<linkedit_data_command *>(buf); 164fe6060f1SDimitry Andric c->cmd = LC_FUNCTION_STARTS; 165fe6060f1SDimitry Andric c->cmdsize = getSize(); 166fe6060f1SDimitry Andric c->dataoff = functionStartsSection->fileOff; 167fe6060f1SDimitry Andric c->datasize = functionStartsSection->getFileSize(); 168fe6060f1SDimitry Andric } 169fe6060f1SDimitry Andric 170fe6060f1SDimitry Andric private: 171fe6060f1SDimitry Andric FunctionStartsSection *functionStartsSection; 172fe6060f1SDimitry Andric }; 173fe6060f1SDimitry Andric 174fe6060f1SDimitry Andric class LCDataInCode final : public LoadCommand { 175fe6060f1SDimitry Andric public: 176fe6060f1SDimitry Andric explicit LCDataInCode(DataInCodeSection *dataInCodeSection) 177fe6060f1SDimitry Andric : dataInCodeSection(dataInCodeSection) {} 178fe6060f1SDimitry Andric 179fe6060f1SDimitry Andric uint32_t getSize() const override { return sizeof(linkedit_data_command); } 180fe6060f1SDimitry Andric 181fe6060f1SDimitry Andric void writeTo(uint8_t *buf) const override { 182fe6060f1SDimitry Andric auto *c = reinterpret_cast<linkedit_data_command *>(buf); 183fe6060f1SDimitry Andric c->cmd = LC_DATA_IN_CODE; 184fe6060f1SDimitry Andric c->cmdsize = getSize(); 185fe6060f1SDimitry Andric c->dataoff = dataInCodeSection->fileOff; 186fe6060f1SDimitry Andric c->datasize = dataInCodeSection->getFileSize(); 187fe6060f1SDimitry Andric } 188fe6060f1SDimitry Andric 189fe6060f1SDimitry Andric private: 190fe6060f1SDimitry Andric DataInCodeSection *dataInCodeSection; 191fe6060f1SDimitry Andric }; 192fe6060f1SDimitry Andric 193fe6060f1SDimitry Andric class LCDysymtab final : public LoadCommand { 1945ffd83dbSDimitry Andric public: 195e8d8bef9SDimitry Andric LCDysymtab(SymtabSection *symtabSection, 196e8d8bef9SDimitry Andric IndirectSymtabSection *indirectSymtabSection) 197e8d8bef9SDimitry Andric : symtabSection(symtabSection), 198e8d8bef9SDimitry Andric indirectSymtabSection(indirectSymtabSection) {} 199e8d8bef9SDimitry Andric 2005ffd83dbSDimitry Andric uint32_t getSize() const override { return sizeof(dysymtab_command); } 2015ffd83dbSDimitry Andric 2025ffd83dbSDimitry Andric void writeTo(uint8_t *buf) const override { 2035ffd83dbSDimitry Andric auto *c = reinterpret_cast<dysymtab_command *>(buf); 2045ffd83dbSDimitry Andric c->cmd = LC_DYSYMTAB; 2055ffd83dbSDimitry Andric c->cmdsize = getSize(); 206e8d8bef9SDimitry Andric 207e8d8bef9SDimitry Andric c->ilocalsym = 0; 208e8d8bef9SDimitry Andric c->iextdefsym = c->nlocalsym = symtabSection->getNumLocalSymbols(); 209e8d8bef9SDimitry Andric c->nextdefsym = symtabSection->getNumExternalSymbols(); 210e8d8bef9SDimitry Andric c->iundefsym = c->iextdefsym + c->nextdefsym; 211e8d8bef9SDimitry Andric c->nundefsym = symtabSection->getNumUndefinedSymbols(); 212e8d8bef9SDimitry Andric 213e8d8bef9SDimitry Andric c->indirectsymoff = indirectSymtabSection->fileOff; 214e8d8bef9SDimitry Andric c->nindirectsyms = indirectSymtabSection->getNumSymbols(); 2155ffd83dbSDimitry Andric } 216e8d8bef9SDimitry Andric 217e8d8bef9SDimitry Andric SymtabSection *symtabSection; 218e8d8bef9SDimitry Andric IndirectSymtabSection *indirectSymtabSection; 2195ffd83dbSDimitry Andric }; 2205ffd83dbSDimitry Andric 221fe6060f1SDimitry Andric template <class LP> class LCSegment final : public LoadCommand { 2225ffd83dbSDimitry Andric public: 2235ffd83dbSDimitry Andric LCSegment(StringRef name, OutputSegment *seg) : name(name), seg(seg) {} 2245ffd83dbSDimitry Andric 2255ffd83dbSDimitry Andric uint32_t getSize() const override { 226fe6060f1SDimitry Andric return sizeof(typename LP::segment_command) + 227fe6060f1SDimitry Andric seg->numNonHiddenSections() * sizeof(typename LP::section); 2285ffd83dbSDimitry Andric } 2295ffd83dbSDimitry Andric 2305ffd83dbSDimitry Andric void writeTo(uint8_t *buf) const override { 231fe6060f1SDimitry Andric using SegmentCommand = typename LP::segment_command; 232349cc55cSDimitry Andric using SectionHeader = typename LP::section; 2335ffd83dbSDimitry Andric 234fe6060f1SDimitry Andric auto *c = reinterpret_cast<SegmentCommand *>(buf); 235fe6060f1SDimitry Andric buf += sizeof(SegmentCommand); 236fe6060f1SDimitry Andric 237fe6060f1SDimitry Andric c->cmd = LP::segmentLCType; 2385ffd83dbSDimitry Andric c->cmdsize = getSize(); 2395ffd83dbSDimitry Andric memcpy(c->segname, name.data(), name.size()); 2405ffd83dbSDimitry Andric c->fileoff = seg->fileOff; 2415ffd83dbSDimitry Andric c->maxprot = seg->maxProt; 2425ffd83dbSDimitry Andric c->initprot = seg->initProt; 2435ffd83dbSDimitry Andric 244fe6060f1SDimitry Andric c->vmaddr = seg->addr; 245fe6060f1SDimitry Andric c->vmsize = seg->vmSize; 246fe6060f1SDimitry Andric c->filesize = seg->fileSize; 2475ffd83dbSDimitry Andric c->nsects = seg->numNonHiddenSections(); 248bdd1243dSDimitry Andric c->flags = seg->flags; 2495ffd83dbSDimitry Andric 250fe6060f1SDimitry Andric for (const OutputSection *osec : seg->getSections()) { 2515ffd83dbSDimitry Andric if (osec->isHidden()) 2525ffd83dbSDimitry Andric continue; 2535ffd83dbSDimitry Andric 254349cc55cSDimitry Andric auto *sectHdr = reinterpret_cast<SectionHeader *>(buf); 255349cc55cSDimitry Andric buf += sizeof(SectionHeader); 2565ffd83dbSDimitry Andric 2575ffd83dbSDimitry Andric memcpy(sectHdr->sectname, osec->name.data(), osec->name.size()); 2585ffd83dbSDimitry Andric memcpy(sectHdr->segname, name.data(), name.size()); 2595ffd83dbSDimitry Andric 2605ffd83dbSDimitry Andric sectHdr->addr = osec->addr; 2615ffd83dbSDimitry Andric sectHdr->offset = osec->fileOff; 2625ffd83dbSDimitry Andric sectHdr->align = Log2_32(osec->align); 2635ffd83dbSDimitry Andric sectHdr->flags = osec->flags; 2645ffd83dbSDimitry Andric sectHdr->size = osec->getSize(); 265e8d8bef9SDimitry Andric sectHdr->reserved1 = osec->reserved1; 266e8d8bef9SDimitry Andric sectHdr->reserved2 = osec->reserved2; 2675ffd83dbSDimitry Andric } 2685ffd83dbSDimitry Andric } 2695ffd83dbSDimitry Andric 2705ffd83dbSDimitry Andric private: 2715ffd83dbSDimitry Andric StringRef name; 2725ffd83dbSDimitry Andric OutputSegment *seg; 2735ffd83dbSDimitry Andric }; 2745ffd83dbSDimitry Andric 275fe6060f1SDimitry Andric class LCMain final : public LoadCommand { 276fe6060f1SDimitry Andric uint32_t getSize() const override { 277fe6060f1SDimitry Andric return sizeof(structs::entry_point_command); 278fe6060f1SDimitry Andric } 2795ffd83dbSDimitry Andric 2805ffd83dbSDimitry Andric void writeTo(uint8_t *buf) const override { 281fe6060f1SDimitry Andric auto *c = reinterpret_cast<structs::entry_point_command *>(buf); 2825ffd83dbSDimitry Andric c->cmd = LC_MAIN; 2835ffd83dbSDimitry Andric c->cmdsize = getSize(); 284e8d8bef9SDimitry Andric 285e8d8bef9SDimitry Andric if (config->entry->isInStubs()) 286e8d8bef9SDimitry Andric c->entryoff = 287e8d8bef9SDimitry Andric in.stubs->fileOff + config->entry->stubsIndex * target->stubSize; 288e8d8bef9SDimitry Andric else 289fe6060f1SDimitry Andric c->entryoff = config->entry->getVA() - in.header->addr; 290e8d8bef9SDimitry Andric 2915ffd83dbSDimitry Andric c->stacksize = 0; 2925ffd83dbSDimitry Andric } 2935ffd83dbSDimitry Andric }; 2945ffd83dbSDimitry Andric 295fe6060f1SDimitry Andric class LCSymtab final : public LoadCommand { 2965ffd83dbSDimitry Andric public: 2975ffd83dbSDimitry Andric LCSymtab(SymtabSection *symtabSection, StringTableSection *stringTableSection) 2985ffd83dbSDimitry Andric : symtabSection(symtabSection), stringTableSection(stringTableSection) {} 2995ffd83dbSDimitry Andric 3005ffd83dbSDimitry Andric uint32_t getSize() const override { return sizeof(symtab_command); } 3015ffd83dbSDimitry Andric 3025ffd83dbSDimitry Andric void writeTo(uint8_t *buf) const override { 3035ffd83dbSDimitry Andric auto *c = reinterpret_cast<symtab_command *>(buf); 3045ffd83dbSDimitry Andric c->cmd = LC_SYMTAB; 3055ffd83dbSDimitry Andric c->cmdsize = getSize(); 3065ffd83dbSDimitry Andric c->symoff = symtabSection->fileOff; 3075ffd83dbSDimitry Andric c->nsyms = symtabSection->getNumSymbols(); 3085ffd83dbSDimitry Andric c->stroff = stringTableSection->fileOff; 3095ffd83dbSDimitry Andric c->strsize = stringTableSection->getFileSize(); 3105ffd83dbSDimitry Andric } 3115ffd83dbSDimitry Andric 3125ffd83dbSDimitry Andric SymtabSection *symtabSection = nullptr; 3135ffd83dbSDimitry Andric StringTableSection *stringTableSection = nullptr; 3145ffd83dbSDimitry Andric }; 3155ffd83dbSDimitry Andric 3165ffd83dbSDimitry Andric // There are several dylib load commands that share the same structure: 3175ffd83dbSDimitry Andric // * LC_LOAD_DYLIB 3185ffd83dbSDimitry Andric // * LC_ID_DYLIB 3195ffd83dbSDimitry Andric // * LC_REEXPORT_DYLIB 320fe6060f1SDimitry Andric class LCDylib final : public LoadCommand { 3215ffd83dbSDimitry Andric public: 322e8d8bef9SDimitry Andric LCDylib(LoadCommandType type, StringRef path, 323e8d8bef9SDimitry Andric uint32_t compatibilityVersion = 0, uint32_t currentVersion = 0) 324e8d8bef9SDimitry Andric : type(type), path(path), compatibilityVersion(compatibilityVersion), 325e8d8bef9SDimitry Andric currentVersion(currentVersion) { 326e8d8bef9SDimitry Andric instanceCount++; 327e8d8bef9SDimitry Andric } 3285ffd83dbSDimitry Andric 3295ffd83dbSDimitry Andric uint32_t getSize() const override { 330bdd1243dSDimitry Andric return alignToPowerOf2(sizeof(dylib_command) + path.size() + 1, 331bdd1243dSDimitry Andric target->wordSize); 3325ffd83dbSDimitry Andric } 3335ffd83dbSDimitry Andric 3345ffd83dbSDimitry Andric void writeTo(uint8_t *buf) const override { 3355ffd83dbSDimitry Andric auto *c = reinterpret_cast<dylib_command *>(buf); 3365ffd83dbSDimitry Andric buf += sizeof(dylib_command); 3375ffd83dbSDimitry Andric 3385ffd83dbSDimitry Andric c->cmd = type; 3395ffd83dbSDimitry Andric c->cmdsize = getSize(); 3405ffd83dbSDimitry Andric c->dylib.name = sizeof(dylib_command); 341e8d8bef9SDimitry Andric c->dylib.timestamp = 0; 342e8d8bef9SDimitry Andric c->dylib.compatibility_version = compatibilityVersion; 343e8d8bef9SDimitry Andric c->dylib.current_version = currentVersion; 3445ffd83dbSDimitry Andric 3455ffd83dbSDimitry Andric memcpy(buf, path.data(), path.size()); 3465ffd83dbSDimitry Andric buf[path.size()] = '\0'; 3475ffd83dbSDimitry Andric } 3485ffd83dbSDimitry Andric 349e8d8bef9SDimitry Andric static uint32_t getInstanceCount() { return instanceCount; } 350349cc55cSDimitry Andric static void resetInstanceCount() { instanceCount = 0; } 351e8d8bef9SDimitry Andric 3525ffd83dbSDimitry Andric private: 3535ffd83dbSDimitry Andric LoadCommandType type; 3545ffd83dbSDimitry Andric StringRef path; 355e8d8bef9SDimitry Andric uint32_t compatibilityVersion; 356e8d8bef9SDimitry Andric uint32_t currentVersion; 357e8d8bef9SDimitry Andric static uint32_t instanceCount; 3585ffd83dbSDimitry Andric }; 3595ffd83dbSDimitry Andric 360e8d8bef9SDimitry Andric uint32_t LCDylib::instanceCount = 0; 361e8d8bef9SDimitry Andric 362fe6060f1SDimitry Andric class LCLoadDylinker final : public LoadCommand { 3635ffd83dbSDimitry Andric public: 3645ffd83dbSDimitry Andric uint32_t getSize() const override { 365bdd1243dSDimitry Andric return alignToPowerOf2(sizeof(dylinker_command) + path.size() + 1, 366bdd1243dSDimitry Andric target->wordSize); 3675ffd83dbSDimitry Andric } 3685ffd83dbSDimitry Andric 3695ffd83dbSDimitry Andric void writeTo(uint8_t *buf) const override { 3705ffd83dbSDimitry Andric auto *c = reinterpret_cast<dylinker_command *>(buf); 3715ffd83dbSDimitry Andric buf += sizeof(dylinker_command); 3725ffd83dbSDimitry Andric 3735ffd83dbSDimitry Andric c->cmd = LC_LOAD_DYLINKER; 3745ffd83dbSDimitry Andric c->cmdsize = getSize(); 3755ffd83dbSDimitry Andric c->name = sizeof(dylinker_command); 3765ffd83dbSDimitry Andric 3775ffd83dbSDimitry Andric memcpy(buf, path.data(), path.size()); 3785ffd83dbSDimitry Andric buf[path.size()] = '\0'; 3795ffd83dbSDimitry Andric } 3805ffd83dbSDimitry Andric 3815ffd83dbSDimitry Andric private: 3825ffd83dbSDimitry Andric // Recent versions of Darwin won't run any binary that has dyld at a 3835ffd83dbSDimitry Andric // different location. 3845ffd83dbSDimitry Andric const StringRef path = "/usr/lib/dyld"; 3855ffd83dbSDimitry Andric }; 386e8d8bef9SDimitry Andric 387fe6060f1SDimitry Andric class LCRPath final : public LoadCommand { 388e8d8bef9SDimitry Andric public: 389fe6060f1SDimitry Andric explicit LCRPath(StringRef path) : path(path) {} 390e8d8bef9SDimitry Andric 391e8d8bef9SDimitry Andric uint32_t getSize() const override { 392bdd1243dSDimitry Andric return alignToPowerOf2(sizeof(rpath_command) + path.size() + 1, 393bdd1243dSDimitry Andric target->wordSize); 394e8d8bef9SDimitry Andric } 395e8d8bef9SDimitry Andric 396e8d8bef9SDimitry Andric void writeTo(uint8_t *buf) const override { 397e8d8bef9SDimitry Andric auto *c = reinterpret_cast<rpath_command *>(buf); 398e8d8bef9SDimitry Andric buf += sizeof(rpath_command); 399e8d8bef9SDimitry Andric 400e8d8bef9SDimitry Andric c->cmd = LC_RPATH; 401e8d8bef9SDimitry Andric c->cmdsize = getSize(); 402e8d8bef9SDimitry Andric c->path = sizeof(rpath_command); 403e8d8bef9SDimitry Andric 404e8d8bef9SDimitry Andric memcpy(buf, path.data(), path.size()); 405e8d8bef9SDimitry Andric buf[path.size()] = '\0'; 406e8d8bef9SDimitry Andric } 407e8d8bef9SDimitry Andric 408e8d8bef9SDimitry Andric private: 409e8d8bef9SDimitry Andric StringRef path; 410e8d8bef9SDimitry Andric }; 411e8d8bef9SDimitry Andric 412bdd1243dSDimitry Andric class LCDyldEnv final : public LoadCommand { 413bdd1243dSDimitry Andric public: 414bdd1243dSDimitry Andric explicit LCDyldEnv(StringRef name) : name(name) {} 415bdd1243dSDimitry Andric 416bdd1243dSDimitry Andric uint32_t getSize() const override { 417bdd1243dSDimitry Andric return alignToPowerOf2(sizeof(dyld_env_command) + name.size() + 1, 418bdd1243dSDimitry Andric target->wordSize); 419bdd1243dSDimitry Andric } 420bdd1243dSDimitry Andric 421bdd1243dSDimitry Andric void writeTo(uint8_t *buf) const override { 422bdd1243dSDimitry Andric auto *c = reinterpret_cast<dyld_env_command *>(buf); 423bdd1243dSDimitry Andric buf += sizeof(dyld_env_command); 424bdd1243dSDimitry Andric 425bdd1243dSDimitry Andric c->cmd = LC_DYLD_ENVIRONMENT; 426bdd1243dSDimitry Andric c->cmdsize = getSize(); 427bdd1243dSDimitry Andric c->name = sizeof(dyld_env_command); 428bdd1243dSDimitry Andric 429bdd1243dSDimitry Andric memcpy(buf, name.data(), name.size()); 430bdd1243dSDimitry Andric buf[name.size()] = '\0'; 431bdd1243dSDimitry Andric } 432bdd1243dSDimitry Andric 433bdd1243dSDimitry Andric private: 434bdd1243dSDimitry Andric StringRef name; 435bdd1243dSDimitry Andric }; 436bdd1243dSDimitry Andric 437fe6060f1SDimitry Andric class LCMinVersion final : public LoadCommand { 438e8d8bef9SDimitry Andric public: 439fe6060f1SDimitry Andric explicit LCMinVersion(const PlatformInfo &platformInfo) 440fe6060f1SDimitry Andric : platformInfo(platformInfo) {} 441fe6060f1SDimitry Andric 442fe6060f1SDimitry Andric uint32_t getSize() const override { return sizeof(version_min_command); } 443fe6060f1SDimitry Andric 444fe6060f1SDimitry Andric void writeTo(uint8_t *buf) const override { 445fe6060f1SDimitry Andric auto *c = reinterpret_cast<version_min_command *>(buf); 446fe6060f1SDimitry Andric switch (platformInfo.target.Platform) { 44704eeddc0SDimitry Andric case PLATFORM_MACOS: 448fe6060f1SDimitry Andric c->cmd = LC_VERSION_MIN_MACOSX; 449fe6060f1SDimitry Andric break; 45004eeddc0SDimitry Andric case PLATFORM_IOS: 45104eeddc0SDimitry Andric case PLATFORM_IOSSIMULATOR: 452fe6060f1SDimitry Andric c->cmd = LC_VERSION_MIN_IPHONEOS; 453fe6060f1SDimitry Andric break; 45404eeddc0SDimitry Andric case PLATFORM_TVOS: 45504eeddc0SDimitry Andric case PLATFORM_TVOSSIMULATOR: 456fe6060f1SDimitry Andric c->cmd = LC_VERSION_MIN_TVOS; 457fe6060f1SDimitry Andric break; 45804eeddc0SDimitry Andric case PLATFORM_WATCHOS: 45904eeddc0SDimitry Andric case PLATFORM_WATCHOSSIMULATOR: 460fe6060f1SDimitry Andric c->cmd = LC_VERSION_MIN_WATCHOS; 461fe6060f1SDimitry Andric break; 462fe6060f1SDimitry Andric default: 463fe6060f1SDimitry Andric llvm_unreachable("invalid platform"); 464fe6060f1SDimitry Andric break; 465fe6060f1SDimitry Andric } 466fe6060f1SDimitry Andric c->cmdsize = getSize(); 46706c3fb27SDimitry Andric c->version = encodeVersion(platformInfo.target.MinDeployment); 468fe6060f1SDimitry Andric c->sdk = encodeVersion(platformInfo.sdk); 469fe6060f1SDimitry Andric } 470fe6060f1SDimitry Andric 471fe6060f1SDimitry Andric private: 472fe6060f1SDimitry Andric const PlatformInfo &platformInfo; 473fe6060f1SDimitry Andric }; 474fe6060f1SDimitry Andric 475fe6060f1SDimitry Andric class LCBuildVersion final : public LoadCommand { 476fe6060f1SDimitry Andric public: 477fe6060f1SDimitry Andric explicit LCBuildVersion(const PlatformInfo &platformInfo) 478fe6060f1SDimitry Andric : platformInfo(platformInfo) {} 479e8d8bef9SDimitry Andric 480e8d8bef9SDimitry Andric const int ntools = 1; 481e8d8bef9SDimitry Andric 482e8d8bef9SDimitry Andric uint32_t getSize() const override { 483e8d8bef9SDimitry Andric return sizeof(build_version_command) + ntools * sizeof(build_tool_version); 484e8d8bef9SDimitry Andric } 485e8d8bef9SDimitry Andric 486e8d8bef9SDimitry Andric void writeTo(uint8_t *buf) const override { 487e8d8bef9SDimitry Andric auto *c = reinterpret_cast<build_version_command *>(buf); 488e8d8bef9SDimitry Andric c->cmd = LC_BUILD_VERSION; 489e8d8bef9SDimitry Andric c->cmdsize = getSize(); 49081ad6265SDimitry Andric 491fe6060f1SDimitry Andric c->platform = static_cast<uint32_t>(platformInfo.target.Platform); 49206c3fb27SDimitry Andric c->minos = encodeVersion(platformInfo.target.MinDeployment); 493fe6060f1SDimitry Andric c->sdk = encodeVersion(platformInfo.sdk); 49481ad6265SDimitry Andric 495e8d8bef9SDimitry Andric c->ntools = ntools; 496e8d8bef9SDimitry Andric auto *t = reinterpret_cast<build_tool_version *>(&c[1]); 49706c3fb27SDimitry Andric t->tool = TOOL_LLD; 498fe6060f1SDimitry Andric t->version = encodeVersion(VersionTuple( 499fe6060f1SDimitry Andric LLVM_VERSION_MAJOR, LLVM_VERSION_MINOR, LLVM_VERSION_PATCH)); 500e8d8bef9SDimitry Andric } 501e8d8bef9SDimitry Andric 502fe6060f1SDimitry Andric private: 503fe6060f1SDimitry Andric const PlatformInfo &platformInfo; 504e8d8bef9SDimitry Andric }; 505e8d8bef9SDimitry Andric 506e8d8bef9SDimitry Andric // Stores a unique identifier for the output file based on an MD5 hash of its 507e8d8bef9SDimitry Andric // contents. In order to hash the contents, we must first write them, but 508e8d8bef9SDimitry Andric // LC_UUID itself must be part of the written contents in order for all the 509e8d8bef9SDimitry Andric // offsets to be calculated correctly. We resolve this circular paradox by 510e8d8bef9SDimitry Andric // first writing an LC_UUID with an all-zero UUID, then updating the UUID with 511e8d8bef9SDimitry Andric // its real value later. 512fe6060f1SDimitry Andric class LCUuid final : public LoadCommand { 513e8d8bef9SDimitry Andric public: 514e8d8bef9SDimitry Andric uint32_t getSize() const override { return sizeof(uuid_command); } 515e8d8bef9SDimitry Andric 516e8d8bef9SDimitry Andric void writeTo(uint8_t *buf) const override { 517e8d8bef9SDimitry Andric auto *c = reinterpret_cast<uuid_command *>(buf); 518e8d8bef9SDimitry Andric c->cmd = LC_UUID; 519e8d8bef9SDimitry Andric c->cmdsize = getSize(); 520e8d8bef9SDimitry Andric uuidBuf = c->uuid; 521e8d8bef9SDimitry Andric } 522e8d8bef9SDimitry Andric 523e8d8bef9SDimitry Andric void writeUuid(uint64_t digest) const { 524e8d8bef9SDimitry Andric // xxhash only gives us 8 bytes, so put some fixed data in the other half. 525e8d8bef9SDimitry Andric static_assert(sizeof(uuid_command::uuid) == 16, "unexpected uuid size"); 526e8d8bef9SDimitry Andric memcpy(uuidBuf, "LLD\xa1UU1D", 8); 527e8d8bef9SDimitry Andric memcpy(uuidBuf + 8, &digest, 8); 528e8d8bef9SDimitry Andric 529e8d8bef9SDimitry Andric // RFC 4122 conformance. We need to fix 4 bits in byte 6 and 2 bits in 530e8d8bef9SDimitry Andric // byte 8. Byte 6 is already fine due to the fixed data we put in. We don't 531e8d8bef9SDimitry Andric // want to lose bits of the digest in byte 8, so swap that with a byte of 532e8d8bef9SDimitry Andric // fixed data that happens to have the right bits set. 533e8d8bef9SDimitry Andric std::swap(uuidBuf[3], uuidBuf[8]); 534e8d8bef9SDimitry Andric 535e8d8bef9SDimitry Andric // Claim that this is an MD5-based hash. It isn't, but this signals that 536e8d8bef9SDimitry Andric // this is not a time-based and not a random hash. MD5 seems like the least 537e8d8bef9SDimitry Andric // bad lie we can put here. 538e8d8bef9SDimitry Andric assert((uuidBuf[6] & 0xf0) == 0x30 && "See RFC 4122 Sections 4.2.2, 4.1.3"); 539e8d8bef9SDimitry Andric assert((uuidBuf[8] & 0xc0) == 0x80 && "See RFC 4122 Section 4.2.2"); 540e8d8bef9SDimitry Andric } 541e8d8bef9SDimitry Andric 542e8d8bef9SDimitry Andric mutable uint8_t *uuidBuf; 543e8d8bef9SDimitry Andric }; 544e8d8bef9SDimitry Andric 545fe6060f1SDimitry Andric template <class LP> class LCEncryptionInfo final : public LoadCommand { 546fe6060f1SDimitry Andric public: 547fe6060f1SDimitry Andric uint32_t getSize() const override { 548fe6060f1SDimitry Andric return sizeof(typename LP::encryption_info_command); 549fe6060f1SDimitry Andric } 550fe6060f1SDimitry Andric 551fe6060f1SDimitry Andric void writeTo(uint8_t *buf) const override { 552fe6060f1SDimitry Andric using EncryptionInfo = typename LP::encryption_info_command; 553fe6060f1SDimitry Andric auto *c = reinterpret_cast<EncryptionInfo *>(buf); 554fe6060f1SDimitry Andric buf += sizeof(EncryptionInfo); 555fe6060f1SDimitry Andric c->cmd = LP::encryptionInfoLCType; 556fe6060f1SDimitry Andric c->cmdsize = getSize(); 557fe6060f1SDimitry Andric c->cryptoff = in.header->getSize(); 558fe6060f1SDimitry Andric auto it = find_if(outputSegments, [](const OutputSegment *seg) { 559fe6060f1SDimitry Andric return seg->name == segment_names::text; 560fe6060f1SDimitry Andric }); 561fe6060f1SDimitry Andric assert(it != outputSegments.end()); 562fe6060f1SDimitry Andric c->cryptsize = (*it)->fileSize - c->cryptoff; 563fe6060f1SDimitry Andric } 564fe6060f1SDimitry Andric }; 565fe6060f1SDimitry Andric 566fe6060f1SDimitry Andric class LCCodeSignature final : public LoadCommand { 567fe6060f1SDimitry Andric public: 568fe6060f1SDimitry Andric LCCodeSignature(CodeSignatureSection *section) : section(section) {} 569fe6060f1SDimitry Andric 570fe6060f1SDimitry Andric uint32_t getSize() const override { return sizeof(linkedit_data_command); } 571fe6060f1SDimitry Andric 572fe6060f1SDimitry Andric void writeTo(uint8_t *buf) const override { 573fe6060f1SDimitry Andric auto *c = reinterpret_cast<linkedit_data_command *>(buf); 574fe6060f1SDimitry Andric c->cmd = LC_CODE_SIGNATURE; 575fe6060f1SDimitry Andric c->cmdsize = getSize(); 576fe6060f1SDimitry Andric c->dataoff = static_cast<uint32_t>(section->fileOff); 577fe6060f1SDimitry Andric c->datasize = section->getSize(); 578fe6060f1SDimitry Andric } 579fe6060f1SDimitry Andric 580fe6060f1SDimitry Andric CodeSignatureSection *section; 581fe6060f1SDimitry Andric }; 582fe6060f1SDimitry Andric 583bdd1243dSDimitry Andric class LCExportsTrie final : public LoadCommand { 584bdd1243dSDimitry Andric public: 585bdd1243dSDimitry Andric LCExportsTrie(ExportSection *section) : section(section) {} 586bdd1243dSDimitry Andric 587bdd1243dSDimitry Andric uint32_t getSize() const override { return sizeof(linkedit_data_command); } 588bdd1243dSDimitry Andric 589bdd1243dSDimitry Andric void writeTo(uint8_t *buf) const override { 590bdd1243dSDimitry Andric auto *c = reinterpret_cast<linkedit_data_command *>(buf); 591bdd1243dSDimitry Andric c->cmd = LC_DYLD_EXPORTS_TRIE; 592bdd1243dSDimitry Andric c->cmdsize = getSize(); 593bdd1243dSDimitry Andric c->dataoff = section->fileOff; 594bdd1243dSDimitry Andric c->datasize = section->getSize(); 595bdd1243dSDimitry Andric } 596bdd1243dSDimitry Andric 597bdd1243dSDimitry Andric ExportSection *section; 598bdd1243dSDimitry Andric }; 599bdd1243dSDimitry Andric 600bdd1243dSDimitry Andric class LCChainedFixups final : public LoadCommand { 601bdd1243dSDimitry Andric public: 602bdd1243dSDimitry Andric LCChainedFixups(ChainedFixupsSection *section) : section(section) {} 603bdd1243dSDimitry Andric 604bdd1243dSDimitry Andric uint32_t getSize() const override { return sizeof(linkedit_data_command); } 605bdd1243dSDimitry Andric 606bdd1243dSDimitry Andric void writeTo(uint8_t *buf) const override { 607bdd1243dSDimitry Andric auto *c = reinterpret_cast<linkedit_data_command *>(buf); 608bdd1243dSDimitry Andric c->cmd = LC_DYLD_CHAINED_FIXUPS; 609bdd1243dSDimitry Andric c->cmdsize = getSize(); 610bdd1243dSDimitry Andric c->dataoff = section->fileOff; 611bdd1243dSDimitry Andric c->datasize = section->getSize(); 612bdd1243dSDimitry Andric } 613bdd1243dSDimitry Andric 614bdd1243dSDimitry Andric ChainedFixupsSection *section; 615bdd1243dSDimitry Andric }; 616bdd1243dSDimitry Andric 6175ffd83dbSDimitry Andric } // namespace 6185ffd83dbSDimitry Andric 619fe6060f1SDimitry Andric void Writer::treatSpecialUndefineds() { 620fe6060f1SDimitry Andric if (config->entry) 621fe6060f1SDimitry Andric if (auto *undefined = dyn_cast<Undefined>(config->entry)) 622fe6060f1SDimitry Andric treatUndefinedSymbol(*undefined, "the entry point"); 623fe6060f1SDimitry Andric 624fe6060f1SDimitry Andric // FIXME: This prints symbols that are undefined both in input files and 625fe6060f1SDimitry Andric // via -u flag twice. 626fe6060f1SDimitry Andric for (const Symbol *sym : config->explicitUndefineds) { 627fe6060f1SDimitry Andric if (const auto *undefined = dyn_cast<Undefined>(sym)) 628fe6060f1SDimitry Andric treatUndefinedSymbol(*undefined, "-u"); 629fe6060f1SDimitry Andric } 630fe6060f1SDimitry Andric // Literal exported-symbol names must be defined, but glob 631fe6060f1SDimitry Andric // patterns need not match. 632fe6060f1SDimitry Andric for (const CachedHashStringRef &cachedName : 633fe6060f1SDimitry Andric config->exportedSymbols.literals) { 634fe6060f1SDimitry Andric if (const Symbol *sym = symtab->find(cachedName)) 635fe6060f1SDimitry Andric if (const auto *undefined = dyn_cast<Undefined>(sym)) 636fe6060f1SDimitry Andric treatUndefinedSymbol(*undefined, "-exported_symbol(s_list)"); 637fe6060f1SDimitry Andric } 638fe6060f1SDimitry Andric } 639fe6060f1SDimitry Andric 640fe6060f1SDimitry Andric static void prepareSymbolRelocation(Symbol *sym, const InputSection *isec, 64104eeddc0SDimitry Andric const lld::macho::Reloc &r) { 642*0fca6ea1SDimitry Andric if (!sym->isLive()) { 643*0fca6ea1SDimitry Andric if (Defined *defined = dyn_cast<Defined>(sym)) { 644*0fca6ea1SDimitry Andric if (config->emitInitOffsets && 645*0fca6ea1SDimitry Andric defined->isec()->getName() == section_names::moduleInitFunc) 646*0fca6ea1SDimitry Andric fatal(isec->getLocation(r.offset) + ": cannot reference " + 647*0fca6ea1SDimitry Andric sym->getName() + 648*0fca6ea1SDimitry Andric " defined in __mod_init_func when -init_offsets is used"); 649*0fca6ea1SDimitry Andric } 650*0fca6ea1SDimitry Andric assert(false && "referenced symbol must be live"); 651*0fca6ea1SDimitry Andric } 652*0fca6ea1SDimitry Andric 653fe6060f1SDimitry Andric const RelocAttrs &relocAttrs = target->getRelocAttrs(r.type); 654fe6060f1SDimitry Andric 655fe6060f1SDimitry Andric if (relocAttrs.hasAttr(RelocAttrBits::BRANCH)) { 656bdd1243dSDimitry Andric if (needsBinding(sym)) 657bdd1243dSDimitry Andric in.stubs->addEntry(sym); 658fe6060f1SDimitry Andric } else if (relocAttrs.hasAttr(RelocAttrBits::GOT)) { 659fe6060f1SDimitry Andric if (relocAttrs.hasAttr(RelocAttrBits::POINTER) || needsBinding(sym)) 660fe6060f1SDimitry Andric in.got->addEntry(sym); 661fe6060f1SDimitry Andric } else if (relocAttrs.hasAttr(RelocAttrBits::TLV)) { 662fe6060f1SDimitry Andric if (needsBinding(sym)) 663fe6060f1SDimitry Andric in.tlvPointers->addEntry(sym); 664fe6060f1SDimitry Andric } else if (relocAttrs.hasAttr(RelocAttrBits::UNSIGNED)) { 665fe6060f1SDimitry Andric // References from thread-local variable sections are treated as offsets 666fe6060f1SDimitry Andric // relative to the start of the referent section, and therefore have no 667fe6060f1SDimitry Andric // need of rebase opcodes. 668fe6060f1SDimitry Andric if (!(isThreadLocalVariables(isec->getFlags()) && isa<Defined>(sym))) 669fe6060f1SDimitry Andric addNonLazyBindingEntries(sym, isec, r.offset, r.addend); 670fe6060f1SDimitry Andric } 671fe6060f1SDimitry Andric } 672fe6060f1SDimitry Andric 6735ffd83dbSDimitry Andric void Writer::scanRelocations() { 674fe6060f1SDimitry Andric TimeTraceScope timeScope("Scan relocations"); 675fe6060f1SDimitry Andric 676fe6060f1SDimitry Andric // This can't use a for-each loop: It calls treatUndefinedSymbol(), which can 677fe6060f1SDimitry Andric // add to inputSections, which invalidates inputSections's iterators. 678fe6060f1SDimitry Andric for (size_t i = 0; i < inputSections.size(); ++i) { 679fe6060f1SDimitry Andric ConcatInputSection *isec = inputSections[i]; 680fe6060f1SDimitry Andric 681fe6060f1SDimitry Andric if (isec->shouldOmitFromOutput()) 682e8d8bef9SDimitry Andric continue; 683e8d8bef9SDimitry Andric 684fe6060f1SDimitry Andric for (auto it = isec->relocs.begin(); it != isec->relocs.end(); ++it) { 68504eeddc0SDimitry Andric lld::macho::Reloc &r = *it; 68606c3fb27SDimitry Andric 68706c3fb27SDimitry Andric // Canonicalize the referent so that later accesses in Writer won't 68806c3fb27SDimitry Andric // have to worry about it. 68906c3fb27SDimitry Andric if (auto *referentIsec = r.referent.dyn_cast<InputSection *>()) 69006c3fb27SDimitry Andric r.referent = referentIsec->canonical(); 69106c3fb27SDimitry Andric 692fe6060f1SDimitry Andric if (target->hasAttr(r.type, RelocAttrBits::SUBTRAHEND)) { 693fe6060f1SDimitry Andric // Skip over the following UNSIGNED relocation -- it's just there as the 694fe6060f1SDimitry Andric // minuend, and doesn't have the usual UNSIGNED semantics. We don't want 695fe6060f1SDimitry Andric // to emit rebase opcodes for it. 69606c3fb27SDimitry Andric ++it; 69706c3fb27SDimitry Andric // Canonicalize the referent so that later accesses in Writer won't 69806c3fb27SDimitry Andric // have to worry about it. 69906c3fb27SDimitry Andric if (auto *referentIsec = it->referent.dyn_cast<InputSection *>()) 70006c3fb27SDimitry Andric it->referent = referentIsec->canonical(); 701fe6060f1SDimitry Andric continue; 702fe6060f1SDimitry Andric } 703fe6060f1SDimitry Andric if (auto *sym = r.referent.dyn_cast<Symbol *>()) { 704fe6060f1SDimitry Andric if (auto *undefined = dyn_cast<Undefined>(sym)) 70581ad6265SDimitry Andric treatUndefinedSymbol(*undefined, isec, r.offset); 706fe6060f1SDimitry Andric // treatUndefinedSymbol() can replace sym with a DylibSymbol; re-check. 707fe6060f1SDimitry Andric if (!isa<Undefined>(sym) && validateSymbolRelocation(sym, isec, r)) 708fe6060f1SDimitry Andric prepareSymbolRelocation(sym, isec, r); 709e8d8bef9SDimitry Andric } else { 710bdd1243dSDimitry Andric if (!r.pcrel) { 711bdd1243dSDimitry Andric if (config->emitChainedFixups) 712bdd1243dSDimitry Andric in.chainedFixups->addRebase(isec, r.offset); 713bdd1243dSDimitry Andric else 714e8d8bef9SDimitry Andric in.rebase->addEntry(isec, r.offset); 7155ffd83dbSDimitry Andric } 7165ffd83dbSDimitry Andric } 7175ffd83dbSDimitry Andric } 718bdd1243dSDimitry Andric } 719fe6060f1SDimitry Andric 720f3fd488fSDimitry Andric in.unwindInfo->prepare(); 7215ffd83dbSDimitry Andric } 7225ffd83dbSDimitry Andric 723bdd1243dSDimitry Andric static void addNonWeakDefinition(const Defined *defined) { 724bdd1243dSDimitry Andric if (config->emitChainedFixups) 725bdd1243dSDimitry Andric in.chainedFixups->setHasNonWeakDefinition(); 726bdd1243dSDimitry Andric else 727bdd1243dSDimitry Andric in.weakBinding->addNonWeakDefinition(defined); 728bdd1243dSDimitry Andric } 729bdd1243dSDimitry Andric 730e8d8bef9SDimitry Andric void Writer::scanSymbols() { 731fe6060f1SDimitry Andric TimeTraceScope timeScope("Scan symbols"); 732*0fca6ea1SDimitry Andric ObjCSelRefsHelper::initialize(); 733349cc55cSDimitry Andric for (Symbol *sym : symtab->getSymbols()) { 734349cc55cSDimitry Andric if (auto *defined = dyn_cast<Defined>(sym)) { 735349cc55cSDimitry Andric if (!defined->isLive()) 736349cc55cSDimitry Andric continue; 737349cc55cSDimitry Andric if (defined->overridesWeakDef) 738bdd1243dSDimitry Andric addNonWeakDefinition(defined); 739*0fca6ea1SDimitry Andric if (!defined->isAbsolute() && isCodeSection(defined->isec())) 740349cc55cSDimitry Andric in.unwindInfo->addSymbol(defined); 741e8d8bef9SDimitry Andric } else if (const auto *dysym = dyn_cast<DylibSymbol>(sym)) { 742fe6060f1SDimitry Andric // This branch intentionally doesn't check isLive(). 743fe6060f1SDimitry Andric if (dysym->isDynamicLookup()) 744fe6060f1SDimitry Andric continue; 745fe6060f1SDimitry Andric dysym->getFile()->refState = 746fe6060f1SDimitry Andric std::max(dysym->getFile()->refState, dysym->getRefState()); 747bdd1243dSDimitry Andric } else if (isa<Undefined>(sym)) { 748*0fca6ea1SDimitry Andric if (ObjCStubsSection::isObjCStubSymbol(sym)) { 749*0fca6ea1SDimitry Andric // When -dead_strip is enabled, we don't want to emit any dead stubs. 750*0fca6ea1SDimitry Andric // Although this stub symbol is yet undefined, addSym() was called 751*0fca6ea1SDimitry Andric // during MarkLive. 752*0fca6ea1SDimitry Andric if (config->deadStrip) { 753*0fca6ea1SDimitry Andric if (!sym->isLive()) 754*0fca6ea1SDimitry Andric continue; 755*0fca6ea1SDimitry Andric } 756bdd1243dSDimitry Andric in.objcStubs->addEntry(sym); 757e8d8bef9SDimitry Andric } 758e8d8bef9SDimitry Andric } 759*0fca6ea1SDimitry Andric } 760349cc55cSDimitry Andric 761349cc55cSDimitry Andric for (const InputFile *file : inputFiles) { 762349cc55cSDimitry Andric if (auto *objFile = dyn_cast<ObjFile>(file)) 763349cc55cSDimitry Andric for (Symbol *sym : objFile->symbols) { 764349cc55cSDimitry Andric if (auto *defined = dyn_cast_or_null<Defined>(sym)) { 765349cc55cSDimitry Andric if (!defined->isLive()) 766349cc55cSDimitry Andric continue; 767349cc55cSDimitry Andric if (!defined->isExternal() && !defined->isAbsolute() && 768*0fca6ea1SDimitry Andric isCodeSection(defined->isec())) 769349cc55cSDimitry Andric in.unwindInfo->addSymbol(defined); 770349cc55cSDimitry Andric } 771349cc55cSDimitry Andric } 772349cc55cSDimitry Andric } 773e8d8bef9SDimitry Andric } 774e8d8bef9SDimitry Andric 775fe6060f1SDimitry Andric // TODO: ld64 enforces the old load commands in a few other cases. 776fe6060f1SDimitry Andric static bool useLCBuildVersion(const PlatformInfo &platformInfo) { 777bdd1243dSDimitry Andric static const std::array<std::pair<PlatformType, VersionTuple>, 7> minVersion = 778bdd1243dSDimitry Andric {{{PLATFORM_MACOS, VersionTuple(10, 14)}, 77904eeddc0SDimitry Andric {PLATFORM_IOS, VersionTuple(12, 0)}, 78004eeddc0SDimitry Andric {PLATFORM_IOSSIMULATOR, VersionTuple(13, 0)}, 78104eeddc0SDimitry Andric {PLATFORM_TVOS, VersionTuple(12, 0)}, 78204eeddc0SDimitry Andric {PLATFORM_TVOSSIMULATOR, VersionTuple(13, 0)}, 78304eeddc0SDimitry Andric {PLATFORM_WATCHOS, VersionTuple(5, 0)}, 784bdd1243dSDimitry Andric {PLATFORM_WATCHOSSIMULATOR, VersionTuple(6, 0)}}}; 785fe6060f1SDimitry Andric auto it = llvm::find_if(minVersion, [&](const auto &p) { 786fe6060f1SDimitry Andric return p.first == platformInfo.target.Platform; 787fe6060f1SDimitry Andric }); 78806c3fb27SDimitry Andric return it == minVersion.end() 78906c3fb27SDimitry Andric ? true 79006c3fb27SDimitry Andric : platformInfo.target.MinDeployment >= it->second; 791fe6060f1SDimitry Andric } 792fe6060f1SDimitry Andric 793fe6060f1SDimitry Andric template <class LP> void Writer::createLoadCommands() { 794fe6060f1SDimitry Andric uint8_t segIndex = 0; 795fe6060f1SDimitry Andric for (OutputSegment *seg : outputSegments) { 796fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCSegment<LP>>(seg->name, seg)); 797fe6060f1SDimitry Andric seg->index = segIndex++; 798fe6060f1SDimitry Andric } 799fe6060f1SDimitry Andric 800bdd1243dSDimitry Andric if (config->emitChainedFixups) { 801bdd1243dSDimitry Andric in.header->addLoadCommand(make<LCChainedFixups>(in.chainedFixups)); 802bdd1243dSDimitry Andric in.header->addLoadCommand(make<LCExportsTrie>(in.exports)); 803bdd1243dSDimitry Andric } else { 804e8d8bef9SDimitry Andric in.header->addLoadCommand(make<LCDyldInfo>( 805e8d8bef9SDimitry Andric in.rebase, in.binding, in.weakBinding, in.lazyBinding, in.exports)); 806bdd1243dSDimitry Andric } 807e8d8bef9SDimitry Andric in.header->addLoadCommand(make<LCSymtab>(symtabSection, stringTableSection)); 808e8d8bef9SDimitry Andric in.header->addLoadCommand( 809e8d8bef9SDimitry Andric make<LCDysymtab>(symtabSection, indirectSymtabSection)); 810fe6060f1SDimitry Andric if (!config->umbrella.empty()) 811fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCSubFramework>(config->umbrella)); 812fe6060f1SDimitry Andric if (config->emitEncryptionInfo) 813fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCEncryptionInfo<LP>>()); 814e8d8bef9SDimitry Andric for (StringRef path : config->runtimePaths) 815e8d8bef9SDimitry Andric in.header->addLoadCommand(make<LCRPath>(path)); 8165ffd83dbSDimitry Andric 8175ffd83dbSDimitry Andric switch (config->outputType) { 8185ffd83dbSDimitry Andric case MH_EXECUTE: 819e8d8bef9SDimitry Andric in.header->addLoadCommand(make<LCLoadDylinker>()); 8205ffd83dbSDimitry Andric break; 8215ffd83dbSDimitry Andric case MH_DYLIB: 822e8d8bef9SDimitry Andric in.header->addLoadCommand(make<LCDylib>(LC_ID_DYLIB, config->installName, 823e8d8bef9SDimitry Andric config->dylibCompatibilityVersion, 824e8d8bef9SDimitry Andric config->dylibCurrentVersion)); 825e8d8bef9SDimitry Andric break; 826e8d8bef9SDimitry Andric case MH_BUNDLE: 8275ffd83dbSDimitry Andric break; 8285ffd83dbSDimitry Andric default: 8295ffd83dbSDimitry Andric llvm_unreachable("unhandled output file type"); 8305ffd83dbSDimitry Andric } 8315ffd83dbSDimitry Andric 83206c3fb27SDimitry Andric if (config->generateUuid) { 833e8d8bef9SDimitry Andric uuidCommand = make<LCUuid>(); 834e8d8bef9SDimitry Andric in.header->addLoadCommand(uuidCommand); 83506c3fb27SDimitry Andric } 836e8d8bef9SDimitry Andric 837fe6060f1SDimitry Andric if (useLCBuildVersion(config->platformInfo)) 838fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCBuildVersion>(config->platformInfo)); 839fe6060f1SDimitry Andric else 840fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCMinVersion>(config->platformInfo)); 8415ffd83dbSDimitry Andric 84281ad6265SDimitry Andric if (config->secondaryPlatformInfo) { 84381ad6265SDimitry Andric in.header->addLoadCommand( 84481ad6265SDimitry Andric make<LCBuildVersion>(*config->secondaryPlatformInfo)); 84581ad6265SDimitry Andric } 84681ad6265SDimitry Andric 847fe6060f1SDimitry Andric // This is down here to match ld64's load command order. 848fe6060f1SDimitry Andric if (config->outputType == MH_EXECUTE) 849fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCMain>()); 850fe6060f1SDimitry Andric 85161cfbce3SDimitry Andric // See ld64's OutputFile::buildDylibOrdinalMapping for the corresponding 85261cfbce3SDimitry Andric // library ordinal computation code in ld64. 853fe6060f1SDimitry Andric int64_t dylibOrdinal = 1; 854fe6060f1SDimitry Andric DenseMap<StringRef, int64_t> ordinalForInstallName; 85561cfbce3SDimitry Andric 85661cfbce3SDimitry Andric std::vector<DylibFile *> dylibFiles; 8575ffd83dbSDimitry Andric for (InputFile *file : inputFiles) { 85861cfbce3SDimitry Andric if (auto *dylibFile = dyn_cast<DylibFile>(file)) 85961cfbce3SDimitry Andric dylibFiles.push_back(dylibFile); 86061cfbce3SDimitry Andric } 86161cfbce3SDimitry Andric for (size_t i = 0; i < dylibFiles.size(); ++i) 86261cfbce3SDimitry Andric dylibFiles.insert(dylibFiles.end(), dylibFiles[i]->extraDylibs.begin(), 86361cfbce3SDimitry Andric dylibFiles[i]->extraDylibs.end()); 86461cfbce3SDimitry Andric 86561cfbce3SDimitry Andric for (DylibFile *dylibFile : dylibFiles) { 866fe6060f1SDimitry Andric if (dylibFile->isBundleLoader) { 867fe6060f1SDimitry Andric dylibFile->ordinal = BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE; 868fe6060f1SDimitry Andric // Shortcut since bundle-loader does not re-export the symbols. 869fe6060f1SDimitry Andric 870fe6060f1SDimitry Andric dylibFile->reexport = false; 871fe6060f1SDimitry Andric continue; 872fe6060f1SDimitry Andric } 873fe6060f1SDimitry Andric 874fe6060f1SDimitry Andric // Don't emit load commands for a dylib that is not referenced if: 875fe6060f1SDimitry Andric // - it was added implicitly (via a reexport, an LC_LOAD_DYLINKER -- 876fe6060f1SDimitry Andric // if it's on the linker command line, it's explicit) 877fe6060f1SDimitry Andric // - or it's marked MH_DEAD_STRIPPABLE_DYLIB 878fe6060f1SDimitry Andric // - or the flag -dead_strip_dylibs is used 879fe6060f1SDimitry Andric // FIXME: `isReferenced()` is currently computed before dead code 880fe6060f1SDimitry Andric // stripping, so references from dead code keep a dylib alive. This 881fe6060f1SDimitry Andric // matches ld64, but it's something we should do better. 882fe6060f1SDimitry Andric if (!dylibFile->isReferenced() && !dylibFile->forceNeeded && 88361cfbce3SDimitry Andric (!dylibFile->isExplicitlyLinked() || dylibFile->deadStrippable || 884fe6060f1SDimitry Andric config->deadStripDylibs)) 885fe6060f1SDimitry Andric continue; 886fe6060f1SDimitry Andric 887fe6060f1SDimitry Andric // Several DylibFiles can have the same installName. Only emit a single 888fe6060f1SDimitry Andric // load command for that installName and give all these DylibFiles the 889fe6060f1SDimitry Andric // same ordinal. 890fe6060f1SDimitry Andric // This can happen in several cases: 891fe6060f1SDimitry Andric // - a new framework could change its installName to an older 892fe6060f1SDimitry Andric // framework name via an $ld$ symbol depending on platform_version 893fe6060f1SDimitry Andric // - symlinks (for example, libpthread.tbd is a symlink to libSystem.tbd; 894fe6060f1SDimitry Andric // Foo.framework/Foo.tbd is usually a symlink to 895fe6060f1SDimitry Andric // Foo.framework/Versions/Current/Foo.tbd, where 896fe6060f1SDimitry Andric // Foo.framework/Versions/Current is usually a symlink to 897fe6060f1SDimitry Andric // Foo.framework/Versions/A) 898fe6060f1SDimitry Andric // - a framework can be linked both explicitly on the linker 899fe6060f1SDimitry Andric // command line and implicitly as a reexport from a different 900fe6060f1SDimitry Andric // framework. The re-export will usually point to the tbd file 901fe6060f1SDimitry Andric // in Foo.framework/Versions/A/Foo.tbd, while the explicit link will 902fe6060f1SDimitry Andric // usually find Foo.framework/Foo.tbd. These are usually symlinks, 903fe6060f1SDimitry Andric // but in a --reproduce archive they will be identical but distinct 904fe6060f1SDimitry Andric // files. 905fe6060f1SDimitry Andric // In the first case, *semantically distinct* DylibFiles will have the 906fe6060f1SDimitry Andric // same installName. 907fe6060f1SDimitry Andric int64_t &ordinal = ordinalForInstallName[dylibFile->installName]; 908fe6060f1SDimitry Andric if (ordinal) { 909fe6060f1SDimitry Andric dylibFile->ordinal = ordinal; 910fe6060f1SDimitry Andric continue; 911fe6060f1SDimitry Andric } 912fe6060f1SDimitry Andric 913fe6060f1SDimitry Andric ordinal = dylibFile->ordinal = dylibOrdinal++; 914e8d8bef9SDimitry Andric LoadCommandType lcType = 915e8d8bef9SDimitry Andric dylibFile->forceWeakImport || dylibFile->refState == RefState::Weak 916e8d8bef9SDimitry Andric ? LC_LOAD_WEAK_DYLIB 917e8d8bef9SDimitry Andric : LC_LOAD_DYLIB; 918fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCDylib>(lcType, dylibFile->installName, 919e8d8bef9SDimitry Andric dylibFile->compatibilityVersion, 920e8d8bef9SDimitry Andric dylibFile->currentVersion)); 9215ffd83dbSDimitry Andric 9225ffd83dbSDimitry Andric if (dylibFile->reexport) 923e8d8bef9SDimitry Andric in.header->addLoadCommand( 924fe6060f1SDimitry Andric make<LCDylib>(LC_REEXPORT_DYLIB, dylibFile->installName)); 9255ffd83dbSDimitry Andric } 926e8d8bef9SDimitry Andric 927bdd1243dSDimitry Andric for (const auto &dyldEnv : config->dyldEnvs) 928bdd1243dSDimitry Andric in.header->addLoadCommand(make<LCDyldEnv>(dyldEnv)); 929bdd1243dSDimitry Andric 930fe6060f1SDimitry Andric if (functionStartsSection) 931fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCFunctionStarts>(functionStartsSection)); 932fe6060f1SDimitry Andric if (dataInCodeSection) 933fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCDataInCode>(dataInCodeSection)); 934fe6060f1SDimitry Andric if (codeSignatureSection) 935fe6060f1SDimitry Andric in.header->addLoadCommand(make<LCCodeSignature>(codeSignatureSection)); 936fe6060f1SDimitry Andric 937e8d8bef9SDimitry Andric const uint32_t MACOS_MAXPATHLEN = 1024; 938e8d8bef9SDimitry Andric config->headerPad = std::max( 939e8d8bef9SDimitry Andric config->headerPad, (config->headerPadMaxInstallNames 940e8d8bef9SDimitry Andric ? LCDylib::getInstanceCount() * MACOS_MAXPATHLEN 941e8d8bef9SDimitry Andric : 0)); 9425ffd83dbSDimitry Andric } 9435ffd83dbSDimitry Andric 9445ffd83dbSDimitry Andric // Sorting only can happen once all outputs have been collected. Here we sort 9455ffd83dbSDimitry Andric // segments, output sections within each segment, and input sections within each 9465ffd83dbSDimitry Andric // output segment. 9475ffd83dbSDimitry Andric static void sortSegmentsAndSections() { 948fe6060f1SDimitry Andric TimeTraceScope timeScope("Sort segments and sections"); 949fe6060f1SDimitry Andric sortOutputSegments(); 9505ffd83dbSDimitry Andric 9515ffd83dbSDimitry Andric DenseMap<const InputSection *, size_t> isecPriorities = 95281ad6265SDimitry Andric priorityBuilder.buildInputSectionPriorities(); 9535ffd83dbSDimitry Andric 9545ffd83dbSDimitry Andric uint32_t sectionIndex = 0; 9555ffd83dbSDimitry Andric for (OutputSegment *seg : outputSegments) { 956fe6060f1SDimitry Andric seg->sortOutputSections(); 95704eeddc0SDimitry Andric // References from thread-local variable sections are treated as offsets 95804eeddc0SDimitry Andric // relative to the start of the thread-local data memory area, which 95904eeddc0SDimitry Andric // is initialized via copying all the TLV data sections (which are all 96004eeddc0SDimitry Andric // contiguous). If later data sections require a greater alignment than 96104eeddc0SDimitry Andric // earlier ones, the offsets of data within those sections won't be 96204eeddc0SDimitry Andric // guaranteed to aligned unless we normalize alignments. We therefore use 96304eeddc0SDimitry Andric // the largest alignment for all TLV data sections. 96404eeddc0SDimitry Andric uint32_t tlvAlign = 0; 96504eeddc0SDimitry Andric for (const OutputSection *osec : seg->getSections()) 96604eeddc0SDimitry Andric if (isThreadLocalData(osec->flags) && osec->align > tlvAlign) 96704eeddc0SDimitry Andric tlvAlign = osec->align; 96804eeddc0SDimitry Andric 969fe6060f1SDimitry Andric for (OutputSection *osec : seg->getSections()) { 9705ffd83dbSDimitry Andric // Now that the output sections are sorted, assign the final 9715ffd83dbSDimitry Andric // output section indices. 9725ffd83dbSDimitry Andric if (!osec->isHidden()) 9735ffd83dbSDimitry Andric osec->index = ++sectionIndex; 97404eeddc0SDimitry Andric if (isThreadLocalData(osec->flags)) { 97504eeddc0SDimitry Andric if (!firstTLVDataSection) 976e8d8bef9SDimitry Andric firstTLVDataSection = osec; 97704eeddc0SDimitry Andric osec->align = tlvAlign; 97804eeddc0SDimitry Andric } 979e8d8bef9SDimitry Andric 9805ffd83dbSDimitry Andric if (!isecPriorities.empty()) { 981fe6060f1SDimitry Andric if (auto *merged = dyn_cast<ConcatOutputSection>(osec)) { 982bdd1243dSDimitry Andric llvm::stable_sort( 983bdd1243dSDimitry Andric merged->inputs, [&](InputSection *a, InputSection *b) { 984bdd1243dSDimitry Andric return isecPriorities.lookup(a) > isecPriorities.lookup(b); 9855ffd83dbSDimitry Andric }); 9865ffd83dbSDimitry Andric } 9875ffd83dbSDimitry Andric } 9885ffd83dbSDimitry Andric } 9895ffd83dbSDimitry Andric } 9905ffd83dbSDimitry Andric } 9915ffd83dbSDimitry Andric 992fe6060f1SDimitry Andric template <class LP> void Writer::createOutputSections() { 993fe6060f1SDimitry Andric TimeTraceScope timeScope("Create output sections"); 9945ffd83dbSDimitry Andric // First, create hidden sections 9955ffd83dbSDimitry Andric stringTableSection = make<StringTableSection>(); 996fe6060f1SDimitry Andric symtabSection = makeSymtabSection<LP>(*stringTableSection); 997e8d8bef9SDimitry Andric indirectSymtabSection = make<IndirectSymtabSection>(); 998fe6060f1SDimitry Andric if (config->adhocCodesign) 999fe6060f1SDimitry Andric codeSignatureSection = make<CodeSignatureSection>(); 1000fe6060f1SDimitry Andric if (config->emitDataInCodeInfo) 1001fe6060f1SDimitry Andric dataInCodeSection = make<DataInCodeSection>(); 1002fe6060f1SDimitry Andric if (config->emitFunctionStarts) 1003fe6060f1SDimitry Andric functionStartsSection = make<FunctionStartsSection>(); 10045ffd83dbSDimitry Andric 10055ffd83dbSDimitry Andric switch (config->outputType) { 10065ffd83dbSDimitry Andric case MH_EXECUTE: 10075ffd83dbSDimitry Andric make<PageZeroSection>(); 10085ffd83dbSDimitry Andric break; 10095ffd83dbSDimitry Andric case MH_DYLIB: 1010e8d8bef9SDimitry Andric case MH_BUNDLE: 10115ffd83dbSDimitry Andric break; 10125ffd83dbSDimitry Andric default: 10135ffd83dbSDimitry Andric llvm_unreachable("unhandled output file type"); 10145ffd83dbSDimitry Andric } 10155ffd83dbSDimitry Andric 1016fe6060f1SDimitry Andric // Then add input sections to output sections. 1017fe6060f1SDimitry Andric for (ConcatInputSection *isec : inputSections) { 1018fe6060f1SDimitry Andric if (isec->shouldOmitFromOutput()) 1019fe6060f1SDimitry Andric continue; 1020fe6060f1SDimitry Andric ConcatOutputSection *osec = cast<ConcatOutputSection>(isec->parent); 1021fe6060f1SDimitry Andric osec->addInput(isec); 1022fe6060f1SDimitry Andric osec->inputOrder = 1023fe6060f1SDimitry Andric std::min(osec->inputOrder, static_cast<int>(isec->outSecOff)); 10245ffd83dbSDimitry Andric } 10255ffd83dbSDimitry Andric 1026fe6060f1SDimitry Andric // Once all the inputs are added, we can finalize the output section 1027fe6060f1SDimitry Andric // properties and create the corresponding output segments. 1028fe6060f1SDimitry Andric for (const auto &it : concatOutputSections) { 10295ffd83dbSDimitry Andric StringRef segname = it.first.first; 1030fe6060f1SDimitry Andric ConcatOutputSection *osec = it.second; 1031fe6060f1SDimitry Andric assert(segname != segment_names::ld); 103281ad6265SDimitry Andric if (osec->isNeeded()) { 103381ad6265SDimitry Andric // See comment in ObjFile::splitEhFrames() 103481ad6265SDimitry Andric if (osec->name == section_names::ehFrame && 103581ad6265SDimitry Andric segname == segment_names::text) 103681ad6265SDimitry Andric osec->align = target->wordSize; 103781ad6265SDimitry Andric 1038bdd1243dSDimitry Andric // MC keeps the default 1-byte alignment for __thread_vars, even though it 1039bdd1243dSDimitry Andric // contains pointers that are fixed up by dyld, which requires proper 1040bdd1243dSDimitry Andric // alignment. 1041bdd1243dSDimitry Andric if (isThreadLocalVariables(osec->flags)) 1042bdd1243dSDimitry Andric osec->align = std::max<uint32_t>(osec->align, target->wordSize); 1043bdd1243dSDimitry Andric 10445ffd83dbSDimitry Andric getOrCreateOutputSegment(segname)->addOutputSection(osec); 10455ffd83dbSDimitry Andric } 104681ad6265SDimitry Andric } 10475ffd83dbSDimitry Andric 10485ffd83dbSDimitry Andric for (SyntheticSection *ssec : syntheticSections) { 1049fe6060f1SDimitry Andric auto it = concatOutputSections.find({ssec->segname, ssec->name}); 1050349cc55cSDimitry Andric // We add all LinkEdit sections here because we don't know if they are 1051349cc55cSDimitry Andric // needed until their finalizeContents() methods get called later. While 1052349cc55cSDimitry Andric // this means that we add some redundant sections to __LINKEDIT, there is 1053349cc55cSDimitry Andric // is no redundancy in the output, as we do not emit section headers for 1054349cc55cSDimitry Andric // any LinkEdit sections. 1055349cc55cSDimitry Andric if (ssec->isNeeded() || ssec->segname == segment_names::linkEdit) { 1056fe6060f1SDimitry Andric if (it == concatOutputSections.end()) { 10575ffd83dbSDimitry Andric getOrCreateOutputSegment(ssec->segname)->addOutputSection(ssec); 10585ffd83dbSDimitry Andric } else { 1059fe6060f1SDimitry Andric fatal("section from " + 1060fe6060f1SDimitry Andric toString(it->second->firstSection()->getFile()) + 10615ffd83dbSDimitry Andric " conflicts with synthetic section " + ssec->segname + "," + 10625ffd83dbSDimitry Andric ssec->name); 10635ffd83dbSDimitry Andric } 10645ffd83dbSDimitry Andric } 10655ffd83dbSDimitry Andric } 10665ffd83dbSDimitry Andric 1067fe6060f1SDimitry Andric // dyld requires __LINKEDIT segment to always exist (even if empty). 1068fe6060f1SDimitry Andric linkEditSegment = getOrCreateOutputSegment(segment_names::linkEdit); 1069fe6060f1SDimitry Andric } 1070fe6060f1SDimitry Andric 1071fe6060f1SDimitry Andric void Writer::finalizeAddresses() { 1072fe6060f1SDimitry Andric TimeTraceScope timeScope("Finalize addresses"); 1073fe6060f1SDimitry Andric uint64_t pageSize = target->getPageSize(); 107481ad6265SDimitry Andric 107581ad6265SDimitry Andric // We could parallelize this loop, but local benchmarking indicates it is 107681ad6265SDimitry Andric // faster to do it all in the main thread. 107781ad6265SDimitry Andric for (OutputSegment *seg : outputSegments) { 107881ad6265SDimitry Andric if (seg == linkEditSegment) 107981ad6265SDimitry Andric continue; 108081ad6265SDimitry Andric for (OutputSection *osec : seg->getSections()) { 108181ad6265SDimitry Andric if (!osec->isNeeded()) 108281ad6265SDimitry Andric continue; 108381ad6265SDimitry Andric // Other kinds of OutputSections have already been finalized. 108406c3fb27SDimitry Andric if (auto *concatOsec = dyn_cast<ConcatOutputSection>(osec)) 108581ad6265SDimitry Andric concatOsec->finalizeContents(); 108681ad6265SDimitry Andric } 108781ad6265SDimitry Andric } 108881ad6265SDimitry Andric 1089fe6060f1SDimitry Andric // Ensure that segments (and the sections they contain) are allocated 1090fe6060f1SDimitry Andric // addresses in ascending order, which dyld requires. 1091fe6060f1SDimitry Andric // 1092fe6060f1SDimitry Andric // Note that at this point, __LINKEDIT sections are empty, but we need to 1093fe6060f1SDimitry Andric // determine addresses of other segments/sections before generating its 1094fe6060f1SDimitry Andric // contents. 1095fe6060f1SDimitry Andric for (OutputSegment *seg : outputSegments) { 1096fe6060f1SDimitry Andric if (seg == linkEditSegment) 1097fe6060f1SDimitry Andric continue; 1098fe6060f1SDimitry Andric seg->addr = addr; 1099fe6060f1SDimitry Andric assignAddresses(seg); 1100fe6060f1SDimitry Andric // codesign / libstuff checks for segment ordering by verifying that 110106c3fb27SDimitry Andric // `fileOff + fileSize == next segment fileOff`. So we call 110206c3fb27SDimitry Andric // alignToPowerOf2() before (instead of after) computing fileSize to ensure 110306c3fb27SDimitry Andric // that the segments are contiguous. We handle addr / vmSize similarly for 110406c3fb27SDimitry Andric // the same reason. 1105bdd1243dSDimitry Andric fileOff = alignToPowerOf2(fileOff, pageSize); 1106bdd1243dSDimitry Andric addr = alignToPowerOf2(addr, pageSize); 1107fe6060f1SDimitry Andric seg->vmSize = addr - seg->addr; 1108fe6060f1SDimitry Andric seg->fileSize = fileOff - seg->fileOff; 1109fe6060f1SDimitry Andric seg->assignAddressesToStartEndSymbols(); 1110fe6060f1SDimitry Andric } 1111fe6060f1SDimitry Andric } 1112fe6060f1SDimitry Andric 1113fe6060f1SDimitry Andric void Writer::finalizeLinkEditSegment() { 1114fe6060f1SDimitry Andric TimeTraceScope timeScope("Finalize __LINKEDIT segment"); 1115fe6060f1SDimitry Andric // Fill __LINKEDIT contents. 1116bdd1243dSDimitry Andric std::array<LinkEditSection *, 10> linkEditSections{ 1117bdd1243dSDimitry Andric in.rebase, in.binding, 1118bdd1243dSDimitry Andric in.weakBinding, in.lazyBinding, 1119bdd1243dSDimitry Andric in.exports, in.chainedFixups, 1120bdd1243dSDimitry Andric symtabSection, indirectSymtabSection, 1121bdd1243dSDimitry Andric dataInCodeSection, functionStartsSection, 1122fe6060f1SDimitry Andric }; 1123*0fca6ea1SDimitry Andric 1124*0fca6ea1SDimitry Andric parallelForEach(linkEditSections.begin(), linkEditSections.end(), 1125*0fca6ea1SDimitry Andric [](LinkEditSection *osec) { 1126fe6060f1SDimitry Andric if (osec) 1127*0fca6ea1SDimitry Andric osec->finalizeContents(); 1128*0fca6ea1SDimitry Andric }); 1129fe6060f1SDimitry Andric 1130fe6060f1SDimitry Andric // Now that __LINKEDIT is filled out, do a proper calculation of its 1131fe6060f1SDimitry Andric // addresses and offsets. 1132fe6060f1SDimitry Andric linkEditSegment->addr = addr; 1133fe6060f1SDimitry Andric assignAddresses(linkEditSegment); 1134fe6060f1SDimitry Andric // No need to page-align fileOff / addr here since this is the last segment. 1135fe6060f1SDimitry Andric linkEditSegment->vmSize = addr - linkEditSegment->addr; 1136fe6060f1SDimitry Andric linkEditSegment->fileSize = fileOff - linkEditSegment->fileOff; 1137fe6060f1SDimitry Andric } 1138fe6060f1SDimitry Andric 11395ffd83dbSDimitry Andric void Writer::assignAddresses(OutputSegment *seg) { 11405ffd83dbSDimitry Andric seg->fileOff = fileOff; 11415ffd83dbSDimitry Andric 1142fe6060f1SDimitry Andric for (OutputSection *osec : seg->getSections()) { 1143e8d8bef9SDimitry Andric if (!osec->isNeeded()) 1144e8d8bef9SDimitry Andric continue; 114506c3fb27SDimitry Andric addr = alignToPowerOf2(addr, osec->align); 114606c3fb27SDimitry Andric fileOff = alignToPowerOf2(fileOff, osec->align); 11475ffd83dbSDimitry Andric osec->addr = addr; 11485ffd83dbSDimitry Andric osec->fileOff = isZeroFill(osec->flags) ? 0 : fileOff; 11495ffd83dbSDimitry Andric osec->finalize(); 1150fe6060f1SDimitry Andric osec->assignAddressesToStartEndSymbols(); 11515ffd83dbSDimitry Andric 11525ffd83dbSDimitry Andric addr += osec->getSize(); 11535ffd83dbSDimitry Andric fileOff += osec->getFileSize(); 11545ffd83dbSDimitry Andric } 11555ffd83dbSDimitry Andric } 11565ffd83dbSDimitry Andric 11575ffd83dbSDimitry Andric void Writer::openFile() { 11585ffd83dbSDimitry Andric Expected<std::unique_ptr<FileOutputBuffer>> bufferOrErr = 11595ffd83dbSDimitry Andric FileOutputBuffer::create(config->outputFile, fileOff, 11605ffd83dbSDimitry Andric FileOutputBuffer::F_executable); 11615ffd83dbSDimitry Andric 11625ffd83dbSDimitry Andric if (!bufferOrErr) 116381ad6265SDimitry Andric fatal("failed to open " + config->outputFile + ": " + 11645ffd83dbSDimitry Andric llvm::toString(bufferOrErr.takeError())); 11655ffd83dbSDimitry Andric buffer = std::move(*bufferOrErr); 116681ad6265SDimitry Andric in.bufferStart = buffer->getBufferStart(); 11675ffd83dbSDimitry Andric } 11685ffd83dbSDimitry Andric 11695ffd83dbSDimitry Andric void Writer::writeSections() { 1170*0fca6ea1SDimitry Andric TimeTraceScope timeScope("Write output sections"); 1171*0fca6ea1SDimitry Andric 11725ffd83dbSDimitry Andric uint8_t *buf = buffer->getBufferStart(); 117381ad6265SDimitry Andric std::vector<const OutputSection *> osecs; 1174fe6060f1SDimitry Andric for (const OutputSegment *seg : outputSegments) 117581ad6265SDimitry Andric append_range(osecs, seg->getSections()); 117681ad6265SDimitry Andric 117781ad6265SDimitry Andric parallelForEach(osecs.begin(), osecs.end(), [&](const OutputSection *osec) { 11785ffd83dbSDimitry Andric osec->writeTo(buf + osec->fileOff); 117981ad6265SDimitry Andric }); 11805ffd83dbSDimitry Andric } 11815ffd83dbSDimitry Andric 1182bdd1243dSDimitry Andric void Writer::applyOptimizationHints() { 1183bdd1243dSDimitry Andric if (config->arch() != AK_arm64 || config->ignoreOptimizationHints) 1184bdd1243dSDimitry Andric return; 1185bdd1243dSDimitry Andric 1186bdd1243dSDimitry Andric uint8_t *buf = buffer->getBufferStart(); 1187bdd1243dSDimitry Andric TimeTraceScope timeScope("Apply linker optimization hints"); 1188bdd1243dSDimitry Andric parallelForEach(inputFiles, [buf](const InputFile *file) { 1189bdd1243dSDimitry Andric if (const auto *objFile = dyn_cast<ObjFile>(file)) 1190bdd1243dSDimitry Andric target->applyOptimizationHints(buf, *objFile); 1191bdd1243dSDimitry Andric }); 1192bdd1243dSDimitry Andric } 1193bdd1243dSDimitry Andric 1194fe6060f1SDimitry Andric // In order to utilize multiple cores, we first split the buffer into chunks, 1195fe6060f1SDimitry Andric // compute a hash for each chunk, and then compute a hash value of the hash 1196fe6060f1SDimitry Andric // values. 1197e8d8bef9SDimitry Andric void Writer::writeUuid() { 1198fe6060f1SDimitry Andric TimeTraceScope timeScope("Computing UUID"); 11990eae32dcSDimitry Andric 1200fe6060f1SDimitry Andric ArrayRef<uint8_t> data{buffer->getBufferStart(), buffer->getBufferEnd()}; 120106c3fb27SDimitry Andric std::vector<ArrayRef<uint8_t>> chunks = split(data, 1024 * 1024); 1202*0fca6ea1SDimitry Andric 120381ad6265SDimitry Andric // Leave one slot for filename 120481ad6265SDimitry Andric std::vector<uint64_t> hashes(chunks.size() + 1); 1205*0fca6ea1SDimitry Andric parallelFor(0, chunks.size(), 1206*0fca6ea1SDimitry Andric [&](size_t i) { hashes[i] = xxh3_64bits(chunks[i]); }); 120781ad6265SDimitry Andric // Append the output filename so that identical binaries with different names 120881ad6265SDimitry Andric // don't get the same UUID. 120906c3fb27SDimitry Andric hashes[chunks.size()] = xxh3_64bits(sys::path::filename(config->finalOutput)); 1210*0fca6ea1SDimitry Andric 121106c3fb27SDimitry Andric uint64_t digest = xxh3_64bits({reinterpret_cast<uint8_t *>(hashes.data()), 1212fe6060f1SDimitry Andric hashes.size() * sizeof(uint64_t)}); 1213e8d8bef9SDimitry Andric uuidCommand->writeUuid(digest); 1214e8d8bef9SDimitry Andric } 1215e8d8bef9SDimitry Andric 1216bdd1243dSDimitry Andric // This is step 5 of the algorithm described in the class comment of 1217bdd1243dSDimitry Andric // ChainedFixupsSection. 1218bdd1243dSDimitry Andric void Writer::buildFixupChains() { 1219bdd1243dSDimitry Andric if (!config->emitChainedFixups) 1220bdd1243dSDimitry Andric return; 1221bdd1243dSDimitry Andric 1222bdd1243dSDimitry Andric const std::vector<Location> &loc = in.chainedFixups->getLocations(); 1223bdd1243dSDimitry Andric if (loc.empty()) 1224bdd1243dSDimitry Andric return; 1225bdd1243dSDimitry Andric 1226bdd1243dSDimitry Andric TimeTraceScope timeScope("Build fixup chains"); 1227bdd1243dSDimitry Andric 1228bdd1243dSDimitry Andric const uint64_t pageSize = target->getPageSize(); 1229bdd1243dSDimitry Andric constexpr uint32_t stride = 4; // for DYLD_CHAINED_PTR_64 1230bdd1243dSDimitry Andric 1231bdd1243dSDimitry Andric for (size_t i = 0, count = loc.size(); i < count;) { 1232bdd1243dSDimitry Andric const OutputSegment *oseg = loc[i].isec->parent->parent; 1233bdd1243dSDimitry Andric uint8_t *buf = buffer->getBufferStart() + oseg->fileOff; 1234bdd1243dSDimitry Andric uint64_t pageIdx = loc[i].offset / pageSize; 1235bdd1243dSDimitry Andric ++i; 1236bdd1243dSDimitry Andric 1237bdd1243dSDimitry Andric while (i < count && loc[i].isec->parent->parent == oseg && 1238bdd1243dSDimitry Andric (loc[i].offset / pageSize) == pageIdx) { 1239bdd1243dSDimitry Andric uint64_t offset = loc[i].offset - loc[i - 1].offset; 1240bdd1243dSDimitry Andric 1241bdd1243dSDimitry Andric auto fail = [&](Twine message) { 1242bdd1243dSDimitry Andric error(loc[i].isec->getSegName() + "," + loc[i].isec->getName() + 1243bdd1243dSDimitry Andric ", offset " + 1244bdd1243dSDimitry Andric Twine(loc[i].offset - loc[i].isec->parent->getSegmentOffset()) + 1245bdd1243dSDimitry Andric ": " + message); 1246bdd1243dSDimitry Andric }; 1247bdd1243dSDimitry Andric 1248bdd1243dSDimitry Andric if (offset < target->wordSize) 1249bdd1243dSDimitry Andric return fail("fixups overlap"); 1250bdd1243dSDimitry Andric if (offset % stride != 0) 1251bdd1243dSDimitry Andric return fail( 1252bdd1243dSDimitry Andric "fixups are unaligned (offset " + Twine(offset) + 1253bdd1243dSDimitry Andric " is not a multiple of the stride). Re-link with -no_fixup_chains"); 1254bdd1243dSDimitry Andric 1255bdd1243dSDimitry Andric // The "next" field is in the same location for bind and rebase entries. 1256bdd1243dSDimitry Andric reinterpret_cast<dyld_chained_ptr_64_bind *>(buf + loc[i - 1].offset) 1257bdd1243dSDimitry Andric ->next = offset / stride; 1258bdd1243dSDimitry Andric ++i; 1259bdd1243dSDimitry Andric } 1260bdd1243dSDimitry Andric } 1261bdd1243dSDimitry Andric } 1262bdd1243dSDimitry Andric 1263fe6060f1SDimitry Andric void Writer::writeCodeSignature() { 126481ad6265SDimitry Andric if (codeSignatureSection) { 126581ad6265SDimitry Andric TimeTraceScope timeScope("Write code signature"); 1266fe6060f1SDimitry Andric codeSignatureSection->writeHashes(buffer->getBufferStart()); 1267fe6060f1SDimitry Andric } 126881ad6265SDimitry Andric } 12695ffd83dbSDimitry Andric 1270fe6060f1SDimitry Andric void Writer::writeOutputFile() { 1271fe6060f1SDimitry Andric TimeTraceScope timeScope("Write output file"); 12725ffd83dbSDimitry Andric openFile(); 127381ad6265SDimitry Andric reportPendingUndefinedSymbols(); 12745ffd83dbSDimitry Andric if (errorCount()) 12755ffd83dbSDimitry Andric return; 12765ffd83dbSDimitry Andric writeSections(); 1277bdd1243dSDimitry Andric applyOptimizationHints(); 1278bdd1243dSDimitry Andric buildFixupChains(); 127906c3fb27SDimitry Andric if (config->generateUuid) 1280e8d8bef9SDimitry Andric writeUuid(); 1281fe6060f1SDimitry Andric writeCodeSignature(); 12825ffd83dbSDimitry Andric 12835ffd83dbSDimitry Andric if (auto e = buffer->commit()) 1284bdd1243dSDimitry Andric fatal("failed to write output '" + buffer->getPath() + 1285bdd1243dSDimitry Andric "': " + toString(std::move(e))); 12865ffd83dbSDimitry Andric } 12875ffd83dbSDimitry Andric 1288fe6060f1SDimitry Andric template <class LP> void Writer::run() { 1289fe6060f1SDimitry Andric treatSpecialUndefineds(); 1290bdd1243dSDimitry Andric if (config->entry && needsBinding(config->entry)) 1291bdd1243dSDimitry Andric in.stubs->addEntry(config->entry); 12921fd87a68SDimitry Andric 1293349cc55cSDimitry Andric // Canonicalization of all pointers to InputSections should be handled by 12941fd87a68SDimitry Andric // these two scan* methods. I.e. from this point onward, for all live 12951fd87a68SDimitry Andric // InputSections, we should have `isec->canonical() == isec`. 1296349cc55cSDimitry Andric scanSymbols(); 1297bdd1243dSDimitry Andric if (in.objcStubs->isNeeded()) 1298bdd1243dSDimitry Andric in.objcStubs->setUp(); 1299*0fca6ea1SDimitry Andric if (in.objcMethList->isNeeded()) 1300*0fca6ea1SDimitry Andric in.objcMethList->setUp(); 1301fe6060f1SDimitry Andric scanRelocations(); 1302bdd1243dSDimitry Andric if (in.initOffsets->isNeeded()) 1303bdd1243dSDimitry Andric in.initOffsets->setUp(); 1304349cc55cSDimitry Andric 1305bdd1243dSDimitry Andric // Do not proceed if there were undefined or duplicate symbols. 130681ad6265SDimitry Andric reportPendingUndefinedSymbols(); 1307bdd1243dSDimitry Andric reportPendingDuplicateSymbols(); 1308349cc55cSDimitry Andric if (errorCount()) 1309349cc55cSDimitry Andric return; 1310349cc55cSDimitry Andric 1311bdd1243dSDimitry Andric if (in.stubHelper && in.stubHelper->isNeeded()) 1312bdd1243dSDimitry Andric in.stubHelper->setUp(); 1313fcaf7f86SDimitry Andric 1314fcaf7f86SDimitry Andric if (in.objCImageInfo->isNeeded()) 1315fcaf7f86SDimitry Andric in.objCImageInfo->finalizeContents(); 1316fcaf7f86SDimitry Andric 13171fd87a68SDimitry Andric // At this point, we should know exactly which output sections are needed, 13181fd87a68SDimitry Andric // courtesy of scanSymbols() and scanRelocations(). 1319fe6060f1SDimitry Andric createOutputSections<LP>(); 1320349cc55cSDimitry Andric 1321fe6060f1SDimitry Andric // After this point, we create no new segments; HOWEVER, we might 1322fe6060f1SDimitry Andric // yet create branch-range extension thunks for architectures whose 1323fe6060f1SDimitry Andric // hardware call instructions have limited range, e.g., ARM(64). 1324fe6060f1SDimitry Andric // The thunks are created as InputSections interspersed among 1325fe6060f1SDimitry Andric // the ordinary __TEXT,_text InputSections. 1326fe6060f1SDimitry Andric sortSegmentsAndSections(); 1327fe6060f1SDimitry Andric createLoadCommands<LP>(); 1328fe6060f1SDimitry Andric finalizeAddresses(); 1329*0fca6ea1SDimitry Andric 1330*0fca6ea1SDimitry Andric llvm::thread mapFileWriter([&] { 133104eeddc0SDimitry Andric if (LLVM_ENABLE_THREADS && config->timeTraceEnabled) 133204eeddc0SDimitry Andric timeTraceProfilerInitialize(config->timeTraceGranularity, "writeMapFile"); 133304eeddc0SDimitry Andric writeMapFile(); 133404eeddc0SDimitry Andric if (LLVM_ENABLE_THREADS && config->timeTraceEnabled) 133504eeddc0SDimitry Andric timeTraceProfilerFinishThread(); 133604eeddc0SDimitry Andric }); 1337*0fca6ea1SDimitry Andric 1338fe6060f1SDimitry Andric finalizeLinkEditSegment(); 1339fe6060f1SDimitry Andric writeOutputFile(); 1340*0fca6ea1SDimitry Andric mapFileWriter.join(); 1341fe6060f1SDimitry Andric } 1342fe6060f1SDimitry Andric 1343fe6060f1SDimitry Andric template <class LP> void macho::writeResult() { Writer().run<LP>(); } 13445ffd83dbSDimitry Andric 1345349cc55cSDimitry Andric void macho::resetWriter() { LCDylib::resetInstanceCount(); } 1346349cc55cSDimitry Andric 13475ffd83dbSDimitry Andric void macho::createSyntheticSections() { 1348e8d8bef9SDimitry Andric in.header = make<MachHeaderSection>(); 1349bdd1243dSDimitry Andric if (config->dedupStrings) 1350bdd1243dSDimitry Andric in.cStringSection = 1351bdd1243dSDimitry Andric make<DeduplicatedCStringSection>(section_names::cString); 13521fd87a68SDimitry Andric else 1353bdd1243dSDimitry Andric in.cStringSection = make<CStringSection>(section_names::cString); 1354bdd1243dSDimitry Andric in.objcMethnameSection = 1355bdd1243dSDimitry Andric make<DeduplicatedCStringSection>(section_names::objcMethname); 1356bdd1243dSDimitry Andric in.wordLiteralSection = make<WordLiteralSection>(); 1357bdd1243dSDimitry Andric if (config->emitChainedFixups) { 1358bdd1243dSDimitry Andric in.chainedFixups = make<ChainedFixupsSection>(); 1359bdd1243dSDimitry Andric } else { 1360e8d8bef9SDimitry Andric in.rebase = make<RebaseSection>(); 13615ffd83dbSDimitry Andric in.binding = make<BindingSection>(); 1362e8d8bef9SDimitry Andric in.weakBinding = make<WeakBindingSection>(); 1363e8d8bef9SDimitry Andric in.lazyBinding = make<LazyBindingSection>(); 1364bdd1243dSDimitry Andric in.lazyPointers = make<LazyPointerSection>(); 1365bdd1243dSDimitry Andric in.stubHelper = make<StubHelperSection>(); 1366bdd1243dSDimitry Andric } 1367e8d8bef9SDimitry Andric in.exports = make<ExportSection>(); 13685ffd83dbSDimitry Andric in.got = make<GotSection>(); 1369e8d8bef9SDimitry Andric in.tlvPointers = make<TlvPointerSection>(); 13705ffd83dbSDimitry Andric in.stubs = make<StubsSection>(); 1371bdd1243dSDimitry Andric in.objcStubs = make<ObjCStubsSection>(); 1372fe6060f1SDimitry Andric in.unwindInfo = makeUnwindInfoSection(); 1373fcaf7f86SDimitry Andric in.objCImageInfo = make<ObjCImageInfoSection>(); 1374bdd1243dSDimitry Andric in.initOffsets = make<InitOffsetsSection>(); 1375*0fca6ea1SDimitry Andric in.objcMethList = make<ObjCMethListSection>(); 1376fe6060f1SDimitry Andric 1377fe6060f1SDimitry Andric // This section contains space for just a single word, and will be used by 1378fe6060f1SDimitry Andric // dyld to cache an address to the image loader it uses. 137904eeddc0SDimitry Andric uint8_t *arr = bAlloc().Allocate<uint8_t>(target->wordSize); 1380fe6060f1SDimitry Andric memset(arr, 0, target->wordSize); 138181ad6265SDimitry Andric in.imageLoaderCache = makeSyntheticInputSection( 138281ad6265SDimitry Andric segment_names::data, section_names::data, S_REGULAR, 1383fe6060f1SDimitry Andric ArrayRef<uint8_t>{arr, target->wordSize}, 138481ad6265SDimitry Andric /*align=*/target->wordSize); 1385*0fca6ea1SDimitry Andric assert(in.imageLoaderCache->live); 13865ffd83dbSDimitry Andric } 1387e8d8bef9SDimitry Andric 1388e8d8bef9SDimitry Andric OutputSection *macho::firstTLVDataSection = nullptr; 1389fe6060f1SDimitry Andric 1390fe6060f1SDimitry Andric template void macho::writeResult<LP64>(); 1391fe6060f1SDimitry Andric template void macho::writeResult<ILP32>(); 1392