#ifndef __EFMT_H #define __EFMT_H #ifndef __PACKED__ #define __PACKED__ __attribute__((packed)) #endif typedef struct { unsigned long magic __PACKED__; unsigned char bitness __PACKED__; unsigned char endian __PACKED__; unsigned char elf_ver_1 __PACKED__; unsigned char res[9] __PACKED__; unsigned short file_type __PACKED__; unsigned short machine __PACKED__; unsigned long elf_ver_2 __PACKED__; unsigned long entry_pt __PACKED__; unsigned long phtab_offset __PACKED__; unsigned long shtab_offset __PACKED__; unsigned long flags __PACKED__; unsigned short file_hdr_size __PACKED__; unsigned short phtab_ent_size __PACKED__; unsigned short num_phtab_ents __PACKED__; unsigned short shtab_ent_size __PACKED__; unsigned short num_sects __PACKED__; unsigned short shstrtab_index __PACKED__; } elf_file_t; typedef struct { unsigned long sect_name __PACKED__; unsigned long type __PACKED__; unsigned long flags __PACKED__; unsigned long virt_adr __PACKED__; unsigned long offset __PACKED__; unsigned long size __PACKED__; unsigned long link __PACKED__; unsigned long info __PACKED__; unsigned long align __PACKED__; unsigned long ent_size __PACKED__; } elf_sect_t; typedef struct { unsigned long adr __PACKED__; unsigned char type __PACKED__; unsigned long symtab_index:24 __PACKED__; unsigned long addend __PACKED__; } elf_reloc_t; typedef struct { unsigned long name __PACKED__; unsigned long value __PACKED__; unsigned long size __PACKED__; unsigned type:4 __PACKED__; unsigned binding:4 __PACKED__; unsigned char zero __PACKED__; unsigned short section __PACKED__; } elf_sym_t; typedef struct { unsigned char * file, * sects,*bss,*symtab; char * strtab; unsigned long bss_sect_num,entry; } exe_file_t; int get_elf_section_name(exe_file_t * f,unsigned short sect_num,char * namebuf); int get_elf_section_addr(exe_file_t * f,unsigned short sect_num,unsigned long * adr); int get_elf_symbol_addr(exe_file_t * f,unsigned long i, unsigned long * sym_val,unsigned short sect_num, int (* lookup_fn)(char * symname,unsigned long * val)); int do_elf_relocation(exe_file_t * f,elf_reloc_t * reloc, unsigned short sect_num,unsigned long symtab_sect_num, int (* sym_lookup_fn)(char * symname,unsigned long * val),int ignore_ext); int get_elf_section_index(exe_file_t * f,char * sect_name,unsigned long * i); int elf_load_from_mem(exe_file_t * f); int relocate_elf_file(exe_file_t * f, int (* sym_lookup_fn)(char * symname,unsigned long * val),int ignore_ext); int get_elf_symbol_value(exe_file_t * f,char * symname,unsigned long * symval); #endif