diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/syms.c | 87 |
2 files changed, 45 insertions, 49 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index accece5b578..0af85697e08 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2013-09-24 Alan Modra <amodra@gmail.com> + + * syms.c (_bfd_stab_section_find_nearest_line): Ignore partial + stabs at end of .stab. Tidy variable usage. Don't drop the need + for a NULL function name stab if If N_FUN stab is ignored. + Ensure index entry count loop matches write loop. + 2013-09-20 Alan Modra <amodra@gmail.com> * configure: Regenerate. diff --git a/bfd/syms.c b/bfd/syms.c index 9d91d48e963..27b40eb8291 100644 --- a/bfd/syms.c +++ b/bfd/syms.c @@ -934,12 +934,11 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, struct stab_find_info *info; bfd_size_type stabsize, strsize; bfd_byte *stab, *str; - bfd_byte *last_stab, *last_str; + bfd_byte *nul_fun, *nul_str; bfd_size_type stroff; struct indexentry *indexentry; char *file_name; char *directory_name; - int saw_fun; bfd_boolean saw_line, saw_func; *pfound = FALSE; @@ -988,7 +987,6 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, long reloc_size, reloc_count; arelent **reloc_vector; int i; - char *name; char *function_name; bfd_size_type amt = sizeof *info; @@ -1021,6 +1019,7 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, stabsize = (info->stabsec->rawsize ? info->stabsec->rawsize : info->stabsec->size); + stabsize = (stabsize / STABSIZE) * STABSIZE; strsize = (info->strsec->rawsize ? info->strsec->rawsize : info->strsec->size); @@ -1102,36 +1101,37 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, table. */ info->indextablesize = 0; - saw_fun = 1; + nul_fun = NULL; for (stab = info->stabs; stab < info->stabs + stabsize; stab += STABSIZE) { if (stab[TYPEOFF] == (bfd_byte) N_SO) { - /* N_SO with null name indicates EOF */ - if (bfd_get_32 (abfd, stab + STRDXOFF) == 0) - continue; - /* if we did not see a function def, leave space for one. */ - if (saw_fun == 0) + if (nul_fun != NULL) ++info->indextablesize; - saw_fun = 0; - - /* two N_SO's in a row is a filename and directory. Skip */ - if (stab + STABSIZE < info->stabs + stabsize - && *(stab + STABSIZE + TYPEOFF) == (bfd_byte) N_SO) + /* N_SO with null name indicates EOF */ + if (bfd_get_32 (abfd, stab + STRDXOFF) == 0) + nul_fun = NULL; + else { - stab += STABSIZE; + nul_fun = stab; + + /* two N_SO's in a row is a filename and directory. Skip */ + if (stab + STABSIZE + TYPEOFF < info->stabs + stabsize + && *(stab + STABSIZE + TYPEOFF) == (bfd_byte) N_SO) + stab += STABSIZE; } } - else if (stab[TYPEOFF] == (bfd_byte) N_FUN) + else if (stab[TYPEOFF] == (bfd_byte) N_FUN + && bfd_get_32 (abfd, stab + STRDXOFF) != 0) { - saw_fun = 1; + nul_fun = NULL; ++info->indextablesize; } } - if (saw_fun == 0) + if (nul_fun != NULL) ++info->indextablesize; if (info->indextablesize == 0) @@ -1146,10 +1146,10 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, file_name = NULL; directory_name = NULL; - saw_fun = 1; + nul_fun = NULL; stroff = 0; - for (i = 0, last_stab = stab = info->stabs, last_str = str = info->strs; + for (i = 0, stab = info->stabs, nul_str = str = info->strs; i < info->indextablesize && stab < info->stabs + stabsize; stab += STABSIZE) { @@ -1171,35 +1171,30 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, Note that a N_SO without a file name is an EOF and there could be 2 N_SO following it with the new filename and directory. */ - if (saw_fun == 0) + if (nul_fun != NULL) { - info->indextable[i].val = bfd_get_32 (abfd, last_stab + VALOFF); - info->indextable[i].stab = last_stab; - info->indextable[i].str = last_str; + info->indextable[i].val = bfd_get_32 (abfd, nul_fun + VALOFF); + info->indextable[i].stab = nul_fun; + info->indextable[i].str = nul_str; info->indextable[i].directory_name = directory_name; info->indextable[i].file_name = file_name; info->indextable[i].function_name = NULL; ++i; } - saw_fun = 0; + directory_name = NULL; file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); - if (*file_name == '\0') + if (file_name == (char *) str) { - directory_name = NULL; file_name = NULL; - saw_fun = 1; + nul_fun = NULL; } else { - last_stab = stab; - last_str = str; - if (stab + STABSIZE >= info->stabs + stabsize - || *(stab + STABSIZE + TYPEOFF) != (bfd_byte) N_SO) - { - directory_name = NULL; - } - else + nul_fun = stab; + nul_str = str; + if (stab + STABSIZE + TYPEOFF < info->stabs + stabsize + && *(stab + STABSIZE + TYPEOFF) == (bfd_byte) N_SO) { /* Two consecutive N_SOs are a directory and a file name. */ @@ -1218,17 +1213,11 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, case N_FUN: /* A function name. */ - saw_fun = 1; - name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); - - if (*name == '\0') - name = NULL; - - function_name = name; - - if (name == NULL) + function_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); + if (function_name == (char *) str) continue; + nul_fun = NULL; info->indextable[i].val = bfd_get_32 (abfd, stab + VALOFF); info->indextable[i].stab = stab; info->indextable[i].str = str; @@ -1240,11 +1229,11 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, } } - if (saw_fun == 0) + if (nul_fun != NULL) { - info->indextable[i].val = bfd_get_32 (abfd, last_stab + VALOFF); - info->indextable[i].stab = last_stab; - info->indextable[i].str = last_str; + info->indextable[i].val = bfd_get_32 (abfd, nul_fun + VALOFF); + info->indextable[i].stab = nul_fun; + info->indextable[i].str = nul_str; info->indextable[i].directory_name = directory_name; info->indextable[i].file_name = file_name; info->indextable[i].function_name = NULL; |