summaryrefslogtreecommitdiff
path: root/source/d/binutils/binutils.addr2line.dynsymtab.diff
diff options
context:
space:
mode:
Diffstat (limited to 'source/d/binutils/binutils.addr2line.dynsymtab.diff')
-rw-r--r--source/d/binutils/binutils.addr2line.dynsymtab.diff128
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