diff --git a/llvm/lib/ObjectYAML/MachOEmitter.cpp b/llvm/lib/ObjectYAML/MachOEmitter.cpp --- a/llvm/lib/ObjectYAML/MachOEmitter.cpp +++ b/llvm/lib/ObjectYAML/MachOEmitter.cpp @@ -183,6 +183,30 @@ return writePayloadString(LC, OS); } +template <> +size_t writeLoadCommandData( + MachOYAML::LoadCommand &LC, raw_ostream &OS, bool IsLittleEndian) { + return writePayloadString(LC, OS); +} + +template <> +size_t writeLoadCommandData( + MachOYAML::LoadCommand &LC, raw_ostream &OS, bool IsLittleEndian) { + return writePayloadString(LC, OS); +} + +template <> +size_t writeLoadCommandData( + MachOYAML::LoadCommand &LC, raw_ostream &OS, bool IsLittleEndian) { + return writePayloadString(LC, OS); +} + +template <> +size_t writeLoadCommandData( + MachOYAML::LoadCommand &LC, raw_ostream &OS, bool IsLittleEndian) { + return writePayloadString(LC, OS); +} + template <> size_t writeLoadCommandData( MachOYAML::LoadCommand &LC, raw_ostream &OS, bool IsLittleEndian) { diff --git a/llvm/lib/ObjectYAML/MachOYAML.cpp b/llvm/lib/ObjectYAML/MachOYAML.cpp --- a/llvm/lib/ObjectYAML/MachOYAML.cpp +++ b/llvm/lib/ObjectYAML/MachOYAML.cpp @@ -233,6 +233,30 @@ IO.mapOptional("Content", LoadCommand.Content); } +template <> +void mapLoadCommandData( + IO &IO, MachOYAML::LoadCommand &LoadCommand) { + IO.mapOptional("Content", LoadCommand.Content); +} + +template <> +void mapLoadCommandData( + IO &IO, MachOYAML::LoadCommand &LoadCommand) { + IO.mapOptional("Content", LoadCommand.Content); +} + +template <> +void mapLoadCommandData( + IO &IO, MachOYAML::LoadCommand &LoadCommand) { + IO.mapOptional("Content", LoadCommand.Content); +} + +template <> +void mapLoadCommandData( + IO &IO, MachOYAML::LoadCommand &LoadCommand) { + IO.mapOptional("Content", LoadCommand.Content); +} + template <> void mapLoadCommandData( IO &IO, MachOYAML::LoadCommand &LoadCommand) { diff --git a/llvm/test/tools/llvm-objcopy/MachO/sub-load-commands.test b/llvm/test/tools/llvm-objcopy/MachO/sub-load-commands.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/sub-load-commands.test @@ -0,0 +1,56 @@ +## This test verifies that llvm-objcopy correctly ignores the LC_SUB_* load +## commands. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t2 +# RUN: cmp %t %t2 +# RUN: llvm-objdump --macho --private-headers %t2 | FileCheck %s + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x80000003 + filetype: 0x00000002 + ncmds: 4 + sizeofcmds: 72 + flags: 0x00200085 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SUB_FRAMEWORK + cmdsize: 16 + umbrella: 12 + Content: 'Bar' + ZeroPadBytes: 1 + - cmd: LC_SUB_UMBRELLA + cmdsize: 16 + sub_umbrella: 12 + Content: 'Foo' + ZeroPadBytes: 1 + - cmd: LC_SUB_LIBRARY + cmdsize: 24 + sub_library: 12 + Content: 'libfoo' + ZeroPadBytes: 6 + - cmd: LC_SUB_CLIENT + cmdsize: 16 + client: 12 + Content: 'bar' + ZeroPadBytes: 1 + +# CHECK: Load command 0 +# CHECK: cmd LC_SUB_FRAMEWORK +# CHECK: cmdsize 16 +# CHECK: umbrella Bar (offset 12) +# CHECK: Load command 1 +# CHECK: cmd LC_SUB_UMBRELLA +# CHECK: cmdsize 16 +# CHECK: sub_umbrella Foo (offset 12) +# CHECK: Load command 2 +# CHECK: cmd LC_SUB_LIBRARY +# CHECK: cmdsize 24 +# CHECK: sub_library libfoo (offset 12) +# CHECK: Load command 3 +# CHECK: cmd LC_SUB_CLIENT +# CHECK: cmdsize 16 +# CHECK: client bar (offset 12) 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 @@ -380,6 +380,10 @@ case MachO::LC_SOURCE_VERSION: case MachO::LC_THREAD: case MachO::LC_UNIXTHREAD: + case MachO::LC_SUB_FRAMEWORK: + case MachO::LC_SUB_UMBRELLA: + case MachO::LC_SUB_CLIENT: + case MachO::LC_SUB_LIBRARY: // Nothing to update. break; default: