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