1 /**
2 * D header file for FreeBSD.
3 *
4 * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/link_elf.h?view=markup, sys/link_elf.h)
5 */
6 module core.sys.freebsd.sys.link_elf;
7
8 version (FreeBSD):
9 extern (C):
10 nothrow:
11
12 import core.stdc.stdint : uint64_t;
13 import core.sys.freebsd.sys.elf;
14
15 version (D_LP64)
16 enum __ELF_NATIVE_CLASS = 64;
17 else
18 enum __ELF_NATIVE_CLASS = 32;
19
ElfW(string type)20 template ElfW(string type)
21 {
22 mixin("alias Elf"~__ELF_NATIVE_CLASS.stringof~"_"~type~" ElfW;");
23 }
24
25 enum LA_SER_ORIG = 0x01;
26 enum LA_SER_LIBPATH = 0x02;
27 enum LA_SER_RUNPATH = 0x04;
28 enum LA_SER_CONFIG = 0x08;
29 enum LA_SER_DEFAULT = 0x40;
30 enum LA_SER_SECURE = 0x80;
31
32 struct link_map
33 {
34 char* l_addr;
35
36 version (MIPS32)
37 char* l_offs;
38 version (MIPS64)
39 char* l_offs;
40
41 char* l_name;
42 void* l_ld;
43 link_map* l_next, l_prev;
44 }
45 alias link_map Link_map;
46
47 enum
48 {
49 RT_CONSISTENT,
50 RT_ADD,
51 RT_DELETE,
52 }
53
54 struct r_debug
55 {
56 int r_version;
57 link_map* r_map;
58 void function(r_debug*, link_map*) r_brk;
59 }
60
61 struct dl_phdr_info
62 {
63 ElfW!"Addr" dlpi_addr;
64 char* dlpi_name;
65 ElfW!"Phdr"* dlpi_phdr;
66 ElfW!"Half" dlpi_phnum;
67 uint64_t dlpi_adds;
68 uint64_t dlpi_subs;
69 size_t dlpi_tls_modid;
70 void* dlpi_tls_data;
71 }
72
73
74 private alias extern(C) int function(dl_phdr_info*, size_t, void *) dl_iterate_phdr_cb;
75 private alias extern(C) int function(dl_phdr_info*, size_t, void *) @nogc dl_iterate_phdr_cb_ngc;
76 extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data);
77 extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc;
78 extern int _rtld_addr_phdr(const void*, dl_phdr_info*) @nogc;
79 extern int _rtld_get_stack_prot() @nogc;
80