Пример #1
0
/* Load elf64, and check the binary */
r_binfmt_err_e r_binfmt_elf64_load(r_binfmt_s *bin) {

  if(!elf64_is(bin))
    return R_BINFMT_ERR_UNRECOGNIZED;

  bin->type = R_BINFMT_TYPE_ELF64;
  bin->arch = elf64_getarch(bin);
  bin->endian = elf64_getendian(bin);

  if(bin->arch == R_BINFMT_ARCH_UNDEF)
    return R_BINFMT_ERR_NOTSUPPORTED;

  if(bin->endian == R_BINFMT_ENDIAN_UNDEF)
    return R_BINFMT_ERR_NOTSUPPORTED;

  if(!elf64_check(bin))
    return R_BINFMT_ERR_MALFORMEDFILE;

  bin->entry = r_binfmt_elf64_getentry(bin);
  bin->nx = r_binfmt_elf64_check_nx(bin);

  elf64_load_mlist(bin);

  return R_BINFMT_ERR_OK;
}
Пример #2
0
/* Fill the BINFMT structure if it's a correct ELF64 */
r_binfmt_err_e r_binfmt_elf64_load(r_binfmt_s *bin) {
  r_binfmt_elf64_s elf;

  memset(&elf, 0, sizeof(elf));

  if((bin->type = r_binfmt_elf_type(bin)) != R_BINFMT_TYPE_ELF64)
    return R_BINFMT_ERR_UNRECOGNIZED;

  bin->endian = r_binfmt_elf64_getendian(bin);

  if(bin->endian == R_BINFMT_ENDIAN_UNDEF)
    return R_BINFMT_ERR_NOTSUPPORTED;

  r_binfmt_elf64_load_ehdr(bin, &elf);
  r_binfmt_elf64_load_phdr(bin, &elf);
  r_binfmt_elf64_load_shdr(bin, &elf);
  r_binfmt_elf64_load_symtab(bin, &elf);
  r_binfmt_elf64_load_dynsym(bin, &elf);
  r_binfmt_elf64_load_dyntab(bin, &elf);

  r_binfmt_elf64_load_segments(bin, &elf);
  r_binfmt_elf64_load_sections(bin, &elf);
  r_binfmt_elf64_load_syms(bin, &elf);

  bin->arch = r_binfmt_elf64_getarch(bin, &elf);
  bin->entry = r_binfmt_elf64_getentry(bin, &elf);
  bin->elf.nx = r_binfmt_elf64_check_nx(bin, &elf);
  bin->elf.ssp = r_binfmt_elf_check_ssp(bin);
  bin->elf.rpath = r_binfmt_elf64_check_rpath(bin, &elf);
  bin->elf.runpath = r_binfmt_elf64_check_runpath(bin, &elf);
  bin->elf.relro = r_binfmt_elf64_check_relro(bin, &elf);
  bin->elf.pie = r_binfmt_elf64_check_pie(bin, &elf);

  return R_BINFMT_ERR_OK;
}