diff options
Diffstat (limited to 'source/d/binutils/binutils.addr2line.dynsymtab.diff')
-rw-r--r-- | source/d/binutils/binutils.addr2line.dynsymtab.diff | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/source/d/binutils/binutils.addr2line.dynsymtab.diff b/source/d/binutils/binutils.addr2line.dynsymtab.diff new file mode 100644 index 00000000..ee71eb7e --- /dev/null +++ b/source/d/binutils/binutils.addr2line.dynsymtab.diff @@ -0,0 +1,128 @@ +--- ./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 |