--- ./bfd/opncls.c.orig 2013-02-27 14:28:03.000000000 -0600 +++ ./bfd/opncls.c 2013-04-02 15:56:55.703204116 -0500 @@ -1297,6 +1297,8 @@ bfd_malloc (strlen (debug_file_directory) + 1 + (canon_dirlen > dirlen ? canon_dirlen : dirlen) + strlen (".debug/") +#define FEDORA_LIB_DEBUG_DIR "/usr/lib/debug/" + + strlen (FEDORA_LIB_DEBUG_DIR) + strlen ("usr/") + strlen (base) + 1); if (debugfile == NULL) @@ -1332,6 +1334,26 @@ return debugfile; } + /* Then try in the global debug dir for Fedora libraries. */ + sprintf (debugfile, "%s%s%s", FEDORA_LIB_DEBUG_DIR, dir, base); + if (separate_debug_file_exists (debugfile, crc32)) + { + free (base); + free (dir); + free (canon_dir); + return debugfile; + } + + /* Then try in the usr subdirectory of the global debug dir for Fedora libraries. */ + sprintf (debugfile, "%s/usr%s%s", FEDORA_LIB_DEBUG_DIR, dir, base); + if (separate_debug_file_exists (debugfile, crc32)) + { + free (base); + free (dir); + free (canon_dir); + return debugfile; + } + /* Then try in the global debugfile directory. */ strcpy (debugfile, debug_file_directory); dirlen = strlen (debug_file_directory) - 1; --- ./bfd/dwarf2.c.orig 2013-02-27 14:28:03.000000000 -0600 +++ ./bfd/dwarf2.c 2013-04-02 15:56:55.704204116 -0500 @@ -3339,8 +3339,11 @@ struct dwarf2_debug *stash; /* What address are we looking for? */ bfd_vma addr; + /* What is the address without relocation ? */ + bfd_vma unrelocated_addr; struct comp_unit* each; bfd_vma found = FALSE; + bfd_vma possible_find = FALSE; bfd_boolean do_line; *filename_ptr = NULL; @@ -3380,6 +3383,12 @@ else abort (); + /* If we are dealing with PIC code then the debug information + will be based on unrelocated addresses. Since we cannot be + sure if this is a PIC address we test both with and without + relocation. */ + unrelocated_addr = addr; + if (section->output_section) addr += section->output_section->vma + section->output_offset; else @@ -3442,6 +3451,16 @@ stash)); if (found) goto done; + + if (! possible_find) + possible_find = ((each->arange.high == 0 + || comp_unit_contains_address (each, unrelocated_addr)) + && comp_unit_find_nearest_line (each, unrelocated_addr, + filename_ptr, + functionname_ptr, + linenumber_ptr, + discriminator_ptr, + stash)); } } @@ -3535,6 +3554,16 @@ discriminator_ptr, stash)); + if (! found && ! do_line && ! possible_find) + possible_find = ((each->arange.high == 0 + || comp_unit_contains_address (each, unrelocated_addr)) + && comp_unit_find_nearest_line (each, unrelocated_addr, + filename_ptr, + functionname_ptr, + linenumber_ptr, + discriminator_ptr, + stash)); + if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr) == stash->sec->size) { @@ -3552,6 +3581,8 @@ if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) unset_sections (stash); + if (! found) + return possible_find; return found; } --- ./binutils/addr2line.c.orig 2013-02-27 14:28:03.000000000 -0600 +++ ./binutils/addr2line.c 2013-04-02 15:56:55.703204116 -0500 @@ -130,6 +130,17 @@ symcount = bfd_canonicalize_symtab (abfd, syms); if (symcount < 0) bfd_fatal (bfd_get_filename (abfd)); + + /* If there are no symbols left after canonicalization and + we have not tried the dynamic symbols then give them a go. */ + if (symcount == 0 + && ! dynamic + && (storage = bfd_get_dynamic_symtab_upper_bound (abfd)) > 0) + { + free (syms); + syms = xmalloc (storage); + symcount = bfd_canonicalize_dynamic_symtab (abfd, syms); + } } /* These global variables are used to pass information between