Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}