1 /** 2 * D header file for Solaris. 3 * 4 * $(LINK2 http://src.illumos.org/source/xref/illumos-gate/usr/src/head/link.h, illumos link.h) 5 */ 6 module core.sys.solaris.link; 7 8 version (Solaris): 9 extern (C): 10 nothrow: 11 12 import core.stdc.stdint; 13 import core.sys.solaris.dlfcn; 14 import core.sys.solaris.libelf; 15 import core.sys.solaris.sys.elf; 16 import core.sys.solaris.sys.link; 17 18 uint ld_version(uint); 19 void ld_input_done(uint*); 20 21 void ld_start(const scope char*, const Elf32_Half, const scope char*); 22 void ld_atexit(int); 23 void ld_open(const scope char**, const scope char**, int*, int, Elf**, Elf*, size_t, const Elf_Kind); 24 void ld_file(const scope char*, const Elf_Kind, int, Elf*); 25 void ld_input_section(const scope char*, Elf32_Shdr**, Elf32_Word, Elf_Data*, Elf*, uint*); 26 void ld_section(const scope char*, Elf32_Shdr*, Elf32_Word, Elf_Data*, Elf*); 27 28 version (D_LP64) 29 { 30 void ld_start64(const scope char*, const Elf64_Half, const scope char*); 31 void ld_atexit64(int); 32 void ld_open64(const scope char**, const scope char**, int*, int, Elf**, Elf*, size_t, const Elf_Kind); 33 void ld_file64(const scope char*, const Elf_Kind, int, Elf*); 34 void ld_input_section64(const scope char*, Elf64_Shdr**, Elf64_Word, Elf_Data*, Elf*, uint*); 35 void ld_section64(const scope char*, Elf64_Shdr*, Elf64_Word, Elf_Data*, Elf*); 36 } 37 38 enum LD_SUP_VNONE = 0; 39 enum LD_SUP_VERSION1 = 1; 40 enum LD_SUP_VERSION2 = 2; 41 enum LD_SUP_VERSION3 = 3; 42 enum LD_SUP_VCURRENT = LD_SUP_VERSION3; 43 44 enum LD_SUP_DERIVED = 0x1; 45 enum LD_SUP_INHERITED = 0x2; 46 enum LD_SUP_EXTRACTED = 0x4; 47 48 enum LM_ID_BASE = 0x00; 49 enum LM_ID_LDSO = 0x01; 50 enum LM_ID_NUM = 2; 51 52 enum LM_ID_BRAND = 0xfd; 53 enum LM_ID_NONE = 0xfe; 54 enum LM_ID_NEWLM = 0xff; 55 56 enum LAV_NONE = 0; 57 enum LAV_VERSION1 = 1; 58 enum LAV_VERSION2 = 2; 59 enum LAV_VERSION3 = 3; 60 enum LAV_VERSION4 = 4; 61 enum LAV_VERSION5 = 5; 62 enum LAV_CURRENT = LAV_VERSION5; 63 enum LAV_NUM = 6; 64 65 enum LA_FLG_BINDTO = 0x0001; 66 enum LA_FLG_BINDFROM = 0x0002; 67 68 enum LA_SYMB_NOPLTENTER = 0x0001; 69 enum LA_SYMB_NOPLTEXIT = 0x0002; 70 enum LA_SYMB_STRUCTCALL = 0x0004; 71 enum LA_SYMB_DLSYM = 0x0008; 72 enum LA_SYMB_ALTVALUE = 0x0010; 73 74 enum LA_SER_ORIG = 0x001; 75 enum LA_SER_LIBPATH = 0x002; 76 enum LA_SER_RUNPATH = 0x004; 77 enum LA_SER_CONFIG = 0x008; 78 enum LA_SER_DEFAULT = 0x040; 79 enum LA_SER_SECURE = 0x080; 80 81 enum LA_SER_MASK = 0xfff; 82 83 enum LA_ACT_CONSISTENT = 0x00; 84 enum LA_ACT_ADD = 0x01; 85 enum LA_ACT_DELETE = 0x02; 86 enum LA_ACT_MAX = 3; 87 88 version (D_LP64) 89 alias long lagreg_t; 90 else 91 alias int lagreg_t; 92 93 struct _la_sparc_regs 94 { 95 lagreg_t lr_rego0; 96 lagreg_t lr_rego1; 97 lagreg_t lr_rego2; 98 lagreg_t lr_rego3; 99 lagreg_t lr_rego4; 100 lagreg_t lr_rego5; 101 lagreg_t lr_rego6; 102 lagreg_t lr_rego7; 103 } 104 105 version (D_LP64) 106 { 107 alias _la_sparc_regs La_sparcv9_regs; 108 struct La_amd64_regs 109 { 110 lagreg_t lr_rsp; 111 lagreg_t lr_rbp; 112 lagreg_t lr_rdi; 113 lagreg_t lr_rsi; 114 lagreg_t lr_rdx; 115 lagreg_t lr_rcx; 116 lagreg_t lr_r8; 117 lagreg_t lr_r9; 118 } 119 } 120 else 121 { 122 alias _la_sparc_regs La_sparcv8_regs; 123 struct La_i86_regs 124 { 125 lagreg_t lr_esp; 126 lagreg_t lr_ebp; 127 } 128 } 129 130 uint la_version(uint); 131 void la_activity(uintptr_t*, uint); 132 void la_preinit(uintptr_t*); 133 char* la_objsearch(const scope char*, uintptr_t*, uint); 134 uint la_objopen(Link_map*, Lmid_t, uintptr_t*); 135 uint la_objclose(uintptr_t*); 136 int la_objfilter(uintptr_t*, const scope char*, uintptr_t*, uint); 137 138 version (D_LP64) 139 { 140 uintptr_t la_amd64_pltenter(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, 141 La_amd64_regs*, uint*, const scope char*); 142 uintptr_t la_symbind64(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, uint*, const scope char*); 143 uintptr_t la_sparcv9_pltenter(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, 144 La_sparcv9_regs*, uint*, const scope char*); 145 uintptr_t la_pltexit64(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, uintptr_t, const scope char*); 146 } 147 else 148 { 149 uintptr_t la_symbind32(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, uint*); 150 uintptr_t la_sparcv8_pltenter(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, 151 La_sparcv8_regs*, uint*); 152 uintptr_t la_i86_pltenter(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, 153 La_i86_regs*, uint*); 154 uintptr_t la_pltexit(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, uintptr_t); 155 } 156 157 template ElfW(string type) 158 { 159 version (D_LP64) 160 mixin("alias Elf64_"~type~" ElfW;"); 161 else 162 mixin("alias Elf32_"~type~" ElfW;"); 163 } 164 165 struct dl_phdr_info 166 { 167 ElfW!"Addr" dlpi_addr; 168 char* dlpi_name; 169 ElfW!"Phdr"* dlpi_phdr; 170 ElfW!"Half" dlpi_phnum; 171 uint64_t dlpi_adds; 172 uint64_t dlpi_subs; 173 size_t dlpi_tls_modid; // since Solaris 11.5 174 void* dlpi_tls_data; // since Solaris 11.5 175 } 176 177 private alias extern(C) int function(dl_phdr_info*, size_t, void *) dl_iterate_phdr_cb; 178 private alias extern(C) int function(dl_phdr_info*, size_t, void *) @nogc dl_iterate_phdr_cb_ngc; 179 extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data); 180 extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc;