about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2003-10-22 07:10:00 +0000
committerRoland McGrath <roland@gnu.org>2003-10-22 07:10:00 +0000
commit27d640befba8c7b91d5ba9e1152dbf039a18133b (patch)
tree6219ece9d560763ea32d6111ae73ca0465766909 /elf
parent026395a2a6cfeeb365d2a2993a1aebd6f58b1f95 (diff)
downloadglibc-27d640befba8c7b91d5ba9e1152dbf039a18133b.tar.gz
glibc-27d640befba8c7b91d5ba9e1152dbf039a18133b.tar.xz
glibc-27d640befba8c7b91d5ba9e1152dbf039a18133b.zip
* sysdeps/unix/sysv/linux/hppa/sysdep.h: Fix merge error.
2003-10-15  Roland McGrath  <roland@redhat.com>

	* elf/dl-iteratephdr.c [! SHARED] (dl_iterate_phdr): New function.
	Fake an entry for the main executable and then call __dl_iterate_phdr.
	* elf/Makefile (routines): Remove dl-iteratephdr-static.
	(elide-routines.os): Likewise.
	(CFLAGS-dl-iterate-phdr-static.c): Variable removed.
	* sysdeps/generic/dl-iteratephdr-static.c: File removed.
	* sysdeps/unix/sysv/linux/ia64/dl-iteratephdr-static.c: File removed.
Diffstat (limited to 'elf')
-rw-r--r--elf/Makefile6
-rw-r--r--elf/dl-iteratephdr.c32
2 files changed, 34 insertions, 4 deletions
diff --git a/elf/Makefile b/elf/Makefile
index 2e6b6cb2b2..ead590bdc1 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -22,7 +22,7 @@ subdir		:= elf
 
 headers		= elf.h bits/elfclass.h link.h
 routines	= $(dl-routines) dl-open dl-close dl-support dl-iteratephdr \
-		  dl-iteratephdr-static dl-addr enbl-secure dl-profstub \
+		  dl-addr enbl-secure dl-profstub \
 		  dl-origin dl-libc dl-sym dl-tsd
 
 # The core dynamic linking functions are in libc for the static and
@@ -33,8 +33,7 @@ dl-routines	= $(addprefix dl-,load cache lookup object reloc deps \
 				  execstack)
 all-dl-routines = $(dl-routines) $(sysdep-dl-routines)
 # But they are absent from the shared libc, because that code is in ld.so.
-elide-routines.os = $(all-dl-routines) dl-support enbl-secure \
-		    dl-iteratephdr-static dl-origin
+elide-routines.os = $(all-dl-routines) dl-support enbl-secure dl-origin
 
 # ld.so uses those routines, plus some special stuff for being the program
 # interpreter and operating independent of libc.
@@ -87,7 +86,6 @@ distribute	:= rtld-Rules \
 CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-dl-iterate-phdr.c = $(uses-callbacks)
-CFLAGS-dl-iterate-phdr-static.c = $(uses-callbacks)
 
 include ../Makeconfig
 
diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c
index d4feb690c3..fd45f8529f 100644
--- a/elf/dl-iteratephdr.c
+++ b/elf/dl-iteratephdr.c
@@ -29,6 +29,7 @@ cancel_handler (void *arg __attribute__((unused)))
   __rtld_lock_unlock_recursive (GL(dl_load_lock));
 }
 
+hidden_proto (__dl_iterate_phdr)
 int
 __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
 				    size_t size, void *data), void *data)
@@ -58,7 +59,38 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
 
   return ret;
 }
+hidden_def (__dl_iterate_phdr)
 
 #ifdef SHARED
+
 weak_alias (__dl_iterate_phdr, dl_iterate_phdr);
+
+#else
+
+/* dl-support.c defines these and initializes them early on.  */
+extern ElfW(Phdr) *_dl_phdr;
+extern size_t _dl_phnum;
+
+int
+dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
+				  size_t size, void *data), void *data)
+{
+  if (_dl_phnum != 0)
+    {
+      /* This entry describes this statically-linked program itself.  */
+      struct dl_phdr_info info;
+      int ret;
+      info.dlpi_addr = 0;
+      info.dlpi_name = "";
+      info.dlpi_phdr = _dl_phdr;
+      info.dlpi_phnum = _dl_phnum;
+      ret = (*callback) (&info, sizeof (struct dl_phdr_info), data);
+      if (ret)
+	return ret;
+    }
+
+  return __dl_iterate_phdr (callback, data);
+}
+
+
 #endif