blob: df448a54feced125d35e70679ec4e3436e11e5c5 [file] [log] [blame]
#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
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
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;
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);