#include #include #include #include #include #include static const char *text = "Change this text and recompile while the process is running"; int main(int argc, char *argv[]) { uintptr_t exe_addr = (uintptr_t)getauxval(AT_EXECFN); const char *exe; if (!exe_addr) { fprintf(stderr, "%s\n", "Sorry, AT_EXECFN not found, would have to use /proc/self/exe, which is out of scope"); /* by the way, if you just exec into /proc/self/exe * you restart the process, to the same version as * running even if it has been replaced (define * RESTART to try it out) */ return 1; } exe = (void *)exe_addr; /* beware, this might be a relative path */ if (argc != 2 || strcmp(argv[1], text)) printf("%s\n", text); unlink(exe); for (;;) { sleep(1); #ifdef RESTART execlp("/proc/self/exe", argv[0], text, NULL); abort(); #else execlp(exe, argv[0], text, NULL); #endif } }