1da0c48c4Sopenharmony_ci/* Copyright (C) 2012 Red Hat, Inc. 2da0c48c4Sopenharmony_ci This file is part of elfutils. 3da0c48c4Sopenharmony_ci 4da0c48c4Sopenharmony_ci This file is free software; you can redistribute it and/or modify 5da0c48c4Sopenharmony_ci it under the terms of the GNU General Public License as published by 6da0c48c4Sopenharmony_ci the Free Software Foundation; either version 3 of the License, or 7da0c48c4Sopenharmony_ci (at your option) any later version. 8da0c48c4Sopenharmony_ci 9da0c48c4Sopenharmony_ci elfutils is distributed in the hope that it will be useful, but 10da0c48c4Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 11da0c48c4Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12da0c48c4Sopenharmony_ci GNU General Public License for more details. 13da0c48c4Sopenharmony_ci 14da0c48c4Sopenharmony_ci You should have received a copy of the GNU General Public License 15da0c48c4Sopenharmony_ci along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16da0c48c4Sopenharmony_ci 17da0c48c4Sopenharmony_ci#ifdef HAVE_CONFIG_H 18da0c48c4Sopenharmony_ci# include <config.h> 19da0c48c4Sopenharmony_ci#endif 20da0c48c4Sopenharmony_ci 21da0c48c4Sopenharmony_ci#include <sys/types.h> 22da0c48c4Sopenharmony_ci#include <sys/stat.h> 23da0c48c4Sopenharmony_ci#include <stdio.h> 24da0c48c4Sopenharmony_ci#include <stdlib.h> 25da0c48c4Sopenharmony_ci#include <unistd.h> 26da0c48c4Sopenharmony_ci#include <errno.h> 27da0c48c4Sopenharmony_ci#include <string.h> 28da0c48c4Sopenharmony_ci#include <fcntl.h> 29da0c48c4Sopenharmony_ci#include <gelf.h> 30da0c48c4Sopenharmony_ci#include <libelf.h> 31da0c48c4Sopenharmony_ci#include <stdbool.h> 32da0c48c4Sopenharmony_ci#include <inttypes.h> 33da0c48c4Sopenharmony_ci 34da0c48c4Sopenharmony_ciint 35da0c48c4Sopenharmony_cimain (int argc, char *argv[]) 36da0c48c4Sopenharmony_ci{ 37da0c48c4Sopenharmony_ci if (argc != 3) 38da0c48c4Sopenharmony_ci { 39da0c48c4Sopenharmony_ci fprintf (stderr, "Needs two arguments.\n"); 40da0c48c4Sopenharmony_ci fprintf (stderr, "First needs to be 'READ', 'MMAP' or 'FDREAD'\n"); 41da0c48c4Sopenharmony_ci fprintf (stderr, "Second is the ELF file to read.\n"); 42da0c48c4Sopenharmony_ci exit (2); /* user error */ 43da0c48c4Sopenharmony_ci } 44da0c48c4Sopenharmony_ci 45da0c48c4Sopenharmony_ci bool do_mmap = false; 46da0c48c4Sopenharmony_ci bool close_fd = false; 47da0c48c4Sopenharmony_ci if (strcmp (argv[1], "READ") == 0) 48da0c48c4Sopenharmony_ci { 49da0c48c4Sopenharmony_ci do_mmap = false; 50da0c48c4Sopenharmony_ci close_fd = false; 51da0c48c4Sopenharmony_ci } 52da0c48c4Sopenharmony_ci else if (strcmp (argv[1], "MMAP") == 0) 53da0c48c4Sopenharmony_ci { 54da0c48c4Sopenharmony_ci do_mmap = true; 55da0c48c4Sopenharmony_ci close_fd = false; 56da0c48c4Sopenharmony_ci } 57da0c48c4Sopenharmony_ci else if (strcmp (argv[1], "FDREAD") == 0) 58da0c48c4Sopenharmony_ci { 59da0c48c4Sopenharmony_ci do_mmap = false; 60da0c48c4Sopenharmony_ci close_fd = true; 61da0c48c4Sopenharmony_ci } 62da0c48c4Sopenharmony_ci else 63da0c48c4Sopenharmony_ci { 64da0c48c4Sopenharmony_ci fprintf (stderr, "First arg needs to be 'READ', 'MMAP' or 'FDREAD'\n"); 65da0c48c4Sopenharmony_ci exit (2); /* user error */ 66da0c48c4Sopenharmony_ci } 67da0c48c4Sopenharmony_ci 68da0c48c4Sopenharmony_ci elf_version (EV_CURRENT); 69da0c48c4Sopenharmony_ci 70da0c48c4Sopenharmony_ci int fd = open (argv[2], O_RDONLY); 71da0c48c4Sopenharmony_ci if (fd < 0) 72da0c48c4Sopenharmony_ci { 73da0c48c4Sopenharmony_ci fprintf (stderr, "Cannot open input file %s: %s\n", argv[2], 74da0c48c4Sopenharmony_ci strerror (errno)); 75da0c48c4Sopenharmony_ci exit (2); 76da0c48c4Sopenharmony_ci } 77da0c48c4Sopenharmony_ci 78da0c48c4Sopenharmony_ci Elf *elf = elf_begin (fd, do_mmap ? ELF_C_READ_MMAP : ELF_C_READ, NULL); 79da0c48c4Sopenharmony_ci if (elf == NULL) 80da0c48c4Sopenharmony_ci { 81da0c48c4Sopenharmony_ci fprintf (stderr, "elf_begin failed for %s: %s\n", argv[2], 82da0c48c4Sopenharmony_ci elf_errmsg (-1)); 83da0c48c4Sopenharmony_ci exit (2); 84da0c48c4Sopenharmony_ci } 85da0c48c4Sopenharmony_ci 86da0c48c4Sopenharmony_ci if (! do_mmap && close_fd) 87da0c48c4Sopenharmony_ci { 88da0c48c4Sopenharmony_ci if (elf_cntl (elf, ELF_C_FDREAD) < 0) 89da0c48c4Sopenharmony_ci { 90da0c48c4Sopenharmony_ci fprintf (stderr, "elf_cntl failed for %s: %s\n", argv[2], 91da0c48c4Sopenharmony_ci elf_errmsg (-1)); 92da0c48c4Sopenharmony_ci exit (1); 93da0c48c4Sopenharmony_ci } 94da0c48c4Sopenharmony_ci close (fd); 95da0c48c4Sopenharmony_ci } 96da0c48c4Sopenharmony_ci 97da0c48c4Sopenharmony_ci Elf_Scn *scn = NULL; 98da0c48c4Sopenharmony_ci while ((scn = elf_nextscn (elf, scn)) != NULL) 99da0c48c4Sopenharmony_ci { 100da0c48c4Sopenharmony_ci GElf_Shdr shdr_mem; 101da0c48c4Sopenharmony_ci GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); 102da0c48c4Sopenharmony_ci printf ("Section at offset %#0" PRIx64 "\n", shdr->sh_offset); 103da0c48c4Sopenharmony_ci } 104da0c48c4Sopenharmony_ci 105da0c48c4Sopenharmony_ci elf_end (elf); 106da0c48c4Sopenharmony_ci exit (0); 107da0c48c4Sopenharmony_ci} 108