From 783bfc8caa4c50c0248f90ea7adf2dbd1e48f4e7 Mon Sep 17 00:00:00 2001 From: Tamas Berghammer Date: Thu, 18 Jun 2015 20:43:56 +0000 Subject: Fetch object file load address if it isn't specified by the linker Differential revision: http://reviews.llvm.org/D10490 llvm-svn: 240052 --- .../Plugins/Process/Linux/NativeProcessLinux.cpp | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp') diff --git a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp index be07b4365803..be4b3193050c 100644 --- a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp @@ -3648,6 +3648,39 @@ NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& f module_file_spec.GetFilename().AsCString(), GetID()); } +Error +NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef& file_name, lldb::addr_t& load_addr) +{ + load_addr = LLDB_INVALID_ADDRESS; + Error error = ProcFileReader::ProcessLineByLine (GetID (), "maps", + [&] (const std::string &line) -> bool + { + StringRef maps_row(line); + + SmallVector maps_columns; + maps_row.split(maps_columns, StringRef(" "), -1, false); + + if (maps_columns.size() < 6) + { + // Return true to continue reading the proc file + return true; + } + + if (maps_columns[5] == file_name) + { + StringExtractor addr_extractor(maps_columns[0].str().c_str()); + load_addr = addr_extractor.GetHexMaxU64(false, LLDB_INVALID_ADDRESS); + + // Return false to stop reading the proc file further + return false; + } + + // Return true to continue reading the proc file + return true; + }); + return error; +} + Error NativeProcessLinux::ResumeThread( lldb::tid_t tid, -- cgit v1.2.3