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