1 #ifndef SOURCE_H 2 #define SOURCE_H 3 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <libelf.h> 7 #include <libebl.h> 8 #ifdef ARM_SPECIFIC_HACKS 9 #include <libebl_arm.h> 10 #endif/*ARM_SPECIFIC_HACKS*/ 11 #include <elf.h> 12 #include <gelf.h> 13 #include <rangesort.h> 14 #include <elfcopy.h> 15 16 typedef struct source_t source_t; 17 18 typedef struct { 19 Elf_Scn *scn; 20 GElf_Shdr shdr; 21 Elf_Data *data; 22 shdr_info_t *info; 23 } section_info_t; 24 25 typedef struct { 26 GElf_Rel *rels; 27 int num_rels; /* number of relocations that were not finished */ 28 int rels_size; /* this is the size of rels[], NOT the number of rels! */ 29 } unfinished_relocation_t; 30 31 typedef struct { 32 int processed; 33 size_t idx; /* index of DT entry in the .dynamic section, if entry has a ptr value */ 34 Elf64_Addr addr; /* if DT entry's value is an address, we save it here */ 35 size_t sz_idx; /* index of DT entry in the .dynamic section, if entry has a size value */ 36 Elf64_Xword size; /* if DT entry's value is a size, we save it here */ 37 38 range_list_t *sections; /* list of sections corresponding to this entry */ 39 int num_unfinished_relocs; /* this variables is populated by adjust_dynamic_segment_for() 40 during the second pass of the prelinker */ 41 } dt_rel_info_t; 42 43 struct source_t { 44 source_t *next; 45 46 char *name; /* full path name of this executable file */ 47 char *output; /* name of the output file or directory */ 48 int output_is_dir; /* nonzero if output is a directory, 0 if output is a file */ 49 /* ELF-related information: */ 50 Elf *oldelf; 51 Elf *elf; 52 /* info[] is an array of structures describing the sections of the new ELF 53 file. We populate the info[] array in clone_elf(), and use it to 54 adjust the size of the ELF file when we modify the relocation-entry 55 section. 56 */ 57 shdr_info_t *shdr_info; 58 GElf_Ehdr old_ehdr_mem; /* store ELF header of original library */ 59 GElf_Ehdr ehdr_mem; /* store ELF header of new library */ 60 GElf_Phdr *phdr_info; 61 Ebl *ebl; 62 Elf_Data *shstrtab_data; 63 int elf_fd; 64 int newelf_fd; /* fd of output file, -1 if output == NULL */ 65 struct stat elf_file_info; 66 GElf_Ehdr elf_hdr, oldelf_hdr; 67 size_t shstrndx; 68 int shnum; /* number of sections */ 69 int dry_run; /* 0 if we do not update the files, 1 (default) otherwise */ 70 71 section_info_t symtab; 72 section_info_t strtab; 73 section_info_t dynamic; 74 section_info_t hash; 75 section_info_t bss; 76 77 range_list_t *sorted_sections; 78 79 section_info_t *relocation_sections; /* relocation sections in file */ 80 int num_relocation_sections; /* number of relocation sections (<= relocation_sections_size) */ 81 int relocation_sections_size; /* sice of array -- NOT number of relocs! */ 82 83 /* relocation sections that contain relocations that could not be handled. 84 This array is parallel to relocation_sections, and for each entry 85 in that array, it contains a list of relocations that could not be 86 handled. 87 */ 88 unfinished_relocation_t *unfinished; 89 90 /* The sections field of these two structuer contains a list of elements 91 of the member variable relocations. */ 92 dt_rel_info_t rel; 93 dt_rel_info_t jmprel; 94 95 int num_syms; /* number of symbols in symbol table. This is the length of 96 both exports[] and satisfied[] arrays. */ 97 98 /* This is an array that contains one element for each library dependency 99 listed in the executable or shared library. */ 100 source_t **lib_deps; /* list of library dependencies */ 101 int num_lib_deps; /* actual number of library dependencies */ 102 int lib_deps_size; /* size of lib_deps array--NOT actual number of deps! */ 103 104 /* This is zero for executables. For shared libraries, it is the address 105 at which the library was prelinked. */ 106 unsigned base; 107 #ifdef SUPPORT_ANDROID_PRELINK_TAGS 108 /* When we read in a file, if it has the prelinked tag, we set prelinked 109 to 1 and the prelink address in the tag to prelink_base. This address 110 must match the value of base that we choose. */ 111 int prelinked; 112 long prelink_base; /* valid if prelinked != 0 */ 113 #endif/*SUPPORT_ANDROID_PRELINK_TAGS*/ 114 }; 115 116 extern void find_section(source_t *source, Elf64_Addr address, 117 Elf_Scn **scn, 118 GElf_Shdr *shdr, 119 Elf_Data **data); 120 121 #endif/*SOURCE_H*/ 122