mirror of
https://github.com/lifting-bits/sleigh
synced 2026-06-21 13:56:12 +00:00
74838a39ba
* Major CMake refactor * CI fixes * Fix CMake errors * Install graphviz on Windows * More consistent CMake build types * Fix compiler defines for Windows * Fix more bugs * Add standalone tool building support * Fix typo * Update README * Install sleighLift before trying to smoketest it * Test coverage preset The compiler option '-fkeep-inline-functions' originally included with the coverage build type causes errors with the message "undefined reference to 'vtable for OpAction*'" for all OpAction subclasses. This StackOverflow answer might help in resolving this? https://stackoverflow.com/a/57504289 * Build documentation by default with CI presets * Use COMPONENT for install commands This allows for someone to specify which components they want to install if they only want or need a subset * Support cross compiling with host system sleigh compiler * Various fixes found during review * Move "_WINDOWS" define to CMakeLists.txt file * Rename ToB 'tools' directory to 'extra-tools' * Separate projects for sleigh tools Library is still top-level CMakeLists.txt More options * CMake find_package(Git) * Fix bad merge for patch paths * Fix missing libconfig.h header install * Fix issues with installation of headers * More refactoring * Refactor sleighexample into its own project/directory * Refactor specfiles building into separate project/directory * Check for termios.h header and set define if found * Update READMEs * Better consistency with install rules * Build sleighLift as a standalone project with added source * More changes to CMake subprojects * Also add "Specs" component to sleigh installation config * Try to be better at bootstrapping subprojects (hopefully this doesn't bite us, but if it does, I'm happy to remove it and say "not supported") * Address some code review * Add project sleigh_tool for tool subdirectory Could make it easier to build just the tools * Add help text to name the tool executable name * Add license notice to CMake files * Fix/Remove too specific CPack packaging configuration * Consistent capitalization of Sleigh Co-authored-by: Alex Cameron <asc@tetsuo.sh>
71 lines
2.0 KiB
C++
71 lines
2.0 KiB
C++
/*
|
|
Copyright (c) 2021-present, Trail of Bits, Inc.
|
|
All rights reserved.
|
|
|
|
This source code is licensed in accordance with the terms specified in
|
|
the LICENSE file found in the root directory of this source tree.
|
|
*/
|
|
|
|
#include "sleigh/Support.h"
|
|
|
|
#include "sleigh/SpecFilePaths.h"
|
|
|
|
namespace sleigh {
|
|
|
|
namespace {
|
|
|
|
std::optional<std::filesystem::path>
|
|
FindSpecFileInSearchPath(std::string_view file_name,
|
|
std::filesystem::path search_path) {
|
|
search_path.append("Ghidra").append("Processors");
|
|
// Check whether a Sleigh installation exists at this path
|
|
if (!std::filesystem::is_directory(search_path)) {
|
|
return {};
|
|
}
|
|
// Each directory under Processors/ represents a family of architectures
|
|
//
|
|
// Spec files should reside under:
|
|
// <root_sla_dir>/Ghidra/Processors/<arch>/data/languages
|
|
std::filesystem::directory_iterator install_iter(search_path);
|
|
for (auto &dir_entry : install_iter) {
|
|
if (!dir_entry.is_directory()) {
|
|
continue;
|
|
}
|
|
// Check whether the spec file exists under data/languages/
|
|
auto dir_path = dir_entry.path();
|
|
dir_path.append("data").append("languages").append(file_name);
|
|
if (!std::filesystem::exists(dir_path)) {
|
|
continue;
|
|
}
|
|
return dir_path;
|
|
}
|
|
return {};
|
|
}
|
|
|
|
} // namespace
|
|
|
|
const std::vector<std::filesystem::path> gDefaultSearchPaths = {
|
|
// Derived from the installation
|
|
kSleighSpecInstallDir,
|
|
// Derived from the build
|
|
kSleighSpecBuildDir,
|
|
// Common install locations
|
|
"/usr/local/share/sleigh/specfiles", "/usr/share/sleigh/specfiles",
|
|
"/share/sleigh/specfiles"};
|
|
|
|
std::optional<std::filesystem::path>
|
|
FindSpecFile(std::string_view file_name,
|
|
const std::vector<std::filesystem::path> &search_paths) {
|
|
// Search each path for spec files
|
|
for (const auto &path : search_paths) {
|
|
auto file_path = FindSpecFileInSearchPath(file_name, path);
|
|
if (file_path) {
|
|
return file_path;
|
|
}
|
|
}
|
|
// Cannot find the spec file
|
|
return {};
|
|
}
|
|
|
|
} // namespace sleigh
|