1 /* Copyright (C) 2002, 2004 Red Hat, Inc. 2 Written by Ulrich Drepper <drepper (at) redhat.com>, 2002. 3 4 This program is Open Source software; you can redistribute it and/or 5 modify it under the terms of the Open Software License version 1.0 as 6 published by the Open Source Initiative. 7 8 You should have received a copy of the Open Software License along 9 with this program; if not, you may obtain a copy of the Open Software 10 License version 1.0 from http://www.opensource.org/licenses/osl.php or 11 by writing the Open Source Initiative c/o Lawrence Rosen, Esq., 12 3001 King Ranch Road, Ukiah, CA 95482. */ 13 14 #include <fcntl.h> 15 #include <libelf.h> 16 #include <libdw.h> 17 #include <stdio.h> 18 #include <unistd.h> 19 20 21 static const Dwarf_Addr testaddr[] = 22 { 23 0x804842b, 0x804842c, 0x804843c, 0x8048459, 0x804845a, 24 0x804845b, 0x804845c, 0x8048460, 0x8048465, 0x8048466, 25 0x8048467, 0x8048468, 0x8048470, 0x8048471, 0x8048472 26 }; 27 #define ntestaddr (sizeof (testaddr) / sizeof (testaddr[0])) 28 29 30 int 31 main (int argc, char *argv[]) 32 { 33 int result = 0; 34 int cnt; 35 36 for (cnt = 1; cnt < argc; ++cnt) 37 { 38 int fd = open (argv[cnt], O_RDONLY); 39 40 Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ); 41 if (dbg == NULL) 42 { 43 printf ("%s not usable\n", argv[cnt]); 44 result = 1; 45 close (fd); 46 continue; 47 } 48 49 Dwarf_Aranges *aranges; 50 size_t naranges; 51 if (dwarf_getaranges (dbg, &aranges, &naranges) != 0) 52 printf ("%s: cannot get aranges\n", argv[cnt]); 53 else 54 { 55 for (size_t i = 0; i < ntestaddr; ++i) 56 { 57 Dwarf_Arange *found; 58 59 found = dwarf_getarange_addr (aranges, testaddr[i]); 60 if (found != NULL) 61 { 62 Dwarf_Off cu_offset; 63 64 if (dwarf_getarangeinfo (found, NULL, NULL, &cu_offset) != 0) 65 { 66 puts ("failed to get CU die offset"); 67 result = 1; 68 } 69 else 70 { 71 const char *cuname; 72 Dwarf_Die cu_die; 73 74 if (dwarf_offdie (dbg, cu_offset, &cu_die) == NULL 75 || (cuname = dwarf_diename (&cu_die)) == NULL) 76 { 77 puts ("failed to get CU die"); 78 result = 1; 79 } 80 else 81 printf ("CU name: \"%s\"\n", cuname); 82 } 83 } 84 else 85 printf ("%#llx: not in range\n", 86 (unsigned long long int) testaddr[i]); 87 } 88 89 for (size_t i = 0; i < naranges; ++i) 90 { 91 Dwarf_Arange *arange = dwarf_onearange (aranges, i); 92 if (arange == NULL) 93 { 94 printf ("cannot get arange %zu: %s\n", i, dwarf_errmsg (-1)); 95 break; 96 } 97 98 Dwarf_Addr start; 99 Dwarf_Word length; 100 Dwarf_Off cu_offset; 101 102 if (dwarf_getarangeinfo (arange, &start, &length, &cu_offset) 103 != 0) 104 { 105 printf ("cannot get info from aranges[%zu]\n", i); 106 result = 1; 107 } 108 else 109 { 110 printf (" [%2zu] start: %#llx, length: %llu, cu: %llu\n", 111 i, (unsigned long long int) start, 112 (unsigned long long int) length, 113 (unsigned long long int) cu_offset); 114 115 const char *cuname; 116 Dwarf_Die cu_die; 117 if (dwarf_offdie (dbg, cu_offset, &cu_die) == NULL 118 || (cuname = dwarf_diename (&cu_die)) == NULL) 119 { 120 puts ("failed to get CU die"); 121 result = 1; 122 } 123 else 124 printf ("CU name: \"%s\"\n", cuname); 125 } 126 } 127 } 128 129 dwarf_end (dbg); 130 close (fd); 131 } 132 133 return result; 134 } 135