aboutsummaryrefslogtreecommitdiff
path: root/libexec/rtld-elf/rtld.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/rtld-elf/rtld.c')
-rw-r--r--libexec/rtld-elf/rtld.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 32d0b879c5bc..e1813217a854 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -253,6 +253,7 @@ int dladdr(const void *, Dl_info *) __exported;
void dllockinit(void *, void *(*)(void *), void (*)(void *), void (*)(void *),
void (*)(void *), void (*)(void *), void (*)(void *)) __exported;
int dlinfo(void *, int , void *) __exported;
+int _dl_iterate_phdr_locked(__dl_iterate_hdr_callback, void *) __exported;
int dl_iterate_phdr(__dl_iterate_hdr_callback, void *) __exported;
int _rtld_addr_phdr(const void *, struct dl_phdr_info *) __exported;
int _rtld_get_stack_prot(void) __exported;
@@ -4208,6 +4209,29 @@ rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info)
phdr_info->dlpi_subs = obj_loads - obj_count;
}
+/*
+ * It's completely UB to actually use this, so extreme caution is advised. It's
+ * probably not what you want.
+ */
+int
+_dl_iterate_phdr_locked(__dl_iterate_hdr_callback callback, void *param)
+{
+ struct dl_phdr_info phdr_info;
+ Obj_Entry *obj;
+ int error;
+
+ for (obj = globallist_curr(TAILQ_FIRST(&obj_list)); obj != NULL;
+ obj = globallist_next(obj)) {
+ rtld_fill_dl_phdr_info(obj, &phdr_info);
+ error = callback(&phdr_info, sizeof(phdr_info), param);
+ if (error != 0)
+ return (error);
+ }
+
+ rtld_fill_dl_phdr_info(&obj_rtld, &phdr_info);
+ return (callback(&phdr_info, sizeof(phdr_info), param));
+}
+
int
dl_iterate_phdr(__dl_iterate_hdr_callback callback, void *param)
{