[llvm-objcopy][MachO] Add support for LC_DYLIB_CODE_SIGN_DRS
authorKeith Smiley <keithbsmiley@gmail.com>
Fri, 14 Oct 2022 20:40:20 +0000 (13:40 -0700)
committerKeith Smiley <keithbsmiley@gmail.com>
Fri, 14 Oct 2022 22:41:19 +0000 (15:41 -0700)
This allows binaries containing the LC_DYLIB_CODE_SIGN_DRS to be
objcopy'd and stripped.

Differential Revision: https://reviews.llvm.org/D135988

llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp
llvm/lib/ObjCopy/MachO/MachOObject.cpp
llvm/lib/ObjCopy/MachO/MachOObject.h
llvm/lib/ObjCopy/MachO/MachOReader.cpp
llvm/lib/ObjCopy/MachO/MachOReader.h
llvm/lib/ObjCopy/MachO/MachOWriter.cpp
llvm/lib/ObjCopy/MachO/MachOWriter.h
llvm/test/tools/llvm-objcopy/MachO/Inputs/strip-all-with-codesignature.yaml [new file with mode: 0644]
llvm/test/tools/llvm-objcopy/MachO/strip-all.test

index 6b731ab..7edce6e 100644 (file)
@@ -238,7 +238,7 @@ Error MachOLayoutBuilder::layoutTail(uint64_t Offset) {
   // 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 @@ Error MachOLayoutBuilder::layoutTail(uint64_t Offset) {
   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 @@ Error MachOLayoutBuilder::layoutTail(uint64_t Offset) {
       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();
index 1303d66..015ba14 100644 (file)
@@ -75,6 +75,9 @@ void Object::updateLoadCommandIndexes() {
     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;
index 15877ef..9f356d6 100644 (file)
@@ -312,11 +312,14 @@ struct Object {
   LinkData FunctionStarts;
   LinkData ExportsTrie;
   LinkData ChainedFixups;
+  LinkData DylibCodeSignDRs;
 
   Optional<uint32_t> SwiftVersion;
 
   /// The index of LC_CODE_SIGNATURE load command if present.
   Optional<size_t> CodeSignatureCommandIndex;
+  /// The index of LC_DYLIB_CODE_SIGN_DRS load command if present.
+  Optional<size_t> DylibCodeSignDRsIndex;
   /// The index of LC_SYMTAB load command if present.
   Optional<size_t> SymTabCommandIndex;
   /// The index of LC_DYLD_INFO or LC_DYLD_INFO_ONLY load command if present.
index 94459a4..b9bb02d 100644 (file)
@@ -174,6 +174,9 @@ Error MachOReader::readLoadCommands(Object &O) const {
     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 @@ void MachOReader::readFunctionStartsData(Object &O) const {
   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 @@ Expected<std::unique_ptr<Object>> MachOReader::create() const {
   readDataInCodeData(*Obj);
   readLinkerOptimizationHint(*Obj);
   readFunctionStartsData(*Obj);
+  readDylibCodeSignDRs(*Obj);
   readExportsTrie(*Obj);
   readChainedFixups(*Obj);
   readIndirectSymbolTable(*Obj);
index ef374aa..9f55411 100644 (file)
@@ -44,6 +44,7 @@ class MachOReader : public Reader {
   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;
index 84db941..80a8b29 100644 (file)
@@ -95,9 +95,10 @@ size_t MachOWriter::totalSize() const {
   }
 
   for (Optional<size_t> 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 @@ void MachOWriter::writeFunctionStartsData() {
   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 @@ void MachOWriter::writeTail() {
   std::initializer_list<std::pair<Optional<size_t>, WriteHandlerType>>
       LinkEditDataCommandWriters = {
           {O.CodeSignatureCommandIndex, &MachOWriter::writeCodeSignatureData},
+          {O.DylibCodeSignDRsIndex, &MachOWriter::writeDylibCodeSignDRsData},
           {O.DataInCodeCommandIndex, &MachOWriter::writeDataInCodeData},
           {O.LinkerOptimizationHintCommandIndex,
            &MachOWriter::writeLinkerOptimizationHint},
index a54c102..446ed71 100644 (file)
@@ -53,6 +53,7 @@ class MachOWriter {
   void writeDataInCodeData();
   void writeLinkerOptimizationHint();
   void writeFunctionStartsData();
+  void writeDylibCodeSignDRsData();
   void writeChainedFixupsData();
   void writeExportsTrieData();
   void writeTail();
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 (file)
index 0000000..298ce45
--- /dev/null
@@ -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 ]
+...
index 5cea836..1039574 100644 (file)
@@ -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.
 # 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