bfd:
[deliverable/binutils-gdb.git] / bfd / elf32-sh.c
1 /* Hitachi SH specific support for 32-bit ELF
2 Copyright 1996, 97, 98, 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Ian Lance Taylor, Cygnus Support.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/sh.h"
27
28 static bfd_reloc_status_type sh_elf_reloc
29 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
30 static bfd_reloc_status_type sh_elf_ignore_reloc
31 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
32 static reloc_howto_type *sh_elf_reloc_type_lookup
33 PARAMS ((bfd *, bfd_reloc_code_real_type));
34 static void sh_elf_info_to_howto
35 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
36 static boolean sh_elf_set_private_flags
37 PARAMS ((bfd *, flagword));
38 static boolean sh_elf_copy_private_data
39 PARAMS ((bfd *, bfd *));
40 static boolean sh_elf_merge_private_data
41 PARAMS ((bfd *, bfd *));
42 boolean sh_elf_set_mach_from_flags
43 PARAMS ((bfd *));
44 static boolean sh_elf_relax_section
45 PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
46 static boolean sh_elf_relax_delete_bytes
47 PARAMS ((bfd *, asection *, bfd_vma, int));
48 static boolean sh_elf_align_loads
49 PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, boolean *));
50 static boolean sh_elf_swap_insns
51 PARAMS ((bfd *, asection *, PTR, bfd_byte *, bfd_vma));
52 static boolean sh_elf_relocate_section
53 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
54 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
55 static bfd_byte *sh_elf_get_relocated_section_contents
56 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
57 bfd_byte *, boolean, asymbol **));
58
59 static reloc_howto_type sh_elf_howto_table[] =
60 {
61 /* No relocation. */
62 HOWTO (R_SH_NONE, /* type */
63 0, /* rightshift */
64 0, /* size (0 = byte, 1 = short, 2 = long) */
65 0, /* bitsize */
66 false, /* pc_relative */
67 0, /* bitpos */
68 complain_overflow_dont, /* complain_on_overflow */
69 sh_elf_reloc, /* special_function */
70 "R_SH_NONE", /* name */
71 false, /* partial_inplace */
72 0, /* src_mask */
73 0, /* dst_mask */
74 false), /* pcrel_offset */
75
76 /* 32 bit absolute relocation. Setting partial_inplace to true and
77 src_mask to a non-zero value is similar to the COFF toolchain. */
78 HOWTO (R_SH_DIR32, /* type */
79 0, /* rightshift */
80 2, /* size (0 = byte, 1 = short, 2 = long) */
81 32, /* bitsize */
82 false, /* pc_relative */
83 0, /* bitpos */
84 complain_overflow_bitfield, /* complain_on_overflow */
85 sh_elf_reloc, /* special_function */
86 "R_SH_DIR32", /* name */
87 true, /* partial_inplace */
88 0xffffffff, /* src_mask */
89 0xffffffff, /* dst_mask */
90 false), /* pcrel_offset */
91
92 /* 32 bit PC relative relocation. */
93 HOWTO (R_SH_REL32, /* type */
94 0, /* rightshift */
95 2, /* size (0 = byte, 1 = short, 2 = long) */
96 32, /* bitsize */
97 true, /* pc_relative */
98 0, /* bitpos */
99 complain_overflow_signed, /* complain_on_overflow */
100 sh_elf_reloc, /* special_function */
101 "R_SH_REL32", /* name */
102 false, /* partial_inplace */
103 0, /* src_mask */
104 0xffffffff, /* dst_mask */
105 true), /* pcrel_offset */
106
107 /* 8 bit PC relative branch divided by 2. */
108 HOWTO (R_SH_DIR8WPN, /* type */
109 1, /* rightshift */
110 1, /* size (0 = byte, 1 = short, 2 = long) */
111 8, /* bitsize */
112 true, /* pc_relative */
113 0, /* bitpos */
114 complain_overflow_signed, /* complain_on_overflow */
115 sh_elf_reloc, /* special_function */
116 "R_SH_DIR8WPN", /* name */
117 true, /* partial_inplace */
118 0xff, /* src_mask */
119 0xff, /* dst_mask */
120 true), /* pcrel_offset */
121
122 /* 12 bit PC relative branch divided by 2. */
123 HOWTO (R_SH_IND12W, /* type */
124 1, /* rightshift */
125 1, /* size (0 = byte, 1 = short, 2 = long) */
126 12, /* bitsize */
127 true, /* pc_relative */
128 0, /* bitpos */
129 complain_overflow_signed, /* complain_on_overflow */
130 sh_elf_reloc, /* special_function */
131 "R_SH_IND12W", /* name */
132 true, /* partial_inplace */
133 0xfff, /* src_mask */
134 0xfff, /* dst_mask */
135 true), /* pcrel_offset */
136
137 /* 8 bit unsigned PC relative divided by 4. */
138 HOWTO (R_SH_DIR8WPL, /* type */
139 2, /* rightshift */
140 1, /* size (0 = byte, 1 = short, 2 = long) */
141 8, /* bitsize */
142 true, /* pc_relative */
143 0, /* bitpos */
144 complain_overflow_unsigned, /* complain_on_overflow */
145 sh_elf_reloc, /* special_function */
146 "R_SH_DIR8WPL", /* name */
147 true, /* partial_inplace */
148 0xff, /* src_mask */
149 0xff, /* dst_mask */
150 true), /* pcrel_offset */
151
152 /* 8 bit unsigned PC relative divided by 2. */
153 HOWTO (R_SH_DIR8WPZ, /* type */
154 1, /* rightshift */
155 1, /* size (0 = byte, 1 = short, 2 = long) */
156 8, /* bitsize */
157 true, /* pc_relative */
158 0, /* bitpos */
159 complain_overflow_unsigned, /* complain_on_overflow */
160 sh_elf_reloc, /* special_function */
161 "R_SH_DIR8WPZ", /* name */
162 true, /* partial_inplace */
163 0xff, /* src_mask */
164 0xff, /* dst_mask */
165 true), /* pcrel_offset */
166
167 /* 8 bit GBR relative. FIXME: This only makes sense if we have some
168 special symbol for the GBR relative area, and that is not
169 implemented. */
170 HOWTO (R_SH_DIR8BP, /* type */
171 0, /* rightshift */
172 1, /* size (0 = byte, 1 = short, 2 = long) */
173 8, /* bitsize */
174 false, /* pc_relative */
175 0, /* bitpos */
176 complain_overflow_unsigned, /* complain_on_overflow */
177 sh_elf_reloc, /* special_function */
178 "R_SH_DIR8BP", /* name */
179 false, /* partial_inplace */
180 0, /* src_mask */
181 0xff, /* dst_mask */
182 true), /* pcrel_offset */
183
184 /* 8 bit GBR relative divided by 2. FIXME: This only makes sense if
185 we have some special symbol for the GBR relative area, and that
186 is not implemented. */
187 HOWTO (R_SH_DIR8W, /* type */
188 1, /* rightshift */
189 1, /* size (0 = byte, 1 = short, 2 = long) */
190 8, /* bitsize */
191 false, /* pc_relative */
192 0, /* bitpos */
193 complain_overflow_unsigned, /* complain_on_overflow */
194 sh_elf_reloc, /* special_function */
195 "R_SH_DIR8W", /* name */
196 false, /* partial_inplace */
197 0, /* src_mask */
198 0xff, /* dst_mask */
199 true), /* pcrel_offset */
200
201 /* 8 bit GBR relative divided by 4. FIXME: This only makes sense if
202 we have some special symbol for the GBR relative area, and that
203 is not implemented. */
204 HOWTO (R_SH_DIR8L, /* type */
205 2, /* rightshift */
206 1, /* size (0 = byte, 1 = short, 2 = long) */
207 8, /* bitsize */
208 false, /* pc_relative */
209 0, /* bitpos */
210 complain_overflow_unsigned, /* complain_on_overflow */
211 sh_elf_reloc, /* special_function */
212 "R_SH_DIR8L", /* name */
213 false, /* partial_inplace */
214 0, /* src_mask */
215 0xff, /* dst_mask */
216 true), /* pcrel_offset */
217
218 EMPTY_HOWTO (10),
219 EMPTY_HOWTO (11),
220 EMPTY_HOWTO (12),
221 EMPTY_HOWTO (13),
222 EMPTY_HOWTO (14),
223 EMPTY_HOWTO (15),
224 EMPTY_HOWTO (16),
225 EMPTY_HOWTO (17),
226 EMPTY_HOWTO (18),
227 EMPTY_HOWTO (19),
228 EMPTY_HOWTO (20),
229 EMPTY_HOWTO (21),
230 EMPTY_HOWTO (22),
231 EMPTY_HOWTO (23),
232 EMPTY_HOWTO (24),
233
234 /* The remaining relocs are a GNU extension used for relaxing. The
235 final pass of the linker never needs to do anything with any of
236 these relocs. Any required operations are handled by the
237 relaxation code. */
238
239 /* A 16 bit switch table entry. This is generated for an expression
240 such as ``.word L1 - L2''. The offset holds the difference
241 between the reloc address and L2. */
242 HOWTO (R_SH_SWITCH16, /* type */
243 0, /* rightshift */
244 1, /* size (0 = byte, 1 = short, 2 = long) */
245 16, /* bitsize */
246 false, /* pc_relative */
247 0, /* bitpos */
248 complain_overflow_unsigned, /* complain_on_overflow */
249 sh_elf_ignore_reloc, /* special_function */
250 "R_SH_SWITCH16", /* name */
251 false, /* partial_inplace */
252 0, /* src_mask */
253 0, /* dst_mask */
254 true), /* pcrel_offset */
255
256 /* A 32 bit switch table entry. This is generated for an expression
257 such as ``.long L1 - L2''. The offset holds the difference
258 between the reloc address and L2. */
259 HOWTO (R_SH_SWITCH32, /* type */
260 0, /* rightshift */
261 2, /* size (0 = byte, 1 = short, 2 = long) */
262 32, /* bitsize */
263 false, /* pc_relative */
264 0, /* bitpos */
265 complain_overflow_unsigned, /* complain_on_overflow */
266 sh_elf_ignore_reloc, /* special_function */
267 "R_SH_SWITCH32", /* name */
268 false, /* partial_inplace */
269 0, /* src_mask */
270 0, /* dst_mask */
271 true), /* pcrel_offset */
272
273 /* Indicates a .uses pseudo-op. The compiler will generate .uses
274 pseudo-ops when it finds a function call which can be relaxed.
275 The offset field holds the PC relative offset to the instruction
276 which loads the register used in the function call. */
277 HOWTO (R_SH_USES, /* type */
278 0, /* rightshift */
279 1, /* size (0 = byte, 1 = short, 2 = long) */
280 0, /* bitsize */
281 false, /* pc_relative */
282 0, /* bitpos */
283 complain_overflow_unsigned, /* complain_on_overflow */
284 sh_elf_ignore_reloc, /* special_function */
285 "R_SH_USES", /* name */
286 false, /* partial_inplace */
287 0, /* src_mask */
288 0, /* dst_mask */
289 true), /* pcrel_offset */
290
291 /* The assembler will generate this reloc for addresses referred to
292 by the register loads associated with USES relocs. The offset
293 field holds the number of times the address is referenced in the
294 object file. */
295 HOWTO (R_SH_COUNT, /* type */
296 0, /* rightshift */
297 1, /* size (0 = byte, 1 = short, 2 = long) */
298 0, /* bitsize */
299 false, /* pc_relative */
300 0, /* bitpos */
301 complain_overflow_unsigned, /* complain_on_overflow */
302 sh_elf_ignore_reloc, /* special_function */
303 "R_SH_COUNT", /* name */
304 false, /* partial_inplace */
305 0, /* src_mask */
306 0, /* dst_mask */
307 true), /* pcrel_offset */
308
309 /* Indicates an alignment statement. The offset field is the power
310 of 2 to which subsequent portions of the object file must be
311 aligned. */
312 HOWTO (R_SH_ALIGN, /* type */
313 0, /* rightshift */
314 1, /* size (0 = byte, 1 = short, 2 = long) */
315 0, /* bitsize */
316 false, /* pc_relative */
317 0, /* bitpos */
318 complain_overflow_unsigned, /* complain_on_overflow */
319 sh_elf_ignore_reloc, /* special_function */
320 "R_SH_ALIGN", /* name */
321 false, /* partial_inplace */
322 0, /* src_mask */
323 0, /* dst_mask */
324 true), /* pcrel_offset */
325
326 /* The assembler will generate this reloc before a block of
327 instructions. A section should be processed as assumining it
328 contains data, unless this reloc is seen. */
329 HOWTO (R_SH_CODE, /* type */
330 0, /* rightshift */
331 1, /* size (0 = byte, 1 = short, 2 = long) */
332 0, /* bitsize */
333 false, /* pc_relative */
334 0, /* bitpos */
335 complain_overflow_unsigned, /* complain_on_overflow */
336 sh_elf_ignore_reloc, /* special_function */
337 "R_SH_CODE", /* name */
338 false, /* partial_inplace */
339 0, /* src_mask */
340 0, /* dst_mask */
341 true), /* pcrel_offset */
342
343 /* The assembler will generate this reloc after a block of
344 instructions when it sees data that is not instructions. */
345 HOWTO (R_SH_DATA, /* type */
346 0, /* rightshift */
347 1, /* size (0 = byte, 1 = short, 2 = long) */
348 0, /* bitsize */
349 false, /* pc_relative */
350 0, /* bitpos */
351 complain_overflow_unsigned, /* complain_on_overflow */
352 sh_elf_ignore_reloc, /* special_function */
353 "R_SH_DATA", /* name */
354 false, /* partial_inplace */
355 0, /* src_mask */
356 0, /* dst_mask */
357 true), /* pcrel_offset */
358
359 /* The assembler generates this reloc for each label within a block
360 of instructions. This permits the linker to avoid swapping
361 instructions which are the targets of branches. */
362 HOWTO (R_SH_LABEL, /* type */
363 0, /* rightshift */
364 1, /* size (0 = byte, 1 = short, 2 = long) */
365 0, /* bitsize */
366 false, /* pc_relative */
367 0, /* bitpos */
368 complain_overflow_unsigned, /* complain_on_overflow */
369 sh_elf_ignore_reloc, /* special_function */
370 "R_SH_LABEL", /* name */
371 false, /* partial_inplace */
372 0, /* src_mask */
373 0, /* dst_mask */
374 true), /* pcrel_offset */
375
376 /* An 8 bit switch table entry. This is generated for an expression
377 such as ``.word L1 - L2''. The offset holds the difference
378 between the reloc address and L2. */
379 HOWTO (R_SH_SWITCH8, /* type */
380 0, /* rightshift */
381 0, /* size (0 = byte, 1 = short, 2 = long) */
382 8, /* bitsize */
383 false, /* pc_relative */
384 0, /* bitpos */
385 complain_overflow_unsigned, /* complain_on_overflow */
386 sh_elf_ignore_reloc, /* special_function */
387 "R_SH_SWITCH8", /* name */
388 false, /* partial_inplace */
389 0, /* src_mask */
390 0, /* dst_mask */
391 true), /* pcrel_offset */
392
393 /* GNU extension to record C++ vtable hierarchy */
394 HOWTO (R_SH_GNU_VTINHERIT, /* type */
395 0, /* rightshift */
396 2, /* size (0 = byte, 1 = short, 2 = long) */
397 0, /* bitsize */
398 false, /* pc_relative */
399 0, /* bitpos */
400 complain_overflow_dont, /* complain_on_overflow */
401 NULL, /* special_function */
402 "R_SH_GNU_VTINHERIT", /* name */
403 false, /* partial_inplace */
404 0, /* src_mask */
405 0, /* dst_mask */
406 false), /* pcrel_offset */
407
408 /* GNU extension to record C++ vtable member usage */
409 HOWTO (R_SH_GNU_VTENTRY, /* type */
410 0, /* rightshift */
411 2, /* size (0 = byte, 1 = short, 2 = long) */
412 0, /* bitsize */
413 false, /* pc_relative */
414 0, /* bitpos */
415 complain_overflow_dont, /* complain_on_overflow */
416 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
417 "R_SH_GNU_VTENTRY", /* name */
418 false, /* partial_inplace */
419 0, /* src_mask */
420 0, /* dst_mask */
421 false), /* pcrel_offset */
422
423 };
424
425 /* This function is used for normal relocs. This is like the COFF
426 function, and is almost certainly incorrect for other ELF targets. */
427
428 static bfd_reloc_status_type
429 sh_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
430 error_message)
431 bfd *abfd;
432 arelent *reloc_entry;
433 asymbol *symbol_in;
434 PTR data;
435 asection *input_section;
436 bfd *output_bfd;
437 char **error_message ATTRIBUTE_UNUSED;
438 {
439 unsigned long insn;
440 bfd_vma sym_value;
441 enum elf_sh_reloc_type r_type;
442 bfd_vma addr = reloc_entry->address;
443 bfd_byte *hit_data = addr + (bfd_byte *) data;
444
445 r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
446
447 if (output_bfd != NULL)
448 {
449 /* Partial linking--do nothing. */
450 reloc_entry->address += input_section->output_offset;
451 return bfd_reloc_ok;
452 }
453
454 /* Almost all relocs have to do with relaxing. If any work must be
455 done for them, it has been done in sh_relax_section. */
456 if (r_type != R_SH_DIR32
457 && (r_type != R_SH_IND12W
458 || (symbol_in->flags & BSF_LOCAL) != 0))
459 return bfd_reloc_ok;
460
461 if (symbol_in != NULL
462 && bfd_is_und_section (symbol_in->section))
463 return bfd_reloc_undefined;
464
465 if (bfd_is_com_section (symbol_in->section))
466 sym_value = 0;
467 else
468 sym_value = (symbol_in->value +
469 symbol_in->section->output_section->vma +
470 symbol_in->section->output_offset);
471
472 switch (r_type)
473 {
474 case R_SH_DIR32:
475 insn = bfd_get_32 (abfd, hit_data);
476 insn += sym_value + reloc_entry->addend;
477 bfd_put_32 (abfd, insn, hit_data);
478 break;
479 case R_SH_IND12W:
480 insn = bfd_get_16 (abfd, hit_data);
481 sym_value += reloc_entry->addend;
482 sym_value -= (input_section->output_section->vma
483 + input_section->output_offset
484 + addr
485 + 4);
486 sym_value += (insn & 0xfff) << 1;
487 if (insn & 0x800)
488 sym_value -= 0x1000;
489 insn = (insn & 0xf000) | (sym_value & 0xfff);
490 bfd_put_16 (abfd, insn, hit_data);
491 if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
492 return bfd_reloc_overflow;
493 break;
494 default:
495 abort ();
496 break;
497 }
498
499 return bfd_reloc_ok;
500 }
501
502 /* This function is used for relocs which are only used for relaxing,
503 which the linker should otherwise ignore. */
504
505 static bfd_reloc_status_type
506 sh_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
507 output_bfd, error_message)
508 bfd *abfd ATTRIBUTE_UNUSED;
509 arelent *reloc_entry;
510 asymbol *symbol ATTRIBUTE_UNUSED;
511 PTR data ATTRIBUTE_UNUSED;
512 asection *input_section;
513 bfd *output_bfd;
514 char **error_message ATTRIBUTE_UNUSED;
515 {
516 if (output_bfd != NULL)
517 reloc_entry->address += input_section->output_offset;
518 return bfd_reloc_ok;
519 }
520
521 /* This structure is used to map BFD reloc codes to SH ELF relocs. */
522
523 struct elf_reloc_map
524 {
525 bfd_reloc_code_real_type bfd_reloc_val;
526 unsigned char elf_reloc_val;
527 };
528
529 /* An array mapping BFD reloc codes to SH ELF relocs. */
530
531 static const struct elf_reloc_map sh_reloc_map[] =
532 {
533 { BFD_RELOC_NONE, R_SH_NONE },
534 { BFD_RELOC_32, R_SH_DIR32 },
535 { BFD_RELOC_CTOR, R_SH_DIR32 },
536 { BFD_RELOC_32_PCREL, R_SH_REL32 },
537 { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
538 { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
539 { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
540 { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
541 { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
542 { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
543 { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
544 { BFD_RELOC_SH_USES, R_SH_USES },
545 { BFD_RELOC_SH_COUNT, R_SH_COUNT },
546 { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
547 { BFD_RELOC_SH_CODE, R_SH_CODE },
548 { BFD_RELOC_SH_DATA, R_SH_DATA },
549 { BFD_RELOC_SH_LABEL, R_SH_LABEL },
550 { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
551 { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
552 };
553
554 /* Given a BFD reloc code, return the howto structure for the
555 corresponding SH ELf reloc. */
556
557 static reloc_howto_type *
558 sh_elf_reloc_type_lookup (abfd, code)
559 bfd *abfd ATTRIBUTE_UNUSED;
560 bfd_reloc_code_real_type code;
561 {
562 unsigned int i;
563
564 for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
565 {
566 if (sh_reloc_map[i].bfd_reloc_val == code)
567 return &sh_elf_howto_table[(int) sh_reloc_map[i].elf_reloc_val];
568 }
569
570 return NULL;
571 }
572
573 /* Given an ELF reloc, fill in the howto field of a relent. */
574
575 static void
576 sh_elf_info_to_howto (abfd, cache_ptr, dst)
577 bfd *abfd ATTRIBUTE_UNUSED;
578 arelent *cache_ptr;
579 Elf_Internal_Rela *dst;
580 {
581 unsigned int r;
582
583 r = ELF32_R_TYPE (dst->r_info);
584
585 BFD_ASSERT (r < (unsigned int) R_SH_max);
586 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
587
588 cache_ptr->howto = &sh_elf_howto_table[r];
589 }
590 \f
591 /* This function handles relaxing for SH ELF. See the corresponding
592 function in coff-sh.c for a description of what this does. FIXME:
593 There is a lot of duplication here between this code and the COFF
594 specific code. The format of relocs and symbols is wound deeply
595 into this code, but it would still be better if the duplication
596 could be eliminated somehow. Note in particular that although both
597 functions use symbols like R_SH_CODE, those symbols have different
598 values; in coff-sh.c they come from include/coff/sh.h, whereas here
599 they come from enum elf_sh_reloc_type in include/elf/sh.h. */
600
601 static boolean
602 sh_elf_relax_section (abfd, sec, link_info, again)
603 bfd *abfd;
604 asection *sec;
605 struct bfd_link_info *link_info;
606 boolean *again;
607 {
608 Elf_Internal_Shdr *symtab_hdr;
609 Elf_Internal_Rela *internal_relocs;
610 Elf_Internal_Rela *free_relocs = NULL;
611 boolean have_code;
612 Elf_Internal_Rela *irel, *irelend;
613 bfd_byte *contents = NULL;
614 bfd_byte *free_contents = NULL;
615 Elf32_External_Sym *extsyms = NULL;
616 Elf32_External_Sym *free_extsyms = NULL;
617
618 *again = false;
619
620 if (link_info->relocateable
621 || (sec->flags & SEC_RELOC) == 0
622 || sec->reloc_count == 0)
623 return true;
624
625 /* If this is the first time we have been called for this section,
626 initialize the cooked size. */
627 if (sec->_cooked_size == 0)
628 sec->_cooked_size = sec->_raw_size;
629
630 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
631
632 internal_relocs = (_bfd_elf32_link_read_relocs
633 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
634 link_info->keep_memory));
635 if (internal_relocs == NULL)
636 goto error_return;
637 if (! link_info->keep_memory)
638 free_relocs = internal_relocs;
639
640 have_code = false;
641
642 irelend = internal_relocs + sec->reloc_count;
643 for (irel = internal_relocs; irel < irelend; irel++)
644 {
645 bfd_vma laddr, paddr, symval;
646 unsigned short insn;
647 Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
648 bfd_signed_vma foff;
649
650 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
651 have_code = true;
652
653 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
654 continue;
655
656 /* Get the section contents. */
657 if (contents == NULL)
658 {
659 if (elf_section_data (sec)->this_hdr.contents != NULL)
660 contents = elf_section_data (sec)->this_hdr.contents;
661 else
662 {
663 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
664 if (contents == NULL)
665 goto error_return;
666 free_contents = contents;
667
668 if (! bfd_get_section_contents (abfd, sec, contents,
669 (file_ptr) 0, sec->_raw_size))
670 goto error_return;
671 }
672 }
673
674 /* The r_addend field of the R_SH_USES reloc will point us to
675 the register load. The 4 is because the r_addend field is
676 computed as though it were a jump offset, which are based
677 from 4 bytes after the jump instruction. */
678 laddr = irel->r_offset + 4 + irel->r_addend;
679 if (laddr >= sec->_raw_size)
680 {
681 (*_bfd_error_handler) (_("%s: 0x%lx: warning: bad R_SH_USES offset"),
682 bfd_get_filename (abfd),
683 (unsigned long) irel->r_offset);
684 continue;
685 }
686 insn = bfd_get_16 (abfd, contents + laddr);
687
688 /* If the instruction is not mov.l NN,rN, we don't know what to
689 do. */
690 if ((insn & 0xf000) != 0xd000)
691 {
692 ((*_bfd_error_handler)
693 (_("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
694 bfd_get_filename (abfd), (unsigned long) irel->r_offset, insn));
695 continue;
696 }
697
698 /* Get the address from which the register is being loaded. The
699 displacement in the mov.l instruction is quadrupled. It is a
700 displacement from four bytes after the movl instruction, but,
701 before adding in the PC address, two least significant bits
702 of the PC are cleared. We assume that the section is aligned
703 on a four byte boundary. */
704 paddr = insn & 0xff;
705 paddr *= 4;
706 paddr += (laddr + 4) &~ 3;
707 if (paddr >= sec->_raw_size)
708 {
709 ((*_bfd_error_handler)
710 (_("%s: 0x%lx: warning: bad R_SH_USES load offset"),
711 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
712 continue;
713 }
714
715 /* Get the reloc for the address from which the register is
716 being loaded. This reloc will tell us which function is
717 actually being called. */
718 for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
719 if (irelfn->r_offset == paddr
720 && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
721 break;
722 if (irelfn >= irelend)
723 {
724 ((*_bfd_error_handler)
725 (_("%s: 0x%lx: warning: could not find expected reloc"),
726 bfd_get_filename (abfd), (unsigned long) paddr));
727 continue;
728 }
729
730 /* Read this BFD's symbols if we haven't done so already. */
731 if (extsyms == NULL)
732 {
733 if (symtab_hdr->contents != NULL)
734 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
735 else
736 {
737 extsyms = ((Elf32_External_Sym *)
738 bfd_malloc (symtab_hdr->sh_size));
739 if (extsyms == NULL)
740 goto error_return;
741 free_extsyms = extsyms;
742 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
743 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
744 != symtab_hdr->sh_size))
745 goto error_return;
746 }
747 }
748
749 /* Get the value of the symbol referred to by the reloc. */
750 if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
751 {
752 Elf_Internal_Sym isym;
753
754 /* A local symbol. */
755 bfd_elf32_swap_symbol_in (abfd,
756 extsyms + ELF32_R_SYM (irelfn->r_info),
757 &isym);
758
759 if (isym.st_shndx != _bfd_elf_section_from_bfd_section (abfd, sec))
760 {
761 ((*_bfd_error_handler)
762 (_("%s: 0x%lx: warning: symbol in unexpected section"),
763 bfd_get_filename (abfd), (unsigned long) paddr));
764 continue;
765 }
766
767 symval = (isym.st_value
768 + sec->output_section->vma
769 + sec->output_offset);
770 }
771 else
772 {
773 unsigned long indx;
774 struct elf_link_hash_entry *h;
775
776 indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
777 h = elf_sym_hashes (abfd)[indx];
778 BFD_ASSERT (h != NULL);
779 if (h->root.type != bfd_link_hash_defined
780 && h->root.type != bfd_link_hash_defweak)
781 {
782 /* This appears to be a reference to an undefined
783 symbol. Just ignore it--it will be caught by the
784 regular reloc processing. */
785 continue;
786 }
787
788 symval = (h->root.u.def.value
789 + h->root.u.def.section->output_section->vma
790 + h->root.u.def.section->output_offset);
791 }
792
793 symval += bfd_get_32 (abfd, contents + paddr);
794
795 /* See if this function call can be shortened. */
796 foff = (symval
797 - (irel->r_offset
798 + sec->output_section->vma
799 + sec->output_offset
800 + 4));
801 if (foff < -0x1000 || foff >= 0x1000)
802 {
803 /* After all that work, we can't shorten this function call. */
804 continue;
805 }
806
807 /* Shorten the function call. */
808
809 /* For simplicity of coding, we are going to modify the section
810 contents, the section relocs, and the BFD symbol table. We
811 must tell the rest of the code not to free up this
812 information. It would be possible to instead create a table
813 of changes which have to be made, as is done in coff-mips.c;
814 that would be more work, but would require less memory when
815 the linker is run. */
816
817 elf_section_data (sec)->relocs = internal_relocs;
818 free_relocs = NULL;
819
820 elf_section_data (sec)->this_hdr.contents = contents;
821 free_contents = NULL;
822
823 symtab_hdr->contents = (bfd_byte *) extsyms;
824 free_extsyms = NULL;
825
826 /* Replace the jsr with a bsr. */
827
828 /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
829 replace the jsr with a bsr. */
830 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
831 if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
832 {
833 /* If this needs to be changed because of future relaxing,
834 it will be handled here like other internal IND12W
835 relocs. */
836 bfd_put_16 (abfd,
837 0xb000 | ((foff >> 1) & 0xfff),
838 contents + irel->r_offset);
839 }
840 else
841 {
842 /* We can't fully resolve this yet, because the external
843 symbol value may be changed by future relaxing. We let
844 the final link phase handle it. */
845 bfd_put_16 (abfd, 0xb000, contents + irel->r_offset);
846 }
847
848 /* See if there is another R_SH_USES reloc referring to the same
849 register load. */
850 for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
851 if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
852 && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
853 break;
854 if (irelscan < irelend)
855 {
856 /* Some other function call depends upon this register load,
857 and we have not yet converted that function call.
858 Indeed, we may never be able to convert it. There is
859 nothing else we can do at this point. */
860 continue;
861 }
862
863 /* Look for a R_SH_COUNT reloc on the location where the
864 function address is stored. Do this before deleting any
865 bytes, to avoid confusion about the address. */
866 for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
867 if (irelcount->r_offset == paddr
868 && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
869 break;
870
871 /* Delete the register load. */
872 if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
873 goto error_return;
874
875 /* That will change things, so, just in case it permits some
876 other function call to come within range, we should relax
877 again. Note that this is not required, and it may be slow. */
878 *again = true;
879
880 /* Now check whether we got a COUNT reloc. */
881 if (irelcount >= irelend)
882 {
883 ((*_bfd_error_handler)
884 (_("%s: 0x%lx: warning: could not find expected COUNT reloc"),
885 bfd_get_filename (abfd), (unsigned long) paddr));
886 continue;
887 }
888
889 /* The number of uses is stored in the r_addend field. We've
890 just deleted one. */
891 if (irelcount->r_addend == 0)
892 {
893 ((*_bfd_error_handler) (_("%s: 0x%lx: warning: bad count"),
894 bfd_get_filename (abfd),
895 (unsigned long) paddr));
896 continue;
897 }
898
899 --irelcount->r_addend;
900
901 /* If there are no more uses, we can delete the address. Reload
902 the address from irelfn, in case it was changed by the
903 previous call to sh_elf_relax_delete_bytes. */
904 if (irelcount->r_addend == 0)
905 {
906 if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
907 goto error_return;
908 }
909
910 /* We've done all we can with that function call. */
911 }
912
913 /* Look for load and store instructions that we can align on four
914 byte boundaries. */
915 if (have_code)
916 {
917 boolean swapped;
918
919 /* Get the section contents. */
920 if (contents == NULL)
921 {
922 if (elf_section_data (sec)->this_hdr.contents != NULL)
923 contents = elf_section_data (sec)->this_hdr.contents;
924 else
925 {
926 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
927 if (contents == NULL)
928 goto error_return;
929 free_contents = contents;
930
931 if (! bfd_get_section_contents (abfd, sec, contents,
932 (file_ptr) 0, sec->_raw_size))
933 goto error_return;
934 }
935 }
936
937 if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
938 &swapped))
939 goto error_return;
940
941 if (swapped)
942 {
943 elf_section_data (sec)->relocs = internal_relocs;
944 free_relocs = NULL;
945
946 elf_section_data (sec)->this_hdr.contents = contents;
947 free_contents = NULL;
948
949 symtab_hdr->contents = (bfd_byte *) extsyms;
950 free_extsyms = NULL;
951 }
952 }
953
954 if (free_relocs != NULL)
955 {
956 free (free_relocs);
957 free_relocs = NULL;
958 }
959
960 if (free_contents != NULL)
961 {
962 if (! link_info->keep_memory)
963 free (free_contents);
964 else
965 {
966 /* Cache the section contents for elf_link_input_bfd. */
967 elf_section_data (sec)->this_hdr.contents = contents;
968 }
969 free_contents = NULL;
970 }
971
972 if (free_extsyms != NULL)
973 {
974 if (! link_info->keep_memory)
975 free (free_extsyms);
976 else
977 {
978 /* Cache the symbols for elf_link_input_bfd. */
979 symtab_hdr->contents = extsyms;
980 }
981 free_extsyms = NULL;
982 }
983
984 return true;
985
986 error_return:
987 if (free_relocs != NULL)
988 free (free_relocs);
989 if (free_contents != NULL)
990 free (free_contents);
991 if (free_extsyms != NULL)
992 free (free_extsyms);
993 return false;
994 }
995
996 /* Delete some bytes from a section while relaxing. FIXME: There is a
997 lot of duplication between this function and sh_relax_delete_bytes
998 in coff-sh.c. */
999
1000 static boolean
1001 sh_elf_relax_delete_bytes (abfd, sec, addr, count)
1002 bfd *abfd;
1003 asection *sec;
1004 bfd_vma addr;
1005 int count;
1006 {
1007 Elf_Internal_Shdr *symtab_hdr;
1008 Elf32_External_Sym *extsyms;
1009 int shndx, index;
1010 bfd_byte *contents;
1011 Elf_Internal_Rela *irel, *irelend;
1012 Elf_Internal_Rela *irelalign;
1013 bfd_vma toaddr;
1014 Elf32_External_Sym *esym, *esymend;
1015 struct elf_link_hash_entry *sym_hash;
1016 asection *o;
1017
1018 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1019 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1020
1021 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1022
1023 contents = elf_section_data (sec)->this_hdr.contents;
1024
1025 /* The deletion must stop at the next ALIGN reloc for an aligment
1026 power larger than the number of bytes we are deleting. */
1027
1028 irelalign = NULL;
1029 toaddr = sec->_cooked_size;
1030
1031 irel = elf_section_data (sec)->relocs;
1032 irelend = irel + sec->reloc_count;
1033 for (; irel < irelend; irel++)
1034 {
1035 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1036 && irel->r_offset > addr
1037 && count < (1 << irel->r_addend))
1038 {
1039 irelalign = irel;
1040 toaddr = irel->r_offset;
1041 break;
1042 }
1043 }
1044
1045 /* Actually delete the bytes. */
1046 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1047 if (irelalign == NULL)
1048 sec->_cooked_size -= count;
1049 else
1050 {
1051 int i;
1052
1053 #define NOP_OPCODE (0x0009)
1054
1055 BFD_ASSERT ((count & 1) == 0);
1056 for (i = 0; i < count; i += 2)
1057 bfd_put_16 (abfd, NOP_OPCODE, contents + toaddr - count + i);
1058 }
1059
1060 /* Adjust all the relocs. */
1061 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1062 {
1063 bfd_vma nraddr, stop;
1064 bfd_vma start = 0;
1065 int insn = 0;
1066 Elf_Internal_Sym sym;
1067 int off, adjust, oinsn;
1068 bfd_signed_vma voff = 0;
1069 boolean overflow;
1070
1071 /* Get the new reloc address. */
1072 nraddr = irel->r_offset;
1073 if ((irel->r_offset > addr
1074 && irel->r_offset < toaddr)
1075 || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1076 && irel->r_offset == toaddr))
1077 nraddr -= count;
1078
1079 /* See if this reloc was for the bytes we have deleted, in which
1080 case we no longer care about it. Don't delete relocs which
1081 represent addresses, though. */
1082 if (irel->r_offset >= addr
1083 && irel->r_offset < addr + count
1084 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
1085 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
1086 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
1087 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
1088 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1089 (int) R_SH_NONE);
1090
1091 /* If this is a PC relative reloc, see if the range it covers
1092 includes the bytes we have deleted. */
1093 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1094 {
1095 default:
1096 break;
1097
1098 case R_SH_DIR8WPN:
1099 case R_SH_IND12W:
1100 case R_SH_DIR8WPZ:
1101 case R_SH_DIR8WPL:
1102 start = irel->r_offset;
1103 insn = bfd_get_16 (abfd, contents + nraddr);
1104 break;
1105 }
1106
1107 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1108 {
1109 default:
1110 start = stop = addr;
1111 break;
1112
1113 case R_SH_DIR32:
1114 /* If this reloc is against a symbol defined in this
1115 section, and the symbol will not be adjusted below, we
1116 must check the addend to see it will put the value in
1117 range to be adjusted, and hence must be changed. */
1118 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1119 {
1120 bfd_elf32_swap_symbol_in (abfd,
1121 extsyms + ELF32_R_SYM (irel->r_info),
1122 &sym);
1123 if (sym.st_shndx == shndx
1124 && (sym.st_value <= addr
1125 || sym.st_value >= toaddr))
1126 {
1127 bfd_vma val;
1128
1129 val = bfd_get_32 (abfd, contents + nraddr);
1130 val += sym.st_value;
1131 if (val > addr && val < toaddr)
1132 bfd_put_32 (abfd, val - count, contents + nraddr);
1133 }
1134 }
1135 start = stop = addr;
1136 break;
1137
1138 case R_SH_DIR8WPN:
1139 off = insn & 0xff;
1140 if (off & 0x80)
1141 off -= 0x100;
1142 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1143 break;
1144
1145 case R_SH_IND12W:
1146 if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
1147 start = stop = addr;
1148 else
1149 {
1150 off = insn & 0xfff;
1151 if (off & 0x800)
1152 off -= 0x1000;
1153 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1154 }
1155 break;
1156
1157 case R_SH_DIR8WPZ:
1158 off = insn & 0xff;
1159 stop = start + 4 + off * 2;
1160 break;
1161
1162 case R_SH_DIR8WPL:
1163 off = insn & 0xff;
1164 stop = (start &~ (bfd_vma) 3) + 4 + off * 4;
1165 break;
1166
1167 case R_SH_SWITCH8:
1168 case R_SH_SWITCH16:
1169 case R_SH_SWITCH32:
1170 /* These relocs types represent
1171 .word L2-L1
1172 The r_addend field holds the difference between the reloc
1173 address and L1. That is the start of the reloc, and
1174 adding in the contents gives us the top. We must adjust
1175 both the r_offset field and the section contents.
1176 N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
1177 and the elf bfd r_offset is called r_vaddr. */
1178
1179 stop = irel->r_offset;
1180 start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
1181
1182 if (start > addr
1183 && start < toaddr
1184 && (stop <= addr || stop >= toaddr))
1185 irel->r_addend += count;
1186 else if (stop > addr
1187 && stop < toaddr
1188 && (start <= addr || start >= toaddr))
1189 irel->r_addend -= count;
1190
1191 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
1192 voff = bfd_get_signed_16 (abfd, contents + nraddr);
1193 else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
1194 voff = bfd_get_8 (abfd, contents + nraddr);
1195 else
1196 voff = bfd_get_signed_32 (abfd, contents + nraddr);
1197 stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1198
1199 break;
1200
1201 case R_SH_USES:
1202 start = irel->r_offset;
1203 stop = (bfd_vma) ((bfd_signed_vma) start
1204 + (long) irel->r_addend
1205 + 4);
1206 break;
1207 }
1208
1209 if (start > addr
1210 && start < toaddr
1211 && (stop <= addr || stop >= toaddr))
1212 adjust = count;
1213 else if (stop > addr
1214 && stop < toaddr
1215 && (start <= addr || start >= toaddr))
1216 adjust = - count;
1217 else
1218 adjust = 0;
1219
1220 if (adjust != 0)
1221 {
1222 oinsn = insn;
1223 overflow = false;
1224 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1225 {
1226 default:
1227 abort ();
1228 break;
1229
1230 case R_SH_DIR8WPN:
1231 case R_SH_DIR8WPZ:
1232 insn += adjust / 2;
1233 if ((oinsn & 0xff00) != (insn & 0xff00))
1234 overflow = true;
1235 bfd_put_16 (abfd, insn, contents + nraddr);
1236 break;
1237
1238 case R_SH_IND12W:
1239 insn += adjust / 2;
1240 if ((oinsn & 0xf000) != (insn & 0xf000))
1241 overflow = true;
1242 bfd_put_16 (abfd, insn, contents + nraddr);
1243 break;
1244
1245 case R_SH_DIR8WPL:
1246 BFD_ASSERT (adjust == count || count >= 4);
1247 if (count >= 4)
1248 insn += adjust / 4;
1249 else
1250 {
1251 if ((irel->r_offset & 3) == 0)
1252 ++insn;
1253 }
1254 if ((oinsn & 0xff00) != (insn & 0xff00))
1255 overflow = true;
1256 bfd_put_16 (abfd, insn, contents + nraddr);
1257 break;
1258
1259 case R_SH_SWITCH16:
1260 voff += adjust;
1261 if (voff < - 0x8000 || voff >= 0x8000)
1262 overflow = true;
1263 bfd_put_signed_16 (abfd, voff, contents + nraddr);
1264 break;
1265
1266 case R_SH_SWITCH32:
1267 voff += adjust;
1268 bfd_put_signed_32 (abfd, voff, contents + nraddr);
1269 break;
1270
1271 case R_SH_USES:
1272 irel->r_addend += adjust;
1273 break;
1274 }
1275
1276 if (overflow)
1277 {
1278 ((*_bfd_error_handler)
1279 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1280 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1281 bfd_set_error (bfd_error_bad_value);
1282 return false;
1283 }
1284 }
1285
1286 irel->r_offset = nraddr;
1287 }
1288
1289 /* Look through all the other sections. If there contain any IMM32
1290 relocs against internal symbols which we are not going to adjust
1291 below, we may need to adjust the addends. */
1292 for (o = abfd->sections; o != NULL; o = o->next)
1293 {
1294 Elf_Internal_Rela *internal_relocs;
1295 Elf_Internal_Rela *irelscan, *irelscanend;
1296 bfd_byte *ocontents;
1297
1298 if (o == sec
1299 || (o->flags & SEC_RELOC) == 0
1300 || o->reloc_count == 0)
1301 continue;
1302
1303 /* We always cache the relocs. Perhaps, if info->keep_memory is
1304 false, we should free them, if we are permitted to, when we
1305 leave sh_coff_relax_section. */
1306 internal_relocs = (_bfd_elf32_link_read_relocs
1307 (abfd, o, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1308 true));
1309 if (internal_relocs == NULL)
1310 return false;
1311
1312 ocontents = NULL;
1313 irelscanend = internal_relocs + o->reloc_count;
1314 for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
1315 {
1316 Elf_Internal_Sym sym;
1317
1318 /* Dwarf line numbers use R_SH_SWITCH32 relocs. */
1319 if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32)
1320 {
1321 bfd_vma start, stop;
1322 bfd_signed_vma voff;
1323
1324 if (ocontents == NULL)
1325 {
1326 if (elf_section_data (o)->this_hdr.contents != NULL)
1327 ocontents = elf_section_data (o)->this_hdr.contents;
1328 else
1329 {
1330 /* We always cache the section contents.
1331 Perhaps, if info->keep_memory is false, we
1332 should free them, if we are permitted to,
1333 when we leave sh_coff_relax_section. */
1334 ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1335 if (ocontents == NULL)
1336 return false;
1337 if (! bfd_get_section_contents (abfd, o, ocontents,
1338 (file_ptr) 0,
1339 o->_raw_size))
1340 return false;
1341 elf_section_data (o)->this_hdr.contents = ocontents;
1342 }
1343 }
1344
1345 stop = irelscan->r_offset;
1346 start
1347 = (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend);
1348
1349 /* STOP is in a different section, so it won't change. */
1350 if (start > addr && start < toaddr)
1351 irelscan->r_addend += count;
1352
1353 voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset);
1354 stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1355
1356 if (start > addr
1357 && start < toaddr
1358 && (stop <= addr || stop >= toaddr))
1359 bfd_put_signed_32 (abfd, voff + count,
1360 ocontents + irelscan->r_offset);
1361 else if (stop > addr
1362 && stop < toaddr
1363 && (start <= addr || start >= toaddr))
1364 bfd_put_signed_32 (abfd, voff - count,
1365 ocontents + irelscan->r_offset);
1366 }
1367
1368 if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
1369 continue;
1370
1371 if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
1372 continue;
1373
1374 bfd_elf32_swap_symbol_in (abfd,
1375 extsyms + ELF32_R_SYM (irelscan->r_info),
1376 &sym);
1377
1378 if (sym.st_shndx == shndx
1379 && (sym.st_value <= addr
1380 || sym.st_value >= toaddr))
1381 {
1382 bfd_vma val;
1383
1384 if (ocontents == NULL)
1385 {
1386 if (elf_section_data (o)->this_hdr.contents != NULL)
1387 ocontents = elf_section_data (o)->this_hdr.contents;
1388 else
1389 {
1390 /* We always cache the section contents.
1391 Perhaps, if info->keep_memory is false, we
1392 should free them, if we are permitted to,
1393 when we leave sh_coff_relax_section. */
1394 ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1395 if (ocontents == NULL)
1396 return false;
1397 if (! bfd_get_section_contents (abfd, o, ocontents,
1398 (file_ptr) 0,
1399 o->_raw_size))
1400 return false;
1401 elf_section_data (o)->this_hdr.contents = ocontents;
1402 }
1403 }
1404
1405 val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
1406 val += sym.st_value;
1407 if (val > addr && val < toaddr)
1408 bfd_put_32 (abfd, val - count,
1409 ocontents + irelscan->r_offset);
1410 }
1411 }
1412 }
1413
1414 /* Adjust the local symbols defined in this section. */
1415 esym = extsyms;
1416 esymend = esym + symtab_hdr->sh_info;
1417 for (; esym < esymend; esym++)
1418 {
1419 Elf_Internal_Sym isym;
1420
1421 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1422
1423 if (isym.st_shndx == shndx
1424 && isym.st_value > addr
1425 && isym.st_value < toaddr)
1426 {
1427 isym.st_value -= count;
1428 bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1429 }
1430 }
1431
1432 /* Now adjust the global symbols defined in this section. */
1433 esym = extsyms + symtab_hdr->sh_info;
1434 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1435 for (index = 0; esym < esymend; esym++, index++)
1436 {
1437 Elf_Internal_Sym isym;
1438
1439 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1440 sym_hash = elf_sym_hashes (abfd)[index];
1441 if (isym.st_shndx == shndx
1442 && ((sym_hash)->root.type == bfd_link_hash_defined
1443 || (sym_hash)->root.type == bfd_link_hash_defweak)
1444 && (sym_hash)->root.u.def.section == sec
1445 && (sym_hash)->root.u.def.value > addr
1446 && (sym_hash)->root.u.def.value < toaddr)
1447 {
1448 (sym_hash)->root.u.def.value -= count;
1449 }
1450 }
1451
1452 /* See if we can move the ALIGN reloc forward. We have adjusted
1453 r_offset for it already. */
1454 if (irelalign != NULL)
1455 {
1456 bfd_vma alignto, alignaddr;
1457
1458 alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
1459 alignaddr = BFD_ALIGN (irelalign->r_offset,
1460 1 << irelalign->r_addend);
1461 if (alignto != alignaddr)
1462 {
1463 /* Tail recursion. */
1464 return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
1465 alignto - alignaddr);
1466 }
1467 }
1468
1469 return true;
1470 }
1471
1472 /* Look for loads and stores which we can align to four byte
1473 boundaries. This is like sh_align_loads in coff-sh.c. */
1474
1475 static boolean
1476 sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped)
1477 bfd *abfd;
1478 asection *sec;
1479 Elf_Internal_Rela *internal_relocs;
1480 bfd_byte *contents;
1481 boolean *pswapped;
1482 {
1483 Elf_Internal_Rela *irel, *irelend;
1484 bfd_vma *labels = NULL;
1485 bfd_vma *label, *label_end;
1486
1487 *pswapped = false;
1488
1489 irelend = internal_relocs + sec->reloc_count;
1490
1491 /* Get all the addresses with labels on them. */
1492 labels = (bfd_vma *) bfd_malloc (sec->reloc_count * sizeof (bfd_vma));
1493 if (labels == NULL)
1494 goto error_return;
1495 label_end = labels;
1496 for (irel = internal_relocs; irel < irelend; irel++)
1497 {
1498 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
1499 {
1500 *label_end = irel->r_offset;
1501 ++label_end;
1502 }
1503 }
1504
1505 /* Note that the assembler currently always outputs relocs in
1506 address order. If that ever changes, this code will need to sort
1507 the label values and the relocs. */
1508
1509 label = labels;
1510
1511 for (irel = internal_relocs; irel < irelend; irel++)
1512 {
1513 bfd_vma start, stop;
1514
1515 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
1516 continue;
1517
1518 start = irel->r_offset;
1519
1520 for (irel++; irel < irelend; irel++)
1521 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
1522 break;
1523 if (irel < irelend)
1524 stop = irel->r_offset;
1525 else
1526 stop = sec->_cooked_size;
1527
1528 if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
1529 (PTR) internal_relocs, &label,
1530 label_end, start, stop, pswapped))
1531 goto error_return;
1532 }
1533
1534 free (labels);
1535
1536 return true;
1537
1538 error_return:
1539 if (labels != NULL)
1540 free (labels);
1541 return false;
1542 }
1543
1544 /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */
1545
1546 static boolean
1547 sh_elf_swap_insns (abfd, sec, relocs, contents, addr)
1548 bfd *abfd;
1549 asection *sec;
1550 PTR relocs;
1551 bfd_byte *contents;
1552 bfd_vma addr;
1553 {
1554 Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
1555 unsigned short i1, i2;
1556 Elf_Internal_Rela *irel, *irelend;
1557
1558 /* Swap the instructions themselves. */
1559 i1 = bfd_get_16 (abfd, contents + addr);
1560 i2 = bfd_get_16 (abfd, contents + addr + 2);
1561 bfd_put_16 (abfd, i2, contents + addr);
1562 bfd_put_16 (abfd, i1, contents + addr + 2);
1563
1564 /* Adjust all reloc addresses. */
1565 irelend = internal_relocs + sec->reloc_count;
1566 for (irel = internal_relocs; irel < irelend; irel++)
1567 {
1568 enum elf_sh_reloc_type type;
1569 int add;
1570
1571 /* There are a few special types of relocs that we don't want to
1572 adjust. These relocs do not apply to the instruction itself,
1573 but are only associated with the address. */
1574 type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
1575 if (type == R_SH_ALIGN
1576 || type == R_SH_CODE
1577 || type == R_SH_DATA
1578 || type == R_SH_LABEL)
1579 continue;
1580
1581 /* If an R_SH_USES reloc points to one of the addresses being
1582 swapped, we must adjust it. It would be incorrect to do this
1583 for a jump, though, since we want to execute both
1584 instructions after the jump. (We have avoided swapping
1585 around a label, so the jump will not wind up executing an
1586 instruction it shouldn't). */
1587 if (type == R_SH_USES)
1588 {
1589 bfd_vma off;
1590
1591 off = irel->r_offset + 4 + irel->r_addend;
1592 if (off == addr)
1593 irel->r_offset += 2;
1594 else if (off == addr + 2)
1595 irel->r_offset -= 2;
1596 }
1597
1598 if (irel->r_offset == addr)
1599 {
1600 irel->r_offset += 2;
1601 add = -2;
1602 }
1603 else if (irel->r_offset == addr + 2)
1604 {
1605 irel->r_offset -= 2;
1606 add = 2;
1607 }
1608 else
1609 add = 0;
1610
1611 if (add != 0)
1612 {
1613 bfd_byte *loc;
1614 unsigned short insn, oinsn;
1615 boolean overflow;
1616
1617 loc = contents + irel->r_offset;
1618 overflow = false;
1619 switch (type)
1620 {
1621 default:
1622 break;
1623
1624 case R_SH_DIR8WPN:
1625 case R_SH_DIR8WPZ:
1626 insn = bfd_get_16 (abfd, loc);
1627 oinsn = insn;
1628 insn += add / 2;
1629 if ((oinsn & 0xff00) != (insn & 0xff00))
1630 overflow = true;
1631 bfd_put_16 (abfd, insn, loc);
1632 break;
1633
1634 case R_SH_IND12W:
1635 insn = bfd_get_16 (abfd, loc);
1636 oinsn = insn;
1637 insn += add / 2;
1638 if ((oinsn & 0xf000) != (insn & 0xf000))
1639 overflow = true;
1640 bfd_put_16 (abfd, insn, loc);
1641 break;
1642
1643 case R_SH_DIR8WPL:
1644 /* This reloc ignores the least significant 3 bits of
1645 the program counter before adding in the offset.
1646 This means that if ADDR is at an even address, the
1647 swap will not affect the offset. If ADDR is an at an
1648 odd address, then the instruction will be crossing a
1649 four byte boundary, and must be adjusted. */
1650 if ((addr & 3) != 0)
1651 {
1652 insn = bfd_get_16 (abfd, loc);
1653 oinsn = insn;
1654 insn += add / 2;
1655 if ((oinsn & 0xff00) != (insn & 0xff00))
1656 overflow = true;
1657 bfd_put_16 (abfd, insn, loc);
1658 }
1659
1660 break;
1661 }
1662
1663 if (overflow)
1664 {
1665 ((*_bfd_error_handler)
1666 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1667 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1668 bfd_set_error (bfd_error_bad_value);
1669 return false;
1670 }
1671 }
1672 }
1673
1674 return true;
1675 }
1676 \f
1677 /* Relocate an SH ELF section. */
1678
1679 static boolean
1680 sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1681 contents, relocs, local_syms, local_sections)
1682 bfd *output_bfd ATTRIBUTE_UNUSED;
1683 struct bfd_link_info *info;
1684 bfd *input_bfd;
1685 asection *input_section;
1686 bfd_byte *contents;
1687 Elf_Internal_Rela *relocs;
1688 Elf_Internal_Sym *local_syms;
1689 asection **local_sections;
1690 {
1691 Elf_Internal_Shdr *symtab_hdr;
1692 struct elf_link_hash_entry **sym_hashes;
1693 Elf_Internal_Rela *rel, *relend;
1694
1695 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1696 sym_hashes = elf_sym_hashes (input_bfd);
1697
1698 rel = relocs;
1699 relend = relocs + input_section->reloc_count;
1700 for (; rel < relend; rel++)
1701 {
1702 int r_type;
1703 reloc_howto_type *howto;
1704 unsigned long r_symndx;
1705 Elf_Internal_Sym *sym;
1706 asection *sec;
1707 struct elf_link_hash_entry *h;
1708 bfd_vma relocation;
1709 bfd_vma addend = (bfd_vma)0;
1710 bfd_reloc_status_type r;
1711
1712 r_symndx = ELF32_R_SYM (rel->r_info);
1713
1714 if (info->relocateable)
1715 {
1716 /* This is a relocateable link. We don't have to change
1717 anything, unless the reloc is against a section symbol,
1718 in which case we have to adjust according to where the
1719 section symbol winds up in the output section. */
1720 if (r_symndx < symtab_hdr->sh_info)
1721 {
1722 sym = local_syms + r_symndx;
1723 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1724 {
1725 sec = local_sections[r_symndx];
1726 rel->r_addend += sec->output_offset + sym->st_value;
1727 }
1728 }
1729
1730 continue;
1731 }
1732
1733 r_type = ELF32_R_TYPE (rel->r_info);
1734
1735 /* Many of the relocs are only used for relaxing, and are
1736 handled entirely by the relaxation code. */
1737 if (r_type > (int) R_SH_LAST_INVALID_RELOC)
1738 continue;
1739
1740 if (r_type < 0
1741 || r_type >= (int) R_SH_FIRST_INVALID_RELOC)
1742 {
1743 bfd_set_error (bfd_error_bad_value);
1744 return false;
1745 }
1746
1747 /* FIXME: This is certainly incorrect. However, it is how the
1748 COFF linker works. */
1749 if (r_type != (int) R_SH_DIR32
1750 && r_type != (int) R_SH_IND12W)
1751 continue;
1752
1753 howto = sh_elf_howto_table + r_type;
1754
1755 /* This is a final link. */
1756 h = NULL;
1757 sym = NULL;
1758 sec = NULL;
1759 if (r_symndx < symtab_hdr->sh_info)
1760 {
1761 /* There is nothing to be done for an internal IND12W
1762 relocation. FIXME: This is probably wrong, but it's how
1763 the COFF relocations work. */
1764 if (r_type == (int) R_SH_IND12W)
1765 continue;
1766 sym = local_syms + r_symndx;
1767 sec = local_sections[r_symndx];
1768 relocation = (sec->output_section->vma
1769 + sec->output_offset
1770 + sym->st_value);
1771 }
1772 else
1773 {
1774 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1775 while (h->root.type == bfd_link_hash_indirect
1776 || h->root.type == bfd_link_hash_warning)
1777 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1778 if (h->root.type == bfd_link_hash_defined
1779 || h->root.type == bfd_link_hash_defweak)
1780 {
1781 sec = h->root.u.def.section;
1782 relocation = (h->root.u.def.value
1783 + sec->output_section->vma
1784 + sec->output_offset);
1785 }
1786 else if (h->root.type == bfd_link_hash_undefweak)
1787 relocation = 0;
1788 else
1789 {
1790 if (! ((*info->callbacks->undefined_symbol)
1791 (info, h->root.root.string, input_bfd,
1792 input_section, rel->r_offset)))
1793 return false;
1794 relocation = 0;
1795 }
1796 }
1797
1798 /* FIXME: This is how the COFF relocations work. */
1799 if (r_type == (int) R_SH_IND12W)
1800 relocation -= 4;
1801
1802 switch ((int)r_type)
1803 {
1804 case (int)R_SH_DIR32:
1805 addend = rel->r_addend;
1806 break;
1807 }
1808
1809 /* COFF relocs don't use the addend. The addend is used for R_SH_DIR32
1810 to be compatible with other compilers. */
1811 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1812 contents, rel->r_offset,
1813 relocation, addend);
1814
1815 if (r != bfd_reloc_ok)
1816 {
1817 switch (r)
1818 {
1819 default:
1820 case bfd_reloc_outofrange:
1821 abort ();
1822 case bfd_reloc_overflow:
1823 {
1824 const char *name;
1825
1826 if (h != NULL)
1827 name = h->root.root.string;
1828 else
1829 {
1830 name = (bfd_elf_string_from_elf_section
1831 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1832 if (name == NULL)
1833 return false;
1834 if (*name == '\0')
1835 name = bfd_section_name (input_bfd, sec);
1836 }
1837 if (! ((*info->callbacks->reloc_overflow)
1838 (info, name, howto->name, (bfd_vma) 0,
1839 input_bfd, input_section, rel->r_offset)))
1840 return false;
1841 }
1842 break;
1843 }
1844 }
1845 }
1846
1847 return true;
1848 }
1849
1850 /* This is a version of bfd_generic_get_relocated_section_contents
1851 which uses sh_elf_relocate_section. */
1852
1853 static bfd_byte *
1854 sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1855 data, relocateable, symbols)
1856 bfd *output_bfd;
1857 struct bfd_link_info *link_info;
1858 struct bfd_link_order *link_order;
1859 bfd_byte *data;
1860 boolean relocateable;
1861 asymbol **symbols;
1862 {
1863 Elf_Internal_Shdr *symtab_hdr;
1864 asection *input_section = link_order->u.indirect.section;
1865 bfd *input_bfd = input_section->owner;
1866 asection **sections = NULL;
1867 Elf_Internal_Rela *internal_relocs = NULL;
1868 Elf32_External_Sym *external_syms = NULL;
1869 Elf_Internal_Sym *internal_syms = NULL;
1870
1871 /* We only need to handle the case of relaxing, or of having a
1872 particular set of section contents, specially. */
1873 if (relocateable
1874 || elf_section_data (input_section)->this_hdr.contents == NULL)
1875 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1876 link_order, data,
1877 relocateable,
1878 symbols);
1879
1880 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1881
1882 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1883 input_section->_raw_size);
1884
1885 if ((input_section->flags & SEC_RELOC) != 0
1886 && input_section->reloc_count > 0)
1887 {
1888 Elf_Internal_Sym *isymp;
1889 asection **secpp;
1890 Elf32_External_Sym *esym, *esymend;
1891
1892 if (symtab_hdr->contents != NULL)
1893 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
1894 else
1895 {
1896 external_syms = ((Elf32_External_Sym *)
1897 bfd_malloc (symtab_hdr->sh_info
1898 * sizeof (Elf32_External_Sym)));
1899 if (external_syms == NULL && symtab_hdr->sh_info > 0)
1900 goto error_return;
1901 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1902 || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
1903 symtab_hdr->sh_info, input_bfd)
1904 != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
1905 goto error_return;
1906 }
1907
1908 internal_relocs = (_bfd_elf32_link_read_relocs
1909 (input_bfd, input_section, (PTR) NULL,
1910 (Elf_Internal_Rela *) NULL, false));
1911 if (internal_relocs == NULL)
1912 goto error_return;
1913
1914 internal_syms = ((Elf_Internal_Sym *)
1915 bfd_malloc (symtab_hdr->sh_info
1916 * sizeof (Elf_Internal_Sym)));
1917 if (internal_syms == NULL && symtab_hdr->sh_info > 0)
1918 goto error_return;
1919
1920 sections = (asection **) bfd_malloc (symtab_hdr->sh_info
1921 * sizeof (asection *));
1922 if (sections == NULL && symtab_hdr->sh_info > 0)
1923 goto error_return;
1924
1925 isymp = internal_syms;
1926 secpp = sections;
1927 esym = external_syms;
1928 esymend = esym + symtab_hdr->sh_info;
1929 for (; esym < esymend; ++esym, ++isymp, ++secpp)
1930 {
1931 asection *isec;
1932
1933 bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
1934
1935 if (isymp->st_shndx == SHN_UNDEF)
1936 isec = bfd_und_section_ptr;
1937 else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
1938 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
1939 else if (isymp->st_shndx == SHN_ABS)
1940 isec = bfd_abs_section_ptr;
1941 else if (isymp->st_shndx == SHN_COMMON)
1942 isec = bfd_com_section_ptr;
1943 else
1944 {
1945 /* Who knows? */
1946 isec = NULL;
1947 }
1948
1949 *secpp = isec;
1950 }
1951
1952 if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
1953 input_section, data, internal_relocs,
1954 internal_syms, sections))
1955 goto error_return;
1956
1957 if (sections != NULL)
1958 free (sections);
1959 sections = NULL;
1960 if (internal_syms != NULL)
1961 free (internal_syms);
1962 internal_syms = NULL;
1963 if (external_syms != NULL && symtab_hdr->contents == NULL)
1964 free (external_syms);
1965 external_syms = NULL;
1966 if (internal_relocs != elf_section_data (input_section)->relocs)
1967 free (internal_relocs);
1968 internal_relocs = NULL;
1969 }
1970
1971 return data;
1972
1973 error_return:
1974 if (internal_relocs != NULL
1975 && internal_relocs != elf_section_data (input_section)->relocs)
1976 free (internal_relocs);
1977 if (external_syms != NULL && symtab_hdr->contents == NULL)
1978 free (external_syms);
1979 if (internal_syms != NULL)
1980 free (internal_syms);
1981 if (sections != NULL)
1982 free (sections);
1983 return NULL;
1984 }
1985 static asection *
1986 sh_elf_gc_mark_hook (abfd, info, rel, h, sym)
1987 bfd *abfd;
1988 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1989 Elf_Internal_Rela *rel;
1990 struct elf_link_hash_entry *h;
1991 Elf_Internal_Sym *sym;
1992 {
1993 if (h != NULL)
1994 {
1995 switch (ELF32_R_TYPE (rel->r_info))
1996 {
1997 case R_SH_GNU_VTINHERIT:
1998 case R_SH_GNU_VTENTRY:
1999 break;
2000
2001 default:
2002 switch (h->root.type)
2003 {
2004 case bfd_link_hash_defined:
2005 case bfd_link_hash_defweak:
2006 return h->root.u.def.section;
2007
2008 case bfd_link_hash_common:
2009 return h->root.u.c.p->section;
2010
2011 default:
2012 break;
2013 }
2014 }
2015 }
2016 else
2017 {
2018 if (!(elf_bad_symtab (abfd)
2019 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
2020 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
2021 && sym->st_shndx != SHN_COMMON))
2022 {
2023 return bfd_section_from_elf_index (abfd, sym->st_shndx);
2024 }
2025 }
2026 return NULL;
2027 }
2028
2029 static boolean
2030 sh_elf_gc_sweep_hook (abfd, info, sec, relocs)
2031 bfd *abfd ATTRIBUTE_UNUSED;
2032 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2033 asection *sec ATTRIBUTE_UNUSED;
2034 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
2035 {
2036 /* we don't use got and plt entries for sh. */
2037 return true;
2038 }
2039
2040 /* Look through the relocs for a section during the first phase.
2041 Since we don't do .gots or .plts, we just need to consider the
2042 virtual table relocs for gc. */
2043
2044 static boolean
2045 sh_elf_check_relocs (abfd, info, sec, relocs)
2046 bfd *abfd;
2047 struct bfd_link_info *info;
2048 asection *sec;
2049 const Elf_Internal_Rela *relocs;
2050 {
2051 Elf_Internal_Shdr *symtab_hdr;
2052 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2053 const Elf_Internal_Rela *rel;
2054 const Elf_Internal_Rela *rel_end;
2055
2056 if (info->relocateable)
2057 return true;
2058
2059 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2060 sym_hashes = elf_sym_hashes (abfd);
2061 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
2062 if (!elf_bad_symtab (abfd))
2063 sym_hashes_end -= symtab_hdr->sh_info;
2064
2065 rel_end = relocs + sec->reloc_count;
2066 for (rel = relocs; rel < rel_end; rel++)
2067 {
2068 struct elf_link_hash_entry *h;
2069 unsigned long r_symndx;
2070
2071 r_symndx = ELF32_R_SYM (rel->r_info);
2072 if (r_symndx < symtab_hdr->sh_info)
2073 h = NULL;
2074 else
2075 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2076
2077 switch (ELF32_R_TYPE (rel->r_info))
2078 {
2079 /* This relocation describes the C++ object vtable hierarchy.
2080 Reconstruct it for later use during GC. */
2081 case R_SH_GNU_VTINHERIT:
2082 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2083 return false;
2084 break;
2085
2086 /* This relocation describes which C++ vtable entries are actually
2087 used. Record for later use during GC. */
2088 case R_SH_GNU_VTENTRY:
2089 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2090 return false;
2091 break;
2092 }
2093 }
2094
2095 return true;
2096 }
2097
2098 boolean
2099 sh_elf_set_mach_from_flags (abfd)
2100 bfd * abfd;
2101 {
2102 flagword flags = elf_elfheader (abfd)->e_flags;
2103
2104 switch (elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK)
2105 {
2106 case EF_SH1:
2107 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh);
2108 break;
2109 case EF_SH2:
2110 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh2);
2111 break;
2112 case EF_SH_DSP:
2113 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh_dsp);
2114 break;
2115 case EF_SH3:
2116 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3);
2117 break;
2118 case EF_SH3_DSP:
2119 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3_dsp);
2120 break;
2121 case EF_SH3E:
2122 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3e);
2123 break;
2124 case EF_SH_UNKNOWN:
2125 case EF_SH4:
2126 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh4);
2127 break;
2128 default:
2129 return false;
2130 }
2131 return true;
2132 }
2133
2134 /* Function to keep SH specific file flags. */
2135 static boolean
2136 sh_elf_set_private_flags (abfd, flags)
2137 bfd * abfd;
2138 flagword flags;
2139 {
2140 BFD_ASSERT (! elf_flags_init (abfd)
2141 || elf_elfheader (abfd)->e_flags == flags);
2142
2143 elf_elfheader (abfd)->e_flags = flags;
2144 elf_flags_init (abfd) = true;
2145 return sh_elf_set_mach_from_flags (abfd);
2146 }
2147
2148 /* Copy backend specific data from one object module to another */
2149 static boolean
2150 sh_elf_copy_private_data (ibfd, obfd)
2151 bfd * ibfd;
2152 bfd * obfd;
2153 {
2154 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2155 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2156 return true;
2157
2158 return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
2159 }
2160
2161 /* This routine checks for linking big and little endian objects
2162 together, and for linking sh-dsp with sh3e / sh4 objects. */
2163
2164 static boolean
2165 sh_elf_merge_private_data (ibfd, obfd)
2166 bfd *ibfd;
2167 bfd *obfd;
2168 {
2169 flagword old_flags, new_flags;
2170
2171 if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
2172 return false;
2173
2174 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2175 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2176 return true;
2177
2178 if (! elf_flags_init (obfd))
2179 {
2180 elf_flags_init (obfd) = true;
2181 elf_elfheader (obfd)->e_flags = 0;
2182 }
2183 old_flags = elf_elfheader (obfd)->e_flags;
2184 new_flags = elf_elfheader (ibfd)->e_flags;
2185 if ((EF_SH_HAS_DSP (old_flags) && EF_SH_HAS_FP (new_flags))
2186 || (EF_SH_HAS_DSP (new_flags) && EF_SH_HAS_FP (old_flags)))
2187 {
2188 (*_bfd_error_handler)
2189 ("%s: uses %s instructions while previous modules use %s instructions",
2190 bfd_get_filename (ibfd),
2191 EF_SH_HAS_DSP (new_flags) ? "dsp" : "floating point",
2192 EF_SH_HAS_DSP (new_flags) ? "floating point" : "dsp");
2193 bfd_set_error (bfd_error_bad_value);
2194 return false;
2195 }
2196 elf_elfheader (obfd)->e_flags = EF_SH_MERGE_MACH (old_flags, new_flags);
2197
2198 return sh_elf_set_mach_from_flags (obfd);
2199 }
2200
2201 #define TARGET_BIG_SYM bfd_elf32_sh_vec
2202 #define TARGET_BIG_NAME "elf32-sh"
2203 #define TARGET_LITTLE_SYM bfd_elf32_shl_vec
2204 #define TARGET_LITTLE_NAME "elf32-shl"
2205 #define ELF_ARCH bfd_arch_sh
2206 #define ELF_MACHINE_CODE EM_SH
2207 #define ELF_MAXPAGESIZE 0x1
2208
2209 #define elf_symbol_leading_char '_'
2210
2211 #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
2212 #define elf_info_to_howto sh_elf_info_to_howto
2213 #define bfd_elf32_bfd_relax_section sh_elf_relax_section
2214 #define elf_backend_relocate_section sh_elf_relocate_section
2215 #define bfd_elf32_bfd_get_relocated_section_contents \
2216 sh_elf_get_relocated_section_contents
2217 #define elf_backend_object_p sh_elf_set_mach_from_flags
2218 #define bfd_elf32_bfd_set_private_bfd_flags \
2219 sh_elf_set_private_flags
2220 #define bfd_elf32_bfd_copy_private_bfd_data \
2221 sh_elf_copy_private_data
2222 #define bfd_elf32_bfd_merge_private_bfd_data \
2223 sh_elf_merge_private_data
2224
2225 #define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
2226 #define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
2227 #define elf_backend_check_relocs sh_elf_check_relocs
2228
2229 #define elf_backend_can_gc_sections 1
2230 #include "elf32-target.h"
This page took 0.081183 seconds and 4 git commands to generate.