diff --git a/.gitmodules b/.gitmodules index 201f04c..2a78fe4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "3rdparty/libfort"] path = 3rdparty/libfort url = https://git.shimatta.de/3rd-party/libfort +[submodule "linklist-lib"] + path = linklist-lib + url = https://git.shimatta.de/mhu/linklist-lib.git diff --git a/CMakeLists.txt b/CMakeLists.txt index cb9e4ce..d37fb08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,9 +25,10 @@ add_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmayb set(FORT_ENABLE_TESTING OFF CACHE INTERNAL "") add_subdirectory(3rdparty/libfort) +add_subdirectory(linklist-lib) add_executable(${PROJECT_NAME} ${CFILES}) -target_link_libraries(${PROJECT_NAME} ${ELF_LIBRARIES} fort) +target_link_libraries(${PROJECT_NAME} ${ELF_LIBRARIES} fort linklist-lib) target_link_directories(${PROJECT_NAME} PRIVATE ${ELF_LIBRARY_DIRS}) target_include_directories(${PROJECT_NAME} PRIVATE ${ELF_INCLUDE_DIRS}) target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include") diff --git a/linklist-lib b/linklist-lib new file mode 160000 index 0000000..18b3ab3 --- /dev/null +++ b/linklist-lib @@ -0,0 +1 @@ +Subproject commit 18b3ab377ac30516f977e9831813ea37189d4028 diff --git a/main.c b/main.c index d3366cd..ff2e879 100644 --- a/main.c +++ b/main.c @@ -6,6 +6,7 @@ #include #include #include +#include #define print_err(fmt, ...) fprintf(stderr, (fmt), ## __VA_ARGS__); #define print_debug(fmt, ...) do { \ @@ -44,6 +45,7 @@ struct command_line_options { bool has_end_magic; uint32_t end_magic; bool list; + SlList *section_list; }; static error_t parse_opt(int key, char *arg, struct argp_state *state) @@ -71,6 +73,10 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) case 'v': args->verbose = true; break; + case 'S': + /* Section */ + args->section_list = sl_list_append(args->section_list, strdup(arg)); + break; case 'g': if (!strcmp(arg, "byte")) args->granularity = GRANULARITY_BYTE; @@ -141,11 +147,14 @@ static void prepare_default_opts(struct command_line_options *opts) opts->has_end_magic = false; opts->has_start_magic = false; opts->list = false; + opts->section_list = NULL; } static void print_verbose_start_info(const struct command_line_options *cmd_opts) { bool verbose = cmd_opts->verbose; + int i; + SlList *list_iter; const struct named_crc *predef_crc; print_debug("Start CRC patching\n"); @@ -162,6 +171,27 @@ static void print_verbose_start_info(const struct command_line_options *cmd_opts print_debug("Predefined CRC detected: %s\n", predef_crc->name); } + if (cmd_opts->section_list) { + for (list_iter = cmd_opts->section_list, i = 1; list_iter; list_iter = sl_list_next(list_iter), i++) { + print_debug("Input section [%d]: \"%s\"\n", i, (const char *)list_iter->data); + } + } + +} + +static void free_cmd_args(struct command_line_options *opts) +{ + SlList *list_iter; + + /* Free the output section names */ + for (list_iter = opts->section_list; list_iter; list_iter = sl_list_next(list_iter)) { + if (list_iter->data) + free(list_iter->data); + } + + /* Free the section list */ + sl_list_free(opts->section_list); + opts->section_list = NULL; } int main(int argc, char **argv) @@ -177,8 +207,11 @@ int main(int argc, char **argv) if (cmd_opts.list) { list_predefined_crcs(); - return 0; + goto free_cmds; } +free_cmds: + + free_cmd_args(&cmd_opts); return 0; }