From 35ccda9e737c15be6da6a1e999e102d038573c57 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 15 Feb 2006 22:29:42 +0000 Subject: [PATCH] 2006-02-15 H.J. Lu PR binutils/2338 * dwarf2.c (check_function_name): New function. (_bfd_dwarf2_find_nearest_line): Use check_function_name to check if function is correct. --- bfd/ChangeLog | 7 +++++++ bfd/dwarf2.c | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c3479f07c31..aa919c02b7c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2006-02-15 H.J. Lu + + PR binutils/2338 + * dwarf2.c (check_function_name): New function. + (_bfd_dwarf2_find_nearest_line): Use check_function_name to + check if function is correct. + 2006-02-16 Alan Modra * elflink.c (_bfd_elf_default_action_discarded): Return 0 for diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 1d55e9ecb11..f9cff9b89c9 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -2179,6 +2179,34 @@ find_debug_info (bfd *abfd, asection *after_sec) return NULL; } +/* Return TRUE if there is no mismatch bewteen function FUNC and + section SECTION from symbol table SYMBOLS in ABFD. */ + +static bfd_boolean +check_function_name (bfd *abfd, asection *section, asymbol **symbols, + const char *func) +{ + /* Mismatch can only happen when we have 2 functions with the same + address. It can only occur in a relocatable file. */ + if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 + && func != NULL + && section != NULL + && symbols != NULL) + { + asymbol **p; + + for (p = symbols; *p != NULL; p++) + { + if (((*p)->flags & BSF_FUNCTION) != 0 + && (*p)->name != NULL + && strcmp ((*p)->name, func) == 0) + return (*p)->section == section; + } + } + + return TRUE; +} + /* The DWARF2 version of find_nearest_line. Return TRUE if the line is found without error. ADDR_SIZE is the number of bytes in the initial .debug_info length field and in the abbreviation offset. @@ -2300,7 +2328,9 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, if (comp_unit_contains_address (each, addr) && comp_unit_find_nearest_line (each, addr, filename_ptr, functionname_ptr, - linenumber_ptr, stash)) + linenumber_ptr, stash) + && check_function_name (abfd, section, symbols, + *functionname_ptr)) return TRUE; /* Read each remaining comp. units checking each as they are read. */ @@ -2368,7 +2398,9 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, filename_ptr, functionname_ptr, linenumber_ptr, - stash)) + stash) + && check_function_name (abfd, section, symbols, + *functionname_ptr)) return TRUE; } } -- 2.30.2