104 lines
4.8 KiB
Python
104 lines
4.8 KiB
Python
|
"""
|
||
|
Test that we read the exported symbols from the dyld trie
|
||
|
"""
|
||
|
|
||
|
import lldb
|
||
|
from lldbsuite.test.decorators import *
|
||
|
from lldbsuite.test.lldbtest import *
|
||
|
from lldbsuite.test import lldbutil
|
||
|
|
||
|
|
||
|
class DyldTrieSymbolsTestCase(TestBase):
|
||
|
NO_DEBUG_INFO_TESTCASE = True
|
||
|
|
||
|
@skipIfRemote
|
||
|
@skipUnlessDarwin
|
||
|
def test_dyld_trie_symbols(self):
|
||
|
"""Test that we make create symbol table entries from the dyld trie data structure."""
|
||
|
self.build()
|
||
|
unstripped_exe = self.getBuildArtifact("a.out")
|
||
|
stripped_exe = self.getBuildArtifact("a.out-stripped")
|
||
|
|
||
|
unstripped_target = self.dbg.CreateTarget(unstripped_exe)
|
||
|
self.assertTrue(unstripped_target.IsValid(), "Got a vaid stripped target.")
|
||
|
|
||
|
# Verify that the expected symbols are present in an unstripped
|
||
|
# binary, and that we didn't duplicate the entries in the symbol
|
||
|
# table.
|
||
|
unstripped_bazval_symbols = unstripped_target.FindSymbols("bazval")
|
||
|
self.assertEqual(unstripped_bazval_symbols.GetSize(), 1)
|
||
|
unstripped_patval_symbols = unstripped_target.FindSymbols("patval")
|
||
|
self.assertEqual(unstripped_patval_symbols.GetSize(), 1)
|
||
|
unstripped_Z3foo_symbols = unstripped_target.FindSymbols("_Z3foov")
|
||
|
self.assertEqual(unstripped_Z3foo_symbols.GetSize(), 1)
|
||
|
unstripped_foo_symbols = unstripped_target.FindSymbols("foo")
|
||
|
self.assertEqual(unstripped_foo_symbols.GetSize(), 1)
|
||
|
|
||
|
# Make sure we can look up the mangled name and the demangled base
|
||
|
# name.
|
||
|
unstripped_Z3pat_symbols = unstripped_target.FindSymbols("_Z3pati")
|
||
|
self.assertEqual(unstripped_Z3pat_symbols.GetSize(), 1)
|
||
|
unstripped_pat_symbols = unstripped_target.FindSymbols("pat")
|
||
|
self.assertEqual(unstripped_pat_symbols.GetSize(), 1)
|
||
|
|
||
|
unstripped_bar_symbols = unstripped_target.FindSymbols("bar")
|
||
|
self.assertEqual(unstripped_bar_symbols.GetSize(), 1)
|
||
|
|
||
|
# Verify that we can retrieve all the symbols with external
|
||
|
# linkage after the binary has been stripped; they should not
|
||
|
# exist in the nlist records at this point and can only be
|
||
|
# retrieved from the dyld trie structure.
|
||
|
|
||
|
stripped_target = self.dbg.CreateTarget(stripped_exe)
|
||
|
self.assertTrue(stripped_target.IsValid(), "Got a vaid stripped target.")
|
||
|
|
||
|
# Check that we're able to still retrieve all the symbols after
|
||
|
# the binary has been stripped. Check that one we know will be
|
||
|
# removed is absent.
|
||
|
stripped_bazval_symbols = stripped_target.FindSymbols("bazval")
|
||
|
self.assertEqual(stripped_bazval_symbols.GetSize(), 1)
|
||
|
stripped_patval_symbols = stripped_target.FindSymbols("patval")
|
||
|
self.assertEqual(stripped_patval_symbols.GetSize(), 1)
|
||
|
stripped_Z3foo_symbols = stripped_target.FindSymbols("_Z3foov")
|
||
|
self.assertEqual(stripped_Z3foo_symbols.GetSize(), 1)
|
||
|
stripped_foo_symbols = stripped_target.FindSymbols("foo")
|
||
|
self.assertEqual(stripped_foo_symbols.GetSize(), 1)
|
||
|
|
||
|
# make sure we can look up the mangled name, demangled base name,
|
||
|
# demangled name with argument.
|
||
|
stripped_Z3pat_symbols = stripped_target.FindSymbols("_Z3pati")
|
||
|
self.assertEqual(stripped_Z3pat_symbols.GetSize(), 1)
|
||
|
stripped_pat_symbols = stripped_target.FindSymbols("pat")
|
||
|
self.assertEqual(stripped_pat_symbols.GetSize(), 1)
|
||
|
|
||
|
# bar should have been strippped. We should not find it, or the
|
||
|
# stripping went wrong.
|
||
|
stripped_bar_symbols = stripped_target.FindSymbols("bar")
|
||
|
self.assertEqual(stripped_bar_symbols.GetSize(), 0)
|
||
|
|
||
|
# confirm that we classified objc runtime symbols correctly and
|
||
|
# stripped off the objc prefix from the symbol names.
|
||
|
syms_ctx = stripped_target.FindSymbols("SourceBase")
|
||
|
self.assertEqual(syms_ctx.GetSize(), 2)
|
||
|
|
||
|
sym1 = syms_ctx.GetContextAtIndex(0).GetSymbol()
|
||
|
sym2 = syms_ctx.GetContextAtIndex(1).GetSymbol()
|
||
|
|
||
|
# one of these should be a lldb.eSymbolTypeObjCClass, the other
|
||
|
# should be lldb.eSymbolTypeObjCMetaClass.
|
||
|
if sym1.GetType() == lldb.eSymbolTypeObjCMetaClass:
|
||
|
self.assertEqual(sym2.GetType(), lldb.eSymbolTypeObjCClass)
|
||
|
else:
|
||
|
if sym1.GetType() == lldb.eSymbolTypeObjCClass:
|
||
|
self.assertEqual(sym2.GetType(), lldb.eSymbolTypeObjCMetaClass)
|
||
|
else:
|
||
|
self.assertTrue(
|
||
|
sym1.GetType() == lldb.eSymbolTypeObjCMetaClass
|
||
|
or sym1.GetType() == lldb.eSymbolTypeObjCClass
|
||
|
)
|
||
|
|
||
|
syms_ctx = stripped_target.FindSymbols("SourceDerived._derivedValue")
|
||
|
self.assertEqual(syms_ctx.GetSize(), 1)
|
||
|
sym = syms_ctx.GetContextAtIndex(0).GetSymbol()
|
||
|
self.assertEqual(sym.GetType(), lldb.eSymbolTypeObjCIVar)
|