[Object]
[oota-llvm.git] / include / llvm / Object / ELF.h
index ce002f2e4e329ddbe4f56fc7eaa6d81501bc2f1f..e27a23edeb656aacdaad2fc23dce27c955b71e6d 100644 (file)
@@ -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;
@@ -480,7 +484,8 @@ public:
   // Methods for type inquiry through isa, cast, and dyn_cast
   bool isDyldType() const { return isDyldELFObject; }
   static inline bool classof(const Binary *v) {
-    return v->getType() == Binary::isELF;
+    return v->getType() == getELFType(target_endianness == support::little,
+                                      is64Bits);
   }
   static inline bool classof(const ELFObjectFile *v) { return true; }
 };
@@ -1253,13 +1258,15 @@ void ELFObjectFile<target_endianness, is64Bits>
 template<support::endianness target_endianness, bool is64Bits>
 ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object
                                                           , error_code &ec)
-  : ObjectFile(Binary::isELF, Object, ec)
+  : ObjectFile(getELFType(target_endianness == support::little, is64Bits),
+               Object, ec)
   , isDyldELFObject(false)
   , SectionHeaderTable(0)
   , 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();
 
@@ -1485,6 +1492,32 @@ error_code ELFObjectFile<target_endianness, is64Bits>
   return object_error::success;
 }
 
+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 {