""" Test that SBProcess.LoadImageUsingPaths uses RTLD_LAZY """ import os import shutil import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class LoadUsingLazyBind(TestBase): NO_DEBUG_INFO_TESTCASE = True @skipIfRemote @skipIfWindows # The Windows platform doesn't implement DoLoadImage. @skipIf(oslist=["linux"], archs=["arm"]) # Fails on arm/linux # Failing for unknown reasons on Linux, see # https://bugs.llvm.org/show_bug.cgi?id=49656. def test_load_using_lazy_bind(self): """Test that we load using RTLD_LAZY""" self.build() wd = os.path.realpath(self.getBuildDir()) def make_lib_name(name): return ( self.platformContext.shlib_prefix + name + "." + self.platformContext.shlib_extension ) def make_lib_path(name): libpath = os.path.join(wd, make_lib_name(name)) self.assertTrue(os.path.exists(libpath)) return libpath libt2_0 = make_lib_path("t2_0") libt2_1 = make_lib_path("t2_1") # Overwrite t2_0 with t2_1 to delete the definition of `use`. shutil.copy(libt2_1, libt2_0) # Launch a process and break (target, process, thread, _) = lldbutil.run_to_source_breakpoint( self, "break here", lldb.SBFileSpec("main.cpp"), extra_images=["t1"] ) # Load libt1; should fail unless we use RTLD_LAZY error = lldb.SBError() lib_spec = lldb.SBFileSpec(make_lib_name("t1")) paths = lldb.SBStringList() paths.AppendString(wd) out_spec = lldb.SBFileSpec() token = process.LoadImageUsingPaths(lib_spec, paths, out_spec, error) self.assertNotEqual(token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Got a valid token") # Calling `f1()` should return 5. frame = thread.GetFrameAtIndex(0) val = frame.EvaluateExpression("f1()") self.assertTrue(val.IsValid()) self.assertEqual(val.GetValueAsSigned(-1), 5)