Start first draft
This commit is contained in:
commit
9107a2797c
75
.gitignore
vendored
Normal file
75
.gitignore
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/cmake,c
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=cmake,c
|
||||||
|
|
||||||
|
### C ###
|
||||||
|
# Prerequisites
|
||||||
|
*.d
|
||||||
|
|
||||||
|
# Object files
|
||||||
|
*.o
|
||||||
|
*.ko
|
||||||
|
*.obj
|
||||||
|
*.elf
|
||||||
|
|
||||||
|
# Linker output
|
||||||
|
*.ilk
|
||||||
|
*.map
|
||||||
|
*.exp
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
*.lib
|
||||||
|
*.a
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
|
||||||
|
# Shared objects (inc. Windows DLLs)
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.i*86
|
||||||
|
*.x86_64
|
||||||
|
*.hex
|
||||||
|
|
||||||
|
# Debug files
|
||||||
|
*.dSYM/
|
||||||
|
*.su
|
||||||
|
*.idb
|
||||||
|
*.pdb
|
||||||
|
|
||||||
|
# Kernel Module Compile Results
|
||||||
|
*.mod*
|
||||||
|
*.cmd
|
||||||
|
.tmp_versions/
|
||||||
|
modules.order
|
||||||
|
Module.symvers
|
||||||
|
Mkfile.old
|
||||||
|
dkms.conf
|
||||||
|
|
||||||
|
### CMake ###
|
||||||
|
CMakeLists.txt.user
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles
|
||||||
|
CMakeScripts
|
||||||
|
Testing
|
||||||
|
Makefile
|
||||||
|
cmake_install.cmake
|
||||||
|
install_manifest.txt
|
||||||
|
compile_commands.json
|
||||||
|
CTestTestfile.cmake
|
||||||
|
_deps
|
||||||
|
|
||||||
|
### CMake Patch ###
|
||||||
|
# External projects
|
||||||
|
*-prefix/
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/cmake,c
|
19
CMakeLists.txt
Normal file
19
CMakeLists.txt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
|
project(patchelfcrc LANGUAGES C)
|
||||||
|
|
||||||
|
find_package(PkgConfig REQUIRED)
|
||||||
|
pkg_check_modules(ELF REQUIRED libelf)
|
||||||
|
|
||||||
|
set (CFILES
|
||||||
|
main.c
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} ${CFILES})
|
||||||
|
target_link_libraries(${PROJECT_NAME} ${ELF_LIBRARIES})
|
||||||
|
target_link_directories(${PROJECT_NAME} PRIVATE ${ELF_LIBRARY_DIRS})
|
||||||
|
target_include_directories(${PROJECT_NAME} PRIVATE ${ELF_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
73
main.c
Normal file
73
main.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <libelf.h>
|
||||||
|
#include <argp.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define print_err(fmt, ...) fprintf(stderr, (fmt), ## __VA_ARGS__);
|
||||||
|
#define print_debug(fmt, ...) do { \
|
||||||
|
if (verbose) { \
|
||||||
|
printf("[DBG] "fmt, ## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
enum granularity {
|
||||||
|
GRANULARITY_BYTE = 1,
|
||||||
|
GRANULARITY_16BIT,
|
||||||
|
GRANULARITY_32BIT,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct command_line_options {
|
||||||
|
bool little_endian;
|
||||||
|
enum granularity granularity;
|
||||||
|
};
|
||||||
|
|
||||||
|
static error_t parse_opt(int key, char *arg, struct argp_state *state)
|
||||||
|
{
|
||||||
|
struct command_line_options *args = (struct command_line_options *)state->input;
|
||||||
|
switch (key) {
|
||||||
|
case 'l':
|
||||||
|
args->little_endian = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ARGP_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_cmdline_options(int *argc, char ***argv, struct command_line_options *cmd_opts)
|
||||||
|
{
|
||||||
|
if (!argc || !argv)
|
||||||
|
return -1000;
|
||||||
|
|
||||||
|
static struct argp_option options[] = {
|
||||||
|
{"little-endian", 'l', 0, 0, "Memory image is little endian. Only relevant if granularity is greater than a single byte"},
|
||||||
|
/* Sentinel */
|
||||||
|
{NULL, 0, 0, 0, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct argp arg_parser = {
|
||||||
|
options,
|
||||||
|
parse_opt,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
argp_parse(&arg_parser, *argc, *argv, 0, 0, cmd_opts);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
bool verbose = true;
|
||||||
|
struct command_line_options cmd_opts;
|
||||||
|
|
||||||
|
cmd_opts.little_endian = false;
|
||||||
|
cmd_opts.granularity = GRANULARITY_BYTE;
|
||||||
|
|
||||||
|
parse_cmdline_options(&argc, &argv, &cmd_opts);
|
||||||
|
|
||||||
|
print_debug("Start CRC patching\n");
|
||||||
|
print_debug("Endianess: %s endian\n", (cmd_opts.little_endian ? "little" : "big"));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user