summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/tools/llvm-objcopy/elf32be.test28
-rw-r--r--llvm/test/tools/llvm-objcopy/elf32le.test28
-rw-r--r--llvm/test/tools/llvm-objcopy/elf64be.test28
-rw-r--r--llvm/tools/llvm-objcopy/llvm-objcopy.cpp25
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;
}
OpenPOWER on IntegriCloud