diff options
-rw-r--r-- | gdb/ChangeLog | 2 | ||||
-rw-r--r-- | gdb/hppa-tdep.c | 17 | ||||
-rw-r--r-- | gdb/paread.c | 22 |
3 files changed, 29 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1e83925..4d457a4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -12,6 +12,8 @@ Fri Jul 30 07:36:53 1993 Fred Fish (fnf@deneb.cygnus.com) Fri Jul 30 08:58:01 1993 Jim Kingdon (kingdon@lioth.cygnus.com) * paread.c (pa_symtab_read): Put file-local symbols in minimal symbols. + * hppa-tdep.c (frame_chain_valid): Check that our function has the + same address as _start, not that it must be the same symbol. Fri Jul 30 00:18:40 1993 Fred Fish (fnf@deneb.cygnus.com) diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index e8b3893..3bae845 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -540,7 +540,8 @@ frame_chain_valid (chain, thisframe) FRAME_ADDR chain; FRAME thisframe; { - struct minimal_symbol *msym; + struct minimal_symbol *msym_us; + struct minimal_symbol *msym_start; struct unwind_table_entry *u; if (!chain) @@ -548,9 +549,17 @@ frame_chain_valid (chain, thisframe) u = find_unwind_entry (thisframe->pc); - msym = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe)); - if (msym - && (strcmp (SYMBOL_NAME (msym), "_start") == 0)) + /* We can't just check that the same of msym_us is "_start", because + someone idiotically decided that they were going to make a Ltext_end + symbol with the same address. This Ltext_end symbol is totally + indistinguishable (as nearly as I can tell) from the symbol for a function + which is (legitimately, since it is in the user's namespace) + named Ltext_end, so we can't just ignore it. */ + msym_us = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe)); + msym_start = lookup_minimal_symbol ("_start", NULL); + if (msym_us + && msym_start + && SYMBOL_VALUE_ADDRESS (msym_us) == SYMBOL_VALUE_ADDRESS (msym_start)) return 0; if (u == NULL) diff --git a/gdb/paread.c b/gdb/paread.c index f8bd4bf..a4425a9 100644 --- a/gdb/paread.c +++ b/gdb/paread.c @@ -157,7 +157,10 @@ pa_symtab_read (abfd, addr, objfile) } break; +#if 0 + /* SS_GLOBAL and SS_LOCAL are two names for the same thing (!). */ case SS_GLOBAL: +#endif case SS_LOCAL: switch (bufp->symbol_type) { @@ -167,19 +170,18 @@ pa_symtab_read (abfd, addr, objfile) case ST_CODE: symname = bufp->name.n_strx + stringtab; + ms_type = mst_file_text; + bufp->symbol_value &= ~0x3; /* clear out permission bits */ + + check_strange_names: /* GAS leaves symbols with the prefixes "LS$", "LBB$", and "LBE$" in .o files after assembling. And thus they appear in the final executable. This can cause problems if these special symbols have the - same value as real symbols. So ignore them. Is this - meant as a feature, or is it just a GAS bug? */ + same value as real symbols. So ignore them. Also "LC$". */ if (*symname == 'L' - && (symname[2] == '$' && symname[1] == 'S' - || (symname[3] == '$' && symname[1] == 'B' - && (symname[2] == 'B' || symname[2] == 'E')))) + && (symname[2] == '$' || symname[3] == '$')) continue; - ms_type = mst_file_text; - bufp->symbol_value &= ~0x3; /* clear out permission bits */ break; case ST_PRI_PROG: @@ -190,13 +192,17 @@ pa_symtab_read (abfd, addr, objfile) ms_type = mst_file_text; bufp->symbol_value &= ~0x3; /* clear out permission bits */ break; + case ST_DATA: symname = bufp->name.n_strx + stringtab; ms_type = mst_file_data; - break; + goto check_strange_names; + default: continue; } + break; + default: continue; } |