Beispiel #1
0
Elf32_Ehdr *xelf32_newehdr(Elf *e)
{
  Elf32_Ehdr *ehdr = elf32_newehdr(e);
  if (ehdr == NULL)
	{
	  eprintf("elf_newehdr() failed: %s", elf_errmsg(-1));
	  exit(EXIT_FAILURE);
	}
  return ehdr;
}
Beispiel #2
0
int
main (int argc, char *argv[])
{
  Elf *elf;
  int result = 0;
  int fd;
  char fname[] = "newfile-XXXXXX";

  fd = mkstemp (fname);
  if (fd == -1)
    {
      printf ("cannot create temporary file: %m\n");
      exit (1);
    }
  /* Remove the file when we exit.  */
  unlink (fname);

  elf_version (EV_CURRENT);
  elf = elf_begin (fd, ELF_C_WRITE, NULL);
  if (elf == NULL)
    {
      printf ("elf_begin: %s\n", elf_errmsg (-1));
      result = 1;
    }
  else
    {
      if (elf32_newehdr (elf) == NULL)
	{
	  printf ("elf32_newehdr: %s\n", elf_errmsg (-1));
	  result = 1;
	}
      else
        {
	  Elf32_Ehdr *ehdr = elf32_getehdr (elf);

	  if (ehdr == NULL)
	    {
	      printf ("elf32_getehdr: %s\n", elf_errmsg (-1));
	      result = 1;
	    }
	  else
	    {
	      int i;

	      if (argc > 1)
		/* Use argc as a debugging flag.  */
		print_ehdr (ehdr);

	      /* Some tests.  */
	      for (i = 0; i < EI_NIDENT; ++i)
		if (ehdr->e_ident[i] != 0)
		  {
		    printf ("ehdr->e_ident[%d] != 0\n", i);
		    result = 1;
		    break;
		  }

#define VALUE_TEST(name, val) \
	      if (ehdr->name != val)					      \
	        {							      \
		  printf ("ehdr->%s != %d\n", #name, val);		      \
		  result = 1;						      \
		}
#define ZERO_TEST(name) VALUE_TEST (name, 0)
	      ZERO_TEST (e_type);
	      ZERO_TEST (e_machine);
	      ZERO_TEST (e_version);
	      ZERO_TEST (e_entry);
	      ZERO_TEST (e_phoff);
	      ZERO_TEST (e_shoff);
	      ZERO_TEST (e_flags);
	      ZERO_TEST (e_ehsize);
	      ZERO_TEST (e_phentsize);
	      ZERO_TEST (e_phnum);
	      ZERO_TEST (e_shentsize);
	      ZERO_TEST (e_shnum);
	      ZERO_TEST (e_shstrndx);

	      if (elf32_newphdr (elf, 10) == NULL)
		{
		  printf ("elf32_newphdr: %s\n", elf_errmsg (-1));
		  result = 1;
		}
	      else
		{
		  if (argc > 1)
		    print_ehdr (ehdr);

		  ehdr = elf32_getehdr (elf);
		  if (ehdr == NULL)
		    {
		      printf ("elf32_getehdr (#2): %s\n", elf_errmsg (-1));
		      result = 1;
		    }
		  else
		    {
		      ZERO_TEST (e_type);
		      ZERO_TEST (e_machine);
		      ZERO_TEST (e_version);
		      ZERO_TEST (e_entry);
		      ZERO_TEST (e_phoff);
		      ZERO_TEST (e_shoff);
		      ZERO_TEST (e_flags);
		      ZERO_TEST (e_ehsize);
		      VALUE_TEST (e_phentsize, (int) sizeof (Elf32_Phdr));
		      VALUE_TEST (e_phnum, 10);
		      ZERO_TEST (e_shentsize);
		      ZERO_TEST (e_shnum);
		      ZERO_TEST (e_shstrndx);
		    }
		}
	    }
        }

      (void) elf_end (elf);
    }

  return result;
}
Beispiel #3
0
//-------------------------------------------------------------------
void avr_write_elffile(bblklist_t* blist, char* outFileName, file_desc_t* fdesc, uint32_t startaddr)
{
  int fd;
  Elf *elf, *nelf;
  Elf32_Ehdr *ehdr, *nehdr;
  Elf_Scn *scn, *nscn;
  Elf32_Shdr *shdr, *nshdr;
  Elf_Data *edata, *nedata;

  DEBUG("=========== ELF File Write ===========\n");

  elf = fdesc->elf;
  
  fd = open(outFileName, O_RDWR|O_TRUNC|O_CREAT, 0666);
  if ((nelf = elf_begin(fd, ELF_C_WRITE, (Elf *)NULL)) == 0){
    fprintf(stderr, "avr_write_elffile: Error creating output ELF archive.\n");
    exit(EXIT_FAILURE);
  }
  
  if ((nehdr = elf32_newehdr(nelf)) == NULL){
    fprintf(stderr, "avr_write_elffile: Error creating new ELF header.\n");
    exit(EXIT_FAILURE);
  }
  if ((ehdr = elf32_getehdr(elf)) == NULL){
    fprintf(stderr, "avr_write_elfffile: Error reading ELF header.\n");
    exit(EXIT_FAILURE);
  }
  avr_create_new_elf_header(ehdr, nehdr);
  
  
  scn = NULL;
  while ((scn = elf_nextscn(fdesc->elf, scn)) != NULL){
    nscn = elf_newscn(nelf);
    nshdr = elf32_getshdr(nscn);
    shdr = elf32_getshdr(scn);
    avr_create_new_section_header(shdr, nshdr);
    edata = NULL;
    edata = elf_getdata(scn, edata);
    nedata = elf_newdata(nscn);
    
    // Get name of current section
    char* CurrSecName = NULL;
    CurrSecName = elf_strptr(elf, ehdr->e_shstrndx, shdr->sh_name);
    // Compare with .text section
    if (strcmp(CurrSecName, ".text") == 0)
      avr_create_new_text_data(edata, nedata, fdesc, blist, startaddr);
    // Comare with .rela.text section
    else if (strcmp(CurrSecName, ".rela.text") == 0){
      avr_create_new_data(edata, nedata);
      avr_create_new_rela_text_data(nedata, elf, nshdr, startaddr, blist);
    }
    else if (strcmp(CurrSecName, ".symtab") == 0){
      avr_create_new_data(edata, nedata);
      avr_create_new_symbol_table(nedata, elf, nelf, nshdr, startaddr, blist);
    }
    else
      avr_create_new_data(edata, nedata);
    elf_update(nelf, ELF_C_WRITE);
  }
  elf_end(nelf);
}