int loadelf(memory_t *m, char *name, elf_info_t *elf_info) { Elf64_Ehdr ehdr; FILE *f = fopen(name, "r"); if (!f) { perror(name); return 1; } if (fread(&ehdr, sizeof ehdr, 1, f) != 1) { fprintf(stderr, "%s: short header read, file corrupted?\n", name); return 2; } if (strncmp((char *)ehdr.e_ident, ELFMAG, SELFMAG)) { fprintf(stderr, "%s: Not an ELF file\n", name); return 3; } rewind(f); if (ehdr.e_ident[EI_CLASS] == ELFCLASS32) return loadelf32(m, name, f, elf_info); if (ehdr.e_ident[EI_CLASS] == ELFCLASS64) return loadelf64(m, name, f, elf_info); fprintf(stderr, "%s: Not an ELF file? (EI_CLASS = %d)\n", name, ehdr.e_ident[EI_CLASS]); return 4; }
void* ELFLoadObject( const char* objname ) { struct ElfObject *elfobj = NULL; /* allocate ElfObject structure */ elfobj = alloc32( sizeof( struct ElfObject ) ); if( elfobj != NULL ) { memset(elfobj,0,sizeof(struct ElfObject)); elfobj->header = alloc32( sizeof( struct Elf32_Ehdr ) ); if( elfobj->header != NULL ) { /* open ELF stream for reading */ elfobj->handle = opstream( elfobj, objname ); if( elfobj->handle != NULL ) { /* read and identify ELF 32bit PowerPC BigEndian header */ if( rdstream( elfobj, elfobj->header, sizeof(struct Elf32_Ehdr) ) ) { struct Elf32_Ehdr *hdr = elfobj->header; if (!strncmp(hdr->e_ident,ELFid,4) && hdr->e_ident[EI_CLASS]==ELFCLASS32 && hdr->e_ident[EI_DATA]==ELFDATA2MSB && hdr->e_ident[EI_VERSION]==1 && hdr->e_version==1 && (hdr->e_machine==EM_PPC || hdr->e_machine==EM_PPC_OLD || hdr->e_machine==EM_CYGNUS_POWERPC) && hdr->e_type==ET_REL) { struct Elf32_Shdr *shdrs; ULONG shdrsize = (ULONG) hdr->e_shnum * (ULONG) hdr->e_shentsize; // kprintf("elf32ppcbe format recognized\n"); shdrs = alloc32( shdrsize ); if( shdrs != NULL ) { /* read section header table and parse rest of object */ if( prstream( elfobj, hdr->e_shoff, shdrs, shdrsize ) ) { if( loadelf32( elfobj, shdrs ) ) { void* start; // kprintf("ELF object loaded (0x%08lx)\n", elfobj ); start = loadprogram( elfobj ); // kprintf("Start of PPC code: 0x%08lx\n", start ); free32( shdrs ); return (elfobj); } } free32( shdrs ); } } else kprintf( "Not an ELF32-PPC-BE\nrelocatable object."); } } freeelfobj(elfobj); } } return (NULL); }