Currently, SBTarget::SetModuleLoadAddress does not accept large slides needed to load images in high memory. This function should always have taken an unsigned as the slide, as it immediately passes it to Target::SetSectionLoadAddress which takes an unsigned. This patch adds an overload and exposes that to SWIG instead of the signed variant. I've marked the signed variant as deprecated and added check that the slide is positive. rdar://101355155 Differential revision: https://reviews.llvm.org/D147482
85 lines
4.0 KiB
Python
85 lines
4.0 KiB
Python
"""
|
|
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)
|