summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2004-10-14 10:02:28 +0000
committerkettenis <kettenis@openbsd.org>2004-10-14 10:02:28 +0000
commit9b86939ff204a5d7f16f9dfbe38bb9dee9b933d3 (patch)
tree1359cffee39b3071edc46df5f3899bd0063013d9
parentHave ntpd use IPTOS_LOWDELAY; ok henning@ (diff)
downloadwireguard-openbsd-9b86939ff204a5d7f16f9dfbe38bb9dee9b933d3.tar.xz
wireguard-openbsd-9b86939ff204a5d7f16f9dfbe38bb9dee9b933d3.zip
Add dl_iterate_phdr() support.
ok drahn@, millert@
-rw-r--r--include/link_elf.h15
-rw-r--r--libexec/ld.so/dlfcn.c29
2 files changed, 42 insertions, 2 deletions
diff --git a/include/link_elf.h b/include/link_elf.h
index 607f8df6742..7a0f11d56cc 100644
--- a/include/link_elf.h
+++ b/include/link_elf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: link_elf.h,v 1.4 2002/09/08 17:55:37 drahn Exp $ */
+/* $OpenBSD: link_elf.h,v 1.5 2004/10/14 10:02:28 kettenis Exp $ */
/*
* Public domain.
@@ -25,4 +25,17 @@ struct link_map {
struct link_map *l_next;
struct link_map *l_prev;
};
+
+struct dl_phdr_info {
+ Elf_Addr dlpi_addr;
+ const char *dlpi_name;
+ const Elf_Phdr *dlpi_phdr;
+ Elf_Half dlpi_phnum;
+};
+
+__BEGIN_DECLS
+int dl_iterate_phdr (int (*)(struct dl_phdr_info *, size_t, void *),
+ void *);
+__END_DECLS
+
#endif /* !_LINK_ELF_H */
diff --git a/libexec/ld.so/dlfcn.c b/libexec/ld.so/dlfcn.c
index dda9821a350..6b534ec2c8b 100644
--- a/libexec/ld.so/dlfcn.c
+++ b/libexec/ld.so/dlfcn.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dlfcn.c,v 1.40 2004/08/13 16:45:41 drahn Exp $ */
+/* $OpenBSD: dlfcn.c,v 1.41 2004/10/14 10:02:28 kettenis Exp $ */
/*
* Copyright (c) 1998 Per Fogelstrom, Opsycon AB
@@ -386,6 +386,33 @@ _dl_thread_kern_go(void)
(*_dl_thread_fnc)(1);
}
+int
+dl_iterate_phdr(int (*callback)(struct dl_phdr_info *, size_t, void *data),
+ void *data)
+{
+ elf_object_t *object;
+ Elf_Ehdr *ehdr;
+ struct dl_phdr_info info;
+ int retval = -1;
+
+ for (object = _dl_objects; object != NULL; object = object->next) {
+ ehdr = (Elf_Ehdr *)object->load_addr;
+ if (ehdr == NULL)
+ continue;
+
+ info.dlpi_addr = object->load_addr;
+ info.dlpi_name = object->load_name;
+ info.dlpi_phdr =
+ (Elf_Phdr *)((char *)object->load_addr + ehdr->e_phoff);
+ info.dlpi_phnum = ehdr->e_phnum;
+ retval = callback(&info, sizeof (struct dl_phdr_info), data);
+ if (retval)
+ break;
+ }
+
+ return retval;
+}
+
static elf_object_t *
obj_from_addr(const void *addr)
{