Index: bfd/syms.c |
diff --git a/bfd/syms.c b/bfd/syms.c |
index bf5a48894ca417620c16a652c19de4ed61cf3153..27b40eb8291a20a5bc86d79681058112c4687d76 100644 |
--- a/bfd/syms.c |
+++ b/bfd/syms.c |
@@ -77,7 +77,7 @@ SUBSECTION |
| |
| if (storage_needed == 0) |
| return; |
-| |
+| |
| symbol_table = xmalloc (storage_needed); |
| ... |
| number_of_symbols = |
@@ -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 = NULL; |
+ 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; |
@@ -1008,7 +1006,7 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, |
/* Try SOM section names. */ |
info->stabsec = bfd_get_section_by_name (abfd, "$GDB_SYMBOLS$"); |
info->strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$"); |
- |
+ |
if (info->stabsec == NULL || info->strsec == NULL) |
{ |
/* No stabs debugging information. Set *pinfo so that we |
@@ -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,9 +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, stroff = 0, stab = info->stabs, str = info->strs; |
+ for (i = 0, stab = info->stabs, nul_str = str = info->strs; |
i < info->indextablesize && stab < info->stabs + stabsize; |
stab += STABSIZE) |
{ |
@@ -1170,34 +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 = 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; |
- 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. */ |
@@ -1216,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; |
@@ -1238,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 = 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; |