| """ |
| 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) |