[llvm] r318166 - [llvm-objcopy] Support the rest of the ELF formats

Jake Ehrlich via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 14 10:41:47 PST 2017


Author: jakehehrlich
Date: Tue Nov 14 10:41:47 2017
New Revision: 318166

URL: http://llvm.org/viewvc/llvm-project?rev=318166&view=rev
Log:
[llvm-objcopy] Support the rest of the ELF formats

We haven't been supporting anything but ELF64LE since the start. Luckily
this was always accounted for and the change is pretty trivial. B35281
requests this change for ELF32LE. This change adds support for ELF32LE,
ELF64BE, and ELF32BE with all supported features that already existed
for ELF64LE.

Differential Revision: https://reviews.llvm.org/D39977

Added:
    llvm/trunk/test/tools/llvm-objcopy/elf32be.test
    llvm/trunk/test/tools/llvm-objcopy/elf32le.test
    llvm/trunk/test/tools/llvm-objcopy/elf64be.test
Modified:
    llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp

Added: llvm/trunk/test/tools/llvm-objcopy/elf32be.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/elf32be.test?rev=318166&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/elf32be.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/elf32be.test Tue Nov 14 10:41:47 2017
@@ -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

Added: llvm/trunk/test/tools/llvm-objcopy/elf32le.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/elf32le.test?rev=318166&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/elf32le.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/elf32le.test Tue Nov 14 10:41:47 2017
@@ -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

Added: llvm/trunk/test/tools/llvm-objcopy/elf64be.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/elf64be.test?rev=318166&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/elf64be.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/elf64be.test Tue Nov 14 10:41:47 2017
@@ -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

Modified: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp?rev=318166&r1=318165&r2=318166&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Tue Nov 14 10:41:47 2017
@@ -142,18 +142,19 @@ void SplitDWOToFile(const ELFObjectFile<
   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;
   }




More information about the llvm-commits mailing list