diff --git a/llvm/tools/llvm-objdump/ELFDump.h b/llvm/tools/llvm-objdump/ELFDump.h new file mode 100644 --- /dev/null +++ b/llvm/tools/llvm-objdump/ELFDump.h @@ -0,0 +1,39 @@ +//===-- ELFDump.h - ELF-specific dumper -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TOOLS_LLVM_OBJDUMP_ELFDUMP_H +#define LLVM_TOOLS_LLVM_OBJDUMP_ELFDUMP_H + +#include "llvm/ADT/SmallVector.h" + +namespace llvm { + +class Error; + +namespace object { +class ELFObjectFileBase; +class ELFSectionRef; +class ObjectFile; +class RelocationRef; +} // namespace object + +namespace objdump { + +Error getELFRelocationValueString(const object::ELFObjectFileBase *Obj, + const object::RelocationRef &Rel, + llvm::SmallVectorImpl &Result); +uint64_t getELFSectionLMA(const object::ELFSectionRef &Sec); + +void printELFFileHeader(const object::ObjectFile *O); +void printELFDynamicSection(const object::ObjectFile *Obj); +void printELFSymbolVersionInfo(const object::ObjectFile *Obj); + +} // namespace objdump +} // namespace llvm + +#endif diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp --- a/llvm/tools/llvm-objdump/ELFDump.cpp +++ b/llvm/tools/llvm-objdump/ELFDump.cpp @@ -11,6 +11,8 @@ /// //===----------------------------------------------------------------------===// +#include "ELFDump.h" + #include "llvm-objdump.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Object/ELFObjectFile.h" @@ -18,10 +20,10 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" +using namespace llvm; using namespace llvm::object; using namespace llvm::objdump; -namespace llvm { template static Expected getDynamicStrTab(const ELFFile *Elf) { auto DynamicEntriesOrError = Elf->dynamicEntries(); @@ -117,9 +119,9 @@ return Error::success(); } -Error getELFRelocationValueString(const ELFObjectFileBase *Obj, - const RelocationRef &Rel, - SmallVectorImpl &Result) { +Error objdump::getELFRelocationValueString(const ELFObjectFileBase *Obj, + const RelocationRef &Rel, + SmallVectorImpl &Result) { if (auto *ELF32LE = dyn_cast(Obj)) return getRelocationValueString(ELF32LE, Rel, Result); if (auto *ELF64LE = dyn_cast(Obj)) @@ -148,7 +150,7 @@ return Sec.getAddress(); } -uint64_t getELFSectionLMA(const object::ELFSectionRef &Sec) { +uint64_t objdump::getELFSectionLMA(const object::ELFSectionRef &Sec) { if (const auto *ELFObj = dyn_cast(Sec.getObject())) return getSectionLMA(ELFObj->getELFFile(), Sec); else if (const auto *ELFObj = dyn_cast(Sec.getObject())) @@ -160,7 +162,7 @@ } template -void printDynamicSection(const ELFFile *Elf, StringRef Filename) { +static void printDynamicSection(const ELFFile *Elf, StringRef Filename) { ArrayRef DynamicEntries = unwrapOrError(Elf->dynamicEntries(), Filename); @@ -196,7 +198,7 @@ } } -template void printProgramHeaders(const ELFFile *o) { +template static void printProgramHeaders(const ELFFile *o) { outs() << "Program Header:\n"; auto ProgramHeaderOrError = o->program_headers(); if (!ProgramHeaderOrError) @@ -263,8 +265,8 @@ } template -void printSymbolVersionDependency(ArrayRef Contents, - StringRef StrTab) { +static void printSymbolVersionDependency(ArrayRef Contents, + StringRef StrTab) { outs() << "Version References:\n"; const uint8_t *Buf = Contents.data(); @@ -288,9 +290,9 @@ } template -void printSymbolVersionDefinition(const typename ELFT::Shdr &Shdr, - ArrayRef Contents, - StringRef StrTab) { +static void printSymbolVersionDefinition(const typename ELFT::Shdr &Shdr, + ArrayRef Contents, + StringRef StrTab) { outs() << "Version definitions:\n"; const uint8_t *Buf = Contents.data(); @@ -320,7 +322,8 @@ } template -void printSymbolVersionInfo(const ELFFile *Elf, StringRef FileName) { +static void printSymbolVersionInfo(const ELFFile *Elf, + StringRef FileName) { ArrayRef Sections = unwrapOrError(Elf->sections(), FileName); for (const typename ELFT::Shdr &Shdr : Sections) { @@ -341,7 +344,7 @@ } } -void printELFFileHeader(const object::ObjectFile *Obj) { +void objdump::printELFFileHeader(const object::ObjectFile *Obj) { if (const auto *ELFObj = dyn_cast(Obj)) printProgramHeaders(ELFObj->getELFFile()); else if (const auto *ELFObj = dyn_cast(Obj)) @@ -352,7 +355,7 @@ printProgramHeaders(ELFObj->getELFFile()); } -void printELFDynamicSection(const object::ObjectFile *Obj) { +void objdump::printELFDynamicSection(const object::ObjectFile *Obj) { if (const auto *ELFObj = dyn_cast(Obj)) printDynamicSection(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast(Obj)) @@ -363,7 +366,7 @@ printDynamicSection(ELFObj->getELFFile(), Obj->getFileName()); } -void printELFSymbolVersionInfo(const object::ObjectFile *Obj) { +void objdump::printELFSymbolVersionInfo(const object::ObjectFile *Obj) { if (const auto *ELFObj = dyn_cast(Obj)) printSymbolVersionInfo(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast(Obj)) @@ -373,4 +376,3 @@ else if (const auto *ELFObj = dyn_cast(Obj)) printSymbolVersionInfo(ELFObj->getELFFile(), Obj->getFileName()); } -} // namespace llvm diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -117,16 +117,7 @@ SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O, uint64_t *Idx = nullptr); -Error getELFRelocationValueString(const object::ELFObjectFileBase *Obj, - const object::RelocationRef &Rel, - llvm::SmallVectorImpl &Result); - -uint64_t getELFSectionLMA(const object::ELFSectionRef& Sec); - bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B); -void printELFFileHeader(const object::ObjectFile *O); -void printELFDynamicSection(const object::ObjectFile *Obj); -void printELFSymbolVersionInfo(const object::ObjectFile *Obj); void printRawClangAST(const object::ObjectFile *O); void printRelocations(const object::ObjectFile *O); void printDynamicRelocations(const object::ObjectFile *O); diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -17,6 +17,7 @@ #include "llvm-objdump.h" #include "COFFDump.h" +#include "ELFDump.h" #include "MachODump.h" #include "WasmDump.h" #include "XCOFFDump.h"