diff --git a/llvm/test/tools/llvm-objcopy/MachO/encrypt_info_64_lc.test b/llvm/test/tools/llvm-objcopy/MachO/encrypt_info_64_lc.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/encrypt_info_64_lc.test @@ -0,0 +1,22 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t.copy +# RUN: cmp %t %t.copy + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x0100000C + cpusubtype: 0x00000000 + filetype: 0x00000002 + ncmds: 1 + sizeofcmds: 24 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_ENCRYPTION_INFO_64 + cmdsize: 24 + cryptoff: 0 + cryptsize: 0 + cryptid: 0 + pad: 0 +... diff --git a/llvm/test/tools/llvm-objcopy/MachO/encrypt_info_lc.test b/llvm/test/tools/llvm-objcopy/MachO/encrypt_info_lc.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/encrypt_info_lc.test @@ -0,0 +1,20 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t.copy +# RUN: cmp %t %t.copy + +--- !mach-o +FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 20 + flags: 0x00002000 +LoadCommands: + - cmd: LC_ENCRYPTION_INFO + cmdsize: 20 + cryptoff: 0 + cryptsize: 0 + cryptid: 0 +... diff --git a/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp b/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp --- a/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp +++ b/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp @@ -315,6 +315,19 @@ O.Exports.Trie.empty() ? 0 : StartOfExportTrie; MLC.dyld_info_command_data.export_size = O.Exports.Trie.size(); break; + // Note that LC_ENCRYPTION_INFO.cryptoff despite its name and the comment in + // is not an offset in the binary file, instead, it is a + // relative virtual address. At the moment modification of the __TEXT + // segment of executables isn't supported anyway (e.g. data in code entries + // are not recalculated). Moreover, in general + // LC_ENCRYPT_INFO/LC_ENCRYPTION_INFO_64 are nontrivial to update because + // without making additional assumptions (e.g. that the entire __TEXT + // segment should be encrypted) we do not know how to recalculate the + // boundaries of the encrypted part. For now just copy over these load + // commands until we encounter a real world usecase where + // LC_ENCRYPT_INFO/LC_ENCRYPTION_INFO_64 need to be adjusted. + case MachO::LC_ENCRYPTION_INFO: + case MachO::LC_ENCRYPTION_INFO_64: case MachO::LC_LOAD_DYLINKER: case MachO::LC_MAIN: case MachO::LC_RPATH: