diff --git a/External/FEXCore/Source/Utils/ELFLoader.cpp b/External/FEXCore/Source/Utils/ELFLoader.cpp index 4249725c1..64dd5327f 100644 --- a/External/FEXCore/Source/Utils/ELFLoader.cpp +++ b/External/FEXCore/Source/Utils/ELFLoader.cpp @@ -67,8 +67,10 @@ bool ELFContainer::IsSupportedELF(std::string const &Filename) { } ELFContainer::ELFContainer(std::string const &Filename, std::string const &RootFS, bool CustomInterpreter) { + Loaded = true; if (!LoadELF(Filename)) { LogMan::Msg::E("Couldn't Load ELF file"); + Loaded = false; return; } @@ -87,7 +89,9 @@ ELFContainer::ELFContainer(std::string const &Filename, std::string const &RootF // Found the interpreter in the rootfs } else if (!LoadELF(RawString)) { - LogMan::Msg::E("Couldn't load dynamic ELF file's interpreter"); + LogMan::Msg::E("Failed to find guest ELF's interpter '%s'", RawString); + LogMan::Msg::E("Did you forget to set an x86 rootfs? Currently '%s'", RootFS.c_str()); + Loaded = false; return; } } @@ -129,8 +133,6 @@ bool ELFContainer::LoadELF(std::string const &Filename) { if (!ELFFile.is_open()) return false; - LogMan::Throw::A(ELFFile.is_open(), "Failed to open file"); - ELFFile.seekg(0, ELFFile.end); FileSize = ELFFile.tellg(); ELFFile.seekg(0, ELFFile.beg); diff --git a/External/FEXCore/include/FEXCore/Utils/ELFLoader.h b/External/FEXCore/include/FEXCore/Utils/ELFLoader.h index 258554961..cdb5ee05f 100644 --- a/External/FEXCore/include/FEXCore/Utils/ELFLoader.h +++ b/External/FEXCore/include/FEXCore/Utils/ELFLoader.h @@ -70,6 +70,7 @@ public: bool WasDynamic() const { return DynamicProgram; } bool HasDynamicLinker() const { return !DynamicLinker.empty(); } + bool WasLoaded() const { return Loaded; } std::string &InterpreterLocation() { return DynamicLinker; } std::vector const *GetNecessaryLibs() const { return &NecessaryLibs; } @@ -155,6 +156,7 @@ private: bool DynamicProgram{false}; std::string DynamicLinker; ProgramHeader TLSHeader{}; + bool Loaded {false}; }; } // namespace ELFLoader diff --git a/Source/Tests/ELFLoader.cpp b/Source/Tests/ELFLoader.cpp index 79696cc11..2a55c9fe5 100644 --- a/Source/Tests/ELFLoader.cpp +++ b/Source/Tests/ELFLoader.cpp @@ -220,10 +220,16 @@ int main(int argc, char **argv, char **const envp) { // Early exit if the program passed in doesn't exist // Will prevent a crash later LogMan::Msg::E("%s: command not found", Program.c_str()); - return 0; + return -ENOEXEC; } FEX::HarnessHelper::ELFCodeLoader Loader{Program, LDPath(), Args, ParsedArgs, envp, &Environment}; + + if (!Loader.ELFWasLoaded()) { + // Loader couldn't load this program for some reason + return -ENOEXEC; + } + FEXCore::Config::Set(FEXCore::Config::CONFIG_APP_FILENAME, std::filesystem::canonical(Program)); FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, Loader.Is64BitMode() ? "1" : "0"); diff --git a/Source/Tests/HarnessHelpers.h b/Source/Tests/HarnessHelpers.h index 70acc286d..f876e315b 100644 --- a/Source/Tests/HarnessHelpers.h +++ b/Source/Tests/HarnessHelpers.h @@ -747,6 +747,8 @@ public: return Info; } + bool ELFWasLoaded() const { return File.WasLoaded(); } + private: ::ELFLoader::ELFContainer File; ::ELFLoader::ELFSymbolDatabase DB;