From patchwork Sat Apr 23 05:28:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Frysinger X-Patchwork-Id: 11863 X-Patchwork-Delegate: vapier@gentoo.org Received: (qmail 38615 invoked by alias); 23 Apr 2016 05:28:28 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 38583 invoked by uid 89); 23 Apr 2016 05:28:26 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.9 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:1785, 878, 7, 8787, H*Ad:D*chromium.org X-HELO: smtp.gentoo.org From: Mike Frysinger To: libc-alpha@sourceware.org Cc: shenhan@chromium.org Subject: [PATCH] ld.so: add an --argv0 option Date: Sat, 23 Apr 2016 01:28:20 -0400 Message-Id: <1461389300-29574-1-git-send-email-vapier@gentoo.org> 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 {