summaryrefslogtreecommitdiff
path: root/src/ldso
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-08-23 14:14:47 -0400
committerRich Felker <dalias@aerifal.cx>2013-08-23 14:14:47 -0400
commitcc51505a32930754d2cf281c15caa1829b8436e9 (patch)
tree43b7814c7b82d81f8b1104cd977f9278c7a89f5f /src/ldso
parenta897a20a57b461d388447858b9404fc81f107bcd (diff)
downloadmusl-cc51505a32930754d2cf281c15caa1829b8436e9.tar.gz
use AT_EXECFN, if available, for dynamic linker to identify main program
fallback to argv[0] as before. unlike argv[0], AT_EXECFN was a valid (but possibly relative) pathname for the new program image at the time the execve syscall was made. as a special case, ignore AT_EXECFN if it begins with "/proc/", in order not to give bogus (and possibly harmful) results when fexecve was used.
Diffstat (limited to 'src/ldso')
-rw-r--r--src/ldso/dynlink.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index 6f23fa54..cbddeba7 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -1016,7 +1016,11 @@ void *__dynlink(int argc, char **argv)
}
if (app->tls_size) app->tls_image = (char *)app->base + tls_image;
if (interp_off) lib->name = (char *)app->base + interp_off;
- app->name = argv[0];
+ if ((aux[0] & (1UL<<AT_EXECFN))
+ && strncmp((char *)aux[AT_EXECFN], "/proc/", 6))
+ app->name = (char *)aux[AT_EXECFN];
+ else
+ app->name = argv[0];
app->kernel_mapped = 1;
app->dynv = (void *)(app->base + find_dyn(
(void *)aux[AT_PHDR], aux[AT_PHNUM], aux[AT_PHENT]));