1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Internal interfaces for libelf.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Copyright (C) 1998-2003, 2005, 2006, 2007 Red Hat, Inc.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Contributed by Ulrich Drepper <drepper@redhat.com>, 1998.
5441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   In addition, as a special exception, Red Hat, Inc. gives You the
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   additional right to link the code of Red Hat elfutils with code licensed
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   under any Open Source Initiative certified open source license
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   (http://www.opensource.org/licenses/index.php) which requires the
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribution of source code with any binary distribution and to
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribute linked combinations of the two.  Non-GPL Code permitted under
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this exception must only link to the code of Red Hat elfutils through
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   those well defined interfaces identified in the file named EXCEPTION
27cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   found in the source code files (the "Approved Interfaces").  The files
28cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   of Non-GPL Code may instantiate templates or use macros or inline
29cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   functions from the Approved Interfaces without causing the resulting
30cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   work to be covered by the GNU General Public License.  Only Red Hat,
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc. may make changes or additions to the list of Approved Interfaces.
32cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat's grant of this exception is conditioned upon your not adding
33cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   any new exceptions.  If you wish to add a new Approved Interface or
34cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception, please contact Red Hat.  You must obey the GNU General Public
35cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   License in all respects for all of the Red Hat elfutils code and other
36cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   code used in conjunction with Red Hat elfutils except the Non-GPL Code
37cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   covered by this exception.  If you modify this file, you may extend this
38cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception to your version of the file, but you are not obligated to do
39cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   so.  If you do not wish to provide this exception without modification,
40cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   you must delete this exception statement from your version and license
41cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this file solely under the GPL without exception.
42cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
43cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
44cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
45cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
46cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
47cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
48cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
49cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifndef _LIBELFP_H
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _LIBELFP_H 1
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
54cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#ifdef HAVE_CONFIG_H
55cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# include <config.h>
56cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
57cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <ar.h>
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <gelf.h>
60cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
61cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <errno.h>
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdint.h>
63cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <stdio.h>
64cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <string.h>
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* gettext helper macros.  */
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _(Str) dgettext ("libelf", Str)
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper Macros to write 32 bit and 64 bit functions.  */
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define __elfw2_(Bits, Name) __elf##Bits##_##Name
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define elfw2_(Bits, Name) elf##Bits##_##Name
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ElfW2_(Bits, Name) Elf##Bits##_##Name
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW2_(Bits, Name) ELF##Bits##_##Name
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW_(Name, Bits) Name##Bits
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define __elfw2(Bits, Name) __elfw2_(Bits, Name)
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define elfw2(Bits, Name) elfw2_(Bits, Name)
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ElfW2(Bits, Name) ElfW2_(Bits, Name)
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW2(Bits, Name) ELFW2_(Bits, Name)
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELFW(Name, Bits)  ELFW_(Name, Bits)
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Sizes of the external types, for 32 bits objects.  */
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_ADDR   4
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_OFF    4
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_HALF   2
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_WORD   4
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_SWORD  4
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_XWORD  8
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF32_FSZ_SXWORD 8
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Same for 64 bits objects.  */
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_ADDR   8
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_OFF    8
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_HALF   2
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_WORD   4
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_SWORD  4
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_XWORD  8
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ELF64_FSZ_SXWORD 8
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* This is an extension of the ELF_F_* enumeration.  The values here are
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   not part of the library interface, they are only used internally.  */
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_F_MMAPPED = 0x40,
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_F_MALLOCED = 0x80,
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_F_FILEDATA = 0x100
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get definition of all the external types.  */
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "exttypes.h"
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Error values.  */
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOERROR = 0,
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UNKNOWN_ERROR,
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UNKNOWN_VERSION,
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UNKNOWN_TYPE,
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_HANDLE,
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_SOURCE_SIZE,
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_DEST_SIZE,
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_ENCODING,
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOMEM,
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_FILE,
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_OP,
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_VERSION,
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_CMD,
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_RANGE,
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_ARCHIVE_FMAG,
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_ARCHIVE,
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_ARCHIVE,
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_INDEX,
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_READ_ERROR,
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_WRITE_ERROR,
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_CLASS,
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_INDEX,
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_OPERAND,
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_SECTION,
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_COMMAND,
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_WRONG_ORDER_EHDR,
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_FD_DISABLED,
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_FD_MISMATCH,
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_OFFSET_RANGE,
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOT_NUL_SECTION,
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_DATA_MISMATCH,
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_SECTION_HEADER,
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_DATA,
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_DATA_ENCODING,
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_SECTION_TOO_SMALL,
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_ALIGN,
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_SHENTSIZE,
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_UPDATE_RO,
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NOFILE,
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_GROUP_NOT_REL,
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_INVALID_PHDR,
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NO_PHDR,
161cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  ELF_E_INVALID_OFFSET,
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Keep this as the last entry.  */
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ELF_E_NUM
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The visible `Elf_Data' type is not sufficent for some operations due
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   to a misdesigned interface.  Extend it for internal purposes.  */
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data d;
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Scn *s;
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} Elf_Data_Scn;
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* List of `Elf_Data' descriptors.  This is what makes up the section
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   contents.  */
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct Elf_Data_List
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* `data' *must* be the first element in the struct.  */
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_Scn data;
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_Data_List *next;
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int flags;
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} Elf_Data_List;
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Descriptor for ELF section.  */
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Elf_Scn
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* We have to distinguish several different situations:
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     1. the section is user created.  Therefore there is no file or memory
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        region to read the data from.  Here we have two different subcases:
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
195441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        a) data was not yet added (before the first `elf_newdata' call)
196441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        b) at least one data set is available
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     2. this is a section from a file/memory region.  We have to read the
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        current content in one data block if we have to.  But we don't
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        read the data until it is necessary.  So we have the subcases:
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        a) the section in the file has size zero (for whatever reason)
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        b) the data of the file is not (yet) read
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project        c) the data is read and available.
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     In addition to this we have different data sets, the raw and the converted
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     data.  This distinction only exists for the data read from the file.
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     All user-added data set (all but the first when read from the file or
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     all of them for user-create sections) are the same in both formats.
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     We don't create the converted data before it is necessary.
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     The `data_read' element signals whether data is available in the
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     raw format.
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     If there is data from the file/memory region or if read one data
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     set is added the `rawdata_list_read' pointer in non-NULL and points
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     to the last filled data set.  `raw_datalist_rear' is therefore NULL
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     only if there is no data set at all.
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     This so far allows to distinguish all but two cases (given that the
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     `rawdata_list' and `data_list' entries are initialized to zero) is
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     between not yet loaded data from the file/memory region and a section
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     with zero size and type ELF_T_BYTE.   */
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_List data_list;	/* List of data buffers.  */
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_List *data_list_rear; /* Pointer to the rear of the data list. */
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data_Scn rawdata;		/* Uninterpreted data of the section.  */
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int data_read;		/* Nonzero if the section was created by the
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   user or if the data from the file/memory
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   is read.  */
235cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int shndx_index;		/* Index of the extended section index
236cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   table for this symbol table (if this
237cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   section is a symbol table).  */
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t index;			/* Index of this section.  */
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf *elf;		/* The underlying ELF file.  */
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf32_Shdr *e32;		/* Pointer to 32bit section header.  */
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf64_Shdr *e64;		/* Pointer to 64bit section header.  */
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } shdr;
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int shdr_flags;	/* Section header modified?  */
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int flags;		/* Section changed in size?  */
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char *rawdata_base;		/* The unmodified data of the section.  */
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char *data_base;		/* The converted data of the section.  */
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_ScnList *list;	/* Pointer the the section list element the
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   data is in.  */
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* List of section.  */
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct Elf_ScnList
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int cnt;		/* Number of elements of 'data' used.  */
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int max;		/* Number of elements of 'data' allocated.  */
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_ScnList *next;	/* Next block of sections.  */
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf_Scn data[0];	/* Section data.  */
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} Elf_ScnList;
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
269cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* elf_getdata_rawchunk result.  */
270cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtypedef struct Elf_Data_Chunk
271cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
272cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf_Data_Scn data;
273cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  union
274cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  {
275cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    Elf_Scn dummy_scn;
276cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    struct Elf_Data_Chunk *next;
277cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  };
278cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng} Elf_Data_Chunk;
279cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
280cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The ELF descriptor.  */
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Elf
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* What kind of file is underneath (ELF file, archive...).  */
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Kind kind;
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Command used to create this descriptor.  */
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Cmd cmd;
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The binary class.  */
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int class;
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The used file descriptor.  -1 if not available anymore.  */
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int fildes;
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Offset in the archive this file starts or zero.  */
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  off_t start_offset;
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Size of the file in the archive or the entire file size, or ~0
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     for an (yet) unknown size.  */
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t maximum_size;
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Address to which the file was mapped.  NULL if not mapped.  */
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *map_address;
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Describes the way the memory was allocated and if the dirty bit is
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     signalled it means that the whole file has to be rewritten since
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the layout changed.  */
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int flags;
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* When created for an archive member this points to the descriptor
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     for the archive. */
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf *parent;
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Lock to handle multithreaded programs.  */
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  rwlock_define (,lock);
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Reference counting for the descriptor.  */
319441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int ref_count;
320441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
321441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Elf *next;             /* Used in list of archive descriptors.  */
322441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
327441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int ehdr_flags;		/* Flags (dirty) for ELF header.  */
328441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
329441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
330441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
331441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      /* The next fields are only useful when testing for ==/!= NULL.  */
332441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      void *ehdr;
333441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      void *shdr;
334441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      void *phdr;
335441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
336441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList *scns_last;	/* Last element in the section list.
337441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   If NULL the data has not yet been
338441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   read from the file.  */
339cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results.  */
340441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int scnincr;	/* Number of sections allocate the last
341441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   time.  */
342441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off64_t sizestr_offset;	/* Offset of the size string in the parent
343441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   if this is an archive member.  */
344441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } elf;
345441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
346441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
347441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
348441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int ehdr_flags;		/* Flags (dirty) for ELF header.  */
349441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
350441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
351441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
352441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Ehdr *ehdr;		/* Pointer to the ELF header.  This is
353441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   never malloced.  */
354441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Shdr *shdr;		/* Used when reading from a file.  */
355441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Phdr *phdr;		/* Pointer to the program header array.  */
356441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList *scns_last;	/* Last element in the section list.
357441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   If NULL the data has not yet been
358441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   read from the file.  */
359cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results.  */
360441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int scnincr;	/* Number of sections allocate the last
361441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   time.  */
362441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off64_t sizestr_offset;	/* Offset of the size string in the parent
363441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   if this is an archive member.  */
364441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf32_Ehdr ehdr_mem;	/* Memory used for ELF header when not
365441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   mmaped.  */
366441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char __e32scnspad[sizeof (Elf64_Ehdr) - sizeof (Elf32_Ehdr)];
367441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
368441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      /* The section array.  */
369441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList scns;
370441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } elf32;
371441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
372441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
373441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
374441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int ehdr_flags;		/* Flags (dirty) for ELF header.  */
375441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int phdr_flags;		/* Flags (dirty|malloc) for program header.  */
376441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int shdr_malloced;	/* Nonzero if shdr array was allocated.  */
377441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
378441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Ehdr *ehdr;		/* Pointer to the ELF header.  This is
379441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   never malloced.  */
380441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Shdr *shdr;		/* Used when reading from a file.  */
381441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Phdr *phdr;		/* Pointer to the program header array.  */
382441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList *scns_last;	/* Last element in the section list.
383441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   If NULL the data has not yet been
384441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   read from the file.  */
385cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results.  */
386441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int scnincr;	/* Number of sections allocate the last
387441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   time.  */
388441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off64_t sizestr_offset;	/* Offset of the size string in the parent
389441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   if this is an archive member.  */
390441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf64_Ehdr ehdr_mem;	/* Memory used for ELF header when not
391441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   mmaped.  */
392441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
393441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      /* The section array.  */
394441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_ScnList scns;
395441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } elf64;
396441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
397441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
398441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
399441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int has_index;		/* Set when file has index.  0 means
400441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   undecided, > 0 means it has one.  */
401441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_Arsym *ar_sym;	/* Symbol table returned by elf_getarsym.  */
402441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      size_t ar_sym_num;	/* Number of entries in `ar_sym'.  */
403441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char *long_names;		/* If no index is available but long names
404441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   are used this elements points to the data.*/
405441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      size_t long_names_len;	/* Length of the long name table.  */
406441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      off_t offset;		/* Offset in file we are currently at.
407441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   elf_next() advances this to the next
408441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   member of the archive.  */
409441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_Arhdr elf_ar_hdr;	/* Structure returned by 'elf_getarhdr'.  */
410441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct ar_hdr ar_hdr;	/* Header read from file.  */
411441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char ar_name[16];		/* NUL terminated ar_name of elf_ar_hdr.  */
412441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char raw_name[17];	/* This is a buffer for the NUL terminated
413441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				   named raw_name used in the elf_ar_hdr.  */
414441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct Elf *children;	/* List of all descriptors for this archive. */
415441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } ar;
416441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } state;
417441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
418441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* There absolutely never must be anything following the union.  */
419441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
420441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
421441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Type of the conversion functions.  These functions will convert the
422441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   byte order.  */
423441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef void (*xfct_t) (void *, const void *, size_t, int);
424441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
425441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The table with the function pointers.  */
426441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const xfct_t __elf_xfctstom[EV_NUM - 1][EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
427441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const xfct_t __elf_xfctstof[EV_NUM - 1][EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
428441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
429441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
430441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Array with sizes of the external types indexed by ELF version, binary
431441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   class, and type. */
432441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const size_t __libelf_type_sizes[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
433441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* We often have to access the size for a type in the current version.  */
434441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#if EV_NUM != 2
435441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define elf_typesize(class,type,n) \
436441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  elfw2(class,fsize) (type, n, __libelf_version)
437441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#else
438441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define elf_typesize(class,type,n) \
439441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  (__libelf_type_sizes[EV_CURRENT - 1][ELFW(ELFCLASS,class) - 1][type] * n)
440441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
441441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
442441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Currently selected version of the ELF specification.  */
443441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned int __libelf_version attribute_hidden;
444441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
445441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The byte value used for filling gaps.  */
446441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_fill_byte attribute_hidden;
447441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
448441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Nonzero if the version was set.  */
449441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_version_initialized attribute_hidden;
450441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
451cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Index for __libelf_type_sizes et al.  */
452cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#if EV_NUM == 2
453cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# define LIBELF_EV_IDX	0
454cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#else
455cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# define LIBELF_EV_IDX	(__libelf_version - 1)
456cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
457cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
458cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#if !ALLOW_UNALIGNED
459cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Array with alignment requirements of the internal types indexed by ELF
460cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   version, binary class, and type. */
461cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
462cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# define __libelf_type_align(class, type)	\
463cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    (__libelf_type_aligns[LIBELF_EV_IDX][class - 1][type] ?: 1)
464cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#else
465cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# define __libelf_type_align(class, type)	1
466cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
467441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
468441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The libelf API does not have such a function but it is still useful.
469441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Get the memory size for the given type.
470441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
471441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   These functions cannot be marked internal since they are aliases
472441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   of the export elfXX_fsize functions.*/
473441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __elf32_msize (Elf_Type __type, size_t __count,
474441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			     unsigned int __version);
475441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __elf64_msize (Elf_Type __type, size_t __count,
476441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			     unsigned int __version);
477441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
478441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
479441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Create Elf descriptor from memory image.  */
480441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf *__libelf_read_mmaped_file (int fildes, void *map_address,
481441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				       off_t offset, size_t maxsize,
482441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				       Elf_Cmd cmd, Elf *parent)
483441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
484441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
485441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Set error value.  */
486441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void __libelf_seterrno (int value) internal_function;
487441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
488441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get the next archive header.  */
489cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libelf_next_arhdr_wrlock (Elf *elf) internal_function;
490441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
491441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Read all of the file associated with the descriptor.  */
492441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern char *__libelf_readall (Elf *elf) internal_function;
493441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
494441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Read the complete section table and convert the byte order if necessary.  */
495441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_readsections (Elf *elf) internal_function;
496441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
497441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Store the information for the raw data in the `rawdata_list' element.  */
498441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __libelf_set_rawdata (Elf_Scn *scn) internal_function;
499cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libelf_set_rawdata_wrlock (Elf_Scn *scn) internal_function;
500441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
501441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
502441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper functions for elf_update.  */
503cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern off_t __elf32_updatenull_wrlock (Elf *elf, int *change_bop,
504cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					size_t shnum) internal_function;
505cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern off_t __elf64_updatenull_wrlock (Elf *elf, int *change_bop,
506cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					size_t shnum) internal_function;
507441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
508441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf32_updatemmap (Elf *elf, int change_bo, size_t shnum)
509441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
510441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf64_updatemmap (Elf *elf, int change_bo, size_t shnum)
511441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
512441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf32_updatefile (Elf *elf, int change_bo, size_t shnum)
513441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
514441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf64_updatefile (Elf *elf, int change_bo, size_t shnum)
515441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     internal_function;
516441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
517441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
518cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Alias for exported functions to avoid PLT entries, and
519cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   rdlock/wrlock variants of these functions.  */
520cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __elf_end_internal (Elf *__elf) attribute_hidden;
521441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf *__elf_begin_internal (int __fildes, Elf_Cmd __cmd, Elf *__ref)
522441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
523cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf32_Ehdr *__elf32_getehdr_wrlock (Elf *__elf) internal_function;
524cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf64_Ehdr *__elf64_getehdr_wrlock (Elf *__elf) internal_function;
525441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Ehdr *__elf32_newehdr_internal (Elf *__elf) attribute_hidden;
526441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Ehdr *__elf64_newehdr_internal (Elf *__elf) attribute_hidden;
527441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Phdr *__elf32_getphdr_internal (Elf *__elf) attribute_hidden;
528441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Phdr *__elf64_getphdr_internal (Elf *__elf) attribute_hidden;
529cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf32_Phdr *__elf32_getphdr_wrlock (Elf *__elf) attribute_hidden;
530cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf64_Phdr *__elf64_getphdr_wrlock (Elf *__elf) attribute_hidden;
531441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf32_Phdr *__elf32_newphdr_internal (Elf *__elf, size_t __cnt)
532441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
533441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf64_Phdr *__elf64_newphdr_internal (Elf *__elf, size_t __cnt)
534441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
535cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf_Scn *__elf32_offscn_internal (Elf *__elf, Elf32_Off __offset)
536cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  attribute_hidden;
537cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf_Scn *__elf64_offscn_internal (Elf *__elf, Elf64_Off __offset)
538cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  attribute_hidden;
539cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __elf_getshnum_rdlock (Elf *__elf, size_t *__dst) internal_function;
540441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int __elf_getshstrndx_internal (Elf *__elf, size_t *__dst)
541441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
542cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf32_Shdr *__elf32_getshdr_rdlock (Elf_Scn *__scn) internal_function;
543cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf64_Shdr *__elf64_getshdr_rdlock (Elf_Scn *__scn) internal_function;
544cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf32_Shdr *__elf32_getshdr_wrlock (Elf_Scn *__scn) internal_function;
545cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf64_Shdr *__elf64_getshdr_wrlock (Elf_Scn *__scn) internal_function;
546441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Scn *__elf_getscn_internal (Elf *__elf, size_t __index)
547441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
548441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Scn *__elf_nextscn_internal (Elf *__elf, Elf_Scn *__scn)
549441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
550cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __elf_scnshndx_internal (Elf_Scn *__scn) attribute_hidden;
551441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf_getdata_internal (Elf_Scn *__scn, Elf_Data *__data)
552441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
553cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf_Data *__elf_getdata_rdlock (Elf_Scn *__scn, Elf_Data *__data)
554cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     internal_function;
555441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf_rawdata_internal (Elf_Scn *__scn, Elf_Data *__data)
556441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
557441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern char *__elf_strptr_internal (Elf *__elf, size_t __index,
558441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    size_t __offset) attribute_hidden;
559441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf32_xlatetom_internal (Elf_Data *__dest,
560441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
561441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
562441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
563441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf64_xlatetom_internal (Elf_Data *__dest,
564441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
565441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
566441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
567441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf32_xlatetof_internal (Elf_Data *__dest,
568441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
569441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
570441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
571441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Elf_Data *__elf64_xlatetof_internal (Elf_Data *__dest,
572441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    const Elf_Data *__src,
573441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    unsigned int __encode)
574441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
575441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned int __elf_version_internal (unsigned int __version)
576441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
577441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned long int __elf_hash_internal (const char *__string)
578441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       __attribute__ ((__pure__, visibility ("hidden")));
579441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern long int __elf32_checksum_internal (Elf *__elf) attribute_hidden;
580441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern long int __elf64_checksum_internal (Elf *__elf) attribute_hidden;
581441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
582441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
583cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern GElf_Ehdr *__gelf_getehdr_rdlock (Elf *__elf, GElf_Ehdr *__dest)
584cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     internal_function;
585441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __gelf_fsize_internal (Elf *__elf, Elf_Type __type,
586441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				     size_t __count, unsigned int __version)
587441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
588441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern GElf_Shdr *__gelf_getshdr_internal (Elf_Scn *__scn, GElf_Shdr *__dst)
589441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
590441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern GElf_Sym *__gelf_getsym_internal (Elf_Data *__data, int __ndx,
591441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 GElf_Sym *__dst) attribute_hidden;
592441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
593441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
594441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern uint32_t __libelf_crc32 (uint32_t crc, unsigned char *buf, size_t len)
595441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     attribute_hidden;
596441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
597441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
598441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* We often have to update a flag iff a value changed.  Make this
599cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   convenient.  */
600cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define update_if_changed(var, exp, flag) \
601441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  do {									      \
602441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    __typeof__ (var) *_var = &(var);					      \
603441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    __typeof__ (exp) _exp = (exp);					      \
604441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    if (*_var != _exp)							      \
605441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      {									      \
606441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	*_var = _exp;							      \
607441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	(flag) |= ELF_F_DIRTY;						      \
608441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      }									      \
609441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } while (0)
610cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
611cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Align offset to 4 bytes as needed for note name and descriptor data.  */
612cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define NOTE_ALIGN(n)	(((n) + 3) & -4U)
613441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
614441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif  /* libelfP.h */
615