summaryrefslogtreecommitdiffstats
path: root/source/d/binutils/binutils.addr2line.dynsymtab.diff
blob: ee71eb7e1ec65f895da7b6f9432f097bc8fda942 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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