1da0c48c4Sopenharmony_ci/* Copyright (C) 2011 Red Hat, Inc. 2da0c48c4Sopenharmony_ci This file is part of elfutils. 3da0c48c4Sopenharmony_ci Written by Marek Polacek <mpolacek@redhat.com>, 2011. 4da0c48c4Sopenharmony_ci 5da0c48c4Sopenharmony_ci This file is free software; you can redistribute it and/or modify 6da0c48c4Sopenharmony_ci it under the terms of the GNU General Public License as published by 7da0c48c4Sopenharmony_ci the Free Software Foundation; either version 3 of the License, or 8da0c48c4Sopenharmony_ci (at your option) any later version. 9da0c48c4Sopenharmony_ci 10da0c48c4Sopenharmony_ci elfutils is distributed in the hope that it will be useful, but 11da0c48c4Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 12da0c48c4Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13da0c48c4Sopenharmony_ci GNU General Public License for more details. 14da0c48c4Sopenharmony_ci 15da0c48c4Sopenharmony_ci You should have received a copy of the GNU General Public License 16da0c48c4Sopenharmony_ci along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17da0c48c4Sopenharmony_ci 18da0c48c4Sopenharmony_ci#ifdef HAVE_CONFIG_H 19da0c48c4Sopenharmony_ci# include <config.h> 20da0c48c4Sopenharmony_ci#endif 21da0c48c4Sopenharmony_ci 22da0c48c4Sopenharmony_ci#include ELFUTILS_HEADER(dwfl) 23da0c48c4Sopenharmony_ci#include <assert.h> 24da0c48c4Sopenharmony_ci#include <dwarf.h> 25da0c48c4Sopenharmony_ci#include <fcntl.h> 26da0c48c4Sopenharmony_ci#include <stdio.h> 27da0c48c4Sopenharmony_ci#include <unistd.h> 28da0c48c4Sopenharmony_ci 29da0c48c4Sopenharmony_ci 30da0c48c4Sopenharmony_ciint 31da0c48c4Sopenharmony_cimain (int argc, char *argv[]) 32da0c48c4Sopenharmony_ci{ 33da0c48c4Sopenharmony_ci int cnt; 34da0c48c4Sopenharmony_ci 35da0c48c4Sopenharmony_ci for (cnt = 1; cnt < argc; ++cnt) 36da0c48c4Sopenharmony_ci { 37da0c48c4Sopenharmony_ci Dwarf_Off offset = 0; 38da0c48c4Sopenharmony_ci size_t len; 39da0c48c4Sopenharmony_ci 40da0c48c4Sopenharmony_ci int fd = open (argv[cnt], O_RDONLY); 41da0c48c4Sopenharmony_ci if (fd == -1) 42da0c48c4Sopenharmony_ci { 43da0c48c4Sopenharmony_ci printf ("cannot open '%s': %m\n", argv[cnt]); 44da0c48c4Sopenharmony_ci return 1; 45da0c48c4Sopenharmony_ci } 46da0c48c4Sopenharmony_ci 47da0c48c4Sopenharmony_ci Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ); 48da0c48c4Sopenharmony_ci if (dbg == NULL) 49da0c48c4Sopenharmony_ci { 50da0c48c4Sopenharmony_ci printf ("%s not usable: %s\n", argv[cnt], dwarf_errmsg (-1)); 51da0c48c4Sopenharmony_ci close (fd); 52da0c48c4Sopenharmony_ci return 1; 53da0c48c4Sopenharmony_ci } 54da0c48c4Sopenharmony_ci 55da0c48c4Sopenharmony_ci /* Try to use NULL Dwarf object. */ 56da0c48c4Sopenharmony_ci const char *str = dwarf_getstring (NULL, offset, &len); 57da0c48c4Sopenharmony_ci assert (str == NULL); 58da0c48c4Sopenharmony_ci 59da0c48c4Sopenharmony_ci /* Use insane offset. */ 60da0c48c4Sopenharmony_ci str = dwarf_getstring (dbg, ~0UL, &len); 61da0c48c4Sopenharmony_ci assert (str == NULL); 62da0c48c4Sopenharmony_ci 63da0c48c4Sopenharmony_ci /* Now do some real work. */ 64da0c48c4Sopenharmony_ci for (int i = 0; i < 100; ++i) 65da0c48c4Sopenharmony_ci { 66da0c48c4Sopenharmony_ci str = dwarf_getstring (dbg, offset, &len); 67da0c48c4Sopenharmony_ci puts (str); 68da0c48c4Sopenharmony_ci 69da0c48c4Sopenharmony_ci /* Advance. */ 70da0c48c4Sopenharmony_ci offset += len + 1; 71da0c48c4Sopenharmony_ci } 72da0c48c4Sopenharmony_ci 73da0c48c4Sopenharmony_ci dwarf_end (dbg); 74da0c48c4Sopenharmony_ci close (fd); 75da0c48c4Sopenharmony_ci } 76da0c48c4Sopenharmony_ci 77da0c48c4Sopenharmony_ci return 0; 78da0c48c4Sopenharmony_ci} 79