1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Internal interfaces for libelf.
2441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.
3441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Contributed by Ulrich Drepper <drepper@redhat.com>, 1998.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
5441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   This program is free software; you can redistribute it and/or modify
6441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   it under the terms of the GNU General Public License as published by
7441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   the Free Software Foundation, version 2.
8441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
9441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   This program is distributed in the hope that it will be useful,
10441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
11441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   GNU General Public License for more details.
13441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
14441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   You should have received a copy of the GNU General Public License
15441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   along with this program; if not, write to the Free Software Foundation,
16441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
18441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifndef _LIBELFP_H
19441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _LIBELFP_H 1
20441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
21441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <ar.h>
22441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <gelf.h>
23441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdint.h>
24441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
25441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* gettext helper macros.  */
26441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _(Str) dgettext ("libelf", Str)
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper Macros to write 32 bit and 64 bit functions.  */
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define __elfw2_(Bits, Name) __elf##Bits##_##Name
31441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define elfw2_(Bits, Name) elf##Bits##_##Name
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ElfW2_(Bits, Name) Elf##Bits##_##Name
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW2_(Bits, Name) ELF##Bits##_##Name
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW_(Name, Bits) Name##Bits
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define __elfw2(Bits, Name) __elfw2_(Bits, Name)
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define elfw2(Bits, Name) elfw2_(Bits, Name)
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ElfW2(Bits, Name) ElfW2_(Bits, Name)
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW2(Bits, Name) ELFW2_(Bits, Name)
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW(Name, Bits)  ELFW_(Name, Bits)
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Sizes of the external types, for 32 bits objects.  */
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_ADDR   4
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_OFF    4
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_HALF   2
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_WORD   4
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_SWORD  4
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_XWORD  8
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_SXWORD 8
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Same for 64 bits objects.  */
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_ADDR   8
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_OFF    8
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_HALF   2
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_WORD   4
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_SWORD  4
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_XWORD  8
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_SXWORD 8
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* This is an extension of the ELF_F_* enumeration.  The values here are
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   not part of the library interface, they are only used internally.  */
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_F_MMAPPED = 0x40,
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_F_MALLOCED = 0x80,
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_F_FILEDATA = 0x100
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get definition of all the external types.  */
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "exttypes.h"
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Error values.  */
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOERROR = 0,
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UNKNOWN_ERROR,
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UNKNOWN_VERSION,
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UNKNOWN_TYPE,
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_HANDLE,
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_SOURCE_SIZE,
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_DEST_SIZE,
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_ENCODING,
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOMEM,
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_FILE,
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_OP,
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_VERSION,
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_CMD,
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_RANGE,
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_ARCHIVE_FMAG,
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_ARCHIVE,
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_ARCHIVE,
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_INDEX,
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_READ_ERROR,
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_WRITE_ERROR,
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_CLASS,
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_INDEX,
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_OPERAND,
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_SECTION,
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_COMMAND,
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_WRONG_ORDER_EHDR,
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_FD_DISABLED,
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_FD_MISMATCH,
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_OFFSET_RANGE,
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOT_NUL_SECTION,
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_DATA_MISMATCH,
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_SECTION_HEADER,
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_DATA,
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_DATA_ENCODING,
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_SECTION_TOO_SMALL,
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_ALIGN,
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_SHENTSIZE,
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UPDATE_RO,
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOFILE,
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_GROUP_NOT_REL,
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_PHDR,
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_PHDR,
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Keep this as the last entry.  */
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NUM
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The visible `Elf_Data' type is not sufficent for some operations due
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   to a misdesigned interface.  Extend it for internal purposes.  */
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data d;
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Scn *s;
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} Elf_Data_Scn;
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* List of `Elf_Data' descriptors.  This is what makes up the section
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   contents.  */
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct Elf_Data_List
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* `data' *must* be the first element in the struct.  */
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_Scn data;
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_Data_List *next;
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int flags;
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} Elf_Data_List;
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Descriptor for ELF section.  */
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Elf_Scn
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* We have to distinguish several different situations:
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     1. the section is user created.  Therefore there is no file or memory
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        region to read the data from.  Here we have two different subcases:
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        a) data was not yet added (before the first `elf_newdata' call)
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        b) at least one data set is available
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     2. this is a section from a file/memory region.  We have to read the
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        current content in one data block if we have to.  But we don't
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        read the data until it is necessary.  So we have the subcases:
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        a) the section in the file has size zero (for whatever reason)
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        b) the data of the file is not (yet) read
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        c) the data is read and available.
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     In addition to this we have different data sets, the raw and the converted
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     data.  This distinction only exists for the data read from the file.
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     All user-added data set (all but the first when read from the file or
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     all of them for user-create sections) are the same in both formats.
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     We don't create the converted data before it is necessary.
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     The `data_read' element signals whether data is available in the
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     raw format.
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     If there is data from the file/memory region or if read one data
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     set is added the `rawdata_list_read' pointer in non-NULL and points
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     to the last filled data set.  `raw_datalist_rear' is therefore NULL
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     only if there is no data set at all.
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     This so far allows to distinguish all but two cases (given that the
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     `rawdata_list' and `data_list' entries are initialized to zero) is
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     between not yet loaded data from the file/memory region and a section
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     with zero size and type ELF_T_BYTE.   */
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_List data_list;	/* List of data buffers.  */
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_List *data_list_rear; /* Pointer to the rear of the data list. */
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_Scn rawdata;		/* Uninterpreted data of the section.  */
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int data_read;		/* Nonzero if the section was created by the
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   user or if the data from the file/memory
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   is read.  */
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t index;			/* Index of this section.  */
195441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf *elf;		/* The underlying ELF file.  */
196441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf32_Shdr *e32;		/* Pointer to 32bit section header.  */
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf64_Shdr *e64;		/* Pointer to 64bit section header.  */
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } shdr;
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int shdr_flags;	/* Section header modified?  */
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int flags;		/* Section changed in size?  */
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char *rawdata_base;		/* The unmodified data of the section.  */
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char *data_base;		/* The converted data of the section.  */
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_ScnList *list;	/* Pointer the the section list element the
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   data is in.  */
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* List of section.  */
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct Elf_ScnList
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int cnt;		/* Number of elements of 'data' used.  */
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int max;		/* Number of elements of 'data' allocated.  */
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_ScnList *next;	/* Next block of sections.  */
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_Scn data[0];	/* Section data.  */
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} Elf_ScnList;
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The ELF descriptor.  */
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Elf
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* What kind of file is underneath (ELF file, archive...).  */
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Kind kind;
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Command used to create this descriptor.  */
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Cmd cmd;
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The binary class.  */
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int class;
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The used file descriptor.  -1 if not available anymore.  */
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int fildes;
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Offset in the archive this file starts or zero.  */
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  off_t start_offset;
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Size of the file in the archive or the entire file size, or ~0
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     for an (yet) unknown size.  */
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t maximum_size;
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Address to which the file was mapped.  NULL if not mapped.  */
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *map_address;
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Describes the way the memory was allocated and if the dirty bit is
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     signalled it means that the whole file has to be rewritten since
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the layout changed.  */
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int flags;
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* When created for an archive member this points to the descriptor
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     for the archive. */
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf *parent;
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Lock to handle multithreaded programs.  */
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  rwlock_define (,lock);
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Reference counting for the descriptor.  */
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int ref_count;
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf *next;             /* Used in list of archive descriptors.  */
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int ehdr_flags;		/* Flags (dirty) for ELF header.  */
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      /* The next fields are only useful when testing for ==/!= NULL.  */
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      void *ehdr;
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      void *shdr;
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      void *phdr;
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList *scns_last;	/* Last element in the section list.
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   If NULL the data has not yet been
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   read from the file.  */
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int scnincr;	/* Number of sections allocate the last
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   time.  */
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off64_t sizestr_offset;	/* Offset of the size string in the parent
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   if this is an archive member.  */
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } elf;
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int ehdr_flags;		/* Flags (dirty) for ELF header.  */
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Ehdr *ehdr;		/* Pointer to the ELF header.  This is
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   never malloced.  */
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Shdr *shdr;		/* Used when reading from a file.  */
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Phdr *phdr;		/* Pointer to the program header array.  */
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList *scns_last;	/* Last element in the section list.
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   If NULL the data has not yet been
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   read from the file.  */
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int scnincr;	/* Number of sections allocate the last
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   time.  */
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off64_t sizestr_offset;	/* Offset of the size string in the parent
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   if this is an archive member.  */
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Ehdr ehdr_mem;	/* Memory used for ELF header when not
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   mmaped.  */
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char __e32scnspad[sizeof (Elf64_Ehdr) - sizeof (Elf32_Ehdr)];
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      /* The section array.  */
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList scns;
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } elf32;
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int ehdr_flags;		/* Flags (dirty) for ELF header.  */
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
319441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Ehdr *ehdr;		/* Pointer to the ELF header.  This is
320441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   never malloced.  */
321441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Shdr *shdr;		/* Used when reading from a file.  */
322441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Phdr *phdr;		/* Pointer to the program header array.  */
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList *scns_last;	/* Last element in the section list.
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   If NULL the data has not yet been
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   read from the file.  */
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int scnincr;	/* Number of sections allocate the last
327441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   time.  */
328441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off64_t sizestr_offset;	/* Offset of the size string in the parent
329441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   if this is an archive member.  */
330441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Ehdr ehdr_mem;	/* Memory used for ELF header when not
331441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   mmaped.  */
332441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
333441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      /* The section array.  */
334441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList scns;
335441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } elf64;
336441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
337441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
338441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
339441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int has_index;		/* Set when file has index.  0 means
340441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   undecided, > 0 means it has one.  */
341441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_Arsym *ar_sym;	/* Symbol table returned by elf_getarsym.  */
342441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      size_t ar_sym_num;	/* Number of entries in `ar_sym'.  */
343441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char *long_names;		/* If no index is available but long names
344441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   are used this elements points to the data.*/
345441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      size_t long_names_len;	/* Length of the long name table.  */
346441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off_t offset;		/* Offset in file we are currently at.
347441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   elf_next() advances this to the next
348441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   member of the archive.  */
349441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_Arhdr elf_ar_hdr;	/* Structure returned by 'elf_getarhdr'.  */
350441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct ar_hdr ar_hdr;	/* Header read from file.  */
351441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char ar_name[16];		/* NUL terminated ar_name of elf_ar_hdr.  */
352441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char raw_name[17];	/* This is a buffer for the NUL terminated
353441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   named raw_name used in the elf_ar_hdr.  */
354441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct Elf *children;	/* List of all descriptors for this archive. */
355441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } ar;
356441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } state;
357441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
358441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* There absolutely never must be anything following the union.  */
359441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
360441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
361441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
362441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Type of the conversion functions.  These functions will convert the
363441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   byte order.  */
364441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef void (*xfct_t) (void *, const void *, size_t, int);
365441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
366441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The table with the function pointers.  */
367441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const xfct_t __elf_xfctstom[EV_NUM - 1][EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
368441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const xfct_t __elf_xfctstof[EV_NUM - 1][EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
369441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
370441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
371441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Array with sizes of the external types indexed by ELF version, binary
372441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   class, and type. */
373441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const size_t __libelf_type_sizes[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
374441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* We often have to access the size for a type in the current version.  */
375441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#if EV_NUM != 2
376441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define elf_typesize(class,type,n) \
377441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  elfw2(class,fsize) (type, n, __libelf_version)
378441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#else
379441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define elf_typesize(class,type,n) \
380441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  (__libelf_type_sizes[EV_CURRENT - 1][ELFW(ELFCLASS,class) - 1][type] * n)
381441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
382441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
383441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Currently selected version of the ELF specification.  */
384441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned int __libelf_version attribute_hidden;
385441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
386441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The byte value used for filling gaps.  */
387441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_fill_byte attribute_hidden;
388441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
389441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Nonzero if the version was set.  */
390441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_version_initialized attribute_hidden;
391441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
392441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
393441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The libelf API does not have such a function but it is still useful.
394441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Get the memory size for the given type.
395441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
396441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   These functions cannot be marked internal since they are aliases
397441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   of the export elfXX_fsize functions.*/
398441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __elf32_msize (Elf_Type __type, size_t __count,
399441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			     unsigned int __version);
400441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __elf64_msize (Elf_Type __type, size_t __count,
401441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			     unsigned int __version);
402441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
403441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
404441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Create Elf descriptor from memory image.  */
405441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf *__libelf_read_mmaped_file (int fildes, void *map_address,
406441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				       off_t offset, size_t maxsize,
407441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				       Elf_Cmd cmd, Elf *parent)
408441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
409441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
410441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Set error value.  */
411441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void __libelf_seterrno (int value) internal_function;
412441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
413441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get the next archive header.  */
414441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_next_arhdr (Elf *elf) internal_function;
415441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
416441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Read all of the file associated with the descriptor.  */
417441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern char *__libelf_readall (Elf *elf) internal_function;
418441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
419441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Read the complete section table and convert the byte order if necessary.  */
420441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_readsections (Elf *elf) internal_function;
421441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
422441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Store the information for the raw data in the `rawdata_list' element.  */
423441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_set_rawdata (Elf_Scn *scn) internal_function;
424441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
425441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
426441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper functions for elf_update.  */
427441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern off_t __elf32_updatenull (Elf *elf, int *change_bop, size_t shnum)
428441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
429441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern off_t __elf64_updatenull (Elf *elf, int *change_bop, size_t shnum)
430441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
431441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
432441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf32_updatemmap (Elf *elf, int change_bo, size_t shnum)
433441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
434441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf64_updatemmap (Elf *elf, int change_bo, size_t shnum)
435441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
436441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf32_updatefile (Elf *elf, int change_bo, size_t shnum)
437441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
438441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf64_updatefile (Elf *elf, int change_bo, size_t shnum)
439441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
440441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
441441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
442441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Alias for exported functions to avoid PLT entries.  */
443441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf *__elf_begin_internal (int __fildes, Elf_Cmd __cmd, Elf *__ref)
444441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
445441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Ehdr *__elf32_getehdr_internal (Elf *__elf) attribute_hidden;
446441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Ehdr *__elf64_getehdr_internal (Elf *__elf) attribute_hidden;
447441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Ehdr *__elf32_newehdr_internal (Elf *__elf) attribute_hidden;
448441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Ehdr *__elf64_newehdr_internal (Elf *__elf) attribute_hidden;
449441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Phdr *__elf32_getphdr_internal (Elf *__elf) attribute_hidden;
450441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Phdr *__elf64_getphdr_internal (Elf *__elf) attribute_hidden;
451441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Phdr *__elf32_newphdr_internal (Elf *__elf, size_t __cnt)
452441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
453441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Phdr *__elf64_newphdr_internal (Elf *__elf, size_t __cnt)
454441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
455441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf_getshnum_internal (Elf *__elf, size_t *__dst)
456441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
457441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf_getshstrndx_internal (Elf *__elf, size_t *__dst)
458441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
459441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Shdr *__elf32_getshdr_internal (Elf_Scn *__scn) attribute_hidden;
460441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Shdr *__elf64_getshdr_internal (Elf_Scn *__scn) attribute_hidden;
461441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Scn *__elf_getscn_internal (Elf *__elf, size_t __index)
462441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
463441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Scn *__elf_nextscn_internal (Elf *__elf, Elf_Scn *__scn)
464441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
465441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf_getdata_internal (Elf_Scn *__scn, Elf_Data *__data)
466441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
467441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf_rawdata_internal (Elf_Scn *__scn, Elf_Data *__data)
468441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
469441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern char *__elf_strptr_internal (Elf *__elf, size_t __index,
470441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    size_t __offset) attribute_hidden;
471441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf32_xlatetom_internal (Elf_Data *__dest,
472441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
473441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
474441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
475441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf64_xlatetom_internal (Elf_Data *__dest,
476441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
477441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
478441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
479441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf32_xlatetof_internal (Elf_Data *__dest,
480441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
481441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
482441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
483441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf64_xlatetof_internal (Elf_Data *__dest,
484441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
485441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
486441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
487441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned int __elf_version_internal (unsigned int __version)
488441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
489441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned long int __elf_hash_internal (const char *__string)
490441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       __attribute__ ((__pure__, visibility ("hidden")));
491441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern long int __elf32_checksum_internal (Elf *__elf) attribute_hidden;
492441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern long int __elf64_checksum_internal (Elf *__elf) attribute_hidden;
493441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
494441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
495441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __gelf_fsize_internal (Elf *__elf, Elf_Type __type,
496441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				     size_t __count, unsigned int __version)
497441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
498441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern GElf_Shdr *__gelf_getshdr_internal (Elf_Scn *__scn, GElf_Shdr *__dst)
499441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
500441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern GElf_Sym *__gelf_getsym_internal (Elf_Data *__data, int __ndx,
501441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 GElf_Sym *__dst) attribute_hidden;
502441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
503441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
504441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern uint32_t __libelf_crc32 (uint32_t crc, unsigned char *buf, size_t len)
505441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
506441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
507441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
508441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* We often have to update a flag iff a value changed.  Make this
509441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   convenient.  None of the parameters must have a side effect.  */
510441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifdef __GNUC__
511441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define update_if_changed(var, exp, flag) \
512441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  do {									      \
513441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    __typeof__ (var) *_var = &(var);					      \
514441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    __typeof__ (exp) _exp = (exp);					      \
515441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    if (*_var != _exp)							      \
516441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      {									      \
517441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	*_var = _exp;							      \
518441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	(flag) |= ELF_F_DIRTY;						      \
519441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      }									      \
520441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } while (0)
521441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#else
522441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define update_if_changed(var, exp, flag) \
523441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  do {									      \
524441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    if ((var) != (exp))							      \
525441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      {									      \
526441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	(var) = (exp);							      \
527441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	(flag) |= ELF_F_DIRTY;						      \
528441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      }									      \
529441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } while (0)
530441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
531441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
532441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif  /* libelfP.h */
533