diff --git a/libexec/ld.elf_so/rtld.c b/libexec/ld.elf_so/rtld.c index f6eb058ea491..543f65975b5f 100644 --- a/libexec/ld.elf_so/rtld.c +++ b/libexec/ld.elf_so/rtld.c @@ -1433,6 +1433,25 @@ dlinfo(void *handle, int req, void *v) return 0; } +static void +rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info) +{ + phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase; + /* XXX: wrong but not fixing it yet */ + phdr_info->dlpi_name = obj->path; + phdr_info->dlpi_phdr = obj->phdr; + phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]); +#if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) + phdr_info->dlpi_tls_modid = obj->tlsindex; + phdr_info->dlpi_tls_data = obj->tlsinit; +#else + phdr_info->dlpi_tls_modid = 0; + phdr_info->dlpi_tls_data = 0; +#endif + phdr_info->dlpi_adds = _rtld_objloads; + phdr_info->dlpi_subs = _rtld_objloads - _rtld_objcount; +} + __strong_alias(__dl_iterate_phdr,dl_iterate_phdr); int dl_iterate_phdr(int (*callback)(struct dl_phdr_info *, size_t, void *), void *param) @@ -1446,20 +1465,7 @@ dl_iterate_phdr(int (*callback)(struct dl_phdr_info *, size_t, void *), void *pa _rtld_shared_enter(); for (obj = _rtld_objlist; obj != NULL; obj = obj->next) { - phdr_info.dlpi_addr = (Elf_Addr)obj->relocbase; - /* XXX: wrong but not fixing it yet */ - phdr_info.dlpi_name = obj->path; - phdr_info.dlpi_phdr = obj->phdr; - phdr_info.dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]); -#if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) - phdr_info.dlpi_tls_modid = obj->tlsindex; - phdr_info.dlpi_tls_data = obj->tlsinit; -#else - phdr_info.dlpi_tls_modid = 0; - phdr_info.dlpi_tls_data = 0; -#endif - phdr_info.dlpi_adds = _rtld_objloads; - phdr_info.dlpi_subs = _rtld_objloads - _rtld_objcount; + rtld_fill_dl_phdr_info(obj, &phdr_info); /* XXXlocking: exit point */ error = callback(&phdr_info, sizeof(phdr_info), param); @@ -1467,6 +1473,13 @@ dl_iterate_phdr(int (*callback)(struct dl_phdr_info *, size_t, void *), void *pa break; } + if (error = 0) { + rtld_fill_dl_phdr_info(&_rtld_objself, &phdr_info); + + /* XXXlocking: exit point */ + error = callback(&phdr_info, sizeof(phdr_info), param); + } + _rtld_shared_exit(); return error; }