Thanks a lot for the fix! Barret
On 2013-06-03 at 13:36 Alan Modra wrote: > Curiousity got the better of me. The problem is triggered by > a) Different memory layout when running objdump -S under make > b) Trailing rubbish at the end of your .stab section > c01f75c8 00000000 44001801 e6a013c0 00000000 ....D........... > c01f75d8 44001901 e8a013c0 00000000 44001a01 D...........D... > c01f75e8 e9a013c0 0000 ...... > ^^^^ > c) These zeros are seen as a marker for the next compilation unit > (see include/aout/stab.def N_UNDF), bumping the .stabstr offset > (bdf/syms.c:1158). > d) syms.c:1178 and syms.c:1247 store this offset string pointer with > a pointer to a previous stab. > > We ought to be keeping a copy of the string pointer for use with any > previous stab. > > * syms.c (_bfd_stab_section_find_nearest_line): Add last_str > var. Use it with last_stab. > > Index: bfd/syms.c > =================================================================== > RCS file: /cvs/src/src/bfd/syms.c,v > retrieving revision 1.58 > diff -u -p -r1.58 syms.c > --- bfd/syms.c 10 Jan 2013 20:03:55 -0000 1.58 > +++ bfd/syms.c 3 Jun 2013 04:01:18 -0000 > @@ -934,7 +934,7 @@ _bfd_stab_section_find_nearest_line (bfd > struct stab_find_info *info; > bfd_size_type stabsize, strsize; > bfd_byte *stab, *str; > - bfd_byte *last_stab = NULL; > + bfd_byte *last_stab, *last_str; > bfd_size_type stroff; > struct indexentry *indexentry; > char *file_name; > @@ -1147,8 +1147,9 @@ _bfd_stab_section_find_nearest_line (bfd > file_name = NULL; > directory_name = NULL; > saw_fun = 1; > + stroff = 0; > > - for (i = 0, stroff = 0, stab = info->stabs, str = info->strs; > + for (i = 0, last_stab = stab = info->stabs, last_str = str = > info->strs; i < info->indextablesize && stab < info->stabs + stabsize; > stab += STABSIZE) > { > @@ -1174,7 +1175,7 @@ _bfd_stab_section_find_nearest_line (bfd > { > info->indextable[i].val = bfd_get_32 (abfd, > last_stab + VALOFF); info->indextable[i].stab = last_stab; > - info->indextable[i].str = str; > + info->indextable[i].str = last_str; > info->indextable[i].directory_name = > directory_name; info->indextable[i].file_name = file_name; > info->indextable[i].function_name = NULL; > @@ -1192,6 +1193,7 @@ _bfd_stab_section_find_nearest_line (bfd > else > { > last_stab = stab; > + last_str = str; > if (stab + STABSIZE >= info->stabs + stabsize > || *(stab + STABSIZE + TYPEOFF) != (bfd_byte) > N_SO) { > @@ -1242,7 +1244,7 @@ _bfd_stab_section_find_nearest_line (bfd > { > info->indextable[i].val = bfd_get_32 (abfd, last_stab + > VALOFF); info->indextable[i].stab = last_stab; > - info->indextable[i].str = str; > + info->indextable[i].str = last_str; > info->indextable[i].directory_name = directory_name; > info->indextable[i].file_name = file_name; > info->indextable[i].function_name = NULL; > _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils