1260684Skaiw/*-
2260684Skaiw * Copyright (c) 2009 Joseph Koshy
3260684Skaiw * All rights reserved.
4260684Skaiw *
5260684Skaiw * Redistribution and use in source and binary forms, with or without
6260684Skaiw * modification, are permitted provided that the following conditions
7260684Skaiw * are met:
8260684Skaiw * 1. Redistributions of source code must retain the above copyright
9260684Skaiw *    notice, this list of conditions and the following disclaimer.
10260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright
11260684Skaiw *    notice, this list of conditions and the following disclaimer in the
12260684Skaiw *    documentation and/or other materials provided with the distribution.
13260684Skaiw *
14260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17260684Skaiw * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24260684Skaiw * SUCH DAMAGE.
25260684Skaiw *
26300311Semaste * $Id: _elftc.h 3446 2016-05-03 01:31:17Z emaste $
27260684Skaiw */
28260684Skaiw
29260684Skaiw/**
30300311Semaste ** Miscellaneous definitions needed by multiple components.
31260684Skaiw **/
32260684Skaiw
33260684Skaiw#ifndef	_ELFTC_H
34260684Skaiw#define	_ELFTC_H
35260684Skaiw
36260684Skaiw#ifndef	NULL
37260684Skaiw#define NULL 	((void *) 0)
38260684Skaiw#endif
39260684Skaiw
40260684Skaiw#ifndef	offsetof
41260684Skaiw#define	offsetof(T, M)		((int) &((T*) 0) -> M)
42260684Skaiw#endif
43260684Skaiw
44260684Skaiw/* --QUEUE-MACROS-- [[ */
45260684Skaiw
46260684Skaiw/*
47260684Skaiw * Supply macros missing from <sys/queue.h>
48260684Skaiw */
49260684Skaiw
50260684Skaiw/*
51260684Skaiw * Copyright (c) 1991, 1993
52260684Skaiw *	The Regents of the University of California.  All rights reserved.
53260684Skaiw *
54260684Skaiw * Redistribution and use in source and binary forms, with or without
55260684Skaiw * modification, are permitted provided that the following conditions
56260684Skaiw * are met:
57260684Skaiw * 1. Redistributions of source code must retain the above copyright
58260684Skaiw *    notice, this list of conditions and the following disclaimer.
59260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright
60260684Skaiw *    notice, this list of conditions and the following disclaimer in the
61260684Skaiw *    documentation and/or other materials provided with the distribution.
62260684Skaiw * 3. Neither the name of the University nor the names of its contributors
63260684Skaiw *    may be used to endorse or promote products derived from this software
64260684Skaiw *    without specific prior written permission.
65260684Skaiw *
66260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
67260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
68260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
69260684Skaiw * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
70260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
71260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
72260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
73260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
74260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
75260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
76260684Skaiw * SUCH DAMAGE.
77260684Skaiw */
78260684Skaiw
79278904Semaste#ifndef	LIST_FOREACH_SAFE
80278904Semaste#define	LIST_FOREACH_SAFE(var, head, field, tvar)		\
81278904Semaste	for ((var) = LIST_FIRST((head));			\
82278904Semaste	    (var) && ((tvar) = LIST_NEXT((var), field), 1);	\
83278904Semaste	    (var) = (tvar))
84278904Semaste#endif
85278904Semaste
86260684Skaiw#ifndef	SLIST_FOREACH_SAFE
87278904Semaste#define	SLIST_FOREACH_SAFE(var, head, field, tvar)		\
88278904Semaste	for ((var) = SLIST_FIRST((head));			\
89278904Semaste	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);	\
90260684Skaiw	    (var) = (tvar))
91260684Skaiw#endif
92260684Skaiw
93260684Skaiw#ifndef	STAILQ_CONCAT
94260684Skaiw#define	STAILQ_CONCAT(head1, head2) do {			\
95260684Skaiw	if (!STAILQ_EMPTY((head2))) {				\
96260684Skaiw		*(head1)->stqh_last = (head2)->stqh_first;	\
97260684Skaiw		(head1)->stqh_last = (head2)->stqh_last;	\
98260684Skaiw		STAILQ_INIT((head2));				\
99260684Skaiw	}							\
100260684Skaiw} while (/*CONSTCOND*/0)
101260684Skaiw#endif
102260684Skaiw
103260684Skaiw#ifndef	STAILQ_EMPTY
104260684Skaiw#define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
105260684Skaiw#endif
106260684Skaiw
107260684Skaiw#ifndef	STAILQ_ENTRY
108260684Skaiw#define	STAILQ_ENTRY(type)					\
109260684Skaiwstruct {							\
110260684Skaiw	struct type *stqe_next;	/* next element */		\
111260684Skaiw}
112260684Skaiw#endif
113260684Skaiw
114260684Skaiw#ifndef	STAILQ_FIRST
115260684Skaiw#define	STAILQ_FIRST(head)	((head)->stqh_first)
116260684Skaiw#endif
117260684Skaiw
118260684Skaiw#ifndef	STAILQ_HEAD
119260684Skaiw#define	STAILQ_HEAD(name, type)					\
120260684Skaiwstruct name {							\
121260684Skaiw	struct type *stqh_first; /* first element */		\
122260684Skaiw	struct type **stqh_last; /* addr of last next element */ \
123260684Skaiw}
124260684Skaiw#endif
125260684Skaiw
126260684Skaiw#ifndef	STAILQ_HEAD_INITIALIZER
127260684Skaiw#define	STAILQ_HEAD_INITIALIZER(head)				\
128260684Skaiw	{ NULL, &(head).stqh_first }
129260684Skaiw#endif
130260684Skaiw
131260684Skaiw#ifndef	STAILQ_FOREACH
132260684Skaiw#define	STAILQ_FOREACH(var, head, field)			\
133260684Skaiw	for ((var) = ((head)->stqh_first);			\
134260684Skaiw		(var);						\
135260684Skaiw		(var) = ((var)->field.stqe_next))
136260684Skaiw#endif
137260684Skaiw
138260684Skaiw#ifndef	STAILQ_FOREACH_SAFE
139260684Skaiw#define STAILQ_FOREACH_SAFE(var, head, field, tvar)		\
140260684Skaiw       for ((var) = STAILQ_FIRST((head));			\
141260684Skaiw	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);	\
142260684Skaiw	    (var) = (tvar))
143260684Skaiw#endif
144260684Skaiw
145260684Skaiw#ifndef	STAILQ_INIT
146260684Skaiw#define	STAILQ_INIT(head) do {					\
147260684Skaiw	(head)->stqh_first = NULL;				\
148260684Skaiw	(head)->stqh_last = &(head)->stqh_first;		\
149260684Skaiw} while (/*CONSTCOND*/0)
150260684Skaiw#endif
151260684Skaiw
152260684Skaiw#ifndef	STAILQ_INSERT_HEAD
153260684Skaiw#define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
154260684Skaiw	if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)	\
155260684Skaiw		(head)->stqh_last = &(elm)->field.stqe_next;		\
156260684Skaiw	(head)->stqh_first = (elm);					\
157260684Skaiw} while (/*CONSTCOND*/0)
158260684Skaiw#endif
159260684Skaiw
160260684Skaiw#ifndef	STAILQ_INSERT_TAIL
161260684Skaiw#define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
162260684Skaiw	(elm)->field.stqe_next = NULL;					\
163260684Skaiw	*(head)->stqh_last = (elm);					\
164260684Skaiw	(head)->stqh_last = &(elm)->field.stqe_next;			\
165260684Skaiw} while (/*CONSTCOND*/0)
166260684Skaiw#endif
167260684Skaiw
168260684Skaiw#ifndef	STAILQ_INSERT_AFTER
169260684Skaiw#define	STAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
170260684Skaiw	if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
171260684Skaiw		(head)->stqh_last = &(elm)->field.stqe_next;		\
172260684Skaiw	(listelm)->field.stqe_next = (elm);				\
173260684Skaiw} while (/*CONSTCOND*/0)
174260684Skaiw#endif
175260684Skaiw
176260684Skaiw#ifndef	STAILQ_LAST
177260684Skaiw#define STAILQ_LAST(head, type, field)					\
178260684Skaiw	(STAILQ_EMPTY((head)) ?					\
179260684Skaiw	    NULL : ((struct type *)(void *)				\
180260684Skaiw	    ((char *)((head)->stqh_last) - offsetof(struct type, field))))
181260684Skaiw#endif
182260684Skaiw
183260684Skaiw#ifndef	STAILQ_NEXT
184260684Skaiw#define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
185260684Skaiw#endif
186260684Skaiw
187260684Skaiw#ifndef	STAILQ_REMOVE
188260684Skaiw#define	STAILQ_REMOVE(head, elm, type, field) do {			\
189260684Skaiw	if ((head)->stqh_first == (elm)) {				\
190260684Skaiw		STAILQ_REMOVE_HEAD((head), field);			\
191260684Skaiw	} else {							\
192260684Skaiw		struct type *curelm = (head)->stqh_first;		\
193260684Skaiw		while (curelm->field.stqe_next != (elm))		\
194260684Skaiw			curelm = curelm->field.stqe_next;		\
195260684Skaiw		if ((curelm->field.stqe_next =				\
196260684Skaiw			curelm->field.stqe_next->field.stqe_next) == NULL) \
197260684Skaiw			    (head)->stqh_last = &(curelm)->field.stqe_next; \
198260684Skaiw	}								\
199260684Skaiw} while (/*CONSTCOND*/0)
200260684Skaiw#endif
201260684Skaiw
202260684Skaiw#ifndef	STAILQ_REMOVE_HEAD
203260684Skaiw#define	STAILQ_REMOVE_HEAD(head, field) do {				\
204260684Skaiw	if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == \
205260684Skaiw	    NULL)							\
206260684Skaiw		(head)->stqh_last = &(head)->stqh_first;		\
207260684Skaiw} while (/*CONSTCOND*/0)
208260684Skaiw#endif
209260684Skaiw
210260684Skaiw/*
211260684Skaiw * The STAILQ_SORT macro is adapted from Simon Tatham's O(n*log(n))
212260684Skaiw * mergesort algorithm.
213260684Skaiw */
214260684Skaiw#ifndef	STAILQ_SORT
215260684Skaiw#define	STAILQ_SORT(head, type, field, cmp) do {			\
216260684Skaiw	STAILQ_HEAD(, type) _la, _lb;					\
217260684Skaiw	struct type *_p, *_q, *_e;					\
218260684Skaiw	int _i, _sz, _nmerges, _psz, _qsz;				\
219260684Skaiw									\
220260684Skaiw	_sz = 1;							\
221260684Skaiw	do {								\
222260684Skaiw		_nmerges = 0;						\
223260684Skaiw		STAILQ_INIT(&_lb);					\
224260684Skaiw		while (!STAILQ_EMPTY((head))) {				\
225260684Skaiw			_nmerges++;					\
226260684Skaiw			STAILQ_INIT(&_la);				\
227260684Skaiw			_psz = 0;					\
228260684Skaiw			for (_i = 0; _i < _sz && !STAILQ_EMPTY((head));	\
229260684Skaiw			     _i++) {					\
230260684Skaiw				_e = STAILQ_FIRST((head));		\
231260684Skaiw				if (_e == NULL)				\
232260684Skaiw					break;				\
233260684Skaiw				_psz++;					\
234260684Skaiw				STAILQ_REMOVE_HEAD((head), field);	\
235260684Skaiw				STAILQ_INSERT_TAIL(&_la, _e, field);	\
236260684Skaiw			}						\
237260684Skaiw			_p = STAILQ_FIRST(&_la);			\
238260684Skaiw			_qsz = _sz;					\
239260684Skaiw			_q = STAILQ_FIRST((head));			\
240260684Skaiw			while (_psz > 0 || (_qsz > 0 && _q != NULL)) {	\
241260684Skaiw				if (_psz == 0) {			\
242260684Skaiw					_e = _q;			\
243260684Skaiw					_q = STAILQ_NEXT(_q, field);	\
244260684Skaiw					STAILQ_REMOVE_HEAD((head),	\
245260684Skaiw					    field);			\
246260684Skaiw					_qsz--;				\
247260684Skaiw				} else if (_qsz == 0 || _q == NULL) {	\
248260684Skaiw					_e = _p;			\
249260684Skaiw					_p = STAILQ_NEXT(_p, field);	\
250260684Skaiw					STAILQ_REMOVE_HEAD(&_la, field);\
251260684Skaiw					_psz--;				\
252260684Skaiw				} else if (cmp(_p, _q) <= 0) {		\
253260684Skaiw					_e = _p;			\
254260684Skaiw					_p = STAILQ_NEXT(_p, field);	\
255260684Skaiw					STAILQ_REMOVE_HEAD(&_la, field);\
256260684Skaiw					_psz--;				\
257260684Skaiw				} else {				\
258260684Skaiw					_e = _q;			\
259260684Skaiw					_q = STAILQ_NEXT(_q, field);	\
260260684Skaiw					STAILQ_REMOVE_HEAD((head),	\
261260684Skaiw					    field);			\
262260684Skaiw					_qsz--;				\
263260684Skaiw				}					\
264260684Skaiw				STAILQ_INSERT_TAIL(&_lb, _e, field);	\
265260684Skaiw			}						\
266260684Skaiw		}							\
267260684Skaiw		(head)->stqh_first = _lb.stqh_first;			\
268260684Skaiw		(head)->stqh_last = _lb.stqh_last;			\
269260684Skaiw		_sz *= 2;						\
270260684Skaiw	} while (_nmerges > 1);						\
271260684Skaiw} while (/*CONSTCOND*/0)
272260684Skaiw#endif
273260684Skaiw
274260684Skaiw#ifndef	TAILQ_FOREACH_SAFE
275260684Skaiw#define TAILQ_FOREACH_SAFE(var, head, field, tvar)                      \
276260684Skaiw	for ((var) = TAILQ_FIRST((head));                               \
277260684Skaiw	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);            \
278260684Skaiw	    (var) = (tvar))
279260684Skaiw#endif
280260684Skaiw
281260684Skaiw/* ]] --QUEUE-MACROS-- */
282260684Skaiw
283260684Skaiw/*
284260684Skaiw * VCS Ids.
285260684Skaiw */
286260684Skaiw
287260684Skaiw#ifndef	ELFTC_VCSID
288260684Skaiw
289260684Skaiw#if defined(__DragonFly__)
290260684Skaiw#define	ELFTC_VCSID(ID)		__RCSID(ID)
291260684Skaiw#endif
292260684Skaiw
293260684Skaiw#if defined(__FreeBSD__)
294260684Skaiw#define	ELFTC_VCSID(ID)		__FBSDID(ID)
295260684Skaiw#endif
296260684Skaiw
297280932Semaste#if defined(__APPLE__) || defined(__GLIBC__) || defined(__GNU__) || \
298280932Semaste    defined(__linux__)
299260684Skaiw#if defined(__GNUC__)
300260684Skaiw#define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
301260684Skaiw#else
302260684Skaiw#define	ELFTC_VCSID(ID)		/**/
303260684Skaiw#endif
304260684Skaiw#endif
305260684Skaiw
306260684Skaiw#if defined(__minix)
307260684Skaiw#if defined(__GNUC__)
308260684Skaiw#define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
309260684Skaiw#else
310260684Skaiw#define	ELFTC_VCSID(ID)		/**/
311260684Skaiw#endif	/* __GNU__ */
312260684Skaiw#endif
313260684Skaiw
314260684Skaiw#if defined(__NetBSD__)
315260684Skaiw#define	ELFTC_VCSID(ID)		__RCSID(ID)
316260684Skaiw#endif
317260684Skaiw
318260684Skaiw#if defined(__OpenBSD__)
319260684Skaiw#if defined(__GNUC__)
320260684Skaiw#define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
321260684Skaiw#else
322260684Skaiw#define	ELFTC_VCSID(ID)		/**/
323260684Skaiw#endif	/* __GNUC__ */
324260684Skaiw#endif
325260684Skaiw
326260684Skaiw#endif	/* ELFTC_VCSID */
327260684Skaiw
328260684Skaiw/*
329260684Skaiw * Provide an equivalent for getprogname(3).
330260684Skaiw */
331260684Skaiw
332260684Skaiw#ifndef	ELFTC_GETPROGNAME
333260684Skaiw
334280932Semaste#if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
335280932Semaste    defined(__minix) || defined(__NetBSD__)
336260684Skaiw
337260684Skaiw#include <stdlib.h>
338260684Skaiw
339260684Skaiw#define	ELFTC_GETPROGNAME()	getprogname()
340260684Skaiw
341260684Skaiw#endif	/* __DragonFly__ || __FreeBSD__ || __minix || __NetBSD__ */
342260684Skaiw
343260684Skaiw
344280932Semaste#if defined(__GLIBC__) || defined(__linux__)
345283616Semaste#ifndef _GNU_SOURCE
346260684Skaiw/*
347260684Skaiw * GLIBC based systems have a global 'char *' pointer referencing
348260684Skaiw * the executable's name.
349260684Skaiw */
350260684Skaiwextern const char *program_invocation_short_name;
351283616Semaste#endif	/* !_GNU_SOURCE */
352260684Skaiw
353260684Skaiw#define	ELFTC_GETPROGNAME()	program_invocation_short_name
354260684Skaiw
355280932Semaste#endif	/* __GLIBC__ || __linux__ */
356260684Skaiw
357260684Skaiw
358260684Skaiw#if defined(__OpenBSD__)
359260684Skaiw
360260684Skaiwextern const char *__progname;
361260684Skaiw
362260684Skaiw#define	ELFTC_GETPROGNAME()	__progname
363260684Skaiw
364260684Skaiw#endif	/* __OpenBSD__ */
365260684Skaiw
366260684Skaiw#endif	/* ELFTC_GETPROGNAME */
367260684Skaiw
368260684Skaiw
369260684Skaiw/**
370260684Skaiw ** Per-OS configuration.
371260684Skaiw **/
372260684Skaiw
373280932Semaste#if defined(__APPLE__)
374280932Semaste
375289071Semaste#include <libkern/OSByteOrder.h>
376289071Semaste#define	htobe32(x)	OSSwapHostToBigInt32(x)
377367466Sdim#define	htole32(x)	OSSwapHostToLittleInt32(x)
378367466Sdim#ifndef roundup2
379280932Semaste#define	roundup2	roundup
380367466Sdim#endif
381280932Semaste
382367466Sdim#define	ELFTC_BYTE_ORDER			__DARWIN_BYTE_ORDER
383367466Sdim#define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		__DARWIN_LITTLE_ENDIAN
384367466Sdim#define	ELFTC_BYTE_ORDER_BIG_ENDIAN		__DARWIN_BIG_ENDIAN
385280932Semaste
386280932Semaste#define	ELFTC_HAVE_MMAP				1
387280932Semaste#define	ELFTC_HAVE_STRMODE			1
388280932Semaste
389289071Semaste#define ELFTC_NEED_BYTEORDER_EXTENSIONS		1
390280932Semaste#endif /* __APPLE__ */
391280932Semaste
392280932Semaste
393260684Skaiw#if defined(__DragonFly__)
394260684Skaiw
395260684Skaiw#include <osreldate.h>
396260684Skaiw#include <sys/endian.h>
397260684Skaiw
398260684Skaiw#define	ELFTC_BYTE_ORDER			_BYTE_ORDER
399260684Skaiw#define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
400260684Skaiw#define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
401260684Skaiw
402260684Skaiw#define	ELFTC_HAVE_MMAP				1
403260684Skaiw
404260684Skaiw#endif
405260684Skaiw
406280932Semaste#if defined(__GLIBC__) || defined(__linux__)
407260684Skaiw
408260684Skaiw#include <endian.h>
409260684Skaiw
410260684Skaiw#define	ELFTC_BYTE_ORDER			__BYTE_ORDER
411260684Skaiw#define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		__LITTLE_ENDIAN
412260684Skaiw#define	ELFTC_BYTE_ORDER_BIG_ENDIAN		__BIG_ENDIAN
413260684Skaiw
414260684Skaiw#define	ELFTC_HAVE_MMAP				1
415260684Skaiw
416260684Skaiw/*
417260684Skaiw * Debian GNU/Linux and Debian GNU/kFreeBSD do not have strmode(3).
418260684Skaiw */
419260684Skaiw#define	ELFTC_HAVE_STRMODE			0
420260684Skaiw
421260684Skaiw/* Whether we need to supply {be,le}32dec. */
422260684Skaiw#define ELFTC_NEED_BYTEORDER_EXTENSIONS		1
423260684Skaiw
424367466Sdim#ifndef roundup2
425260684Skaiw#define	roundup2	roundup
426367466Sdim#endif
427260684Skaiw
428280932Semaste#endif	/* __GLIBC__ || __linux__ */
429260684Skaiw
430260684Skaiw
431260684Skaiw#if defined(__FreeBSD__)
432260684Skaiw
433260684Skaiw#include <osreldate.h>
434260684Skaiw#include <sys/endian.h>
435260684Skaiw
436260684Skaiw#define	ELFTC_BYTE_ORDER			_BYTE_ORDER
437260684Skaiw#define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
438260684Skaiw#define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
439260684Skaiw
440260684Skaiw#define	ELFTC_HAVE_MMAP				1
441260684Skaiw#define	ELFTC_HAVE_STRMODE			1
442260684Skaiw#if __FreeBSD_version <= 900000
443260684Skaiw#define	ELFTC_BROKEN_YY_NO_INPUT		1
444260684Skaiw#endif
445260684Skaiw#endif	/* __FreeBSD__ */
446260684Skaiw
447260684Skaiw
448260684Skaiw#if defined(__minix)
449260684Skaiw#define	ELFTC_HAVE_MMAP				0
450260684Skaiw#endif	/* __minix */
451260684Skaiw
452260684Skaiw
453260684Skaiw#if defined(__NetBSD__)
454260684Skaiw
455260684Skaiw#include <sys/param.h>
456260684Skaiw#include <sys/endian.h>
457260684Skaiw
458260684Skaiw#define	ELFTC_BYTE_ORDER			_BYTE_ORDER
459260684Skaiw#define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
460260684Skaiw#define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
461260684Skaiw
462260684Skaiw#define	ELFTC_HAVE_MMAP				1
463260684Skaiw#define	ELFTC_HAVE_STRMODE			1
464260684Skaiw#if __NetBSD_Version__ <= 599002100
465260684Skaiw/* from src/doc/CHANGES: flex(1): Import flex-2.5.35 [christos 20091025] */
466260684Skaiw/* and 5.99.21 was from Wed Oct 21 21:28:36 2009 UTC */
467260684Skaiw#  define ELFTC_BROKEN_YY_NO_INPUT		1
468260684Skaiw#endif
469260684Skaiw#endif	/* __NetBSD __ */
470260684Skaiw
471260684Skaiw
472260684Skaiw#if defined(__OpenBSD__)
473260684Skaiw
474260684Skaiw#include <sys/param.h>
475260684Skaiw#include <sys/endian.h>
476260684Skaiw
477260684Skaiw#define	ELFTC_BYTE_ORDER			_BYTE_ORDER
478260684Skaiw#define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
479260684Skaiw#define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
480260684Skaiw
481260684Skaiw#define	ELFTC_HAVE_MMAP				1
482260684Skaiw#define	ELFTC_HAVE_STRMODE			1
483260684Skaiw
484260684Skaiw#define	ELFTC_NEED_BYTEORDER_EXTENSIONS		1
485260684Skaiw#define	roundup2	roundup
486260684Skaiw
487260684Skaiw#endif	/* __OpenBSD__ */
488260684Skaiw
489260684Skaiw#endif	/* _ELFTC_H */
490