#ifndef ELF_H
#define ELF_H
#include <elf_sysv4.h>
#include <stdio.h>
enum {RT_NONE, RT_REL, RT_RELA};
struct program_data_struct {
struct {
unsigned program_header_table : 1;
unsigned dynamic_array : 1;
unsigned interpreter_name : 1;
} contents;
Elf32_Addr program_header_table_vaddr;
Elf32_Addr load_vaddr;
size_t mem_size;
Elf32_Addr dynamic_array_vaddr;
Elf32_Addr interpreter_name_vaddr;
};
struct dynamic_data_struct {
const char *string_table;
const char *soname;
const char **needed_list;
int needed_list_size;
const char *rpath;
const char *runpath;
const Elf32_Sym *symbol_table;
const Elf32_Word *symbol_hash_table;
Elf32_Addr *global_offset_table;
unsigned symbolic : 1;
unsigned textrel : 1;
unsigned bind_now : 1;
const Elf32_Rel *rel_relocation_table;
int rel_relocation_table_size;
const Elf32_Rela *rela_relocation_table;
int rela_relocation_table_size;
int plt_relocation_type;
union {
const Elf32_Rel *rel;
const Elf32_Rela *rela;
} plt_relocation_table;
int plt_relocation_table_size;
void (**preinit_func_array)();
int preinit_func_array_size;
void (*init_func)();
void (**init_func_array)();
int init_func_array_size;
void (*fini_func)();
void (**fini_func_array)();
int fini_func_array_size;
};
void fread_elf_header(Elf32_Ehdr *elf_header, FILE *fp, const char *filename);
void fread_program_header_table(Elf32_Phdr *program_header_table, size_t count, FILE *fp, const char *filename);
void clear_program_data(struct program_data_struct *program_data);
void read_program_header_table(const Elf32_Phdr *program_header_table, int count, struct program_data_struct *program_data, const char *filename);
void clear_dynamic_data(struct dynamic_data_struct *dynamic_data);
void dispose_dynamic_data(struct dynamic_data_struct *dynamic_data);
void read_dynamic_array(const Elf32_Dyn *dynamic_array, void *base_address, struct dynamic_data_struct *dynamic_data);
#endif