I’m trying to load a core file on Ubuntu 12, but I’m getting an assert in ThreadElfCore::CreateRegisterContextForFrame() because the arch.GetTriple().getOS() returns UnknownOS instead of Linux.
I’ve stepped through loading my binary, and the target’s OS Is correctly set to Linux. But ProcessElfCore::DoLoadCore() has this code:
// Even if the architecture is set in the target, we need to override
// it to match the core file which is always single arch.
ArchSpec arch (m_core_module_sp->GetArchitecture());
The problem is Linux core files don’t have anything in them to indicate that they are Linux. Linux is identified through a note that is added by gcc/clang, but isn’t in the core file. So x86-64-unknown-Linux gets replaced by x86-64-unknown-unknown.
I’m thinking of changing this to not override the architecture if the target’s OS is Linux. Any thoughts?
Instead of triggering off Linux, can we trigger off the fact that the core module really didn't figure out what the architecture actually is? Would unknown-unknown ever be a correct/useful response for a modules's architecture?
I think unknown-unknown is only useful for Hexagon, but in this case the target arch is hexagon-unknown-unknown, so not setting it would be OK.
ProcessElfCore also has this:
ObjectFileELF *core_file = (ObjectFileELF *)(m_core_module_sp->GetObjectFile());
I think it should be changed to return the target's arch if the OS is unknown.
You should get the target architecture and merge the one from the core file and then set the target architecture using that.
ArchSpec target_arch = m_target.GetArchitecture();
ArchSpec core_arch = m_core_module_sp->GetArchitecture();
This way any unspecified unknowns will not replace what is in the target's original architecture.