14894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek/* Copyright (C) 2011 Red Hat, Inc. 2de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard This file is part of elfutils. 34894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek Written by Marek Polacek <mpolacek@redhat.com>, 2011. 44894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard This file is free software; you can redistribute it and/or modify 6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard it under the terms of the GNU General Public License as published by 7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard the Free Software Foundation; either version 3 of the License, or 8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard (at your option) any later version. 94894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard elfutils is distributed in the hope that it will be useful, but 114894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek WITHOUT ANY WARRANTY; without even the implied warranty of 12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard GNU General Public License for more details. 144894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard You should have received a copy of the GNU General Public License 16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard along with this program. If not, see <http://www.gnu.org/licenses/>. */ 174894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 184894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#ifdef HAVE_CONFIG_H 194894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek# include <config.h> 204894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#endif 214894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 224894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include ELFUTILS_HEADER(dwfl) 234894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <assert.h> 244894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <dwarf.h> 254894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <fcntl.h> 264894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <stdio.h> 274894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek#include <unistd.h> 284894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 294894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 304894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacekint 314894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacekmain (int argc, char *argv[]) 324894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek{ 334894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek int cnt; 344894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 354894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek for (cnt = 1; cnt < argc; ++cnt) 364894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek { 374894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek Dwarf_Off offset = 0; 384894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek size_t len; 394894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 403425454a10d307fae891fb667cf7969e945cde79Josh Stone int fd = open (argv[cnt], O_RDONLY); 414894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek if (fd == -1) 424894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek { 434894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek printf ("cannot open '%s': %m\n", argv[cnt]); 444894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek return 1; 454894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek } 464894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 474894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ); 484894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek if (dbg == NULL) 494894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek { 504894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek printf ("%s not usable: %s\n", argv[cnt], dwarf_errmsg (-1)); 514894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek close (fd); 524894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek return 1; 534894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek } 544894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 554894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek /* Try to use NULL Dwarf object. */ 564894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek const char *str = dwarf_getstring (NULL, offset, &len); 574894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek assert (str == NULL); 584894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 594894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek /* Use insane offset. */ 604894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek str = dwarf_getstring (dbg, ~0UL, &len); 614894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek assert (str == NULL); 624894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 634894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek /* Now do some real work. */ 644894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek for (int i = 0; i < 100; ++i) 654894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek { 664894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek str = dwarf_getstring (dbg, offset, &len); 674894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek puts (str); 684894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 694894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek /* Advance. */ 704894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek offset += len + 1; 714894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek } 724894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 73a1372e06a04bad29e8c3c79d95497a8e381f823fMark Wielaard dwarf_end (dbg); 744894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek close (fd); 754894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek } 764894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek 774894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek return 0; 784894221f67d2267f9d701366f257dc2ff44a24c3Marek Polacek} 79