Add code to llvm-objdump so the -section option with -macho will dump ā€˜C’ string
authorKevin Enderby <enderby@apple.com>
Wed, 4 Feb 2015 21:38:42 +0000 (21:38 +0000)
committerKevin Enderby <enderby@apple.com>
Wed, 4 Feb 2015 21:38:42 +0000 (21:38 +0000)
sections with the Mach-O S_CSTRING_LITERALS section type.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228198 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objdump/X86/macho-cstring-dump.test [new file with mode: 0644]
tools/llvm-objdump/MachODump.cpp

diff --git a/test/tools/llvm-objdump/X86/macho-cstring-dump.test b/test/tools/llvm-objdump/X86/macho-cstring-dump.test
new file mode 100644 (file)
index 0000000..869462d
--- /dev/null
@@ -0,0 +1,4 @@
+RUN: llvm-objdump -m -section __TEXT,__cstring %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
+
+CHECK: Contents of (__TEXT,__cstring) section
+CHECK: 0x000000000000003b  Hello world\n
index 9a0255d428bfc8dc01a230d3b4372e63b00a41fe..1bb9bfce6661c6b56fed9fdae3e1853fc16588d1 100644 (file)
@@ -537,6 +537,25 @@ static const char *GuessSymbolName(uint64_t value, SymbolAddressMap *AddrMap) {
   return SymbolName;
 }
 
+static void DumpCstringSection(MachOObjectFile *O, const char *sect,
+                               uint32_t sect_size, uint64_t sect_addr,
+                               bool verbose) {
+  for (uint32_t i = 0; i < sect_size; i++) {
+    if (O->is64Bit())
+      outs() << format("0x%016" PRIx64, sect_addr + i) << "  ";
+    else
+      outs() << format("0x%08" PRIx64, sect_addr + i) << "  ";
+    for ( ; i < sect_size && sect[i] != '\0'; i++) {
+      char p[2];
+      p[0] = sect[i];
+      p[1] = '\0';
+      outs().write_escaped(p);
+    }
+    if (i < sect_size && sect[i] == '\0')
+      outs() << "\n";
+  }
+}
+
 static void DumpInitTermPointerSection(MachOObjectFile *O, const char *sect,
                                        uint32_t sect_size, uint64_t sect_addr,
                                        SymbolAddressMap *AddrMap,
@@ -676,6 +695,9 @@ static void DumpSectionContents(StringRef Filename, MachOObjectFile *O,
           case MachO::S_ZEROFILL:
             outs() << "zerofill section and has no contents in the file\n";
             break;
+          case MachO::S_CSTRING_LITERALS:
+            DumpCstringSection(O, sect, sect_size, sect_addr, verbose);
+            break;
           case MachO::S_MOD_INIT_FUNC_POINTERS:
           case MachO::S_MOD_TERM_FUNC_POINTERS:
             DumpInitTermPointerSection(O, sect, sect_size, sect_addr, &AddrMap,