1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#! /bin/sh -e
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Adds method to re-execute /sbin/init upon change made by prelink.
## DP: Bug#281409
[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
if [ $# -ne 1 ]; then
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
fi
case "$1" in
-patch) patch $patch_opts -p1 < $0;;
-unpatch) patch $patch_opts -p1 -R < $0;;
*)
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1;;
esac
exit 0
@DPATCH@
diff -urN prelink-0.0.20041012.orig/src/main.c prelink-0.0.20041012/src/main.c
--- prelink-0.0.20041012.orig/src/main.c 2004-09-30 16:07:57.000000000 +0000
+++ prelink-0.0.20041012/src/main.c 2004-11-16 00:39:28.000000000 +0000
@@ -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");
|