A few things to check on: lldb_private::Process already has:
//------------------------------------------------------------------ // Returns AUXV structure found in many ELF-based environments. // // The default action is to return an empty data buffer. // // @return // A data buffer containing the contents of the AUXV data. //------------------------------------------------------------------ virtual const lldb::DataBufferSP GetAuxvData(); Would this help? What dynamic loader is currently being selected when you debug? PluginDynamicLoaderPosixDYLD? If so, maybe PluginDynamicLoaderPosixDYLD can just use Process::GetAuxvData()? It would be nice to abstract this through lldb_private::Process if PluginDynamicLoaderPosixDYLD just needs a bit of help to get started as I would prefer to keep using PluginDynamicLoaderPosixDYLD or its subclasses if possible so that we don't have to create DynamicLoaderGDBRemote if we don't need to. Greg > On Apr 24, 2015, at 10:21 AM, Aidan Dodds <ai...@codeplay.com> wrote: > > Thanks for the quick response Greg. > > Its an interesting point you raise when it comes to knowing how any > DynamicLoaderGDBRemote would detect newly loaded > modules. Since my target is Linux based the standard approach of hooking the > rendezvous address should still work. > Presumably since I will have the full list of loaded modules and their > locations, I would be able to find ld-linux.so, > and I additionally have access to the auxvector via the $qXfer:auxv packet. > Perhaps these will provide enough data for me > to locate the dyld rendezvous address. > > Perhaps lldbPluginDynamicLoaderPosixDYLD would serve as a suitable base class > for DynamicLoaderGDBRemote. > > I'll mull over your suggestions this weekend and get back to you with > something more concrete on Monday. > In the mean time, if anyone else also has ideas or suggestions I'm all ears. > > Thanks again, > Aidan > > > On 24/04/2015 17:45, Greg Clayton wrote: >> Actually scratch this last approach. >> >> A better approach would be to make a new DynamicLoader subclass called >> DynamicLoaderGDBRemote. This plug-in would only be created if the process' >> name is "gdb-remote" and if the ProcessGDBRemote supports the >> qXfer:libraries:read command. Then the DynamicLoaderGDBRemote can cast the >> abstract lldb_private::Process to a ProcessGDBRemote and use any special >> functions in ProcessGDBRemote to get this info and make the shared libraries >> get loaded correctly. >> >> We try to make our GDB server binaries and simple as possible and we don't >> vend shared library info from them. In this case we want to use the correct >> DynamicLoader plug-ins for the current process. It also allows us to use the >> DynamicLoader plug-ins with multiple processes. For example, >> DynamicLoaderDarwinKernel can either be used with ProcessGDBRemote or >> ProcessKDP. It just uses generic process calls on lldb_private::Process to >> do its thing so these plug-ins can work with any lldb_private::Process. In >> this case we have a case where the DynamicLoaderGDBRemote would only work >> with ProcessGDBRemote. In the static class function you would need to check >> the process plug-in name: >> >> DynamicLoader * >> DynamicLoaderGDBRemote::CreateInstance (Process* process, bool force) >> { >> if (process->GetPluginName() == ProcessGDBRemote::GetPluginNameStatic()) >> { >> ProcessGDBRemote* gdb_process = (ProcessGDBRemote*)process; >> if (gdb_process->Supports_qXfer_libraries()) >> { >> // Create a new instance of DynamicLoaderGDBRemote and return it >> } >> } >> return NULL; >> } >> >> Then the question becomes how do shared library loaded notifications come in >> when a shared library is loaded dynamically? >> >> Greg Clayton >> >> >>> On Apr 24, 2015, at 9:28 AM, Greg Clayton <gclay...@apple.com> wrote: >>> >>> This if fine. We will want to make these changes as a virtual call in >>> lldb_private::Process where we ask the process if it can help discover >>> loaded shared libraries. The dynamic loader plug-ins will need to be >>> modified to take advantage of this as they get an abstract >>> "lldb_private::Process*" when they are created. Then the dynamic loader >>> plug-ins can ask the process if they can supply the module loaded info, and >>> take advantage of this if needed. >>> >>> Maybe something like: >>> >>> namespace lldb_private { >>> class Process { >>> ... >>> virtual Error GetLoadedSharedLibraries(std::vector<LoadedModuleInfo> >>> &loaded_modules) >>> { >>> Error error; >>> loaded_modules.clear(); >>> error.SetErrorString("unimplemented"); >>> return error; >>> } >>> >>> >>> I don't believe qModuleInfo if the correct call to be using. I believe this >>> is a platform packet only that allows you to ask about what a remote file >>> contains. It answers with the info on each contained file that is contained >>> within a file and returns the architecture, file offset, and file size for >>> each different slice. Most files only have one item inside them, so they >>> would return info on that single file. This isn't designed to be tied to a >>> process nor is it designed to pass along any module load info for a >>> specific process. >>> >>> I would just use the qXfer:libraries:read command and implement this as a >>> new call in "lldb_private::Process *" that returns an error in the default >>> implementation, and the ProcessGDBRemote will have a override version of >>> this function that can give us the info we need. >>> >>> Let me know if you need any help in making this happen. >>> >>> Greg >>> >>>> On Apr 24, 2015, at 7:06 AM, Aidan Dodds <ai...@codeplay.com> wrote: >>>> >>>> Hi, >>>> >>>> I would like to improve support for the case where LLDB is debugging a >>>> remote target (via gdbserver) >>>> yet doesn't have access to the target executable, and only has access to a >>>> shared object already >>>> loaded by the target. >>>> >>>> This is supported from GDB, as I can connect to a remote GDBServer without >>>> specifying any executable, >>>> and after issuing 'set solib-search-paths' it will resolve all of the >>>> loaded shared objects correctly, while >>>> still being blind to the target executable. >>>> >>>> I feel like LLDB should be able to connect to a remote target, and then >>>> after issuing a 'target modules add' >>>> command be able to resolve its load address automatically. I believe LLDB >>>> can already do this to some extent >>>> via the 'qModuleInfo' RSP packet. >>>> >>>> The 'qXfer:libraries:read' packet is provided by GDBServer, and will >>>> return an XML document containing >>>> all of the shared objects loaded by the target and their load addresses. >>>> It is possible to parse this now using the >>>> recent libxml2 support in LLDB. >>>> >>>> GDBRemoteCommunicationClient::GetModuleInfo() could be extended to try and >>>> gain information about a >>>> loaded module via the 'qXfer:libraries:read' packet if 'qModuleInfo' fails >>>> or is not supported. >>>> >>>> I would be interested to hear what others think, or get some feedback if I >>>> have perhaps misunderstood something. >>>> >>>> Thanks, >>>> Aidan Dodds >>>> >>>> _______________________________________________ >>>> lldb-dev mailing list >>>> lldb-dev@cs.uiuc.edu >>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev >>> >>> _______________________________________________ >>> lldb-dev mailing list >>> lldb-dev@cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev > _______________________________________________ lldb-dev mailing list lldb-dev@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev