diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
commit | 130444ec10d2a40e2b3ede4863ab005aa1f4580c (patch) | |
tree | 435b158b8046565c2275e527e1d5bfedbcb3d3b8 /elfcopy.h | |
download | elfcopy-130444ec10d2a40e2b3ede4863ab005aa1f4580c.tar.gz |
Initial Contributionandroid-1.0release-1.0cdma-import
Diffstat (limited to 'elfcopy.h')
-rw-r--r-- | elfcopy.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/elfcopy.h b/elfcopy.h new file mode 100644 index 0000000..df448a5 --- /dev/null +++ b/elfcopy.h @@ -0,0 +1,94 @@ +#ifndef ELFCOPY_H +#define ELFCOPY_H + +#include <libelf.h> +#include <libebl.h> +#include <elf.h> +#include <gelf.h> + +typedef struct shdr_info_t { + /* data from original file: */ + Elf_Scn *scn; /* original section */ + /* Original-section header. */ + GElf_Shdr old_shdr; + /* Starts out as the original header, but we modify this variable when we + compose the new section information. */ + GElf_Shdr shdr; + /* This oddly-named flag causes adjust_elf() to look at the size of the + relocation sections before the modification, as opposed to the new + size, in order to determine the number of relocation entries. */ + bool use_old_shdr_for_relocation_calculations; + const char *name; /* name of the original section */ + /* If we do not want to modify a section's data, we set this field to NULL. + This will cause clone_elf() to extract the original section's data and + copy it over to the new section. If, on the other hand, we do want to + change the data, we call elf_newdata() by ourselves and set *data to + the return value. + */ + Elf_Data *data; + Elf_Data *newdata; + + /* data for new file */ + + /* Index in new file. Before we assign numbers to the sections in the + new file, the idx field has the following meaning: + 0 -- will strip + 1 -- present but not yet investigated + 2 -- handled (stripped or decided not to stip). + */ + Elf32_Word idx; + Elf_Scn *newscn; /* new section handle */ + struct Ebl_Strent *se; /* contribution to shstr section */ + /* The following three variables are for symbol-table-sections (SHT_DYNSYM + and SHT_SYMTAB). + + newsymidx: contains a mapping between the indices of old symbols and new + symbols. If a symbol table has changed, then newsymidx != + NULL; otherwise, it is NULL. Thus newsymidx can be used also + as a flag. + + dynsymst: handle to the new symbol-strings section. + */ + Elf32_Word *newsymidx; + struct Ebl_Strtab *dynsymst; + /* The following variable is used by SHT_DYNSYM, SHT_SYMTAB and SHT_DYNAMIC + sections only. For the symbol tables, this is a parallel array to the + symbol table that stores the symbol name's index into the symbol-strings + table. + + For the dynamic section, this is an array parallel to the array of + structures that the dynamic section is; for each structure that + represents a string field, the element at the same index into symse + contains the offset of that string into the new dynamic-symbol table. + */ + struct Ebl_Strent **symse; +} shdr_info_t; + +/* +Symbol_filter: + On input: symbol_filter[i] indicates whether to keep a symbol (1) or to + remove it from the symbol table. + On output: symbol_filter[i] indicates whether a symbol was removed (0) or + kept (1) in the symbol table. +*/ + +void adjust_elf(Elf *elf, const char *elf_name, + Elf *newelf, const char *newelf_name, + Ebl *ebl, + GElf_Ehdr *ehdr, /* store ELF header of original library */ + bool *sym_filter, int num_symbols, + struct shdr_info_t *shdr_info, int shdr_info_len, + GElf_Phdr *phdr_info, + size_t highest_scn_num, + size_t shnum, + size_t shstrndx, + struct Ebl_Strtab *shst, + bool sections_dropped_or_rearranged, + int dynamic_idx, /* index in shdr_info[] of .dynamic section */ + int dynsym_idx, /* index in shdr_info[] of dynamic symbol table */ + int shady, + Elf_Data **shstrtab_data, + bool adjust_section_offsets, + bool rebuild_shstrtab); + +#endif/*ELFCOPY_H*/ |