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