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