|  | #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 |