diff options
-rw-r--r-- | lldb/include/lldb/Core/Debugger.h | 2 | ||||
-rw-r--r-- | lldb/include/lldb/Host/DynamicLibrary.h | 3 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectPlugin.cpp | 5 | ||||
-rw-r--r-- | lldb/source/Core/Debugger.cpp | 17 | ||||
-rw-r--r-- | lldb/source/Host/common/DynamicLibrary.cpp | 6 |
5 files changed, 29 insertions, 4 deletions
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index 4f80430163c..34e939dec64 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -330,7 +330,7 @@ public: typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger); bool - LoadPlugin (const FileSpec& spec); + LoadPlugin (const FileSpec& spec, Error& error); protected: diff --git a/lldb/include/lldb/Host/DynamicLibrary.h b/lldb/include/lldb/Host/DynamicLibrary.h index 3a360b04f51..1fcc7d1883c 100644 --- a/lldb/include/lldb/Host/DynamicLibrary.h +++ b/lldb/include/lldb/Host/DynamicLibrary.h @@ -36,6 +36,9 @@ public: return (T)symbol; } + bool + IsValid (); + private: lldb_private::FileSpec m_filespec; void* m_handle; diff --git a/lldb/source/Commands/CommandObjectPlugin.cpp b/lldb/source/Commands/CommandObjectPlugin.cpp index 395dad75219..1bc7632e298 100644 --- a/lldb/source/Commands/CommandObjectPlugin.cpp +++ b/lldb/source/Commands/CommandObjectPlugin.cpp @@ -96,10 +96,13 @@ protected: FileSpec dylib_fspec(path,true); - if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec)) + if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error)) result.SetStatus(eReturnStatusSuccessFinishResult); else + { + result.AppendError(error.AsCString()); result.SetStatus(eReturnStatusFailed); + } return result.Succeeded(); } diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index f442aa6073d..42a1540986e 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -344,20 +344,32 @@ Debugger::SettingsTerminate () } bool -Debugger::LoadPlugin (const FileSpec& spec) +Debugger::LoadPlugin (const FileSpec& spec, Error& error) { lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec)); + if (!dynlib_sp || dynlib_sp->IsValid() == false) + { + if (spec.Exists()) + error.SetErrorString("this file does not represent a loadable dylib"); + else + error.SetErrorString("no such file"); + return false; + } lldb::DebuggerSP debugger_sp(shared_from_this()); lldb::SBDebugger debugger_sb(debugger_sp); // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); if (!init_func) + { + error.SetErrorString("cannot find the initialization function lldb::PluginInitialize(lldb::SBDebugger)"); return false; + } if (init_func(debugger_sb)) { m_loaded_plugins.push_back(dynlib_sp); return true; } + error.SetErrorString("dylib refused to be loaded"); return false; } @@ -392,7 +404,8 @@ LoadPluginCallback if (plugin_file_spec.GetFileNameExtension() != g_dylibext) return FileSpec::eEnumerateDirectoryResultNext; - debugger->LoadPlugin (plugin_file_spec); + Error plugin_load_error; + debugger->LoadPlugin (plugin_file_spec, plugin_load_error); return FileSpec::eEnumerateDirectoryResultNext; } diff --git a/lldb/source/Host/common/DynamicLibrary.cpp b/lldb/source/Host/common/DynamicLibrary.cpp index e1ac3666829..315a675895f 100644 --- a/lldb/source/Host/common/DynamicLibrary.cpp +++ b/lldb/source/Host/common/DynamicLibrary.cpp @@ -20,6 +20,12 @@ DynamicLibrary::DynamicLibrary (const FileSpec& spec, uint32_t options) : m_file m_handle = NULL; } +bool +DynamicLibrary::IsValid () +{ + return m_handle != NULL; +} + DynamicLibrary::~DynamicLibrary () { if (m_handle) |