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 if ((shdr.sh_flags & SHF_COMPRESSED) != 0) 78 { 79 GElf_Chdr chdr; 80 if (gelf_getchdr (scn, &chdr) == NULL) 81 { 82 printf ("gelf_getchdr failed: %s\n", elf_errmsg (-1)); 83 result = 1; 84 break; 85 } 86 87 printf ("section %d: ELF Compressed ch_type: %" PRId32 88 ", ch_size: %" PRIx64 ", ch_addralign: %" PRIx64 "\n", 89 idx, chdr.ch_type, chdr.ch_size, chdr.ch_addralign); 90 } 91 else 92 { 93 const char *sname = elf_strptr (elf, shdrstrndx, shdr.sh_name); 94 if (sname == NULL) 95 { 96 printf ("couldn't get section name: %s\n", elf_errmsg (-1)); 97 result = 1; 98 break; 99 } 100 101 /* This duplicates what the dwelfgnucompressed testcase does. */ 102 if (strncmp(".zdebug", sname, strlen (".zdebug")) == 0) 103 { 104 ssize_t size; 105 if ((size = dwelf_scn_gnu_compressed_size (scn)) == -1) 106 { 107 printf ("dwelf_scn_gnu_compressed_size failed: %s\n", 108 elf_errmsg (-1)); 109 result = 1; 110 break; 111 } 112 printf ("section %d: GNU Compressed size: %zx\n", idx, size); 113 } 114 else 115 printf ("section %d: NOT Compressed\n", idx); 116 } 117 } 118 119 elf_end (elf); 120 close (fd); 121 } 122 123 return result; 124} 125