diff options
author | 2004-10-14 10:02:28 +0000 | |
---|---|---|
committer | 2004-10-14 10:02:28 +0000 | |
commit | 9b86939ff204a5d7f16f9dfbe38bb9dee9b933d3 (patch) | |
tree | 1359cffee39b3071edc46df5f3899bd0063013d9 | |
parent | Have ntpd use IPTOS_LOWDELAY; ok henning@ (diff) | |
download | wireguard-openbsd-9b86939ff204a5d7f16f9dfbe38bb9dee9b933d3.tar.xz wireguard-openbsd-9b86939ff204a5d7f16f9dfbe38bb9dee9b933d3.zip |
Add dl_iterate_phdr() support.
ok drahn@, millert@
-rw-r--r-- | include/link_elf.h | 15 | ||||
-rw-r--r-- | libexec/ld.so/dlfcn.c | 29 |
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) { |