Home | History | Annotate | Download | only in tests
      1 /* Copyright (C) 1999, 2000, 2001, 2002, 2005 Red Hat, Inc.
      2    This file is part of elfutils.
      3    Written by Ulrich Drepper <drepper (at) redhat.com>, 1999.
      4 
      5    This file is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3 of the License, or
      8    (at your option) any later version.
      9 
     10    elfutils is distributed in the hope that it will be useful, but
     11    WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14 
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17 
     18 #include <config.h>
     19 
     20 #include <libelf.h>
     21 #include <stdio.h>
     22 #include <stdlib.h>
     23 #include <unistd.h>
     24 
     25 static void
     26 print_ehdr (Elf32_Ehdr *ehdr)
     27 {
     28   int n;
     29 
     30   for (n = 0; n < EI_NIDENT; ++n)
     31     printf (" %02x", ehdr->e_ident[n]);
     32 
     33   printf ("\ntype = %d\nmachine = %d\nversion = %d\nentry = %d\n"
     34           "phoff = %d\nshoff = %d\nflags = %d\nehsize = %d\n"
     35           "phentsize = %d\nphnum = %d\nshentsize = %d\nshnum = %d\n"
     36           "shstrndx = %d\n",
     37           ehdr->e_type,
     38           ehdr->e_machine,
     39           ehdr->e_version,
     40           ehdr->e_entry,
     41           ehdr->e_phoff,
     42           ehdr->e_shoff,
     43           ehdr->e_flags,
     44           ehdr->e_ehsize,
     45           ehdr->e_phentsize,
     46           ehdr->e_phnum,
     47           ehdr->e_shentsize,
     48           ehdr->e_shnum,
     49           ehdr->e_shstrndx);
     50 }
     51 
     52 int
     53 main (int argc, char *argv[] __attribute__ ((unused)))
     54 {
     55   Elf *elf;
     56   int result = 0;
     57   int fd;
     58   char fname[] = "newfile-XXXXXX";
     59 
     60   fd = mkstemp (fname);
     61   if (fd == -1)
     62     {
     63       printf ("cannot create temporary file: %m\n");
     64       exit (1);
     65     }
     66   /* Remove the file when we exit.  */
     67   unlink (fname);
     68 
     69   elf_version (EV_CURRENT);
     70   elf = elf_begin (fd, ELF_C_WRITE, NULL);
     71   if (elf == NULL)
     72     {
     73       printf ("elf_begin: %s\n", elf_errmsg (-1));
     74       result = 1;
     75     }
     76   else
     77     {
     78       if (elf32_newehdr (elf) == NULL)
     79 	{
     80 	  printf ("elf32_newehdr: %s\n", elf_errmsg (-1));
     81 	  result = 1;
     82 	}
     83       else
     84         {
     85 	  Elf32_Ehdr *ehdr = elf32_getehdr (elf);
     86 
     87 	  if (ehdr == NULL)
     88 	    {
     89 	      printf ("elf32_getehdr: %s\n", elf_errmsg (-1));
     90 	      result = 1;
     91 	    }
     92 	  else
     93 	    {
     94 	      int i;
     95 
     96 	      if (argc > 1)
     97 		/* Use argc as a debugging flag.  */
     98 		print_ehdr (ehdr);
     99 
    100 	      /* Some tests.  */
    101 	      for (i = 0; i < EI_NIDENT; ++i)
    102 		if (ehdr->e_ident[i] != 0)
    103 		  {
    104 		    printf ("ehdr->e_ident[%d] != 0\n", i);
    105 		    result = 1;
    106 		    break;
    107 		  }
    108 
    109 #define VALUE_TEST(name, val) \
    110 	      if (ehdr->name != val)					      \
    111 	        {							      \
    112 		  printf ("ehdr->%s != %d\n", #name, val);		      \
    113 		  result = 1;						      \
    114 		}
    115 #define ZERO_TEST(name) VALUE_TEST (name, 0)
    116 	      ZERO_TEST (e_type);
    117 	      ZERO_TEST (e_machine);
    118 	      ZERO_TEST (e_version);
    119 	      ZERO_TEST (e_entry);
    120 	      ZERO_TEST (e_phoff);
    121 	      ZERO_TEST (e_shoff);
    122 	      ZERO_TEST (e_flags);
    123 	      ZERO_TEST (e_ehsize);
    124 	      ZERO_TEST (e_phentsize);
    125 	      ZERO_TEST (e_phnum);
    126 	      ZERO_TEST (e_shentsize);
    127 	      ZERO_TEST (e_shnum);
    128 	      ZERO_TEST (e_shstrndx);
    129 
    130 	      if (elf32_newphdr (elf, 10) == NULL)
    131 		{
    132 		  printf ("elf32_newphdr: %s\n", elf_errmsg (-1));
    133 		  result = 1;
    134 		}
    135 	      else
    136 		{
    137 		  if (argc > 1)
    138 		    print_ehdr (ehdr);
    139 
    140 		  ehdr = elf32_getehdr (elf);
    141 		  if (ehdr == NULL)
    142 		    {
    143 		      printf ("elf32_getehdr (#2): %s\n", elf_errmsg (-1));
    144 		      result = 1;
    145 		    }
    146 		  else
    147 		    {
    148 		      ZERO_TEST (e_type);
    149 		      ZERO_TEST (e_machine);
    150 		      ZERO_TEST (e_version);
    151 		      ZERO_TEST (e_entry);
    152 		      ZERO_TEST (e_phoff);
    153 		      ZERO_TEST (e_shoff);
    154 		      ZERO_TEST (e_flags);
    155 		      ZERO_TEST (e_ehsize);
    156 		      VALUE_TEST (e_phentsize, (int) sizeof (Elf32_Phdr));
    157 		      VALUE_TEST (e_phnum, 10);
    158 		      ZERO_TEST (e_shentsize);
    159 		      ZERO_TEST (e_shnum);
    160 		      ZERO_TEST (e_shstrndx);
    161 		    }
    162 		}
    163 	    }
    164         }
    165 
    166       (void) elf_end (elf);
    167     }
    168 
    169   return result;
    170 }
    171