1#include <elf.h> 2#include <link.h> 3#include "libc.h" 4 5#define AUX_CNT 38 6 7static int static_dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data) 8{ 9 unsigned char *p; 10 ElfW(Phdr) *phdr, *tls_phdr=0; 11 size_t base = 0; 12 size_t n; 13 struct dl_phdr_info info; 14 size_t i, aux[AUX_CNT]; 15 16 for (i=0; libc.auxv[i]; i+=2) 17 if (libc.auxv[i]<AUX_CNT) aux[libc.auxv[i]] = libc.auxv[i+1]; 18 19 for (p=(void *)aux[AT_PHDR],n=aux[AT_PHNUM]; n; n--,p+=aux[AT_PHENT]) { 20 phdr = (void *)p; 21 if (phdr->p_type == PT_PHDR) 22 base = aux[AT_PHDR] - phdr->p_vaddr; 23 if (phdr->p_type == PT_TLS) 24 tls_phdr = phdr; 25 } 26 info.dlpi_addr = base; 27 info.dlpi_name = "/proc/self/exe"; 28 info.dlpi_phdr = (void *)aux[AT_PHDR]; 29 info.dlpi_phnum = aux[AT_PHNUM]; 30 info.dlpi_adds = 0; 31 info.dlpi_subs = 0; 32 if (tls_phdr) { 33 info.dlpi_tls_modid = 1; 34 info.dlpi_tls_data = (void *)(base + tls_phdr->p_vaddr); 35 } else { 36 info.dlpi_tls_modid = 0; 37 info.dlpi_tls_data = 0; 38 } 39 return (callback)(&info, sizeof (info), data); 40} 41 42weak_alias(static_dl_iterate_phdr, dl_iterate_phdr); 43