Use AT_SUN_EXECPATH instead of argv[0] for the executable name. This needs

kernel support, which is not there yet, thus $ORIGIN is broken at this time.
This is ok, nothing uses it yet.
This commit is contained in:
christos 2007-09-20 14:14:25 +00:00
parent 244d23f931
commit 40cfdb5e3a
4 changed files with 42 additions and 31 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: expand.c,v 1.2 2007/05/18 21:46:39 christos Exp $ */ /* $NetBSD: expand.c,v 1.3 2007/09/20 14:14:25 christos Exp $ */
/*- /*-
* Copyright (c) 2007 The NetBSD Foundation, Inc. * Copyright (c) 2007 The NetBSD Foundation, Inc.
@ -37,7 +37,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #ifndef lint
__RCSID("$NetBSD: expand.c,v 1.2 2007/05/18 21:46:39 christos Exp $"); __RCSID("$NetBSD: expand.c,v 1.3 2007/09/20 14:14:25 christos Exp $");
#endif /* not lint */ #endif /* not lint */
#include <ctype.h> #include <ctype.h>
@ -75,7 +75,7 @@ static int mib[3][2] = {
}; };
static size_t static size_t
expand(char *buf, const char *av, int what, size_t bl) expand(char *buf, const char *execname, int what, size_t bl)
{ {
const char *p, *ep; const char *p, *ep;
char *bp = buf; char *bp = buf;
@ -88,11 +88,11 @@ expand(char *buf, const char *av, int what, size_t bl)
return 0; return 0;
case 2: /* ORIGIN */ case 2: /* ORIGIN */
ep = strrchr(p = av, '/'); xprintf("execname %p\n", execname);
if (ep == NULL) { if (execname == NULL)
p = "."; xerr(1, "execname not specified in AUX vector");
ep = p + 1; if ((ep = strrchr(p = execname, '/')) == NULL)
} xerr(1, "bad execname `%s' in AUX vector", execname);
break; break;
case 3: /* OSNAME */ case 3: /* OSNAME */
@ -117,8 +117,8 @@ expand(char *buf, const char *av, int what, size_t bl)
size_t size_t
_rtld_expand_path(char *buf, size_t bufsize, const char *av, const char *bp, _rtld_expand_path(char *buf, size_t bufsize, const char *execname,
const char *ep) const char *bp, const char *ep)
{ {
size_t i, ds = bufsize; size_t i, ds = bufsize;
char *dp = buf; char *dp = buf;
@ -142,7 +142,7 @@ _rtld_expand_path(char *buf, size_t bufsize, const char *av, const char *bp,
continue; continue;
if (strncmp(bltn[i].name, p, s) == 0) { if (strncmp(bltn[i].name, p, s) == 0) {
size_t ls = expand(dp, av, i, ds); size_t ls = expand(dp, execname, i, ds);
if (ls >= ds) if (ls >= ds)
return bufsize; return bufsize;
ds -= ls; ds -= ls;

View File

@ -1,4 +1,4 @@
/* $NetBSD: headers.c,v 1.21 2007/05/18 21:44:08 christos Exp $ */ /* $NetBSD: headers.c,v 1.22 2007/09/20 14:14:25 christos Exp $ */
/* /*
* Copyright 1996 John D. Polstra. * Copyright 1996 John D. Polstra.
@ -40,7 +40,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #ifndef lint
__RCSID("$NetBSD: headers.c,v 1.21 2007/05/18 21:44:08 christos Exp $"); __RCSID("$NetBSD: headers.c,v 1.22 2007/09/20 14:14:25 christos Exp $");
#endif /* not lint */ #endif /* not lint */
#include <err.h> #include <err.h>
@ -63,7 +63,7 @@ __RCSID("$NetBSD: headers.c,v 1.21 2007/05/18 21:44:08 christos Exp $");
* information in its Obj_Entry structure. * information in its Obj_Entry structure.
*/ */
void void
_rtld_digest_dynamic(const char *argv0, Obj_Entry *obj) _rtld_digest_dynamic(const char *execname, Obj_Entry *obj)
{ {
Elf_Dyn *dynp; Elf_Dyn *dynp;
Needed_Entry **needed_tail = &obj->needed; Needed_Entry **needed_tail = &obj->needed;
@ -269,7 +269,7 @@ _rtld_digest_dynamic(const char *argv0, Obj_Entry *obj)
#endif #endif
if (dyn_rpath != NULL) { if (dyn_rpath != NULL) {
_rtld_add_paths(argv0, &obj->rpaths, obj->strtab + _rtld_add_paths(execname, &obj->rpaths, obj->strtab +
dyn_rpath->d_un.d_val); dyn_rpath->d_un.d_val);
} }
} }

View File

@ -1,4 +1,4 @@
/* $NetBSD: paths.c,v 1.34 2007/05/18 21:44:08 christos Exp $ */ /* $NetBSD: paths.c,v 1.35 2007/09/20 14:14:25 christos Exp $ */
/* /*
* Copyright 1996 Matt Thomas <matt@3am-software.com> * Copyright 1996 Matt Thomas <matt@3am-software.com>
@ -30,7 +30,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #ifndef lint
__RCSID("$NetBSD: paths.c,v 1.34 2007/05/18 21:44:08 christos Exp $"); __RCSID("$NetBSD: paths.c,v 1.35 2007/09/20 14:14:25 christos Exp $");
#endif /* not lint */ #endif /* not lint */
#include <err.h> #include <err.h>
@ -171,13 +171,14 @@ _rtld_find_path(Search_Path *path, const char *pathstr, size_t pathlen)
static Search_Path ** static Search_Path **
_rtld_append_path(Search_Path **head_p, Search_Path **path_p, _rtld_append_path(Search_Path **head_p, Search_Path **path_p,
const char *argv0, const char *bp, const char *ep) const char *execname, const char *bp, const char *ep)
{ {
Search_Path *path; Search_Path *path;
char epath[MAXPATHLEN]; char epath[MAXPATHLEN];
size_t len; size_t len;
if ((len = _rtld_expand_path(epath, sizeof(epath), argv0, bp, ep)) == 0) len = _rtld_expand_path(epath, sizeof(epath), execname, bp, ep);
if (len == 0)
return path_p; return path_p;
if (_rtld_find_path(*head_p, bp, ep - bp) != NULL) if (_rtld_find_path(*head_p, bp, ep - bp) != NULL)
@ -195,7 +196,7 @@ _rtld_append_path(Search_Path **head_p, Search_Path **path_p,
} }
void void
_rtld_add_paths(const char *argv0, Search_Path **path_p, const char *pathstr) _rtld_add_paths(const char *execname, Search_Path **path_p, const char *pathstr)
{ {
Search_Path **head_p = path_p; Search_Path **head_p = path_p;
@ -217,7 +218,7 @@ _rtld_add_paths(const char *argv0, Search_Path **path_p, const char *pathstr)
if (ep == NULL) if (ep == NULL)
ep = &pathstr[strlen(pathstr)]; ep = &pathstr[strlen(pathstr)];
path_p = _rtld_append_path(head_p, path_p, argv0, bp, ep); path_p = _rtld_append_path(head_p, path_p, execname, bp, ep);
if (ep[0] == '\0') if (ep[0] == '\0')
break; break;
@ -332,7 +333,7 @@ cleanup:
} }
void void
_rtld_process_hints(const char *argv0, Search_Path **path_p, _rtld_process_hints(const char *execname, Search_Path **path_p,
Library_Xform **lib_p, const char *fname) Library_Xform **lib_p, const char *fname)
{ {
int fd; int fd;
@ -379,7 +380,7 @@ _rtld_process_hints(const char *argv0, Search_Path **path_p,
*/ */
while (b[-1] == ' ' || b[-1] == '\t') while (b[-1] == ' ' || b[-1] == '\t')
b--; b--;
path_p = _rtld_append_path(head_p, path_p, argv0, path_p = _rtld_append_path(head_p, path_p, execname,
ptr, b); ptr, b);
} else } else
_rtld_process_mapping(lib_p, ptr, b); _rtld_process_mapping(lib_p, ptr, b);

View File

@ -1,4 +1,4 @@
/* $NetBSD: rtld.c,v 1.113 2007/05/18 21:44:08 christos Exp $ */ /* $NetBSD: rtld.c,v 1.114 2007/09/20 14:14:26 christos Exp $ */
/* /*
* Copyright 1996 John D. Polstra. * Copyright 1996 John D. Polstra.
@ -40,7 +40,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #ifndef lint
__RCSID("$NetBSD: rtld.c,v 1.113 2007/05/18 21:44:08 christos Exp $"); __RCSID("$NetBSD: rtld.c,v 1.114 2007/09/20 14:14:26 christos Exp $");
#endif /* not lint */ #endif /* not lint */
#include <err.h> #include <err.h>
@ -148,7 +148,7 @@ _rtld_call_init_functions(Obj_Entry *first)
* define __HAVE_FUNCTION_DESCRIPTORS * define __HAVE_FUNCTION_DESCRIPTORS
*/ */
static void static void
_rtld_init(caddr_t mapbase, caddr_t relocbase, const char *argv0) _rtld_init(caddr_t mapbase, caddr_t relocbase, const char *execname)
{ {
/* Conjure up an Obj_Entry structure for the dynamic linker. */ /* Conjure up an Obj_Entry structure for the dynamic linker. */
@ -174,7 +174,8 @@ _rtld_init(caddr_t mapbase, caddr_t relocbase, const char *argv0)
assert(!_rtld_objself.textrel); assert(!_rtld_objself.textrel);
#endif #endif
_rtld_add_paths(argv0, &_rtld_default_paths, RTLD_DEFAULT_LIBRARY_PATH); _rtld_add_paths(execname, &_rtld_default_paths,
RTLD_DEFAULT_LIBRARY_PATH);
/* /*
* Set up the _rtld_objlist pointer, so that rtld symbols can be found. * Set up the _rtld_objlist pointer, so that rtld symbols can be found.
@ -230,6 +231,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
bool bind_now = 0; bool bind_now = 0;
const char *ld_bind_now; const char *ld_bind_now;
const char **argv; const char **argv;
const char *execname;
long argc; long argc;
const char **real___progname; const char **real___progname;
const Obj_Entry **real___mainprog_obj; const Obj_Entry **real___mainprog_obj;
@ -273,6 +275,8 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
pAUX_euid = pAUX_ruid = pAUX_egid = pAUX_rgid = NULL; pAUX_euid = pAUX_ruid = pAUX_egid = pAUX_rgid = NULL;
pAUX_pagesz = NULL; pAUX_pagesz = NULL;
execname = NULL;
/* Digest the auxiliary vector. */ /* Digest the auxiliary vector. */
for (auxp = aux; auxp->a_type != AT_NULL; ++auxp) { for (auxp = aux; auxp->a_type != AT_NULL; ++auxp) {
switch (auxp->a_type) { switch (auxp->a_type) {
@ -307,6 +311,11 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
case AT_RGID: case AT_RGID:
pAUX_rgid = auxp; pAUX_rgid = auxp;
break; break;
#endif
#ifdef AT_SUN_EXECNAME
case AT_SUN_EXECNAME:
execname = (const char *)(const void *)auxp->a_v;
break;
#endif #endif
case AT_PAGESZ: case AT_PAGESZ:
pAUX_pagesz = auxp; pAUX_pagesz = auxp;
@ -321,7 +330,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
} }
assert(pAUX_pagesz != NULL); assert(pAUX_pagesz != NULL);
_rtld_pagesz = (int)pAUX_pagesz->a_v; _rtld_pagesz = (int)pAUX_pagesz->a_v;
_rtld_init((caddr_t)pAUX_base->a_v, (caddr_t)relocbase, argv[0]); _rtld_init((caddr_t)pAUX_base->a_v, (caddr_t)relocbase, execname);
__progname = _rtld_objself.path; __progname = _rtld_objself.path;
environ = env; environ = env;
@ -343,12 +352,13 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
if (ld_debug != NULL && *ld_debug != '\0') if (ld_debug != NULL && *ld_debug != '\0')
debug = 1; debug = 1;
#endif #endif
_rtld_add_paths(argv[0], &_rtld_paths, getenv("LD_LIBRARY_PATH")); _rtld_add_paths(execname, &_rtld_paths,
getenv("LD_LIBRARY_PATH"));
} else { } else {
unsetenv("LD_DEBUG"); unsetenv("LD_DEBUG");
unsetenv("LD_LIBRARY_PATH"); unsetenv("LD_LIBRARY_PATH");
} }
_rtld_process_hints(argv[0], &_rtld_paths, &_rtld_xforms, _rtld_process_hints(execname, &_rtld_paths, &_rtld_xforms,
_PATH_LD_HINTS); _PATH_LD_HINTS);
dbg(("dynamic linker is initialized, mapbase=%p, relocbase=%p", dbg(("dynamic linker is initialized, mapbase=%p, relocbase=%p",
_rtld_objself.mapbase, _rtld_objself.relocbase)); _rtld_objself.mapbase, _rtld_objself.relocbase));
@ -398,7 +408,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
_rtld_objself.path = xstrdup(_rtld_objmain->interp); _rtld_objself.path = xstrdup(_rtld_objmain->interp);
dbg(("actual dynamic linker is %s", _rtld_objself.path)); dbg(("actual dynamic linker is %s", _rtld_objself.path));
_rtld_digest_dynamic(argv[0], _rtld_objmain); _rtld_digest_dynamic(execname, _rtld_objmain);
/* Link the main program into the list of objects. */ /* Link the main program into the list of objects. */
*_rtld_objtail = _rtld_objmain; *_rtld_objtail = _rtld_objmain;