|
1 --- gdb-7.6/bfd/elf32-sparc.c 2013-02-20 19:02:29.000000000 -0800 |
|
2 +++ gdb-7.6/bfd/elf32-sparc.c 2013-10-06 14:13:09.059973200 -0700 |
|
3 @@ -30,34 +30,135 @@ |
|
4 #include "elfxx-sparc.h" |
|
5 #include "elf-vxworks.h" |
|
6 |
|
7 -/* Support for core dump NOTE sections. */ |
|
8 +#include <stddef.h> |
|
9 +#include <sys/elf.h> |
|
10 +#include <sys/procfs.h> |
|
11 +#include <sys/regset.h> |
|
12 +#include <sys/auxv.h> |
|
13 |
|
14 +/* Support for Solaris core dump NOTE sections. */ |
|
15 static bfd_boolean |
|
16 -elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) |
|
17 -{ |
|
18 - switch (note->descsz) |
|
19 +solaris_elf32_sparc_grok_info (bfd *abfd, Elf_Internal_Note *note) |
|
20 { |
|
21 - default: |
|
22 - return FALSE; |
|
23 + asection *sect; |
|
24 + /* 32-bit regset sizes */ |
|
25 + size_t gregset_size = 152; |
|
26 + size_t fpregset_size = 144; |
|
27 + char reg2_section_name[16]; |
|
28 + auxv_t* p_auxv = NULL; |
|
29 + |
|
30 + switch (note->type) |
|
31 + { |
|
32 + case SOLARIS_NT_PRSTATUS: |
|
33 + if (note->descsz == 508) /* sizeof(prstatus_t) */ |
|
34 + { |
|
35 + elf_tdata (abfd)->core->signal = |
|
36 + bfd_get_16 (abfd, note->descdata + 136); |
|
37 + elf_tdata (abfd)->core->pid = |
|
38 + bfd_get_32 (abfd, note->descdata + 216); |
|
39 + elf_tdata (abfd)->core->lwpid = |
|
40 + bfd_get_32 (abfd, note->descdata + 308); |
|
41 |
|
42 - case 260: /* Solaris prpsinfo_t. */ |
|
43 + sect = bfd_get_section_by_name (abfd, ".reg"); |
|
44 + |
|
45 + if (sect != NULL) |
|
46 + sect->size = sizeof(prgregset_t); |
|
47 + |
|
48 + return _bfd_elfcore_make_pseudosection (abfd, ".reg", gregset_size, |
|
49 + note->descpos + 356); |
|
50 + } |
|
51 + return TRUE; |
|
52 + break; |
|
53 + case SOLARIS_NT_PRFPREG: |
|
54 + return TRUE; |
|
55 + break; |
|
56 + case SOLARIS_NT_PRPSINFO: |
|
57 + if (note->descsz == 260) /* sizeof(prpsinfo_t) */ |
|
58 + { |
|
59 elf_tdata (abfd)->core->program |
|
60 = _bfd_elfcore_strndup (abfd, note->descdata + 84, 16); |
|
61 elf_tdata (abfd)->core->command |
|
62 = _bfd_elfcore_strndup (abfd, note->descdata + 100, 80); |
|
63 + } |
|
64 + return TRUE; |
|
65 break; |
|
66 - |
|
67 - case 336: /* Solaris psinfo_t. */ |
|
68 + case SOLARIS_NT_PRXREG: |
|
69 + return TRUE; |
|
70 + break; |
|
71 + case SOLARIS_NT_PLATFORM: |
|
72 + return TRUE; |
|
73 + break; |
|
74 + case SOLARIS_NT_AUXV: |
|
75 + return TRUE; |
|
76 + case SOLARIS_NT_PSTATUS: |
|
77 + return TRUE; |
|
78 + break; |
|
79 + case SOLARIS_NT_PSINFO: |
|
80 + if (note->descsz == 336) /* sizeof(psinfo_t) */ |
|
81 + { |
|
82 elf_tdata (abfd)->core->program |
|
83 = _bfd_elfcore_strndup (abfd, note->descdata + 88, 16); |
|
84 elf_tdata (abfd)->core->command |
|
85 = _bfd_elfcore_strndup (abfd, note->descdata + 104, 80); |
|
86 + } |
|
87 + return TRUE; |
|
88 + break; |
|
89 + case SOLARIS_NT_PRCRED: |
|
90 + return TRUE; |
|
91 + break; |
|
92 + case SOLARIS_NT_UTSNAME: |
|
93 + return TRUE; |
|
94 + break; |
|
95 + case SOLARIS_NT_LWPSTATUS: |
|
96 + if (note->descsz == 896) /* sizeof(lwpstatus_t) */ |
|
97 + { |
|
98 + (void) snprintf (reg2_section_name, 16, "%s/%i", ".reg2", 1); |
|
99 + sect = bfd_get_section_by_name (abfd, reg2_section_name); |
|
100 + if (sect != NULL) |
|
101 + { |
|
102 + sect->size = fpregset_size; |
|
103 + sect->filepos = note->descpos + 496; |
|
104 + sect->alignment_power = 2; |
|
105 + return TRUE; |
|
106 + } |
|
107 + else |
|
108 + return _bfd_elfcore_make_pseudosection (abfd, reg2_section_name, |
|
109 + fpregset_size, note->descpos + 496); |
|
110 + } |
|
111 + return TRUE; |
|
112 + break; |
|
113 + case SOLARIS_NT_LWPSINFO: |
|
114 + return TRUE; |
|
115 + break; |
|
116 + case SOLARIS_NT_PRCPUXREG: |
|
117 + return TRUE; |
|
118 + break; |
|
119 + default: |
|
120 + return TRUE; |
|
121 break; |
|
122 } |
|
123 - |
|
124 return TRUE; |
|
125 } |
|
126 |
|
127 +static bfd_boolean |
|
128 +elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) |
|
129 +{ |
|
130 + return solaris_elf32_sparc_grok_info (abfd, note); |
|
131 +} |
|
132 + |
|
133 + |
|
134 +static bfd_boolean |
|
135 +elf32_sparc_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) |
|
136 +{ |
|
137 + return solaris_elf32_sparc_grok_info (abfd, note); |
|
138 +} |
|
139 + |
|
140 +static bfd_boolean |
|
141 +elf32_sparc_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note) |
|
142 +{ |
|
143 + return solaris_elf32_sparc_grok_info (abfd, note); |
|
144 +} |
|
145 + |
|
146 /* Functions for dealing with the e_flags field. |
|
147 |
|
148 We don't define set_private_flags or copy_private_bfd_data because |
|
149 @@ -201,6 +302,9 @@ |
|
150 #define elf_backend_final_write_processing \ |
|
151 elf32_sparc_final_write_processing |
|
152 #define elf_backend_grok_psinfo elf32_sparc_grok_psinfo |
|
153 +#define elf_backend_grok_prstatus elf32_sparc_grok_prstatus |
|
154 +#define elf_backend_grok_lwpstatus elf32_sparc_grok_lwpstatus |
|
155 +#define elf_backend_grok_lwpinfo elf32_sparc_grok_lwpinfo |
|
156 #define elf_backend_reloc_type_class elf32_sparc_reloc_type_class |
|
157 |
|
158 #define elf_info_to_howto _bfd_sparc_elf_info_to_howto |