Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7ad4524

Browse files
committedAug 27, 2013
Merge pull request #586 from redstar/freebsd
Add FreeBSD header sys/elf.h
2 parents 2c6c29b + ae2c4df commit 7ad4524

File tree

9 files changed

+1361
-0
lines changed

9 files changed

+1361
-0
lines changed
 

‎mak/COPY

+5
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ COPY=\
3737
\
3838
$(IMPDIR)\core\sys\freebsd\dlfcn.d \
3939
$(IMPDIR)\core\sys\freebsd\execinfo.d \
40+
$(IMPDIR)\core\sys\freebsd\sys\elf.d \
41+
$(IMPDIR)\core\sys\freebsd\sys\elf_common.d \
42+
$(IMPDIR)\core\sys\freebsd\sys\elf32.d \
43+
$(IMPDIR)\core\sys\freebsd\sys\elf64.d \
4044
$(IMPDIR)\core\sys\freebsd\sys\event.d \
45+
$(IMPDIR)\core\sys\freebsd\sys\link_elf.d \
4146
\
4247
$(IMPDIR)\core\sys\linux\config.d \
4348
$(IMPDIR)\core\sys\linux\dlfcn.d \

‎mak/MANIFEST

+5
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ MANIFEST=\
6565
src\core\sys\freebsd\dlfcn.d \
6666
src\core\sys\freebsd\execinfo.d \
6767
\
68+
src\core\sys\freebsd\sys\elf.d \
69+
src\core\sys\freebsd\sys\elf_common.d \
70+
src\core\sys\freebsd\sys\elf32.d \
71+
src\core\sys\freebsd\sys\elf64.d \
6872
src\core\sys\freebsd\sys\event.d \
73+
src\core\sys\freebsd\sys\link_elf.d \
6974
\
7075
src\core\sys\linux\config.d \
7176
src\core\sys\linux\dlfcn.d \

‎src/core/sys/freebsd/sys/elf.d

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* D header file for FreeBSD.
3+
*
4+
* $(LINK2 http://svnweb.freebsd.org/base/head/sys/sys/elf.h?view=markup, sys/elf.h)
5+
*/
6+
module core.sys.freebsd.sys.elf;
7+
8+
version (FreeBSD):
9+
10+
public import core.sys.freebsd.sys.elf32;
11+
public import core.sys.freebsd.sys.elf64;

‎src/core/sys/freebsd/sys/elf32.d

+187
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
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 e_ident[EI_NIDENT];
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+
{
95+
auto ELF32_R_SYM(V)(V val) { return val >> 8; }
96+
auto ELF32_R_TYPE(V)(V val) { return val & 0xff; }
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+
{
113+
auto ELF32_M_SYM(I)(I info) { return info >> 8; }
114+
auto ELF32_M_SIZE(I)(I info) { return cast(ubyte)info; }
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+
{
140+
auto ELF32_ST_BIND(T)(T val) { return cast(ubyte)val >> 4; }
141+
auto ELF32_ST_TYPE(T)(T val) { return val & 0xf; }
142+
auto ELF32_ST_INFO(B, T)(B bind, T type) { return (bind << 4) + (type & 0xf); }
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+
}

‎src/core/sys/freebsd/sys/elf64.d

+193
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
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 e_ident[EI_NIDENT];
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_Shdr
47+
{
48+
Elf64_Word sh_name;
49+
Elf64_Word sh_type;
50+
Elf64_Xword sh_flags;
51+
Elf64_Addr sh_addr;
52+
Elf64_Off sh_offset;
53+
Elf64_Xword sh_size;
54+
Elf64_Word sh_link;
55+
Elf64_Word sh_info;
56+
Elf64_Xword sh_addralign;
57+
Elf64_Xword sh_entsize;
58+
}
59+
60+
struct Elf64_Phdr
61+
{
62+
Elf64_Word p_type;
63+
Elf64_Word p_flags;
64+
Elf64_Off p_offset;
65+
Elf64_Addr p_vaddr;
66+
Elf64_Addr p_paddr;
67+
Elf64_Xword p_filesz;
68+
Elf64_Xword p_memsz;
69+
Elf64_Xword p_align;
70+
}
71+
72+
struct Elf64_Dyn
73+
{
74+
Elf64_Sxword d_tag;
75+
union _d_un
76+
{
77+
Elf64_Xword d_val;
78+
Elf64_Addr d_ptr;
79+
} _d_un d_un;
80+
}
81+
82+
struct Elf64_Rel
83+
{
84+
Elf64_Addr r_offset;
85+
Elf64_Xword r_info;
86+
}
87+
88+
struct Elf64_Rela
89+
{
90+
Elf64_Addr r_offset;
91+
Elf64_Xword r_info;
92+
Elf64_Sxword r_addend;
93+
}
94+
95+
extern (D)
96+
{
97+
auto ELF64_R_SYM(I)(I i) { return i >> 32; }
98+
auto ELF64_R_TYPE(I)(I i) { return i & 0xffffffff; }
99+
auto ELF64_R_INFO(S, T)(S sym, T type) { return (sym << 32) + (type & 0xffffffff); }
100+
101+
auto ELF64_R_TYPE_DATA(I)(I i) { return (cast(Elf64_Xword) i << 32) >> 40; }
102+
auto ELF64_R_TYPE_ID(I)(I i) { return (cast(Elf64_Xword) i << 56 ) >> 56; }
103+
auto ELF64_R_TYPE_INFO(D, T)(D d, T t) { return cast(Elf64_Xword) d << 8 + cast(Elf64_Xword) t; }
104+
}
105+
106+
alias Elf_Note Elf64_Nhdr;
107+
108+
struct Elf64_Move
109+
{
110+
Elf64_Lword m_value;
111+
Elf64_Xword m_info;
112+
Elf64_Xword m_poffset;
113+
Elf64_Half m_repeat;
114+
Elf64_Half m_stride;
115+
}
116+
117+
extern (D)
118+
{
119+
auto ELF64_M_SYM(I)(I info) { return info >> 8; }
120+
auto ELF64_M_SIZE(I)(I info) { return cast(ubyte)info; }
121+
auto ELF64_M_INFO(S, SZ)(S sym, SZ size) { return (sym << 8) + cast(ubye)size; }
122+
}
123+
124+
struct Elf64_Cap
125+
{
126+
Elf64_Xword c_tag;
127+
union _c_un
128+
{
129+
Elf64_Xword c_val;
130+
Elf64_Addr c_ptr;
131+
} _c_un c_un;
132+
}
133+
134+
struct Elf64_Sym
135+
{
136+
Elf64_Word st_name;
137+
ubyte st_info;
138+
ubyte st_other;
139+
Elf64_Half st_shndx;
140+
Elf64_Addr st_value;
141+
Elf64_Xword st_size;
142+
}
143+
144+
extern (D)
145+
{
146+
auto ELF64_ST_BIND(T)(T val) { return cast(ubyte)val >> 4; }
147+
auto ELF64_ST_TYPE(T)(T val) { return val & 0xf; }
148+
auto ELF64_ST_INFO(B, T)(B bind, T type) { return (bind << 4) + (type & 0xf); }
149+
auto ELF64_ST_VISIBILITY(O)(O o) { return o & 0x03; }
150+
}
151+
152+
struct Elf64_Verdef
153+
{
154+
Elf64_Half vd_version;
155+
Elf64_Half vd_flags;
156+
Elf64_Half vd_ndx;
157+
Elf64_Half vd_cnt;
158+
Elf64_Word vd_hash;
159+
Elf64_Word vd_aux;
160+
Elf64_Word vd_next;
161+
}
162+
163+
struct Elf64_Verdaux
164+
{
165+
Elf64_Word vda_name;
166+
Elf64_Word vda_next;
167+
}
168+
169+
struct Elf64_Verneed
170+
{
171+
Elf64_Half vn_version;
172+
Elf64_Half vn_cnt;
173+
Elf64_Word vn_file;
174+
Elf64_Word vn_aux;
175+
Elf64_Word vn_next;
176+
}
177+
178+
struct Elf64_Vernaux
179+
{
180+
Elf64_Word vna_hash;
181+
Elf64_Half vna_flags;
182+
Elf64_Half vna_other;
183+
Elf64_Word vna_name;
184+
Elf64_Word vna_next;
185+
}
186+
187+
alias Elf64_Half Elf64_Versym;
188+
189+
struct Elf64_Syminfo
190+
{
191+
Elf64_Half si_boundto;
192+
Elf64_Half si_flags;
193+
}

‎src/core/sys/freebsd/sys/elf_common.d

+853
Large diffs are not rendered by default.

‎src/core/sys/freebsd/sys/link_elf.d

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
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_hdr_callback;
75+
extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void*);
76+
extern int _rtld_addr_phdr(const void*, dl_phdr_info*);
77+
extern int _rtld_get_stack_prot();

‎win32.mak

+15
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,24 @@ $(IMPDIR)\core\sys\freebsd\dlfcn.d : src\core\sys\freebsd\dlfcn.d
250250
$(IMPDIR)\core\sys\freebsd\execinfo.d : src\core\sys\freebsd\execinfo.d
251251
copy $** $@
252252

253+
$(IMPDIR)\core\sys\freebsd\sys\elf.d : src\core\sys\freebsd\sys\elf.d
254+
copy $** $@
255+
256+
$(IMPDIR)\core\sys\freebsd\sys\elf_common.d : src\core\sys\freebsd\sys\elf_common.d
257+
copy $** $@
258+
259+
$(IMPDIR)\core\sys\freebsd\sys\elf32.d : src\core\sys\freebsd\sys\elf32.d
260+
copy $** $@
261+
262+
$(IMPDIR)\core\sys\freebsd\sys\elf64.d : src\core\sys\freebsd\sys\elf64.d
263+
copy $** $@
264+
253265
$(IMPDIR)\core\sys\freebsd\sys\event.d : src\core\sys\freebsd\sys\event.d
254266
copy $** $@
255267

268+
$(IMPDIR)\core\sys\freebsd\sys\link_elf.d : src\core\sys\freebsd\sys\link_elf.d
269+
copy $** $@
270+
256271
$(IMPDIR)\core\sys\linux\config.d : src\core\sys\linux\config.d
257272
copy $** $@
258273

‎win64.mak

+15
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,24 @@ $(IMPDIR)\core\sys\freebsd\dlfcn.d : src\core\sys\freebsd\dlfcn.d
257257
$(IMPDIR)\core\sys\freebsd\execinfo.d : src\core\sys\freebsd\execinfo.d
258258
copy $** $@
259259

260+
$(IMPDIR)\core\sys\freebsd\sys\elf.d : src\core\sys\freebsd\sys\elf.d
261+
copy $** $@
262+
263+
$(IMPDIR)\core\sys\freebsd\sys\elf_common.d : src\core\sys\freebsd\sys\elf_common.d
264+
copy $** $@
265+
266+
$(IMPDIR)\core\sys\freebsd\sys\elf32.d : src\core\sys\freebsd\sys\elf32.d
267+
copy $** $@
268+
269+
$(IMPDIR)\core\sys\freebsd\sys\elf64.d : src\core\sys\freebsd\sys\elf64.d
270+
copy $** $@
271+
260272
$(IMPDIR)\core\sys\freebsd\sys\event.d : src\core\sys\freebsd\sys\event.d
261273
copy $** $@
262274

275+
$(IMPDIR)\core\sys\freebsd\sys\link_elf.d : src\core\sys\freebsd\sys\link_elf.d
276+
copy $** $@
277+
263278
$(IMPDIR)\core\sys\linux\config.d : src\core\sys\linux\config.d
264279
copy $** $@
265280

0 commit comments

Comments
 (0)
Please sign in to comment.