diff --git a/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp b/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp --- a/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp +++ b/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp @@ -235,37 +235,44 @@ "Incorrect tail offset"); Offset = std::max(Offset, HeaderSize + O.Header.SizeOfCmds); - // The order of LINKEDIT elements is as follows: - // rebase info, binding info, weak binding info, lazy binding info, export - // trie, data-in-code, symbol table, indirect symbol table, symbol table - // strings, code signature. uint64_t NListSize = Is64Bit ? sizeof(MachO::nlist_64) : sizeof(MachO::nlist); uint64_t StartOfLinkEdit = Offset; - uint64_t StartOfRebaseInfo = StartOfLinkEdit; - uint64_t StartOfBindingInfo = StartOfRebaseInfo + O.Rebases.Opcodes.size(); - uint64_t StartOfWeakBindingInfo = StartOfBindingInfo + O.Binds.Opcodes.size(); + + // The order of LINKEDIT elements is as follows: + // rebase info, binding info, weak binding info, lazy binding info, export + // trie, chained fixups, dyld exports trie, function starts, data-in-code, + // symbol table, indirect symbol table, symbol table strings, + // and code signature. + auto linkEditUpdateOffset = [&Offset](uint32_t size) { + uint64_t previousOffset = Offset; + Offset += size; + return previousOffset; + }; + + uint64_t StartOfRebaseInfo = linkEditUpdateOffset(O.Rebases.Opcodes.size()); + uint64_t StartOfBindingInfo = linkEditUpdateOffset(O.Binds.Opcodes.size()); + uint64_t StartOfWeakBindingInfo = + linkEditUpdateOffset(O.WeakBinds.Opcodes.size()); uint64_t StartOfLazyBindingInfo = - StartOfWeakBindingInfo + O.WeakBinds.Opcodes.size(); - uint64_t StartOfExportTrie = - StartOfLazyBindingInfo + O.LazyBinds.Opcodes.size(); - uint64_t StartOfFunctionStarts = StartOfExportTrie + O.Exports.Trie.size(); - uint64_t StartOfDyldExportsTrie = - StartOfFunctionStarts + O.FunctionStarts.Data.size(); + linkEditUpdateOffset(O.LazyBinds.Opcodes.size()); + uint64_t StartOfExportTrie = linkEditUpdateOffset(O.Exports.Trie.size()); uint64_t StartOfChainedFixups = - StartOfDyldExportsTrie + O.ExportsTrie.Data.size(); - uint64_t StartOfDataInCode = - StartOfChainedFixups + O.ChainedFixups.Data.size(); + linkEditUpdateOffset(O.ChainedFixups.Data.size()); + uint64_t StartOfDyldExportsTrie = + linkEditUpdateOffset(O.ExportsTrie.Data.size()); + uint64_t StartOfFunctionStarts = + linkEditUpdateOffset(O.FunctionStarts.Data.size()); + uint64_t StartOfDataInCode = linkEditUpdateOffset(O.DataInCode.Data.size()); uint64_t StartOfLinkerOptimizationHint = - StartOfDataInCode + O.DataInCode.Data.size(); + linkEditUpdateOffset(O.LinkerOptimizationHint.Data.size()); uint64_t StartOfSymbols = - StartOfLinkerOptimizationHint + O.LinkerOptimizationHint.Data.size(); - uint64_t StartOfIndirectSymbols = - StartOfSymbols + NListSize * O.SymTable.Symbols.size(); + linkEditUpdateOffset(NListSize * O.SymTable.Symbols.size()); + uint64_t StartOfIndirectSymbols = linkEditUpdateOffset( + sizeof(uint32_t) * O.IndirectSymTable.Symbols.size()); uint64_t StartOfSymbolStrings = - StartOfIndirectSymbols + - sizeof(uint32_t) * O.IndirectSymTable.Symbols.size(); - uint64_t StartOfCodeSignature = - StartOfSymbolStrings + StrTableBuilder.getSize(); + linkEditUpdateOffset(StrTableBuilder.getSize()); + + uint64_t StartOfCodeSignature = Offset; uint32_t CodeSignatureSize = 0; if (O.CodeSignatureCommandIndex) { StartOfCodeSignature = alignTo(StartOfCodeSignature, 16);