Home | History | Annotate | Download | only in tests
      1 /* Copyright (C) 2007 Red Hat, Inc.
      2    This file is part of elfutils.
      3 
      4    This file is free software; you can redistribute it and/or modify
      5    it under the terms of the GNU General Public License as published by
      6    the Free Software Foundation; either version 3 of the License, or
      7    (at your option) any later version.
      8 
      9    elfutils is distributed in the hope that it will be useful, but
     10    WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12    GNU General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License
     15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     16 
     17 #include <ar.h>
     18 #include <fcntl.h>
     19 #include <libelf.h>
     20 #include <stdio.h>
     21 #include <unistd.h>
     22 
     23 
     24 static int handle (const char *fname);
     25 
     26 
     27 int
     28 main (int argc, char *argv[])
     29 {
     30   elf_version (EV_CURRENT);
     31 
     32   int result = 0;
     33   if (argc == 1)
     34     result = handle ("a.out");
     35   else
     36     for (int i = 1; i < argc; ++i)
     37       result |= handle (argv[1]);
     38 
     39   return result;
     40 }
     41 
     42 
     43 static int
     44 handle (const char *fname)
     45 {
     46   int fd = open (fname, O_RDONLY);
     47   if (fd == -1)
     48     {
     49       printf ("cannot open '%s': %m\n", fname);
     50       return 1;
     51     }
     52 
     53   Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
     54   if (elf == NULL)
     55     {
     56       printf ("cannot get ELF handling for '%s': %s\n",
     57 	      fname, elf_errmsg (-1));
     58       close (fd);
     59       return 1;
     60     }
     61 
     62   if (elf_kind (elf) != ELF_K_AR)
     63     {
     64       printf ("'%s' is no archive\n", fname);
     65       elf_end (elf);
     66       close (fd);
     67       return 1;
     68     }
     69 
     70   printf ("%s:\n", fname);
     71   Elf *subelf = NULL;
     72   Elf_Cmd cmd = ELF_C_READ_MMAP;
     73   while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
     74     {
     75       Elf_Arhdr *arhdr = elf_getarhdr (subelf);
     76       if (arhdr == NULL)
     77 	{
     78 	  printf ("cannot get archive header in '%s': %s\n",
     79 		  fname, elf_errmsg (-1));
     80 	  elf_end (subelf);
     81 	  elf_end (elf);
     82 	  close (fd);
     83 	  return 1;
     84 	}
     85 
     86       off_t off = elf_getaroff (subelf);
     87 
     88       printf ("\nOffset    %llu\n"
     89 	      "  Name    %s\n"
     90 	      "  Date    %ld\n"
     91 	      "  UID     %d\n"
     92 	      "  GID     %d\n"
     93 	      "  Mode    %o\n"
     94 	      "  Size    %lld\n",
     95 	      (unsigned long long int) off,
     96 	      arhdr->ar_name, (long int) arhdr->ar_date, (int) arhdr->ar_uid,
     97 	      (int) arhdr->ar_gid,
     98 	      (int) arhdr->ar_mode, (long long int) arhdr->ar_size);
     99 
    100       cmd = elf_next (subelf);
    101       elf_end (subelf);
    102     }
    103 
    104   close (fd);
    105 
    106   return 0;
    107 }
    108