1 /**
2  * D header file for FreeBSD.
3  *
4  * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/elf64.h?view=markup, sys/elf64.h)
5  */
6 module core.sys.freebsd.sys.elf64;
7 
8 version (FreeBSD):
9 extern (C):
10 pure:
11 nothrow:
12 
13 import core.stdc.stdint;
14 public import core.sys.freebsd.sys.elf_common;
15 
16 alias uint16_t Elf64_Half;
17 alias uint32_t Elf64_Word;
18 alias int32_t  Elf64_Sword;
19 alias uint64_t Elf64_Lword;
20 alias uint64_t Elf64_Xword;
21 alias int64_t  Elf64_Sxword;
22 alias uint64_t Elf64_Addr;
23 alias uint64_t Elf64_Off;
24 alias Elf64_Word Elf64_Hashelt;
25 alias Elf64_Xword Elf64_Size;
26 alias Elf64_Sxword Elf64_Ssize;
27 
28 struct Elf64_Ehdr
29 {
30     char[EI_NIDENT] e_ident = 0;
31     Elf64_Half    e_type;
32     Elf64_Half    e_machine;
33     Elf64_Word    e_version;
34     Elf64_Addr    e_entry;
35     Elf64_Off     e_phoff;
36     Elf64_Off     e_shoff;
37     Elf64_Word    e_flags;
38     Elf64_Half    e_ehsize;
39     Elf64_Half    e_phentsize;
40     Elf64_Half    e_phnum;
41     Elf64_Half    e_shentsize;
42     Elf64_Half    e_shnum;
43     Elf64_Half    e_shstrndx;
44 }
45 
46 struct Elf64_Lib
47 {
48     Elf64_Word    l_name;
49     Elf64_Word    l_time_stamp;
50     Elf64_Word    l_checksum;
51     Elf64_Word    l_version;
52     Elf64_Word    l_flags;
53 }
54 
55 struct Elf64_Shdr
56 {
57     Elf64_Word    sh_name;
58     Elf64_Word    sh_type;
59     Elf64_Xword   sh_flags;
60     Elf64_Addr    sh_addr;
61     Elf64_Off     sh_offset;
62     Elf64_Xword   sh_size;
63     Elf64_Word    sh_link;
64     Elf64_Word    sh_info;
65     Elf64_Xword   sh_addralign;
66     Elf64_Xword   sh_entsize;
67 }
68 
69 struct Elf64_Phdr
70 {
71     Elf64_Word    p_type;
72     Elf64_Word    p_flags;
73     Elf64_Off     p_offset;
74     Elf64_Addr    p_vaddr;
75     Elf64_Addr    p_paddr;
76     Elf64_Xword   p_filesz;
77     Elf64_Xword   p_memsz;
78     Elf64_Xword   p_align;
79 }
80 
81 struct Elf64_Dyn
82 {
83   Elf64_Sxword  d_tag;
84   union _d_un
85   {
86       Elf64_Xword d_val;
87       Elf64_Addr d_ptr;
88   } _d_un d_un;
89 }
90 
91 struct Elf64_Rel
92 {
93     Elf64_Addr    r_offset;
94     Elf64_Xword   r_info;
95 }
96 
97 struct Elf64_Rela
98 {
99     Elf64_Addr    r_offset;
100     Elf64_Xword   r_info;
101     Elf64_Sxword  r_addend;
102 }
103 
104 extern (D)
105 {
ELF64_R_SYM(I)106     auto ELF64_R_SYM(I)(I i) { return i >> 32; }
ELF64_R_TYPE(I)107     auto ELF64_R_TYPE(I)(I i) { return i & 0xffffffff; }
ELF64_R_INFO(S,T)108     auto ELF64_R_INFO(S, T)(S sym, T type) { return (sym << 32) + (type & 0xffffffff); }
109 
ELF64_R_TYPE_DATA(I)110     auto ELF64_R_TYPE_DATA(I)(I i) { return (cast(Elf64_Xword) i << 32) >> 40; }
ELF64_R_TYPE_ID(I)111     auto ELF64_R_TYPE_ID(I)(I i) { return (cast(Elf64_Xword) i << 56 ) >> 56; }
ELF64_R_TYPE_INFO(D,T)112     auto ELF64_R_TYPE_INFO(D, T)(D d, T t) { return cast(Elf64_Xword) d << 8 + cast(Elf64_Xword) t; }
113 }
114 
115 alias Elf_Note Elf64_Nhdr;
116 
117 struct Elf64_Move
118 {
119     Elf64_Lword   m_value;
120     Elf64_Xword   m_info;
121     Elf64_Xword   m_poffset;
122     Elf64_Half    m_repeat;
123     Elf64_Half    m_stride;
124 }
125 
126 extern (D)
127 {
ELF64_M_SYM(I)128     auto ELF64_M_SYM(I)(I info) { return info >> 8; }
ELF64_M_SIZE(I)129     auto ELF64_M_SIZE(I)(I info) { return cast(ubyte)info; }
ELF64_M_INFO(S,SZ)130     auto ELF64_M_INFO(S, SZ)(S sym, SZ size) { return (sym << 8) + cast(ubye)size; }
131 }
132 
133 struct Elf64_Cap
134 {
135     Elf64_Xword   c_tag;
136     union _c_un
137     {
138         Elf64_Xword     c_val;
139         Elf64_Addr      c_ptr;
140     } _c_un c_un;
141 }
142 
143 struct Elf64_Sym
144 {
145     Elf64_Word    st_name;
146     ubyte st_info;
147     ubyte st_other;
148     Elf64_Half st_shndx;
149     Elf64_Addr    st_value;
150     Elf64_Xword   st_size;
151 }
152 
153 extern (D)
154 {
ELF64_ST_BIND(T)155     auto ELF64_ST_BIND(T)(T val) { return cast(ubyte)val >> 4; }
ELF64_ST_TYPE(T)156     auto ELF64_ST_TYPE(T)(T val) { return val & 0xf; }
ELF64_ST_INFO(B,T)157     auto ELF64_ST_INFO(B, T)(B bind, T type) { return (bind << 4) + (type & 0xf); }
ELF64_ST_VISIBILITY(O)158     auto ELF64_ST_VISIBILITY(O)(O o) { return o & 0x03; }
159 }
160 
161 struct Elf64_Verdef
162 {
163     Elf64_Half    vd_version;
164     Elf64_Half    vd_flags;
165     Elf64_Half    vd_ndx;
166     Elf64_Half    vd_cnt;
167     Elf64_Word    vd_hash;
168     Elf64_Word    vd_aux;
169     Elf64_Word    vd_next;
170 }
171 
172 struct Elf64_Verdaux
173 {
174     Elf64_Word    vda_name;
175     Elf64_Word    vda_next;
176 }
177 
178 struct Elf64_Verneed
179 {
180     Elf64_Half    vn_version;
181     Elf64_Half    vn_cnt;
182     Elf64_Word    vn_file;
183     Elf64_Word    vn_aux;
184     Elf64_Word    vn_next;
185 }
186 
187 struct Elf64_Vernaux
188 {
189     Elf64_Word    vna_hash;
190     Elf64_Half    vna_flags;
191     Elf64_Half    vna_other;
192     Elf64_Word    vna_name;
193     Elf64_Word    vna_next;
194 }
195 
196 alias Elf64_Half Elf64_Versym;
197 
198 struct Elf64_Syminfo
199 {
200     Elf64_Half si_boundto;
201     Elf64_Half si_flags;
202 }
203