Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 41 additions & 9 deletions lldb/source/Target/Platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -750,12 +750,30 @@ Platform::ResolveExecutable(const ModuleSpec &module_spec,

if (resolved_module_spec.GetArchitecture().IsValid() ||
resolved_module_spec.GetUUID().IsValid()) {
Status error =
ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
module_search_paths_ptr, nullptr, nullptr);
// Call locate module callback first to give it a chance to find/register
// symbol file specs for the main executable, similar to how shared
// libraries are handled in Platform::GetRemoteSharedModule()
FileSpec symbol_file_spec;
CallLocateModuleCallbackIfSet(resolved_module_spec, exe_module_sp,
symbol_file_spec, nullptr);

if (exe_module_sp && exe_module_sp->GetObjectFile())
return error;
Status error;
if (!exe_module_sp) {
// If locate module callback didn't provide a module, fallback to standard
// path
error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
module_search_paths_ptr, nullptr,
nullptr);
}

if (exe_module_sp && exe_module_sp->GetObjectFile()) {
// Set the symbol file if locate module callback returned one
if (symbol_file_spec) {
exe_module_sp->SetSymbolFileFileSpec(symbol_file_spec);
}
return error; // Return the actual status from GetSharedModule (or success
// from callback)
}
exe_module_sp.reset();
}
// No valid architecture was specified or the exact arch wasn't found.
Expand All @@ -767,12 +785,26 @@ Platform::ResolveExecutable(const ModuleSpec &module_spec,
Status error;
for (const ArchSpec &arch : GetSupportedArchitectures(process_host_arch)) {
resolved_module_spec.GetArchitecture() = arch;
error =
ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
module_search_paths_ptr, nullptr, nullptr);

// Call locate module callback first, then fallback to standard path
FileSpec symbol_file_spec;
CallLocateModuleCallbackIfSet(resolved_module_spec, exe_module_sp,
symbol_file_spec, nullptr);

if (!exe_module_sp) {
error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
module_search_paths_ptr, nullptr,
nullptr);
}

if (error.Success()) {
if (exe_module_sp && exe_module_sp->GetObjectFile())
if (exe_module_sp && exe_module_sp->GetObjectFile()) {
// Set the symbol file if locate module callback returned one
if (symbol_file_spec) {
exe_module_sp->SetSymbolFileFileSpec(symbol_file_spec);
}
break;
}
error = Status::FromErrorString("no exe object file");
}

Expand Down
Loading