diff options
-rw-r--r-- | ChangeLog.cross | 4 | ||||
-rw-r--r-- | src/main.c | 25 |
2 files changed, 29 insertions, 0 deletions
diff --git a/ChangeLog.cross b/ChangeLog.cross index 0eac7ae..bacc9d7 100644 --- a/ChangeLog.cross +++ b/ChangeLog.cross @@ -1,3 +1,7 @@ +2006-08-09 CodeSourcery, LLC. + + * main.c: if we modified /sbin/init, re-run init + 2006-08-08 CodeSourcery, LLC. * arch-arm.c: add ARM EABI support, dynamic_linker_alt @@ -58,6 +58,8 @@ const char *ld_library_path; const char *prelink_conf = PRELINK_CONF; const char *prelink_cache = PRELINK_CACHE; const char *undo_output; +int noreexecinit; +time_t initctime; const char *argp_program_version = "prelink 1.0"; @@ -113,6 +115,7 @@ static struct argp_option options[] = { {"mmap-region-end", OPT_MMAP_REG_END, "BASE_ADDRESS", OPTION_HIDDEN, "" }, {"seed", OPT_SEED, "SEED", OPTION_HIDDEN, "" }, {"compute-checksum", OPT_COMPUTE_CHECKSUM, 0, OPTION_HIDDEN, "" }, + {"init", 'i', 0, 0, "Do not re-execute init" }, { 0 } }; @@ -227,12 +230,29 @@ parse_opt (int key, char *arg, struct argp_state *state) case OPT_SYSROOT: sysroot = arg; break; + case 'i': + noreexecinit=1; + break; default: return ARGP_ERR_UNKNOWN; } return 0; } +time_t get_ctime(const char *file) { + struct stat st; + if(stat(file,&st) == 0) + return st.st_ctime; + return 0; +} + +void checkinit() { + if(initctime != get_ctime("/sbin/init")) { + printf("Executing /sbin/init U\n"); + system("/sbin/init U"); + } +} + static struct argp argp = { options, parse_opt, "[FILES]", argp_doc }; int @@ -250,6 +270,11 @@ main (int argc, char *argv[]) argp_parse (&argp, argc, argv, 0, &remaining, 0); + if(!noreexecinit) { + initctime = get_ctime("/sbin/init"); + atexit(checkinit); + } + if (ld_library_path == NULL) ld_library_path = getenv ("LD_LIBRARY_PATH"); |