X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=binutils%2Frddbg.c;h=4a690f628220952a8b5168ff25e6d702c01b24eb;hb=9be2ae8fc6b908746d9d7ebaf77aec8abba5dd2c;hp=2f6ec6e3ea1b924aca63da7012cb8cb390767829;hpb=22d822350adbb893b9ee44223a1468bf861d3b38;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/rddbg.c b/binutils/rddbg.c index 2f6ec6e3ea..4a690f6282 100644 --- a/binutils/rddbg.c +++ b/binutils/rddbg.c @@ -1,12 +1,12 @@ /* rddbg.c -- Read debugging information into a generic form. - Copyright 1995, 1996, 1997, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1995-2018 Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,42 +16,36 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + /* This file reads debugging information into a generic form. This file knows how to dig the debugging information out of an object file. */ +#include "sysdep.h" #include "bfd.h" -#include "bucomm.h" #include "libiberty.h" +#include "bucomm.h" #include "debug.h" #include "budbg.h" static bfd_boolean read_section_stabs_debugging_info - PARAMS ((bfd *, asymbol **, long, PTR, bfd_boolean *)); + (bfd *, asymbol **, long, void *, bfd_boolean *); static bfd_boolean read_symbol_stabs_debugging_info - PARAMS ((bfd *, asymbol **, long, PTR, bfd_boolean *)); -static bfd_boolean read_ieee_debugging_info - PARAMS ((bfd *, PTR, bfd_boolean *)); -static void save_stab - PARAMS ((int, int, bfd_vma, const char *)); -static void stab_context - PARAMS ((void)); -static void free_saved_stabs - PARAMS ((void)); + (bfd *, asymbol **, long, void *, bfd_boolean *); +static void save_stab (int, int, bfd_vma, const char *); +static void stab_context (void); +static void free_saved_stabs (void); /* Read debugging information from a BFD. Returns a generic debugging pointer. */ -PTR -read_debugging_info (abfd, syms, symcount) - bfd *abfd; - asymbol **syms; - long symcount; +void * +read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_messages) { - PTR dhandle; + void *dhandle; bfd_boolean found; dhandle = debug_init (); @@ -69,12 +63,6 @@ read_debugging_info (abfd, syms, symcount) return NULL; } - if (bfd_get_flavour (abfd) == bfd_target_ieee_flavour) - { - if (! read_ieee_debugging_info (abfd, dhandle, &found)) - return NULL; - } - /* Try reading the COFF symbols if we didn't find any stabs in COFF sections. */ if (! found @@ -88,8 +76,9 @@ read_debugging_info (abfd, syms, symcount) if (! found) { - non_fatal (_("%s: no recognized debugging information"), - bfd_get_filename (abfd)); + if (! no_messages) + non_fatal (_("%s: no recognized debugging information"), + bfd_get_filename (abfd)); return NULL; } @@ -99,21 +88,22 @@ read_debugging_info (abfd, syms, symcount) /* Read stabs in sections debugging information from a BFD. */ static bfd_boolean -read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) - bfd *abfd; - asymbol **syms; - long symcount; - PTR dhandle; - bfd_boolean *pfound; +read_section_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, + void *dhandle, bfd_boolean *pfound) { static struct { const char *secname; const char *strsecname; - } names[] = { { ".stab", ".stabstr" }, - { "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr" } }; + } + names[] = + { + { ".stab", ".stabstr" }, + { "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr" }, + { "$GDB_SYMBOLS$", "$GDB_STRINGS$" } + }; unsigned int i; - PTR shandle; + void *shandle; *pfound = FALSE; shandle = NULL; @@ -142,7 +132,7 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) } strsize = bfd_section_size (abfd, strsec); - strings = (bfd_byte *) xmalloc (strsize); + strings = (bfd_byte *) xmalloc (strsize + 1); if (! bfd_get_section_contents (abfd, strsec, strings, 0, strsize)) { fprintf (stderr, "%s: %s: %s\n", @@ -150,7 +140,8 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) bfd_errmsg (bfd_get_error ())); return FALSE; } - + /* Zero terminate the strings table, just in case. */ + strings [strsize] = 0; if (shandle == NULL) { shandle = start_stab (dhandle, abfd, TRUE, syms, symcount); @@ -162,11 +153,12 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) stroff = 0; next_stroff = 0; - for (stab = stabs; stab < stabs + stabsize; stab += 12) + /* PR 17512: file: 078-60391-0.001:0.1. */ + for (stab = stabs; stab <= (stabs + stabsize) - 12; stab += 12) { unsigned int strx; int type; - int other; + int other ATTRIBUTE_UNUSED; int desc; bfd_vma value; @@ -187,33 +179,43 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) } else { + size_t len; char *f, *s; - f = NULL; - - if (stroff + strx > strsize) + if (stroff + strx >= strsize) { - fprintf (stderr, "%s: %s: stab entry %ld is corrupt, strx = 0x%x, type = %d\n", + fprintf (stderr, _("%s: %s: stab entry %ld is corrupt, strx = 0x%x, type = %d\n"), bfd_get_filename (abfd), names[i].secname, (long) (stab - stabs) / 12, strx, type); continue; } s = (char *) strings + stroff + strx; + f = NULL; - while (s[strlen (s) - 1] == '\\' + /* PR 17512: file: 002-87578-0.001:0.1. + It is possible to craft a file where, without the 'strlen (s) > 0', + an attempt to read the byte before 'strings' would occur. */ + while ((len = strlen (s)) > 0 + && s[len - 1] == '\\' && stab + 12 < stabs + stabsize) { char *p; stab += 12; - p = s + strlen (s) - 1; + p = s + len - 1; *p = '\0'; - s = concat (s, - ((char *) strings - + stroff - + bfd_get_32 (abfd, stab)), - (const char *) NULL); + strx = stroff + bfd_get_32 (abfd, stab); + if (strx >= strsize) + { + fprintf (stderr, _("%s: %s: stab entry %ld is corrupt\n"), + bfd_get_filename (abfd), names[i].secname, + (long) (stab - stabs) / 12); + break; + } + else + s = concat (s, (char *) strings + strx, + (const char *) NULL); /* We have to restore the backslash, because, if the linker is hashing stabs strings, we may @@ -261,14 +263,10 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) /* Read stabs in the symbol table. */ static bfd_boolean -read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) - bfd *abfd; - asymbol **syms; - long symcount; - PTR dhandle; - bfd_boolean *pfound; +read_symbol_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, + void *dhandle, bfd_boolean *pfound) { - PTR shandle; + void *shandle; asymbol **ps, **symend; shandle = NULL; @@ -294,8 +292,12 @@ read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) *pfound = TRUE; s = i.name; + if (s == NULL || strlen (s) < 1) + return FALSE; f = NULL; - while (s[strlen (s) - 1] == '\\' + + while (strlen (s) > 0 + && s[strlen (s) - 1] == '\\' && ps + 1 < symend) { char *sc, *n; @@ -337,40 +339,6 @@ read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) return TRUE; } - -/* Read IEEE debugging information. */ - -static bfd_boolean -read_ieee_debugging_info (abfd, dhandle, pfound) - bfd *abfd; - PTR dhandle; - bfd_boolean *pfound; -{ - asection *dsec; - bfd_size_type size; - bfd_byte *contents; - - /* The BFD backend puts the debugging information into a section - named .debug. */ - - dsec = bfd_get_section_by_name (abfd, ".debug"); - if (dsec == NULL) - return TRUE; - - size = bfd_section_size (abfd, dsec); - contents = (bfd_byte *) xmalloc (size); - if (! bfd_get_section_contents (abfd, dsec, contents, 0, size)) - return FALSE; - - if (! parse_ieee (dhandle, abfd, contents, size)) - return FALSE; - - free (contents); - - *pfound = TRUE; - - return TRUE; -} /* Record stabs strings, so that we can give some context for errors. */ @@ -390,11 +358,7 @@ static int saved_stabs_index; /* Save a stabs string. */ static void -save_stab (type, desc, value, string) - int type; - int desc; - bfd_vma value; - const char *string; +save_stab (int type, int desc, bfd_vma value, const char *string) { if (saved_stabs[saved_stabs_index].string != NULL) free (saved_stabs[saved_stabs_index].string); @@ -408,7 +372,7 @@ save_stab (type, desc, value, string) /* Provide context for an error. */ static void -stab_context () +stab_context (void) { int i; @@ -446,7 +410,7 @@ stab_context () /* Free the saved stab strings. */ static void -free_saved_stabs () +free_saved_stabs (void) { int i;