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