Index: gdb/symfile.c =================================================================== RCS file: /cvs/src/src/gdb/symfile.c,v retrieving revision 1.198 diff -u -p -r1.198 symfile.c --- gdb/symfile.c 29 Jan 2008 22:47:20 -0000 1.198 +++ gdb/symfile.c 11 Feb 2008 20:12:48 -0000 @@ -3102,15 +3103,20 @@ add_psymbol_to_list (char *name, int nam enum language language, struct objfile *objfile) { struct partial_symbol *psym; - char *buf = alloca (namelength + 1); + struct partial_symbol **ps; + char *buf = name; /* psymbol is static so that there will be no uninitialized gaps in the structure which might contain random data, causing cache misses in bcache. */ static struct partial_symbol psymbol; - - /* Create local copy of the partial symbol */ - memcpy (buf, name, namelength); - buf[namelength] = '\0'; + + if (name[namelength] != '\0') + { + buf = alloca (namelength + 1); + /* Create local copy of the partial symbol */ + memcpy (buf, name, namelength); + buf[namelength] = '\0'; + } /* val and coreaddr are mutually exclusive, one of them *will* be zero */ if (val != 0) { @@ -3131,6 +3137,14 @@ add_psymbol_to_list (char *name, int nam psym = deprecated_bcache (&psymbol, sizeof (struct partial_symbol), objfile->psymbol_cache); + /* Check if the partial_symbol is already in the list. Do not add + it again if it is. */ + for (ps = list->list; ps != list->next; ps++) + { + if (psym == *ps) + return psym; + } + /* Save pointer to partial symbol in psymtab, growing symtab if needed. */ if (list->next >= list->list + list->size) {