1 /**
2  * D header file for FreeBSD.
3  *
4  * $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/elf32.h?view=markup, sys/elf32.h)
5  */
6 module core.sys.freebsd.sys.elf32;
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 Elf32_Half;
17 alias uint32_t Elf32_Word;
18 alias int32_t  Elf32_Sword;
19 alias uint64_t Elf32_Lword;
20 alias uint32_t Elf32_Addr;
21 alias uint32_t Elf32_Off;
22 alias Elf32_Word Elf32_Hashelt;
23 alias Elf32_Word Elf32_Size;
24 alias Elf32_Sword Elf32_Ssize;
25 
26 struct Elf32_Ehdr
27 {
28     char[EI_NIDENT] e_ident = 0;
29     Elf32_Half    e_type;
30     Elf32_Half    e_machine;
31     Elf32_Word    e_version;
32     Elf32_Addr    e_entry;
33     Elf32_Off     e_phoff;
34     Elf32_Off     e_shoff;
35     Elf32_Word    e_flags;
36     Elf32_Half    e_ehsize;
37     Elf32_Half    e_phentsize;
38     Elf32_Half    e_phnum;
39     Elf32_Half    e_shentsize;
40     Elf32_Half    e_shnum;
41     Elf32_Half    e_shstrndx;
42 }
43 
44 struct Elf32_Shdr
45 {
46     Elf32_Word    sh_name;
47     Elf32_Word    sh_type;
48     Elf32_Word    sh_flags;
49     Elf32_Addr    sh_addr;
50     Elf32_Off     sh_offset;
51     Elf32_Word    sh_size;
52     Elf32_Word    sh_link;
53     Elf32_Word    sh_info;
54     Elf32_Word    sh_addralign;
55     Elf32_Word    sh_entsize;
56 }
57 
58 struct Elf32_Phdr
59 {
60     Elf32_Word    p_type;
61     Elf32_Off     p_offset;
62     Elf32_Addr    p_vaddr;
63     Elf32_Addr    p_paddr;
64     Elf32_Word    p_filesz;
65     Elf32_Word    p_memsz;
66     Elf32_Word    p_flags;
67     Elf32_Word    p_align;
68 }
69 
70 struct Elf32_Dyn
71 {
72   Elf32_Sword   d_tag;
73   union _d_un
74   {
75       Elf32_Word d_val;
76       Elf32_Addr d_ptr;
77   } _d_un d_un;
78 }
79 
80 struct Elf32_Rel
81 {
82     Elf32_Addr    r_offset;
83     Elf32_Word    r_info;
84 }
85 
86 struct Elf32_Rela
87 {
88     Elf32_Addr    r_offset;
89     Elf32_Word    r_info;
90     Elf32_Sword   r_addend;
91 }
92 
93 extern (D)
94 {
ELF32_R_SYM(V)95     auto ELF32_R_SYM(V)(V val) { return val >> 8; }
ELF32_R_TYPE(V)96     auto ELF32_R_TYPE(V)(V val) { return val & 0xff; }
ELF32_R_INFO(S,T)97     auto ELF32_R_INFO(S, T)(S sym, T type) { return (sym << 8) + (type & 0xff); }
98 }
99 
100 alias Elf_Note Elf32_Nhdr;
101 
102 struct Elf32_Move
103 {
104     Elf32_Lword   m_value;
105     Elf32_Word    m_info;
106     Elf32_Word    m_poffset;
107     Elf32_Half    m_repeat;
108     Elf32_Half    m_stride;
109 }
110 
111 extern (D)
112 {
ELF32_M_SYM(I)113     auto ELF32_M_SYM(I)(I info) { return info >> 8; }
ELF32_M_SIZE(I)114     auto ELF32_M_SIZE(I)(I info) { return cast(ubyte)info; }
ELF32_M_INFO(S,SZ)115     auto ELF32_M_INFO(S, SZ)(S sym, SZ size) { return (sym << 8) + cast(ubye)size; }
116 }
117 
118 struct Elf32_Cap
119 {
120     Elf32_Word    c_tag;
121     union _c_un
122     {
123         Elf32_Word      c_val;
124         Elf32_Addr      c_ptr;
125     } _c_un c_un;
126 }
127 
128 struct Elf32_Sym
129 {
130     Elf32_Word    st_name;
131     Elf32_Addr    st_value;
132     Elf32_Word    st_size;
133     ubyte st_info;
134     ubyte st_other;
135     Elf32_Half st_shndx;
136 }
137 
138 extern (D)
139 {
ELF32_ST_BIND(T)140     auto ELF32_ST_BIND(T)(T val) { return cast(ubyte)val >> 4; }
ELF32_ST_TYPE(T)141     auto ELF32_ST_TYPE(T)(T val) { return val & 0xf; }
ELF32_ST_INFO(B,T)142     auto ELF32_ST_INFO(B, T)(B bind, T type) { return (bind << 4) + (type & 0xf); }
ELF32_ST_VISIBILITY(O)143     auto ELF32_ST_VISIBILITY(O)(O o) { return o & 0x03; }
144 }
145 
146 struct Elf32_Verdef
147 {
148     Elf32_Half    vd_version;
149     Elf32_Half    vd_flags;
150     Elf32_Half    vd_ndx;
151     Elf32_Half    vd_cnt;
152     Elf32_Word    vd_hash;
153     Elf32_Word    vd_aux;
154     Elf32_Word    vd_next;
155 }
156 
157 struct Elf32_Verdaux
158 {
159     Elf32_Word    vda_name;
160     Elf32_Word    vda_next;
161 }
162 
163 struct Elf32_Verneed
164 {
165     Elf32_Half    vn_version;
166     Elf32_Half    vn_cnt;
167     Elf32_Word    vn_file;
168     Elf32_Word    vn_aux;
169     Elf32_Word    vn_next;
170 }
171 
172 struct Elf32_Vernaux
173 {
174     Elf32_Word    vna_hash;
175     Elf32_Half    vna_flags;
176     Elf32_Half    vna_other;
177     Elf32_Word    vna_name;
178     Elf32_Word    vna_next;
179 }
180 
181 alias Elf32_Half Elf32_Versym;
182 
183 struct Elf32_Syminfo
184 {
185     Elf32_Half si_boundto;
186     Elf32_Half si_flags;
187 }
188