11fee2562SJason Molenda""" 21fee2562SJason MolendaTest that a binary can be slid to different load addresses correctly 31fee2562SJason Molenda""" 41fee2562SJason Molenda 51fee2562SJason Molenda 61fee2562SJason Molendaimport lldb 71fee2562SJason Molendafrom lldbsuite.test.decorators import * 81fee2562SJason Molendafrom lldbsuite.test.lldbtest import * 91fee2562SJason Molendafrom lldbsuite.test import lldbutil 101fee2562SJason Molenda 111fee2562SJason Molenda 121fee2562SJason Molendaclass MultipleSlidesTestCase(TestBase): 131fee2562SJason Molenda NO_DEBUG_INFO_TESTCASE = True 14*2238dcc3SJonas Devlieghere 151fee2562SJason Molenda def test_mulitple_slides(self): 161fee2562SJason Molenda """Test that a binary can be slid multiple times correctly.""" 171fee2562SJason Molenda self.build() 181fee2562SJason Molenda exe = self.getBuildArtifact("a.out") 191fee2562SJason Molenda err = lldb.SBError() 201fee2562SJason Molenda load_dependent_modules = False 21*2238dcc3SJonas Devlieghere target = self.dbg.CreateTarget(exe, "", "", load_dependent_modules, err) 221fee2562SJason Molenda self.assertTrue(target.IsValid()) 231fee2562SJason Molenda module = target.GetModuleAtIndex(0) 241fee2562SJason Molenda self.assertTrue(module.IsValid()) 251fee2562SJason Molenda 261fee2562SJason Molenda first_sym = target.FindSymbols("first").GetContextAtIndex(0).GetSymbol() 271fee2562SJason Molenda second_sym = target.FindSymbols("second").GetContextAtIndex(0).GetSymbol() 28*2238dcc3SJonas Devlieghere first_size = ( 29*2238dcc3SJonas Devlieghere first_sym.GetEndAddress().GetOffset() 30*2238dcc3SJonas Devlieghere - first_sym.GetStartAddress().GetOffset() 31*2238dcc3SJonas Devlieghere ) 32*2238dcc3SJonas Devlieghere second_size = ( 33*2238dcc3SJonas Devlieghere second_sym.GetEndAddress().GetOffset() 34*2238dcc3SJonas Devlieghere - second_sym.GetStartAddress().GetOffset() 35*2238dcc3SJonas Devlieghere ) 361fee2562SJason Molenda 371fee2562SJason Molenda # View the first element of `first` and `second` while 381fee2562SJason Molenda # they have no load address set. 39*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) 40*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) 41*2238dcc3SJonas Devlieghere self.assertEqual( 42*2238dcc3SJonas Devlieghere first_sym.GetStartAddress().GetLoadAddress(target), 43*2238dcc3SJonas Devlieghere lldb.LLDB_INVALID_ADDRESS, 44*2238dcc3SJonas Devlieghere ) 45*2238dcc3SJonas Devlieghere self.assertEqual( 46*2238dcc3SJonas Devlieghere second_sym.GetStartAddress().GetLoadAddress(target), 47*2238dcc3SJonas Devlieghere lldb.LLDB_INVALID_ADDRESS, 48*2238dcc3SJonas Devlieghere ) 491fee2562SJason Molenda 501fee2562SJason Molenda # View the first element of `first` and `second` with 511fee2562SJason Molenda # no slide applied, but with load address set. 521fee2562SJason Molenda # 531fee2562SJason Molenda # In memory, we have something like 541fee2562SJason Molenda # 0x1000 - 0x17ff first[] 551fee2562SJason Molenda # 0x1800 - 0x1fff second[] 56ea95da18SJonas Devlieghere error = target.SetModuleLoadAddress(module, 0) 57ea95da18SJonas Devlieghere self.assertSuccess(error) 58*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) 59*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) 60*2238dcc3SJonas Devlieghere self.assertEqual( 61*2238dcc3SJonas Devlieghere first_sym.GetStartAddress().GetLoadAddress(target), 62*2238dcc3SJonas Devlieghere first_sym.GetStartAddress().GetFileAddress(), 63*2238dcc3SJonas Devlieghere ) 64*2238dcc3SJonas Devlieghere self.assertEqual( 65*2238dcc3SJonas Devlieghere second_sym.GetStartAddress().GetLoadAddress(target), 66*2238dcc3SJonas Devlieghere second_sym.GetStartAddress().GetFileAddress(), 67*2238dcc3SJonas Devlieghere ) 681fee2562SJason Molenda 691fee2562SJason Molenda # Slide it a little bit less than the size of the first array. 701fee2562SJason Molenda # 711fee2562SJason Molenda # In memory, we have something like 721fee2562SJason Molenda # 0xfc0 - 0x17bf first[] 731fee2562SJason Molenda # 0x17c0 - 0x1fbf second[] 741fee2562SJason Molenda # 751fee2562SJason Molenda # but if the original entries are still present in lldb, 761fee2562SJason Molenda # the beginning address of second[] will get a load address 771fee2562SJason Molenda # of 0x1800, instead of 0x17c0 (0x1800-64) as we need to get. 78ea95da18SJonas Devlieghere error = target.SetModuleLoadAddress(module, first_size - 64) 79ea95da18SJonas Devlieghere self.assertSuccess(error) 80*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) 81*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) 82*2238dcc3SJonas Devlieghere self.assertNotEqual( 83*2238dcc3SJonas Devlieghere first_sym.GetStartAddress().GetLoadAddress(target), 84*2238dcc3SJonas Devlieghere first_sym.GetStartAddress().GetFileAddress(), 85*2238dcc3SJonas Devlieghere ) 86*2238dcc3SJonas Devlieghere self.assertNotEqual( 87*2238dcc3SJonas Devlieghere second_sym.GetStartAddress().GetLoadAddress(target), 88*2238dcc3SJonas Devlieghere second_sym.GetStartAddress().GetFileAddress(), 89*2238dcc3SJonas Devlieghere ) 901fee2562SJason Molenda 911fee2562SJason Molenda # Slide it back to the original vmaddr. 92ea95da18SJonas Devlieghere error = target.SetModuleLoadAddress(module, 0) 93ea95da18SJonas Devlieghere self.assertSuccess(error) 94*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) 95*2238dcc3SJonas Devlieghere self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) 96*2238dcc3SJonas Devlieghere self.assertEqual( 97*2238dcc3SJonas Devlieghere first_sym.GetStartAddress().GetLoadAddress(target), 98*2238dcc3SJonas Devlieghere first_sym.GetStartAddress().GetFileAddress(), 99*2238dcc3SJonas Devlieghere ) 100*2238dcc3SJonas Devlieghere self.assertEqual( 101*2238dcc3SJonas Devlieghere second_sym.GetStartAddress().GetLoadAddress(target), 102*2238dcc3SJonas Devlieghere second_sym.GetStartAddress().GetFileAddress(), 103*2238dcc3SJonas Devlieghere ) 1041fee2562SJason Molenda 105ea95da18SJonas Devlieghere # Make sure we can use a slide > INT64_MAX. 106*2238dcc3SJonas Devlieghere error = target.SetModuleLoadAddress(module, 0xFFFFFFFF12345678) 107ea95da18SJonas Devlieghere self.assertSuccess(error) 108