Home | History | Annotate | Download | only in tests
      1 /* Copyright (C) 1998, 1999, 2000, 2002 Red Hat, Inc.
      2    Written by Ulrich Drepper <drepper (at) redhat.com>, 1998.
      3 
      4    This program is Open Source software; you can redistribute it and/or
      5    modify it under the terms of the Open Software License version 1.0 as
      6    published by the Open Source Initiative.
      7 
      8    You should have received a copy of the Open Software License along
      9    with this program; if not, you may obtain a copy of the Open Software
     10    License version 1.0 from http://www.opensource.org/licenses/osl.php or
     11    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
     12    3001 King Ranch Road, Ukiah, CA 95482.   */
     13 
     14 #include <config.h>
     15 
     16 #include <errno.h>
     17 #include <fcntl.h>
     18 #include <gelf.h>
     19 #include <stdlib.h>
     20 #include <stdio.h>
     21 #include <string.h>
     22 
     23 int
     24 main (int argc, char *argv[])
     25 {
     26   Elf *elf;
     27   int fd;
     28   GElf_Ehdr ehdr;
     29   size_t strndx;
     30   Elf_Scn *scn;
     31 
     32   fd = open (argv[1], O_RDONLY);
     33   if (fd == -1)
     34     {
     35       printf ("cannot open \"%s\": %s\n", argv[1], strerror (errno));
     36       exit (1);
     37     }
     38 
     39   elf_version (EV_CURRENT);
     40 
     41   elf = elf_begin (fd, ELF_C_READ, NULL);
     42   if (elf == NULL)
     43     {
     44       printf ("cannot open ELF file: %s\n", elf_errmsg (-1));
     45       exit (1);
     46     }
     47 
     48   if (elf_kind (elf) != ELF_K_ELF)
     49     {
     50       printf ("\"%s\" is not an ELF file\n", argv[1]);
     51       exit (1);
     52     }
     53 
     54   if (gelf_getehdr (elf, &ehdr) == NULL)
     55     {
     56       printf ("cannot get the ELF header: %s\n", elf_errmsg (-1));
     57       exit (1);
     58     }
     59 
     60   strndx = ehdr.e_shstrndx;
     61 
     62   scn = NULL;
     63   while ((scn = elf_nextscn (elf, scn)) != NULL)
     64     {
     65       char *name = NULL;
     66       GElf_Shdr shdr;
     67 
     68       if (gelf_getshdr (scn, &shdr) != NULL)
     69 	name = elf_strptr (elf, strndx, (size_t) shdr.sh_name);
     70 
     71       printf ("section: `%s'\n", name);
     72     }
     73 
     74   if (elf_end (elf) != 0)
     75     {
     76       printf ("error while freeing ELF descriptor: %s\n", elf_errmsg (-1));
     77       exit (1);
     78     }
     79 
     80   return 0;
     81 }
     82