Ejemplo n.º 1
0
/* Load ELF32 or ELF64.  */
static grub_err_t
grub_mb2_load_elf (grub_elf_t elf, int argc, char *argv[])
{
  grub_addr_t kern_base;
  grub_size_t kern_size;
  grub_err_t err;

  if (grub_elf_is_elf32 (elf))
    {
      entry = elf->ehdr.ehdr32.e_entry;
      err = grub_elf32_load (elf, grub_mb2_arch_elf32_hook, &kern_base,
			     &kern_size);
    }
  else if (grub_elf_is_elf64 (elf))
    {
      entry = elf->ehdr.ehdr64.e_entry;
      err = grub_elf64_load (elf, grub_mb2_arch_elf64_hook, &kern_base,
			     &kern_size);
    }
  else
    err = grub_error (GRUB_ERR_UNKNOWN_OS, "unknown ELF class");

  if (err)
    goto fail;

  grub_dprintf ("loader", "Entry point is 0x%lx.\n", (unsigned long) entry);

  grub_mb2_tag_module_create (kern_base, kern_size, "kernel",
			     MULTIBOOT2_TAG_MODULE, argc, argv);

fail:
  return err;
}
Ejemplo n.º 2
0
static grub_err_t
grub_cmd_chain (grub_command_t cmd __attribute__ ((unused)),
		int argc, char *argv[])
{
  grub_err_t err;
  grub_file_t file;
  grub_elf_t elf;

  if (argc != 1)
    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));

  grub_loader_unset ();

  file = grub_file_open (argv[0]);
  if (!file)
    return grub_errno;

  relocator = grub_relocator_new ();
  if (!relocator)
    {
      grub_file_close (file);
      return grub_errno;
    }

  elf = grub_elf_file (file, argv[0]);
  if (!elf)
    {
      grub_relocator_unload (relocator);
      relocator = 0;
      grub_file_close (file);
    }

  if (!grub_elf_is_elf32 (elf))
    {
      grub_relocator_unload (relocator);
      relocator = 0;
      grub_elf_close (elf);
    }

  entry = elf->ehdr.ehdr32.e_entry & 0xFFFFFF;
  
  err = grub_elf32_load (elf, argv[0], grub_chain_elf32_hook, 0, 0);

  grub_elf_close (elf);
  if (err)
    return err;

  grub_loader_set (grub_chain_boot, grub_chain_unload, 0);
  return GRUB_ERR_NONE;
}