[llvm] r321773 - Do not look up symbol names when n_strx == 0

Michael Trent via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 3 15:28:32 PST 2018


Author: mtrent
Date: Wed Jan  3 15:28:32 2018
New Revision: 321773

URL: http://llvm.org/viewvc/llvm-project?rev=321773&view=rev
Log:
Do not look up symbol names when n_strx == 0

Summary:
Historical tools for working with mach-o binaries verify the nlist field
n_strx has a non-zero value before using that value to retrieve symbol names.
Under some cirumstances, llvm-nm will attempt to display the symbol name at 
position 0, even though symbol names at that position are not well defined. 
This change addresses this problem by returning an empty string when n_strx
is zero.

rdar://problem/35750548

Reviewers: enderby, davide

Reviewed By: enderby, davide

Subscribers: davide, llvm-commits, JDevlieghere

Differential Revision: https://reviews.llvm.org/D41657

Added:
    llvm/trunk/test/tools/llvm-nm/X86/Inputs/macho-dwarf-x86_64   (with props)
    llvm/trunk/test/tools/llvm-nm/X86/macho-dwarf.test
Modified:
    llvm/trunk/lib/Object/MachOObjectFile.cpp

Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=321773&r1=321772&r2=321773&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Wed Jan  3 15:28:32 2018
@@ -1659,6 +1659,10 @@ void MachOObjectFile::moveSymbolNext(Dat
 Expected<StringRef> MachOObjectFile::getSymbolName(DataRefImpl Symb) const {
   StringRef StringTable = getStringTableData();
   MachO::nlist_base Entry = getSymbolTableEntryBase(*this, Symb);
+  if (Entry.n_strx == 0)
+    // A n_strx value of 0 indicates that no name is associated with a
+    // particular symbol table entry.
+    return StringRef();
   const char *Start = &StringTable.data()[Entry.n_strx];
   if (Start < getData().begin() || Start >= getData().end()) {
     return malformedError("bad string index: " + Twine(Entry.n_strx) +

Added: llvm/trunk/test/tools/llvm-nm/X86/Inputs/macho-dwarf-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/macho-dwarf-x86_64?rev=321773&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-nm/X86/Inputs/macho-dwarf-x86_64
------------------------------------------------------------------------------
    svn:executable = *

Propchange: llvm/trunk/test/tools/llvm-nm/X86/Inputs/macho-dwarf-x86_64
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/llvm-nm/X86/macho-dwarf.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/macho-dwarf.test?rev=321773&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-nm/X86/macho-dwarf.test (added)
+++ llvm/trunk/test/tools/llvm-nm/X86/macho-dwarf.test Wed Jan  3 15:28:32 2018
@@ -0,0 +1,15 @@
+# This file was constructed from 3 trivial source files and linked with macOS's
+# ld64 linker. 
+#
+#   cc -gdwarf-2 -o foo.o -c foo.c
+#   cc -gdwarf-2 -o bar.o -c bar.c
+#   ld -r foo.o bar.o -o foobar.o
+#   cc -gdwarf-2 -o baz foobar.o baz.c
+
+# RUN: llvm-nm -ap %p/Inputs/macho-dwarf-x86_64 | FileCheck -match-full-lines -strict-whitespace %s
+
+# CHECK:000000000000002a - 01 0000 ENSYM 
+# CHECK:0000000000000010 - 01 0000 ENSYM 
+# CHECK:000000000000000b - 01 0000 ENSYM 
+
+




More information about the llvm-commits mailing list