--- prelink-20040707/src/main.c.jj 2004-09-09 09:53:05.281838640 -0700 +++ prelink-20040707/src/main.c 2004-09-09 10:31:09.029656200 -0700 @@ -58,6 +58,8 @@ 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"; @@ -111,6 +113,7 @@ {"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 } }; @@ -222,12 +225,29 @@ case OPT_COMPUTE_CHECKSUM: compute_checksum = 1; 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 @@ -247,6 +267,11 @@ 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");