1/* Copyright (C) 2015 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#ifdef HAVE_CONFIG_H 18# include <config.h> 19#endif 20 21#include <assert.h> 22#include <sys/types.h> 23#include <sys/stat.h> 24#include <fcntl.h> 25#include <inttypes.h> 26 27#include ELFUTILS_HEADER(elf) 28#include ELFUTILS_HEADER(dwelf) 29#include <gelf.h> 30 31#include <stdio.h> 32#include <unistd.h> 33#include <string.h> 34 35int 36main (int argc, char *argv[]) 37{ 38 int result = 0; 39 int cnt; 40 41 elf_version (EV_CURRENT); 42 43 for (cnt = 1; cnt < argc; ++cnt) 44 { 45 int fd = open (argv[cnt], O_RDONLY); 46 47 Elf *elf = elf_begin (fd, ELF_C_READ, NULL); 48 if (elf == NULL) 49 { 50 printf ("%s not usable %s\n", argv[cnt], elf_errmsg (-1)); 51 result = 1; 52 close (fd); 53 continue; 54 } 55 56 size_t shdrstrndx; 57 if (elf_getshdrstrndx (elf, &shdrstrndx) == -1) 58 { 59 printf ("elf_getshdrstrnd failed %s\n", elf_errmsg (-1)); 60 result = 1; 61 close (fd); 62 continue; 63 } 64 65 Elf_Scn *scn = NULL; 66 while ((scn = elf_nextscn (elf, scn)) != NULL) 67 { 68 int idx = elf_ndxscn (scn); 69 GElf_Shdr shdr; 70 if (gelf_getshdr (scn, &shdr) == NULL) 71 { 72 printf ("gelf_getshdr failed: %s\n", elf_errmsg (-1)); 73 result = 1; 74 break; 75 } 76 77 const char *sname = elf_strptr (elf, shdrstrndx, shdr.sh_name); 78 if (sname == NULL) 79 { 80 printf ("couldn't get section name: %s\n", elf_errmsg (-1)); 81 result = 1; 82 break; 83 } 84 85 if (strncmp(".zdebug", sname, strlen (".zdebug")) == 0) 86 { 87 ssize_t size; 88 if ((size = dwelf_scn_gnu_compressed_size (scn)) == -1) 89 { 90 printf ("dwelf_scn_gnu_compressed_size failed: %s\n", 91 elf_errmsg (-1)); 92 result = 1; 93 break; 94 } 95 printf ("section %d: GNU Compressed size: %zx\n", idx, size); 96 } 97 } 98 99 elf_end (elf); 100 close (fd); 101 } 102 103 return result; 104} 105