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 @@ -238,7 +238,7 @@ // 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. + // strings, dylib codesign drs, code signature. uint64_t NListSize = Is64Bit ? sizeof(MachO::nlist_64) : sizeof(MachO::nlist); uint64_t StartOfLinkEdit = Offset; uint64_t StartOfRebaseInfo = StartOfLinkEdit; @@ -264,8 +264,10 @@ uint64_t StartOfSymbolStrings = StartOfIndirectSymbols + sizeof(uint32_t) * O.IndirectSymTable.Symbols.size(); - uint64_t StartOfCodeSignature = + uint64_t StartOfDylibCodeSignDRs = StartOfSymbolStrings + StrTableBuilder.getSize(); + uint64_t StartOfCodeSignature = + StartOfDylibCodeSignDRs + O.DylibCodeSignDRs.Data.size(); uint32_t CodeSignatureSize = 0; if (O.CodeSignatureCommandIndex) { StartOfCodeSignature = alignTo(StartOfCodeSignature, 16); @@ -320,6 +322,10 @@ MLC.linkedit_data_command_data.dataoff = StartOfCodeSignature; MLC.linkedit_data_command_data.datasize = CodeSignatureSize; break; + case MachO::LC_DYLIB_CODE_SIGN_DRS: + MLC.linkedit_data_command_data.dataoff = StartOfDylibCodeSignDRs; + MLC.linkedit_data_command_data.datasize = O.DylibCodeSignDRs.Data.size(); + break; case MachO::LC_SYMTAB: MLC.symtab_command_data.symoff = StartOfSymbols; MLC.symtab_command_data.nsyms = O.SymTable.Symbols.size(); diff --git a/llvm/lib/ObjCopy/MachO/MachOObject.h b/llvm/lib/ObjCopy/MachO/MachOObject.h --- a/llvm/lib/ObjCopy/MachO/MachOObject.h +++ b/llvm/lib/ObjCopy/MachO/MachOObject.h @@ -317,11 +317,14 @@ LinkData FunctionStarts; LinkData ExportsTrie; LinkData ChainedFixups; + LinkData DylibCodeSignDRs; Optional SwiftVersion; /// The index of LC_CODE_SIGNATURE load command if present. Optional CodeSignatureCommandIndex; + /// The index of LC_DYLIB_CODE_SIGN_DRS load command if present. + Optional DylibCodeSignDRsIndex; /// The index of LC_SYMTAB load command if present. Optional SymTabCommandIndex; /// The index of LC_DYLD_INFO or LC_DYLD_INFO_ONLY load command if present. diff --git a/llvm/lib/ObjCopy/MachO/MachOObject.cpp b/llvm/lib/ObjCopy/MachO/MachOObject.cpp --- a/llvm/lib/ObjCopy/MachO/MachOObject.cpp +++ b/llvm/lib/ObjCopy/MachO/MachOObject.cpp @@ -66,6 +66,9 @@ case MachO::LC_FUNCTION_STARTS: FunctionStartsCommandIndex = Index; break; + case MachO::LC_DYLIB_CODE_SIGN_DRS: + DylibCodeSignDRsIndex = Index; + break; case MachO::LC_DYLD_CHAINED_FIXUPS: ChainedFixupsCommandIndex = Index; break; diff --git a/llvm/lib/ObjCopy/MachO/MachOReader.h b/llvm/lib/ObjCopy/MachO/MachOReader.h --- a/llvm/lib/ObjCopy/MachO/MachOReader.h +++ b/llvm/lib/ObjCopy/MachO/MachOReader.h @@ -44,6 +44,7 @@ void readDataInCodeData(Object &O) const; void readLinkerOptimizationHint(Object &O) const; void readFunctionStartsData(Object &O) const; + void readDylibCodeSignDRs(Object &O) const; void readExportsTrie(Object &O) const; void readChainedFixups(Object &O) const; void readIndirectSymbolTable(Object &O) const; diff --git a/llvm/lib/ObjCopy/MachO/MachOReader.cpp b/llvm/lib/ObjCopy/MachO/MachOReader.cpp --- a/llvm/lib/ObjCopy/MachO/MachOReader.cpp +++ b/llvm/lib/ObjCopy/MachO/MachOReader.cpp @@ -174,6 +174,9 @@ case MachO::LC_FUNCTION_STARTS: O.FunctionStartsCommandIndex = O.LoadCommands.size(); break; + case MachO::LC_DYLIB_CODE_SIGN_DRS: + O.DylibCodeSignDRsIndex = O.LoadCommands.size(); + break; case MachO::LC_DYLD_EXPORTS_TRIE: O.ExportsTrieCommandIndex = O.LoadCommands.size(); break; @@ -307,6 +310,10 @@ return readLinkData(O, O.FunctionStartsCommandIndex, O.FunctionStarts); } +void MachOReader::readDylibCodeSignDRs(Object &O) const { + return readLinkData(O, O.DylibCodeSignDRsIndex, O.DylibCodeSignDRs); +} + void MachOReader::readExportsTrie(Object &O) const { return readLinkData(O, O.ExportsTrieCommandIndex, O.ExportsTrie); } @@ -366,6 +373,7 @@ readDataInCodeData(*Obj); readLinkerOptimizationHint(*Obj); readFunctionStartsData(*Obj); + readDylibCodeSignDRs(*Obj); readExportsTrie(*Obj); readChainedFixups(*Obj); readIndirectSymbolTable(*Obj); diff --git a/llvm/lib/ObjCopy/MachO/MachOWriter.h b/llvm/lib/ObjCopy/MachO/MachOWriter.h --- a/llvm/lib/ObjCopy/MachO/MachOWriter.h +++ b/llvm/lib/ObjCopy/MachO/MachOWriter.h @@ -53,6 +53,7 @@ void writeDataInCodeData(); void writeLinkerOptimizationHint(); void writeFunctionStartsData(); + void writeDylibCodeSignDRsData(); void writeChainedFixupsData(); void writeExportsTrieData(); void writeTail(); diff --git a/llvm/lib/ObjCopy/MachO/MachOWriter.cpp b/llvm/lib/ObjCopy/MachO/MachOWriter.cpp --- a/llvm/lib/ObjCopy/MachO/MachOWriter.cpp +++ b/llvm/lib/ObjCopy/MachO/MachOWriter.cpp @@ -95,9 +95,10 @@ } for (Optional LinkEditDataCommandIndex : - {O.CodeSignatureCommandIndex, O.DataInCodeCommandIndex, - O.LinkerOptimizationHintCommandIndex, O.FunctionStartsCommandIndex, - O.ChainedFixupsCommandIndex, O.ExportsTrieCommandIndex}) + {O.CodeSignatureCommandIndex, O.DylibCodeSignDRsIndex, + O.DataInCodeCommandIndex, O.LinkerOptimizationHintCommandIndex, + O.FunctionStartsCommandIndex, O.ChainedFixupsCommandIndex, + O.ExportsTrieCommandIndex}) if (LinkEditDataCommandIndex) { const MachO::linkedit_data_command &LinkEditDataCommand = O.LoadCommands[*LinkEditDataCommandIndex] @@ -559,6 +560,10 @@ return writeLinkData(O.FunctionStartsCommandIndex, O.FunctionStarts); } +void MachOWriter::writeDylibCodeSignDRsData() { + return writeLinkData(O.DylibCodeSignDRsIndex, O.DylibCodeSignDRs); +} + void MachOWriter::writeChainedFixupsData() { return writeLinkData(O.ChainedFixupsCommandIndex, O.ChainedFixups); } @@ -615,6 +620,7 @@ std::initializer_list, WriteHandlerType>> LinkEditDataCommandWriters = { {O.CodeSignatureCommandIndex, &MachOWriter::writeCodeSignatureData}, + {O.DylibCodeSignDRsIndex, &MachOWriter::writeDylibCodeSignDRsData}, {O.DataInCodeCommandIndex, &MachOWriter::writeDataInCodeData}, {O.LinkerOptimizationHintCommandIndex, &MachOWriter::writeLinkerOptimizationHint}, diff --git a/llvm/test/tools/llvm-objcopy/MachO/Inputs/strip-all-with-codesignature.yaml b/llvm/test/tools/llvm-objcopy/MachO/Inputs/strip-all-with-codesignature.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/Inputs/strip-all-with-codesignature.yaml @@ -0,0 +1,361 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x1000007 + cpusubtype: 0x80000003 + filetype: 0x2 + ncmds: 17 + sizeofcmds: 1312 + flags: 0x200085 + reserved: 0x0 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 72 + segname: __PAGEZERO + vmaddr: 0 + vmsize: 4294967296 + fileoff: 0 + filesize: 0 + maxprot: 0 + initprot: 0 + nsects: 0 + flags: 0 + - cmd: LC_SEGMENT_64 + cmdsize: 552 + segname: __TEXT + vmaddr: 4294967296 + vmsize: 4096 + fileoff: 0 + filesize: 4096 + maxprot: 7 + initprot: 5 + nsects: 6 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x100000F30 + size: 59 + offset: 0xF30 + align: 4 + reloff: 0x0 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 554889E54883EC20488D054F000000C745FC00000000897DF8488975F0488955E84889C7B000E811000000B9000000008945E489C84883C4205DC3 + - sectname: __stubs + segname: __TEXT + addr: 0x100000F6C + size: 6 + offset: 0xF6C + align: 1 + reloff: 0x0 + nreloc: 0 + flags: 0x80000408 + reserved1: 0x0 + reserved2: 0x6 + reserved3: 0x0 + content: FF259E000000 + - sectname: __stub_helper + segname: __TEXT + addr: 0x100000F74 + size: 26 + offset: 0xF74 + align: 2 + reloff: 0x0 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 4C8D1D8D0000004153FF257D000000906800000000E9E6FFFFFF + - sectname: __cstring + segname: __TEXT + addr: 0x100000F8E + size: 13 + offset: 0xF8E + align: 0 + reloff: 0x0 + nreloc: 0 + flags: 0x2 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 48656C6C6F20776F726C640A00 + - sectname: __unwind_info + segname: __TEXT + addr: 0x100000F9B + size: 72 + offset: 0xF9B + align: 0 + reloff: 0x0 + nreloc: 0 + flags: 0x0 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 010000001C000000000000001C000000000000001C00000002000000300F000034000000340000006C0F00000000000034000000030000000C000100100001000000000000000001 + - sectname: __eh_frame + segname: __TEXT + addr: 0x100000FE8 + size: 24 + offset: 0xFE8 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x0 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 1400000000000000017A520001781001100C070890010000 + - cmd: LC_SEGMENT_64 + cmdsize: 232 + segname: __DATA + vmaddr: 4294971392 + vmsize: 4096 + fileoff: 4096 + filesize: 4096 + maxprot: 7 + initprot: 3 + nsects: 2 + flags: 0 + Sections: + - sectname: __nl_symbol_ptr + segname: __DATA + addr: 0x100001000 + size: 16 + offset: 0x1000 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x6 + reserved1: 0x1 + reserved2: 0x0 + reserved3: 0x0 + content: '00000000000000000000000000000000' + - sectname: __la_symbol_ptr + segname: __DATA + addr: 0x100001010 + size: 8 + offset: 0x1010 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x7 + reserved1: 0x3 + reserved2: 0x0 + reserved3: 0x0 + content: 840F000001000000 + - cmd: LC_SEGMENT_64 + cmdsize: 72 + segname: __LINKEDIT + vmaddr: 4294975488 + vmsize: 32768 + fileoff: 8192 + filesize: 18960 + maxprot: 7 + initprot: 1 + nsects: 0 + flags: 0 + - cmd: LC_DYLD_INFO_ONLY + cmdsize: 48 + rebase_off: 8192 + rebase_size: 8 + bind_off: 8200 + bind_size: 24 + weak_bind_off: 0 + weak_bind_size: 0 + lazy_bind_off: 8224 + lazy_bind_size: 16 + export_off: 8240 + export_size: 48 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 8360 + nsyms: 4 + stroff: 8440 + strsize: 56 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 0 + iextdefsym: 0 + nextdefsym: 2 + iundefsym: 2 + nundefsym: 2 + tocoff: 0 + ntoc: 0 + modtaboff: 0 + nmodtab: 0 + extrefsymoff: 0 + nextrefsyms: 0 + indirectsymoff: 8424 + nindirectsyms: 4 + extreloff: 0 + nextrel: 0 + locreloff: 0 + nlocrel: 0 + - cmd: LC_LOAD_DYLINKER + cmdsize: 32 + name: 12 + Content: '/usr/lib/dyld' + ZeroPadBytes: 7 + - cmd: LC_UUID + cmdsize: 24 + uuid: 65C2DD41-79B0-3B34-871B-8CB3446AB762 + - cmd: LC_VERSION_MIN_MACOSX + cmdsize: 16 + version: 657664 + sdk: 657664 + - cmd: LC_SOURCE_VERSION + cmdsize: 16 + version: 0 + - cmd: LC_MAIN + cmdsize: 24 + entryoff: 3888 + stacksize: 0 + - cmd: LC_LOAD_DYLIB + cmdsize: 56 + dylib: + name: 24 + timestamp: 2 + current_version: 78446849 + compatibility_version: 65536 + Content: '/usr/lib/libSystem.B.dylib' + ZeroPadBytes: 6 + - cmd: LC_FUNCTION_STARTS + cmdsize: 16 + dataoff: 8288 + datasize: 8 + - cmd: LC_DATA_IN_CODE + cmdsize: 16 + dataoff: 8296 + datasize: 0 + - cmd: LC_DYLIB_CODE_SIGN_DRS + cmdsize: 16 + dataoff: 8296 + datasize: 64 + - cmd: LC_CODE_SIGNATURE + cmdsize: 16 + dataoff: 8496 + datasize: 18656 +LinkEditData: + RebaseOpcodes: + - Opcode: REBASE_OPCODE_SET_TYPE_IMM + Imm: 1 + - Opcode: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ExtraData: [ 0x10 ] + - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES + Imm: 1 + - Opcode: REBASE_OPCODE_DONE + Imm: 0 + BindOpcodes: + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 1 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: dyld_stub_binder + - Opcode: BIND_OPCODE_SET_TYPE_IMM + Imm: 1 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: [ 0x0 ] + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + LazyBindOpcodes: + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: [ 0x10 ] + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 1 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _printf + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + ExportTrie: + TerminalSize: 0 + NodeOffset: 0 + Name: '' + Flags: 0x0 + Address: 0x0 + Other: 0x0 + ImportName: '' + Children: + - TerminalSize: 0 + NodeOffset: 5 + Name: _ + Flags: 0x0 + Address: 0x0 + Other: 0x0 + ImportName: '' + Children: + - TerminalSize: 2 + NodeOffset: 33 + Name: _mh_execute_header + Flags: 0x0 + Address: 0x0 + Other: 0x0 + ImportName: '' + - TerminalSize: 3 + NodeOffset: 37 + Name: main + Flags: 0x0 + Address: 0xF30 + Other: 0x0 + ImportName: '' + NameList: + - n_strx: 2 + n_type: 0xF + n_sect: 1 + n_desc: 16 + n_value: 4294967296 + - n_strx: 22 + n_type: 0xF + n_sect: 1 + n_desc: 0 + n_value: 4294971184 + - n_strx: 28 + n_type: 0x1 + n_sect: 0 + n_desc: 256 + n_value: 0 + - n_strx: 36 + n_type: 0x1 + n_sect: 0 + n_desc: 256 + n_value: 0 + StringTable: + - ' ' + - __mh_execute_header + - _main + - _printf + - dyld_stub_binder + - '' + - '' + - '' + IndirectSymbols: [ 0x2, 0x3, 0x40000000, 0x2 ] + FunctionStarts: [ 0xF30 ] +... diff --git a/llvm/test/tools/llvm-objcopy/MachO/strip-all.test b/llvm/test/tools/llvm-objcopy/MachO/strip-all.test --- a/llvm/test/tools/llvm-objcopy/MachO/strip-all.test +++ b/llvm/test/tools/llvm-objcopy/MachO/strip-all.test @@ -3,6 +3,7 @@ # RUN: yaml2obj %p/Inputs/strip-all.yaml -o %t.exec # RUN: yaml2obj %p/Inputs/strip-all-with-dwarf.yaml -o %t.dwarf # RUN: yaml2obj %p/Inputs/strip-chained-fixups.yaml -o %t.fixups +# RUN: yaml2obj %p/Inputs/strip-all-with-codesignature.yaml -o %t.codesignature ## Check that the symbol list satisfies the order: local / defined external / ## undefined external, otherwise llvm-objcopy will fail. @@ -42,6 +43,25 @@ # RUN: cmp %t7 %t.fixups.stripped # RUN: cmp %t8 %t.fixups.stripped +# RUN: llvm-objcopy --strip-all %t.codesignature %t9 +# RUN: llvm-otool -l %t9 | FileCheck --check-prefix=CODESIGNATURE %s +# RUN: llvm-strip %t.codesignature -o %t10 +# RUN: llvm-otool -l %t10 | FileCheck --check-prefix=CODESIGNATURE %s +# RUN: llvm-strip --strip-all %t.codesignature -o %t11 +# RUN: llvm-otool -l %t11 | FileCheck --check-prefix=CODESIGNATURE %s + +## Make sure that code signatures are preserved + +# CODESIGNATURE: cmd LC_DYLIB_CODE_SIGN_DRS +# CODESIGNATURE-NEXT: cmdsize 16 +# CODESIGNATURE-NEXT: dataoff 8408 +# CODESIGNATURE-NEXT: datasize 64 +# CODESIGNATURE-NEXT: Load command +# CODESIGNATURE-NEXT: cmd LC_CODE_SIGNATURE +# CODESIGNATURE-NEXT: cmdsize 16 +# CODESIGNATURE-NEXT: dataoff 8480 +# CODESIGNATURE-NEXT: datasize 240 + ## Make sure that debug sections are removed. # DWARF: Sections [ # DWARF-NOT: Name: __debug_str