10c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard/* Copyright (C) 2015 Red Hat, Inc.
20c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   This file is part of elfutils.
30c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
40c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   This file is free software; you can redistribute it and/or modify
50c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   it under the terms of the GNU General Public License as published by
60c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   the Free Software Foundation; either version 3 of the License, or
70c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   (at your option) any later version.
80c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
90c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
100c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   WITHOUT ANY WARRANTY; without even the implied warranty of
110c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
120c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   GNU General Public License for more details.
130c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
140c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   You should have received a copy of the GNU General Public License
150c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
160c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
170c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#ifdef HAVE_CONFIG_H
180c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard# include <config.h>
190c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#endif
200c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
210c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <assert.h>
220c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <sys/types.h>
230c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <sys/stat.h>
240c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <fcntl.h>
250c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <inttypes.h>
260c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
270c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include ELFUTILS_HEADER(elf)
280c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include ELFUTILS_HEADER(dwelf)
290c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <gelf.h>
300c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
310c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <stdio.h>
320c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <unistd.h>
330c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard#include <string.h>
340c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
350c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaardint
360c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaardmain (int argc, char *argv[])
370c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard{
380c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard  int result = 0;
390c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard  int cnt;
400c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
410c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard  elf_version (EV_CURRENT);
420c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
430c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard  for (cnt = 1; cnt < argc; ++cnt)
440c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard    {
450c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      int fd = open (argv[cnt], O_RDONLY);
460c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
470c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
480c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      if (elf == NULL)
490c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	{
500c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  printf ("%s not usable %s\n", argv[cnt], elf_errmsg (-1));
510c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  result = 1;
520c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  close (fd);
530c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  continue;
540c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	}
550c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
560c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      size_t shdrstrndx;
570c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      if (elf_getshdrstrndx (elf, &shdrstrndx) == -1)
580c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	{
590c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  printf ("elf_getshdrstrnd failed %s\n", elf_errmsg (-1));
600c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  result = 1;
610c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  close (fd);
620c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  continue;
630c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	}
640c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
650c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      Elf_Scn *scn = NULL;
660c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      while ((scn = elf_nextscn (elf, scn)) != NULL)
670c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	{
680c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  int idx = elf_ndxscn (scn);
690c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  GElf_Shdr shdr;
700c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  if (gelf_getshdr (scn, &shdr) == NULL)
710c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	    {
720c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      printf ("gelf_getshdr failed: %s\n", elf_errmsg (-1));
730c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      result = 1;
740c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      break;
750c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	    }
760c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
770c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  const char *sname = elf_strptr (elf, shdrstrndx, shdr.sh_name);
780c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  if (sname == NULL)
790c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	    {
800c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      printf ("couldn't get section name: %s\n", elf_errmsg (-1));
810c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      result = 1;
820c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      break;
830c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	    }
840c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
850c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	  if (strncmp(".zdebug", sname, strlen (".zdebug")) == 0)
860c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	    {
870c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      ssize_t size;
880c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      if ((size = dwelf_scn_gnu_compressed_size (scn)) == -1)
890c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard		{
900c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard		  printf ("dwelf_scn_gnu_compressed_size failed: %s\n",
910c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard			  elf_errmsg (-1));
920c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard		  result = 1;
930c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard		  break;
940c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard		}
950c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	      printf ("section %d: GNU Compressed size: %zx\n", idx, size);
960c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	    }
970c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard	}
980c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
990c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      elf_end (elf);
1000c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard      close (fd);
1010c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard    }
1020c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard
1030c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard  return result;
1040c32b6f086b9838fe4b7d93575068554d0c420f7Mark Wielaard}
105