blob: 3b369ca133418ad334086dcb087e408d6185c45b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
/*
* Copyright 2005-2007 Gentoo Foundation
* Distributed under the terms of the GNU General Public License v2
* $Header: /var/cvsroot/gentoo-projects/pax-utils/porting.h,v 1.31 2007/05/23 22:27:27 solar Exp $
*
* Copyright 2005-2007 Ned Ludd - <solar@gentoo.org>
* Copyright 2005-2007 Mike Frysinger - <vapier@gentoo.org>
*
* Make sure all of the common elf stuff is setup as we expect
*/
#ifndef _PORTING_H
#define _PORTING_H
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*arr))
#undef __PAX_UTILS_CLEANUP
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <limits.h>
#include <fcntl.h>
#include <assert.h>
#include <getopt.h>
#include <libgen.h>
#include <ctype.h>
#include <pwd.h>
#include <fnmatch.h>
#include <regex.h>
#include <sys/mman.h>
#include "elf.h"
#if defined(__linux__)
# include <endian.h>
# include <byteswap.h>
#elif defined(__FreeBSD__)
# include <sys/endian.h>
#elif defined(__sun__)
# include <sys/isa_defs.h>
#elif defined(__MACH__)
# include <machine/endian.h>
#endif
#if defined(__GLIBC__) || defined(__UCLIBC__)
# include <glob.h>
#endif
#if defined(__GLIBC__) || defined(__UCLIBC__) || defined(__NetBSD__)
# define __PAX_UTILS_DEFAULT_LD_CACHE_CONFIG "/etc/ld.so.conf"
#elif defined(__FreeBSD__) || defined(__DragonFly__)
# include <elf-hints.h>
# define __PAX_UTILS_DEFAULT_LD_CACHE_CONFIG _PATH_ELF_HINTS
#else
# define __PAX_UTILS_DEFAULT_LD_CACHE_CONFIG ""
#endif
/* bounds checking code will fart on free(NULL) even though that
* is valid usage. So let's wrap it if need be.
*/
#ifdef __BOUNDS_CHECKING_ON
# define free(ptr) do { if (ptr) free(ptr); } while (0)
# define __PAX_UTILS_CLEANUP
#endif
#if !defined(bswap_16)
# if defined(bswap16)
# define bswap_16 bswap16
# define bswap_32 bswap32
# define bswap_64 bswap64
# else
# define bswap_16(x) \
((((x) & 0xff00) >> 8) | \
(((x) & 0x00ff) << 8))
# define bswap_32(x) \
((((x) & 0xff000000) >> 24) | \
(((x) & 0x00ff0000) >> 8) | \
(((x) & 0x0000ff00) << 8) | \
(((x) & 0x000000ff) << 24))
# if defined(__GNUC__)
# define bswap_64(x) \
((((x) & 0xff00000000000000ull) >> 56) | \
(((x) & 0x00ff000000000000ull) >> 40) | \
(((x) & 0x0000ff0000000000ull) >> 24) | \
(((x) & 0x000000ff00000000ull) >> 8) | \
(((x) & 0x00000000ff000000ull) << 8) | \
(((x) & 0x0000000000ff0000ull) << 24) | \
(((x) & 0x000000000000ff00ull) << 40) | \
(((x) & 0x00000000000000ffull) << 56))
# else
# define bswap_64(x) \
((((x) & 0xff00000000000000) >> 56) | \
(((x) & 0x00ff000000000000) >> 40) | \
(((x) & 0x0000ff0000000000) >> 24) | \
(((x) & 0x000000ff00000000) >> 8) | \
(((x) & 0x00000000ff000000) << 8) | \
(((x) & 0x0000000000ff0000) << 24) | \
(((x) & 0x000000000000ff00) << 40) | \
(((x) & 0x00000000000000ff) << 56))
# endif
# endif
#endif
#if !defined(_POSIX_PATH_MAX) && !defined(PATH_MAX)
# define __PAX_UTILS_PATH_MAX 8192
#elif _POSIX_PATH_MAX > PATH_MAX
# define __PAX_UTILS_PATH_MAX _POSIX_PATH_MAX
#else
# define __PAX_UTILS_PATH_MAX PATH_MAX
#endif
/* fall back case for non-Linux hosts ... so lame */
#if !defined(ELF_DATA)
# if defined(BYTE_ORDER)
# if BYTE_ORDER == LITTLE_ENDIAN
# define ELF_DATA ELFDATA2LSB
# elif BYTE_ORDER == BIG_ENDIAN
# define ELF_DATA ELFDATA2MSB
# else
# error "BYTE_ORDER: you fail"
# endif
# elif defined(__BYTE_ORDER)
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define ELF_DATA ELFDATA2LSB
# elif __BYTE_ORDER == __BIG_ENDIAN
# define ELF_DATA ELFDATA2BSB
# else
# error "__BYTE_ORDER: you fail"
# endif
# elif defined(WORDS_LITTLENDIAN)
# define ELF_DATA ELFDATA2LSB
# elif defined(WORDS_BIGENDIAN)
# define ELF_DATA ELFDATA2MSB
# elif defined(_LITTLE_ENDIAN)
# define ELF_DATA ELFDATA2LSB
# elif defined(_BIG_ENDIAN)
# define ELF_DATA ELFDATA2MSB
# else
# error "no idea what the native byte order is"
# endif
#endif
/*
* in case we are not defined by proper/up-to-date system headers,
* we check for a whole lot of things and copy them from elf.h.
*/
#ifndef PT_GNU_STACK
# define PT_GNU_STACK 0x6474e551
#endif
/* not in <=binutils-2.14.90.0.8 (should come in by way of .9) */
#ifndef PT_GNU_RELRO
# define PT_GNU_RELRO 0x6474e552
#endif
/*
* propably will never be official added to the toolchain.
* But none the less we should try to get 0x65041580 reserved
*/
#ifndef PT_PAX_FLAGS
# define PT_PAX_FLAGS 0x65041580
# define PF_PAGEEXEC (1 << 4) /* Enable PAGEEXEC */
# define PF_NOPAGEEXEC (1 << 5) /* Disable PAGEEXEC */
# define PF_SEGMEXEC (1 << 6) /* Enable SEGMEXEC */
# define PF_NOSEGMEXEC (1 << 7) /* Disable SEGMEXEC */
# define PF_MPROTECT (1 << 8) /* Enable MPROTECT */
# define PF_NOMPROTECT (1 << 9) /* Disable MPROTECT */
# define PF_RANDEXEC (1 << 10) /* Enable RANDEXEC */
# define PF_NORANDEXEC (1 << 11) /* Disable RANDEXEC */
# define PF_EMUTRAMP (1 << 12) /* Enable EMUTRAMP */
# define PF_NOEMUTRAMP (1 << 13) /* Disable EMUTRAMP */
# define PF_RANDMMAP (1 << 14) /* Enable RANDMMAP */
# define PF_NORANDMMAP (1 << 15) /* Disable RANDMMAP */
#endif /* PT_PAX_ */
/* older glibc/uclibc will need this since they typo-ed the define */
#ifndef EM_ST19
# ifdef EM_AT19
# define EM_ST19 EM_AT19
# else
# define EM_ST19 74
# endif
#endif
#endif /* _PORTING_H */
|