From 0b17ab1b84e43d1349334d34f6587539e2b10981 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Wed, 14 Jun 2017 13:27:48 -0500 Subject: implement program loader --- loader/loader.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 loader/loader.c (limited to 'loader') diff --git a/loader/loader.c b/loader/loader.c new file mode 100644 index 0000000..f2942a4 --- /dev/null +++ b/loader/loader.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2017 William Pitcock + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * This software is provided 'as is' and without any warranty, express or + * implied. In no event shall the authors be liable for any damages arising + * from the use of this software. + */ + +#include +#include +#include +#include +#include + +#ifndef PATH_MAX +#define PATH_MAX 16384 +#endif + +#ifndef LINKER +#error LINKER must be defined +#endif + +#ifndef LIBGCOMPAT +#error LIBGCOMPAT must be defined +#endif + +int main(int argc, char *argv[], char *envp[]) { + size_t i = 0; + char target[PATH_MAX]; + char **new_argv = calloc(sizeof(char *), argc + 5); + + memset(target, 0, sizeof(target)); + if (readlink("/proc/self/exe", target, sizeof(target)) < 0) { + perror("readlink"); + return EXIT_FAILURE; + } + + new_argv[0] = argv[0]; + new_argv[1] = "--preload"; + new_argv[2] = LIBGCOMPAT; + new_argv[3] = target; + + for (i = 1; i < argc; i++) { + new_argv[3 + i] = argv[i]; + } + + execve(LINKER, new_argv, envp); + + /* execve only returns if there is an error. */ + perror("execve"); + return EXIT_FAILURE; +} -- cgit v1.2.3-70-g09d2