From 99e2c41c1aecb77d1b7f3ab74ced9db2a54e5386 Mon Sep 17 00:00:00 2001 From: Jake Ehrlich Date: Tue, 14 Nov 2017 18:41:47 +0000 Subject: [PATCH] [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 llvm-svn: 318166 --- llvm/test/tools/llvm-objcopy/elf32be.test | 28 ++++++++++++++++++++++++++++ llvm/test/tools/llvm-objcopy/elf32le.test | 28 ++++++++++++++++++++++++++++ llvm/test/tools/llvm-objcopy/elf64be.test | 28 ++++++++++++++++++++++++++++ llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 25 +++++++++++++++++++------ 4 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 llvm/test/tools/llvm-objcopy/elf32be.test create mode 100644 llvm/test/tools/llvm-objcopy/elf32le.test create mode 100644 llvm/test/tools/llvm-objcopy/elf64be.test diff --git a/llvm/test/tools/llvm-objcopy/elf32be.test b/llvm/test/tools/llvm-objcopy/elf32be.test new file mode 100644 index 0000000..786c862 --- /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 0000000..ed7d5ff --- /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 0000000..49e707e --- /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 b520a14..f7a94f5 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 &ObjFile, StringRef File) { 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; }; @@ -225,7 +226,19 @@ int main(int argc, char **argv) { if (!BinaryOrErr) reportError(InputFilename, BinaryOrErr.takeError()); Binary &Binary = *BinaryOrErr.get().getBinary(); - if (ELFObjectFile *o = dyn_cast>(&Binary)) { + if (auto *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast>(&Binary)) { CopyBinary(*o); return 0; } -- 2.7.4