Blame tests/saridx.c

Packit Service 97d2fb
/* Copyright (C) 1998, 1999, 2000, 2002 Red Hat, Inc.
Packit Service 97d2fb
   This file is part of elfutils.
Packit Service 97d2fb
   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
Packit Service 97d2fb
Packit Service 97d2fb
   This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
   it under the terms of the GNU General Public License as published by
Packit Service 97d2fb
   the Free Software Foundation; either version 3 of the License, or
Packit Service 97d2fb
   (at your option) any later version.
Packit Service 97d2fb
Packit Service 97d2fb
   elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 97d2fb
   GNU General Public License for more details.
Packit Service 97d2fb
Packit Service 97d2fb
   You should have received a copy of the GNU General Public License
Packit Service 97d2fb
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 97d2fb
Packit Service 97d2fb
#include <config.h>
Packit Service 97d2fb
Packit Service 97d2fb
#include <fcntl.h>
Packit Service 97d2fb
#include <gelf.h>
Packit Service 97d2fb
#include <stdio.h>
Packit Service 97d2fb
#include <stdlib.h>
Packit Service 97d2fb
#include <string.h>
Packit Service 97d2fb
#include <time.h>
Packit Service 97d2fb
#include <unistd.h>
Packit Service 97d2fb
#include "system.h"
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
static const char *machines[] =
Packit Service 97d2fb
{
Packit Service 97d2fb
#define MACHINE(name) [name] = #name
Packit Service 97d2fb
  MACHINE (EM_NONE),
Packit Service 97d2fb
  MACHINE (EM_M32),
Packit Service 97d2fb
  MACHINE (EM_SPARC),
Packit Service 97d2fb
  MACHINE (EM_386),
Packit Service 97d2fb
  MACHINE (EM_68K),
Packit Service 97d2fb
  MACHINE (EM_88K),
Packit Service 97d2fb
  MACHINE (EM_860),
Packit Service 97d2fb
  MACHINE (EM_MIPS),
Packit Service 97d2fb
  MACHINE (EM_MIPS_RS3_LE),
Packit Service 97d2fb
  MACHINE (EM_PARISC),
Packit Service 97d2fb
  MACHINE (EM_VPP500),
Packit Service 97d2fb
  MACHINE (EM_SPARC32PLUS),
Packit Service 97d2fb
  MACHINE (EM_960),
Packit Service 97d2fb
  MACHINE (EM_PPC),
Packit Service 97d2fb
  MACHINE (EM_PPC64),
Packit Service 97d2fb
  MACHINE (EM_V800),
Packit Service 97d2fb
  MACHINE (EM_FR20),
Packit Service 97d2fb
  MACHINE (EM_RH32),
Packit Service 97d2fb
  MACHINE (EM_RCE),
Packit Service 97d2fb
  MACHINE (EM_ARM),
Packit Service 97d2fb
  MACHINE (EM_FAKE_ALPHA),
Packit Service 97d2fb
  MACHINE (EM_SH),
Packit Service 97d2fb
  MACHINE (EM_SPARCV9),
Packit Service 97d2fb
  MACHINE (EM_TRICORE),
Packit Service 97d2fb
  MACHINE (EM_ARC),
Packit Service 97d2fb
  MACHINE (EM_H8_300),
Packit Service 97d2fb
  MACHINE (EM_H8_300H),
Packit Service 97d2fb
  MACHINE (EM_H8S),
Packit Service 97d2fb
  MACHINE (EM_H8_500),
Packit Service 97d2fb
  MACHINE (EM_IA_64),
Packit Service 97d2fb
  MACHINE (EM_MIPS_X),
Packit Service 97d2fb
  MACHINE (EM_COLDFIRE),
Packit Service 97d2fb
  MACHINE (EM_68HC12),
Packit Service 97d2fb
  MACHINE (EM_MMA),
Packit Service 97d2fb
  MACHINE (EM_PCP),
Packit Service 97d2fb
  MACHINE (EM_NCPU),
Packit Service 97d2fb
  MACHINE (EM_NDR1),
Packit Service 97d2fb
  MACHINE (EM_STARCORE),
Packit Service 97d2fb
  MACHINE (EM_ME16),
Packit Service 97d2fb
  MACHINE (EM_ST100),
Packit Service 97d2fb
  MACHINE (EM_TINYJ),
Packit Service 97d2fb
  MACHINE (EM_FX66),
Packit Service 97d2fb
  MACHINE (EM_ST9PLUS),
Packit Service 97d2fb
  MACHINE (EM_ST7),
Packit Service 97d2fb
  MACHINE (EM_68HC16),
Packit Service 97d2fb
  MACHINE (EM_68HC11),
Packit Service 97d2fb
  MACHINE (EM_68HC08),
Packit Service 97d2fb
  MACHINE (EM_68HC05),
Packit Service 97d2fb
  MACHINE (EM_SVX),
Packit Service 97d2fb
  MACHINE (EM_ST19),
Packit Service 97d2fb
  MACHINE (EM_VAX)
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
int
Packit Service 97d2fb
main (int argc, char *argv[])
Packit Service 97d2fb
{
Packit Service 97d2fb
  int fd;
Packit Service 97d2fb
  Elf *elf;
Packit Service 97d2fb
  Elf_Cmd cmd;
Packit Service 97d2fb
  size_t n;
Packit Service 97d2fb
  int arg = 1;
Packit Service 97d2fb
  int verbose = 0;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Recognize optional verbosity flag.  */
Packit Service 97d2fb
  if (arg < argc && strcmp (argv[arg], "-v") == 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      verbose = 1;
Packit Service 97d2fb
      ++arg;
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  /* Any more arguments available.  */
Packit Service 97d2fb
  if (arg >= argc)
Packit Service 97d2fb
    error (EXIT_FAILURE, 0, "No input file given");
Packit Service 97d2fb
Packit Service 97d2fb
  /* Open the input file.  */
Packit Service 97d2fb
  fd = open (argv[arg], O_RDONLY);
Packit Service 97d2fb
  if (fd == -1)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      perror ("cannot open input file");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  /* Set the ELF version we are using here.  */
Packit Service 97d2fb
  if (elf_version (EV_CURRENT) == EV_NONE)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      puts ("ELF library too old");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  /* Start reading the file.  */
Packit Service 97d2fb
  cmd = ELF_C_READ;
Packit Service 97d2fb
  elf = elf_begin (fd, cmd, NULL);
Packit Service 97d2fb
  if (elf == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("elf_begin: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  /* If it is no archive punt.  */
Packit Service 97d2fb
  if (elf_kind (elf) != ELF_K_AR)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("%s is not an archive\n", argv[1]);
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  if (verbose)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      /* The verbose variant.  We print a lot of information.  */
Packit Service 97d2fb
      Elf *subelf;
Packit Service 97d2fb
      char buf[100];
Packit Service 97d2fb
      time_t t;
Packit Service 97d2fb
Packit Service 97d2fb
      /* Get the elements of the archive one after the other.  */
Packit Service 97d2fb
      while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
Packit Service 97d2fb
	{
Packit Service 97d2fb
	  /* The the header for this element.  */
Packit Service 97d2fb
	  Elf_Arhdr *arhdr = elf_getarhdr (subelf);
Packit Service 97d2fb
Packit Service 97d2fb
	  if (arhdr == NULL)
Packit Service 97d2fb
	    {
Packit Service 97d2fb
	      printf ("cannot get arhdr: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
	      break;
Packit Service 97d2fb
	    }
Packit Service 97d2fb
Packit Service 97d2fb
	  switch (elf_kind (subelf))
Packit Service 97d2fb
	    {
Packit Service 97d2fb
	    case ELF_K_ELF:
Packit Service 97d2fb
	      fputs ("ELF file:\n", stdout);
Packit Service 97d2fb
	      break;
Packit Service 97d2fb
Packit Service 97d2fb
	    case ELF_K_AR:
Packit Service 97d2fb
	      fputs ("archive:\n", stdout);
Packit Service 97d2fb
	      break;
Packit Service 97d2fb
Packit Service 97d2fb
	    default:
Packit Service 97d2fb
	      fputs ("unknown file:\n", stdout);
Packit Service 97d2fb
	      break;
Packit Service 97d2fb
	    }
Packit Service 97d2fb
Packit Service 97d2fb
	  /* Print general information.  */
Packit Service 97d2fb
	  t = arhdr->ar_date;
Packit Service 97d2fb
	  strftime (buf, sizeof buf, "%Y-%m-%dT%H:%M:%S%z", gmtime (&t);;
Packit Service 97d2fb
	  printf ("  name         : \"%s\"\n"
Packit Service 97d2fb
		  "  time         : %s\n"
Packit Service 97d2fb
		  "  uid          : %ld\n"
Packit Service 97d2fb
		  "  gid          : %ld\n"
Packit Service 97d2fb
		  "  mode         : %o\n"
Packit Service 97d2fb
		  "  size         : %ld\n"
Packit Service 97d2fb
		  "  rawname      : \"%s\"\n",
Packit Service 97d2fb
		  arhdr->ar_name,
Packit Service 97d2fb
		  buf,
Packit Service 97d2fb
		  (long int) arhdr->ar_uid,
Packit Service 97d2fb
		  (long int) arhdr->ar_gid,
Packit Service 97d2fb
		  arhdr->ar_mode,
Packit Service 97d2fb
		  (long int) arhdr->ar_size,
Packit Service 97d2fb
		  arhdr->ar_rawname);
Packit Service 97d2fb
Packit Service 97d2fb
	  /* For ELF files we can provide some more information.  */
Packit Service 97d2fb
	  if (elf_kind (subelf) == ELF_K_ELF)
Packit Service 97d2fb
	    {
Packit Service 97d2fb
	      GElf_Ehdr ehdr;
Packit Service 97d2fb
Packit Service 97d2fb
	      /* Get the ELF header.  */
Packit Service 97d2fb
	      if (gelf_getehdr (subelf, &ehdr) == NULL)
Packit Service 97d2fb
		printf ("  *** cannot get ELF header: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
	      else
Packit Service 97d2fb
		{
Packit Service 97d2fb
		  printf ("  binary class : %s\n",
Packit Service 97d2fb
			  ehdr.e_ident[EI_CLASS] == ELFCLASS32
Packit Service 97d2fb
			  ? "ELFCLASS32" : "ELFCLASS64");
Packit Service 97d2fb
		  printf ("  data encoding: %s\n",
Packit Service 97d2fb
			  ehdr.e_ident[EI_DATA] == ELFDATA2LSB
Packit Service 97d2fb
			  ? "ELFDATA2LSB" : "ELFDATA2MSB");
Packit Service 97d2fb
		  printf ("  binary type  : %s\n",
Packit Service 97d2fb
			  ehdr.e_type == ET_REL
Packit Service 97d2fb
			  ? "relocatable"
Packit Service 97d2fb
			  : (ehdr.e_type == ET_EXEC
Packit Service 97d2fb
			     ? "executable"
Packit Service 97d2fb
			     : (ehdr.e_type == ET_DYN
Packit Service 97d2fb
				? "dynamic"
Packit Service 97d2fb
				: "core file")));
Packit Service 97d2fb
		  printf ("  machine      : %s\n",
Packit Service 97d2fb
			  (ehdr.e_machine >= (sizeof (machines)
Packit Service 97d2fb
					      / sizeof (machines[0]))
Packit Service 97d2fb
			   || machines[ehdr.e_machine] == NULL)
Packit Service 97d2fb
			  ? "???"
Packit Service 97d2fb
			  : machines[ehdr.e_machine]);
Packit Service 97d2fb
		}
Packit Service 97d2fb
	    }
Packit Service 97d2fb
Packit Service 97d2fb
	  /* Get next archive element.  */
Packit Service 97d2fb
	  cmd = elf_next (subelf);
Packit Service 97d2fb
	  if (elf_end (subelf) != 0)
Packit Service 97d2fb
	    printf ("error while freeing sub-ELF descriptor: %s\n",
Packit Service 97d2fb
		    elf_errmsg (-1));
Packit Service 97d2fb
	}
Packit Service 97d2fb
    }
Packit Service 97d2fb
  else
Packit Service 97d2fb
    {
Packit Service 97d2fb
      /* The simple version.  Only print a bit of information.  */
Packit Service 97d2fb
      Elf_Arsym *arsym = elf_getarsym (elf, &n);
Packit Service 97d2fb
Packit Service 97d2fb
      if (n == 0)
Packit Service 97d2fb
	printf ("no symbol table in archive: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      else
Packit Service 97d2fb
	{
Packit Service 97d2fb
	  --n;
Packit Service 97d2fb
Packit Service 97d2fb
	  while (n-- > 0)
Packit Service 97d2fb
	    printf ("name = \"%s\", offset = %ld, hash = %lx\n",
Packit Service 97d2fb
		    arsym[n].as_name, (long int) arsym[n].as_off,
Packit Service 97d2fb
		    arsym[n].as_hash);
Packit Service 97d2fb
	}
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  /* Free the ELF handle.  */
Packit Service 97d2fb
  if (elf_end (elf) != 0)
Packit Service 97d2fb
    printf ("error while freeing ELF descriptor: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
Packit Service 97d2fb
  /* Close the underlying file.  */
Packit Service 97d2fb
  close (fd);
Packit Service 97d2fb
Packit Service 97d2fb
  return 0;
Packit Service 97d2fb
}