| """ | 
 | Test that a binary can be slid to different load addresses correctly | 
 | """ | 
 |  | 
 |  | 
 | import lldb | 
 | from lldbsuite.test.decorators import * | 
 | from lldbsuite.test.lldbtest import * | 
 | from lldbsuite.test import lldbutil | 
 |  | 
 |  | 
 | class MultipleSlidesTestCase(TestBase): | 
 |     NO_DEBUG_INFO_TESTCASE = True | 
 |  | 
 |     def test_mulitple_slides(self): | 
 |         """Test that a binary can be slid multiple times correctly.""" | 
 |         self.build() | 
 |         exe = self.getBuildArtifact("a.out") | 
 |         err = lldb.SBError() | 
 |         load_dependent_modules = False | 
 |         target = self.dbg.CreateTarget(exe, "", "", load_dependent_modules, err) | 
 |         self.assertTrue(target.IsValid()) | 
 |         module = target.GetModuleAtIndex(0) | 
 |         self.assertTrue(module.IsValid()) | 
 |  | 
 |         first_sym = target.FindSymbols("first").GetContextAtIndex(0).GetSymbol() | 
 |         second_sym = target.FindSymbols("second").GetContextAtIndex(0).GetSymbol() | 
 |         first_size = ( | 
 |             first_sym.GetEndAddress().GetOffset() | 
 |             - first_sym.GetStartAddress().GetOffset() | 
 |         ) | 
 |         second_size = ( | 
 |             second_sym.GetEndAddress().GetOffset() | 
 |             - second_sym.GetStartAddress().GetOffset() | 
 |         ) | 
 |  | 
 |         # View the first element of `first` and `second` while | 
 |         # they have no load address set. | 
 |         self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) | 
 |         self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) | 
 |         self.assertEqual( | 
 |             first_sym.GetStartAddress().GetLoadAddress(target), | 
 |             lldb.LLDB_INVALID_ADDRESS, | 
 |         ) | 
 |         self.assertEqual( | 
 |             second_sym.GetStartAddress().GetLoadAddress(target), | 
 |             lldb.LLDB_INVALID_ADDRESS, | 
 |         ) | 
 |  | 
 |         # View the first element of `first` and `second` with | 
 |         # no slide applied, but with load address set. | 
 |         # | 
 |         # In memory, we have something like | 
 |         #    0x1000 - 0x17ff  first[] | 
 |         #    0x1800 - 0x1fff  second[] | 
 |         error = target.SetModuleLoadAddress(module, 0) | 
 |         self.assertSuccess(error) | 
 |         self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) | 
 |         self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) | 
 |         self.assertEqual( | 
 |             first_sym.GetStartAddress().GetLoadAddress(target), | 
 |             first_sym.GetStartAddress().GetFileAddress(), | 
 |         ) | 
 |         self.assertEqual( | 
 |             second_sym.GetStartAddress().GetLoadAddress(target), | 
 |             second_sym.GetStartAddress().GetFileAddress(), | 
 |         ) | 
 |  | 
 |         # Slide it a little bit less than the size of the first array. | 
 |         # | 
 |         # In memory, we have something like | 
 |         #    0xfc0 - 0x17bf  first[] | 
 |         #    0x17c0 - 0x1fbf second[] | 
 |         # | 
 |         # but if the original entries are still present in lldb, | 
 |         # the beginning address of second[] will get a load address | 
 |         # of 0x1800, instead of 0x17c0 (0x1800-64) as we need to get. | 
 |         error = target.SetModuleLoadAddress(module, first_size - 64) | 
 |         self.assertSuccess(error) | 
 |         self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) | 
 |         self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) | 
 |         self.assertNotEqual( | 
 |             first_sym.GetStartAddress().GetLoadAddress(target), | 
 |             first_sym.GetStartAddress().GetFileAddress(), | 
 |         ) | 
 |         self.assertNotEqual( | 
 |             second_sym.GetStartAddress().GetLoadAddress(target), | 
 |             second_sym.GetStartAddress().GetFileAddress(), | 
 |         ) | 
 |  | 
 |         # Slide it back to the original vmaddr. | 
 |         error = target.SetModuleLoadAddress(module, 0) | 
 |         self.assertSuccess(error) | 
 |         self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"]) | 
 |         self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"]) | 
 |         self.assertEqual( | 
 |             first_sym.GetStartAddress().GetLoadAddress(target), | 
 |             first_sym.GetStartAddress().GetFileAddress(), | 
 |         ) | 
 |         self.assertEqual( | 
 |             second_sym.GetStartAddress().GetLoadAddress(target), | 
 |             second_sym.GetStartAddress().GetFileAddress(), | 
 |         ) | 
 |  | 
 |         # Make sure we can use a slide > INT64_MAX. | 
 |         error = target.SetModuleLoadAddress(module, 0xFFFFFFFF12345678) | 
 |         self.assertSuccess(error) |