From 1585426dae0c1c6b42a1634b3fd0f5cc867aff4e Mon Sep 17 00:00:00 2001 From: York Jasper Niebuhr Date: Mon, 27 Oct 2025 16:10:49 +0100 Subject: [PATCH] spslr_finalize option parsing --- finalize/finalize.cpp | 73 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/finalize/finalize.cpp b/finalize/finalize.cpp index 9089c1e..278af21 100644 --- a/finalize/finalize.cpp +++ b/finalize/finalize.cpp @@ -1,14 +1,21 @@ #include +#include +#include /* TODO -1. getopt -> --spslr=, --bin= -2. Recursively gather all spslr CU files -3. Loop over all symbols of the binary +1. Recursively gather all spslr CU files + cu uid -> data { + target uid -> fields + ipin label -> data + dpin symbol -> data (list of sub dpins) + } +2. Merge types between CUs (per CU mapping to global target UIDs) +3. Find dpatch application order based on levels (high level (very nested) to low level (root)) +4. Loop over all symbols of the binary -> associate blocks via CU uid symbol -> find __spslr_program symbol (spslr vaddr pivot) -4. Find virtual address and file address for all pins -5. Calculate target randomization order +5. Find virtual address and file address for all pins 6. Emit patcher program into final executable and set __spslr_program */ @@ -40,5 +47,61 @@ Note -> field alignment should probably be gathered by pinpoint plugin! */ int main(int argc, char** argv) { + static option long_options[] = { + { "help", no_argument, 0, 0 }, + { "spslr", required_argument, 0, 0 }, + { "bin", required_argument, 0, 0 }, + { "out", required_argument, 0, 0 }, + { "strip", no_argument, 0, 0 }, + { 0, 0, 0, 0 } + }; + + int option_index = 0; + int c; + + std::string spslr_dir, bin_file, out_file; + + while ((c = getopt_long(argc, argv, "", long_options, &option_index)) == 0) { + const option& opt = long_options[option_index]; + std::string optname { opt.name }; + + if (optname == "help") { + std::cout << "To use spslr_finalize, supply these 3 arguments:" << std::endl; + std::cout << " --spslr= (the directory of .spslr files produced by spslr_pinpoint)" << std::endl; + std::cout << " --bin= (the binary compiled with spslr_pinpoint to be finalized)" << std::endl; + std::cout << " --out= (the finalized binary file to be written)" << std::endl; + return 0; + } else if (optname == "spslr") { + spslr_dir = std::string{ optarg }; + } else if (optname == "bin") { + bin_file = std::string{ optarg }; + } else if (optname == "out") { + out_file = std::string{ optarg }; + } else if (optname == "strip") { + std::cerr << "Symbol stripping (--strip) is not yet implemented!" << std::endl; + return 1; + } else { + std::cerr << "Invalid option, try \"--help\"!" << std::endl; + return 1; + } + } + + if (spslr_dir.empty()) { + std::cerr << "Missing spslr directory, supply it via --spslr=!" << std::endl; + return 1; + } + + if (bin_file.empty()) { + std::cerr << "Missing input file path, supply it via --bin=!" << std::endl; + return 1; + } + + if (out_file.empty()) { + std::cerr << "Missing output file path, supply it via --out=!" << std::endl; + return 1; + } + + // TODO std::cout << "Hello World!" << std::endl; } +