1*7304104dSAndroid Build Coastguard Worker /* Error handling in libelf.
2*7304104dSAndroid Build Coastguard Worker Copyright (C) 1998-2010, 2015 Red Hat, Inc.
3*7304104dSAndroid Build Coastguard Worker This file is part of elfutils.
4*7304104dSAndroid Build Coastguard Worker Written by Ulrich Drepper <[email protected]>, 1998.
5*7304104dSAndroid Build Coastguard Worker
6*7304104dSAndroid Build Coastguard Worker This file is free software; you can redistribute it and/or modify
7*7304104dSAndroid Build Coastguard Worker it under the terms of either
8*7304104dSAndroid Build Coastguard Worker
9*7304104dSAndroid Build Coastguard Worker * the GNU Lesser General Public License as published by the Free
10*7304104dSAndroid Build Coastguard Worker Software Foundation; either version 3 of the License, or (at
11*7304104dSAndroid Build Coastguard Worker your option) any later version
12*7304104dSAndroid Build Coastguard Worker
13*7304104dSAndroid Build Coastguard Worker or
14*7304104dSAndroid Build Coastguard Worker
15*7304104dSAndroid Build Coastguard Worker * the GNU General Public License as published by the Free
16*7304104dSAndroid Build Coastguard Worker Software Foundation; either version 2 of the License, or (at
17*7304104dSAndroid Build Coastguard Worker your option) any later version
18*7304104dSAndroid Build Coastguard Worker
19*7304104dSAndroid Build Coastguard Worker or both in parallel, as here.
20*7304104dSAndroid Build Coastguard Worker
21*7304104dSAndroid Build Coastguard Worker elfutils is distributed in the hope that it will be useful, but
22*7304104dSAndroid Build Coastguard Worker WITHOUT ANY WARRANTY; without even the implied warranty of
23*7304104dSAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24*7304104dSAndroid Build Coastguard Worker General Public License for more details.
25*7304104dSAndroid Build Coastguard Worker
26*7304104dSAndroid Build Coastguard Worker You should have received copies of the GNU General Public License and
27*7304104dSAndroid Build Coastguard Worker the GNU Lesser General Public License along with this program. If
28*7304104dSAndroid Build Coastguard Worker not, see <http://www.gnu.org/licenses/>. */
29*7304104dSAndroid Build Coastguard Worker
30*7304104dSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
31*7304104dSAndroid Build Coastguard Worker # include <config.h>
32*7304104dSAndroid Build Coastguard Worker #endif
33*7304104dSAndroid Build Coastguard Worker
34*7304104dSAndroid Build Coastguard Worker #include <assert.h>
35*7304104dSAndroid Build Coastguard Worker #include <stdbool.h>
36*7304104dSAndroid Build Coastguard Worker #include <stdint.h>
37*7304104dSAndroid Build Coastguard Worker #include <stdlib.h>
38*7304104dSAndroid Build Coastguard Worker
39*7304104dSAndroid Build Coastguard Worker #include "libelfP.h"
40*7304104dSAndroid Build Coastguard Worker
41*7304104dSAndroid Build Coastguard Worker
42*7304104dSAndroid Build Coastguard Worker /* The error number. */
43*7304104dSAndroid Build Coastguard Worker static __thread int global_error;
44*7304104dSAndroid Build Coastguard Worker
45*7304104dSAndroid Build Coastguard Worker
46*7304104dSAndroid Build Coastguard Worker int
elf_errno(void)47*7304104dSAndroid Build Coastguard Worker elf_errno (void)
48*7304104dSAndroid Build Coastguard Worker {
49*7304104dSAndroid Build Coastguard Worker int result = global_error;
50*7304104dSAndroid Build Coastguard Worker global_error = ELF_E_NOERROR;
51*7304104dSAndroid Build Coastguard Worker return result;
52*7304104dSAndroid Build Coastguard Worker }
53*7304104dSAndroid Build Coastguard Worker
54*7304104dSAndroid Build Coastguard Worker
55*7304104dSAndroid Build Coastguard Worker /* Return the appropriate message for the error. */
56*7304104dSAndroid Build Coastguard Worker static const char msgstr[] =
57*7304104dSAndroid Build Coastguard Worker {
58*7304104dSAndroid Build Coastguard Worker #define ELF_E_NOERROR_IDX 0
59*7304104dSAndroid Build Coastguard Worker N_("no error")
60*7304104dSAndroid Build Coastguard Worker "\0"
61*7304104dSAndroid Build Coastguard Worker #define ELF_E_UNKNOWN_ERROR_IDX (ELF_E_NOERROR_IDX + sizeof "no error")
62*7304104dSAndroid Build Coastguard Worker N_("unknown error")
63*7304104dSAndroid Build Coastguard Worker "\0"
64*7304104dSAndroid Build Coastguard Worker #define ELF_E_UNKNOWN_VERSION_IDX \
65*7304104dSAndroid Build Coastguard Worker (ELF_E_UNKNOWN_ERROR_IDX + sizeof "unknown error")
66*7304104dSAndroid Build Coastguard Worker N_("unknown version")
67*7304104dSAndroid Build Coastguard Worker "\0"
68*7304104dSAndroid Build Coastguard Worker #define ELF_E_UNKNOWN_TYPE_IDX \
69*7304104dSAndroid Build Coastguard Worker (ELF_E_UNKNOWN_VERSION_IDX + sizeof "unknown version")
70*7304104dSAndroid Build Coastguard Worker N_("unknown type")
71*7304104dSAndroid Build Coastguard Worker "\0"
72*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_HANDLE_IDX \
73*7304104dSAndroid Build Coastguard Worker (ELF_E_UNKNOWN_TYPE_IDX + sizeof "unknown type")
74*7304104dSAndroid Build Coastguard Worker N_("invalid `Elf' handle")
75*7304104dSAndroid Build Coastguard Worker "\0"
76*7304104dSAndroid Build Coastguard Worker #define ELF_E_SOURCE_SIZE_IDX \
77*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_HANDLE_IDX + sizeof "invalid `Elf' handle")
78*7304104dSAndroid Build Coastguard Worker N_("invalid size of source operand")
79*7304104dSAndroid Build Coastguard Worker "\0"
80*7304104dSAndroid Build Coastguard Worker #define ELF_E_DEST_SIZE_IDX \
81*7304104dSAndroid Build Coastguard Worker (ELF_E_SOURCE_SIZE_IDX + sizeof "invalid size of source operand")
82*7304104dSAndroid Build Coastguard Worker N_("invalid size of destination operand")
83*7304104dSAndroid Build Coastguard Worker "\0"
84*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_ENCODING_IDX \
85*7304104dSAndroid Build Coastguard Worker (ELF_E_DEST_SIZE_IDX + sizeof "invalid size of destination operand")
86*7304104dSAndroid Build Coastguard Worker N_("invalid encoding")
87*7304104dSAndroid Build Coastguard Worker "\0"
88*7304104dSAndroid Build Coastguard Worker #define ELF_E_NOMEM_IDX \
89*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_ENCODING_IDX + sizeof "invalid encoding")
90*7304104dSAndroid Build Coastguard Worker N_("out of memory")
91*7304104dSAndroid Build Coastguard Worker "\0"
92*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_FILE_IDX \
93*7304104dSAndroid Build Coastguard Worker (ELF_E_NOMEM_IDX + sizeof "out of memory")
94*7304104dSAndroid Build Coastguard Worker N_("invalid file descriptor")
95*7304104dSAndroid Build Coastguard Worker "\0"
96*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_ELF_IDX \
97*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_FILE_IDX + sizeof "invalid file descriptor")
98*7304104dSAndroid Build Coastguard Worker N_("invalid ELF file data")
99*7304104dSAndroid Build Coastguard Worker "\0"
100*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_OP_IDX \
101*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_ELF_IDX + sizeof "invalid ELF file data")
102*7304104dSAndroid Build Coastguard Worker N_("invalid operation")
103*7304104dSAndroid Build Coastguard Worker "\0"
104*7304104dSAndroid Build Coastguard Worker #define ELF_E_NO_VERSION_IDX \
105*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_OP_IDX + sizeof "invalid operation")
106*7304104dSAndroid Build Coastguard Worker N_("ELF version not set")
107*7304104dSAndroid Build Coastguard Worker "\0"
108*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_CMD_IDX \
109*7304104dSAndroid Build Coastguard Worker (ELF_E_NO_VERSION_IDX + sizeof "ELF version not set")
110*7304104dSAndroid Build Coastguard Worker N_("invalid command")
111*7304104dSAndroid Build Coastguard Worker "\0"
112*7304104dSAndroid Build Coastguard Worker #define ELF_E_RANGE_IDX \
113*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_CMD_IDX + sizeof "invalid command")
114*7304104dSAndroid Build Coastguard Worker N_("offset out of range")
115*7304104dSAndroid Build Coastguard Worker "\0"
116*7304104dSAndroid Build Coastguard Worker #define ELF_E_ARCHIVE_FMAG_IDX \
117*7304104dSAndroid Build Coastguard Worker (ELF_E_RANGE_IDX + sizeof "offset out of range")
118*7304104dSAndroid Build Coastguard Worker N_("invalid fmag field in archive header")
119*7304104dSAndroid Build Coastguard Worker "\0"
120*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_ARCHIVE_IDX \
121*7304104dSAndroid Build Coastguard Worker (ELF_E_ARCHIVE_FMAG_IDX + sizeof "invalid fmag field in archive header")
122*7304104dSAndroid Build Coastguard Worker N_("invalid archive file")
123*7304104dSAndroid Build Coastguard Worker "\0"
124*7304104dSAndroid Build Coastguard Worker #define ELF_E_NO_ARCHIVE_IDX \
125*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_ARCHIVE_IDX + sizeof "invalid archive file")
126*7304104dSAndroid Build Coastguard Worker N_("descriptor is not for an archive")
127*7304104dSAndroid Build Coastguard Worker "\0"
128*7304104dSAndroid Build Coastguard Worker #define ELF_E_NO_INDEX_IDX \
129*7304104dSAndroid Build Coastguard Worker (ELF_E_NO_ARCHIVE_IDX + sizeof "descriptor is not for an archive")
130*7304104dSAndroid Build Coastguard Worker N_("no index available")
131*7304104dSAndroid Build Coastguard Worker "\0"
132*7304104dSAndroid Build Coastguard Worker #define ELF_E_READ_ERROR_IDX \
133*7304104dSAndroid Build Coastguard Worker (ELF_E_NO_INDEX_IDX + sizeof "no index available")
134*7304104dSAndroid Build Coastguard Worker N_("cannot read data from file")
135*7304104dSAndroid Build Coastguard Worker "\0"
136*7304104dSAndroid Build Coastguard Worker #define ELF_E_WRITE_ERROR_IDX \
137*7304104dSAndroid Build Coastguard Worker (ELF_E_READ_ERROR_IDX + sizeof "cannot read data from file")
138*7304104dSAndroid Build Coastguard Worker N_("cannot write data to file")
139*7304104dSAndroid Build Coastguard Worker "\0"
140*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_CLASS_IDX \
141*7304104dSAndroid Build Coastguard Worker (ELF_E_WRITE_ERROR_IDX + sizeof "cannot write data to file")
142*7304104dSAndroid Build Coastguard Worker N_("invalid binary class")
143*7304104dSAndroid Build Coastguard Worker "\0"
144*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_INDEX_IDX \
145*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_CLASS_IDX + sizeof "invalid binary class")
146*7304104dSAndroid Build Coastguard Worker N_("invalid section index")
147*7304104dSAndroid Build Coastguard Worker "\0"
148*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_OPERAND_IDX \
149*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_INDEX_IDX + sizeof "invalid section index")
150*7304104dSAndroid Build Coastguard Worker N_("invalid operand")
151*7304104dSAndroid Build Coastguard Worker "\0"
152*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_SECTION_IDX \
153*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_OPERAND_IDX + sizeof "invalid operand")
154*7304104dSAndroid Build Coastguard Worker N_("invalid section")
155*7304104dSAndroid Build Coastguard Worker "\0"
156*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_COMMAND_IDX \
157*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_SECTION_IDX + sizeof "invalid section")
158*7304104dSAndroid Build Coastguard Worker N_("invalid command")
159*7304104dSAndroid Build Coastguard Worker "\0"
160*7304104dSAndroid Build Coastguard Worker #define ELF_E_WRONG_ORDER_EHDR_IDX \
161*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_COMMAND_IDX + sizeof "invalid command")
162*7304104dSAndroid Build Coastguard Worker N_("executable header not created first")
163*7304104dSAndroid Build Coastguard Worker "\0"
164*7304104dSAndroid Build Coastguard Worker #define ELF_E_FD_DISABLED_IDX \
165*7304104dSAndroid Build Coastguard Worker (ELF_E_WRONG_ORDER_EHDR_IDX + sizeof "executable header not created first")
166*7304104dSAndroid Build Coastguard Worker N_("file descriptor disabled")
167*7304104dSAndroid Build Coastguard Worker "\0"
168*7304104dSAndroid Build Coastguard Worker #define ELF_E_FD_MISMATCH_IDX \
169*7304104dSAndroid Build Coastguard Worker (ELF_E_FD_DISABLED_IDX + sizeof "file descriptor disabled")
170*7304104dSAndroid Build Coastguard Worker N_("archive/member file descriptor mismatch")
171*7304104dSAndroid Build Coastguard Worker "\0"
172*7304104dSAndroid Build Coastguard Worker #define ELF_E_OFFSET_RANGE_IDX \
173*7304104dSAndroid Build Coastguard Worker (ELF_E_FD_MISMATCH_IDX + sizeof "archive/member file descriptor mismatch")
174*7304104dSAndroid Build Coastguard Worker N_("offset out of range")
175*7304104dSAndroid Build Coastguard Worker "\0"
176*7304104dSAndroid Build Coastguard Worker #define ELF_E_NOT_NUL_SECTION_IDX \
177*7304104dSAndroid Build Coastguard Worker (ELF_E_OFFSET_RANGE_IDX + sizeof "offset out of range")
178*7304104dSAndroid Build Coastguard Worker N_("cannot manipulate null section")
179*7304104dSAndroid Build Coastguard Worker "\0"
180*7304104dSAndroid Build Coastguard Worker #define ELF_E_DATA_MISMATCH_IDX \
181*7304104dSAndroid Build Coastguard Worker (ELF_E_NOT_NUL_SECTION_IDX + sizeof "cannot manipulate null section")
182*7304104dSAndroid Build Coastguard Worker N_("data/scn mismatch")
183*7304104dSAndroid Build Coastguard Worker "\0"
184*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_SECTION_HEADER_IDX \
185*7304104dSAndroid Build Coastguard Worker (ELF_E_DATA_MISMATCH_IDX + sizeof "data/scn mismatch")
186*7304104dSAndroid Build Coastguard Worker N_("invalid section header")
187*7304104dSAndroid Build Coastguard Worker "\0"
188*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_DATA_IDX \
189*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_SECTION_HEADER_IDX + sizeof "invalid section header")
190*7304104dSAndroid Build Coastguard Worker N_("invalid data")
191*7304104dSAndroid Build Coastguard Worker "\0"
192*7304104dSAndroid Build Coastguard Worker #define ELF_E_DATA_ENCODING_IDX \
193*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_DATA_IDX + sizeof "invalid data")
194*7304104dSAndroid Build Coastguard Worker N_("unknown data encoding")
195*7304104dSAndroid Build Coastguard Worker "\0"
196*7304104dSAndroid Build Coastguard Worker #define ELF_E_SECTION_TOO_SMALL_IDX \
197*7304104dSAndroid Build Coastguard Worker (ELF_E_DATA_ENCODING_IDX + sizeof "unknown data encoding")
198*7304104dSAndroid Build Coastguard Worker N_("section `sh_size' too small for data")
199*7304104dSAndroid Build Coastguard Worker "\0"
200*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_ALIGN_IDX \
201*7304104dSAndroid Build Coastguard Worker (ELF_E_SECTION_TOO_SMALL_IDX + sizeof "section `sh_size' too small for data")
202*7304104dSAndroid Build Coastguard Worker N_("invalid section alignment")
203*7304104dSAndroid Build Coastguard Worker "\0"
204*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_SHENTSIZE_IDX \
205*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_ALIGN_IDX + sizeof "invalid section alignment")
206*7304104dSAndroid Build Coastguard Worker N_("invalid section entry size")
207*7304104dSAndroid Build Coastguard Worker "\0"
208*7304104dSAndroid Build Coastguard Worker #define ELF_E_UPDATE_RO_IDX \
209*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_SHENTSIZE_IDX + sizeof "invalid section entry size")
210*7304104dSAndroid Build Coastguard Worker N_("update() for write on read-only file")
211*7304104dSAndroid Build Coastguard Worker "\0"
212*7304104dSAndroid Build Coastguard Worker #define ELF_E_NOFILE_IDX \
213*7304104dSAndroid Build Coastguard Worker (ELF_E_UPDATE_RO_IDX + sizeof "update() for write on read-only file")
214*7304104dSAndroid Build Coastguard Worker N_("no such file")
215*7304104dSAndroid Build Coastguard Worker "\0"
216*7304104dSAndroid Build Coastguard Worker #define ELF_E_GROUP_NOT_REL_IDX \
217*7304104dSAndroid Build Coastguard Worker (ELF_E_NOFILE_IDX + sizeof "no such file")
218*7304104dSAndroid Build Coastguard Worker N_("only relocatable files can contain section groups")
219*7304104dSAndroid Build Coastguard Worker "\0"
220*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_PHDR_IDX \
221*7304104dSAndroid Build Coastguard Worker (ELF_E_GROUP_NOT_REL_IDX \
222*7304104dSAndroid Build Coastguard Worker + sizeof "only relocatable files can contain section groups")
223*7304104dSAndroid Build Coastguard Worker N_("program header only allowed in executables, shared objects, and \
224*7304104dSAndroid Build Coastguard Worker core files")
225*7304104dSAndroid Build Coastguard Worker "\0"
226*7304104dSAndroid Build Coastguard Worker #define ELF_E_NO_PHDR_IDX \
227*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_PHDR_IDX \
228*7304104dSAndroid Build Coastguard Worker + sizeof "program header only allowed in executables, shared objects, and \
229*7304104dSAndroid Build Coastguard Worker core files")
230*7304104dSAndroid Build Coastguard Worker N_("file has no program header")
231*7304104dSAndroid Build Coastguard Worker "\0"
232*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_OFFSET_IDX \
233*7304104dSAndroid Build Coastguard Worker (ELF_E_NO_PHDR_IDX \
234*7304104dSAndroid Build Coastguard Worker + sizeof "file has no program header")
235*7304104dSAndroid Build Coastguard Worker N_("invalid offset")
236*7304104dSAndroid Build Coastguard Worker "\0"
237*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_SECTION_TYPE_IDX \
238*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_OFFSET_IDX \
239*7304104dSAndroid Build Coastguard Worker + sizeof "invalid offset")
240*7304104dSAndroid Build Coastguard Worker N_("invalid section type")
241*7304104dSAndroid Build Coastguard Worker "\0"
242*7304104dSAndroid Build Coastguard Worker #define ELF_E_INVALID_SECTION_FLAGS_IDX \
243*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_SECTION_TYPE_IDX \
244*7304104dSAndroid Build Coastguard Worker + sizeof "invalid section type")
245*7304104dSAndroid Build Coastguard Worker N_("invalid section flags")
246*7304104dSAndroid Build Coastguard Worker "\0"
247*7304104dSAndroid Build Coastguard Worker #define ELF_E_NOT_COMPRESSED_IDX \
248*7304104dSAndroid Build Coastguard Worker (ELF_E_INVALID_SECTION_FLAGS_IDX \
249*7304104dSAndroid Build Coastguard Worker + sizeof "invalid section flags")
250*7304104dSAndroid Build Coastguard Worker N_("section does not contain compressed data")
251*7304104dSAndroid Build Coastguard Worker "\0"
252*7304104dSAndroid Build Coastguard Worker #define ELF_E_ALREADY_COMPRESSED_IDX \
253*7304104dSAndroid Build Coastguard Worker (ELF_E_NOT_COMPRESSED_IDX \
254*7304104dSAndroid Build Coastguard Worker + sizeof "section does not contain compressed data")
255*7304104dSAndroid Build Coastguard Worker N_("section contains compressed data")
256*7304104dSAndroid Build Coastguard Worker "\0"
257*7304104dSAndroid Build Coastguard Worker #define ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX \
258*7304104dSAndroid Build Coastguard Worker (ELF_E_ALREADY_COMPRESSED_IDX \
259*7304104dSAndroid Build Coastguard Worker + sizeof "section contains compressed data")
260*7304104dSAndroid Build Coastguard Worker N_("unknown compression type")
261*7304104dSAndroid Build Coastguard Worker "\0"
262*7304104dSAndroid Build Coastguard Worker #define ELF_E_COMPRESS_ERROR_IDX \
263*7304104dSAndroid Build Coastguard Worker (ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX \
264*7304104dSAndroid Build Coastguard Worker + sizeof "unknown compression type")
265*7304104dSAndroid Build Coastguard Worker N_("cannot compress data")
266*7304104dSAndroid Build Coastguard Worker "\0"
267*7304104dSAndroid Build Coastguard Worker #define ELF_E_DECOMPRESS_ERROR_IDX \
268*7304104dSAndroid Build Coastguard Worker (ELF_E_COMPRESS_ERROR_IDX \
269*7304104dSAndroid Build Coastguard Worker + sizeof "cannot compress data")
270*7304104dSAndroid Build Coastguard Worker N_("cannot decompress data")
271*7304104dSAndroid Build Coastguard Worker };
272*7304104dSAndroid Build Coastguard Worker
273*7304104dSAndroid Build Coastguard Worker
274*7304104dSAndroid Build Coastguard Worker static const uint_fast16_t msgidx[ELF_E_NUM] =
275*7304104dSAndroid Build Coastguard Worker {
276*7304104dSAndroid Build Coastguard Worker [ELF_E_NOERROR] = ELF_E_NOERROR_IDX,
277*7304104dSAndroid Build Coastguard Worker [ELF_E_UNKNOWN_ERROR] = ELF_E_UNKNOWN_ERROR_IDX,
278*7304104dSAndroid Build Coastguard Worker [ELF_E_UNKNOWN_VERSION] = ELF_E_UNKNOWN_VERSION_IDX,
279*7304104dSAndroid Build Coastguard Worker [ELF_E_UNKNOWN_TYPE] = ELF_E_UNKNOWN_TYPE_IDX,
280*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_HANDLE] = ELF_E_INVALID_HANDLE_IDX,
281*7304104dSAndroid Build Coastguard Worker [ELF_E_SOURCE_SIZE] = ELF_E_SOURCE_SIZE_IDX,
282*7304104dSAndroid Build Coastguard Worker [ELF_E_DEST_SIZE] = ELF_E_DEST_SIZE_IDX,
283*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_ENCODING] = ELF_E_INVALID_ENCODING_IDX,
284*7304104dSAndroid Build Coastguard Worker [ELF_E_NOMEM] = ELF_E_NOMEM_IDX,
285*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_FILE] = ELF_E_INVALID_FILE_IDX,
286*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_ELF] = ELF_E_INVALID_ELF_IDX,
287*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_OP] = ELF_E_INVALID_OP_IDX,
288*7304104dSAndroid Build Coastguard Worker [ELF_E_NO_VERSION] = ELF_E_NO_VERSION_IDX,
289*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_CMD] = ELF_E_INVALID_CMD_IDX,
290*7304104dSAndroid Build Coastguard Worker [ELF_E_RANGE] = ELF_E_RANGE_IDX,
291*7304104dSAndroid Build Coastguard Worker [ELF_E_ARCHIVE_FMAG] = ELF_E_ARCHIVE_FMAG_IDX,
292*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_ARCHIVE] = ELF_E_INVALID_ARCHIVE_IDX,
293*7304104dSAndroid Build Coastguard Worker [ELF_E_NO_ARCHIVE] = ELF_E_NO_ARCHIVE_IDX,
294*7304104dSAndroid Build Coastguard Worker [ELF_E_NO_INDEX] = ELF_E_NO_INDEX_IDX,
295*7304104dSAndroid Build Coastguard Worker [ELF_E_READ_ERROR] = ELF_E_READ_ERROR_IDX,
296*7304104dSAndroid Build Coastguard Worker [ELF_E_WRITE_ERROR] = ELF_E_WRITE_ERROR_IDX,
297*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_CLASS] = ELF_E_INVALID_CLASS_IDX,
298*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_INDEX] = ELF_E_INVALID_INDEX_IDX,
299*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_OPERAND] = ELF_E_INVALID_OPERAND_IDX,
300*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_SECTION] = ELF_E_INVALID_SECTION_IDX,
301*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_COMMAND] = ELF_E_INVALID_COMMAND_IDX,
302*7304104dSAndroid Build Coastguard Worker [ELF_E_WRONG_ORDER_EHDR] = ELF_E_WRONG_ORDER_EHDR_IDX,
303*7304104dSAndroid Build Coastguard Worker [ELF_E_FD_DISABLED] = ELF_E_FD_DISABLED_IDX,
304*7304104dSAndroid Build Coastguard Worker [ELF_E_FD_MISMATCH] = ELF_E_FD_MISMATCH_IDX,
305*7304104dSAndroid Build Coastguard Worker [ELF_E_OFFSET_RANGE] = ELF_E_OFFSET_RANGE_IDX,
306*7304104dSAndroid Build Coastguard Worker [ELF_E_NOT_NUL_SECTION] = ELF_E_NOT_NUL_SECTION_IDX,
307*7304104dSAndroid Build Coastguard Worker [ELF_E_DATA_MISMATCH] = ELF_E_DATA_MISMATCH_IDX,
308*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_SECTION_HEADER] = ELF_E_INVALID_SECTION_HEADER_IDX,
309*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_DATA] = ELF_E_INVALID_DATA_IDX,
310*7304104dSAndroid Build Coastguard Worker [ELF_E_DATA_ENCODING] = ELF_E_DATA_ENCODING_IDX,
311*7304104dSAndroid Build Coastguard Worker [ELF_E_SECTION_TOO_SMALL] = ELF_E_SECTION_TOO_SMALL_IDX,
312*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_ALIGN] = ELF_E_INVALID_ALIGN_IDX,
313*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_SHENTSIZE] = ELF_E_INVALID_SHENTSIZE_IDX,
314*7304104dSAndroid Build Coastguard Worker [ELF_E_UPDATE_RO] = ELF_E_UPDATE_RO_IDX,
315*7304104dSAndroid Build Coastguard Worker [ELF_E_NOFILE] = ELF_E_NOFILE_IDX,
316*7304104dSAndroid Build Coastguard Worker [ELF_E_GROUP_NOT_REL] = ELF_E_GROUP_NOT_REL_IDX,
317*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_PHDR] = ELF_E_INVALID_PHDR_IDX,
318*7304104dSAndroid Build Coastguard Worker [ELF_E_NO_PHDR] = ELF_E_NO_PHDR_IDX,
319*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_OFFSET] = ELF_E_INVALID_OFFSET_IDX,
320*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_SECTION_TYPE] = ELF_E_INVALID_SECTION_TYPE_IDX,
321*7304104dSAndroid Build Coastguard Worker [ELF_E_INVALID_SECTION_FLAGS] = ELF_E_INVALID_SECTION_FLAGS_IDX,
322*7304104dSAndroid Build Coastguard Worker [ELF_E_NOT_COMPRESSED] = ELF_E_NOT_COMPRESSED_IDX,
323*7304104dSAndroid Build Coastguard Worker [ELF_E_ALREADY_COMPRESSED] = ELF_E_ALREADY_COMPRESSED_IDX,
324*7304104dSAndroid Build Coastguard Worker [ELF_E_UNKNOWN_COMPRESSION_TYPE] = ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX,
325*7304104dSAndroid Build Coastguard Worker [ELF_E_COMPRESS_ERROR] = ELF_E_COMPRESS_ERROR_IDX,
326*7304104dSAndroid Build Coastguard Worker [ELF_E_DECOMPRESS_ERROR] = ELF_E_DECOMPRESS_ERROR_IDX
327*7304104dSAndroid Build Coastguard Worker };
328*7304104dSAndroid Build Coastguard Worker #define nmsgidx ((int) (sizeof (msgidx) / sizeof (msgidx[0])))
329*7304104dSAndroid Build Coastguard Worker
330*7304104dSAndroid Build Coastguard Worker
331*7304104dSAndroid Build Coastguard Worker void
332*7304104dSAndroid Build Coastguard Worker internal_function
__libelf_seterrno(int value)333*7304104dSAndroid Build Coastguard Worker __libelf_seterrno (int value)
334*7304104dSAndroid Build Coastguard Worker {
335*7304104dSAndroid Build Coastguard Worker global_error = value >= 0 && value < nmsgidx ? value : ELF_E_UNKNOWN_ERROR;
336*7304104dSAndroid Build Coastguard Worker }
337*7304104dSAndroid Build Coastguard Worker
338*7304104dSAndroid Build Coastguard Worker
339*7304104dSAndroid Build Coastguard Worker const char *
elf_errmsg(int error)340*7304104dSAndroid Build Coastguard Worker elf_errmsg (int error)
341*7304104dSAndroid Build Coastguard Worker {
342*7304104dSAndroid Build Coastguard Worker int last_error = global_error;
343*7304104dSAndroid Build Coastguard Worker
344*7304104dSAndroid Build Coastguard Worker if (error == 0)
345*7304104dSAndroid Build Coastguard Worker {
346*7304104dSAndroid Build Coastguard Worker assert (msgidx[last_error] < sizeof (msgstr));
347*7304104dSAndroid Build Coastguard Worker return last_error != 0 ? _(msgstr + msgidx[last_error]) : NULL;
348*7304104dSAndroid Build Coastguard Worker }
349*7304104dSAndroid Build Coastguard Worker else if (error < -1 || error >= nmsgidx)
350*7304104dSAndroid Build Coastguard Worker return _(msgstr + ELF_E_UNKNOWN_ERROR_IDX);
351*7304104dSAndroid Build Coastguard Worker
352*7304104dSAndroid Build Coastguard Worker assert (msgidx[error == -1 ? last_error : error] < sizeof (msgstr));
353*7304104dSAndroid Build Coastguard Worker return _(msgstr + msgidx[error == -1 ? last_error : error]);
354*7304104dSAndroid Build Coastguard Worker }
355