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