summaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
index 844c52f..567ba84 100644
--- a/src/main.c
+++ b/src/main.c
@@ -80,6 +80,7 @@ static char argp_doc[] = "prelink -- program to relocate and prelink ELF shared
#define OPT_SHA 0x8a
#define OPT_COMPUTE_CHECKSUM 0x8b
#define OPT_SYSROOT 0x8c
+#define OPT_RTLD 0x8d
static struct argp_option options[] = {
{"all", 'a', 0, 0, "Prelink all binaries" },
@@ -115,6 +116,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, "" },
+ {"rtld", OPT_RTLD, "RTLD", OPTION_HIDDEN, "" },
{"init", 'i', 0, 0, "Do not re-execute init" },
{ 0 }
};
@@ -230,6 +232,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
case OPT_SYSROOT:
sysroot = arg;
break;
+ case OPT_RTLD:
+ prelink_rtld = arg;
+ break;
case 'i':
noreexecinit=1;
break;
@@ -255,6 +260,8 @@ void checkinit() {
static struct argp argp = { options, parse_opt, "[FILES]", argp_doc };
+const char *prelink_rtld = NULL;
+
int
main (int argc, char *argv[])
{
@@ -314,6 +321,18 @@ main (int argc, char *argv[])
asprintf ((char **) &prelink_conf, "%s%s", sysroot, prelink_conf);
}
+ if (prelink_rtld == NULL)
+ {
+ extern char *make_relative_prefix (const char *, const char *, const char *);
+ const char *path = make_relative_prefix (argv[0], BINDIR, BINDIR);
+ if (strchr (argv[0], '/'))
+ asprintf ((char **) &prelink_rtld, "%s-rtld", argv[0]);
+ else
+ asprintf ((char **) &prelink_rtld, "%s/%s-rtld", path, argv[0]);
+ }
+ else if (prelink_rtld[0] == 0)
+ prelink_rtld = NULL;
+
if (print_cache)
{
prelink_load_cache ();