This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: ld/2338: objdump -d -l doesn't work correctly
- From: "H. J. Lu" <hjl at lucon dot org>
- To: Andrew Morton <akpm at osdl dot org>
- Cc: binutils at sources dot redhat dot com
- Date: Tue, 14 Feb 2006 11:28:03 -0800
- Subject: PATCH: ld/2338: objdump -d -l doesn't work correctly
_bfd_dwarf2_find_nearest_line doesn't work on relocatable file with
more than one executable sections. This patch checks section to
make sure that the right function name is returned.
H.J.
----
2006-02-13 H.J. Lu <hongjiu.lu@intel.com>
PR ld/2338
* dwarf2.c (check_function_name): New function.
(_bfd_dwarf2_find_nearest_line): Use check_function_name to
check if function is correct.
--- bfd/dwarf2.c.func 2006-01-20 08:53:55.000000000 -0800
+++ bfd/dwarf2.c 2006-02-14 11:25:51.000000000 -0800
@@ -2179,6 +2179,29 @@ find_debug_info (bfd *abfd, asection *af
return NULL;
}
+/* Return FALSE if FUNC in symbol table SYMBOLS is not relative to
+ SECTION. */
+
+static bfd_boolean
+check_function_name (asection *section, asymbol **symbols,
+ const char *func)
+{
+ if (func != NULL && section != 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 +2323,8 @@ _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 (section, symbols, *functionname_ptr))
return TRUE;
/* Read each remaining comp. units checking each as they are read. */
@@ -2368,7 +2392,9 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd
filename_ptr,
functionname_ptr,
linenumber_ptr,
- stash))
+ stash)
+ && check_function_name (section, symbols,
+ *functionname_ptr))
return TRUE;
}
}