]>
git.proxmox.com Git - wasi-libc.git/blob - libc-top-half/musl/src/ldso/dl_iterate_phdr.c
3 #include "pthread_impl.h"
8 extern weak hidden
const size_t _DYNAMIC
[];
10 static int static_dl_iterate_phdr(int(*callback
)(struct dl_phdr_info
*info
, size_t size
, void *data
), void *data
)
13 ElfW(Phdr
) *phdr
, *tls_phdr
=0;
16 struct dl_phdr_info info
;
17 size_t i
, aux
[AUX_CNT
] = {0};
19 for (i
=0; libc
.auxv
[i
]; i
+=2)
20 if (libc
.auxv
[i
]<AUX_CNT
) aux
[libc
.auxv
[i
]] = libc
.auxv
[i
+1];
22 for (p
=(void *)aux
[AT_PHDR
],n
=aux
[AT_PHNUM
]; n
; n
--,p
+=aux
[AT_PHENT
]) {
24 if (phdr
->p_type
== PT_PHDR
)
25 base
= aux
[AT_PHDR
] - phdr
->p_vaddr
;
26 if (phdr
->p_type
== PT_DYNAMIC
&& _DYNAMIC
)
27 base
= (size_t)_DYNAMIC
- phdr
->p_vaddr
;
28 if (phdr
->p_type
== PT_TLS
)
31 info
.dlpi_addr
= base
;
32 info
.dlpi_name
= "/proc/self/exe";
33 info
.dlpi_phdr
= (void *)aux
[AT_PHDR
];
34 info
.dlpi_phnum
= aux
[AT_PHNUM
];
38 info
.dlpi_tls_modid
= 1;
39 info
.dlpi_tls_data
= __tls_get_addr((tls_mod_off_t
[]){1,0});
41 info
.dlpi_tls_modid
= 0;
42 info
.dlpi_tls_data
= 0;
44 return (callback
)(&info
, sizeof (info
), data
);
47 weak_alias(static_dl_iterate_phdr
, dl_iterate_phdr
);