1/* Copyright (C) 2012, 2013 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 <fcntl.h> 22#include ELFUTILS_HEADER(dw) 23#include <stdio.h> 24#include <unistd.h> 25#include <dwarf.h> 26 27int 28main (int argc, char *argv[]) 29{ 30 for (int i = 1; i < argc; ++i) 31 { 32 int fd = open (argv[i], O_RDONLY); 33 34 Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ); 35 if (dbg != NULL) 36 { 37 Dwarf_Off off = 0; 38 size_t cuhl; 39 Dwarf_Off noff; 40 uint64_t type_sig; 41 42 while (dwarf_next_unit (dbg, off, &noff, &cuhl, NULL, NULL, NULL, 43 NULL, &type_sig, NULL) == 0) 44 { 45 Dwarf_Die die_mem; 46 dwarf_offdie_types (dbg, off + cuhl, &die_mem); 47 off = noff; 48 } 49 50 off = 0; 51 52 while (dwarf_nextcu (dbg, off, &noff, &cuhl, NULL, NULL, NULL) == 0) 53 { 54 Dwarf_Die die_mem; 55 Dwarf_Die *die = dwarf_offdie (dbg, off + cuhl, &die_mem); 56 57 Dwarf_Die iter_mem; 58 Dwarf_Die *iter = &iter_mem; 59 dwarf_child (die, &iter_mem); 60 61 while (1) 62 { 63 if (dwarf_tag (iter) == DW_TAG_variable) 64 { 65 Dwarf_Attribute attr_mem; 66 Dwarf_Die form_mem, *form; 67 form = dwarf_formref_die (dwarf_attr (iter, DW_AT_type, 68 &attr_mem), 69 &form_mem); 70 71 if (form == NULL) 72 printf ("fail\n"); 73 else 74 printf ("ok\n"); 75 } 76 77 if (dwarf_siblingof (iter, &iter_mem) != 0) 78 break; 79 } 80 81 off = noff; 82 } 83 84 dwarf_end (dbg); 85 } 86 87 close (fd); 88 } 89} 90