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