| #ifndef _LINK_H |
| #define _LINK_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <elf.h> |
| #define __NEED_size_t |
| #define __NEED_uint32_t |
| #include <bits/alltypes.h> |
| |
| #if UINTPTR_MAX > 0xffffffff |
| #define ElfW(type) Elf64_ ## type |
| #else |
| #define ElfW(type) Elf32_ ## type |
| #endif |
| |
| #include <bits/link.h> |
| |
| struct dl_phdr_info { |
| ElfW(Addr) dlpi_addr; |
| const char *dlpi_name; |
| const ElfW(Phdr) *dlpi_phdr; |
| ElfW(Half) dlpi_phnum; |
| unsigned long long int dlpi_adds; |
| unsigned long long int dlpi_subs; |
| size_t dlpi_tls_modid; |
| void *dlpi_tls_data; |
| }; |
| |
| struct link_map { |
| ElfW(Addr) l_addr; |
| char *l_name; |
| ElfW(Dyn) *l_ld; |
| struct link_map *l_next, *l_prev; |
| }; |
| |
| struct r_debug { |
| int r_version; |
| struct link_map *r_map; |
| ElfW(Addr) r_brk; |
| enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state; |
| ElfW(Addr) r_ldbase; |
| }; |
| |
| int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void *), void *); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |