Home | History | Annotate | Download | only in apriori
      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