* sh-opc.h: The operand of `mov.w r0, (<disp>,GBR)' is IMM1, not 0.
[deliverable/binutils-gdb.git] / bfd / elf32-sh.c
CommitLineData
252b5132 1/* Hitachi SH specific support for 32-bit ELF
d4845d57 2 Copyright 1996, 97, 98, 1999, 2000 Free Software Foundation, Inc.
252b5132
RH
3 Contributed by Ian Lance Taylor, Cygnus Support.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, 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
28static bfd_reloc_status_type sh_elf_reloc
29 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
30static bfd_reloc_status_type sh_elf_ignore_reloc
31 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
32static reloc_howto_type *sh_elf_reloc_type_lookup
33 PARAMS ((bfd *, bfd_reloc_code_real_type));
34static void sh_elf_info_to_howto
35 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
d4845d57
JR
36static boolean sh_elf_set_private_flags
37 PARAMS ((bfd *, flagword));
38static boolean sh_elf_copy_private_data
39 PARAMS ((bfd *, bfd *));
40static boolean sh_elf_merge_private_data
41 PARAMS ((bfd *, bfd *));
1630fd2b 42static boolean sh_elf_set_mach_from_flags
d4845d57 43 PARAMS ((bfd *));
252b5132
RH
44static boolean sh_elf_relax_section
45 PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
46static boolean sh_elf_relax_delete_bytes
47 PARAMS ((bfd *, asection *, bfd_vma, int));
48static boolean sh_elf_align_loads
49 PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, boolean *));
50static boolean sh_elf_swap_insns
51 PARAMS ((bfd *, asection *, PTR, bfd_byte *, bfd_vma));
52static boolean sh_elf_relocate_section
53 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
54 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
55static bfd_byte *sh_elf_get_relocated_section_contents
56 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
57 bfd_byte *, boolean, asymbol **));
37c644f2
AO
58static boolean sh_elf_check_relocs
59 PARAMS ((bfd *, struct bfd_link_info *, asection *,
60 const Elf_Internal_Rela *));
61static struct bfd_hash_entry *sh_elf_link_hash_newfunc
62 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
63static struct bfd_link_hash_table *sh_elf_link_hash_table_create
64 PARAMS ((bfd *));
65static boolean sh_elf_adjust_dynamic_symbol
66 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
67static boolean sh_elf_size_dynamic_sections
68 PARAMS ((bfd *, struct bfd_link_info *));
69static boolean sh_elf_finish_dynamic_symbol
70 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
71 Elf_Internal_Sym *));
72static boolean sh_elf_finish_dynamic_sections
73 PARAMS ((bfd *, struct bfd_link_info *));
74
75/* The name of the dynamic interpreter. This is put in the .interp
76 section. */
77
78#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
252b5132
RH
79
80static reloc_howto_type sh_elf_howto_table[] =
81{
82 /* No relocation. */
83 HOWTO (R_SH_NONE, /* type */
84 0, /* rightshift */
85 0, /* size (0 = byte, 1 = short, 2 = long) */
86 0, /* bitsize */
87 false, /* pc_relative */
88 0, /* bitpos */
89 complain_overflow_dont, /* complain_on_overflow */
015551fc 90 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
91 "R_SH_NONE", /* name */
92 false, /* partial_inplace */
93 0, /* src_mask */
94 0, /* dst_mask */
95 false), /* pcrel_offset */
96
97 /* 32 bit absolute relocation. Setting partial_inplace to true and
98 src_mask to a non-zero value is similar to the COFF toolchain. */
99 HOWTO (R_SH_DIR32, /* type */
100 0, /* rightshift */
101 2, /* size (0 = byte, 1 = short, 2 = long) */
102 32, /* bitsize */
103 false, /* pc_relative */
104 0, /* bitpos */
105 complain_overflow_bitfield, /* complain_on_overflow */
106 sh_elf_reloc, /* special_function */
107 "R_SH_DIR32", /* name */
108 true, /* partial_inplace */
109 0xffffffff, /* src_mask */
110 0xffffffff, /* dst_mask */
111 false), /* pcrel_offset */
112
113 /* 32 bit PC relative relocation. */
114 HOWTO (R_SH_REL32, /* type */
115 0, /* rightshift */
116 2, /* size (0 = byte, 1 = short, 2 = long) */
117 32, /* bitsize */
118 true, /* pc_relative */
119 0, /* bitpos */
120 complain_overflow_signed, /* complain_on_overflow */
015551fc 121 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
122 "R_SH_REL32", /* name */
123 false, /* partial_inplace */
124 0, /* src_mask */
125 0xffffffff, /* dst_mask */
126 true), /* pcrel_offset */
127
128 /* 8 bit PC relative branch divided by 2. */
129 HOWTO (R_SH_DIR8WPN, /* type */
130 1, /* rightshift */
131 1, /* size (0 = byte, 1 = short, 2 = long) */
132 8, /* bitsize */
133 true, /* pc_relative */
134 0, /* bitpos */
135 complain_overflow_signed, /* complain_on_overflow */
015551fc 136 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
137 "R_SH_DIR8WPN", /* name */
138 true, /* partial_inplace */
139 0xff, /* src_mask */
140 0xff, /* dst_mask */
141 true), /* pcrel_offset */
142
143 /* 12 bit PC relative branch divided by 2. */
144 HOWTO (R_SH_IND12W, /* type */
145 1, /* rightshift */
146 1, /* size (0 = byte, 1 = short, 2 = long) */
147 12, /* bitsize */
148 true, /* pc_relative */
149 0, /* bitpos */
150 complain_overflow_signed, /* complain_on_overflow */
151 sh_elf_reloc, /* special_function */
152 "R_SH_IND12W", /* name */
153 true, /* partial_inplace */
154 0xfff, /* src_mask */
155 0xfff, /* dst_mask */
156 true), /* pcrel_offset */
157
158 /* 8 bit unsigned PC relative divided by 4. */
159 HOWTO (R_SH_DIR8WPL, /* type */
160 2, /* rightshift */
161 1, /* size (0 = byte, 1 = short, 2 = long) */
162 8, /* bitsize */
163 true, /* pc_relative */
164 0, /* bitpos */
165 complain_overflow_unsigned, /* complain_on_overflow */
015551fc 166 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
167 "R_SH_DIR8WPL", /* name */
168 true, /* partial_inplace */
169 0xff, /* src_mask */
170 0xff, /* dst_mask */
171 true), /* pcrel_offset */
172
173 /* 8 bit unsigned PC relative divided by 2. */
174 HOWTO (R_SH_DIR8WPZ, /* type */
175 1, /* rightshift */
176 1, /* size (0 = byte, 1 = short, 2 = long) */
177 8, /* bitsize */
178 true, /* pc_relative */
179 0, /* bitpos */
180 complain_overflow_unsigned, /* complain_on_overflow */
015551fc 181 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
182 "R_SH_DIR8WPZ", /* name */
183 true, /* partial_inplace */
184 0xff, /* src_mask */
185 0xff, /* dst_mask */
186 true), /* pcrel_offset */
187
188 /* 8 bit GBR relative. FIXME: This only makes sense if we have some
189 special symbol for the GBR relative area, and that is not
190 implemented. */
191 HOWTO (R_SH_DIR8BP, /* type */
192 0, /* rightshift */
193 1, /* size (0 = byte, 1 = short, 2 = long) */
194 8, /* bitsize */
195 false, /* pc_relative */
196 0, /* bitpos */
197 complain_overflow_unsigned, /* complain_on_overflow */
015551fc 198 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
199 "R_SH_DIR8BP", /* name */
200 false, /* partial_inplace */
201 0, /* src_mask */
202 0xff, /* dst_mask */
203 true), /* pcrel_offset */
204
205 /* 8 bit GBR relative divided by 2. FIXME: This only makes sense if
206 we have some special symbol for the GBR relative area, and that
207 is not implemented. */
208 HOWTO (R_SH_DIR8W, /* type */
209 1, /* rightshift */
210 1, /* size (0 = byte, 1 = short, 2 = long) */
211 8, /* bitsize */
212 false, /* pc_relative */
213 0, /* bitpos */
214 complain_overflow_unsigned, /* complain_on_overflow */
015551fc 215 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
216 "R_SH_DIR8W", /* name */
217 false, /* partial_inplace */
218 0, /* src_mask */
219 0xff, /* dst_mask */
220 true), /* pcrel_offset */
221
222 /* 8 bit GBR relative divided by 4. FIXME: This only makes sense if
223 we have some special symbol for the GBR relative area, and that
224 is not implemented. */
225 HOWTO (R_SH_DIR8L, /* type */
226 2, /* rightshift */
227 1, /* size (0 = byte, 1 = short, 2 = long) */
228 8, /* bitsize */
229 false, /* pc_relative */
230 0, /* bitpos */
231 complain_overflow_unsigned, /* complain_on_overflow */
015551fc 232 sh_elf_ignore_reloc, /* special_function */
252b5132
RH
233 "R_SH_DIR8L", /* name */
234 false, /* partial_inplace */
235 0, /* src_mask */
236 0xff, /* dst_mask */
237 true), /* pcrel_offset */
238
06bb75c1
AO
239 EMPTY_HOWTO (10),
240 EMPTY_HOWTO (11),
241 EMPTY_HOWTO (12),
242 EMPTY_HOWTO (13),
243 EMPTY_HOWTO (14),
244 EMPTY_HOWTO (15),
245 EMPTY_HOWTO (16),
246 EMPTY_HOWTO (17),
5f771d47
ILT
247 EMPTY_HOWTO (18),
248 EMPTY_HOWTO (19),
249 EMPTY_HOWTO (20),
250 EMPTY_HOWTO (21),
251 EMPTY_HOWTO (22),
252 EMPTY_HOWTO (23),
253 EMPTY_HOWTO (24),
252b5132
RH
254
255 /* The remaining relocs are a GNU extension used for relaxing. The
256 final pass of the linker never needs to do anything with any of
257 these relocs. Any required operations are handled by the
258 relaxation code. */
259
260 /* A 16 bit switch table entry. This is generated for an expression
261 such as ``.word L1 - L2''. The offset holds the difference
262 between the reloc address and L2. */
263 HOWTO (R_SH_SWITCH16, /* type */
264 0, /* rightshift */
265 1, /* size (0 = byte, 1 = short, 2 = long) */
266 16, /* bitsize */
267 false, /* pc_relative */
268 0, /* bitpos */
269 complain_overflow_unsigned, /* complain_on_overflow */
270 sh_elf_ignore_reloc, /* special_function */
271 "R_SH_SWITCH16", /* name */
272 false, /* partial_inplace */
273 0, /* src_mask */
274 0, /* dst_mask */
275 true), /* pcrel_offset */
276
277 /* A 32 bit switch table entry. This is generated for an expression
278 such as ``.long L1 - L2''. The offset holds the difference
279 between the reloc address and L2. */
280 HOWTO (R_SH_SWITCH32, /* type */
281 0, /* rightshift */
282 2, /* size (0 = byte, 1 = short, 2 = long) */
283 32, /* bitsize */
284 false, /* pc_relative */
285 0, /* bitpos */
286 complain_overflow_unsigned, /* complain_on_overflow */
287 sh_elf_ignore_reloc, /* special_function */
288 "R_SH_SWITCH32", /* name */
289 false, /* partial_inplace */
290 0, /* src_mask */
291 0, /* dst_mask */
292 true), /* pcrel_offset */
293
294 /* Indicates a .uses pseudo-op. The compiler will generate .uses
295 pseudo-ops when it finds a function call which can be relaxed.
296 The offset field holds the PC relative offset to the instruction
297 which loads the register used in the function call. */
298 HOWTO (R_SH_USES, /* type */
299 0, /* rightshift */
300 1, /* size (0 = byte, 1 = short, 2 = long) */
301 0, /* bitsize */
302 false, /* pc_relative */
303 0, /* bitpos */
304 complain_overflow_unsigned, /* complain_on_overflow */
305 sh_elf_ignore_reloc, /* special_function */
306 "R_SH_USES", /* name */
307 false, /* partial_inplace */
308 0, /* src_mask */
309 0, /* dst_mask */
310 true), /* pcrel_offset */
311
312 /* The assembler will generate this reloc for addresses referred to
313 by the register loads associated with USES relocs. The offset
314 field holds the number of times the address is referenced in the
315 object file. */
316 HOWTO (R_SH_COUNT, /* type */
317 0, /* rightshift */
318 1, /* size (0 = byte, 1 = short, 2 = long) */
319 0, /* bitsize */
320 false, /* pc_relative */
321 0, /* bitpos */
322 complain_overflow_unsigned, /* complain_on_overflow */
323 sh_elf_ignore_reloc, /* special_function */
324 "R_SH_COUNT", /* name */
325 false, /* partial_inplace */
326 0, /* src_mask */
327 0, /* dst_mask */
328 true), /* pcrel_offset */
329
330 /* Indicates an alignment statement. The offset field is the power
331 of 2 to which subsequent portions of the object file must be
332 aligned. */
333 HOWTO (R_SH_ALIGN, /* type */
334 0, /* rightshift */
335 1, /* size (0 = byte, 1 = short, 2 = long) */
336 0, /* bitsize */
337 false, /* pc_relative */
338 0, /* bitpos */
339 complain_overflow_unsigned, /* complain_on_overflow */
340 sh_elf_ignore_reloc, /* special_function */
341 "R_SH_ALIGN", /* name */
342 false, /* partial_inplace */
343 0, /* src_mask */
344 0, /* dst_mask */
345 true), /* pcrel_offset */
346
347 /* The assembler will generate this reloc before a block of
348 instructions. A section should be processed as assumining it
349 contains data, unless this reloc is seen. */
350 HOWTO (R_SH_CODE, /* type */
351 0, /* rightshift */
352 1, /* size (0 = byte, 1 = short, 2 = long) */
353 0, /* bitsize */
354 false, /* pc_relative */
355 0, /* bitpos */
356 complain_overflow_unsigned, /* complain_on_overflow */
357 sh_elf_ignore_reloc, /* special_function */
358 "R_SH_CODE", /* name */
359 false, /* partial_inplace */
360 0, /* src_mask */
361 0, /* dst_mask */
362 true), /* pcrel_offset */
363
364 /* The assembler will generate this reloc after a block of
365 instructions when it sees data that is not instructions. */
366 HOWTO (R_SH_DATA, /* type */
367 0, /* rightshift */
368 1, /* size (0 = byte, 1 = short, 2 = long) */
369 0, /* bitsize */
370 false, /* pc_relative */
371 0, /* bitpos */
372 complain_overflow_unsigned, /* complain_on_overflow */
373 sh_elf_ignore_reloc, /* special_function */
374 "R_SH_DATA", /* name */
375 false, /* partial_inplace */
376 0, /* src_mask */
377 0, /* dst_mask */
378 true), /* pcrel_offset */
379
380 /* The assembler generates this reloc for each label within a block
381 of instructions. This permits the linker to avoid swapping
382 instructions which are the targets of branches. */
383 HOWTO (R_SH_LABEL, /* type */
384 0, /* rightshift */
385 1, /* size (0 = byte, 1 = short, 2 = long) */
386 0, /* bitsize */
387 false, /* pc_relative */
388 0, /* bitpos */
389 complain_overflow_unsigned, /* complain_on_overflow */
390 sh_elf_ignore_reloc, /* special_function */
391 "R_SH_LABEL", /* name */
392 false, /* partial_inplace */
393 0, /* src_mask */
394 0, /* dst_mask */
395 true), /* pcrel_offset */
396
397 /* An 8 bit switch table entry. This is generated for an expression
398 such as ``.word L1 - L2''. The offset holds the difference
399 between the reloc address and L2. */
400 HOWTO (R_SH_SWITCH8, /* type */
401 0, /* rightshift */
402 0, /* size (0 = byte, 1 = short, 2 = long) */
403 8, /* bitsize */
404 false, /* pc_relative */
405 0, /* bitpos */
406 complain_overflow_unsigned, /* complain_on_overflow */
407 sh_elf_ignore_reloc, /* special_function */
408 "R_SH_SWITCH8", /* name */
409 false, /* partial_inplace */
410 0, /* src_mask */
411 0, /* dst_mask */
412 true), /* pcrel_offset */
413
414 /* GNU extension to record C++ vtable hierarchy */
415 HOWTO (R_SH_GNU_VTINHERIT, /* type */
416 0, /* rightshift */
417 2, /* size (0 = byte, 1 = short, 2 = long) */
418 0, /* bitsize */
419 false, /* pc_relative */
420 0, /* bitpos */
421 complain_overflow_dont, /* complain_on_overflow */
422 NULL, /* special_function */
423 "R_SH_GNU_VTINHERIT", /* name */
424 false, /* partial_inplace */
425 0, /* src_mask */
426 0, /* dst_mask */
427 false), /* pcrel_offset */
428
429 /* GNU extension to record C++ vtable member usage */
430 HOWTO (R_SH_GNU_VTENTRY, /* type */
431 0, /* rightshift */
432 2, /* size (0 = byte, 1 = short, 2 = long) */
433 0, /* bitsize */
434 false, /* pc_relative */
435 0, /* bitpos */
436 complain_overflow_dont, /* complain_on_overflow */
437 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
438 "R_SH_GNU_VTENTRY", /* name */
439 false, /* partial_inplace */
440 0, /* src_mask */
441 0, /* dst_mask */
442 false), /* pcrel_offset */
443
015551fc
JR
444 /* 8 bit PC relative divided by 2 - but specified in a very odd way. */
445 HOWTO (R_SH_LOOP_START, /* type */
446 1, /* rightshift */
447 1, /* size (0 = byte, 1 = short, 2 = long) */
448 8, /* bitsize */
449 false, /* pc_relative */
450 0, /* bitpos */
451 complain_overflow_signed, /* complain_on_overflow */
452 sh_elf_ignore_reloc, /* special_function */
453 "R_SH_LOOP_START", /* name */
454 true, /* partial_inplace */
455 0xff, /* src_mask */
456 0xff, /* dst_mask */
457 true), /* pcrel_offset */
458
459 /* 8 bit PC relative divided by 2 - but specified in a very odd way. */
460 HOWTO (R_SH_LOOP_END, /* type */
461 1, /* rightshift */
462 1, /* size (0 = byte, 1 = short, 2 = long) */
463 8, /* bitsize */
464 false, /* pc_relative */
465 0, /* bitpos */
466 complain_overflow_signed, /* complain_on_overflow */
467 sh_elf_ignore_reloc, /* special_function */
468 "R_SH_LOOP_END", /* name */
469 true, /* partial_inplace */
470 0xff, /* src_mask */
471 0xff, /* dst_mask */
472 true), /* pcrel_offset */
473
06bb75c1
AO
474 EMPTY_HOWTO (38),
475 EMPTY_HOWTO (39),
476 EMPTY_HOWTO (40),
477 EMPTY_HOWTO (41),
478 EMPTY_HOWTO (42),
479 EMPTY_HOWTO (43),
480 EMPTY_HOWTO (44),
481 EMPTY_HOWTO (45),
482 EMPTY_HOWTO (46),
483 EMPTY_HOWTO (47),
484 EMPTY_HOWTO (48),
485 EMPTY_HOWTO (49),
486 EMPTY_HOWTO (50),
487 EMPTY_HOWTO (51),
488 EMPTY_HOWTO (52),
489 EMPTY_HOWTO (53),
490 EMPTY_HOWTO (54),
491 EMPTY_HOWTO (55),
492 EMPTY_HOWTO (56),
493 EMPTY_HOWTO (57),
494 EMPTY_HOWTO (58),
495 EMPTY_HOWTO (59),
496 EMPTY_HOWTO (60),
497 EMPTY_HOWTO (61),
498 EMPTY_HOWTO (62),
499 EMPTY_HOWTO (63),
500 EMPTY_HOWTO (64),
501 EMPTY_HOWTO (65),
502 EMPTY_HOWTO (66),
503 EMPTY_HOWTO (67),
504 EMPTY_HOWTO (68),
505 EMPTY_HOWTO (69),
506 EMPTY_HOWTO (70),
507 EMPTY_HOWTO (71),
508 EMPTY_HOWTO (72),
509 EMPTY_HOWTO (73),
510 EMPTY_HOWTO (74),
511 EMPTY_HOWTO (75),
512 EMPTY_HOWTO (76),
513 EMPTY_HOWTO (77),
514 EMPTY_HOWTO (78),
515 EMPTY_HOWTO (79),
516 EMPTY_HOWTO (80),
517 EMPTY_HOWTO (81),
518 EMPTY_HOWTO (82),
519 EMPTY_HOWTO (83),
520 EMPTY_HOWTO (84),
521 EMPTY_HOWTO (85),
522 EMPTY_HOWTO (86),
523 EMPTY_HOWTO (87),
524 EMPTY_HOWTO (88),
525 EMPTY_HOWTO (89),
526 EMPTY_HOWTO (90),
527 EMPTY_HOWTO (91),
528 EMPTY_HOWTO (92),
529 EMPTY_HOWTO (93),
530 EMPTY_HOWTO (94),
531 EMPTY_HOWTO (95),
532 EMPTY_HOWTO (96),
533 EMPTY_HOWTO (97),
534 EMPTY_HOWTO (98),
535 EMPTY_HOWTO (99),
536 EMPTY_HOWTO (100),
537 EMPTY_HOWTO (101),
538 EMPTY_HOWTO (102),
539 EMPTY_HOWTO (103),
540 EMPTY_HOWTO (104),
541 EMPTY_HOWTO (105),
542 EMPTY_HOWTO (106),
543 EMPTY_HOWTO (107),
544 EMPTY_HOWTO (108),
545 EMPTY_HOWTO (109),
546 EMPTY_HOWTO (110),
547 EMPTY_HOWTO (111),
548 EMPTY_HOWTO (112),
549 EMPTY_HOWTO (113),
550 EMPTY_HOWTO (114),
551 EMPTY_HOWTO (115),
552 EMPTY_HOWTO (116),
553 EMPTY_HOWTO (117),
554 EMPTY_HOWTO (118),
555 EMPTY_HOWTO (119),
556 EMPTY_HOWTO (120),
557 EMPTY_HOWTO (121),
558 EMPTY_HOWTO (122),
559 EMPTY_HOWTO (123),
560 EMPTY_HOWTO (124),
561 EMPTY_HOWTO (125),
562 EMPTY_HOWTO (126),
563 EMPTY_HOWTO (127),
564 EMPTY_HOWTO (128),
565 EMPTY_HOWTO (129),
566 EMPTY_HOWTO (130),
567 EMPTY_HOWTO (131),
568 EMPTY_HOWTO (132),
569 EMPTY_HOWTO (133),
570 EMPTY_HOWTO (134),
571 EMPTY_HOWTO (135),
572 EMPTY_HOWTO (136),
573 EMPTY_HOWTO (137),
574 EMPTY_HOWTO (138),
575 EMPTY_HOWTO (139),
576 EMPTY_HOWTO (140),
577 EMPTY_HOWTO (141),
578 EMPTY_HOWTO (142),
579 EMPTY_HOWTO (143),
580 EMPTY_HOWTO (144),
581 EMPTY_HOWTO (145),
582 EMPTY_HOWTO (146),
583 EMPTY_HOWTO (147),
584 EMPTY_HOWTO (148),
585 EMPTY_HOWTO (149),
586 EMPTY_HOWTO (150),
587 EMPTY_HOWTO (151),
588 EMPTY_HOWTO (152),
589 EMPTY_HOWTO (153),
590 EMPTY_HOWTO (154),
591 EMPTY_HOWTO (155),
592 EMPTY_HOWTO (156),
593 EMPTY_HOWTO (157),
594 EMPTY_HOWTO (158),
595 EMPTY_HOWTO (159),
596
597 HOWTO (R_SH_GOT32, /* type */
598 0, /* rightshift */
599 2, /* size (0 = byte, 1 = short, 2 = long) */
600 32, /* bitsize */
601 false, /* pc_relative */
602 0, /* bitpos */
603 complain_overflow_bitfield, /* complain_on_overflow */
604 bfd_elf_generic_reloc, /* */
605 "R_SH_GOT32", /* name */
606 true, /* partial_inplace */
607 0xffffffff, /* src_mask */
608 0xffffffff, /* dst_mask */
609 false), /* pcrel_offset */
610
611 HOWTO (R_SH_PLT32, /* type */
612 0, /* rightshift */
613 2, /* size (0 = byte, 1 = short, 2 = long) */
614 32, /* bitsize */
615 true, /* pc_relative */
616 0, /* bitpos */
617 complain_overflow_bitfield, /* complain_on_overflow */
618 bfd_elf_generic_reloc, /* */
619 "R_SH_PLT32", /* name */
620 true, /* partial_inplace */
621 0xffffffff, /* src_mask */
622 0xffffffff, /* dst_mask */
623 true), /* pcrel_offset */
624
625 HOWTO (R_SH_COPY, /* type */
626 0, /* rightshift */
627 2, /* size (0 = byte, 1 = short, 2 = long) */
628 32, /* bitsize */
629 false, /* pc_relative */
630 0, /* bitpos */
631 complain_overflow_bitfield, /* complain_on_overflow */
632 bfd_elf_generic_reloc, /* */
633 "R_SH_COPY", /* name */
634 true, /* partial_inplace */
635 0xffffffff, /* src_mask */
636 0xffffffff, /* dst_mask */
637 false), /* pcrel_offset */
638
639 HOWTO (R_SH_GLOB_DAT, /* type */
640 0, /* rightshift */
641 2, /* size (0 = byte, 1 = short, 2 = long) */
642 32, /* bitsize */
643 false, /* pc_relative */
644 0, /* bitpos */
645 complain_overflow_bitfield, /* complain_on_overflow */
646 bfd_elf_generic_reloc, /* */
647 "R_SH_GLOB_DAT", /* name */
648 true, /* partial_inplace */
649 0xffffffff, /* src_mask */
650 0xffffffff, /* dst_mask */
651 false), /* pcrel_offset */
652
653 HOWTO (R_SH_JMP_SLOT, /* type */
654 0, /* rightshift */
655 2, /* size (0 = byte, 1 = short, 2 = long) */
656 32, /* bitsize */
657 false, /* pc_relative */
658 0, /* bitpos */
659 complain_overflow_bitfield, /* complain_on_overflow */
660 bfd_elf_generic_reloc, /* */
661 "R_SH_JMP_SLOT", /* name */
662 true, /* partial_inplace */
663 0xffffffff, /* src_mask */
664 0xffffffff, /* dst_mask */
665 false), /* pcrel_offset */
666
667 HOWTO (R_SH_RELATIVE, /* type */
668 0, /* rightshift */
669 2, /* size (0 = byte, 1 = short, 2 = long) */
670 32, /* bitsize */
671 false, /* pc_relative */
672 0, /* bitpos */
673 complain_overflow_bitfield, /* complain_on_overflow */
674 bfd_elf_generic_reloc, /* */
675 "R_SH_RELATIVE", /* name */
676 true, /* partial_inplace */
677 0xffffffff, /* src_mask */
678 0xffffffff, /* dst_mask */
679 false), /* pcrel_offset */
680
681 HOWTO (R_SH_GOTOFF, /* type */
682 0, /* rightshift */
683 2, /* size (0 = byte, 1 = short, 2 = long) */
684 32, /* bitsize */
685 false, /* pc_relative */
686 0, /* bitpos */
687 complain_overflow_bitfield, /* complain_on_overflow */
688 bfd_elf_generic_reloc, /* */
689 "R_SH_GOTOFF", /* name */
690 true, /* partial_inplace */
691 0xffffffff, /* src_mask */
692 0xffffffff, /* dst_mask */
693 false), /* pcrel_offset */
694
695 HOWTO (R_SH_GOTPC, /* type */
696 0, /* rightshift */
697 2, /* size (0 = byte, 1 = short, 2 = long) */
698 32, /* bitsize */
699 true, /* pc_relative */
700 0, /* bitpos */
701 complain_overflow_bitfield, /* complain_on_overflow */
702 bfd_elf_generic_reloc, /* */
703 "R_SH_GOTPC", /* name */
704 true, /* partial_inplace */
705 0xffffffff, /* src_mask */
706 0xffffffff, /* dst_mask */
707 true), /* pcrel_offset */
708
252b5132
RH
709};
710
015551fc
JR
711static bfd_reloc_status_type
712sh_elf_reloc_loop (r_type, input_bfd, input_section, contents, addr,
713 symbol_section, start, end)
61ff1804 714 int r_type ATTRIBUTE_UNUSED;
015551fc
JR
715 bfd *input_bfd;
716 asection *input_section;
717 bfd_byte *contents;
718 bfd_vma addr;
719 asection *symbol_section;
720 bfd_vma start, end;
721{
722 static bfd_vma last_addr;
00fdaf47 723 static asection *last_symbol_section;
015551fc
JR
724 bfd_byte *free_contents = NULL;
725 bfd_byte *start_ptr, *ptr, *last_ptr;
726 int diff, cum_diff;
727 bfd_signed_vma x;
728 int insn;
729
730 /* Sanity check the address. */
731 if (addr > input_section->_raw_size)
732 return bfd_reloc_outofrange;
733
734 /* We require the start and end relocations to be processed consecutively -
735 although we allow then to be processed forwards or backwards. */
736 if (! last_addr)
737 {
738 last_addr = addr;
739 last_symbol_section = symbol_section;
740 return bfd_reloc_ok;
741 }
742 if (last_addr != addr)
743 abort ();
744 last_addr = 0;
745
746 if (! symbol_section || last_symbol_section != symbol_section || end < start)
747 return bfd_reloc_outofrange;
748
749 /* Get the symbol_section contents. */
750 if (symbol_section != input_section)
751 {
752 if (elf_section_data (symbol_section)->this_hdr.contents != NULL)
753 contents = elf_section_data (symbol_section)->this_hdr.contents;
754 else
755 {
756 free_contents = contents
757 = (bfd_byte *) bfd_malloc (symbol_section->_raw_size);
758 if (contents == NULL)
759 return bfd_reloc_outofrange;
760 if (! bfd_get_section_contents (input_bfd, symbol_section, contents,
761 (file_ptr) 0,
762 symbol_section->_raw_size))
763 {
764 free (contents);
765 return bfd_reloc_outofrange;
766 }
767 }
768 }
769#define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
770 start_ptr = contents + start;
771 for (cum_diff = -6, ptr = contents + end; cum_diff < 0 && ptr > start_ptr;)
772 {
773 for (last_ptr = ptr, ptr -= 4; ptr >= start_ptr && IS_PPI (ptr);)
774 ptr -= 2;
775 ptr += 2;
61ff1804 776 diff = (last_ptr - ptr) >> 1;
015551fc
JR
777 cum_diff += diff & 1;
778 cum_diff += diff;
779 }
780 /* Calculate the start / end values to load into rs / re minus four -
781 so that will cancel out the four we would otherwise have to add to
782 addr to get the value to subtract in order to get relative addressing. */
783 if (cum_diff >= 0)
784 {
785 start -= 4;
786 end = (ptr + cum_diff * 2) - contents;
787 }
788 else
789 {
790 bfd_vma start0 = start - 4;
791
792 while (start0 >= 0 && IS_PPI (contents + start0))
793 start0 -= 2;
794 start0 = start - 2 - ((start - start0) & 2);
795 start = start0 - cum_diff - 2;
796 end = start0;
797 }
798
799 if (free_contents)
800 free (free_contents);
801
802 insn = bfd_get_16 (input_bfd, contents + addr);
803
804 x = (insn & 0x200 ? end : start) - addr;
805 if (input_section != symbol_section)
806 x += ((symbol_section->output_section->vma + symbol_section->output_offset)
807 - (input_section->output_section->vma
808 + input_section->output_offset));
809 x >>= 1;
810 if (x < -128 || x > 127)
811 return bfd_reloc_overflow;
812
61ff1804 813 x = (insn & ~0xff) | (x & 0xff);
015551fc
JR
814 bfd_put_16 (input_bfd, x, contents + addr);
815
816 return bfd_reloc_ok;
817}
818
819/* This function is used for normal relocs. This used to be like the COFF
252b5132
RH
820 function, and is almost certainly incorrect for other ELF targets. */
821
822static bfd_reloc_status_type
823sh_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
824 error_message)
825 bfd *abfd;
826 arelent *reloc_entry;
827 asymbol *symbol_in;
828 PTR data;
829 asection *input_section;
830 bfd *output_bfd;
5f771d47 831 char **error_message ATTRIBUTE_UNUSED;
252b5132
RH
832{
833 unsigned long insn;
834 bfd_vma sym_value;
835 enum elf_sh_reloc_type r_type;
836 bfd_vma addr = reloc_entry->address;
837 bfd_byte *hit_data = addr + (bfd_byte *) data;
838
839 r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
840
841 if (output_bfd != NULL)
842 {
843 /* Partial linking--do nothing. */
844 reloc_entry->address += input_section->output_offset;
845 return bfd_reloc_ok;
846 }
847
848 /* Almost all relocs have to do with relaxing. If any work must be
849 done for them, it has been done in sh_relax_section. */
015551fc 850 if (r_type == R_SH_IND12W && (symbol_in->flags & BSF_LOCAL) != 0)
252b5132
RH
851 return bfd_reloc_ok;
852
853 if (symbol_in != NULL
854 && bfd_is_und_section (symbol_in->section))
855 return bfd_reloc_undefined;
856
857 if (bfd_is_com_section (symbol_in->section))
858 sym_value = 0;
859 else
860 sym_value = (symbol_in->value +
861 symbol_in->section->output_section->vma +
862 symbol_in->section->output_offset);
863
864 switch (r_type)
865 {
866 case R_SH_DIR32:
867 insn = bfd_get_32 (abfd, hit_data);
868 insn += sym_value + reloc_entry->addend;
869 bfd_put_32 (abfd, insn, hit_data);
870 break;
871 case R_SH_IND12W:
872 insn = bfd_get_16 (abfd, hit_data);
873 sym_value += reloc_entry->addend;
874 sym_value -= (input_section->output_section->vma
875 + input_section->output_offset
876 + addr
877 + 4);
878 sym_value += (insn & 0xfff) << 1;
879 if (insn & 0x800)
880 sym_value -= 0x1000;
881 insn = (insn & 0xf000) | (sym_value & 0xfff);
882 bfd_put_16 (abfd, insn, hit_data);
883 if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
884 return bfd_reloc_overflow;
885 break;
886 default:
887 abort ();
888 break;
889 }
890
891 return bfd_reloc_ok;
892}
893
894/* This function is used for relocs which are only used for relaxing,
895 which the linker should otherwise ignore. */
896
897static bfd_reloc_status_type
898sh_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
899 output_bfd, error_message)
5f771d47 900 bfd *abfd ATTRIBUTE_UNUSED;
252b5132 901 arelent *reloc_entry;
5f771d47
ILT
902 asymbol *symbol ATTRIBUTE_UNUSED;
903 PTR data ATTRIBUTE_UNUSED;
252b5132
RH
904 asection *input_section;
905 bfd *output_bfd;
5f771d47 906 char **error_message ATTRIBUTE_UNUSED;
252b5132
RH
907{
908 if (output_bfd != NULL)
909 reloc_entry->address += input_section->output_offset;
910 return bfd_reloc_ok;
911}
912
913/* This structure is used to map BFD reloc codes to SH ELF relocs. */
914
915struct elf_reloc_map
916{
917 bfd_reloc_code_real_type bfd_reloc_val;
918 unsigned char elf_reloc_val;
919};
920
921/* An array mapping BFD reloc codes to SH ELF relocs. */
922
923static const struct elf_reloc_map sh_reloc_map[] =
924{
925 { BFD_RELOC_NONE, R_SH_NONE },
926 { BFD_RELOC_32, R_SH_DIR32 },
927 { BFD_RELOC_CTOR, R_SH_DIR32 },
928 { BFD_RELOC_32_PCREL, R_SH_REL32 },
929 { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
930 { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
931 { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
932 { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
933 { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
934 { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
935 { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
936 { BFD_RELOC_SH_USES, R_SH_USES },
937 { BFD_RELOC_SH_COUNT, R_SH_COUNT },
938 { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
939 { BFD_RELOC_SH_CODE, R_SH_CODE },
940 { BFD_RELOC_SH_DATA, R_SH_DATA },
941 { BFD_RELOC_SH_LABEL, R_SH_LABEL },
942 { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
943 { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
015551fc
JR
944 { BFD_RELOC_SH_LOOP_START, R_SH_LOOP_START },
945 { BFD_RELOC_SH_LOOP_END, R_SH_LOOP_END },
37c644f2
AO
946 { BFD_RELOC_32_GOT_PCREL, R_SH_GOT32 },
947 { BFD_RELOC_32_PLT_PCREL, R_SH_PLT32 },
948 { BFD_RELOC_SH_COPY, R_SH_COPY },
949 { BFD_RELOC_SH_GLOB_DAT, R_SH_GLOB_DAT },
950 { BFD_RELOC_SH_JMP_SLOT, R_SH_JMP_SLOT },
951 { BFD_RELOC_SH_RELATIVE, R_SH_RELATIVE },
952 { BFD_RELOC_32_GOTOFF, R_SH_GOTOFF },
953 { BFD_RELOC_SH_GOTPC, R_SH_GOTPC },
252b5132
RH
954};
955
956/* Given a BFD reloc code, return the howto structure for the
957 corresponding SH ELf reloc. */
958
959static reloc_howto_type *
960sh_elf_reloc_type_lookup (abfd, code)
5f771d47 961 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
962 bfd_reloc_code_real_type code;
963{
964 unsigned int i;
965
966 for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
967 {
968 if (sh_reloc_map[i].bfd_reloc_val == code)
969 return &sh_elf_howto_table[(int) sh_reloc_map[i].elf_reloc_val];
970 }
971
972 return NULL;
973}
974
975/* Given an ELF reloc, fill in the howto field of a relent. */
976
977static void
978sh_elf_info_to_howto (abfd, cache_ptr, dst)
5f771d47 979 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
980 arelent *cache_ptr;
981 Elf_Internal_Rela *dst;
982{
983 unsigned int r;
984
985 r = ELF32_R_TYPE (dst->r_info);
986
987 BFD_ASSERT (r < (unsigned int) R_SH_max);
988 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
06bb75c1 989 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2);
252b5132
RH
990
991 cache_ptr->howto = &sh_elf_howto_table[r];
992}
993\f
994/* This function handles relaxing for SH ELF. See the corresponding
995 function in coff-sh.c for a description of what this does. FIXME:
996 There is a lot of duplication here between this code and the COFF
997 specific code. The format of relocs and symbols is wound deeply
998 into this code, but it would still be better if the duplication
999 could be eliminated somehow. Note in particular that although both
1000 functions use symbols like R_SH_CODE, those symbols have different
1001 values; in coff-sh.c they come from include/coff/sh.h, whereas here
1002 they come from enum elf_sh_reloc_type in include/elf/sh.h. */
1003
1004static boolean
1005sh_elf_relax_section (abfd, sec, link_info, again)
1006 bfd *abfd;
1007 asection *sec;
1008 struct bfd_link_info *link_info;
1009 boolean *again;
1010{
1011 Elf_Internal_Shdr *symtab_hdr;
1012 Elf_Internal_Rela *internal_relocs;
1013 Elf_Internal_Rela *free_relocs = NULL;
1014 boolean have_code;
1015 Elf_Internal_Rela *irel, *irelend;
1016 bfd_byte *contents = NULL;
1017 bfd_byte *free_contents = NULL;
1018 Elf32_External_Sym *extsyms = NULL;
1019 Elf32_External_Sym *free_extsyms = NULL;
1020
1021 *again = false;
1022
1023 if (link_info->relocateable
1024 || (sec->flags & SEC_RELOC) == 0
1025 || sec->reloc_count == 0)
1026 return true;
1027
1028 /* If this is the first time we have been called for this section,
1029 initialize the cooked size. */
1030 if (sec->_cooked_size == 0)
1031 sec->_cooked_size = sec->_raw_size;
1032
1033 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1034
1035 internal_relocs = (_bfd_elf32_link_read_relocs
1036 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1037 link_info->keep_memory));
1038 if (internal_relocs == NULL)
1039 goto error_return;
1040 if (! link_info->keep_memory)
1041 free_relocs = internal_relocs;
1042
1043 have_code = false;
1044
1045 irelend = internal_relocs + sec->reloc_count;
1046 for (irel = internal_relocs; irel < irelend; irel++)
1047 {
1048 bfd_vma laddr, paddr, symval;
1049 unsigned short insn;
1050 Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
1051 bfd_signed_vma foff;
1052
1053 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
1054 have_code = true;
1055
1056 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
1057 continue;
1058
1059 /* Get the section contents. */
1060 if (contents == NULL)
1061 {
1062 if (elf_section_data (sec)->this_hdr.contents != NULL)
1063 contents = elf_section_data (sec)->this_hdr.contents;
1064 else
1065 {
1066 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1067 if (contents == NULL)
1068 goto error_return;
1069 free_contents = contents;
1070
1071 if (! bfd_get_section_contents (abfd, sec, contents,
1072 (file_ptr) 0, sec->_raw_size))
1073 goto error_return;
1074 }
1075 }
1076
1077 /* The r_addend field of the R_SH_USES reloc will point us to
1078 the register load. The 4 is because the r_addend field is
1079 computed as though it were a jump offset, which are based
1080 from 4 bytes after the jump instruction. */
1081 laddr = irel->r_offset + 4 + irel->r_addend;
1082 if (laddr >= sec->_raw_size)
1083 {
1084 (*_bfd_error_handler) (_("%s: 0x%lx: warning: bad R_SH_USES offset"),
1085 bfd_get_filename (abfd),
1086 (unsigned long) irel->r_offset);
1087 continue;
1088 }
1089 insn = bfd_get_16 (abfd, contents + laddr);
1090
1091 /* If the instruction is not mov.l NN,rN, we don't know what to
1092 do. */
1093 if ((insn & 0xf000) != 0xd000)
1094 {
1095 ((*_bfd_error_handler)
1096 (_("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
1097 bfd_get_filename (abfd), (unsigned long) irel->r_offset, insn));
1098 continue;
1099 }
1100
1101 /* Get the address from which the register is being loaded. The
1102 displacement in the mov.l instruction is quadrupled. It is a
1103 displacement from four bytes after the movl instruction, but,
1104 before adding in the PC address, two least significant bits
1105 of the PC are cleared. We assume that the section is aligned
1106 on a four byte boundary. */
1107 paddr = insn & 0xff;
1108 paddr *= 4;
1109 paddr += (laddr + 4) &~ 3;
1110 if (paddr >= sec->_raw_size)
1111 {
1112 ((*_bfd_error_handler)
1113 (_("%s: 0x%lx: warning: bad R_SH_USES load offset"),
1114 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1115 continue;
1116 }
1117
1118 /* Get the reloc for the address from which the register is
1119 being loaded. This reloc will tell us which function is
1120 actually being called. */
1121 for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
1122 if (irelfn->r_offset == paddr
1123 && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
1124 break;
1125 if (irelfn >= irelend)
1126 {
1127 ((*_bfd_error_handler)
1128 (_("%s: 0x%lx: warning: could not find expected reloc"),
1129 bfd_get_filename (abfd), (unsigned long) paddr));
1130 continue;
1131 }
1132
1133 /* Read this BFD's symbols if we haven't done so already. */
1134 if (extsyms == NULL)
1135 {
1136 if (symtab_hdr->contents != NULL)
1137 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1138 else
1139 {
1140 extsyms = ((Elf32_External_Sym *)
1141 bfd_malloc (symtab_hdr->sh_size));
1142 if (extsyms == NULL)
1143 goto error_return;
1144 free_extsyms = extsyms;
1145 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1146 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
1147 != symtab_hdr->sh_size))
1148 goto error_return;
1149 }
1150 }
1151
1152 /* Get the value of the symbol referred to by the reloc. */
1153 if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
1154 {
1155 Elf_Internal_Sym isym;
1156
1157 /* A local symbol. */
1158 bfd_elf32_swap_symbol_in (abfd,
1159 extsyms + ELF32_R_SYM (irelfn->r_info),
1160 &isym);
1161
1162 if (isym.st_shndx != _bfd_elf_section_from_bfd_section (abfd, sec))
1163 {
1164 ((*_bfd_error_handler)
1165 (_("%s: 0x%lx: warning: symbol in unexpected section"),
1166 bfd_get_filename (abfd), (unsigned long) paddr));
1167 continue;
1168 }
1169
1170 symval = (isym.st_value
1171 + sec->output_section->vma
1172 + sec->output_offset);
1173 }
1174 else
1175 {
1176 unsigned long indx;
1177 struct elf_link_hash_entry *h;
1178
1179 indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
1180 h = elf_sym_hashes (abfd)[indx];
1181 BFD_ASSERT (h != NULL);
1182 if (h->root.type != bfd_link_hash_defined
1183 && h->root.type != bfd_link_hash_defweak)
1184 {
1185 /* This appears to be a reference to an undefined
1186 symbol. Just ignore it--it will be caught by the
1187 regular reloc processing. */
1188 continue;
1189 }
1190
1191 symval = (h->root.u.def.value
1192 + h->root.u.def.section->output_section->vma
1193 + h->root.u.def.section->output_offset);
1194 }
1195
1196 symval += bfd_get_32 (abfd, contents + paddr);
1197
1198 /* See if this function call can be shortened. */
1199 foff = (symval
1200 - (irel->r_offset
1201 + sec->output_section->vma
1202 + sec->output_offset
1203 + 4));
1204 if (foff < -0x1000 || foff >= 0x1000)
1205 {
1206 /* After all that work, we can't shorten this function call. */
1207 continue;
1208 }
1209
1210 /* Shorten the function call. */
1211
1212 /* For simplicity of coding, we are going to modify the section
1213 contents, the section relocs, and the BFD symbol table. We
1214 must tell the rest of the code not to free up this
1215 information. It would be possible to instead create a table
1216 of changes which have to be made, as is done in coff-mips.c;
1217 that would be more work, but would require less memory when
1218 the linker is run. */
1219
1220 elf_section_data (sec)->relocs = internal_relocs;
1221 free_relocs = NULL;
1222
1223 elf_section_data (sec)->this_hdr.contents = contents;
1224 free_contents = NULL;
1225
1226 symtab_hdr->contents = (bfd_byte *) extsyms;
1227 free_extsyms = NULL;
1228
1229 /* Replace the jsr with a bsr. */
1230
1231 /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
1232 replace the jsr with a bsr. */
1233 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
1234 if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
1235 {
1236 /* If this needs to be changed because of future relaxing,
1237 it will be handled here like other internal IND12W
1238 relocs. */
1239 bfd_put_16 (abfd,
1240 0xb000 | ((foff >> 1) & 0xfff),
1241 contents + irel->r_offset);
1242 }
1243 else
1244 {
1245 /* We can't fully resolve this yet, because the external
1246 symbol value may be changed by future relaxing. We let
1247 the final link phase handle it. */
1248 bfd_put_16 (abfd, 0xb000, contents + irel->r_offset);
1249 }
1250
1251 /* See if there is another R_SH_USES reloc referring to the same
1252 register load. */
1253 for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
1254 if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
1255 && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
1256 break;
1257 if (irelscan < irelend)
1258 {
1259 /* Some other function call depends upon this register load,
1260 and we have not yet converted that function call.
1261 Indeed, we may never be able to convert it. There is
1262 nothing else we can do at this point. */
1263 continue;
1264 }
1265
1266 /* Look for a R_SH_COUNT reloc on the location where the
1267 function address is stored. Do this before deleting any
1268 bytes, to avoid confusion about the address. */
1269 for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
1270 if (irelcount->r_offset == paddr
1271 && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
1272 break;
1273
1274 /* Delete the register load. */
1275 if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
1276 goto error_return;
1277
1278 /* That will change things, so, just in case it permits some
1279 other function call to come within range, we should relax
1280 again. Note that this is not required, and it may be slow. */
1281 *again = true;
1282
1283 /* Now check whether we got a COUNT reloc. */
1284 if (irelcount >= irelend)
1285 {
1286 ((*_bfd_error_handler)
1287 (_("%s: 0x%lx: warning: could not find expected COUNT reloc"),
1288 bfd_get_filename (abfd), (unsigned long) paddr));
1289 continue;
1290 }
1291
1292 /* The number of uses is stored in the r_addend field. We've
1293 just deleted one. */
1294 if (irelcount->r_addend == 0)
1295 {
1296 ((*_bfd_error_handler) (_("%s: 0x%lx: warning: bad count"),
1297 bfd_get_filename (abfd),
1298 (unsigned long) paddr));
1299 continue;
1300 }
1301
1302 --irelcount->r_addend;
1303
1304 /* If there are no more uses, we can delete the address. Reload
1305 the address from irelfn, in case it was changed by the
1306 previous call to sh_elf_relax_delete_bytes. */
1307 if (irelcount->r_addend == 0)
1308 {
1309 if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
1310 goto error_return;
1311 }
1312
1313 /* We've done all we can with that function call. */
1314 }
1315
1316 /* Look for load and store instructions that we can align on four
1317 byte boundaries. */
1318 if (have_code)
1319 {
1320 boolean swapped;
1321
1322 /* Get the section contents. */
1323 if (contents == NULL)
1324 {
1325 if (elf_section_data (sec)->this_hdr.contents != NULL)
1326 contents = elf_section_data (sec)->this_hdr.contents;
1327 else
1328 {
1329 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1330 if (contents == NULL)
1331 goto error_return;
1332 free_contents = contents;
1333
1334 if (! bfd_get_section_contents (abfd, sec, contents,
1335 (file_ptr) 0, sec->_raw_size))
1336 goto error_return;
1337 }
1338 }
1339
1340 if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
1341 &swapped))
1342 goto error_return;
1343
1344 if (swapped)
1345 {
1346 elf_section_data (sec)->relocs = internal_relocs;
1347 free_relocs = NULL;
1348
1349 elf_section_data (sec)->this_hdr.contents = contents;
1350 free_contents = NULL;
1351
1352 symtab_hdr->contents = (bfd_byte *) extsyms;
1353 free_extsyms = NULL;
1354 }
1355 }
1356
1357 if (free_relocs != NULL)
1358 {
1359 free (free_relocs);
1360 free_relocs = NULL;
1361 }
1362
1363 if (free_contents != NULL)
1364 {
1365 if (! link_info->keep_memory)
1366 free (free_contents);
1367 else
1368 {
1369 /* Cache the section contents for elf_link_input_bfd. */
1370 elf_section_data (sec)->this_hdr.contents = contents;
1371 }
1372 free_contents = NULL;
1373 }
1374
1375 if (free_extsyms != NULL)
1376 {
1377 if (! link_info->keep_memory)
1378 free (free_extsyms);
1379 else
1380 {
1381 /* Cache the symbols for elf_link_input_bfd. */
1382 symtab_hdr->contents = extsyms;
1383 }
1384 free_extsyms = NULL;
1385 }
1386
1387 return true;
1388
1389 error_return:
1390 if (free_relocs != NULL)
1391 free (free_relocs);
1392 if (free_contents != NULL)
1393 free (free_contents);
1394 if (free_extsyms != NULL)
1395 free (free_extsyms);
1396 return false;
1397}
1398
1399/* Delete some bytes from a section while relaxing. FIXME: There is a
1400 lot of duplication between this function and sh_relax_delete_bytes
1401 in coff-sh.c. */
1402
1403static boolean
1404sh_elf_relax_delete_bytes (abfd, sec, addr, count)
1405 bfd *abfd;
1406 asection *sec;
1407 bfd_vma addr;
1408 int count;
1409{
1410 Elf_Internal_Shdr *symtab_hdr;
1411 Elf32_External_Sym *extsyms;
1412 int shndx, index;
1413 bfd_byte *contents;
1414 Elf_Internal_Rela *irel, *irelend;
1415 Elf_Internal_Rela *irelalign;
1416 bfd_vma toaddr;
1417 Elf32_External_Sym *esym, *esymend;
1418 struct elf_link_hash_entry *sym_hash;
1419 asection *o;
1420
1421 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1422 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1423
1424 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1425
1426 contents = elf_section_data (sec)->this_hdr.contents;
1427
1428 /* The deletion must stop at the next ALIGN reloc for an aligment
1429 power larger than the number of bytes we are deleting. */
1430
1431 irelalign = NULL;
1432 toaddr = sec->_cooked_size;
1433
1434 irel = elf_section_data (sec)->relocs;
1435 irelend = irel + sec->reloc_count;
1436 for (; irel < irelend; irel++)
1437 {
1438 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1439 && irel->r_offset > addr
1440 && count < (1 << irel->r_addend))
1441 {
1442 irelalign = irel;
1443 toaddr = irel->r_offset;
1444 break;
1445 }
1446 }
1447
1448 /* Actually delete the bytes. */
1449 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1450 if (irelalign == NULL)
1451 sec->_cooked_size -= count;
1452 else
1453 {
1454 int i;
1455
1456#define NOP_OPCODE (0x0009)
1457
1458 BFD_ASSERT ((count & 1) == 0);
1459 for (i = 0; i < count; i += 2)
1460 bfd_put_16 (abfd, NOP_OPCODE, contents + toaddr - count + i);
1461 }
1462
1463 /* Adjust all the relocs. */
1464 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1465 {
1466 bfd_vma nraddr, stop;
1467 bfd_vma start = 0;
1468 int insn = 0;
1469 Elf_Internal_Sym sym;
1470 int off, adjust, oinsn;
1471 bfd_signed_vma voff = 0;
1472 boolean overflow;
1473
1474 /* Get the new reloc address. */
1475 nraddr = irel->r_offset;
1476 if ((irel->r_offset > addr
1477 && irel->r_offset < toaddr)
1478 || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1479 && irel->r_offset == toaddr))
1480 nraddr -= count;
1481
1482 /* See if this reloc was for the bytes we have deleted, in which
1483 case we no longer care about it. Don't delete relocs which
1484 represent addresses, though. */
1485 if (irel->r_offset >= addr
1486 && irel->r_offset < addr + count
1487 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
1488 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
1489 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
1490 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
1491 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1492 (int) R_SH_NONE);
1493
1494 /* If this is a PC relative reloc, see if the range it covers
1495 includes the bytes we have deleted. */
1496 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1497 {
1498 default:
1499 break;
1500
1501 case R_SH_DIR8WPN:
1502 case R_SH_IND12W:
1503 case R_SH_DIR8WPZ:
1504 case R_SH_DIR8WPL:
1505 start = irel->r_offset;
1506 insn = bfd_get_16 (abfd, contents + nraddr);
1507 break;
1508 }
1509
1510 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1511 {
1512 default:
1513 start = stop = addr;
1514 break;
1515
1516 case R_SH_DIR32:
1517 /* If this reloc is against a symbol defined in this
1518 section, and the symbol will not be adjusted below, we
1519 must check the addend to see it will put the value in
1520 range to be adjusted, and hence must be changed. */
1521 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1522 {
1523 bfd_elf32_swap_symbol_in (abfd,
1524 extsyms + ELF32_R_SYM (irel->r_info),
1525 &sym);
1526 if (sym.st_shndx == shndx
1527 && (sym.st_value <= addr
1528 || sym.st_value >= toaddr))
1529 {
1530 bfd_vma val;
1531
1532 val = bfd_get_32 (abfd, contents + nraddr);
1533 val += sym.st_value;
1534 if (val > addr && val < toaddr)
1535 bfd_put_32 (abfd, val - count, contents + nraddr);
1536 }
1537 }
1538 start = stop = addr;
1539 break;
1540
1541 case R_SH_DIR8WPN:
1542 off = insn & 0xff;
1543 if (off & 0x80)
1544 off -= 0x100;
1545 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1546 break;
1547
1548 case R_SH_IND12W:
1549 if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
1550 start = stop = addr;
1551 else
1552 {
1553 off = insn & 0xfff;
1554 if (off & 0x800)
1555 off -= 0x1000;
1556 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1557 }
1558 break;
1559
1560 case R_SH_DIR8WPZ:
1561 off = insn & 0xff;
1562 stop = start + 4 + off * 2;
1563 break;
1564
1565 case R_SH_DIR8WPL:
1566 off = insn & 0xff;
1567 stop = (start &~ (bfd_vma) 3) + 4 + off * 4;
1568 break;
1569
1570 case R_SH_SWITCH8:
1571 case R_SH_SWITCH16:
1572 case R_SH_SWITCH32:
1573 /* These relocs types represent
1574 .word L2-L1
06e1ba78 1575 The r_addend field holds the difference between the reloc
252b5132
RH
1576 address and L1. That is the start of the reloc, and
1577 adding in the contents gives us the top. We must adjust
06e1ba78
JR
1578 both the r_offset field and the section contents.
1579 N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
1580 and the elf bfd r_offset is called r_vaddr. */
252b5132 1581
06e1ba78
JR
1582 stop = irel->r_offset;
1583 start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
252b5132
RH
1584
1585 if (start > addr
1586 && start < toaddr
1587 && (stop <= addr || stop >= toaddr))
1588 irel->r_addend += count;
1589 else if (stop > addr
1590 && stop < toaddr
1591 && (start <= addr || start >= toaddr))
1592 irel->r_addend -= count;
1593
252b5132
RH
1594 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
1595 voff = bfd_get_signed_16 (abfd, contents + nraddr);
1596 else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
1597 voff = bfd_get_8 (abfd, contents + nraddr);
1598 else
1599 voff = bfd_get_signed_32 (abfd, contents + nraddr);
1600 stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1601
1602 break;
1603
1604 case R_SH_USES:
1605 start = irel->r_offset;
1606 stop = (bfd_vma) ((bfd_signed_vma) start
1607 + (long) irel->r_addend
1608 + 4);
1609 break;
1610 }
1611
1612 if (start > addr
1613 && start < toaddr
1614 && (stop <= addr || stop >= toaddr))
1615 adjust = count;
1616 else if (stop > addr
1617 && stop < toaddr
1618 && (start <= addr || start >= toaddr))
1619 adjust = - count;
1620 else
1621 adjust = 0;
1622
1623 if (adjust != 0)
1624 {
1625 oinsn = insn;
1626 overflow = false;
1627 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1628 {
1629 default:
1630 abort ();
1631 break;
1632
1633 case R_SH_DIR8WPN:
1634 case R_SH_DIR8WPZ:
1635 insn += adjust / 2;
1636 if ((oinsn & 0xff00) != (insn & 0xff00))
1637 overflow = true;
1638 bfd_put_16 (abfd, insn, contents + nraddr);
1639 break;
1640
1641 case R_SH_IND12W:
1642 insn += adjust / 2;
1643 if ((oinsn & 0xf000) != (insn & 0xf000))
1644 overflow = true;
1645 bfd_put_16 (abfd, insn, contents + nraddr);
1646 break;
1647
1648 case R_SH_DIR8WPL:
1649 BFD_ASSERT (adjust == count || count >= 4);
1650 if (count >= 4)
1651 insn += adjust / 4;
1652 else
1653 {
1654 if ((irel->r_offset & 3) == 0)
1655 ++insn;
1656 }
1657 if ((oinsn & 0xff00) != (insn & 0xff00))
1658 overflow = true;
1659 bfd_put_16 (abfd, insn, contents + nraddr);
1660 break;
1661
851cde10
JR
1662 case R_SH_SWITCH8:
1663 voff += adjust;
1664 if (voff < 0 || voff >= 0xff)
1665 overflow = true;
1666 bfd_put_8 (abfd, voff, contents + nraddr);
1667 break;
1668
252b5132
RH
1669 case R_SH_SWITCH16:
1670 voff += adjust;
1671 if (voff < - 0x8000 || voff >= 0x8000)
1672 overflow = true;
1673 bfd_put_signed_16 (abfd, voff, contents + nraddr);
1674 break;
1675
1676 case R_SH_SWITCH32:
1677 voff += adjust;
1678 bfd_put_signed_32 (abfd, voff, contents + nraddr);
1679 break;
1680
1681 case R_SH_USES:
1682 irel->r_addend += adjust;
1683 break;
1684 }
1685
1686 if (overflow)
1687 {
1688 ((*_bfd_error_handler)
1689 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1690 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1691 bfd_set_error (bfd_error_bad_value);
1692 return false;
1693 }
1694 }
1695
1696 irel->r_offset = nraddr;
1697 }
1698
1699 /* Look through all the other sections. If there contain any IMM32
1700 relocs against internal symbols which we are not going to adjust
1701 below, we may need to adjust the addends. */
1702 for (o = abfd->sections; o != NULL; o = o->next)
1703 {
1704 Elf_Internal_Rela *internal_relocs;
1705 Elf_Internal_Rela *irelscan, *irelscanend;
1706 bfd_byte *ocontents;
1707
1708 if (o == sec
1709 || (o->flags & SEC_RELOC) == 0
1710 || o->reloc_count == 0)
1711 continue;
1712
1713 /* We always cache the relocs. Perhaps, if info->keep_memory is
1714 false, we should free them, if we are permitted to, when we
1715 leave sh_coff_relax_section. */
1716 internal_relocs = (_bfd_elf32_link_read_relocs
1717 (abfd, o, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1718 true));
1719 if (internal_relocs == NULL)
1720 return false;
1721
1722 ocontents = NULL;
1723 irelscanend = internal_relocs + o->reloc_count;
1724 for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
1725 {
1726 Elf_Internal_Sym sym;
1727
084aa3aa
JR
1728 /* Dwarf line numbers use R_SH_SWITCH32 relocs. */
1729 if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32)
1730 {
1731 bfd_vma start, stop;
1732 bfd_signed_vma voff;
1733
1734 if (ocontents == NULL)
1735 {
1736 if (elf_section_data (o)->this_hdr.contents != NULL)
1737 ocontents = elf_section_data (o)->this_hdr.contents;
1738 else
1739 {
1740 /* We always cache the section contents.
1741 Perhaps, if info->keep_memory is false, we
1742 should free them, if we are permitted to,
1743 when we leave sh_coff_relax_section. */
1744 ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1745 if (ocontents == NULL)
1746 return false;
1747 if (! bfd_get_section_contents (abfd, o, ocontents,
1748 (file_ptr) 0,
1749 o->_raw_size))
1750 return false;
1751 elf_section_data (o)->this_hdr.contents = ocontents;
1752 }
1753 }
1754
1755 stop = irelscan->r_offset;
1756 start
1757 = (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend);
1758
1759 /* STOP is in a different section, so it won't change. */
1760 if (start > addr && start < toaddr)
1761 irelscan->r_addend += count;
1762
1763 voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset);
1764 stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1765
1766 if (start > addr
1767 && start < toaddr
1768 && (stop <= addr || stop >= toaddr))
1769 bfd_put_signed_32 (abfd, voff + count,
1770 ocontents + irelscan->r_offset);
1771 else if (stop > addr
1772 && stop < toaddr
1773 && (start <= addr || start >= toaddr))
1774 bfd_put_signed_32 (abfd, voff - count,
1775 ocontents + irelscan->r_offset);
1776 }
1777
252b5132
RH
1778 if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
1779 continue;
1780
1781 if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
1782 continue;
1783
1784 bfd_elf32_swap_symbol_in (abfd,
1785 extsyms + ELF32_R_SYM (irelscan->r_info),
1786 &sym);
1787
1788 if (sym.st_shndx == shndx
1789 && (sym.st_value <= addr
1790 || sym.st_value >= toaddr))
1791 {
1792 bfd_vma val;
1793
1794 if (ocontents == NULL)
1795 {
1796 if (elf_section_data (o)->this_hdr.contents != NULL)
1797 ocontents = elf_section_data (o)->this_hdr.contents;
1798 else
1799 {
1800 /* We always cache the section contents.
1801 Perhaps, if info->keep_memory is false, we
1802 should free them, if we are permitted to,
1803 when we leave sh_coff_relax_section. */
1804 ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1805 if (ocontents == NULL)
1806 return false;
1807 if (! bfd_get_section_contents (abfd, o, ocontents,
1808 (file_ptr) 0,
1809 o->_raw_size))
1810 return false;
1811 elf_section_data (o)->this_hdr.contents = ocontents;
1812 }
1813 }
1814
1815 val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
1816 val += sym.st_value;
1817 if (val > addr && val < toaddr)
1818 bfd_put_32 (abfd, val - count,
1819 ocontents + irelscan->r_offset);
1820 }
1821 }
1822 }
1823
1824 /* Adjust the local symbols defined in this section. */
1825 esym = extsyms;
1826 esymend = esym + symtab_hdr->sh_info;
1827 for (; esym < esymend; esym++)
1828 {
1829 Elf_Internal_Sym isym;
1830
1831 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1832
1833 if (isym.st_shndx == shndx
1834 && isym.st_value > addr
1835 && isym.st_value < toaddr)
1836 {
1837 isym.st_value -= count;
1838 bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1839 }
1840 }
1841
1842 /* Now adjust the global symbols defined in this section. */
1843 esym = extsyms + symtab_hdr->sh_info;
1844 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1845 for (index = 0; esym < esymend; esym++, index++)
1846 {
1847 Elf_Internal_Sym isym;
1848
1849 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1850 sym_hash = elf_sym_hashes (abfd)[index];
1851 if (isym.st_shndx == shndx
1852 && ((sym_hash)->root.type == bfd_link_hash_defined
1853 || (sym_hash)->root.type == bfd_link_hash_defweak)
1854 && (sym_hash)->root.u.def.section == sec
1855 && (sym_hash)->root.u.def.value > addr
1856 && (sym_hash)->root.u.def.value < toaddr)
1857 {
1858 (sym_hash)->root.u.def.value -= count;
1859 }
1860 }
1861
1862 /* See if we can move the ALIGN reloc forward. We have adjusted
1863 r_offset for it already. */
1864 if (irelalign != NULL)
1865 {
1866 bfd_vma alignto, alignaddr;
1867
1868 alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
1869 alignaddr = BFD_ALIGN (irelalign->r_offset,
1870 1 << irelalign->r_addend);
1871 if (alignto != alignaddr)
1872 {
1873 /* Tail recursion. */
1874 return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
1875 alignto - alignaddr);
1876 }
1877 }
1878
1879 return true;
1880}
1881
1882/* Look for loads and stores which we can align to four byte
1883 boundaries. This is like sh_align_loads in coff-sh.c. */
1884
1885static boolean
1886sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped)
1887 bfd *abfd;
1888 asection *sec;
1889 Elf_Internal_Rela *internal_relocs;
1890 bfd_byte *contents;
1891 boolean *pswapped;
1892{
1893 Elf_Internal_Rela *irel, *irelend;
1894 bfd_vma *labels = NULL;
1895 bfd_vma *label, *label_end;
1896
1897 *pswapped = false;
1898
1899 irelend = internal_relocs + sec->reloc_count;
1900
1901 /* Get all the addresses with labels on them. */
1902 labels = (bfd_vma *) bfd_malloc (sec->reloc_count * sizeof (bfd_vma));
1903 if (labels == NULL)
1904 goto error_return;
1905 label_end = labels;
1906 for (irel = internal_relocs; irel < irelend; irel++)
1907 {
1908 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
1909 {
1910 *label_end = irel->r_offset;
1911 ++label_end;
1912 }
1913 }
1914
1915 /* Note that the assembler currently always outputs relocs in
1916 address order. If that ever changes, this code will need to sort
1917 the label values and the relocs. */
1918
1919 label = labels;
1920
1921 for (irel = internal_relocs; irel < irelend; irel++)
1922 {
1923 bfd_vma start, stop;
1924
1925 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
1926 continue;
1927
1928 start = irel->r_offset;
1929
1930 for (irel++; irel < irelend; irel++)
1931 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
1932 break;
1933 if (irel < irelend)
1934 stop = irel->r_offset;
1935 else
1936 stop = sec->_cooked_size;
1937
1938 if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
1939 (PTR) internal_relocs, &label,
1940 label_end, start, stop, pswapped))
1941 goto error_return;
1942 }
1943
1944 free (labels);
1945
1946 return true;
1947
1948 error_return:
1949 if (labels != NULL)
1950 free (labels);
1951 return false;
1952}
1953
1954/* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */
1955
1956static boolean
1957sh_elf_swap_insns (abfd, sec, relocs, contents, addr)
1958 bfd *abfd;
1959 asection *sec;
1960 PTR relocs;
1961 bfd_byte *contents;
1962 bfd_vma addr;
1963{
1964 Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
1965 unsigned short i1, i2;
1966 Elf_Internal_Rela *irel, *irelend;
1967
1968 /* Swap the instructions themselves. */
1969 i1 = bfd_get_16 (abfd, contents + addr);
1970 i2 = bfd_get_16 (abfd, contents + addr + 2);
1971 bfd_put_16 (abfd, i2, contents + addr);
1972 bfd_put_16 (abfd, i1, contents + addr + 2);
1973
1974 /* Adjust all reloc addresses. */
1975 irelend = internal_relocs + sec->reloc_count;
1976 for (irel = internal_relocs; irel < irelend; irel++)
1977 {
1978 enum elf_sh_reloc_type type;
1979 int add;
1980
1981 /* There are a few special types of relocs that we don't want to
1982 adjust. These relocs do not apply to the instruction itself,
1983 but are only associated with the address. */
1984 type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
1985 if (type == R_SH_ALIGN
1986 || type == R_SH_CODE
1987 || type == R_SH_DATA
1988 || type == R_SH_LABEL)
1989 continue;
1990
1991 /* If an R_SH_USES reloc points to one of the addresses being
1992 swapped, we must adjust it. It would be incorrect to do this
1993 for a jump, though, since we want to execute both
1994 instructions after the jump. (We have avoided swapping
1995 around a label, so the jump will not wind up executing an
1996 instruction it shouldn't). */
1997 if (type == R_SH_USES)
1998 {
1999 bfd_vma off;
2000
2001 off = irel->r_offset + 4 + irel->r_addend;
2002 if (off == addr)
2003 irel->r_offset += 2;
2004 else if (off == addr + 2)
2005 irel->r_offset -= 2;
2006 }
2007
2008 if (irel->r_offset == addr)
2009 {
2010 irel->r_offset += 2;
2011 add = -2;
2012 }
2013 else if (irel->r_offset == addr + 2)
2014 {
2015 irel->r_offset -= 2;
2016 add = 2;
2017 }
2018 else
2019 add = 0;
2020
2021 if (add != 0)
2022 {
2023 bfd_byte *loc;
2024 unsigned short insn, oinsn;
2025 boolean overflow;
2026
2027 loc = contents + irel->r_offset;
2028 overflow = false;
2029 switch (type)
2030 {
2031 default:
2032 break;
2033
2034 case R_SH_DIR8WPN:
2035 case R_SH_DIR8WPZ:
2036 insn = bfd_get_16 (abfd, loc);
2037 oinsn = insn;
2038 insn += add / 2;
2039 if ((oinsn & 0xff00) != (insn & 0xff00))
2040 overflow = true;
2041 bfd_put_16 (abfd, insn, loc);
2042 break;
2043
2044 case R_SH_IND12W:
2045 insn = bfd_get_16 (abfd, loc);
2046 oinsn = insn;
2047 insn += add / 2;
2048 if ((oinsn & 0xf000) != (insn & 0xf000))
2049 overflow = true;
2050 bfd_put_16 (abfd, insn, loc);
2051 break;
2052
2053 case R_SH_DIR8WPL:
2054 /* This reloc ignores the least significant 3 bits of
2055 the program counter before adding in the offset.
2056 This means that if ADDR is at an even address, the
2057 swap will not affect the offset. If ADDR is an at an
2058 odd address, then the instruction will be crossing a
2059 four byte boundary, and must be adjusted. */
2060 if ((addr & 3) != 0)
2061 {
2062 insn = bfd_get_16 (abfd, loc);
2063 oinsn = insn;
2064 insn += add / 2;
2065 if ((oinsn & 0xff00) != (insn & 0xff00))
2066 overflow = true;
2067 bfd_put_16 (abfd, insn, loc);
2068 }
2069
2070 break;
2071 }
2072
2073 if (overflow)
2074 {
2075 ((*_bfd_error_handler)
2076 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
2077 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2078 bfd_set_error (bfd_error_bad_value);
2079 return false;
2080 }
2081 }
2082 }
2083
2084 return true;
2085}
2086\f
37c644f2 2087/* The size in bytes of an entry in the procedure linkage table. */
252b5132 2088
37c644f2
AO
2089#define PLT_ENTRY_SIZE 28
2090
2091/* First entry in an absolute procedure linkage table look like this. */
2092
2093static const bfd_byte elf_sh_plt0_entry_be[PLT_ENTRY_SIZE] =
252b5132 2094{
37c644f2
AO
2095 0xd0, 0x04, /* mov.l 1f,r0 */
2096 0xd2, 0x05, /* mov.l 2f,r2 */
2097 0x60, 0x02, /* mov.l @r0,r0 */
2098 0x62, 0x22, /* mov.l @r2,r2 */
2099 0x40, 0x2b, /* jmp @r0 */
2100 0xe0, 0x00, /* mov #0,r0 */
2101 0x00, 0x09, /* nop */
2102 0x00, 0x09, /* nop */
2103 0x00, 0x09, /* nop */
2104 0x00, 0x09, /* nop */
2105 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
2106 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
2107};
252b5132 2108
37c644f2
AO
2109static const bfd_byte elf_sh_plt0_entry_le[PLT_ENTRY_SIZE] =
2110{
2111 0x04, 0xd0, /* mov.l 1f,r0 */
2112 0x05, 0xd2, /* mov.l 2f,r2 */
2113 0x02, 0x60, /* mov.l @r0,r0 */
2114 0x22, 0x62, /* mov.l @r2,r2 */
2115 0x2b, 0x40, /* jmp @r0 */
2116 0x00, 0xe0, /* mov #0,r0 */
2117 0x09, 0x00, /* nop */
2118 0x09, 0x00, /* nop */
2119 0x09, 0x00, /* nop */
2120 0x09, 0x00, /* nop */
2121 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
2122 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
2123};
252b5132 2124
37c644f2
AO
2125/* Sebsequent entries in an absolute procedure linkage table look like
2126 this. */
252b5132 2127
37c644f2
AO
2128static const bfd_byte elf_sh_plt_entry_be[PLT_ENTRY_SIZE] =
2129{
2130 0xd0, 0x04, /* mov.l 1f,r0 */
2131 0x60, 0x02, /* mov.l @r0,r0 */
2132 0xd2, 0x02, /* mov.l 0f,r2 */
2133 0x40, 0x2b, /* jmp @r0 */
2134 0x60, 0x23, /* mov r2,r0 */
2135 0xd1, 0x03, /* mov.l 2f,r1 */
2136 0x40, 0x2b, /* jmp @r0 */
2137 0x00, 0x09, /* nop */
2138 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
2139 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
2140 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
2141};
252b5132 2142
37c644f2
AO
2143static const bfd_byte elf_sh_plt_entry_le[PLT_ENTRY_SIZE] =
2144{
2145 0x04, 0xd0, /* mov.l 1f,r0 */
2146 0x02, 0x60, /* mov.l @r0,r0 */
2147 0x02, 0xd2, /* mov.l 0f,r2 */
2148 0x2b, 0x40, /* jmp @r0 */
2149 0x23, 0x60, /* mov r2,r0 */
2150 0x03, 0xd1, /* mov.l 2f,r1 */
2151 0x2b, 0x40, /* jmp @r0 */
2152 0x09, 0x00, /* nop */
2153 0, 0, 0, 0, /* 0: replaced with address of .PLT. */
2154 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
2155 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
2156};
252b5132 2157
37c644f2 2158/* Entries in a PIC procedure linkage table look like this. */
252b5132 2159
37c644f2
AO
2160static const bfd_byte elf_sh_pic_plt_entry_be[PLT_ENTRY_SIZE] =
2161{
2162 0xd0, 0x04, /* mov.l 1f,r0 */
2163 0x00, 0xce, /* mov.l @(r0,r12),r0 */
2164 0x40, 0x2b, /* jmp @r0 */
2165 0x00, 0x09, /* nop */
2166 0x50, 0xc2, /* 0: mov.l @(8,r12),r0 */
2167 0x52, 0xc1, /* 1: mov.l @(4,r12),r2 */
2168 0xd1, 0x02, /* mov.l 2f,r1 */
2169 0x40, 0x2b, /* jmp @r0 */
2170 0xe0, 0x00, /* mov #0,r0 ! shows the type of PLT. */
2171 0x00, 0x09, /* nop */
2172 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
2173 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
2174};
252b5132 2175
37c644f2
AO
2176static const bfd_byte elf_sh_pic_plt_entry_le[PLT_ENTRY_SIZE] =
2177{
2178 0x04, 0xd0, /* mov.l 1f,r0 */
2179 0xce, 0x00, /* mov.l @(r0,r12),r0 */
2180 0x2b, 0x40, /* jmp @r0 */
2181 0x09, 0x00, /* nop */
2182 0xc2, 0x50, /* 0: mov.l @(8,r12),r0 */
2183 0xc1, 0x52, /* 1: mov.l @(4,r12),r2 */
2184 0x02, 0xd1, /* mov.l 2f,r1 */
2185 0x2b, 0x40, /* jmp @r0 */
2186 0x00, 0xe0, /* mov #0,r0 ! shows the type of PLT. */
2187 0x09, 0x00, /* nop */
2188 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
2189 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
2190};
252b5132 2191
37c644f2
AO
2192static const bfd_byte *elf_sh_plt0_entry;
2193static const bfd_byte *elf_sh_plt_entry;
2194static const bfd_byte *elf_sh_pic_plt_entry;
252b5132 2195
37c644f2
AO
2196/* Return size of a PLT entry. */
2197#define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
252b5132 2198
37c644f2
AO
2199/* Return offset of the PLT0 address in an absolute PLT entry. */
2200#define elf_sh_plt_plt0_offset(info) 16
252b5132 2201
37c644f2
AO
2202/* Return offset of the linker in PLT0 entry. */
2203#define elf_sh_plt0_linker_offset(info) 20
9bdafcce 2204
37c644f2
AO
2205/* Return offset of the GOT id in PLT0 entry. */
2206#define elf_sh_plt0_gotid_offset(info) 24
9bdafcce 2207
37c644f2
AO
2208/* Return offset of the tempoline in PLT entry */
2209#define elf_sh_plt_temp_offset(info) 8
9bdafcce 2210
37c644f2
AO
2211/* Return offset of the symbol in PLT entry. */
2212#define elf_sh_plt_symbol_offset(info) 20
9bdafcce 2213
37c644f2
AO
2214/* Return offset of the relocation in PLT entry. */
2215#define elf_sh_plt_reloc_offset(info) 24
015551fc 2216
37c644f2
AO
2217/* The sh linker needs to keep track of the number of relocs that it
2218 decides to copy in check_relocs for each symbol. This is so that
2219 it can discard PC relative relocs if it doesn't need them when
2220 linking with -Bsymbolic. We store the information in a field
2221 extending the regular ELF linker hash table. */
9bdafcce 2222
37c644f2
AO
2223/* This structure keeps track of the number of PC relative relocs we
2224 have copied for a given symbol. */
252b5132 2225
37c644f2
AO
2226struct elf_sh_pcrel_relocs_copied
2227{
2228 /* Next section. */
2229 struct elf_sh_pcrel_relocs_copied *next;
2230 /* A section in dynobj. */
2231 asection *section;
2232 /* Number of relocs copied in this section. */
2233 bfd_size_type count;
2234};
252b5132 2235
37c644f2
AO
2236/* sh ELF linker hash entry. */
2237
2238struct elf_sh_link_hash_entry
2239{
2240 struct elf_link_hash_entry root;
2241
2242 /* Number of PC relative relocs copied for this symbol. */
2243 struct elf_sh_pcrel_relocs_copied *pcrel_relocs_copied;
2244};
2245
2246/* sh ELF linker hash table. */
2247
2248struct elf_sh_link_hash_table
2249{
2250 struct elf_link_hash_table root;
2251};
2252
2253/* Declare this now that the above structures are defined. */
2254
2255static boolean sh_elf_discard_copies
2256 PARAMS ((struct elf_sh_link_hash_entry *, PTR));
2257
2258/* Traverse an sh ELF linker hash table. */
2259
2260#define sh_elf_link_hash_traverse(table, func, info) \
2261 (elf_link_hash_traverse \
2262 (&(table)->root, \
2263 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
2264 (info)))
2265
2266/* Get the sh ELF linker hash table from a link_info structure. */
2267
2268#define sh_elf_hash_table(p) \
2269 ((struct elf_sh_link_hash_table *) ((p)->hash))
2270
2271/* Create an entry in an sh ELF linker hash table. */
2272
2273static struct bfd_hash_entry *
2274sh_elf_link_hash_newfunc (entry, table, string)
2275 struct bfd_hash_entry *entry;
2276 struct bfd_hash_table *table;
2277 const char *string;
2278{
2279 struct elf_sh_link_hash_entry *ret =
2280 (struct elf_sh_link_hash_entry *) entry;
2281
2282 /* Allocate the structure if it has not already been allocated by a
2283 subclass. */
2284 if (ret == (struct elf_sh_link_hash_entry *) NULL)
2285 ret = ((struct elf_sh_link_hash_entry *)
2286 bfd_hash_allocate (table,
2287 sizeof (struct elf_sh_link_hash_entry)));
2288 if (ret == (struct elf_sh_link_hash_entry *) NULL)
2289 return (struct bfd_hash_entry *) ret;
2290
2291 /* Call the allocation method of the superclass. */
2292 ret = ((struct elf_sh_link_hash_entry *)
2293 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2294 table, string));
2295 if (ret != (struct elf_sh_link_hash_entry *) NULL)
2296 {
2297 ret->pcrel_relocs_copied = NULL;
2298 }
2299
2300 return (struct bfd_hash_entry *) ret;
2301}
2302
2303/* Create an sh ELF linker hash table. */
2304
2305static struct bfd_link_hash_table *
2306sh_elf_link_hash_table_create (abfd)
2307 bfd *abfd;
2308{
2309 struct elf_sh_link_hash_table *ret;
2310
2311 ret = ((struct elf_sh_link_hash_table *)
2312 bfd_alloc (abfd, sizeof (struct elf_sh_link_hash_table)));
2313 if (ret == (struct elf_sh_link_hash_table *) NULL)
2314 return NULL;
2315
2316 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
2317 sh_elf_link_hash_newfunc))
2318 {
2319 bfd_release (abfd, ret);
2320 return NULL;
2321 }
2322
2323 return &ret->root.root;
2324}
2325
2326/* Create dynamic sections when linking against a dynamic object. */
2327
2328static boolean
2329sh_elf_create_dynamic_sections (abfd, info)
2330 bfd *abfd;
2331 struct bfd_link_info *info;
2332{
2333 flagword flags, pltflags;
2334 register asection *s;
2335 struct elf_backend_data *bed = get_elf_backend_data (abfd);
2336 int ptralign = 0;
2337
2338 switch (bed->s->arch_size)
2339 {
2340 case 32:
2341 ptralign = 2;
2342 break;
2343
2344 case 64:
2345 ptralign = 3;
2346 break;
2347
2348 default:
2349 bfd_set_error (bfd_error_bad_value);
2350 return false;
2351 }
2352
2353 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2354 .rel[a].bss sections. */
2355
2356 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2357 | SEC_LINKER_CREATED);
2358
2359 pltflags = flags;
2360 pltflags |= SEC_CODE;
2361 if (bed->plt_not_loaded)
2362 pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
2363 if (bed->plt_readonly)
2364 pltflags |= SEC_READONLY;
2365
2366 s = bfd_make_section (abfd, ".plt");
2367 if (s == NULL
2368 || ! bfd_set_section_flags (abfd, s, pltflags)
2369 || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
2370 return false;
2371
2372 if (bed->want_plt_sym)
2373 {
2374 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2375 .plt section. */
2376 struct elf_link_hash_entry *h = NULL;
2377 if (! (_bfd_generic_link_add_one_symbol
2378 (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
2379 (bfd_vma) 0, (const char *) NULL, false,
2380 get_elf_backend_data (abfd)->collect,
2381 (struct bfd_link_hash_entry **) &h)))
2382 return false;
2383 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2384 h->type = STT_OBJECT;
2385
2386 if (info->shared
2387 && ! _bfd_elf_link_record_dynamic_symbol (info, h))
2388 return false;
2389 }
2390
2391 s = bfd_make_section (abfd,
2392 bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
2393 if (s == NULL
2394 || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2395 || ! bfd_set_section_alignment (abfd, s, ptralign))
2396 return false;
2397
2398 if (! _bfd_elf_create_got_section (abfd, info))
2399 return false;
2400
2401 {
2402 const char *secname;
2403 char *relname;
2404 flagword secflags;
2405 asection *sec;
2406
2407 for (sec = abfd->sections; sec; sec = sec->next)
2408 {
2409 secflags = bfd_get_section_flags (abfd, sec);
2410 if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
2411 || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
2412 continue;
2413 secname = bfd_get_section_name (abfd, sec);
2414 relname = (char *) bfd_malloc (strlen (secname) + 6);
2415 strcpy (relname, ".rela");
2416 strcat (relname, secname);
2417 s = bfd_make_section (abfd, relname);
2418 if (s == NULL
2419 || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2420 || ! bfd_set_section_alignment (abfd, s, ptralign))
2421 return false;
2422 }
2423 }
2424
2425 if (bed->want_dynbss)
2426 {
2427 /* The .dynbss section is a place to put symbols which are defined
2428 by dynamic objects, are referenced by regular objects, and are
2429 not functions. We must allocate space for them in the process
2430 image and use a R_*_COPY reloc to tell the dynamic linker to
2431 initialize them at run time. The linker script puts the .dynbss
2432 section into the .bss section of the final image. */
2433 s = bfd_make_section (abfd, ".dynbss");
2434 if (s == NULL
2435 || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
2436 return false;
2437
2438 /* The .rel[a].bss section holds copy relocs. This section is not
2439 normally needed. We need to create it here, though, so that the
2440 linker will map it to an output section. We can't just create it
2441 only if we need it, because we will not know whether we need it
2442 until we have seen all the input files, and the first time the
2443 main linker code calls BFD after examining all the input files
2444 (size_dynamic_sections) the input sections have already been
2445 mapped to the output sections. If the section turns out not to
2446 be needed, we can discard it later. We will never need this
2447 section when generating a shared object, since they do not use
2448 copy relocs. */
2449 if (! info->shared)
2450 {
2451 s = bfd_make_section (abfd,
2452 (bed->default_use_rela_p
2453 ? ".rela.bss" : ".rel.bss"));
2454 if (s == NULL
2455 || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2456 || ! bfd_set_section_alignment (abfd, s, ptralign))
2457 return false;
2458 }
2459 }
2460
2461 return true;
2462}
2463\f
2464
2465/* Adjust a symbol defined by a dynamic object and referenced by a
2466 regular object. The current definition is in some section of the
2467 dynamic object, but we're not including those sections. We have to
2468 change the definition to something the rest of the link can
2469 understand. */
2470
2471static boolean
2472sh_elf_adjust_dynamic_symbol (info, h)
2473 struct bfd_link_info *info;
2474 struct elf_link_hash_entry *h;
2475{
2476 bfd *dynobj;
2477 asection *s;
2478 unsigned int power_of_two;
2479
2480 dynobj = elf_hash_table (info)->dynobj;
2481
2482 /* Make sure we know what is going on here. */
2483 BFD_ASSERT (dynobj != NULL
2484 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
2485 || h->weakdef != NULL
2486 || ((h->elf_link_hash_flags
2487 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2488 && (h->elf_link_hash_flags
2489 & ELF_LINK_HASH_REF_REGULAR) != 0
2490 && (h->elf_link_hash_flags
2491 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
2492
2493 /* If this is a function, put it in the procedure linkage table. We
2494 will fill in the contents of the procedure linkage table later,
2495 when we know the address of the .got section. */
2496 if (h->type == STT_FUNC
2497 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2498 {
2499 if (! info->shared
2500 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
2501 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)
2502 {
2503 /* This case can occur if we saw a PLT reloc in an input
2504 file, but the symbol was never referred to by a dynamic
2505 object. In such a case, we don't actually need to build
2506 a procedure linkage table, and we can just do a REL32
2507 reloc instead. */
2508 BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
2509 return true;
2510 }
2511
2512 /* Make sure this symbol is output as a dynamic symbol. */
2513 if (h->dynindx == -1)
2514 {
2515 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2516 return false;
2517 }
2518
2519 s = bfd_get_section_by_name (dynobj, ".plt");
2520 BFD_ASSERT (s != NULL);
2521
2522 /* If this is the first .plt entry, make room for the special
2523 first entry. */
2524 if (s->_raw_size == 0)
2525 s->_raw_size += PLT_ENTRY_SIZE;
2526
2527 /* If this symbol is not defined in a regular file, and we are
2528 not generating a shared library, then set the symbol to this
2529 location in the .plt. This is required to make function
2530 pointers compare as equal between the normal executable and
2531 the shared library. */
2532 if (! info->shared
2533 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2534 {
2535 h->root.u.def.section = s;
2536 h->root.u.def.value = s->_raw_size;
2537 }
2538
2539 h->plt.offset = s->_raw_size;
2540
2541 /* Make room for this entry. */
2542 s->_raw_size += elf_sh_sizeof_plt (info);
2543
2544 /* We also need to make an entry in the .got.plt section, which
2545 will be placed in the .got section by the linker script. */
2546
2547 s = bfd_get_section_by_name (dynobj, ".got.plt");
2548 BFD_ASSERT (s != NULL);
2549 s->_raw_size += 4;
2550
2551 /* We also need to make an entry in the .rela.plt section. */
2552
2553 s = bfd_get_section_by_name (dynobj, ".rela.plt");
2554 BFD_ASSERT (s != NULL);
2555 s->_raw_size += sizeof (Elf32_External_Rela);
2556
2557 return true;
2558 }
2559
2560 /* If this is a weak symbol, and there is a real definition, the
2561 processor independent code will have arranged for us to see the
2562 real definition first, and we can just use the same value. */
2563 if (h->weakdef != NULL)
2564 {
2565 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2566 || h->weakdef->root.type == bfd_link_hash_defweak);
2567 h->root.u.def.section = h->weakdef->root.u.def.section;
2568 h->root.u.def.value = h->weakdef->root.u.def.value;
2569 return true;
2570 }
2571
2572 /* This is a reference to a symbol defined by a dynamic object which
2573 is not a function. */
2574
2575 /* If we are creating a shared library, we must presume that the
2576 only references to the symbol are via the global offset table.
2577 For such cases we need not do anything here; the relocations will
2578 be handled correctly by relocate_section. */
2579 if (info->shared)
2580 return true;
2581
2582 /* If there are no references to this symbol that do not use the
2583 GOT, we don't need to generate a copy reloc. */
2584 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
2585 return true;
2586
2587 /* We must allocate the symbol in our .dynbss section, which will
2588 become part of the .bss section of the executable. There will be
2589 an entry for this symbol in the .dynsym section. The dynamic
2590 object will contain position independent code, so all references
2591 from the dynamic object to this symbol will go through the global
2592 offset table. The dynamic linker will use the .dynsym entry to
2593 determine the address it must put in the global offset table, so
2594 both the dynamic object and the regular object will refer to the
2595 same memory location for the variable. */
2596
2597 s = bfd_get_section_by_name (dynobj, ".dynbss");
2598 BFD_ASSERT (s != NULL);
2599
2600 /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
2601 copy the initial value out of the dynamic object and into the
2602 runtime process image. We need to remember the offset into the
2603 .rela.bss section we are going to use. */
2604 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2605 {
2606 asection *srel;
2607
2608 srel = bfd_get_section_by_name (dynobj, ".rela.bss");
2609 BFD_ASSERT (srel != NULL);
2610 srel->_raw_size += sizeof (Elf32_External_Rela);
2611 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
2612 }
2613
2614 /* We need to figure out the alignment required for this symbol. I
2615 have no idea how ELF linkers handle this. */
2616 power_of_two = bfd_log2 (h->size);
2617 if (power_of_two > 3)
2618 power_of_two = 3;
2619
2620 /* Apply the required alignment. */
2621 s->_raw_size = BFD_ALIGN (s->_raw_size,
2622 (bfd_size_type) (1 << power_of_two));
2623 if (power_of_two > bfd_get_section_alignment (dynobj, s))
2624 {
2625 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
2626 return false;
2627 }
2628
2629 /* Define the symbol as being at this point in the section. */
2630 h->root.u.def.section = s;
2631 h->root.u.def.value = s->_raw_size;
2632
2633 /* Increment the section size to make room for the symbol. */
2634 s->_raw_size += h->size;
2635
2636 return true;
2637}
2638
2639/* Set the sizes of the dynamic sections. */
2640
2641static boolean
2642sh_elf_size_dynamic_sections (output_bfd, info)
2643 bfd *output_bfd;
2644 struct bfd_link_info *info;
2645{
2646 bfd *dynobj;
2647 asection *s;
2648 boolean plt;
2649 boolean relocs;
2650 boolean reltext;
2651
2652 dynobj = elf_hash_table (info)->dynobj;
2653 BFD_ASSERT (dynobj != NULL);
2654
2655 if (elf_hash_table (info)->dynamic_sections_created)
2656 {
2657 /* Set the contents of the .interp section to the interpreter. */
2658 if (! info->shared)
2659 {
2660 s = bfd_get_section_by_name (dynobj, ".interp");
2661 BFD_ASSERT (s != NULL);
2662 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
2663 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2664 }
2665 }
2666 else
2667 {
2668 /* We may have created entries in the .rela.got section.
2669 However, if we are not creating the dynamic sections, we will
2670 not actually use these entries. Reset the size of .rela.got,
2671 which will cause it to get stripped from the output file
2672 below. */
2673 s = bfd_get_section_by_name (dynobj, ".rela.got");
2674 if (s != NULL)
2675 s->_raw_size = 0;
2676 }
2677
2678 /* If this is a -Bsymbolic shared link, then we need to discard all
2679 PC relative relocs against symbols defined in a regular object.
2680 We allocated space for them in the check_relocs routine, but we
2681 will not fill them in in the relocate_section routine. */
2682 if (info->shared && info->symbolic)
2683 sh_elf_link_hash_traverse (sh_elf_hash_table (info),
2684 sh_elf_discard_copies,
2685 (PTR) NULL);
2686
2687 /* The check_relocs and adjust_dynamic_symbol entry points have
2688 determined the sizes of the various dynamic sections. Allocate
2689 memory for them. */
2690 plt = false;
2691 relocs = false;
2692 reltext = false;
2693 for (s = dynobj->sections; s != NULL; s = s->next)
2694 {
2695 const char *name;
2696 boolean strip;
2697
2698 if ((s->flags & SEC_LINKER_CREATED) == 0)
2699 continue;
2700
2701 /* It's OK to base decisions on the section name, because none
2702 of the dynobj section names depend upon the input files. */
2703 name = bfd_get_section_name (dynobj, s);
2704
2705 strip = false;
2706
2707 if (strcmp (name, ".plt") == 0)
2708 {
2709 if (s->_raw_size == 0)
2710 {
2711 /* Strip this section if we don't need it; see the
2712 comment below. */
2713 strip = true;
2714 }
2715 else
2716 {
2717 /* Remember whether there is a PLT. */
2718 plt = true;
2719 }
2720 }
2721 else if (strncmp (name, ".rela", 5) == 0)
2722 {
2723 if (s->_raw_size == 0)
2724 {
2725 /* If we don't need this section, strip it from the
2726 output file. This is mostly to handle .rela.bss and
2727 .rela.plt. We must create both sections in
2728 create_dynamic_sections, because they must be created
2729 before the linker maps input sections to output
2730 sections. The linker does that before
2731 adjust_dynamic_symbol is called, and it is that
2732 function which decides whether anything needs to go
2733 into these sections. */
2734 strip = true;
2735 }
2736 else
2737 {
2738 asection *target;
2739
2740 /* Remember whether there are any reloc sections other
2741 than .rela.plt. */
2742 if (strcmp (name, ".rela.plt") != 0)
2743 {
2744 const char *outname;
2745
2746 relocs = true;
2747
2748 /* If this relocation section applies to a read only
2749 section, then we probably need a DT_TEXTREL
2750 entry. The entries in the .rela.plt section
2751 really apply to the .got section, which we
2752 created ourselves and so know is not readonly. */
2753 outname = bfd_get_section_name (output_bfd,
2754 s->output_section);
2755 target = bfd_get_section_by_name (output_bfd, outname + 5);
2756 if (target != NULL
2757 && (target->flags & SEC_READONLY) != 0
2758 && (target->flags & SEC_ALLOC) != 0)
2759 reltext = true;
2760 }
2761
2762 /* We use the reloc_count field as a counter if we need
2763 to copy relocs into the output file. */
2764 s->reloc_count = 0;
2765 }
2766 }
2767 else if (strncmp (name, ".got", 4) != 0)
2768 {
2769 /* It's not one of our sections, so don't allocate space. */
2770 continue;
2771 }
2772
2773 if (strip)
2774 {
2775 _bfd_strip_section_from_output (info, s);
2776 continue;
2777 }
2778
2779 /* Allocate memory for the section contents. */
2780 s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
2781 if (s->contents == NULL && s->_raw_size != 0)
2782 return false;
2783 }
2784
2785 if (elf_hash_table (info)->dynamic_sections_created)
2786 {
2787 /* Add some entries to the .dynamic section. We fill in the
2788 values later, in sh_elf_finish_dynamic_sections, but we
2789 must add the entries now so that we get the correct size for
2790 the .dynamic section. The DT_DEBUG entry is filled in by the
2791 dynamic linker and used by the debugger. */
2792 if (! info->shared)
2793 {
2794 if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
2795 return false;
2796 }
2797
2798 if (plt)
2799 {
2800 if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
2801 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
2802 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
2803 || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
2804 return false;
2805 }
2806
2807 if (relocs)
2808 {
2809 if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
2810 || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
2811 || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
2812 sizeof (Elf32_External_Rela)))
2813 return false;
2814 }
2815
2816 if (reltext)
2817 {
2818 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
2819 return false;
2820 }
2821 }
2822
2823 return true;
2824}
2825
2826/* This function is called via sh_elf_link_hash_traverse if we are
2827 creating a shared object with -Bsymbolic. It discards the space
2828 allocated to copy PC relative relocs against symbols which are
2829 defined in regular objects. We allocated space for them in the
2830 check_relocs routine, but we won't fill them in in the
2831 relocate_section routine. */
2832
2833/*ARGSUSED*/
2834static boolean
2835sh_elf_discard_copies (h, ignore)
2836 struct elf_sh_link_hash_entry *h;
2837 PTR ignore ATTRIBUTE_UNUSED;
2838{
2839 struct elf_sh_pcrel_relocs_copied *s;
2840
2841 /* We only discard relocs for symbols defined in a regular object. */
2842 if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2843 return true;
2844
2845 for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
2846 s->section->_raw_size -= s->count * sizeof (Elf32_External_Rela);
2847
2848 return true;
2849}
2850
2851\f
2852/* Relocate an SH ELF section. */
2853
2854static boolean
2855sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
2856 contents, relocs, local_syms, local_sections)
2857 bfd *output_bfd ATTRIBUTE_UNUSED;
2858 struct bfd_link_info *info;
2859 bfd *input_bfd;
2860 asection *input_section;
2861 bfd_byte *contents;
2862 Elf_Internal_Rela *relocs;
2863 Elf_Internal_Sym *local_syms;
2864 asection **local_sections;
2865{
2866 Elf_Internal_Shdr *symtab_hdr;
2867 struct elf_link_hash_entry **sym_hashes;
2868 Elf_Internal_Rela *rel, *relend;
2869 bfd *dynobj;
2870 bfd_vma *local_got_offsets;
2871 asection *sgot;
2872 asection *splt;
2873 asection *sreloc;
2874
2875 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2876 sym_hashes = elf_sym_hashes (input_bfd);
2877 dynobj = elf_hash_table (info)->dynobj;
2878 local_got_offsets = elf_local_got_offsets (input_bfd);
2879
2880 sgot = NULL;
2881 splt = NULL;
2882 sreloc = NULL;
2883
2884 rel = relocs;
2885 relend = relocs + input_section->reloc_count;
2886 for (; rel < relend; rel++)
2887 {
2888 int r_type;
2889 reloc_howto_type *howto;
2890 unsigned long r_symndx;
2891 Elf_Internal_Sym *sym;
2892 asection *sec;
2893 struct elf_link_hash_entry *h;
2894 bfd_vma relocation;
2895 bfd_vma addend = (bfd_vma)0;
2896 bfd_reloc_status_type r;
2897
2898 r_symndx = ELF32_R_SYM (rel->r_info);
2899
37c644f2
AO
2900 r_type = ELF32_R_TYPE (rel->r_info);
2901
2902 /* Many of the relocs are only used for relaxing, and are
2903 handled entirely by the relaxation code. */
2904 if (r_type > (int) R_SH_LAST_INVALID_RELOC
2905 && r_type < (int) R_SH_LOOP_START)
2906 continue;
2907
2908 if (r_type < 0
2909 || r_type >= R_SH_max
2910 || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
06bb75c1
AO
2911 && r_type <= (int) R_SH_LAST_INVALID_RELOC)
2912 || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
2913 && r_type <= (int) R_SH_LAST_INVALID_RELOC_2))
37c644f2
AO
2914 {
2915 bfd_set_error (bfd_error_bad_value);
2916 return false;
2917 }
2918
2919 howto = sh_elf_howto_table + r_type;
2920
2921 /* This is a final link. */
2922 h = NULL;
2923 sym = NULL;
2924 sec = NULL;
2925 if (r_symndx < symtab_hdr->sh_info)
2926 {
2927 sym = local_syms + r_symndx;
2928 sec = local_sections[r_symndx];
2929 relocation = (sec->output_section->vma
2930 + sec->output_offset
2931 + sym->st_value);
8a3975e6
AO
2932
2933 if (info->relocateable)
2934 {
2935 /* This is a relocateable link. We don't have to change
2936 anything, unless the reloc is against a section symbol,
2937 in which case we have to adjust according to where the
2938 section symbol winds up in the output section. */
2939 sym = local_syms + r_symndx;
2940 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2941 goto final_link_relocate;
2942
2943 continue;
2944 }
37c644f2
AO
2945 }
2946 else
2947 {
8a3975e6
AO
2948 /* Section symbol are never (?) placed in the hash table, so
2949 we can just ignore hash relocations when creating a
2950 relocateable object file. */
2951 if (info->relocateable)
2952 continue;
2953
37c644f2
AO
2954 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2955 while (h->root.type == bfd_link_hash_indirect
2956 || h->root.type == bfd_link_hash_warning)
2957 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2958 if (h->root.type == bfd_link_hash_defined
2959 || h->root.type == bfd_link_hash_defweak)
2960 {
2961 sec = h->root.u.def.section;
2962 /* In these cases, we don't need the relocation value.
2963 We check specially because in some obscure cases
2964 sec->output_section will be NULL. */
2965 if (r_type == R_SH_GOTPC
2966 || (r_type == R_SH_PLT32
2967 && h->plt.offset != (bfd_vma) -1)
2968 || (r_type == R_SH_GOT32
2969 && elf_hash_table (info)->dynamic_sections_created
2970 && (! info->shared
2971 || (! info->symbolic && h->dynindx != -1)
2972 || (h->elf_link_hash_flags
2973 & ELF_LINK_HASH_DEF_REGULAR) == 0))
2974 /* The cases above are those in which relocation is
2975 overwritten in the switch block below. The cases
2976 below are those in which we must defer relocation
2977 to run-time, because we can't resolve absolute
2978 addresses when creating a shared library. */
2979 || (info->shared
2980 && ((! info->symbolic && h->dynindx != -1)
2981 || (h->elf_link_hash_flags
2982 & ELF_LINK_HASH_DEF_REGULAR) == 0)
2983 && ((r_type == R_SH_DIR32
2984 && !(ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
2985 || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN))
2986 || r_type == R_SH_REL32)
2987 && ((input_section->flags & SEC_ALLOC) != 0
2988 /* DWARF will emit R_SH_DIR32 relocations in its
2989 sections against symbols defined externally
2990 in shared libraries. We can't do anything
2991 with them here. */
2992 || (input_section->flags & SEC_DEBUGGING) != 0)))
2993 relocation = 0;
2994 else if (sec->output_section == NULL)
2995 {
2996 (*_bfd_error_handler)
2997 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
2998 bfd_get_filename (input_bfd), h->root.root.string,
2999 bfd_get_section_name (input_bfd, input_section));
3000 relocation = 0;
3001 }
3002 else
3003 relocation = (h->root.u.def.value
3004 + sec->output_section->vma
3005 + sec->output_offset);
3006 }
3007 else if (h->root.type == bfd_link_hash_undefweak)
3008 relocation = 0;
3009 else if (info->shared && !info->symbolic && !info->no_undefined)
3010 relocation = 0;
3011 else
3012 {
3013 if (! ((*info->callbacks->undefined_symbol)
3014 (info, h->root.root.string, input_bfd,
3015 input_section, rel->r_offset, true)))
3016 return false;
3017 relocation = 0;
3018 }
3019 }
3020
3021 switch ((int)r_type)
3022 {
3023 final_link_relocate:
3024 /* COFF relocs don't use the addend. The addend is used for
3025 R_SH_DIR32 to be compatible with other compilers. */
3026 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3027 contents, rel->r_offset,
3028 relocation, addend);
3029 break;
3030
3031 case R_SH_IND12W:
3032 case R_SH_DIR8WPN:
3033 case R_SH_DIR8WPZ:
3034 case R_SH_DIR8WPL:
3035 /* These should normally be handled by the assembler, but at
3036 least IND12W is generated by ourselves, so we must deal
3037 with it. */
3038 relocation -= 4;
3039 goto final_link_relocate;
3040
3041 default:
3042 bfd_set_error (bfd_error_bad_value);
3043 return false;
3044
3045 case R_SH_DIR32:
3046 case R_SH_REL32:
3047 if (info->shared
3048 && (input_section->flags & SEC_ALLOC) != 0
3049 && (r_type != R_SH_REL32
3050 || (h != NULL
3051 && h->dynindx != -1
3052 && (! info->symbolic
3053 || (h->elf_link_hash_flags
3054 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
3055 {
3056 Elf_Internal_Rela outrel;
3057 boolean skip, relocate;
3058
3059 /* When generating a shared object, these relocations
3060 are copied into the output file to be resolved at run
3061 time. */
3062
3063 if (sreloc == NULL)
3064 {
3065 const char *name;
3066
3067 name = (bfd_elf_string_from_elf_section
3068 (input_bfd,
3069 elf_elfheader (input_bfd)->e_shstrndx,
3070 elf_section_data (input_section)->rel_hdr.sh_name));
3071 if (name == NULL)
3072 return false;
3073
3074 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
3075 && strcmp (bfd_get_section_name (input_bfd,
3076 input_section),
3077 name + 5) == 0);
3078
3079 sreloc = bfd_get_section_by_name (dynobj, name);
3080 BFD_ASSERT (sreloc != NULL);
3081 }
3082
3083 skip = false;
3084
3085 if (elf_section_data (input_section)->stab_info == NULL)
3086 outrel.r_offset = rel->r_offset;
3087 else
3088 {
3089 bfd_vma off;
3090
3091 off = (_bfd_stab_section_offset
3092 (output_bfd, &elf_hash_table (info)->stab_info,
3093 input_section,
3094 &elf_section_data (input_section)->stab_info,
3095 rel->r_offset));
3096 if (off == (bfd_vma) -1)
3097 skip = true;
3098 outrel.r_offset = off;
3099 }
3100
3101 outrel.r_offset += (input_section->output_section->vma
3102 + input_section->output_offset);
3103
3104 if (skip)
3105 {
3106 memset (&outrel, 0, sizeof outrel);
3107 relocate = false;
3108 }
3109 else if (r_type == R_SH_REL32)
3110 {
3111 BFD_ASSERT (h != NULL && h->dynindx != -1);
3112 relocate = false;
3113 outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
3114 outrel.r_addend = rel->r_addend;
3115 }
3116 else
3117 {
3118 /* h->dynindx may be -1 if this symbol was marked to
3119 become local. */
3120 if (h == NULL
3121 || ((info->symbolic || h->dynindx == -1)
3122 && (h->elf_link_hash_flags
3123 & ELF_LINK_HASH_DEF_REGULAR) != 0))
3124 {
3125 relocate = true;
3126 outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
3127 outrel.r_addend = relocation + rel->r_addend;
3128 }
3129 else
3130 {
3131 BFD_ASSERT (h->dynindx != -1);
3132 relocate = false;
3133 outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
3134 outrel.r_addend = relocation + rel->r_addend;
3135 }
3136 }
3137
3138 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3139 (((Elf32_External_Rela *)
3140 sreloc->contents)
3141 + sreloc->reloc_count));
3142 ++sreloc->reloc_count;
3143
3144 /* If this reloc is against an external symbol, we do
3145 not want to fiddle with the addend. Otherwise, we
3146 need to include the symbol value so that it becomes
3147 an addend for the dynamic reloc. */
3148 if (! relocate)
3149 continue;
3150 }
3151 else if (r_type == R_SH_DIR32)
3152 addend = rel->r_addend;
3153 goto final_link_relocate;
3154
3155 case R_SH_GOT32:
3156 /* Relocation is to the entry for this symbol in the global
3157 offset table. */
3158 if (sgot == NULL)
3159 {
3160 sgot = bfd_get_section_by_name (dynobj, ".got");
3161 BFD_ASSERT (sgot != NULL);
3162 }
3163
3164 if (h != NULL)
3165 {
3166 bfd_vma off;
3167
3168 off = h->got.offset;
3169 BFD_ASSERT (off != (bfd_vma) -1);
3170
3171 if (! elf_hash_table (info)->dynamic_sections_created
3172 || (info->shared
3173 && (info->symbolic || h->dynindx == -1
3174 || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
3175 || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
3176 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
3177 {
3178 /* This is actually a static link, or it is a
3179 -Bsymbolic link and the symbol is defined
3180 locally, or the symbol was forced to be local
3181 because of a version file. We must initialize
3182 this entry in the global offset table. Since the
3183 offset must always be a multiple of 4, we use the
3184 least significant bit to record whether we have
3185 initialized it already.
3186
3187 When doing a dynamic link, we create a .rela.got
3188 relocation entry to initialize the value. This
3189 is done in the finish_dynamic_symbol routine. */
3190 if ((off & 1) != 0)
3191 off &= ~1;
3192 else
3193 {
3194 bfd_put_32 (output_bfd, relocation,
3195 sgot->contents + off);
3196 h->got.offset |= 1;
3197 }
3198 }
3199
3200 relocation = sgot->output_offset + off;
3201 }
3202 else
3203 {
3204 bfd_vma off;
3205
3206 BFD_ASSERT (local_got_offsets != NULL
3207 && local_got_offsets[r_symndx] != (bfd_vma) -1);
3208
3209 off = local_got_offsets[r_symndx];
3210
3211 /* The offset must always be a multiple of 4. We use
3212 the least significant bit to record whether we have
3213 already generated the necessary reloc. */
3214 if ((off & 1) != 0)
3215 off &= ~1;
3216 else
3217 {
3218 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
3219
3220 if (info->shared)
3221 {
3222 asection *srelgot;
3223 Elf_Internal_Rela outrel;
3224
3225 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3226 BFD_ASSERT (srelgot != NULL);
3227
3228 outrel.r_offset = (sgot->output_section->vma
3229 + sgot->output_offset
3230 + off);
3231 outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
3232 outrel.r_addend = relocation;
3233 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3234 (((Elf32_External_Rela *)
3235 srelgot->contents)
3236 + srelgot->reloc_count));
3237 ++srelgot->reloc_count;
3238 }
3239
3240 local_got_offsets[r_symndx] |= 1;
3241 }
3242
3243 relocation = sgot->output_offset + off;
3244 }
3245
3246 goto final_link_relocate;
3247
3248 case R_SH_GOTOFF:
3249 /* Relocation is relative to the start of the global offset
3250 table. */
3251
3252 if (sgot == NULL)
3253 {
3254 sgot = bfd_get_section_by_name (dynobj, ".got");
3255 BFD_ASSERT (sgot != NULL);
3256 }
3257
3258 /* Note that sgot->output_offset is not involved in this
3259 calculation. We always want the start of .got. If we
3260 defined _GLOBAL_OFFSET_TABLE in a different way, as is
3261 permitted by the ABI, we might have to change this
3262 calculation. */
3263 relocation -= sgot->output_section->vma;
3264
3265 goto final_link_relocate;
3266
3267 case R_SH_GOTPC:
3268 /* Use global offset table as symbol value. */
3269
3270 if (sgot == NULL)
3271 {
3272 sgot = bfd_get_section_by_name (dynobj, ".got");
3273 BFD_ASSERT (sgot != NULL);
3274 }
3275
3276 relocation = sgot->output_section->vma;
3277
3278 goto final_link_relocate;
3279
3280 case R_SH_PLT32:
3281 /* Relocation is to the entry for this symbol in the
3282 procedure linkage table. */
3283
3284 /* Resolve a PLT reloc against a local symbol directly,
3285 without using the procedure linkage table. */
3286 if (h == NULL)
3287 goto final_link_relocate;
3288
3289 if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
3290 || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
3291 goto final_link_relocate;
3292
3293 if (h->plt.offset == (bfd_vma) -1)
3294 {
3295 /* We didn't make a PLT entry for this symbol. This
3296 happens when statically linking PIC code, or when
3297 using -Bsymbolic. */
3298 goto final_link_relocate;
3299 }
3300
3301 if (splt == NULL)
3302 {
3303 splt = bfd_get_section_by_name (dynobj, ".plt");
3304 BFD_ASSERT (splt != NULL);
3305 }
3306
3307 relocation = (splt->output_section->vma
3308 + splt->output_offset
3309 + h->plt.offset);
3310
3311 goto final_link_relocate;
3312
3313 case R_SH_LOOP_START:
3314 {
3315 static bfd_vma start, end;
3316
3317 start = (relocation + rel->r_addend
3318 - (sec->output_section->vma + sec->output_offset));
3319 r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
3320 rel->r_offset, sec, start, end);
3321 break;
3322
3323 case R_SH_LOOP_END:
3324 end = (relocation + rel->r_addend
3325 - (sec->output_section->vma + sec->output_offset));
3326 r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
3327 rel->r_offset, sec, start, end);
3328 break;
3329 }
3330 }
3331
3332 if (r != bfd_reloc_ok)
3333 {
3334 switch (r)
3335 {
3336 default:
3337 case bfd_reloc_outofrange:
3338 abort ();
3339 case bfd_reloc_overflow:
3340 {
3341 const char *name;
3342
3343 if (h != NULL)
3344 name = h->root.root.string;
3345 else
3346 {
252b5132
RH
3347 name = (bfd_elf_string_from_elf_section
3348 (input_bfd, symtab_hdr->sh_link, sym->st_name));
3349 if (name == NULL)
3350 return false;
3351 if (*name == '\0')
3352 name = bfd_section_name (input_bfd, sec);
3353 }
3354 if (! ((*info->callbacks->reloc_overflow)
3355 (info, name, howto->name, (bfd_vma) 0,
3356 input_bfd, input_section, rel->r_offset)))
3357 return false;
3358 }
3359 break;
3360 }
3361 }
3362 }
3363
3364 return true;
3365}
3366
3367/* This is a version of bfd_generic_get_relocated_section_contents
3368 which uses sh_elf_relocate_section. */
3369
3370static bfd_byte *
3371sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
3372 data, relocateable, symbols)
3373 bfd *output_bfd;
3374 struct bfd_link_info *link_info;
3375 struct bfd_link_order *link_order;
3376 bfd_byte *data;
3377 boolean relocateable;
3378 asymbol **symbols;
3379{
3380 Elf_Internal_Shdr *symtab_hdr;
3381 asection *input_section = link_order->u.indirect.section;
3382 bfd *input_bfd = input_section->owner;
3383 asection **sections = NULL;
3384 Elf_Internal_Rela *internal_relocs = NULL;
3385 Elf32_External_Sym *external_syms = NULL;
3386 Elf_Internal_Sym *internal_syms = NULL;
3387
3388 /* We only need to handle the case of relaxing, or of having a
3389 particular set of section contents, specially. */
3390 if (relocateable
3391 || elf_section_data (input_section)->this_hdr.contents == NULL)
3392 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
3393 link_order, data,
3394 relocateable,
3395 symbols);
3396
3397 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3398
3399 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
3400 input_section->_raw_size);
3401
3402 if ((input_section->flags & SEC_RELOC) != 0
3403 && input_section->reloc_count > 0)
3404 {
3405 Elf_Internal_Sym *isymp;
3406 asection **secpp;
3407 Elf32_External_Sym *esym, *esymend;
3408
3409 if (symtab_hdr->contents != NULL)
3410 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
3411 else
3412 {
3413 external_syms = ((Elf32_External_Sym *)
3414 bfd_malloc (symtab_hdr->sh_info
3415 * sizeof (Elf32_External_Sym)));
3416 if (external_syms == NULL && symtab_hdr->sh_info > 0)
3417 goto error_return;
3418 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
3419 || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
3420 symtab_hdr->sh_info, input_bfd)
3421 != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
3422 goto error_return;
3423 }
3424
3425 internal_relocs = (_bfd_elf32_link_read_relocs
3426 (input_bfd, input_section, (PTR) NULL,
3427 (Elf_Internal_Rela *) NULL, false));
3428 if (internal_relocs == NULL)
3429 goto error_return;
3430
3431 internal_syms = ((Elf_Internal_Sym *)
3432 bfd_malloc (symtab_hdr->sh_info
3433 * sizeof (Elf_Internal_Sym)));
3434 if (internal_syms == NULL && symtab_hdr->sh_info > 0)
3435 goto error_return;
3436
3437 sections = (asection **) bfd_malloc (symtab_hdr->sh_info
3438 * sizeof (asection *));
3439 if (sections == NULL && symtab_hdr->sh_info > 0)
3440 goto error_return;
3441
3442 isymp = internal_syms;
3443 secpp = sections;
3444 esym = external_syms;
3445 esymend = esym + symtab_hdr->sh_info;
3446 for (; esym < esymend; ++esym, ++isymp, ++secpp)
3447 {
3448 asection *isec;
3449
3450 bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
3451
3452 if (isymp->st_shndx == SHN_UNDEF)
3453 isec = bfd_und_section_ptr;
3454 else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
3455 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
3456 else if (isymp->st_shndx == SHN_ABS)
3457 isec = bfd_abs_section_ptr;
3458 else if (isymp->st_shndx == SHN_COMMON)
3459 isec = bfd_com_section_ptr;
3460 else
3461 {
3462 /* Who knows? */
3463 isec = NULL;
3464 }
3465
3466 *secpp = isec;
3467 }
3468
3469 if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
3470 input_section, data, internal_relocs,
3471 internal_syms, sections))
3472 goto error_return;
3473
3474 if (sections != NULL)
3475 free (sections);
3476 sections = NULL;
3477 if (internal_syms != NULL)
3478 free (internal_syms);
3479 internal_syms = NULL;
3480 if (external_syms != NULL && symtab_hdr->contents == NULL)
3481 free (external_syms);
3482 external_syms = NULL;
3483 if (internal_relocs != elf_section_data (input_section)->relocs)
3484 free (internal_relocs);
3485 internal_relocs = NULL;
3486 }
3487
3488 return data;
3489
3490 error_return:
3491 if (internal_relocs != NULL
3492 && internal_relocs != elf_section_data (input_section)->relocs)
3493 free (internal_relocs);
3494 if (external_syms != NULL && symtab_hdr->contents == NULL)
3495 free (external_syms);
3496 if (internal_syms != NULL)
3497 free (internal_syms);
3498 if (sections != NULL)
3499 free (sections);
3500 return NULL;
3501}
3502static asection *
3503sh_elf_gc_mark_hook (abfd, info, rel, h, sym)
3504 bfd *abfd;
5f771d47 3505 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
3506 Elf_Internal_Rela *rel;
3507 struct elf_link_hash_entry *h;
3508 Elf_Internal_Sym *sym;
3509{
3510 if (h != NULL)
3511 {
3512 switch (ELF32_R_TYPE (rel->r_info))
3513 {
3514 case R_SH_GNU_VTINHERIT:
3515 case R_SH_GNU_VTENTRY:
3516 break;
3517
3518 default:
3519 switch (h->root.type)
3520 {
3521 case bfd_link_hash_defined:
3522 case bfd_link_hash_defweak:
3523 return h->root.u.def.section;
3524
3525 case bfd_link_hash_common:
3526 return h->root.u.c.p->section;
e049a0de
ILT
3527
3528 default:
3529 break;
252b5132
RH
3530 }
3531 }
3532 }
3533 else
3534 {
3535 if (!(elf_bad_symtab (abfd)
3536 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
3537 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
3538 && sym->st_shndx != SHN_COMMON))
3539 {
3540 return bfd_section_from_elf_index (abfd, sym->st_shndx);
3541 }
3542 }
3543 return NULL;
3544}
3545
37c644f2
AO
3546/* Update the got entry reference counts for the section being removed. */
3547
252b5132
RH
3548static boolean
3549sh_elf_gc_sweep_hook (abfd, info, sec, relocs)
5f771d47
ILT
3550 bfd *abfd ATTRIBUTE_UNUSED;
3551 struct bfd_link_info *info ATTRIBUTE_UNUSED;
3552 asection *sec ATTRIBUTE_UNUSED;
3553 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
252b5132 3554{
37c644f2
AO
3555 /* We use got and plt entries for sh, but it would seem that the
3556 existing SH code does no sort of reference counting or whatnot on
3557 its GOT and PLT entries, so it is not possible to garbage collect
3558 them at this time. */
252b5132
RH
3559 return true;
3560}
3561
3562/* Look through the relocs for a section during the first phase.
3563 Since we don't do .gots or .plts, we just need to consider the
3564 virtual table relocs for gc. */
3565
3566static boolean
3567sh_elf_check_relocs (abfd, info, sec, relocs)
3568 bfd *abfd;
3569 struct bfd_link_info *info;
3570 asection *sec;
3571 const Elf_Internal_Rela *relocs;
3572{
3573 Elf_Internal_Shdr *symtab_hdr;
3574 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
3575 const Elf_Internal_Rela *rel;
3576 const Elf_Internal_Rela *rel_end;
37c644f2
AO
3577 bfd *dynobj;
3578 bfd_vma *local_got_offsets;
3579 asection *sgot;
3580 asection *srelgot;
3581 asection *sreloc;
3582
3583 sgot = NULL;
3584 srelgot = NULL;
3585 sreloc = NULL;
3586
252b5132
RH
3587
3588 if (info->relocateable)
3589 return true;
3590
3591 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3592 sym_hashes = elf_sym_hashes (abfd);
3593 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
3594 if (!elf_bad_symtab (abfd))
3595 sym_hashes_end -= symtab_hdr->sh_info;
3596
37c644f2
AO
3597 dynobj = elf_hash_table (info)->dynobj;
3598 local_got_offsets = elf_local_got_offsets (abfd);
3599
252b5132
RH
3600 rel_end = relocs + sec->reloc_count;
3601 for (rel = relocs; rel < rel_end; rel++)
3602 {
3603 struct elf_link_hash_entry *h;
3604 unsigned long r_symndx;
3605
3606 r_symndx = ELF32_R_SYM (rel->r_info);
3607 if (r_symndx < symtab_hdr->sh_info)
3608 h = NULL;
3609 else
3610 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3611
37c644f2
AO
3612 /* Some relocs require a global offset table. */
3613 if (dynobj == NULL)
3614 {
3615 switch (ELF32_R_TYPE (rel->r_info))
3616 {
3617 case R_SH_GOT32:
3618 case R_SH_GOTOFF:
3619 case R_SH_GOTPC:
3620 elf_hash_table (info)->dynobj = dynobj = abfd;
3621 if (! _bfd_elf_create_got_section (dynobj, info))
3622 return false;
3623 break;
3624
3625 default:
3626 break;
3627 }
3628 }
3629
252b5132
RH
3630 switch (ELF32_R_TYPE (rel->r_info))
3631 {
3632 /* This relocation describes the C++ object vtable hierarchy.
3633 Reconstruct it for later use during GC. */
3634 case R_SH_GNU_VTINHERIT:
3635 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3636 return false;
3637 break;
3638
3639 /* This relocation describes which C++ vtable entries are actually
3640 used. Record for later use during GC. */
3641 case R_SH_GNU_VTENTRY:
3642 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3643 return false;
3644 break;
37c644f2
AO
3645
3646 case R_SH_GOT32:
3647 /* This symbol requires a global offset table entry. */
3648
3649 if (sgot == NULL)
3650 {
3651 sgot = bfd_get_section_by_name (dynobj, ".got");
3652 BFD_ASSERT (sgot != NULL);
3653 }
3654
3655 if (srelgot == NULL
3656 && (h != NULL || info->shared))
3657 {
3658 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3659 if (srelgot == NULL)
3660 {
3661 srelgot = bfd_make_section (dynobj, ".rela.got");
3662 if (srelgot == NULL
3663 || ! bfd_set_section_flags (dynobj, srelgot,
3664 (SEC_ALLOC
3665 | SEC_LOAD
3666 | SEC_HAS_CONTENTS
3667 | SEC_IN_MEMORY
3668 | SEC_LINKER_CREATED
3669 | SEC_READONLY))
3670 || ! bfd_set_section_alignment (dynobj, srelgot, 2))
3671 return false;
3672 }
3673 }
3674
3675 if (h != NULL)
3676 {
3677 if (h->got.offset != (bfd_vma) -1)
3678 {
3679 /* We have already allocated space in the .got. */
3680 break;
3681 }
3682 h->got.offset = sgot->_raw_size;
3683
3684 /* Make sure this symbol is output as a dynamic symbol. */
3685 if (h->dynindx == -1)
3686 {
3687 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
3688 return false;
3689 }
3690
3691 srelgot->_raw_size += sizeof (Elf32_External_Rela);
3692 }
3693 else
3694 {
3695 /* This is a global offset table entry for a local
3696 symbol. */
3697 if (local_got_offsets == NULL)
3698 {
3699 size_t size;
3700 register unsigned int i;
3701
3702 size = symtab_hdr->sh_info * sizeof (bfd_vma);
3703 local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
3704 if (local_got_offsets == NULL)
3705 return false;
3706 elf_local_got_offsets (abfd) = local_got_offsets;
3707 for (i = 0; i < symtab_hdr->sh_info; i++)
3708 local_got_offsets[i] = (bfd_vma) -1;
3709 }
3710 if (local_got_offsets[r_symndx] != (bfd_vma) -1)
3711 {
3712 /* We have already allocated space in the .got. */
3713 break;
3714 }
3715 local_got_offsets[r_symndx] = sgot->_raw_size;
3716
3717 if (info->shared)
3718 {
3719 /* If we are generating a shared object, we need to
3720 output a R_SH_RELATIVE reloc so that the dynamic
3721 linker can adjust this GOT entry. */
3722 srelgot->_raw_size += sizeof (Elf32_External_Rela);
3723 }
3724 }
3725
3726 sgot->_raw_size += 4;
3727
3728 break;
3729
3730 case R_SH_PLT32:
3731 /* This symbol requires a procedure linkage table entry. We
3732 actually build the entry in adjust_dynamic_symbol,
3733 because this might be a case of linking PIC code which is
3734 never referenced by a dynamic object, in which case we
3735 don't need to generate a procedure linkage table entry
3736 after all. */
3737
3738 /* If this is a local symbol, we resolve it directly without
3739 creating a procedure linkage table entry. */
3740 if (h == NULL)
3741 continue;
3742
3743 if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
3744 || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
3745 break;
3746
3747 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
3748
3749 break;
3750
3751 case R_SH_DIR32:
3752 case R_SH_REL32:
3753 if (h != NULL)
3754 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
3755
3756 /* If we are creating a shared library, and this is a reloc
3757 against a global symbol, or a non PC relative reloc
3758 against a local symbol, then we need to copy the reloc
3759 into the shared library. However, if we are linking with
3760 -Bsymbolic, we do not need to copy a reloc against a
3761 global symbol which is defined in an object we are
3762 including in the link (i.e., DEF_REGULAR is set). At
3763 this point we have not seen all the input files, so it is
3764 possible that DEF_REGULAR is not set now but will be set
3765 later (it is never cleared). We account for that
3766 possibility below by storing information in the
3767 pcrel_relocs_copied field of the hash table entry. */
3768 if (info->shared
3769 && (sec->flags & SEC_ALLOC) != 0
3770 && (ELF32_R_TYPE (rel->r_info) != R_SH_REL32
3771 || (h != NULL
3772 && (! info->symbolic
3773 || (h->elf_link_hash_flags
3774 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
3775 {
3776 /* When creating a shared object, we must copy these
3777 reloc types into the output file. We create a reloc
3778 section in dynobj and make room for this reloc. */
3779 if (sreloc == NULL)
3780 {
3781 const char *name;
3782
3783 name = (bfd_elf_string_from_elf_section
3784 (abfd,
3785 elf_elfheader (abfd)->e_shstrndx,
3786 elf_section_data (sec)->rel_hdr.sh_name));
3787 if (name == NULL)
3788 return false;
3789
3790 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
3791 && strcmp (bfd_get_section_name (abfd, sec),
3792 name + 5) == 0);
3793
3794 sreloc = bfd_get_section_by_name (dynobj, name);
3795 if (sreloc == NULL)
3796 {
3797 flagword flags;
3798
3799 sreloc = bfd_make_section (dynobj, name);
3800 flags = (SEC_HAS_CONTENTS | SEC_READONLY
3801 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3802 if ((sec->flags & SEC_ALLOC) != 0)
3803 flags |= SEC_ALLOC | SEC_LOAD;
3804 if (sreloc == NULL
3805 || ! bfd_set_section_flags (dynobj, sreloc, flags)
3806 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
3807 return false;
3808 }
3809 }
3810
3811 sreloc->_raw_size += sizeof (Elf32_External_Rela);
3812
3813 /* If we are linking with -Bsymbolic, and this is a
3814 global symbol, we count the number of PC relative
3815 relocations we have entered for this symbol, so that
3816 we can discard them again if the symbol is later
3817 defined by a regular object. Note that this function
3818 is only called if we are using an elf_sh linker
3819 hash table, which means that h is really a pointer to
3820 an elf_sh_link_hash_entry. */
3821 if (h != NULL && info->symbolic
3822 && ELF32_R_TYPE (rel->r_info) == R_SH_REL32)
3823 {
3824 struct elf_sh_link_hash_entry *eh;
3825 struct elf_sh_pcrel_relocs_copied *p;
3826
3827 eh = (struct elf_sh_link_hash_entry *) h;
3828
3829 for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
3830 if (p->section == sreloc)
3831 break;
3832
3833 if (p == NULL)
3834 {
3835 p = ((struct elf_sh_pcrel_relocs_copied *)
3836 bfd_alloc (dynobj, sizeof *p));
3837 if (p == NULL)
3838 return false;
3839 p->next = eh->pcrel_relocs_copied;
3840 eh->pcrel_relocs_copied = p;
3841 p->section = sreloc;
3842 p->count = 0;
3843 }
3844
3845 ++p->count;
3846 }
3847 }
3848
3849 break;
252b5132
RH
3850 }
3851 }
3852
3853 return true;
3854}
3855
1630fd2b 3856static boolean
d4845d57
JR
3857sh_elf_set_mach_from_flags (abfd)
3858 bfd * abfd;
3859{
3860 flagword flags = elf_elfheader (abfd)->e_flags;
3861
86033394 3862 switch (flags & EF_SH_MACH_MASK)
d4845d57
JR
3863 {
3864 case EF_SH1:
3865 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh);
3866 break;
3867 case EF_SH2:
3868 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh2);
3869 break;
3870 case EF_SH_DSP:
3871 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh_dsp);
3872 break;
3873 case EF_SH3:
3874 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3);
3875 break;
3876 case EF_SH3_DSP:
3877 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3_dsp);
3878 break;
3879 case EF_SH3E:
3880 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3e);
3881 break;
3882 case EF_SH_UNKNOWN:
3883 case EF_SH4:
3884 bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh4);
3885 break;
3886 default:
3887 return false;
3888 }
3889 return true;
3890}
3891
3892/* Function to keep SH specific file flags. */
3893static boolean
3894sh_elf_set_private_flags (abfd, flags)
3895 bfd * abfd;
3896 flagword flags;
3897{
3898 BFD_ASSERT (! elf_flags_init (abfd)
3899 || elf_elfheader (abfd)->e_flags == flags);
3900
3901 elf_elfheader (abfd)->e_flags = flags;
3902 elf_flags_init (abfd) = true;
3903 return sh_elf_set_mach_from_flags (abfd);
3904}
3905
3906/* Copy backend specific data from one object module to another */
3907static boolean
3908sh_elf_copy_private_data (ibfd, obfd)
3909 bfd * ibfd;
3910 bfd * obfd;
3911{
3912 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3913 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3914 return true;
3915
3916 return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
3917}
3918
3919/* This routine checks for linking big and little endian objects
3920 together, and for linking sh-dsp with sh3e / sh4 objects. */
3921
3922static boolean
3923sh_elf_merge_private_data (ibfd, obfd)
3924 bfd *ibfd;
3925 bfd *obfd;
3926{
3927 flagword old_flags, new_flags;
3928
3929 if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
3930 return false;
3931
3932 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3933 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3934 return true;
3935
3936 if (! elf_flags_init (obfd))
3937 {
a39b79b9 3938 /* This happens when ld starts out with a 'blank' output file. */
d4845d57 3939 elf_flags_init (obfd) = true;
a39b79b9 3940 elf_elfheader (obfd)->e_flags = EF_SH1;
d4845d57
JR
3941 }
3942 old_flags = elf_elfheader (obfd)->e_flags;
3943 new_flags = elf_elfheader (ibfd)->e_flags;
3944 if ((EF_SH_HAS_DSP (old_flags) && EF_SH_HAS_FP (new_flags))
3945 || (EF_SH_HAS_DSP (new_flags) && EF_SH_HAS_FP (old_flags)))
3946 {
3947 (*_bfd_error_handler)
3948 ("%s: uses %s instructions while previous modules use %s instructions",
3949 bfd_get_filename (ibfd),
3950 EF_SH_HAS_DSP (new_flags) ? "dsp" : "floating point",
3951 EF_SH_HAS_DSP (new_flags) ? "floating point" : "dsp");
3952 bfd_set_error (bfd_error_bad_value);
3953 return false;
3954 }
3955 elf_elfheader (obfd)->e_flags = EF_SH_MERGE_MACH (old_flags, new_flags);
3956
3957 return sh_elf_set_mach_from_flags (obfd);
3958}
3959
37c644f2
AO
3960/* Finish up dynamic symbol handling. We set the contents of various
3961 dynamic sections here. */
3962
3963static boolean
3964sh_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
3965 bfd *output_bfd;
3966 struct bfd_link_info *info;
3967 struct elf_link_hash_entry *h;
3968 Elf_Internal_Sym *sym;
3969{
3970 bfd *dynobj;
3971
3972 dynobj = elf_hash_table (info)->dynobj;
3973
3974 if (h->plt.offset != (bfd_vma) -1)
3975 {
3976 asection *splt;
3977 asection *sgot;
3978 asection *srel;
3979
3980 bfd_vma plt_index;
3981 bfd_vma got_offset;
3982 Elf_Internal_Rela rel;
3983
3984 /* This symbol has an entry in the procedure linkage table. Set
3985 it up. */
3986
3987 BFD_ASSERT (h->dynindx != -1);
3988
3989 splt = bfd_get_section_by_name (dynobj, ".plt");
3990 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3991 srel = bfd_get_section_by_name (dynobj, ".rela.plt");
3992 BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
3993
3994 /* Get the index in the procedure linkage table which
3995 corresponds to this symbol. This is the index of this symbol
3996 in all the symbols for which we are making plt entries. The
3997 first entry in the procedure linkage table is reserved. */
3998 plt_index = h->plt.offset / elf_sh_sizeof_plt (info) - 1;
3999
4000 /* Get the offset into the .got table of the entry that
4001 corresponds to this function. Each .got entry is 4 bytes.
4002 The first three are reserved. */
4003 got_offset = (plt_index + 3) * 4;
4004
4005 /* Fill in the entry in the procedure linkage table. */
4006 if (! info->shared)
4007 {
4008 if (elf_sh_plt_entry == NULL)
4009 {
4010 elf_sh_plt_entry = (bfd_big_endian (output_bfd)?
4011 elf_sh_plt_entry_be : elf_sh_plt_entry_le);
4012 }
4013 memcpy (splt->contents + h->plt.offset, elf_sh_plt_entry,
4014 elf_sh_sizeof_plt (info));
4015 bfd_put_32 (output_bfd,
4016 (sgot->output_section->vma
4017 + sgot->output_offset
4018 + got_offset),
4019 (splt->contents + h->plt.offset
4020 + elf_sh_plt_symbol_offset (info)));
4021
4022 bfd_put_32 (output_bfd,
4023 (splt->output_section->vma + splt->output_offset),
4024 (splt->contents + h->plt.offset
4025 + elf_sh_plt_plt0_offset (info)));
4026 }
4027 else
4028 {
4029 if (elf_sh_pic_plt_entry == NULL)
4030 {
4031 elf_sh_pic_plt_entry = (bfd_big_endian (output_bfd)?
4032 elf_sh_pic_plt_entry_be :
4033 elf_sh_pic_plt_entry_le);
4034 }
4035 memcpy (splt->contents + h->plt.offset, elf_sh_pic_plt_entry,
4036 elf_sh_sizeof_plt (info));
4037 bfd_put_32 (output_bfd, got_offset,
4038 (splt->contents + h->plt.offset
4039 + elf_sh_plt_symbol_offset (info)));
4040 }
4041
4042 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
4043 (splt->contents + h->plt.offset
4044 + elf_sh_plt_reloc_offset (info)));
4045
4046 /* Fill in the entry in the global offset table. */
4047 bfd_put_32 (output_bfd,
4048 (splt->output_section->vma
4049 + splt->output_offset
4050 + h->plt.offset
4051 + elf_sh_plt_temp_offset (info)),
4052 sgot->contents + got_offset);
4053
4054 /* Fill in the entry in the .rela.plt section. */
4055 rel.r_offset = (sgot->output_section->vma
4056 + sgot->output_offset
4057 + got_offset);
4058 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_JMP_SLOT);
4059 rel.r_addend = 0;
4060 bfd_elf32_swap_reloca_out (output_bfd, &rel,
4061 ((Elf32_External_Rela *) srel->contents
4062 + plt_index));
4063
4064 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
4065 {
4066 /* Mark the symbol as undefined, rather than as defined in
4067 the .plt section. Leave the value alone. */
4068 sym->st_shndx = SHN_UNDEF;
4069 }
4070 }
4071
4072 if (h->got.offset != (bfd_vma) -1)
4073 {
4074 asection *sgot;
4075 asection *srel;
4076 Elf_Internal_Rela rel;
4077
4078 /* This symbol has an entry in the global offset table. Set it
4079 up. */
4080
4081 sgot = bfd_get_section_by_name (dynobj, ".got");
4082 srel = bfd_get_section_by_name (dynobj, ".rela.got");
4083 BFD_ASSERT (sgot != NULL && srel != NULL);
4084
4085 rel.r_offset = (sgot->output_section->vma
4086 + sgot->output_offset
4087 + (h->got.offset &~ 1));
4088
4089 /* If this is a -Bsymbolic link, and the symbol is defined
4090 locally, we just want to emit a RELATIVE reloc. Likewise if
4091 the symbol was forced to be local because of a version file.
4092 The entry in the global offset table will already have been
4093 initialized in the relocate_section function. */
4094 if (info->shared
4095 && (info->symbolic || h->dynindx == -1)
4096 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
4097 {
4098 rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
4099 rel.r_addend = (h->root.u.def.value
4100 + h->root.u.def.section->output_section->vma
4101 + h->root.u.def.section->output_offset);
4102 }
4103 else
4104 {
4105 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
4106 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
4107 rel.r_addend = 0;
4108 }
4109
4110 bfd_elf32_swap_reloca_out (output_bfd, &rel,
4111 ((Elf32_External_Rela *) srel->contents
4112 + srel->reloc_count));
4113 ++srel->reloc_count;
4114 }
4115
4116 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
4117 {
4118 asection *s;
4119 Elf_Internal_Rela rel;
4120
4121 /* This symbol needs a copy reloc. Set it up. */
4122
4123 BFD_ASSERT (h->dynindx != -1
4124 && (h->root.type == bfd_link_hash_defined
4125 || h->root.type == bfd_link_hash_defweak));
4126
4127 s = bfd_get_section_by_name (h->root.u.def.section->owner,
4128 ".rela.bss");
4129 BFD_ASSERT (s != NULL);
4130
4131 rel.r_offset = (h->root.u.def.value
4132 + h->root.u.def.section->output_section->vma
4133 + h->root.u.def.section->output_offset);
4134 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_COPY);
4135 rel.r_addend = 0;
4136 bfd_elf32_swap_reloca_out (output_bfd, &rel,
4137 ((Elf32_External_Rela *) s->contents
4138 + s->reloc_count));
4139 ++s->reloc_count;
4140 }
4141
4142 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
4143 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4144 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
4145 sym->st_shndx = SHN_ABS;
4146
4147 return true;
4148}
4149
4150/* Finish up the dynamic sections. */
4151
4152static boolean
4153sh_elf_finish_dynamic_sections (output_bfd, info)
4154 bfd *output_bfd;
4155 struct bfd_link_info *info;
4156{
4157 bfd *dynobj;
4158 asection *sgot;
4159 asection *sdyn;
4160
4161 dynobj = elf_hash_table (info)->dynobj;
4162
4163 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
4164 BFD_ASSERT (sgot != NULL);
4165 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4166
4167 if (elf_hash_table (info)->dynamic_sections_created)
4168 {
4169 asection *splt;
4170 Elf32_External_Dyn *dyncon, *dynconend;
4171
4172 BFD_ASSERT (sdyn != NULL);
4173
4174 dyncon = (Elf32_External_Dyn *) sdyn->contents;
4175 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
4176 for (; dyncon < dynconend; dyncon++)
4177 {
4178 Elf_Internal_Dyn dyn;
4179 const char *name;
4180 asection *s;
4181
4182 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4183
4184 switch (dyn.d_tag)
4185 {
4186 default:
4187 break;
4188
4189 case DT_PLTGOT:
4190 name = ".got";
4191 goto get_vma;
4192
4193 case DT_JMPREL:
4194 name = ".rela.plt";
4195 get_vma:
4196 s = bfd_get_section_by_name (output_bfd, name);
4197 BFD_ASSERT (s != NULL);
4198 dyn.d_un.d_ptr = s->vma;
4199 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4200 break;
4201
4202 case DT_PLTRELSZ:
4203 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
4204 BFD_ASSERT (s != NULL);
4205 if (s->_cooked_size != 0)
4206 dyn.d_un.d_val = s->_cooked_size;
4207 else
4208 dyn.d_un.d_val = s->_raw_size;
4209 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4210 break;
4211
4212 case DT_RELASZ:
4213 /* My reading of the SVR4 ABI indicates that the
4214 procedure linkage table relocs (DT_JMPREL) should be
4215 included in the overall relocs (DT_RELA). This is
4216 what Solaris does. However, UnixWare can not handle
4217 that case. Therefore, we override the DT_RELASZ entry
4218 here to make it not include the JMPREL relocs. Since
4219 the linker script arranges for .rela.plt to follow all
4220 other relocation sections, we don't have to worry
4221 about changing the DT_RELA entry. */
4222 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
4223 if (s != NULL)
4224 {
4225 if (s->_cooked_size != 0)
4226 dyn.d_un.d_val -= s->_cooked_size;
4227 else
4228 dyn.d_un.d_val -= s->_raw_size;
4229 }
4230 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4231 break;
4232 }
4233 }
4234
4235 /* Fill in the first entry in the procedure linkage table. */
4236 splt = bfd_get_section_by_name (dynobj, ".plt");
4237 if (splt && splt->_raw_size > 0)
4238 {
4239 if (info->shared)
4240 {
4241 if (elf_sh_pic_plt_entry == NULL)
4242 {
4243 elf_sh_pic_plt_entry = (bfd_big_endian (output_bfd)?
4244 elf_sh_pic_plt_entry_be :
4245 elf_sh_pic_plt_entry_le);
4246 }
4247 memcpy (splt->contents, elf_sh_pic_plt_entry,
4248 elf_sh_sizeof_plt (info));
4249 }
4250 else
4251 {
4252 if (elf_sh_plt0_entry == NULL)
4253 {
4254 elf_sh_plt0_entry = (bfd_big_endian (output_bfd)?
4255 elf_sh_plt0_entry_be :
4256 elf_sh_plt0_entry_le);
4257 }
4258 memcpy (splt->contents, elf_sh_plt0_entry, PLT_ENTRY_SIZE);
4259 bfd_put_32 (output_bfd,
4260 sgot->output_section->vma + sgot->output_offset + 4,
4261 splt->contents + elf_sh_plt0_gotid_offset (info));
4262 bfd_put_32 (output_bfd,
4263 sgot->output_section->vma + sgot->output_offset + 8,
4264 splt->contents + elf_sh_plt0_linker_offset (info));
4265 }
4266
4267 /* UnixWare sets the entsize of .plt to 4, although that doesn't
4268 really seem like the right value. */
4269 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
4270 }
4271 }
4272
4273 /* Fill in the first three entries in the global offset table. */
4274 if (sgot->_raw_size > 0)
4275 {
4276 if (sdyn == NULL)
4277 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
4278 else
4279 bfd_put_32 (output_bfd,
4280 sdyn->output_section->vma + sdyn->output_offset,
4281 sgot->contents);
4282 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
4283 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
4284 }
4285
4286 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
4287
4288 return true;
4289}
4290
b129bfef 4291#ifndef ELF_ARCH
252b5132
RH
4292#define TARGET_BIG_SYM bfd_elf32_sh_vec
4293#define TARGET_BIG_NAME "elf32-sh"
4294#define TARGET_LITTLE_SYM bfd_elf32_shl_vec
4295#define TARGET_LITTLE_NAME "elf32-shl"
4296#define ELF_ARCH bfd_arch_sh
4297#define ELF_MACHINE_CODE EM_SH
4bb5e078 4298#define ELF_MAXPAGESIZE 128
252b5132
RH
4299
4300#define elf_symbol_leading_char '_'
b129bfef 4301#endif /* ELF_ARCH */
252b5132
RH
4302
4303#define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
4304#define elf_info_to_howto sh_elf_info_to_howto
4305#define bfd_elf32_bfd_relax_section sh_elf_relax_section
4306#define elf_backend_relocate_section sh_elf_relocate_section
4307#define bfd_elf32_bfd_get_relocated_section_contents \
4308 sh_elf_get_relocated_section_contents
d4845d57
JR
4309#define elf_backend_object_p sh_elf_set_mach_from_flags
4310#define bfd_elf32_bfd_set_private_bfd_flags \
4311 sh_elf_set_private_flags
4312#define bfd_elf32_bfd_copy_private_bfd_data \
4313 sh_elf_copy_private_data
875f7f69 4314#define bfd_elf32_bfd_merge_private_bfd_data \
d4845d57 4315 sh_elf_merge_private_data
252b5132
RH
4316
4317#define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
4318#define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
4319#define elf_backend_check_relocs sh_elf_check_relocs
4320
37c644f2
AO
4321#define elf_backend_can_gc_sections 1
4322#define elf_backend_create_dynamic_sections \
4323 sh_elf_create_dynamic_sections
4324#define bfd_elf32_bfd_link_hash_table_create \
4325 sh_elf_link_hash_table_create
4326#define elf_backend_adjust_dynamic_symbol \
4327 sh_elf_adjust_dynamic_symbol
4328#define elf_backend_size_dynamic_sections \
4329 sh_elf_size_dynamic_sections
4330#define elf_backend_finish_dynamic_symbol \
4331 sh_elf_finish_dynamic_symbol
4332#define elf_backend_finish_dynamic_sections \
4333 sh_elf_finish_dynamic_sections
4334
4335#define elf_backend_want_got_plt 1
4336#define elf_backend_plt_readonly 1
4337#define elf_backend_want_plt_sym 0
4338#define elf_backend_got_header_size 12
4339#define elf_backend_plt_header_size PLT_ENTRY_SIZE
252b5132 4340#include "elf32-target.h"
This page took 0.243351 seconds and 4 git commands to generate.