diff options
-rw-r--r-- | llvm/test/tools/llvm-objcopy/elf32be.test | 28 | ||||
-rw-r--r-- | llvm/test/tools/llvm-objcopy/elf32le.test | 28 | ||||
-rw-r--r-- | llvm/test/tools/llvm-objcopy/elf64be.test | 28 | ||||
-rw-r--r-- | llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 25 |
4 files changed, 103 insertions, 6 deletions
diff --git a/llvm/test/tools/llvm-objcopy/elf32be.test b/llvm/test/tools/llvm-objcopy/elf32be.test new file mode 100644 index 00000000000..786c862807e --- /dev/null +++ b/llvm/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 diff --git a/llvm/test/tools/llvm-objcopy/elf32le.test b/llvm/test/tools/llvm-objcopy/elf32le.test new file mode 100644 index 00000000000..ed7d5ff5dbb --- /dev/null +++ b/llvm/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 diff --git a/llvm/test/tools/llvm-objcopy/elf64be.test b/llvm/test/tools/llvm-objcopy/elf64be.test new file mode 100644 index 00000000000..49e707ec59d --- /dev/null +++ b/llvm/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 diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index b520a1415c2..f7a94f5f891 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -142,18 +142,19 @@ void SplitDWOToFile(const ELFObjectFile<ELFT> &ObjFile, StringRef File) { WriteObjectFile(DWOFile, File); } -void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) { - std::unique_ptr<Object<ELF64LE>> Obj; +template <class ELFT> +void CopyBinary(const ELFObjectFile<ELFT> &ObjFile) { + std::unique_ptr<Object<ELFT>> Obj; if (!OutputFormat.empty() && OutputFormat != "binary") error("invalid output format '" + OutputFormat + "'"); if (!OutputFormat.empty() && OutputFormat == "binary") - Obj = llvm::make_unique<BinaryObject<ELF64LE>>(ObjFile); + Obj = llvm::make_unique<BinaryObject<ELFT>>(ObjFile); else - Obj = llvm::make_unique<ELFObject<ELF64LE>>(ObjFile); + Obj = llvm::make_unique<ELFObject<ELFT>>(ObjFile); if (!SplitDWO.empty()) - SplitDWOToFile<ELF64LE>(ObjFile, SplitDWO.getValue()); + SplitDWOToFile<ELFT>(ObjFile, SplitDWO.getValue()); SectionPred RemovePred = [](const SectionBase &) { return false; }; @@ -225,7 +226,19 @@ int main(int argc, char **argv) { if (!BinaryOrErr) reportError(InputFilename, BinaryOrErr.takeError()); Binary &Binary = *BinaryOrErr.get().getBinary(); - if (ELFObjectFile<ELF64LE> *o = dyn_cast<ELFObjectFile<ELF64LE>>(&Binary)) { + if (auto *o = dyn_cast<ELFObjectFile<ELF64LE>>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast<ELFObjectFile<ELF32LE>>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast<ELFObjectFile<ELF64BE>>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast<ELFObjectFile<ELF32BE>>(&Binary)) { CopyBinary(*o); return 0; } |