diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:28:42 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:28:42 -0800 |
commit | 88b607994a148f4af5bffee163e39ce8296750c6 (patch) | |
tree | fa249ff843e976cf034f2029437d3362a8396321 /tools/apriori/source.h | |
parent | 05806d7af62e07c6225b2e7103a1b115ecf6c9ad (diff) | |
download | build-88b607994a148f4af5bffee163e39ce8296750c6.zip build-88b607994a148f4af5bffee163e39ce8296750c6.tar.gz build-88b607994a148f4af5bffee163e39ce8296750c6.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'tools/apriori/source.h')
-rw-r--r-- | tools/apriori/source.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/tools/apriori/source.h b/tools/apriori/source.h new file mode 100644 index 0000000..a5d96bd --- /dev/null +++ b/tools/apriori/source.h @@ -0,0 +1,121 @@ +#ifndef SOURCE_H +#define SOURCE_H + +#include <sys/types.h> +#include <sys/stat.h> +#include <libelf.h> +#include <libebl.h> +#ifdef ARM_SPECIFIC_HACKS + #include <libebl_arm.h> +#endif/*ARM_SPECIFIC_HACKS*/ +#include <elf.h> +#include <gelf.h> +#include <rangesort.h> +#include <elfcopy.h> + +typedef struct source_t source_t; + +typedef struct { + Elf_Scn *scn; + GElf_Shdr shdr; + Elf_Data *data; + shdr_info_t *info; +} section_info_t; + +typedef struct { + GElf_Rel *rels; + int num_rels; /* number of relocations that were not finished */ + int rels_size; /* this is the size of rels[], NOT the number of rels! */ +} unfinished_relocation_t; + +typedef struct { + int processed; + size_t idx; /* index of DT entry in the .dynamic section, if entry has a ptr value */ + Elf64_Addr addr; /* if DT entry's value is an address, we save it here */ + size_t sz_idx; /* index of DT entry in the .dynamic section, if entry has a size value */ + Elf64_Xword size; /* if DT entry's value is a size, we save it here */ + + range_list_t *sections; /* list of sections corresponding to this entry */ + int num_unfinished_relocs; /* this variables is populated by adjust_dynamic_segment_for() + during the second pass of the prelinker */ +} dt_rel_info_t; + +struct source_t { + source_t *next; + + char *name; /* full path name of this executable file */ + char *output; /* name of the output file or directory */ + int output_is_dir; /* nonzero if output is a directory, 0 if output is a file */ + /* ELF-related information: */ + Elf *oldelf; + Elf *elf; + /* info[] is an array of structures describing the sections of the new ELF + file. We populate the info[] array in clone_elf(), and use it to + adjust the size of the ELF file when we modify the relocation-entry + section. + */ + shdr_info_t *shdr_info; + GElf_Ehdr old_ehdr_mem; /* store ELF header of original library */ + GElf_Ehdr ehdr_mem; /* store ELF header of new library */ + GElf_Phdr *phdr_info; + Ebl *ebl; + Elf_Data *shstrtab_data; + int elf_fd; + int newelf_fd; /* fd of output file, -1 if output == NULL */ + struct stat elf_file_info; + GElf_Ehdr elf_hdr, oldelf_hdr; + size_t shstrndx; + int shnum; /* number of sections */ + int dry_run; /* 0 if we do not update the files, 1 (default) otherwise */ + + section_info_t symtab; + section_info_t strtab; + section_info_t dynamic; + section_info_t hash; + section_info_t bss; + + range_list_t *sorted_sections; + + section_info_t *relocation_sections; /* relocation sections in file */ + int num_relocation_sections; /* number of relocation sections (<= relocation_sections_size) */ + int relocation_sections_size; /* sice of array -- NOT number of relocs! */ + + /* relocation sections that contain relocations that could not be handled. + This array is parallel to relocation_sections, and for each entry + in that array, it contains a list of relocations that could not be + handled. + */ + unfinished_relocation_t *unfinished; + + /* The sections field of these two structuer contains a list of elements + of the member variable relocations. */ + dt_rel_info_t rel; + dt_rel_info_t jmprel; + + int num_syms; /* number of symbols in symbol table. This is the length of + both exports[] and satisfied[] arrays. */ + + /* This is an array that contains one element for each library dependency + listed in the executable or shared library. */ + source_t **lib_deps; /* list of library dependencies */ + int num_lib_deps; /* actual number of library dependencies */ + int lib_deps_size; /* size of lib_deps array--NOT actual number of deps! */ + + /* This is zero for executables. For shared libraries, it is the address + at which the library was prelinked. */ + unsigned base; +#ifdef SUPPORT_ANDROID_PRELINK_TAGS + /* When we read in a file, if it has the prelinked tag, we set prelinked + to 1 and the prelink address in the tag to prelink_base. This address + must match the value of base that we choose. */ + int prelinked; + long prelink_base; /* valid if prelinked != 0 */ +#endif/*SUPPORT_ANDROID_PRELINK_TAGS*/ +}; + +extern void find_section(source_t *source, Elf64_Addr address, + Elf_Scn **scn, + GElf_Shdr *shdr, + Elf_Data **data); + +#endif/*SOURCE_H*/ |