This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] ld.so: add an --argv0 option
- From: Mike Frysinger <vapier at gentoo dot org>
- To: libc-alpha at sourceware dot org
- Cc: shenhan at chromium dot org
- Date: Sat, 23 Apr 2016 01:28:20 -0400
- Subject: [PATCH] ld.so: add an --argv0 option
- Authentication-results: sourceware.org; auth=none
Sometimes when you run a program you want the argv[0] string passed to
the app to be different than the actual path you used to load it. We
can't do this today with invoking via ld.so which can be limiting --
some programs like to inspect their argv[0] and make decisions as to
how it should (re)exec itself or helper tools. For example, clang and
gcc both do argv[0] inspection to support relocatable toolchains.
---
elf/rtld.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/elf/rtld.c b/elf/rtld.c
index 647661c..a42b5f6 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -796,6 +796,8 @@ dl_main (const ElfW(Phdr) *phdr,
installing it. */
rtld_is_main = true;
+ char *argv0 = NULL;
+
/* Note the place where the dynamic linker actually came from. */
GL(dl_rtld_map).l_name = rtld_progname;
@@ -850,6 +852,14 @@ dl_main (const ElfW(Phdr) *phdr,
_dl_argc -= 2;
_dl_argv += 2;
}
+ else if (! strcmp (_dl_argv[1], "--argv0") && _dl_argc > 2)
+ {
+ argv0 = _dl_argv[2];
+
+ _dl_skip_args += 2;
+ _dl_argc -= 2;
+ _dl_argv += 2;
+ }
else
break;
@@ -878,7 +888,8 @@ of this helper program; chances are you did not intend to run this program.\n\
variable LD_LIBRARY_PATH\n\
--inhibit-rpath LIST ignore RUNPATH and RPATH information in object names\n\
in LIST\n\
- --audit LIST use objects named in LIST as auditors\n");
+ --audit LIST use objects named in LIST as auditors\n\
+ --argv0 STRING set argv[0] to STRING before running\n");
++_dl_skip_args;
--_dl_argc;
@@ -971,6 +982,10 @@ of this helper program; chances are you did not intend to run this program.\n\
break;
}
#endif
+
+ /* Set the argv[0] string now that we've processed the executable. */
+ if (argv0 != NULL)
+ _dl_argv[0] = argv0;
}
else
{
--
2.7.4