OLD | NEW |
1 /* Matsushita 10200 specific support for 32-bit ELF | 1 /* Matsushita 10200 specific support for 32-bit ELF |
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, | 2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, |
3 2007, 2010 | 3 2007, 2010, 2012 |
4 Free Software Foundation, Inc. | 4 Free Software Foundation, Inc. |
5 | 5 |
6 This file is part of BFD, the Binary File Descriptor library. | 6 This file is part of BFD, the Binary File Descriptor library. |
7 | 7 |
8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
11 (at your option) any later version. | 11 (at your option) any later version. |
12 | 12 |
13 This program is distributed in the hope that it will be useful, | 13 This program is distributed in the hope that it will be useful, |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 GNU General Public License for more details. | 16 GNU General Public License for more details. |
17 | 17 |
18 You should have received a copy of the GNU General Public License | 18 You should have received a copy of the GNU General Public License |
19 along with this program; if not, write to the Free Software | 19 along with this program; if not, write to the Free Software |
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
21 MA 02110-1301, USA. */ | 21 MA 02110-1301, USA. */ |
22 | 22 |
23 #include "sysdep.h" | 23 #include "sysdep.h" |
24 #include "bfd.h" | 24 #include "bfd.h" |
25 #include "libbfd.h" | 25 #include "libbfd.h" |
26 #include "elf-bfd.h" | 26 #include "elf-bfd.h" |
27 | 27 |
28 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup | 28 static bfd_boolean |
29 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); | 29 mn10200_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int); |
30 static void mn10200_info_to_howto | 30 static bfd_boolean |
31 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); | 31 mn10200_elf_symbol_address_p (bfd *, asection *, Elf_Internal_Sym *, bfd_vma); |
32 static bfd_boolean mn10200_elf_relax_delete_bytes | |
33 PARAMS ((bfd *, asection *, bfd_vma, int)); | |
34 static bfd_boolean mn10200_elf_symbol_address_p | |
35 PARAMS ((bfd *, asection *, Elf_Internal_Sym *, bfd_vma)); | |
36 static bfd_reloc_status_type mn10200_elf_final_link_relocate | |
37 PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, | |
38 » bfd_byte *, bfd_vma, bfd_vma, bfd_vma, | |
39 » struct bfd_link_info *, asection *, int)); | |
40 static bfd_boolean mn10200_elf_relocate_section | |
41 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, | |
42 » bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, | |
43 » asection **)); | |
44 static bfd_boolean mn10200_elf_relax_section | |
45 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *)); | |
46 static bfd_byte * mn10200_elf_get_relocated_section_contents | |
47 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, | |
48 » bfd_byte *, bfd_boolean, asymbol **)); | |
49 | 32 |
50 enum reloc_type { | 33 enum reloc_type |
| 34 { |
51 R_MN10200_NONE = 0, | 35 R_MN10200_NONE = 0, |
52 R_MN10200_32, | 36 R_MN10200_32, |
53 R_MN10200_16, | 37 R_MN10200_16, |
54 R_MN10200_8, | 38 R_MN10200_8, |
55 R_MN10200_24, | 39 R_MN10200_24, |
56 R_MN10200_PCREL8, | 40 R_MN10200_PCREL8, |
57 R_MN10200_PCREL16, | 41 R_MN10200_PCREL16, |
58 R_MN10200_PCREL24, | 42 R_MN10200_PCREL24, |
59 R_MN10200_MAX | 43 R_MN10200_MAX |
60 }; | 44 }; |
61 | 45 |
62 static reloc_howto_type elf_mn10200_howto_table[] = { | 46 static reloc_howto_type elf_mn10200_howto_table[] = |
| 47 { |
63 /* Dummy relocation. Does nothing. */ | 48 /* Dummy relocation. Does nothing. */ |
64 HOWTO (R_MN10200_NONE, | 49 HOWTO (R_MN10200_NONE, |
65 0, | 50 0, |
66 2, | 51 2, |
67 16, | 52 16, |
68 FALSE, | 53 FALSE, |
69 0, | 54 0, |
70 complain_overflow_bitfield, | 55 complain_overflow_bitfield, |
71 bfd_elf_generic_reloc, | 56 bfd_elf_generic_reloc, |
72 "R_MN10200_NONE", | 57 "R_MN10200_NONE", |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 0, | 153 0, |
169 complain_overflow_bitfield, | 154 complain_overflow_bitfield, |
170 bfd_elf_generic_reloc, | 155 bfd_elf_generic_reloc, |
171 "R_MN10200_PCREL24", | 156 "R_MN10200_PCREL24", |
172 FALSE, | 157 FALSE, |
173 0xffffff, | 158 0xffffff, |
174 0xffffff, | 159 0xffffff, |
175 TRUE), | 160 TRUE), |
176 }; | 161 }; |
177 | 162 |
178 struct mn10200_reloc_map { | 163 struct mn10200_reloc_map |
| 164 { |
179 bfd_reloc_code_real_type bfd_reloc_val; | 165 bfd_reloc_code_real_type bfd_reloc_val; |
180 unsigned char elf_reloc_val; | 166 unsigned char elf_reloc_val; |
181 }; | 167 }; |
182 | 168 |
183 static const struct mn10200_reloc_map mn10200_reloc_map[] = { | 169 static const struct mn10200_reloc_map mn10200_reloc_map[] = |
| 170 { |
184 { BFD_RELOC_NONE , R_MN10200_NONE , }, | 171 { BFD_RELOC_NONE , R_MN10200_NONE , }, |
185 { BFD_RELOC_32 , R_MN10200_32 , }, | 172 { BFD_RELOC_32 , R_MN10200_32 , }, |
186 { BFD_RELOC_16 , R_MN10200_16 , }, | 173 { BFD_RELOC_16 , R_MN10200_16 , }, |
187 { BFD_RELOC_8 , R_MN10200_8 , }, | 174 { BFD_RELOC_8 , R_MN10200_8 , }, |
188 { BFD_RELOC_24 , R_MN10200_24 , }, | 175 { BFD_RELOC_24 , R_MN10200_24 , }, |
189 { BFD_RELOC_8_PCREL , R_MN10200_PCREL8 , }, | 176 { BFD_RELOC_8_PCREL , R_MN10200_PCREL8 , }, |
190 { BFD_RELOC_16_PCREL, R_MN10200_PCREL16, }, | 177 { BFD_RELOC_16_PCREL, R_MN10200_PCREL16, }, |
191 { BFD_RELOC_24_PCREL, R_MN10200_PCREL24, }, | 178 { BFD_RELOC_24_PCREL, R_MN10200_PCREL24, }, |
192 }; | 179 }; |
193 | 180 |
194 static reloc_howto_type * | 181 static reloc_howto_type * |
195 bfd_elf32_bfd_reloc_type_lookup (abfd, code) | 182 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, |
196 bfd *abfd ATTRIBUTE_UNUSED; | 183 » » » » bfd_reloc_code_real_type code) |
197 bfd_reloc_code_real_type code; | |
198 { | 184 { |
199 unsigned int i; | 185 unsigned int i; |
200 | 186 |
201 for (i = 0; | 187 for (i = 0; |
202 i < sizeof (mn10200_reloc_map) / sizeof (struct mn10200_reloc_map); | 188 i < sizeof (mn10200_reloc_map) / sizeof (struct mn10200_reloc_map); |
203 i++) | 189 i++) |
204 { | 190 { |
205 if (mn10200_reloc_map[i].bfd_reloc_val == code) | 191 if (mn10200_reloc_map[i].bfd_reloc_val == code) |
206 return &elf_mn10200_howto_table[mn10200_reloc_map[i].elf_reloc_val]; | 192 return &elf_mn10200_howto_table[mn10200_reloc_map[i].elf_reloc_val]; |
207 } | 193 } |
(...skipping 14 matching lines...) Expand all Loading... |
222 if (elf_mn10200_howto_table[i].name != NULL | 208 if (elf_mn10200_howto_table[i].name != NULL |
223 && strcasecmp (elf_mn10200_howto_table[i].name, r_name) == 0) | 209 && strcasecmp (elf_mn10200_howto_table[i].name, r_name) == 0) |
224 return &elf_mn10200_howto_table[i]; | 210 return &elf_mn10200_howto_table[i]; |
225 | 211 |
226 return NULL; | 212 return NULL; |
227 } | 213 } |
228 | 214 |
229 /* Set the howto pointer for an MN10200 ELF reloc. */ | 215 /* Set the howto pointer for an MN10200 ELF reloc. */ |
230 | 216 |
231 static void | 217 static void |
232 mn10200_info_to_howto (abfd, cache_ptr, dst) | 218 mn10200_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, |
233 bfd *abfd ATTRIBUTE_UNUSED; | 219 » » arelent *cache_ptr, |
234 arelent *cache_ptr; | 220 » » Elf_Internal_Rela *dst) |
235 Elf_Internal_Rela *dst; | |
236 { | 221 { |
237 unsigned int r_type; | 222 unsigned int r_type; |
238 | 223 |
239 r_type = ELF32_R_TYPE (dst->r_info); | 224 r_type = ELF32_R_TYPE (dst->r_info); |
240 BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX); | 225 BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX); |
241 cache_ptr->howto = &elf_mn10200_howto_table[r_type]; | 226 cache_ptr->howto = &elf_mn10200_howto_table[r_type]; |
242 } | 227 } |
243 | 228 |
244 /* Perform a relocation as part of a final link. */ | 229 /* Perform a relocation as part of a final link. */ |
245 | 230 |
246 static bfd_reloc_status_type | 231 static bfd_reloc_status_type |
247 mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd, | 232 mn10200_elf_final_link_relocate (reloc_howto_type *howto, |
248 » » » » input_section, contents, offset, value, | 233 » » » » bfd *input_bfd, |
249 » » » » addend, info, sym_sec, is_local) | 234 » » » » bfd *output_bfd ATTRIBUTE_UNUSED, |
250 reloc_howto_type *howto; | 235 » » » » asection *input_section, |
251 bfd *input_bfd; | 236 » » » » bfd_byte *contents, |
252 bfd *output_bfd ATTRIBUTE_UNUSED; | 237 » » » » bfd_vma offset, |
253 asection *input_section; | 238 » » » » bfd_vma value, |
254 bfd_byte *contents; | 239 » » » » bfd_vma addend, |
255 bfd_vma offset; | 240 » » » » struct bfd_link_info *info ATTRIBUTE_UNUSED, |
256 bfd_vma value; | 241 » » » » asection *sym_sec ATTRIBUTE_UNUSED, |
257 bfd_vma addend; | 242 » » » » int is_local ATTRIBUTE_UNUSED) |
258 struct bfd_link_info *info ATTRIBUTE_UNUSED; | |
259 asection *sym_sec ATTRIBUTE_UNUSED; | |
260 int is_local ATTRIBUTE_UNUSED; | |
261 { | 243 { |
262 unsigned long r_type = howto->type; | 244 unsigned long r_type = howto->type; |
263 bfd_byte *hit_data = contents + offset; | 245 bfd_byte *hit_data = contents + offset; |
264 | 246 |
265 switch (r_type) | 247 switch (r_type) |
266 { | 248 { |
267 | 249 |
268 case R_MN10200_NONE: | 250 case R_MN10200_NONE: |
269 return bfd_reloc_ok; | 251 return bfd_reloc_ok; |
270 | 252 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 319 |
338 value &= 0xffffff; | 320 value &= 0xffffff; |
339 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000); | 321 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000); |
340 bfd_put_32 (input_bfd, value, hit_data); | 322 bfd_put_32 (input_bfd, value, hit_data); |
341 return bfd_reloc_ok; | 323 return bfd_reloc_ok; |
342 | 324 |
343 default: | 325 default: |
344 return bfd_reloc_notsupported; | 326 return bfd_reloc_notsupported; |
345 } | 327 } |
346 } | 328 } |
error: old chunk mismatch |
None
OLD | NEW |