diff options
-rw-r--r-- | include/llvm/Object/COFF.h | 1 | ||||
-rw-r--r-- | include/llvm/Object/ELF.h | 33 | ||||
-rw-r--r-- | include/llvm/Object/MachO.h | 1 | ||||
-rw-r--r-- | include/llvm/Object/ObjectFile.h | 5 | ||||
-rw-r--r-- | lib/Object/COFFObjectFile.cpp | 6 | ||||
-rw-r--r-- | lib/Object/MachOObjectFile.cpp | 5 | ||||
-rw-r--r-- | test/Object/readobj-shared-object.test | 15 | ||||
-rw-r--r-- | tools/llvm-readobj/llvm-readobj.cpp | 12 |
8 files changed, 77 insertions, 1 deletions
diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 6212785..4f90187 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -164,6 +164,7 @@ public: virtual uint8_t getBytesInAddress() const; virtual StringRef getFileFormatName() const; virtual unsigned getArch() const; + virtual StringRef getLoadName() const; error_code getHeader(const coff_file_header *&Res) const; error_code getSection(int32_t index, const coff_section *&Res) const; diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index ce002f2..e746b0a 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -369,6 +369,9 @@ private: DenseMap<const Elf_Sym*, ELF::Elf64_Word> ExtendedSymbolTable; const Elf_Shdr *dot_dynamic_sec; // .dynamic + // Pointer to SONAME entry in dynamic string table + // This is set the first time getLoadName is called. + mutable const char *dt_soname; /// @brief Map sections to an array of relocation sections that reference /// them sorted by section index. @@ -471,6 +474,7 @@ public: virtual uint8_t getBytesInAddress() const; virtual StringRef getFileFormatName() const; virtual unsigned getArch() const; + virtual StringRef getLoadName() const; uint64_t getNumSections() const; uint64_t getStringTableIndex() const; @@ -1259,7 +1263,8 @@ ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object , dot_shstrtab_sec(0) , dot_strtab_sec(0) , dot_dynstr_sec(0) - , dot_dynamic_sec(0) { + , dot_dynamic_sec(0) + , dt_soname(0) { const uint64_t FileSize = Data->getBufferSize(); @@ -1486,6 +1491,32 @@ error_code ELFObjectFile<target_endianness, is64Bits> } template<support::endianness target_endianness, bool is64Bits> +StringRef +ELFObjectFile<target_endianness, is64Bits>::getLoadName() const { + if (!dt_soname) { + // Find the DT_SONAME entry + dyn_iterator it = begin_dynamic_table(); + dyn_iterator ie = end_dynamic_table(); + error_code ec; + while (it != ie) { + if (it->getTag() == ELF::DT_SONAME) + break; + it.increment(ec); + if (ec) + report_fatal_error("dynamic table iteration failed"); + } + if (it != ie) { + if (dot_dynstr_sec == NULL) + report_fatal_error("Dynamic string table is missing"); + dt_soname = getString(dot_dynstr_sec, it->getVal()); + } else { + dt_soname = ""; + } + } + return dt_soname; +} + +template<support::endianness target_endianness, bool is64Bits> library_iterator ELFObjectFile<target_endianness, is64Bits> ::begin_libraries_needed() const { // Find the first DT_NEEDED entry diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 185df06..1aae85a 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -42,6 +42,7 @@ public: virtual uint8_t getBytesInAddress() const; virtual StringRef getFileFormatName() const; virtual unsigned getArch() const; + virtual StringRef getLoadName() const; MachOObject *getObject() { return MachOObj; } diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index dd47ceb..1e9d895 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -359,6 +359,11 @@ public: virtual StringRef getFileFormatName() const = 0; virtual /* Triple::ArchType */ unsigned getArch() const = 0; + /// For shared objects, returns the name which this object should be + /// loaded from at runtime. This corresponds to DT_SONAME on ELF and + /// LC_ID_DYLIB (install name) on MachO. + virtual StringRef getLoadName() const = 0; + /// @returns Pointer to ObjectFile subclass to handle this type of object. /// @param ObjectPath The path to the object file. ObjectPath.isObject must /// return true. diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 393c574..a3fdd5b 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -525,6 +525,12 @@ library_iterator COFFObjectFile::end_libraries_needed() const { report_fatal_error("Libraries needed unimplemented in COFFObjectFile"); } +StringRef COFFObjectFile::getLoadName() const { + // COFF does not have this field. + return ""; +} + + section_iterator COFFObjectFile::begin_sections() const { DataRefImpl ret; std::memset(&ret, 0, sizeof(DataRefImpl)); diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 360ab16..655c40a 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -387,6 +387,11 @@ library_iterator MachOObjectFile::end_libraries_needed() const { report_fatal_error("Needed libraries unimplemented in MachOObjectFile"); } +StringRef MachOObjectFile::getLoadName() const { + // TODO: Implement + report_fatal_error("get_load_name() unimplemented in MachOObjectFile"); +} + /*===-- Sections ----------------------------------------------------------===*/ void MachOObjectFile::moveToNextSection(DataRefImpl &DRI) const { diff --git a/test/Object/readobj-shared-object.test b/test/Object/readobj-shared-object.test index be71907..3b5457c 100644 --- a/test/Object/readobj-shared-object.test +++ b/test/Object/readobj-shared-object.test @@ -1,7 +1,22 @@ RUN: llvm-readobj %p/Inputs/shared-object-test.elf-i386 \ RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj %p/Inputs/shared-object-test.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF32 + RUN: llvm-readobj %p/Inputs/shared-object-test.elf-x86-64 \ RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj %p/Inputs/shared-object-test.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF64 + +ELF64:File Format : ELF64-x86-64 +ELF64:Arch : x86_64 +ELF64:Address Size: 64 bits +ELF64:Load Name : libfoo.so + +ELF32:File Format : ELF32-i386 +ELF32:Arch : i386 +ELF32:Address Size: 32 bits +ELF32:Load Name : libfoo.so ELF:Symbols: ELF: .dynsym DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index 7b8683f..215039f 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -14,6 +14,7 @@ #include <string.h> #include "llvm/Object/ObjectFile.h" #include "llvm/Analysis/Verifier.h" +#include "llvm/ADT/Triple.h" #include "llvm/Support/Format.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/PrettyStackTrace.h" @@ -155,6 +156,16 @@ void DumpLibrariesNeeded(const ObjectFile *obj) { outs() << " Total: " << count << "\n\n"; } +void DumpHeaders(const ObjectFile *obj) { + outs() << "File Format : " << obj->getFileFormatName() << "\n"; + outs() << "Arch : " + << Triple::getArchTypeName((llvm::Triple::ArchType)obj->getArch()) + << "\n"; + outs() << "Address Size: " << (8*obj->getBytesInAddress()) << " bits\n"; + outs() << "Load Name : " << obj->getLoadName() << "\n"; + outs() << "\n"; +} + int main(int argc, char** argv) { error_code ec; sys::PrintStackTraceOnErrorSignal(); @@ -180,6 +191,7 @@ int main(int argc, char** argv) { errs() << InputFilename << ": Object type not recognized\n"; } + DumpHeaders(obj); DumpSymbols(obj); DumpDynamicSymbols(obj); DumpLibrariesNeeded(obj); |