diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 2 | ||||
-rw-r--r-- | elf/dl-load.c | 11 | ||||
-rw-r--r-- | elf/dl-object.c | 10 | ||||
-rw-r--r-- | elf/dl-support.c | 9 | ||||
-rw-r--r-- | elf/dl-sysdep.c | 3 | ||||
-rw-r--r-- | elf/elf.h | 2 | ||||
-rw-r--r-- | elf/rtld.c | 2 |
7 files changed, 24 insertions, 15 deletions
diff --git a/elf/Makefile b/elf/Makefile index e509153547..abb9572166 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -800,7 +800,7 @@ $(objpfx)tst-array5-static.out: $(objpfx)tst-array5-static cmp $@ tst-array5-static.exp > /dev/null ifeq (yesyes,$(have-fpie)$(build-shared)) -CFLAGS-tst-pie1.c += -fpie +CFLAGS-tst-pie1.c += $(pie-ccflag) $(objpfx)tst-pie1.out: $(objpfx)tst-pie1 $(elf-objpfx)$(rtld-installed-name) \ diff --git a/elf/dl-load.c b/elf/dl-load.c index 94531b271f..8a8936f7bd 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -163,7 +163,7 @@ static const size_t system_dirs_len[] = /* Local version of `strdup' function. */ -static inline char * +static char * local_strdup (const char *s) { size_t len = strlen (s) + 1; @@ -1470,15 +1470,6 @@ cannot enable executable stack as shared object requires"); { /* Create an appropriate searchlist. It contains only this map. This is the definition of DT_SYMBOLIC in SysVr4. */ - l->l_symbolic_searchlist.r_list = - (struct link_map **) malloc (sizeof (struct link_map *)); - - if (l->l_symbolic_searchlist.r_list == NULL) - { - errstring = N_("cannot create searchlist"); - goto call_lose_errno; - } - l->l_symbolic_searchlist.r_list[0] = l; l->l_symbolic_searchlist.r_nlist = 1; diff --git a/elf/dl-object.c b/elf/dl-object.c index 0e45aea39b..be4ea38f9f 100644 --- a/elf/dl-object.c +++ b/elf/dl-object.c @@ -1,5 +1,5 @@ /* Storage management for the chain of loaded shared objects. - Copyright (C) 1995-2002, 2004, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1995-2002,2004,2006,2007,2008 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -50,13 +50,17 @@ _dl_new_object (char *realname, const char *libname, int type, #endif new = (struct link_map *) calloc (sizeof (*new) + audit_space + + sizeof (struct link_map *) + sizeof (*newname) + libname_len, 1); if (new == NULL) return NULL; new->l_real = new; - new->l_libname = newname = (struct libname_list *) ((char *) (new + 1) - + audit_space); + new->l_symbolic_searchlist.r_list = (struct link_map **) ((char *) (new + 1) + + audit_space); + + new->l_libname = newname + = (struct libname_list *) (new->l_symbolic_searchlist.r_list + 1); newname->name = (char *) memcpy (newname + 1, libname, libname_len); /* newname->next = NULL; We use calloc therefore not necessary. */ newname->dont_free = 1; diff --git a/elf/dl-support.c b/elf/dl-support.c index 2c11ac6881..e5b74fb4d6 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -1,5 +1,5 @@ /* Support for dynamic linking code in static libc. - Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1996-2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -62,8 +62,12 @@ struct link_map *_dl_profile_map; /* This is the address of the last stack address ever used. */ void *__libc_stack_end; +#ifndef __ASSUME_AT_EXECFN /* Path where the binary is found. */ const char *_dl_origin_path; +#endif +/* File Name of the executable. */ +const char *_dl_execfn; /* Nonzero if runtime lookup should not update the .got/.plt. */ int _dl_bind_not; @@ -216,6 +220,9 @@ _dl_aux_init (ElfW(auxv_t) *av) __libc_enable_secure = av->a_un.a_val; __libc_enable_secure_decided = 1; break; + case AT_EXECFN: + GLRO(dl_execfn) = (void *) av->a_un.a_val; + break; # ifdef DL_PLATFORM_AUXV DL_PLATFORM_AUXV # endif diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c index dd55905e14..1ff7a350be 100644 --- a/elf/dl-sysdep.c +++ b/elf/dl-sysdep.c @@ -173,6 +173,9 @@ _dl_sysdep_start (void **start_argptr, GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val; break; #endif + case AT_EXECFN: + GLRO(dl_execfn) = (void *) av->a_un.a_val; + break; #ifdef DL_PLATFORM_AUXV DL_PLATFORM_AUXV #endif diff --git a/elf/elf.h b/elf/elf.h index 269de527e6..a4134462ac 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -970,6 +970,8 @@ typedef struct #define AT_SECURE 23 /* Boolean, was exec setuid-like? */ +#define AT_EXECFN 31 /* Filename of executable. */ + /* Pointer to the global system page used for system calls and other nice things. */ #define AT_SYSINFO 32 diff --git a/elf/rtld.c b/elf/rtld.c index 46bece7fa3..3f2267af0e 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -2579,10 +2579,12 @@ process_envvars (enum mode *modep) break; case 11: +#ifndef __ASSUME_AT_EXECFN /* Path where the binary is found. */ if (!INTUSE(__libc_enable_secure) && memcmp (envline, "ORIGIN_PATH", 11) == 0) GLRO(dl_origin_path) = &envline[12]; +#endif break; case 12: |