1""" 2Test that a binary can be slid to different load addresses correctly 3""" 4 5 6 7import lldb 8from lldbsuite.test.decorators import * 9from lldbsuite.test.lldbtest import * 10from lldbsuite.test import lldbutil 11 12 13class MultipleSlidesTestCase(TestBase): 14 15 NO_DEBUG_INFO_TESTCASE = True 16 def test_mulitple_slides(self): 17 """Test that a binary can be slid multiple times correctly.""" 18 self.build() 19 exe = self.getBuildArtifact("a.out") 20 err = lldb.SBError() 21 load_dependent_modules = False 22 target = self.dbg.CreateTarget(exe, '', '', load_dependent_modules, err) 23 self.assertTrue(target.IsValid()) 24 module = target.GetModuleAtIndex(0) 25 self.assertTrue(module.IsValid()) 26 27 first_sym = target.FindSymbols("first").GetContextAtIndex(0).GetSymbol() 28 second_sym = target.FindSymbols("second").GetContextAtIndex(0).GetSymbol() 29 first_size = first_sym.GetEndAddress().GetOffset() - first_sym.GetStartAddress().GetOffset() 30 second_size = second_sym.GetEndAddress().GetOffset() - second_sym.GetStartAddress().GetOffset() 31 32 # View the first element of `first` and `second` while 33 # they have no load address set. 34 self.expect("expression/d ((int*)&first)[0]", substrs=['= 5']) 35 self.expect("expression/d ((int*)&second)[0]", substrs=['= 6']) 36 self.assertEqual(first_sym.GetStartAddress().GetLoadAddress(target), lldb.LLDB_INVALID_ADDRESS) 37 self.assertEqual(second_sym.GetStartAddress().GetLoadAddress(target), lldb.LLDB_INVALID_ADDRESS) 38 39 # View the first element of `first` and `second` with 40 # no slide applied, but with load address set. 41 # 42 # In memory, we have something like 43 # 0x1000 - 0x17ff first[] 44 # 0x1800 - 0x1fff second[] 45 error = target.SetModuleLoadAddress(module, 0) 46 self.assertSuccess(error) 47 self.expect("expression/d ((int*)&first)[0]", substrs=['= 5']) 48 self.expect("expression/d ((int*)&second)[0]", substrs=['= 6']) 49 self.assertEqual(first_sym.GetStartAddress().GetLoadAddress(target), 50 first_sym.GetStartAddress().GetFileAddress()) 51 self.assertEqual(second_sym.GetStartAddress().GetLoadAddress(target), 52 second_sym.GetStartAddress().GetFileAddress()) 53 54 # Slide it a little bit less than the size of the first array. 55 # 56 # In memory, we have something like 57 # 0xfc0 - 0x17bf first[] 58 # 0x17c0 - 0x1fbf second[] 59 # 60 # but if the original entries are still present in lldb, 61 # the beginning address of second[] will get a load address 62 # of 0x1800, instead of 0x17c0 (0x1800-64) as we need to get. 63 error = target.SetModuleLoadAddress(module, first_size - 64) 64 self.assertSuccess(error) 65 self.expect("expression/d ((int*)&first)[0]", substrs=['= 5']) 66 self.expect("expression/d ((int*)&second)[0]", substrs=['= 6']) 67 self.assertNotEqual(first_sym.GetStartAddress().GetLoadAddress(target), 68 first_sym.GetStartAddress().GetFileAddress()) 69 self.assertNotEqual(second_sym.GetStartAddress().GetLoadAddress(target), 70 second_sym.GetStartAddress().GetFileAddress()) 71 72 # Slide it back to the original vmaddr. 73 error = target.SetModuleLoadAddress(module, 0) 74 self.assertSuccess(error) 75 self.expect("expression/d ((int*)&first)[0]", substrs=['= 5']) 76 self.expect("expression/d ((int*)&second)[0]", substrs=['= 6']) 77 self.assertEqual(first_sym.GetStartAddress().GetLoadAddress(target), 78 first_sym.GetStartAddress().GetFileAddress()) 79 self.assertEqual(second_sym.GetStartAddress().GetLoadAddress(target), 80 second_sym.GetStartAddress().GetFileAddress()) 81 82 # Make sure we can use a slide > INT64_MAX. 83 error = target.SetModuleLoadAddress(module, 0xffffffff12345678) 84 self.assertSuccess(error) 85