summaryrefslogtreecommitdiffstats
path: root/binutils-2.23.52.0.1-addr2line-dynsymtab.patch
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.23.52.0.1-addr2line-dynsymtab.patch')
-rw-r--r--binutils-2.23.52.0.1-addr2line-dynsymtab.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/binutils-2.23.52.0.1-addr2line-dynsymtab.patch b/binutils-2.23.52.0.1-addr2line-dynsymtab.patch
new file mode 100644
index 0000000..d434e3f
--- /dev/null
+++ b/binutils-2.23.52.0.1-addr2line-dynsymtab.patch
@@ -0,0 +1,144 @@
+*** ../binutils-2.23.52.0.1/binutils/addr2line.c 2013-02-27 20:28:03.000000000 +0000
+--- binutils/addr2line.c 2013-03-13 16:46:36.109519735 +0000
+*************** slurp_symtab (bfd *abfd)
+*** 130,135 ****
+--- 130,146 ----
+ 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
+*** ../binutils-2.23.52.0.1.orig/bfd/opncls.c 2013-03-14 11:25:30.338306122 +0000
+--- bfd/opncls.c 2013-03-14 12:20:21.686397360 +0000
+*************** find_separate_debug_file (bfd *abfd, con
+*** 1297,1302 ****
+--- 1297,1304 ----
+ 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)
+*************** find_separate_debug_file (bfd *abfd, con
+*** 1332,1337 ****
+--- 1334,1359 ----
+ 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;
+*** ../binutils-2.23.52.0.1.orig/bfd/dwarf2.c 2013-03-14 11:25:30.608306129 +0000
+--- bfd/dwarf2.c 2013-03-14 13:14:18.102487075 +0000
+*************** find_line (bfd *abfd,
+*** 3339,3346 ****
+--- 3339,3349 ----
+ 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;
+*************** find_line (bfd *abfd,
+*** 3380,3385 ****
+--- 3383,3394 ----
+ 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
+*************** find_line (bfd *abfd,
+*** 3442,3447 ****
+--- 3451,3466 ----
+ 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));
+ }
+ }
+
+*************** find_line (bfd *abfd,
+*** 3535,3540 ****
+--- 3554,3569 ----
+ 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)
+ {
+*************** find_line (bfd *abfd,
+*** 3552,3557 ****
+--- 3581,3588 ----
+ if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
+ unset_sections (stash);
+
++ if (! found)
++ return possible_find;
+ return found;
+ }
+