xref: /llvm-project/lldb/test/API/functionalities/multiple-slides/TestMultipleSlides.py (revision ea95da1809008abd9b81b0fb2cc6ec6438c4c0e0)
1"""
2Test that a binary can be slid to different load addresses correctly
3"""
4
5
6
7import lldb
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10from lldbsuite.test import lldbutil
11
12
13class MultipleSlidesTestCase(TestBase):
14
15    NO_DEBUG_INFO_TESTCASE = True
16    def test_mulitple_slides(self):
17        """Test that a binary can be slid multiple times correctly."""
18        self.build()
19        exe = self.getBuildArtifact("a.out")
20        err = lldb.SBError()
21        load_dependent_modules = False
22        target = self.dbg.CreateTarget(exe, '', '', load_dependent_modules, err)
23        self.assertTrue(target.IsValid())
24        module = target.GetModuleAtIndex(0)
25        self.assertTrue(module.IsValid())
26
27        first_sym = target.FindSymbols("first").GetContextAtIndex(0).GetSymbol()
28        second_sym = target.FindSymbols("second").GetContextAtIndex(0).GetSymbol()
29        first_size = first_sym.GetEndAddress().GetOffset() - first_sym.GetStartAddress().GetOffset()
30        second_size = second_sym.GetEndAddress().GetOffset() - second_sym.GetStartAddress().GetOffset()
31
32        # View the first element of `first` and `second` while
33        # they have no load address set.
34        self.expect("expression/d ((int*)&first)[0]", substrs=['= 5'])
35        self.expect("expression/d ((int*)&second)[0]", substrs=['= 6'])
36        self.assertEqual(first_sym.GetStartAddress().GetLoadAddress(target), lldb.LLDB_INVALID_ADDRESS)
37        self.assertEqual(second_sym.GetStartAddress().GetLoadAddress(target), lldb.LLDB_INVALID_ADDRESS)
38
39        # View the first element of `first` and `second` with
40        # no slide applied, but with load address set.
41        #
42        # In memory, we have something like
43        #    0x1000 - 0x17ff  first[]
44        #    0x1800 - 0x1fff  second[]
45        error = target.SetModuleLoadAddress(module, 0)
46        self.assertSuccess(error)
47        self.expect("expression/d ((int*)&first)[0]", substrs=['= 5'])
48        self.expect("expression/d ((int*)&second)[0]", substrs=['= 6'])
49        self.assertEqual(first_sym.GetStartAddress().GetLoadAddress(target),
50                         first_sym.GetStartAddress().GetFileAddress())
51        self.assertEqual(second_sym.GetStartAddress().GetLoadAddress(target),
52                         second_sym.GetStartAddress().GetFileAddress())
53
54        # Slide it a little bit less than the size of the first array.
55        #
56        # In memory, we have something like
57        #    0xfc0 - 0x17bf  first[]
58        #    0x17c0 - 0x1fbf second[]
59        #
60        # but if the original entries are still present in lldb,
61        # the beginning address of second[] will get a load address
62        # of 0x1800, instead of 0x17c0 (0x1800-64) as we need to get.
63        error = target.SetModuleLoadAddress(module, first_size - 64)
64        self.assertSuccess(error)
65        self.expect("expression/d ((int*)&first)[0]", substrs=['= 5'])
66        self.expect("expression/d ((int*)&second)[0]", substrs=['= 6'])
67        self.assertNotEqual(first_sym.GetStartAddress().GetLoadAddress(target),
68                         first_sym.GetStartAddress().GetFileAddress())
69        self.assertNotEqual(second_sym.GetStartAddress().GetLoadAddress(target),
70                         second_sym.GetStartAddress().GetFileAddress())
71
72        # Slide it back to the original vmaddr.
73        error = target.SetModuleLoadAddress(module, 0)
74        self.assertSuccess(error)
75        self.expect("expression/d ((int*)&first)[0]", substrs=['= 5'])
76        self.expect("expression/d ((int*)&second)[0]", substrs=['= 6'])
77        self.assertEqual(first_sym.GetStartAddress().GetLoadAddress(target),
78                         first_sym.GetStartAddress().GetFileAddress())
79        self.assertEqual(second_sym.GetStartAddress().GetLoadAddress(target),
80                         second_sym.GetStartAddress().GetFileAddress())
81
82        # Make sure we can use a slide > INT64_MAX.
83        error = target.SetModuleLoadAddress(module, 0xffffffff12345678)
84        self.assertSuccess(error)
85