xref: /aosp_15_r20/external/elfutils/libelf/libelfP.h (revision 7304104da70ce23c86437a01be71edd1a2d7f37e)
1*7304104dSAndroid Build Coastguard Worker /* Internal interfaces for libelf.
2*7304104dSAndroid Build Coastguard Worker    Copyright (C) 1998-2010, 2015, 2016 Red Hat, Inc.
3*7304104dSAndroid Build Coastguard Worker    Copyright (C) 2023 Mark J. Wielaard <[email protected]>
4*7304104dSAndroid Build Coastguard Worker    This file is part of elfutils.
5*7304104dSAndroid Build Coastguard Worker    Contributed by Ulrich Drepper <[email protected]>, 1998.
6*7304104dSAndroid Build Coastguard Worker 
7*7304104dSAndroid Build Coastguard Worker    This file is free software; you can redistribute it and/or modify
8*7304104dSAndroid Build Coastguard Worker    it under the terms of either
9*7304104dSAndroid Build Coastguard Worker 
10*7304104dSAndroid Build Coastguard Worker      * the GNU Lesser General Public License as published by the Free
11*7304104dSAndroid Build Coastguard Worker        Software Foundation; either version 3 of the License, or (at
12*7304104dSAndroid Build Coastguard Worker        your option) any later version
13*7304104dSAndroid Build Coastguard Worker 
14*7304104dSAndroid Build Coastguard Worker    or
15*7304104dSAndroid Build Coastguard Worker 
16*7304104dSAndroid Build Coastguard Worker      * the GNU General Public License as published by the Free
17*7304104dSAndroid Build Coastguard Worker        Software Foundation; either version 2 of the License, or (at
18*7304104dSAndroid Build Coastguard Worker        your option) any later version
19*7304104dSAndroid Build Coastguard Worker 
20*7304104dSAndroid Build Coastguard Worker    or both in parallel, as here.
21*7304104dSAndroid Build Coastguard Worker 
22*7304104dSAndroid Build Coastguard Worker    elfutils is distributed in the hope that it will be useful, but
23*7304104dSAndroid Build Coastguard Worker    WITHOUT ANY WARRANTY; without even the implied warranty of
24*7304104dSAndroid Build Coastguard Worker    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25*7304104dSAndroid Build Coastguard Worker    General Public License for more details.
26*7304104dSAndroid Build Coastguard Worker 
27*7304104dSAndroid Build Coastguard Worker    You should have received copies of the GNU General Public License and
28*7304104dSAndroid Build Coastguard Worker    the GNU Lesser General Public License along with this program.  If
29*7304104dSAndroid Build Coastguard Worker    not, see <http://www.gnu.org/licenses/>.  */
30*7304104dSAndroid Build Coastguard Worker 
31*7304104dSAndroid Build Coastguard Worker #ifndef _LIBELFP_H
32*7304104dSAndroid Build Coastguard Worker #define _LIBELFP_H 1
33*7304104dSAndroid Build Coastguard Worker 
34*7304104dSAndroid Build Coastguard Worker #include <ar.h>
35*7304104dSAndroid Build Coastguard Worker #include <gelf.h>
36*7304104dSAndroid Build Coastguard Worker 
37*7304104dSAndroid Build Coastguard Worker #include <errno.h>
38*7304104dSAndroid Build Coastguard Worker #include <stdbool.h>
39*7304104dSAndroid Build Coastguard Worker #include <stdint.h>
40*7304104dSAndroid Build Coastguard Worker #include <stdio.h>
41*7304104dSAndroid Build Coastguard Worker #include <string.h>
42*7304104dSAndroid Build Coastguard Worker 
43*7304104dSAndroid Build Coastguard Worker #include <system.h>
44*7304104dSAndroid Build Coastguard Worker 
45*7304104dSAndroid Build Coastguard Worker /* Helper Macros to write 32 bit and 64 bit functions.  */
46*7304104dSAndroid Build Coastguard Worker #define __elfw2_(Bits, Name) __elf##Bits##_##Name
47*7304104dSAndroid Build Coastguard Worker #define elfw2_(Bits, Name) elf##Bits##_##Name
48*7304104dSAndroid Build Coastguard Worker #define ElfW2_(Bits, Name) Elf##Bits##_##Name
49*7304104dSAndroid Build Coastguard Worker #define ELFW2_(Bits, Name) ELF##Bits##_##Name
50*7304104dSAndroid Build Coastguard Worker #define ELFW_(Name, Bits) Name##Bits
51*7304104dSAndroid Build Coastguard Worker #define __elfw2(Bits, Name) __elfw2_(Bits, Name)
52*7304104dSAndroid Build Coastguard Worker #define elfw2(Bits, Name) elfw2_(Bits, Name)
53*7304104dSAndroid Build Coastguard Worker #define ElfW2(Bits, Name) ElfW2_(Bits, Name)
54*7304104dSAndroid Build Coastguard Worker #define ELFW2(Bits, Name) ELFW2_(Bits, Name)
55*7304104dSAndroid Build Coastguard Worker #define ELFW(Name, Bits)  ELFW_(Name, Bits)
56*7304104dSAndroid Build Coastguard Worker 
57*7304104dSAndroid Build Coastguard Worker 
58*7304104dSAndroid Build Coastguard Worker /* Sizes of the external types, for 32 bits objects.  */
59*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_ADDR   4
60*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_OFF    4
61*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_HALF   2
62*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_WORD   4
63*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_SWORD  4
64*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_XWORD  8
65*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_SXWORD 8
66*7304104dSAndroid Build Coastguard Worker #define ELF32_FSZ_RELR   4
67*7304104dSAndroid Build Coastguard Worker 
68*7304104dSAndroid Build Coastguard Worker /* Same for 64 bits objects.  */
69*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_ADDR   8
70*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_OFF    8
71*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_HALF   2
72*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_WORD   4
73*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_SWORD  4
74*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_XWORD  8
75*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_SXWORD 8
76*7304104dSAndroid Build Coastguard Worker #define ELF64_FSZ_RELR   8
77*7304104dSAndroid Build Coastguard Worker 
78*7304104dSAndroid Build Coastguard Worker 
79*7304104dSAndroid Build Coastguard Worker /* This is an extension of the ELF_F_* enumeration.  The values here are
80*7304104dSAndroid Build Coastguard Worker    not part of the library interface, they are only used internally.  */
81*7304104dSAndroid Build Coastguard Worker enum
82*7304104dSAndroid Build Coastguard Worker {
83*7304104dSAndroid Build Coastguard Worker   ELF_F_MMAPPED = 0x40,
84*7304104dSAndroid Build Coastguard Worker   ELF_F_MALLOCED = 0x80,
85*7304104dSAndroid Build Coastguard Worker   ELF_F_FILEDATA = 0x100
86*7304104dSAndroid Build Coastguard Worker };
87*7304104dSAndroid Build Coastguard Worker 
88*7304104dSAndroid Build Coastguard Worker 
89*7304104dSAndroid Build Coastguard Worker /* Get definition of all the external types.  */
90*7304104dSAndroid Build Coastguard Worker #include "exttypes.h"
91*7304104dSAndroid Build Coastguard Worker 
92*7304104dSAndroid Build Coastguard Worker 
93*7304104dSAndroid Build Coastguard Worker /* Error values.  */
94*7304104dSAndroid Build Coastguard Worker enum
95*7304104dSAndroid Build Coastguard Worker {
96*7304104dSAndroid Build Coastguard Worker   ELF_E_NOERROR = 0,
97*7304104dSAndroid Build Coastguard Worker   ELF_E_UNKNOWN_ERROR,
98*7304104dSAndroid Build Coastguard Worker   ELF_E_UNKNOWN_VERSION,
99*7304104dSAndroid Build Coastguard Worker   ELF_E_UNKNOWN_TYPE,
100*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_HANDLE,
101*7304104dSAndroid Build Coastguard Worker   ELF_E_SOURCE_SIZE,
102*7304104dSAndroid Build Coastguard Worker   ELF_E_DEST_SIZE,
103*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_ENCODING,
104*7304104dSAndroid Build Coastguard Worker   ELF_E_NOMEM,
105*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_FILE,
106*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_ELF,
107*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_OP,
108*7304104dSAndroid Build Coastguard Worker   ELF_E_NO_VERSION,
109*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_CMD,
110*7304104dSAndroid Build Coastguard Worker   ELF_E_RANGE,
111*7304104dSAndroid Build Coastguard Worker   ELF_E_ARCHIVE_FMAG,
112*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_ARCHIVE,
113*7304104dSAndroid Build Coastguard Worker   ELF_E_NO_ARCHIVE,
114*7304104dSAndroid Build Coastguard Worker   ELF_E_NO_INDEX,
115*7304104dSAndroid Build Coastguard Worker   ELF_E_READ_ERROR,
116*7304104dSAndroid Build Coastguard Worker   ELF_E_WRITE_ERROR,
117*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_CLASS,
118*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_INDEX,
119*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_OPERAND,
120*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_SECTION,
121*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_COMMAND,
122*7304104dSAndroid Build Coastguard Worker   ELF_E_WRONG_ORDER_EHDR,
123*7304104dSAndroid Build Coastguard Worker   ELF_E_FD_DISABLED,
124*7304104dSAndroid Build Coastguard Worker   ELF_E_FD_MISMATCH,
125*7304104dSAndroid Build Coastguard Worker   ELF_E_OFFSET_RANGE,
126*7304104dSAndroid Build Coastguard Worker   ELF_E_NOT_NUL_SECTION,
127*7304104dSAndroid Build Coastguard Worker   ELF_E_DATA_MISMATCH,
128*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_SECTION_HEADER,
129*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_DATA,
130*7304104dSAndroid Build Coastguard Worker   ELF_E_DATA_ENCODING,
131*7304104dSAndroid Build Coastguard Worker   ELF_E_SECTION_TOO_SMALL,
132*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_ALIGN,
133*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_SHENTSIZE,
134*7304104dSAndroid Build Coastguard Worker   ELF_E_UPDATE_RO,
135*7304104dSAndroid Build Coastguard Worker   ELF_E_NOFILE,
136*7304104dSAndroid Build Coastguard Worker   ELF_E_GROUP_NOT_REL,
137*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_PHDR,
138*7304104dSAndroid Build Coastguard Worker   ELF_E_NO_PHDR,
139*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_OFFSET,
140*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_SECTION_TYPE,
141*7304104dSAndroid Build Coastguard Worker   ELF_E_INVALID_SECTION_FLAGS,
142*7304104dSAndroid Build Coastguard Worker   ELF_E_NOT_COMPRESSED,
143*7304104dSAndroid Build Coastguard Worker   ELF_E_ALREADY_COMPRESSED,
144*7304104dSAndroid Build Coastguard Worker   ELF_E_UNKNOWN_COMPRESSION_TYPE,
145*7304104dSAndroid Build Coastguard Worker   ELF_E_COMPRESS_ERROR,
146*7304104dSAndroid Build Coastguard Worker   ELF_E_DECOMPRESS_ERROR,
147*7304104dSAndroid Build Coastguard Worker   /* Keep this as the last entry.  */
148*7304104dSAndroid Build Coastguard Worker   ELF_E_NUM
149*7304104dSAndroid Build Coastguard Worker };
150*7304104dSAndroid Build Coastguard Worker 
151*7304104dSAndroid Build Coastguard Worker 
152*7304104dSAndroid Build Coastguard Worker /* The visible `Elf_Data' type is not sufficient for some operations due
153*7304104dSAndroid Build Coastguard Worker    to a misdesigned interface.  Extend it for internal purposes.  */
154*7304104dSAndroid Build Coastguard Worker typedef struct
155*7304104dSAndroid Build Coastguard Worker {
156*7304104dSAndroid Build Coastguard Worker   Elf_Data d;
157*7304104dSAndroid Build Coastguard Worker   Elf_Scn *s;
158*7304104dSAndroid Build Coastguard Worker } Elf_Data_Scn;
159*7304104dSAndroid Build Coastguard Worker 
160*7304104dSAndroid Build Coastguard Worker 
161*7304104dSAndroid Build Coastguard Worker /* List of `Elf_Data' descriptors.  This is what makes up the section
162*7304104dSAndroid Build Coastguard Worker    contents.  */
163*7304104dSAndroid Build Coastguard Worker typedef struct Elf_Data_List
164*7304104dSAndroid Build Coastguard Worker {
165*7304104dSAndroid Build Coastguard Worker   /* `data' *must* be the first element in the struct.  */
166*7304104dSAndroid Build Coastguard Worker   Elf_Data_Scn data;
167*7304104dSAndroid Build Coastguard Worker   struct Elf_Data_List *next;
168*7304104dSAndroid Build Coastguard Worker   int flags;
169*7304104dSAndroid Build Coastguard Worker } Elf_Data_List;
170*7304104dSAndroid Build Coastguard Worker 
171*7304104dSAndroid Build Coastguard Worker 
172*7304104dSAndroid Build Coastguard Worker /* Descriptor for ELF section.  */
173*7304104dSAndroid Build Coastguard Worker struct Elf_Scn
174*7304104dSAndroid Build Coastguard Worker {
175*7304104dSAndroid Build Coastguard Worker   /* We have to distinguish several different situations:
176*7304104dSAndroid Build Coastguard Worker 
177*7304104dSAndroid Build Coastguard Worker      1. the section is user created.  Therefore there is no file or memory
178*7304104dSAndroid Build Coastguard Worker         region to read the data from.  Here we have two different subcases:
179*7304104dSAndroid Build Coastguard Worker 
180*7304104dSAndroid Build Coastguard Worker         a) data was not yet added (before the first `elf_newdata' call)
181*7304104dSAndroid Build Coastguard Worker 
182*7304104dSAndroid Build Coastguard Worker         b) at least one data set is available
183*7304104dSAndroid Build Coastguard Worker 
184*7304104dSAndroid Build Coastguard Worker      2. this is a section from a file/memory region.  We have to read the
185*7304104dSAndroid Build Coastguard Worker         current content in one data block if we have to.  But we don't
186*7304104dSAndroid Build Coastguard Worker         read the data until it is necessary.  So we have the subcases:
187*7304104dSAndroid Build Coastguard Worker 
188*7304104dSAndroid Build Coastguard Worker         a) the section in the file has size zero (for whatever reason)
189*7304104dSAndroid Build Coastguard Worker 
190*7304104dSAndroid Build Coastguard Worker         b) the data of the file is not (yet) read
191*7304104dSAndroid Build Coastguard Worker 
192*7304104dSAndroid Build Coastguard Worker         c) the data is read and available.
193*7304104dSAndroid Build Coastguard Worker 
194*7304104dSAndroid Build Coastguard Worker      In addition to this we have different data sets, the raw and the converted
195*7304104dSAndroid Build Coastguard Worker      data.  This distinction only exists for the data read from the file.
196*7304104dSAndroid Build Coastguard Worker      All user-added data set (all but the first when read from the file or
197*7304104dSAndroid Build Coastguard Worker      all of them for user-create sections) are the same in both formats.
198*7304104dSAndroid Build Coastguard Worker      We don't create the converted data before it is necessary.
199*7304104dSAndroid Build Coastguard Worker 
200*7304104dSAndroid Build Coastguard Worker      The `data_read' element signals whether data is available in the
201*7304104dSAndroid Build Coastguard Worker      raw format.
202*7304104dSAndroid Build Coastguard Worker 
203*7304104dSAndroid Build Coastguard Worker      If there is data from the file/memory region or if read one data
204*7304104dSAndroid Build Coastguard Worker      set is added the `rawdata_list_read' pointer in non-NULL and points
205*7304104dSAndroid Build Coastguard Worker      to the last filled data set.  `raw_datalist_rear' is therefore NULL
206*7304104dSAndroid Build Coastguard Worker      only if there is no data set at all.
207*7304104dSAndroid Build Coastguard Worker 
208*7304104dSAndroid Build Coastguard Worker      This so far allows to distinguish all but two cases (given that the
209*7304104dSAndroid Build Coastguard Worker      `rawdata_list' and `data_list' entries are initialized to zero) is
210*7304104dSAndroid Build Coastguard Worker      between not yet loaded data from the file/memory region and a section
211*7304104dSAndroid Build Coastguard Worker      with zero size and type ELF_T_BYTE.   */
212*7304104dSAndroid Build Coastguard Worker   Elf_Data_List data_list;	/* List of data buffers.  */
213*7304104dSAndroid Build Coastguard Worker   Elf_Data_List *data_list_rear; /* Pointer to the rear of the data list. */
214*7304104dSAndroid Build Coastguard Worker 
215*7304104dSAndroid Build Coastguard Worker   Elf_Data_Scn rawdata;		/* Uninterpreted data of the section.  */
216*7304104dSAndroid Build Coastguard Worker 
217*7304104dSAndroid Build Coastguard Worker   int data_read;		/* Nonzero if the section was created by the
218*7304104dSAndroid Build Coastguard Worker 				   user or if the data from the file/memory
219*7304104dSAndroid Build Coastguard Worker 				   is read.  */
220*7304104dSAndroid Build Coastguard Worker   int shndx_index;		/* Index of the extended section index
221*7304104dSAndroid Build Coastguard Worker 				   table for this symbol table (if this
222*7304104dSAndroid Build Coastguard Worker 				   section is a symbol table).  */
223*7304104dSAndroid Build Coastguard Worker 
224*7304104dSAndroid Build Coastguard Worker   size_t index;			/* Index of this section.  */
225*7304104dSAndroid Build Coastguard Worker   struct Elf *elf;		/* The underlying ELF file.  */
226*7304104dSAndroid Build Coastguard Worker 
227*7304104dSAndroid Build Coastguard Worker   union
228*7304104dSAndroid Build Coastguard Worker   {
229*7304104dSAndroid Build Coastguard Worker     Elf32_Shdr *e32;		/* Pointer to 32bit section header.  */
230*7304104dSAndroid Build Coastguard Worker     Elf64_Shdr *e64;		/* Pointer to 64bit section header.  */
231*7304104dSAndroid Build Coastguard Worker   } shdr;
232*7304104dSAndroid Build Coastguard Worker 
233*7304104dSAndroid Build Coastguard Worker   unsigned int shdr_flags;	/* Section header modified?  */
234*7304104dSAndroid Build Coastguard Worker   unsigned int flags;		/* Section changed in size?
235*7304104dSAndroid Build Coastguard Worker 				   ELF_F_MALLOCED for a Elf_Data_Chunk
236*7304104dSAndroid Build Coastguard Worker 				   dummy_scn means the rawchunks
237*7304104dSAndroid Build Coastguard Worker 				   data.d.d_buf was malloced. For normal
238*7304104dSAndroid Build Coastguard Worker 				   sections it means rawdata_base was
239*7304104dSAndroid Build Coastguard Worker 				   malloced (by elf_compress) even if
240*7304104dSAndroid Build Coastguard Worker 				   the Elf was mmapped.  */
241*7304104dSAndroid Build Coastguard Worker 
242*7304104dSAndroid Build Coastguard Worker   char *rawdata_base;		/* The unmodified data of the section.  */
243*7304104dSAndroid Build Coastguard Worker   char *data_base;		/* The converted data of the section.  */
244*7304104dSAndroid Build Coastguard Worker 
245*7304104dSAndroid Build Coastguard Worker   char *zdata_base;		/* The uncompressed data of the section.  */
246*7304104dSAndroid Build Coastguard Worker   size_t zdata_size;		/* If zdata_base != NULL, the size of data.  */
247*7304104dSAndroid Build Coastguard Worker   size_t zdata_align;		/* If zdata_base != NULL, the addralign.  */
248*7304104dSAndroid Build Coastguard Worker 
249*7304104dSAndroid Build Coastguard Worker   struct Elf_ScnList *list;	/* Pointer to the section list element the
250*7304104dSAndroid Build Coastguard Worker 				   data is in.  */
251*7304104dSAndroid Build Coastguard Worker };
252*7304104dSAndroid Build Coastguard Worker 
253*7304104dSAndroid Build Coastguard Worker 
254*7304104dSAndroid Build Coastguard Worker /* List of section.  */
255*7304104dSAndroid Build Coastguard Worker typedef struct Elf_ScnList
256*7304104dSAndroid Build Coastguard Worker {
257*7304104dSAndroid Build Coastguard Worker   unsigned int cnt;		/* Number of elements of 'data' used.  */
258*7304104dSAndroid Build Coastguard Worker   unsigned int max;		/* Number of elements of 'data' allocated.  */
259*7304104dSAndroid Build Coastguard Worker   struct Elf_ScnList *next;	/* Next block of sections.  */
260*7304104dSAndroid Build Coastguard Worker   struct Elf_Scn data[0];	/* Section data.  */
261*7304104dSAndroid Build Coastguard Worker } Elf_ScnList;
262*7304104dSAndroid Build Coastguard Worker 
263*7304104dSAndroid Build Coastguard Worker 
264*7304104dSAndroid Build Coastguard Worker /* elf_getdata_rawchunk result.  */
265*7304104dSAndroid Build Coastguard Worker typedef struct Elf_Data_Chunk
266*7304104dSAndroid Build Coastguard Worker {
267*7304104dSAndroid Build Coastguard Worker   Elf_Data_Scn data;
268*7304104dSAndroid Build Coastguard Worker   Elf_Scn dummy_scn;
269*7304104dSAndroid Build Coastguard Worker   int64_t offset;		/* The original raw offset in the Elf image.  */
270*7304104dSAndroid Build Coastguard Worker } Elf_Data_Chunk;
271*7304104dSAndroid Build Coastguard Worker 
272*7304104dSAndroid Build Coastguard Worker 
273*7304104dSAndroid Build Coastguard Worker /* The ELF descriptor.  */
274*7304104dSAndroid Build Coastguard Worker struct Elf
275*7304104dSAndroid Build Coastguard Worker {
276*7304104dSAndroid Build Coastguard Worker   /* Address to which the file was mapped.  NULL if not mapped.  */
277*7304104dSAndroid Build Coastguard Worker   void *map_address;
278*7304104dSAndroid Build Coastguard Worker 
279*7304104dSAndroid Build Coastguard Worker   /* When created for an archive member this points to the descriptor
280*7304104dSAndroid Build Coastguard Worker      for the archive. */
281*7304104dSAndroid Build Coastguard Worker   Elf *parent;
282*7304104dSAndroid Build Coastguard Worker   Elf *next;             /* Used in list of archive descriptors.  */
283*7304104dSAndroid Build Coastguard Worker 
284*7304104dSAndroid Build Coastguard Worker   /* What kind of file is underneath (ELF file, archive...).  */
285*7304104dSAndroid Build Coastguard Worker   Elf_Kind kind;
286*7304104dSAndroid Build Coastguard Worker 
287*7304104dSAndroid Build Coastguard Worker   /* Command used to create this descriptor.  */
288*7304104dSAndroid Build Coastguard Worker   Elf_Cmd cmd;
289*7304104dSAndroid Build Coastguard Worker 
290*7304104dSAndroid Build Coastguard Worker   /* The binary class.  */
291*7304104dSAndroid Build Coastguard Worker   unsigned int class;
292*7304104dSAndroid Build Coastguard Worker 
293*7304104dSAndroid Build Coastguard Worker   /* The used file descriptor.  -1 if not available anymore.  */
294*7304104dSAndroid Build Coastguard Worker   int fildes;
295*7304104dSAndroid Build Coastguard Worker 
296*7304104dSAndroid Build Coastguard Worker   /* Offset in the archive this file starts or zero.  */
297*7304104dSAndroid Build Coastguard Worker   int64_t start_offset;
298*7304104dSAndroid Build Coastguard Worker 
299*7304104dSAndroid Build Coastguard Worker   /* Size of the file in the archive or the entire file size, or ~0
300*7304104dSAndroid Build Coastguard Worker      for an (yet) unknown size.  */
301*7304104dSAndroid Build Coastguard Worker   size_t maximum_size;
302*7304104dSAndroid Build Coastguard Worker 
303*7304104dSAndroid Build Coastguard Worker   /* Describes the way the memory was allocated and if the dirty bit is
304*7304104dSAndroid Build Coastguard Worker      signalled it means that the whole file has to be rewritten since
305*7304104dSAndroid Build Coastguard Worker      the layout changed.  */
306*7304104dSAndroid Build Coastguard Worker   int flags;
307*7304104dSAndroid Build Coastguard Worker 
308*7304104dSAndroid Build Coastguard Worker   /* Reference counting for the descriptor.  */
309*7304104dSAndroid Build Coastguard Worker   int ref_count;
310*7304104dSAndroid Build Coastguard Worker 
311*7304104dSAndroid Build Coastguard Worker   /* Lock to handle multithreaded programs.  */
312*7304104dSAndroid Build Coastguard Worker   rwlock_define (,lock);
313*7304104dSAndroid Build Coastguard Worker 
314*7304104dSAndroid Build Coastguard Worker   union
315*7304104dSAndroid Build Coastguard Worker   {
316*7304104dSAndroid Build Coastguard Worker     struct
317*7304104dSAndroid Build Coastguard Worker     {
318*7304104dSAndroid Build Coastguard Worker       /* The next fields are only useful when testing for ==/!= NULL.  */
319*7304104dSAndroid Build Coastguard Worker       void *ehdr;
320*7304104dSAndroid Build Coastguard Worker       void *shdr;
321*7304104dSAndroid Build Coastguard Worker       void *phdr;
322*7304104dSAndroid Build Coastguard Worker 
323*7304104dSAndroid Build Coastguard Worker       Elf_ScnList *scns_last;	/* Last element in the section list.
324*7304104dSAndroid Build Coastguard Worker 				   If NULL the data has not yet been
325*7304104dSAndroid Build Coastguard Worker 				   read from the file.  */
326*7304104dSAndroid Build Coastguard Worker       void *rawchunks;		/* Tree of elf_getdata_rawchunk results.  */
327*7304104dSAndroid Build Coastguard Worker       unsigned int scnincr;	/* Number of sections allocate the last
328*7304104dSAndroid Build Coastguard Worker 				   time.  */
329*7304104dSAndroid Build Coastguard Worker       int ehdr_flags;		/* Flags (dirty) for ELF header.  */
330*7304104dSAndroid Build Coastguard Worker       int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
331*7304104dSAndroid Build Coastguard Worker       int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
332*7304104dSAndroid Build Coastguard Worker       off_t sizestr_offset;	/* Offset of the size string in the parent
333*7304104dSAndroid Build Coastguard Worker 				   if this is an archive member.  */
334*7304104dSAndroid Build Coastguard Worker     } elf;
335*7304104dSAndroid Build Coastguard Worker 
336*7304104dSAndroid Build Coastguard Worker     struct
337*7304104dSAndroid Build Coastguard Worker     {
338*7304104dSAndroid Build Coastguard Worker       Elf32_Ehdr *ehdr;		/* Pointer to the ELF header.  This is
339*7304104dSAndroid Build Coastguard Worker 				   never malloced.  */
340*7304104dSAndroid Build Coastguard Worker       Elf32_Shdr *shdr;		/* Used when reading from a file.  */
341*7304104dSAndroid Build Coastguard Worker       Elf32_Phdr *phdr;		/* Pointer to the program header array.  */
342*7304104dSAndroid Build Coastguard Worker       Elf_ScnList *scns_last;	/* Last element in the section list.
343*7304104dSAndroid Build Coastguard Worker 				   If NULL the data has not yet been
344*7304104dSAndroid Build Coastguard Worker 				   read from the file.  */
345*7304104dSAndroid Build Coastguard Worker       void *rawchunks;		/* Tree of elf_getdata_rawchunk results.  */
346*7304104dSAndroid Build Coastguard Worker       unsigned int scnincr;	/* Number of sections allocate the last
347*7304104dSAndroid Build Coastguard Worker 				   time.  */
348*7304104dSAndroid Build Coastguard Worker       int ehdr_flags;		/* Flags (dirty) for ELF header.  */
349*7304104dSAndroid Build Coastguard Worker       int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
350*7304104dSAndroid Build Coastguard Worker       int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
351*7304104dSAndroid Build Coastguard Worker       int64_t sizestr_offset;	/* Offset of the size string in the parent
352*7304104dSAndroid Build Coastguard Worker 				   if this is an archive member.  */
353*7304104dSAndroid Build Coastguard Worker       Elf32_Ehdr ehdr_mem;	/* Memory used for ELF header when not
354*7304104dSAndroid Build Coastguard Worker 				   mmaped.  */
355*7304104dSAndroid Build Coastguard Worker       char __e32scnspad[sizeof (Elf64_Ehdr) - sizeof (Elf32_Ehdr)];
356*7304104dSAndroid Build Coastguard Worker 
357*7304104dSAndroid Build Coastguard Worker       /* The section array.  */
358*7304104dSAndroid Build Coastguard Worker       Elf_ScnList scns;
359*7304104dSAndroid Build Coastguard Worker     } elf32;
360*7304104dSAndroid Build Coastguard Worker 
361*7304104dSAndroid Build Coastguard Worker     struct
362*7304104dSAndroid Build Coastguard Worker     {
363*7304104dSAndroid Build Coastguard Worker       Elf64_Ehdr *ehdr;		/* Pointer to the ELF header.  This is
364*7304104dSAndroid Build Coastguard Worker 				   never malloced.  */
365*7304104dSAndroid Build Coastguard Worker       Elf64_Shdr *shdr;		/* Used when reading from a file.  */
366*7304104dSAndroid Build Coastguard Worker       Elf64_Phdr *phdr;		/* Pointer to the program header array.  */
367*7304104dSAndroid Build Coastguard Worker       Elf_ScnList *scns_last;	/* Last element in the section list.
368*7304104dSAndroid Build Coastguard Worker 				   If NULL the data has not yet been
369*7304104dSAndroid Build Coastguard Worker 				   read from the file.  */
370*7304104dSAndroid Build Coastguard Worker       void *rawchunks;		/* Tree of elf_getdata_rawchunk results.  */
371*7304104dSAndroid Build Coastguard Worker       unsigned int scnincr;	/* Number of sections allocate the last
372*7304104dSAndroid Build Coastguard Worker 				   time.  */
373*7304104dSAndroid Build Coastguard Worker       int ehdr_flags;		/* Flags (dirty) for ELF header.  */
374*7304104dSAndroid Build Coastguard Worker       int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
375*7304104dSAndroid Build Coastguard Worker       int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
376*7304104dSAndroid Build Coastguard Worker       int64_t sizestr_offset;	/* Offset of the size string in the parent
377*7304104dSAndroid Build Coastguard Worker 				   if this is an archive member.  */
378*7304104dSAndroid Build Coastguard Worker       Elf64_Ehdr ehdr_mem;	/* Memory used for ELF header when not
379*7304104dSAndroid Build Coastguard Worker 				   mmaped.  */
380*7304104dSAndroid Build Coastguard Worker 
381*7304104dSAndroid Build Coastguard Worker       /* The section array.  */
382*7304104dSAndroid Build Coastguard Worker       Elf_ScnList scns;
383*7304104dSAndroid Build Coastguard Worker     } elf64;
384*7304104dSAndroid Build Coastguard Worker 
385*7304104dSAndroid Build Coastguard Worker     struct
386*7304104dSAndroid Build Coastguard Worker     {
387*7304104dSAndroid Build Coastguard Worker       Elf *children;		/* List of all descriptors for this archive. */
388*7304104dSAndroid Build Coastguard Worker       Elf_Arsym *ar_sym;	/* Symbol table returned by elf_getarsym.  */
389*7304104dSAndroid Build Coastguard Worker       size_t ar_sym_num;	/* Number of entries in `ar_sym'.  */
390*7304104dSAndroid Build Coastguard Worker       char *long_names;		/* If no index is available but long names
391*7304104dSAndroid Build Coastguard Worker 				   are used this elements points to the data.*/
392*7304104dSAndroid Build Coastguard Worker       size_t long_names_len;	/* Length of the long name table.  */
393*7304104dSAndroid Build Coastguard Worker       int64_t offset;		/* Offset in file we are currently at.
394*7304104dSAndroid Build Coastguard Worker 				   elf_next() advances this to the next
395*7304104dSAndroid Build Coastguard Worker 				   member of the archive.  */
396*7304104dSAndroid Build Coastguard Worker       Elf_Arhdr elf_ar_hdr;	/* Structure returned by 'elf_getarhdr'.  */
397*7304104dSAndroid Build Coastguard Worker       struct ar_hdr ar_hdr;	/* Header read from file.  */
398*7304104dSAndroid Build Coastguard Worker       char ar_name[16];		/* NUL terminated ar_name of elf_ar_hdr.  */
399*7304104dSAndroid Build Coastguard Worker       char raw_name[17];	/* This is a buffer for the NUL terminated
400*7304104dSAndroid Build Coastguard Worker 				   named raw_name used in the elf_ar_hdr.  */
401*7304104dSAndroid Build Coastguard Worker     } ar;
402*7304104dSAndroid Build Coastguard Worker   } state;
403*7304104dSAndroid Build Coastguard Worker 
404*7304104dSAndroid Build Coastguard Worker   /* There absolutely never must be anything following the union.  */
405*7304104dSAndroid Build Coastguard Worker };
406*7304104dSAndroid Build Coastguard Worker 
407*7304104dSAndroid Build Coastguard Worker /* Type of the conversion functions.  These functions will convert the
408*7304104dSAndroid Build Coastguard Worker    byte order.  */
409*7304104dSAndroid Build Coastguard Worker typedef void (*xfct_t) (void *, const void *, size_t, int);
410*7304104dSAndroid Build Coastguard Worker 
411*7304104dSAndroid Build Coastguard Worker /* The table with the function pointers.  */
412*7304104dSAndroid Build Coastguard Worker extern const xfct_t __elf_xfctstom[ELFCLASSNUM - 1][ELF_T_NUM]
413*7304104dSAndroid Build Coastguard Worker   attribute_hidden;
414*7304104dSAndroid Build Coastguard Worker 
415*7304104dSAndroid Build Coastguard Worker 
416*7304104dSAndroid Build Coastguard Worker /* Array with sizes of the external types indexed by ELF version, binary
417*7304104dSAndroid Build Coastguard Worker    class, and type. */
418*7304104dSAndroid Build Coastguard Worker extern const size_t __libelf_type_sizes[ELFCLASSNUM - 1][ELF_T_NUM]
419*7304104dSAndroid Build Coastguard Worker   attribute_hidden;
420*7304104dSAndroid Build Coastguard Worker /* We often have to access the size for a type in the current version.  */
421*7304104dSAndroid Build Coastguard Worker # define elf_typesize(class,type,n) \
422*7304104dSAndroid Build Coastguard Worker   (__libelf_type_sizes[ELFW(ELFCLASS,class) - 1][type] * n)
423*7304104dSAndroid Build Coastguard Worker 
424*7304104dSAndroid Build Coastguard Worker /* The byte value used for filling gaps.  */
425*7304104dSAndroid Build Coastguard Worker extern int __libelf_fill_byte attribute_hidden;
426*7304104dSAndroid Build Coastguard Worker 
427*7304104dSAndroid Build Coastguard Worker /* EV_CURRENT if the version was set, EV_NONE otherwise.  */
428*7304104dSAndroid Build Coastguard Worker extern unsigned int __libelf_version attribute_hidden;
429*7304104dSAndroid Build Coastguard Worker 
430*7304104dSAndroid Build Coastguard Worker /* Array with alignment requirements of the internal types indexed by
431*7304104dSAndroid Build Coastguard Worker    binary class, and type. */
432*7304104dSAndroid Build Coastguard Worker extern const uint_fast8_t __libelf_type_aligns[ELFCLASSNUM - 1][ELF_T_NUM]
433*7304104dSAndroid Build Coastguard Worker   attribute_hidden;
434*7304104dSAndroid Build Coastguard Worker # define __libelf_type_align(class, type)	\
435*7304104dSAndroid Build Coastguard Worker     (__libelf_type_aligns[class - 1][type] ?: 1)
436*7304104dSAndroid Build Coastguard Worker 
437*7304104dSAndroid Build Coastguard Worker /* Given an GElf_Ehdr handle and a section type returns the Elf_Data d_type.
438*7304104dSAndroid Build Coastguard Worker    Should not be called when SHF_COMPRESSED is set, the d_type should
439*7304104dSAndroid Build Coastguard Worker    be ELF_T_BYTE.  */
440*7304104dSAndroid Build Coastguard Worker extern Elf_Type __libelf_data_type (GElf_Ehdr *ehdr,
441*7304104dSAndroid Build Coastguard Worker 				    int sh_type, GElf_Xword align)
442*7304104dSAndroid Build Coastguard Worker   internal_function;
443*7304104dSAndroid Build Coastguard Worker 
444*7304104dSAndroid Build Coastguard Worker 
445*7304104dSAndroid Build Coastguard Worker /* Create Elf descriptor from memory image.  */
446*7304104dSAndroid Build Coastguard Worker extern Elf *__libelf_read_mmaped_file (int fildes, void *map_address,
447*7304104dSAndroid Build Coastguard Worker 				       int64_t offset, size_t maxsize,
448*7304104dSAndroid Build Coastguard Worker 				       Elf_Cmd cmd, Elf *parent)
449*7304104dSAndroid Build Coastguard Worker      internal_function;
450*7304104dSAndroid Build Coastguard Worker 
451*7304104dSAndroid Build Coastguard Worker /* Set error value.  */
452*7304104dSAndroid Build Coastguard Worker extern void __libelf_seterrno (int value) internal_function;
453*7304104dSAndroid Build Coastguard Worker 
454*7304104dSAndroid Build Coastguard Worker /* Get the next archive header.  */
455*7304104dSAndroid Build Coastguard Worker extern int __libelf_next_arhdr_wrlock (Elf *elf) internal_function;
456*7304104dSAndroid Build Coastguard Worker 
457*7304104dSAndroid Build Coastguard Worker /* Read all of the file associated with the descriptor.  */
458*7304104dSAndroid Build Coastguard Worker extern char *__libelf_readall (Elf *elf) internal_function;
459*7304104dSAndroid Build Coastguard Worker 
460*7304104dSAndroid Build Coastguard Worker /* Read the complete section table and convert the byte order if necessary.  */
461*7304104dSAndroid Build Coastguard Worker extern int __libelf_readsections (Elf *elf) internal_function;
462*7304104dSAndroid Build Coastguard Worker 
463*7304104dSAndroid Build Coastguard Worker /* Store the information for the raw data in the `rawdata_list' element.  */
464*7304104dSAndroid Build Coastguard Worker extern int __libelf_set_rawdata (Elf_Scn *scn) internal_function;
465*7304104dSAndroid Build Coastguard Worker extern int __libelf_set_rawdata_wrlock (Elf_Scn *scn) internal_function;
466*7304104dSAndroid Build Coastguard Worker 
467*7304104dSAndroid Build Coastguard Worker 
468*7304104dSAndroid Build Coastguard Worker /* Helper functions for elf_update.  */
469*7304104dSAndroid Build Coastguard Worker extern int64_t __elf32_updatenull_wrlock (Elf *elf, int *change_bop,
470*7304104dSAndroid Build Coastguard Worker 					  size_t shnum) internal_function;
471*7304104dSAndroid Build Coastguard Worker extern int64_t __elf64_updatenull_wrlock (Elf *elf, int *change_bop,
472*7304104dSAndroid Build Coastguard Worker 					  size_t shnum) internal_function;
473*7304104dSAndroid Build Coastguard Worker 
474*7304104dSAndroid Build Coastguard Worker extern int __elf32_updatemmap (Elf *elf, int change_bo, size_t shnum)
475*7304104dSAndroid Build Coastguard Worker      internal_function;
476*7304104dSAndroid Build Coastguard Worker extern int __elf64_updatemmap (Elf *elf, int change_bo, size_t shnum)
477*7304104dSAndroid Build Coastguard Worker      internal_function;
478*7304104dSAndroid Build Coastguard Worker extern int __elf32_updatefile (Elf *elf, int change_bo, size_t shnum)
479*7304104dSAndroid Build Coastguard Worker      internal_function;
480*7304104dSAndroid Build Coastguard Worker extern int __elf64_updatefile (Elf *elf, int change_bo, size_t shnum)
481*7304104dSAndroid Build Coastguard Worker      internal_function;
482*7304104dSAndroid Build Coastguard Worker 
483*7304104dSAndroid Build Coastguard Worker 
484*7304104dSAndroid Build Coastguard Worker /* Alias for exported functions to avoid PLT entries, and
485*7304104dSAndroid Build Coastguard Worker    rdlock/wrlock variants of these functions.  */
486*7304104dSAndroid Build Coastguard Worker extern int __elf_end_internal (Elf *__elf) attribute_hidden;
487*7304104dSAndroid Build Coastguard Worker extern Elf *__elf_begin_internal (int __fildes, Elf_Cmd __cmd, Elf *__ref)
488*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
489*7304104dSAndroid Build Coastguard Worker extern Elf32_Ehdr *__elf32_getehdr_wrlock (Elf *__elf) internal_function;
490*7304104dSAndroid Build Coastguard Worker extern Elf64_Ehdr *__elf64_getehdr_wrlock (Elf *__elf) internal_function;
491*7304104dSAndroid Build Coastguard Worker extern Elf32_Ehdr *__elf32_newehdr_internal (Elf *__elf) attribute_hidden;
492*7304104dSAndroid Build Coastguard Worker extern Elf64_Ehdr *__elf64_newehdr_internal (Elf *__elf) attribute_hidden;
493*7304104dSAndroid Build Coastguard Worker extern Elf32_Phdr *__elf32_getphdr_internal (Elf *__elf) attribute_hidden;
494*7304104dSAndroid Build Coastguard Worker extern Elf64_Phdr *__elf64_getphdr_internal (Elf *__elf) attribute_hidden;
495*7304104dSAndroid Build Coastguard Worker extern Elf32_Phdr *__elf32_getphdr_wrlock (Elf *__elf) attribute_hidden;
496*7304104dSAndroid Build Coastguard Worker extern Elf64_Phdr *__elf64_getphdr_wrlock (Elf *__elf) attribute_hidden;
497*7304104dSAndroid Build Coastguard Worker extern Elf32_Phdr *__elf32_newphdr_internal (Elf *__elf, size_t __cnt)
498*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
499*7304104dSAndroid Build Coastguard Worker extern Elf64_Phdr *__elf64_newphdr_internal (Elf *__elf, size_t __cnt)
500*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
501*7304104dSAndroid Build Coastguard Worker extern Elf_Scn *__elf32_offscn_internal (Elf *__elf, Elf32_Off __offset)
502*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
503*7304104dSAndroid Build Coastguard Worker extern Elf_Scn *__elf64_offscn_internal (Elf *__elf, Elf64_Off __offset)
504*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
505*7304104dSAndroid Build Coastguard Worker extern int __elf_getphdrnum_rdlock (Elf *__elf, size_t *__dst)
506*7304104dSAndroid Build Coastguard Worker      internal_function;
507*7304104dSAndroid Build Coastguard Worker extern int __elf_getphdrnum_chk_rdlock (Elf *__elf, size_t *__dst)
508*7304104dSAndroid Build Coastguard Worker      internal_function;
509*7304104dSAndroid Build Coastguard Worker extern int __elf_getshdrnum_rdlock (Elf *__elf, size_t *__dst)
510*7304104dSAndroid Build Coastguard Worker      internal_function;
511*7304104dSAndroid Build Coastguard Worker extern int __elf_getshdrstrndx_internal (Elf *__elf, size_t *__dst)
512*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
513*7304104dSAndroid Build Coastguard Worker extern Elf32_Shdr *__elf32_getshdr_rdlock (Elf_Scn *__scn) internal_function;
514*7304104dSAndroid Build Coastguard Worker extern Elf64_Shdr *__elf64_getshdr_rdlock (Elf_Scn *__scn) internal_function;
515*7304104dSAndroid Build Coastguard Worker extern Elf32_Shdr *__elf32_getshdr_wrlock (Elf_Scn *__scn) internal_function;
516*7304104dSAndroid Build Coastguard Worker extern Elf64_Shdr *__elf64_getshdr_wrlock (Elf_Scn *__scn) internal_function;
517*7304104dSAndroid Build Coastguard Worker extern Elf32_Chdr *__elf32_getchdr_wrlock (Elf_Scn *__scn) internal_function;
518*7304104dSAndroid Build Coastguard Worker extern Elf64_Chdr *__elf64_getchdr_wrlock (Elf_Scn *__scn) internal_function;
519*7304104dSAndroid Build Coastguard Worker extern Elf_Scn *__elf_getscn_internal (Elf *__elf, size_t __index)
520*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
521*7304104dSAndroid Build Coastguard Worker extern Elf_Scn *__elf_nextscn_internal (Elf *__elf, Elf_Scn *__scn)
522*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
523*7304104dSAndroid Build Coastguard Worker extern int __elf_scnshndx_internal (Elf_Scn *__scn) attribute_hidden;
524*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf_getdata_internal (Elf_Scn *__scn, Elf_Data *__data)
525*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
526*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf_getdata_rdlock (Elf_Scn *__scn, Elf_Data *__data)
527*7304104dSAndroid Build Coastguard Worker      internal_function;
528*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf_getdata_wrlock (Elf_Scn *__scn, Elf_Data *__data)
529*7304104dSAndroid Build Coastguard Worker      internal_function;
530*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf_rawdata_internal (Elf_Scn *__scn, Elf_Data *__data)
531*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
532*7304104dSAndroid Build Coastguard Worker /* Should be called to setup first section data element if
533*7304104dSAndroid Build Coastguard Worker    data_list_rear is NULL and we know data_read is set and there is
534*7304104dSAndroid Build Coastguard Worker    raw data available.  Might upgrade the ELF lock from a read to a
535*7304104dSAndroid Build Coastguard Worker    write lock.  If the lock is already a write lock set wrlocked.  */
536*7304104dSAndroid Build Coastguard Worker extern void __libelf_set_data_list_rdlock (Elf_Scn *scn, int wrlocked)
537*7304104dSAndroid Build Coastguard Worker      internal_function;
538*7304104dSAndroid Build Coastguard Worker extern char *__elf_strptr_internal (Elf *__elf, size_t __index,
539*7304104dSAndroid Build Coastguard Worker 				    size_t __offset) attribute_hidden;
540*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf32_xlatetom_internal (Elf_Data *__dest,
541*7304104dSAndroid Build Coastguard Worker 					    const Elf_Data *__src,
542*7304104dSAndroid Build Coastguard Worker 					    unsigned int __encode)
543*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
544*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf64_xlatetom_internal (Elf_Data *__dest,
545*7304104dSAndroid Build Coastguard Worker 					    const Elf_Data *__src,
546*7304104dSAndroid Build Coastguard Worker 					    unsigned int __encode)
547*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
548*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf32_xlatetof_internal (Elf_Data *__dest,
549*7304104dSAndroid Build Coastguard Worker 					    const Elf_Data *__src,
550*7304104dSAndroid Build Coastguard Worker 					    unsigned int __encode)
551*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
552*7304104dSAndroid Build Coastguard Worker extern Elf_Data *__elf64_xlatetof_internal (Elf_Data *__dest,
553*7304104dSAndroid Build Coastguard Worker 					    const Elf_Data *__src,
554*7304104dSAndroid Build Coastguard Worker 					    unsigned int __encode)
555*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
556*7304104dSAndroid Build Coastguard Worker extern unsigned int __elf_version_internal (unsigned int __version)
557*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
558*7304104dSAndroid Build Coastguard Worker extern unsigned long int __elf_hash_internal (const char *__string)
559*7304104dSAndroid Build Coastguard Worker        __attribute__ ((__pure__)) attribute_hidden;
560*7304104dSAndroid Build Coastguard Worker extern long int __elf32_checksum_internal (Elf *__elf) attribute_hidden;
561*7304104dSAndroid Build Coastguard Worker extern long int __elf64_checksum_internal (Elf *__elf) attribute_hidden;
562*7304104dSAndroid Build Coastguard Worker 
563*7304104dSAndroid Build Coastguard Worker 
564*7304104dSAndroid Build Coastguard Worker extern GElf_Ehdr *__gelf_getehdr_rdlock (Elf *__elf, GElf_Ehdr *__dest)
565*7304104dSAndroid Build Coastguard Worker      internal_function;
566*7304104dSAndroid Build Coastguard Worker extern size_t __gelf_fsize_internal (Elf *__elf, Elf_Type __type,
567*7304104dSAndroid Build Coastguard Worker 				     size_t __count, unsigned int __version)
568*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
569*7304104dSAndroid Build Coastguard Worker extern GElf_Shdr *__gelf_getshdr_internal (Elf_Scn *__scn, GElf_Shdr *__dst)
570*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
571*7304104dSAndroid Build Coastguard Worker extern GElf_Sym *__gelf_getsym_internal (Elf_Data *__data, int __ndx,
572*7304104dSAndroid Build Coastguard Worker 					 GElf_Sym *__dst) attribute_hidden;
573*7304104dSAndroid Build Coastguard Worker 
574*7304104dSAndroid Build Coastguard Worker 
575*7304104dSAndroid Build Coastguard Worker extern uint32_t __libelf_crc32 (uint32_t crc, unsigned char *buf, size_t len)
576*7304104dSAndroid Build Coastguard Worker      attribute_hidden;
577*7304104dSAndroid Build Coastguard Worker 
578*7304104dSAndroid Build Coastguard Worker extern void * __libelf_compress (Elf_Scn *scn, size_t hsize, int ei_data,
579*7304104dSAndroid Build Coastguard Worker 				 size_t *orig_size, size_t *orig_addralign,
580*7304104dSAndroid Build Coastguard Worker 				 size_t *size, bool force, bool use_zstd)
581*7304104dSAndroid Build Coastguard Worker      internal_function;
582*7304104dSAndroid Build Coastguard Worker 
583*7304104dSAndroid Build Coastguard Worker extern void * __libelf_decompress (int chtype, void *buf_in, size_t size_in,
584*7304104dSAndroid Build Coastguard Worker 				   size_t size_out) internal_function;
585*7304104dSAndroid Build Coastguard Worker extern void * __libelf_decompress_elf (Elf_Scn *scn,
586*7304104dSAndroid Build Coastguard Worker 				       size_t *size_out, size_t *addralign)
587*7304104dSAndroid Build Coastguard Worker      internal_function;
588*7304104dSAndroid Build Coastguard Worker 
589*7304104dSAndroid Build Coastguard Worker 
590*7304104dSAndroid Build Coastguard Worker extern void __libelf_reset_rawdata (Elf_Scn *scn, void *buf, size_t size,
591*7304104dSAndroid Build Coastguard Worker 				    size_t align, Elf_Type type)
592*7304104dSAndroid Build Coastguard Worker      internal_function;
593*7304104dSAndroid Build Coastguard Worker 
594*7304104dSAndroid Build Coastguard Worker 
595*7304104dSAndroid Build Coastguard Worker /* We often have to update a flag iff a value changed.  Make this
596*7304104dSAndroid Build Coastguard Worker    convenient.  */
597*7304104dSAndroid Build Coastguard Worker #define update_if_changed(var, exp, flag) \
598*7304104dSAndroid Build Coastguard Worker   do {									      \
599*7304104dSAndroid Build Coastguard Worker     __typeof__ (var) *_var = &(var);					      \
600*7304104dSAndroid Build Coastguard Worker     __typeof__ (exp) _exp = (exp);					      \
601*7304104dSAndroid Build Coastguard Worker     if (*_var != _exp)							      \
602*7304104dSAndroid Build Coastguard Worker       {									      \
603*7304104dSAndroid Build Coastguard Worker 	*_var = _exp;							      \
604*7304104dSAndroid Build Coastguard Worker 	(flag) |= ELF_F_DIRTY;						      \
605*7304104dSAndroid Build Coastguard Worker       }									      \
606*7304104dSAndroid Build Coastguard Worker   } while (0)
607*7304104dSAndroid Build Coastguard Worker 
608*7304104dSAndroid Build Coastguard Worker /* Align offset to 4 bytes as needed for note name and descriptor data.
609*7304104dSAndroid Build Coastguard Worker    This is almost always used, except for GNU Property notes, which use
610*7304104dSAndroid Build Coastguard Worker    8 byte padding...  */
611*7304104dSAndroid Build Coastguard Worker #define NOTE_ALIGN4(n)	(((n) + 3) & -4UL)
612*7304104dSAndroid Build Coastguard Worker 
613*7304104dSAndroid Build Coastguard Worker /* Special note padding rule for GNU Property notes.  */
614*7304104dSAndroid Build Coastguard Worker #define NOTE_ALIGN8(n)	(((n) + 7) & -8UL)
615*7304104dSAndroid Build Coastguard Worker 
616*7304104dSAndroid Build Coastguard Worker /* Convenience macro.  */
617*7304104dSAndroid Build Coastguard Worker #define INVALID_NDX(ndx, type, data) \
618*7304104dSAndroid Build Coastguard Worker   unlikely ((data)->d_size / sizeof (type) <= (unsigned int) (ndx))
619*7304104dSAndroid Build Coastguard Worker 
620*7304104dSAndroid Build Coastguard Worker #endif  /* libelfP.h */
621