111 lines · python
1"""2Test that a binary can be slid to different load addresses correctly3"""4 5 6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class MultipleSlidesTestCase(TestBase):13 NO_DEBUG_INFO_TESTCASE = True14 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 = False21 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 int_size = target.FindFirstType("int").GetByteSize()33 self.assertGreaterEqual(first_size, 2048 * int_size)34 second_size = (35 second_sym.GetEndAddress().GetOffset()36 - second_sym.GetStartAddress().GetOffset()37 )38 self.assertGreaterEqual(second_size, 2048 * int_size)39 40 # View the first element of `first` and `second` while41 # they have no load address set.42 self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])43 self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])44 self.assertEqual(45 first_sym.GetStartAddress().GetLoadAddress(target),46 lldb.LLDB_INVALID_ADDRESS,47 )48 self.assertEqual(49 second_sym.GetStartAddress().GetLoadAddress(target),50 lldb.LLDB_INVALID_ADDRESS,51 )52 53 # View the first element of `first` and `second` with54 # no slide applied, but with load address set.55 #56 # In memory, we have something like57 # 0x1000 - 0x17ff first[]58 # 0x1800 - 0x1fff second[]59 error = target.SetModuleLoadAddress(module, 0)60 self.assertSuccess(error)61 self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])62 self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])63 self.assertEqual(64 first_sym.GetStartAddress().GetLoadAddress(target),65 first_sym.GetStartAddress().GetFileAddress(),66 )67 self.assertEqual(68 second_sym.GetStartAddress().GetLoadAddress(target),69 second_sym.GetStartAddress().GetFileAddress(),70 )71 72 # Slide it a little bit less than the size of the first array.73 #74 # In memory, we have something like75 # 0xfc0 - 0x17bf first[]76 # 0x17c0 - 0x1fbf second[]77 #78 # but if the original entries are still present in lldb,79 # the beginning address of second[] will get a load address80 # of 0x1800, instead of 0x17c0 (0x1800-64) as we need to get.81 error = target.SetModuleLoadAddress(module, first_size - 64)82 self.assertSuccess(error)83 self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])84 self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])85 self.assertNotEqual(86 first_sym.GetStartAddress().GetLoadAddress(target),87 first_sym.GetStartAddress().GetFileAddress(),88 )89 self.assertNotEqual(90 second_sym.GetStartAddress().GetLoadAddress(target),91 second_sym.GetStartAddress().GetFileAddress(),92 )93 94 # Slide it back to the original vmaddr.95 error = target.SetModuleLoadAddress(module, 0)96 self.assertSuccess(error)97 self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])98 self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])99 self.assertEqual(100 first_sym.GetStartAddress().GetLoadAddress(target),101 first_sym.GetStartAddress().GetFileAddress(),102 )103 self.assertEqual(104 second_sym.GetStartAddress().GetLoadAddress(target),105 second_sym.GetStartAddress().GetFileAddress(),106 )107 108 # Make sure we can use a slide > INT64_MAX.109 error = target.SetModuleLoadAddress(module, 0xFFFFFFFF12345678)110 self.assertSuccess(error)111