Index: test/tools/llvm-objcopy/elf32be.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/elf32be.test @@ -0,0 +1,28 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000010 + Size: 64 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: "00000000" + +# CHECK: Class: 32-bit +# CHECK: DataEncoding: BigEndian + +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .shstrtab Index: test/tools/llvm-objcopy/elf32le.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/elf32le.test @@ -0,0 +1,28 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000010 + Size: 64 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: "00000000" + +# CHECK: Class: 32-bit +# CHECK: DataEncoding: LittleEndian + +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .shstrtab Index: test/tools/llvm-objcopy/elf64be.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/elf64be.test @@ -0,0 +1,28 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000010 + Size: 64 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: "00000000" + +# CHECK: Class: 64-bit +# CHECK: DataEncoding: BigEndian + +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .shstrtab Index: tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- tools/llvm-objcopy/llvm-objcopy.cpp +++ tools/llvm-objcopy/llvm-objcopy.cpp @@ -138,18 +138,19 @@ WriteObjectFile(DWOFile, File); } -void CopyBinary(const ELFObjectFile &ObjFile) { - std::unique_ptr> Obj; +template +void CopyBinary(const ELFObjectFile &ObjFile) { + std::unique_ptr> Obj; if (!OutputFormat.empty() && OutputFormat != "binary") error("invalid output format '" + OutputFormat + "'"); if (!OutputFormat.empty() && OutputFormat == "binary") - Obj = llvm::make_unique>(ObjFile); + Obj = llvm::make_unique>(ObjFile); else - Obj = llvm::make_unique>(ObjFile); + Obj = llvm::make_unique>(ObjFile); if (!SplitDWO.empty()) - SplitDWOToFile(ObjFile, SplitDWO.getValue()); + SplitDWOToFile(ObjFile, SplitDWO.getValue()); SectionPred RemovePred = [](const SectionBase &) { return false; }; @@ -201,5 +202,17 @@ CopyBinary(*o); return 0; } + if (ELFObjectFile *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (ELFObjectFile *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (ELFObjectFile *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } reportError(InputFilename, object_error::invalid_file_type); }