summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2004-11-06 00:24:55 +0000
committerRoland McGrath <roland@gnu.org>2004-11-06 00:24:55 +0000
commit30e32d23eb06cbeae02e51c7c4df150736dba795 (patch)
tree654ce3ff4612247d589a718a88ce14b9a6df8212 /elf
parentc3047bca73efe22cc7904e1d2474cb17ef161d25 (diff)
downloadglibc-30e32d23eb06cbeae02e51c7c4df150736dba795.tar.gz
glibc-30e32d23eb06cbeae02e51c7c4df150736dba795.tar.xz
glibc-30e32d23eb06cbeae02e51c7c4df150736dba795.zip
* sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Define
	_dl_sysinfo_dso under [NEED_DL_SYSINFO_DSO] as well.
	* elf/rtld.c (dl_main): Set up GLRO(dl_sysinfo_dso) under
	[NEED_DL_SYSINFO_DSO] as well.
	* sysdeps/generic/dl-sysdep.c (_dl_show_auxv): Always include
	AT_SYSINFO and AT_SYSINFO_EHDR in name table.
	(_dl_sysdep_start) [NEED_DL_SYSINFO_DSO]: Match AT_SYSINFO_EHDR.
	* elf/dl-support.c (_dl_sysinfo_dso): Define also under
	[NEED_DL_SYSINFO_DSO].
	(_dl_aux_init) [NEED_DL_SYSINFO || NEED_DL_SYSINFO_DSO]:
	Match AT_SYSINFO_EHDR and set GL(dl_sysinfo_dso).

2004-11-05  Roland McGrath  <roland@redhat.com>
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-support.c7
-rw-r--r--elf/rtld.c8
2 files changed, 12 insertions, 3 deletions
diff --git a/elf/dl-support.c b/elf/dl-support.c
index d8957ce308..b10dc90418 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -136,6 +136,8 @@ int (*_dl_make_stack_executable_hook) (void **) internal_function
 #ifdef NEED_DL_SYSINFO
 /* Needed for improved syscall handling on at least x86/Linux.  */
 uintptr_t _dl_sysinfo = DL_SYSINFO_DEFAULT;
+#endif
+#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
 /* Address of the ELF headers in the vsyscall page.  */
 const ElfW(Ehdr) *_dl_sysinfo_dso;
 #endif
@@ -184,6 +186,11 @@ _dl_aux_init (ElfW(auxv_t) *av)
 	GL(dl_sysinfo) = av->a_un.a_val;
 	break;
 #endif
+#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
+      case AT_SYSINFO_EHDR:
+	GL(dl_sysinfo_dso) = av->a_un.a_ptr;
+	break;
+#endif
       case AT_UID:
 	uid ^= av->a_un.a_val;
 	seen |= 1;
diff --git a/elf/rtld.c b/elf/rtld.c
index 06dd099cf5..29aee2d96d 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1274,7 +1274,7 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
       assert (i == npreloads);
     }
 
-#ifdef NEED_DL_SYSINFO
+#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
   struct link_map *sysinfo_map = NULL;
   if (GLRO(dl_sysinfo_dso) != NULL)
     {
@@ -1338,9 +1338,11 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
 	    }
 
 	  /* We have a prelinked DSO preloaded by the system.  */
+	  sysinfo_map = l;
+# ifdef NEED_DL_SYSINFO
 	  if (GLRO(dl_sysinfo) == DL_SYSINFO_DEFAULT)
 	    GLRO(dl_sysinfo) = GLRO(dl_sysinfo_dso)->e_entry + l->l_addr;
-	  sysinfo_map = l;
+# endif
 	}
     }
 #endif
@@ -1389,7 +1391,7 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
 	  GL(dl_rtld_map).l_next = (i + 1 < main_map->l_searchlist.r_nlist
 				    ? main_map->l_searchlist.r_list[i + 1]
 				    : NULL);
-#ifdef NEED_DL_SYSINFO
+#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
 	  if (sysinfo_map != NULL
 	      && GL(dl_rtld_map).l_prev->l_next == sysinfo_map
 	      && GL(dl_rtld_map).l_next != sysinfo_map)