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