#ifndef READELFOBJ_H
#define READELFOBJ_H
#ifdef __cplusplus
extern "C" {
#endif
struct generic_rela {
Dwarf_Unsigned gr_offset;
Dwarf_Unsigned gr_info;
Dwarf_Unsigned gr_sym;
Dwarf_Unsigned gr_type;
Dwarf_Signed gr_addend;
unsigned char gr_type2;
unsigned char gr_type3;
int gr_is_rela;
};
struct generic_ehdr {
unsigned char ge_ident[EI_NIDENT];
Dwarf_Unsigned ge_type;
Dwarf_Unsigned ge_machine;
Dwarf_Unsigned ge_version;
Dwarf_Unsigned ge_entry;
Dwarf_Unsigned ge_phoff;
Dwarf_Unsigned ge_shoff;
Dwarf_Unsigned ge_flags;
Dwarf_Unsigned ge_ehsize;
Dwarf_Unsigned ge_phentsize;
Dwarf_Unsigned ge_phnum;
Dwarf_Unsigned ge_shentsize;
Dwarf_Unsigned ge_shnum;
Dwarf_Unsigned ge_shstrndx;
};
struct generic_phdr {
Dwarf_Unsigned gp_type;
Dwarf_Unsigned gp_flags;
Dwarf_Unsigned gp_offset;
Dwarf_Unsigned gp_vaddr;
Dwarf_Unsigned gp_paddr;
Dwarf_Unsigned gp_filesz;
Dwarf_Unsigned gp_memsz;
Dwarf_Unsigned gp_align;
};
struct generic_shdr {
Dwarf_Unsigned gh_secnum;
Dwarf_Unsigned gh_name;
const char * gh_namestring;
Dwarf_Unsigned gh_type;
Dwarf_Unsigned gh_flags;
Dwarf_Unsigned gh_addr;
Dwarf_Unsigned gh_offset;
Dwarf_Unsigned gh_size;
Dwarf_Unsigned gh_link;
Dwarf_Unsigned gh_reloc_target_secnum;
Dwarf_Unsigned gh_info;
Dwarf_Unsigned gh_addralign;
Dwarf_Unsigned gh_entsize;
char * gh_content;
Dwarf_Unsigned gh_relcount;
struct generic_rela * gh_rels;
Dwarf_Unsigned gh_section_group_number;
Dwarf_Unsigned * gh_sht_group_array;
Dwarf_Unsigned gh_sht_group_array_count;
char gh_is_dwarf;
};
struct generic_dynentry {
Dwarf_Unsigned gd_tag;
Dwarf_Unsigned gd_val;
Dwarf_Unsigned gd_dyn_file_offset;
};
struct generic_symentry {
Dwarf_Unsigned gs_name;
Dwarf_Unsigned gs_value;
Dwarf_Unsigned gs_size;
Dwarf_Unsigned gs_info;
Dwarf_Unsigned gs_other;
Dwarf_Unsigned gs_shndx;
Dwarf_Unsigned gs_bind;
Dwarf_Unsigned gs_type;
};
struct location {
const char *g_name;
Dwarf_Unsigned g_offset;
Dwarf_Unsigned g_count;
Dwarf_Unsigned g_entrysize;
Dwarf_Unsigned g_totalsize;
};
typedef struct elf_filedata_s {
char f_ident[8];
char * f_path;
int f_fd;
int f_machine;
int f_destruct_close_fd;
int f_is_64bit;
unsigned f_endian;
Dwarf_Unsigned f_filesize;
Dwarf_Small f_offsetsize;
Dwarf_Small f_pointersize;
int f_ftype;
Dwarf_Unsigned f_max_secdata_offset;
Dwarf_Unsigned f_max_progdata_offset;
void (*f_copy_word) (void *, const void *, unsigned long);
struct location f_loc_ehdr;
struct generic_ehdr* f_ehdr;
struct location f_loc_shdr;
struct generic_shdr* f_shdr;
struct location f_loc_phdr;
struct generic_phdr* f_phdr;
char *f_elf_shstrings_data;
Dwarf_Unsigned f_elf_shstrings_length;
Dwarf_Unsigned f_elf_shstrings_max;
struct location f_loc_dynamic;
struct generic_dynentry * f_dynamic;
Dwarf_Unsigned f_dynamic_sect_index;
struct location f_loc_dynsym;
struct generic_symentry* f_dynsym;
char *f_dynsym_sect_strings;
Dwarf_Unsigned f_dynsym_sect_strings_max;
Dwarf_Unsigned f_dynsym_sect_strings_sect_index;
Dwarf_Unsigned f_dynsym_sect_index;
struct location f_loc_symtab;
struct generic_symentry* f_symtab;
char * f_symtab_sect_strings;
Dwarf_Unsigned f_symtab_sect_strings_max;
Dwarf_Unsigned f_symtab_sect_strings_sect_index;
Dwarf_Unsigned f_symtab_sect_index;
Dwarf_Unsigned f_sg_next_group_number;
Dwarf_Unsigned f_sht_group_type_section_count;
Dwarf_Unsigned f_shf_group_flag_section_count;
Dwarf_Unsigned f_dwo_group_section_count;
} dwarf_elf_object_access_internals_t;
int dwarf_construct_elf_access(int fd,
const char *path,
dwarf_elf_object_access_internals_t **ep,int *errcode);
int dwarf_destruct_elf_access(dwarf_elf_object_access_internals_t *ep,int *errcode);
int _dwarf_load_elf_header(dwarf_elf_object_access_internals_t *ep,int *errcode);
int _dwarf_load_elf_sectheaders(dwarf_elf_object_access_internals_t* ep,int *errcode);
int _dwarf_load_elf_symtab_symbols(dwarf_elf_object_access_internals_t *ep,int *errcode);
int _dwarf_load_elf_symstr( dwarf_elf_object_access_internals_t *ep, int *errcode);
enum RelocRela {
RelocIsRela = 1,
RelocIsRel = 2
};
enum RelocOffsetSize {
RelocOffset32 = 4,
RelocOffset64 = 8
};
int _dwarf_load_elf_relx(dwarf_elf_object_access_internals_t *ep,
Dwarf_Unsigned secnum,enum RelocRela,int *errcode);
#ifndef EI_NIDENT
#define EI_NIDENT 16
#endif
#ifdef __cplusplus
}
#endif
#endif