public bool ApplyPlaceholderProperties(SbModule destModule, PlaceholderModuleProperties properties, RemoteTarget lldbTarget) { long slide = properties.Slide; SbAddress headerAddress = destModule.GetObjectFileHeaderAddress(); if (headerAddress != null) { // For libraries this will generally equal 0, for executables it will equal // |placeholderBaseLoadAddress|. ulong fileBaseAddress = headerAddress.GetFileAddress(); slide -= (long)fileBaseAddress; } SbError error = lldbTarget.SetModuleLoadAddress(destModule, slide); if (error.Fail()) { Trace.WriteLine( $"Failed to set load address on destination module: {error.GetCString()}."); return(false); } if (!destModule.SetPlatformFileSpec(properties.PlatformFileSpec)) { Trace.WriteLine("Failed to set file spec on the destination module."); return(false); } return(true); }
public virtual async Task <(SbModule, bool)> LoadBinaryAsync( SbModule lldbModule, TextWriter searchLog) { if (lldbModule == null) { throw new ArgumentNullException(nameof(lldbModule)); } searchLog = searchLog ?? TextWriter.Null; if (!moduleUtil.IsPlaceholderModule(lldbModule)) { return(lldbModule, true); } var binaryName = lldbModule.GetPlatformFileSpec()?.GetFilename(); if (string.IsNullOrEmpty(binaryName)) { await searchLog.WriteLineAsync(ErrorStrings.BinaryFileNameUnknown); Trace.WriteLine(ErrorStrings.BinaryFileNameUnknown); return(lldbModule, false); } var binaryPath = await moduleFileFinder.FindFileAsync( binaryName, new BuildId(lldbModule.GetUUIDString()), false, searchLog); if (binaryPath == null) { return(lldbModule, false); } PlaceholderModuleProperties properties = moduleUtil.GetPlaceholderProperties(lldbModule, lldbTarget); if (properties == null) { return(lldbModule, false); } RemoveModule(lldbModule); var newModule = AddModule(binaryPath, lldbModule.GetUUIDString(), searchLog); if (newModule == null) { return(lldbModule, false); } if (!moduleUtil.ApplyPlaceholderProperties(newModule, properties, lldbTarget)) { return(lldbModule, false); } LldbModuleReplaced?.Invoke(Self, new LldbModuleReplacedEventArgs(newModule, lldbModule)); return(newModule, true); }