macho-dump: Add support for dumping string table data.
authorDaniel Dunbar <daniel@zuster.org>
Sat, 27 Nov 2010 13:46:11 +0000 (13:46 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 27 Nov 2010 13:46:11 +0000 (13:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120217 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/MachOObject.h
lib/Object/MachOObject.cpp
tools/macho-dump/macho-dump.cpp

index 53c7abf34a400b70a3bbf58212295729f71bc47f..836e5491d21b93f02bb2f0d0fb2695d0cf96a1d2 100644 (file)
@@ -13,6 +13,7 @@
 #include <string>
 #include "llvm/ADT/InMemoryStruct.h"
 #include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/StringRef.h"
 #include "llvm/Object/MachOFormat.h"
 
 namespace llvm {
@@ -59,6 +60,8 @@ private:
   bool Is64Bit;
   /// Whether the object is swapped endianness from the host.
   bool IsSwappedEndian;
+  /// Whether the string table has been registered.
+  bool HasStringTable;
 
   /// The cached information on the load commands.
   LoadCommandInfo *LoadCommands;
@@ -68,6 +71,9 @@ private:
   macho::Header Header;
   macho::Header64Ext Header64Ext;
 
+  /// Cache string table information.
+  StringRef StringTable;
+
 private:
   MachOObject(MemoryBuffer *Buffer, bool IsLittleEndian, bool Is64Bit);
 
@@ -96,6 +102,17 @@ public:
     return Is64Bit ? macho::Header64Size : macho::Header32Size;
   }
 
+  /// @}
+  /// @name String Table Data
+  /// @{
+
+  StringRef getStringTableData() const {
+    assert(HasStringTable && "String table has not been registered!");
+    return StringTable;
+  }
+
+  void RegisterStringTable(macho::SymtabLoadCommand &SLC);
+
   /// @}
   /// @name Object Header Access
   /// @{
index f5bc73ada7174fe304260882307d1f17d014fb55..45c9bff45fcc3afd9a8bc1f00e7ef9071623de0d 100644 (file)
@@ -57,7 +57,7 @@ MachOObject::MachOObject(MemoryBuffer *Buffer_, bool IsLittleEndian_,
                          bool Is64Bit_)
   : Buffer(Buffer_), IsLittleEndian(IsLittleEndian_), Is64Bit(Is64Bit_),
     IsSwappedEndian(IsLittleEndian != sys::isLittleEndianHost()),
-    LoadCommands(0), NumLoadedCommands(0) {
+    HasStringTable(false), LoadCommands(0), NumLoadedCommands(0) {
   // Load the common header.
   memcpy(&Header, Buffer->getBuffer().data(), sizeof(Header));
   if (IsSwappedEndian) {
@@ -125,6 +125,12 @@ MachOObject *MachOObject::LoadFromBuffer(MemoryBuffer *Buffer,
   return Object.take();
 }
 
+void MachOObject::RegisterStringTable(macho::SymtabLoadCommand &SLC) {
+  HasStringTable = true;
+  StringTable = Buffer->getBuffer().substr(SLC.StringTableOffset,
+                                           SLC.StringTableSize);
+}
+
 const MachOObject::LoadCommandInfo &
 MachOObject::getLoadCommandInfo(unsigned Index) const {
   assert(Index < getHeader().NumLoadCommands && "Invalid index!");
index 274c41bd25ccf49fe81065b7952624565e46cd3b..e2a8ef136ec7da8b08e7ad5af7fd5755ae157f2f 100644 (file)
@@ -213,6 +213,14 @@ static int DumpSymtabCommand(MachOObject &Obj,
   outs() << "  ('stroff', " << SLC->StringTableOffset << ")\n";
   outs() << "  ('strsize', " << SLC->StringTableSize << ")\n";
 
+  // Cache the string table data.
+  Obj.RegisterStringTable(*SLC);
+
+  // Dump the string data.
+  outs() << "  ('_string_data', '";
+  outs().write_escaped(Obj.getStringTableData(),
+                       /*UseHexEscapes=*/true) << "')\n";
+
   return 0;
 }