diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2006-02-15 22:29:42 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2006-02-15 22:29:42 +0000 |
commit | 35ccda9e737c15be6da6a1e999e102d038573c57 (patch) | |
tree | 263f3bddf4eda385ec2322d15862d8f4a3ebf916 | |
parent | 1c5bada068c8b6c1825a7e10e15261c33877e6d5 (diff) | |
download | fsf-binutils-gdb-35ccda9e737c15be6da6a1e999e102d038573c57.zip fsf-binutils-gdb-35ccda9e737c15be6da6a1e999e102d038573c57.tar.gz fsf-binutils-gdb-35ccda9e737c15be6da6a1e999e102d038573c57.tar.bz2 |
2006-02-15 H.J. Lu <hongjiu.lu@intel.com>
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.
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/dwarf2.c | 36 |
2 files changed, 41 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c3479f0..aa919c0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2006-02-15 H.J. Lu <hongjiu.lu@intel.com> + + 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 <amodra@bigpond.net.au> * elflink.c (_bfd_elf_default_action_discarded): Return 0 for diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 1d55e9e..f9cff9b 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; } } |