brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 5fd2b76 Raw
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