summaryrefslogtreecommitdiff
path: root/elf/dl-iteratephdr.c
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/dl-iteratephdr.c
parent026395a2a6cfeeb365d2a2993a1aebd6f58b1f95 (diff)
* 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/dl-iteratephdr.c')
-rw-r--r--elf/dl-iteratephdr.c32
1 files changed, 32 insertions, 0 deletions
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