]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/rddbg.c
Stop the generation of mapping symbols in the debug sections of ARM and AArch64 binaries.
[thirdparty/binutils-gdb.git] / binutils / rddbg.c
CommitLineData
252b5132 1/* rddbg.c -- Read debugging information into a generic form.
2571583a 2 Copyright (C) 1995-2017 Free Software Foundation, Inc.
252b5132
RH
3 Written by Ian Lance Taylor <ian@cygnus.com>.
4
5 This file is part of GNU Binutils.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
32866df7 9 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
b43b5d5f
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
252b5132 21
32866df7 22
252b5132
RH
23/* This file reads debugging information into a generic form. This
24 file knows how to dig the debugging information out of an object
25 file. */
26
3db64b00 27#include "sysdep.h"
252b5132 28#include "bfd.h"
252b5132 29#include "libiberty.h"
3db64b00 30#include "bucomm.h"
252b5132
RH
31#include "debug.h"
32#include "budbg.h"
33
b34976b6 34static bfd_boolean read_section_stabs_debugging_info
2da42df6 35 (bfd *, asymbol **, long, void *, bfd_boolean *);
b34976b6 36static bfd_boolean read_symbol_stabs_debugging_info
2da42df6
AJ
37 (bfd *, asymbol **, long, void *, bfd_boolean *);
38static bfd_boolean read_ieee_debugging_info (bfd *, void *, bfd_boolean *);
39static void save_stab (int, int, bfd_vma, const char *);
40static void stab_context (void);
41static void free_saved_stabs (void);
252b5132
RH
42
43/* Read debugging information from a BFD. Returns a generic debugging
44 pointer. */
45
2da42df6 46void *
b922d590 47read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_messages)
252b5132 48{
2da42df6 49 void *dhandle;
b34976b6 50 bfd_boolean found;
252b5132
RH
51
52 dhandle = debug_init ();
53 if (dhandle == NULL)
54 return NULL;
55
56 if (! read_section_stabs_debugging_info (abfd, syms, symcount, dhandle,
57 &found))
58 return NULL;
59
60 if (bfd_get_flavour (abfd) == bfd_target_aout_flavour)
61 {
62 if (! read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle,
63 &found))
64 return NULL;
65 }
66
67 if (bfd_get_flavour (abfd) == bfd_target_ieee_flavour)
68 {
69 if (! read_ieee_debugging_info (abfd, dhandle, &found))
70 return NULL;
71 }
72
73 /* Try reading the COFF symbols if we didn't find any stabs in COFF
74 sections. */
75 if (! found
76 && bfd_get_flavour (abfd) == bfd_target_coff_flavour
77 && symcount > 0)
78 {
79 if (! parse_coff (abfd, syms, symcount, dhandle))
80 return NULL;
b34976b6 81 found = TRUE;
252b5132
RH
82 }
83
84 if (! found)
85 {
b922d590
NC
86 if (! no_messages)
87 non_fatal (_("%s: no recognized debugging information"),
88 bfd_get_filename (abfd));
252b5132
RH
89 return NULL;
90 }
91
92 return dhandle;
93}
94
95/* Read stabs in sections debugging information from a BFD. */
96
b34976b6 97static bfd_boolean
2da42df6
AJ
98read_section_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount,
99 void *dhandle, bfd_boolean *pfound)
252b5132
RH
100{
101 static struct
102 {
103 const char *secname;
104 const char *strsecname;
7806762e
NC
105 }
106 names[] =
107 {
108 { ".stab", ".stabstr" },
109 { "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr" },
110 { "$GDB_SYMBOLS$", "$GDB_STRINGS$" }
111 };
252b5132 112 unsigned int i;
2da42df6 113 void *shandle;
252b5132 114
b34976b6 115 *pfound = FALSE;
252b5132
RH
116 shandle = NULL;
117
118 for (i = 0; i < sizeof names / sizeof names[0]; i++)
119 {
120 asection *sec, *strsec;
121
122 sec = bfd_get_section_by_name (abfd, names[i].secname);
123 strsec = bfd_get_section_by_name (abfd, names[i].strsecname);
124 if (sec != NULL && strsec != NULL)
125 {
126 bfd_size_type stabsize, strsize;
127 bfd_byte *stabs, *strings;
128 bfd_byte *stab;
129 bfd_size_type stroff, next_stroff;
130
131 stabsize = bfd_section_size (abfd, sec);
132 stabs = (bfd_byte *) xmalloc (stabsize);
133 if (! bfd_get_section_contents (abfd, sec, stabs, 0, stabsize))
134 {
135 fprintf (stderr, "%s: %s: %s\n",
136 bfd_get_filename (abfd), names[i].secname,
137 bfd_errmsg (bfd_get_error ()));
b34976b6 138 return FALSE;
252b5132
RH
139 }
140
141 strsize = bfd_section_size (abfd, strsec);
f41e4712 142 strings = (bfd_byte *) xmalloc (strsize + 1);
252b5132
RH
143 if (! bfd_get_section_contents (abfd, strsec, strings, 0, strsize))
144 {
145 fprintf (stderr, "%s: %s: %s\n",
146 bfd_get_filename (abfd), names[i].strsecname,
147 bfd_errmsg (bfd_get_error ()));
b34976b6 148 return FALSE;
252b5132 149 }
f41e4712
NC
150 /* Zero terminate the strings table, just in case. */
151 strings [strsize] = 0;
252b5132
RH
152 if (shandle == NULL)
153 {
b34976b6 154 shandle = start_stab (dhandle, abfd, TRUE, syms, symcount);
252b5132 155 if (shandle == NULL)
b34976b6 156 return FALSE;
252b5132
RH
157 }
158
b34976b6 159 *pfound = TRUE;
252b5132
RH
160
161 stroff = 0;
162 next_stroff = 0;
f41e4712
NC
163 /* PR 17512: file: 078-60391-0.001:0.1. */
164 for (stab = stabs; stab <= (stabs + stabsize) - 12; stab += 12)
252b5132 165 {
37cc8ec1 166 unsigned int strx;
252b5132 167 int type;
3d540e93 168 int other ATTRIBUTE_UNUSED;
252b5132
RH
169 int desc;
170 bfd_vma value;
171
172 /* This code presumes 32 bit values. */
173
174 strx = bfd_get_32 (abfd, stab);
175 type = bfd_get_8 (abfd, stab + 4);
176 other = bfd_get_8 (abfd, stab + 5);
177 desc = bfd_get_16 (abfd, stab + 6);
178 value = bfd_get_32 (abfd, stab + 8);
179
180 if (type == 0)
181 {
182 /* Special type 0 stabs indicate the offset to the
f3931575 183 next string table. */
252b5132
RH
184 stroff = next_stroff;
185 next_stroff += value;
186 }
187 else
188 {
f41e4712 189 size_t len;
252b5132
RH
190 char *f, *s;
191
f41e4712 192 if (stroff + strx >= strsize)
3b7aaf81 193 {
f41e4712 194 fprintf (stderr, _("%s: %s: stab entry %ld is corrupt, strx = 0x%x, type = %d\n"),
3b7aaf81 195 bfd_get_filename (abfd), names[i].secname,
22d82235 196 (long) (stab - stabs) / 12, strx, type);
3b7aaf81
NC
197 continue;
198 }
53c7db4b 199
252b5132 200 s = (char *) strings + stroff + strx;
f41e4712 201 f = NULL;
53c7db4b 202
f41e4712
NC
203 /* PR 17512: file: 002-87578-0.001:0.1.
204 It is possible to craft a file where, without the 'strlen (s) > 0',
205 an attempt to read the byte before 'strings' would occur. */
206 while ((len = strlen (s)) > 0
207 && s[len - 1] == '\\'
252b5132
RH
208 && stab + 12 < stabs + stabsize)
209 {
210 char *p;
211
212 stab += 12;
f41e4712 213 p = s + len - 1;
252b5132 214 *p = '\0';
f41e4712
NC
215 strx = stroff + bfd_get_32 (abfd, stab);
216 if (strx >= strsize)
217 {
218 fprintf (stderr, _("%s: %s: stab entry %ld is corrupt\n"),
219 bfd_get_filename (abfd), names[i].secname,
220 (long) (stab - stabs) / 12);
221 break;
222 }
223 else
224 s = concat (s, (char *) strings + strx,
225 (const char *) NULL);
252b5132
RH
226
227 /* We have to restore the backslash, because, if
f3931575
AM
228 the linker is hashing stabs strings, we may
229 see the same string more than once. */
252b5132
RH
230 *p = '\\';
231
232 if (f != NULL)
233 free (f);
234 f = s;
235 }
236
237 save_stab (type, desc, value, s);
238
239 if (! parse_stab (dhandle, shandle, type, desc, value, s))
240 {
241 stab_context ();
242 free_saved_stabs ();
b34976b6 243 return FALSE;
252b5132
RH
244 }
245
246 /* Don't free f, since I think the stabs code
f3931575
AM
247 expects strings to hang around. This should be
248 straightened out. FIXME. */
252b5132
RH
249 }
250 }
251
252 free_saved_stabs ();
253 free (stabs);
254
255 /* Don't free strings, since I think the stabs code expects
f3931575
AM
256 the strings to hang around. This should be straightened
257 out. FIXME. */
252b5132
RH
258 }
259 }
260
261 if (shandle != NULL)
262 {
263 if (! finish_stab (dhandle, shandle))
b34976b6 264 return FALSE;
252b5132
RH
265 }
266
b34976b6 267 return TRUE;
252b5132
RH
268}
269
270/* Read stabs in the symbol table. */
271
b34976b6 272static bfd_boolean
2da42df6
AJ
273read_symbol_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount,
274 void *dhandle, bfd_boolean *pfound)
252b5132 275{
2da42df6 276 void *shandle;
252b5132
RH
277 asymbol **ps, **symend;
278
279 shandle = NULL;
280 symend = syms + symcount;
281 for (ps = syms; ps < symend; ps++)
282 {
283 symbol_info i;
284
285 bfd_get_symbol_info (abfd, *ps, &i);
286
287 if (i.type == '-')
288 {
289 const char *s;
290 char *f;
291
292 if (shandle == NULL)
293 {
b34976b6 294 shandle = start_stab (dhandle, abfd, FALSE, syms, symcount);
252b5132 295 if (shandle == NULL)
b34976b6 296 return FALSE;
252b5132
RH
297 }
298
b34976b6 299 *pfound = TRUE;
252b5132
RH
300
301 s = i.name;
92134dc1
NC
302 if (s == NULL || strlen (s) < 1)
303 return FALSE;
252b5132 304 f = NULL;
92134dc1 305
252b5132
RH
306 while (s[strlen (s) - 1] == '\\'
307 && ps + 1 < symend)
308 {
309 char *sc, *n;
310
311 ++ps;
312 sc = xstrdup (s);
313 sc[strlen (sc) - 1] = '\0';
314 n = concat (sc, bfd_asymbol_name (*ps), (const char *) NULL);
315 free (sc);
316 if (f != NULL)
317 free (f);
318 f = n;
319 s = n;
320 }
321
322 save_stab (i.stab_type, i.stab_desc, i.value, s);
323
324 if (! parse_stab (dhandle, shandle, i.stab_type, i.stab_desc,
325 i.value, s))
326 {
327 stab_context ();
328 free_saved_stabs ();
b34976b6 329 return FALSE;
252b5132
RH
330 }
331
332 /* Don't free f, since I think the stabs code expects
333 strings to hang around. This should be straightened out.
334 FIXME. */
335 }
336 }
337
338 free_saved_stabs ();
339
340 if (shandle != NULL)
341 {
342 if (! finish_stab (dhandle, shandle))
b34976b6 343 return FALSE;
252b5132
RH
344 }
345
b34976b6 346 return TRUE;
252b5132
RH
347}
348
349/* Read IEEE debugging information. */
350
b34976b6 351static bfd_boolean
2da42df6 352read_ieee_debugging_info (bfd *abfd, void *dhandle, bfd_boolean *pfound)
252b5132
RH
353{
354 asection *dsec;
355 bfd_size_type size;
356 bfd_byte *contents;
357
358 /* The BFD backend puts the debugging information into a section
359 named .debug. */
360
361 dsec = bfd_get_section_by_name (abfd, ".debug");
362 if (dsec == NULL)
b34976b6 363 return TRUE;
252b5132
RH
364
365 size = bfd_section_size (abfd, dsec);
366 contents = (bfd_byte *) xmalloc (size);
367 if (! bfd_get_section_contents (abfd, dsec, contents, 0, size))
b34976b6 368 return FALSE;
252b5132
RH
369
370 if (! parse_ieee (dhandle, abfd, contents, size))
b34976b6 371 return FALSE;
252b5132
RH
372
373 free (contents);
374
b34976b6 375 *pfound = TRUE;
252b5132 376
b34976b6 377 return TRUE;
252b5132
RH
378}
379\f
380/* Record stabs strings, so that we can give some context for errors. */
381
382#define SAVE_STABS_COUNT (16)
383
384struct saved_stab
385{
386 int type;
387 int desc;
388 bfd_vma value;
389 char *string;
390};
391
392static struct saved_stab saved_stabs[SAVE_STABS_COUNT];
393static int saved_stabs_index;
394
395/* Save a stabs string. */
396
397static void
2da42df6 398save_stab (int type, int desc, bfd_vma value, const char *string)
252b5132
RH
399{
400 if (saved_stabs[saved_stabs_index].string != NULL)
401 free (saved_stabs[saved_stabs_index].string);
402 saved_stabs[saved_stabs_index].type = type;
403 saved_stabs[saved_stabs_index].desc = desc;
404 saved_stabs[saved_stabs_index].value = value;
405 saved_stabs[saved_stabs_index].string = xstrdup (string);
406 saved_stabs_index = (saved_stabs_index + 1) % SAVE_STABS_COUNT;
407}
408
409/* Provide context for an error. */
410
411static void
2da42df6 412stab_context (void)
252b5132
RH
413{
414 int i;
415
416 fprintf (stderr, _("Last stabs entries before error:\n"));
417 fprintf (stderr, "n_type n_desc n_value string\n");
418
419 i = saved_stabs_index;
420 do
421 {
422 struct saved_stab *stabp;
423
424 stabp = saved_stabs + i;
425 if (stabp->string != NULL)
426 {
427 const char *s;
428
429 s = bfd_get_stab_name (stabp->type);
430 if (s != NULL)
431 fprintf (stderr, "%-6s", s);
432 else if (stabp->type == 0)
433 fprintf (stderr, "HdrSym");
434 else
435 fprintf (stderr, "%-6d", stabp->type);
436 fprintf (stderr, " %-6d ", stabp->desc);
437 fprintf_vma (stderr, stabp->value);
438 if (stabp->type != 0)
439 fprintf (stderr, " %s", stabp->string);
440 fprintf (stderr, "\n");
441 }
442 i = (i + 1) % SAVE_STABS_COUNT;
443 }
444 while (i != saved_stabs_index);
445}
446
447/* Free the saved stab strings. */
448
449static void
2da42df6 450free_saved_stabs (void)
252b5132
RH
451{
452 int i;
453
454 for (i = 0; i < SAVE_STABS_COUNT; i++)
455 {
456 if (saved_stabs[i].string != NULL)
457 {
458 free (saved_stabs[i].string);
459 saved_stabs[i].string = NULL;
460 }
461 }
462
463 saved_stabs_index = 0;
464}