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