aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/aoutx.h66
2 files changed, 53 insertions, 18 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index abfd39c..e46e568 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -5,6 +5,11 @@ Mon Sep 25 16:04:09 1995 Michael Meissner <meissner@tiktok.cygnus.com>
Mon Sep 25 11:48:02 1995 Ian Lance Taylor <ian@cygnus.com>
+ * libaout.h (struct aoutdata): Add line_buf field.
+ * aoutx.h (NAME(aout,find_nearest_line)): Remove statics buffer
+ and filename_buffer. Instead, use a malloc buffer stored in the
+ new line_buf field. Remove length restrictions.
+
* coffgen.c (string_size): Remove static variable.
(debug_string_size, debug_string_section): Likewise.
(coff_fix_symbol_name): Add string_size_p, debug_string_section_p,
diff --git a/bfd/aoutx.h b/bfd/aoutx.h
index e41f724..39b6841 100644
--- a/bfd/aoutx.h
+++ b/bfd/aoutx.h
@@ -2637,8 +2637,6 @@ NAME(aout,find_nearest_line)
{
/* Run down the file looking for the filename, function and linenumber */
asymbol **p;
- static char buffer[100];
- static char filename_buffer[200];
CONST char *directory_name = NULL;
CONST char *main_file_name = NULL;
CONST char *current_file_name = NULL;
@@ -2646,6 +2644,9 @@ NAME(aout,find_nearest_line)
bfd_vma low_line_vma = 0;
bfd_vma low_func_vma = 0;
asymbol *func = 0;
+ size_t filelen, funclen;
+ char *buf;
+
*filename_ptr = abfd->filename;
*functionname_ptr = 0;
*line_ptr = 0;
@@ -2705,39 +2706,68 @@ NAME(aout,find_nearest_line)
}
done:
- if (*line_ptr)
+ if (*line_ptr != 0)
main_file_name = line_file_name;
- if (main_file_name) {
+
+ if (main_file_name == NULL
+ || main_file_name[0] == '/'
+ || directory_name == NULL)
+ filelen = 0;
+ else
+ filelen = strlen (directory_name) + strlen (main_file_name);
+ if (func == NULL)
+ funclen = 0;
+ else
+ funclen = strlen (bfd_asymbol_name (func));
+
+ if (adata (abfd).line_buf != NULL)
+ free (adata (abfd).line_buf);
+ if (filelen + funclen == 0)
+ adata (abfd).line_buf = buf = NULL;
+ else
+ {
+ adata (abfd).line_buf = buf = (char *) malloc (filelen + funclen + 2);
+ if (adata (abfd).line_buf == NULL)
+ {
+ bfd_set_error (bfd_error_no_memory);
+ return false;
+ }
+ }
+
+ if (main_file_name != NULL)
+ {
if (main_file_name[0] == '/' || directory_name == NULL)
- *filename_ptr = main_file_name;
- else {
- sprintf(filename_buffer, "%.140s%.50s",
- directory_name, main_file_name);
- *filename_ptr = filename_buffer;
- }
- }
+ *filename_ptr = main_file_name;
+ else
+ {
+ sprintf (buf, "%s%s", directory_name, main_file_name);
+ *filename_ptr = buf;
+ buf += filelen + 1;
+ }
+ }
+
if (func)
{
- CONST char *function = func->name;
+ const char *function = func->name;
char *p;
/* The caller expects a symbol name. We actually have a
function name, without the leading underscore. Put the
underscore back in, so that the caller gets a symbol name. */
if (bfd_get_symbol_leading_char (abfd) == '\0')
- strncpy (buffer, function, sizeof (buffer) - 1);
+ strcpy (buf, function);
else
{
- buffer[0] = bfd_get_symbol_leading_char (abfd);
- strncpy (buffer + 1, function, sizeof (buffer) - 2);
+ buf[0] = bfd_get_symbol_leading_char (abfd);
+ strcpy (buf + 1, function);
}
- buffer[sizeof(buffer)-1] = 0;
/* Have to remove : stuff */
- p = strchr(buffer,':');
+ p = strchr (buf, ':');
if (p != NULL)
*p = '\0';
- *functionname_ptr = buffer;
+ *functionname_ptr = buf;
}
+
return true;
}