elf32-sh.c revision 1.3 1 1.1 skrll /* Renesas / SuperH SH specific support for 32-bit ELF
2 1.1 skrll Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 1.3 christos 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4 1.1 skrll Contributed by Ian Lance Taylor, Cygnus Support.
5 1.1 skrll
6 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
7 1.1 skrll
8 1.1 skrll This program is free software; you can redistribute it and/or modify
9 1.1 skrll it under the terms of the GNU General Public License as published by
10 1.1 skrll the Free Software Foundation; either version 3 of the License, or
11 1.1 skrll (at your option) any later version.
12 1.1 skrll
13 1.1 skrll This program is distributed in the hope that it will be useful,
14 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 skrll GNU General Public License for more details.
17 1.1 skrll
18 1.1 skrll You should have received a copy of the GNU General Public License
19 1.1 skrll along with this program; if not, write to the Free Software
20 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 1.1 skrll MA 02110-1301, USA. */
22 1.1 skrll
23 1.1 skrll #include "sysdep.h"
24 1.1 skrll #include "bfd.h"
25 1.1 skrll #include "bfdlink.h"
26 1.1 skrll #include "libbfd.h"
27 1.1 skrll #include "elf-bfd.h"
28 1.1 skrll #include "elf-vxworks.h"
29 1.1 skrll #include "elf/sh.h"
30 1.3 christos #include "dwarf2.h"
31 1.1 skrll #include "libiberty.h"
32 1.1 skrll #include "../opcodes/sh-opc.h"
33 1.1 skrll
34 1.1 skrll static bfd_reloc_status_type sh_elf_reloc
35 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
36 1.1 skrll static bfd_reloc_status_type sh_elf_ignore_reloc
37 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
38 1.1 skrll static bfd_boolean sh_elf_relax_delete_bytes
39 1.1 skrll (bfd *, asection *, bfd_vma, int);
40 1.1 skrll static bfd_boolean sh_elf_align_loads
41 1.1 skrll (bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_boolean *);
42 1.1 skrll #ifndef SH64_ELF
43 1.1 skrll static bfd_boolean sh_elf_swap_insns
44 1.1 skrll (bfd *, asection *, void *, bfd_byte *, bfd_vma);
45 1.1 skrll #endif
46 1.1 skrll static int sh_elf_optimized_tls_reloc
47 1.1 skrll (struct bfd_link_info *, int, int);
48 1.1 skrll static bfd_vma dtpoff_base
49 1.1 skrll (struct bfd_link_info *);
50 1.1 skrll static bfd_vma tpoff
51 1.1 skrll (struct bfd_link_info *, bfd_vma);
52 1.1 skrll
53 1.1 skrll /* The name of the dynamic interpreter. This is put in the .interp
54 1.1 skrll section. */
55 1.1 skrll
56 1.1 skrll #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
57 1.1 skrll
58 1.3 christos /* FDPIC binaries have a default 128K stack. */
59 1.3 christos #define DEFAULT_STACK_SIZE 0x20000
60 1.3 christos
61 1.1 skrll #define MINUS_ONE ((bfd_vma) 0 - 1)
62 1.3 christos
63 1.3 christos /* Decide whether a reference to a symbol can be resolved locally or
64 1.3 christos not. If the symbol is protected, we want the local address, but
65 1.3 christos its function descriptor must be assigned by the dynamic linker. */
66 1.3 christos #define SYMBOL_FUNCDESC_LOCAL(INFO, H) \
67 1.3 christos (SYMBOL_REFERENCES_LOCAL (INFO, H) \
68 1.3 christos || ! elf_hash_table (INFO)->dynamic_sections_created)
69 1.1 skrll
70 1.1 skrll #define SH_PARTIAL32 TRUE
72 1.1 skrll #define SH_SRC_MASK32 0xffffffff
73 1.1 skrll #define SH_ELF_RELOC sh_elf_reloc
74 1.1 skrll static reloc_howto_type sh_elf_howto_table[] =
75 1.1 skrll {
76 1.1 skrll #include "elf32-sh-relocs.h"
77 1.1 skrll };
78 1.1 skrll
79 1.1 skrll #define SH_PARTIAL32 FALSE
80 1.1 skrll #define SH_SRC_MASK32 0
81 1.1 skrll #define SH_ELF_RELOC bfd_elf_generic_reloc
82 1.1 skrll static reloc_howto_type sh_vxworks_howto_table[] =
83 1.1 skrll {
84 1.1 skrll #include "elf32-sh-relocs.h"
85 1.1 skrll };
86 1.1 skrll
87 1.1 skrll /* Return true if OUTPUT_BFD is a VxWorks object. */
89 1.1 skrll
90 1.1 skrll static bfd_boolean
91 1.1 skrll vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED)
92 1.1 skrll {
93 1.1 skrll #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
94 1.1 skrll extern const bfd_target bfd_elf32_shlvxworks_vec;
95 1.1 skrll extern const bfd_target bfd_elf32_shvxworks_vec;
96 1.1 skrll
97 1.1 skrll return (abfd->xvec == &bfd_elf32_shlvxworks_vec
98 1.1 skrll || abfd->xvec == &bfd_elf32_shvxworks_vec);
99 1.1 skrll #else
100 1.1 skrll return FALSE;
101 1.1 skrll #endif
102 1.3 christos }
103 1.3 christos
104 1.3 christos /* Return true if OUTPUT_BFD is an FDPIC object. */
105 1.3 christos
106 1.3 christos static bfd_boolean
107 1.3 christos fdpic_object_p (bfd *abfd ATTRIBUTE_UNUSED)
108 1.3 christos {
109 1.3 christos #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
110 1.3 christos extern const bfd_target bfd_elf32_shfd_vec;
111 1.3 christos extern const bfd_target bfd_elf32_shbfd_vec;
112 1.3 christos
113 1.3 christos return (abfd->xvec == &bfd_elf32_shfd_vec
114 1.3 christos || abfd->xvec == &bfd_elf32_shbfd_vec);
115 1.3 christos #else
116 1.3 christos return FALSE;
117 1.3 christos #endif
118 1.1 skrll }
119 1.1 skrll
120 1.1 skrll /* Return the howto table for ABFD. */
121 1.1 skrll
122 1.1 skrll static reloc_howto_type *
123 1.1 skrll get_howto_table (bfd *abfd)
124 1.1 skrll {
125 1.1 skrll if (vxworks_object_p (abfd))
126 1.1 skrll return sh_vxworks_howto_table;
127 1.1 skrll return sh_elf_howto_table;
128 1.1 skrll }
129 1.1 skrll
130 1.1 skrll static bfd_reloc_status_type
131 1.1 skrll sh_elf_reloc_loop (int r_type ATTRIBUTE_UNUSED, bfd *input_bfd,
132 1.1 skrll asection *input_section, bfd_byte *contents,
133 1.1 skrll bfd_vma addr, asection *symbol_section,
134 1.1 skrll bfd_vma start, bfd_vma end)
135 1.1 skrll {
136 1.1 skrll static bfd_vma last_addr;
137 1.1 skrll static asection *last_symbol_section;
138 1.1 skrll bfd_byte *start_ptr, *ptr, *last_ptr;
139 1.1 skrll int diff, cum_diff;
140 1.1 skrll bfd_signed_vma x;
141 1.1 skrll int insn;
142 1.1 skrll
143 1.1 skrll /* Sanity check the address. */
144 1.1 skrll if (addr > bfd_get_section_limit (input_bfd, input_section))
145 1.1 skrll return bfd_reloc_outofrange;
146 1.1 skrll
147 1.1 skrll /* We require the start and end relocations to be processed consecutively -
148 1.1 skrll although we allow then to be processed forwards or backwards. */
149 1.1 skrll if (! last_addr)
150 1.1 skrll {
151 1.1 skrll last_addr = addr;
152 1.1 skrll last_symbol_section = symbol_section;
153 1.1 skrll return bfd_reloc_ok;
154 1.1 skrll }
155 1.1 skrll if (last_addr != addr)
156 1.1 skrll abort ();
157 1.1 skrll last_addr = 0;
158 1.1 skrll
159 1.1 skrll if (! symbol_section || last_symbol_section != symbol_section || end < start)
160 1.1 skrll return bfd_reloc_outofrange;
161 1.1 skrll
162 1.1 skrll /* Get the symbol_section contents. */
163 1.1 skrll if (symbol_section != input_section)
164 1.1 skrll {
165 1.1 skrll if (elf_section_data (symbol_section)->this_hdr.contents != NULL)
166 1.1 skrll contents = elf_section_data (symbol_section)->this_hdr.contents;
167 1.1 skrll else
168 1.1 skrll {
169 1.1 skrll if (!bfd_malloc_and_get_section (input_bfd, symbol_section,
170 1.1 skrll &contents))
171 1.1 skrll {
172 1.1 skrll if (contents != NULL)
173 1.1 skrll free (contents);
174 1.1 skrll return bfd_reloc_outofrange;
175 1.1 skrll }
176 1.1 skrll }
177 1.1 skrll }
178 1.1 skrll #define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
179 1.1 skrll start_ptr = contents + start;
180 1.1 skrll for (cum_diff = -6, ptr = contents + end; cum_diff < 0 && ptr > start_ptr;)
181 1.1 skrll {
182 1.1 skrll for (last_ptr = ptr, ptr -= 4; ptr >= start_ptr && IS_PPI (ptr);)
183 1.1 skrll ptr -= 2;
184 1.1 skrll ptr += 2;
185 1.1 skrll diff = (last_ptr - ptr) >> 1;
186 1.1 skrll cum_diff += diff & 1;
187 1.1 skrll cum_diff += diff;
188 1.1 skrll }
189 1.1 skrll /* Calculate the start / end values to load into rs / re minus four -
190 1.1 skrll so that will cancel out the four we would otherwise have to add to
191 1.1 skrll addr to get the value to subtract in order to get relative addressing. */
192 1.1 skrll if (cum_diff >= 0)
193 1.1 skrll {
194 1.1 skrll start -= 4;
195 1.1 skrll end = (ptr + cum_diff * 2) - contents;
196 1.1 skrll }
197 1.1 skrll else
198 1.1 skrll {
199 1.1 skrll bfd_vma start0 = start - 4;
200 1.1 skrll
201 1.1 skrll while (start0 && IS_PPI (contents + start0))
202 1.1 skrll start0 -= 2;
203 1.1 skrll start0 = start - 2 - ((start - start0) & 2);
204 1.1 skrll start = start0 - cum_diff - 2;
205 1.1 skrll end = start0;
206 1.1 skrll }
207 1.1 skrll
208 1.1 skrll if (contents != NULL
209 1.1 skrll && elf_section_data (symbol_section)->this_hdr.contents != contents)
210 1.1 skrll free (contents);
211 1.1 skrll
212 1.1 skrll insn = bfd_get_16 (input_bfd, contents + addr);
213 1.1 skrll
214 1.1 skrll x = (insn & 0x200 ? end : start) - addr;
215 1.1 skrll if (input_section != symbol_section)
216 1.1 skrll x += ((symbol_section->output_section->vma + symbol_section->output_offset)
217 1.1 skrll - (input_section->output_section->vma
218 1.1 skrll + input_section->output_offset));
219 1.1 skrll x >>= 1;
220 1.1 skrll if (x < -128 || x > 127)
221 1.1 skrll return bfd_reloc_overflow;
222 1.1 skrll
223 1.1 skrll x = (insn & ~0xff) | (x & 0xff);
224 1.1 skrll bfd_put_16 (input_bfd, (bfd_vma) x, contents + addr);
225 1.1 skrll
226 1.1 skrll return bfd_reloc_ok;
227 1.1 skrll }
228 1.1 skrll
229 1.1 skrll /* This function is used for normal relocs. This used to be like the COFF
230 1.1 skrll function, and is almost certainly incorrect for other ELF targets. */
231 1.1 skrll
232 1.1 skrll static bfd_reloc_status_type
233 1.1 skrll sh_elf_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in,
234 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
235 1.1 skrll char **error_message ATTRIBUTE_UNUSED)
236 1.1 skrll {
237 1.1 skrll unsigned long insn;
238 1.1 skrll bfd_vma sym_value;
239 1.1 skrll enum elf_sh_reloc_type r_type;
240 1.1 skrll bfd_vma addr = reloc_entry->address;
241 1.1 skrll bfd_byte *hit_data = addr + (bfd_byte *) data;
242 1.1 skrll
243 1.1 skrll r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
244 1.1 skrll
245 1.1 skrll if (output_bfd != NULL)
246 1.1 skrll {
247 1.1 skrll /* Partial linking--do nothing. */
248 1.1 skrll reloc_entry->address += input_section->output_offset;
249 1.1 skrll return bfd_reloc_ok;
250 1.1 skrll }
251 1.1 skrll
252 1.1 skrll /* Almost all relocs have to do with relaxing. If any work must be
253 1.1 skrll done for them, it has been done in sh_relax_section. */
254 1.1 skrll if (r_type == R_SH_IND12W && (symbol_in->flags & BSF_LOCAL) != 0)
255 1.1 skrll return bfd_reloc_ok;
256 1.1 skrll
257 1.1 skrll if (symbol_in != NULL
258 1.1 skrll && bfd_is_und_section (symbol_in->section))
259 1.1 skrll return bfd_reloc_undefined;
260 1.1 skrll
261 1.1 skrll if (bfd_is_com_section (symbol_in->section))
262 1.1 skrll sym_value = 0;
263 1.1 skrll else
264 1.1 skrll sym_value = (symbol_in->value +
265 1.1 skrll symbol_in->section->output_section->vma +
266 1.1 skrll symbol_in->section->output_offset);
267 1.1 skrll
268 1.1 skrll switch (r_type)
269 1.1 skrll {
270 1.1 skrll case R_SH_DIR32:
271 1.1 skrll insn = bfd_get_32 (abfd, hit_data);
272 1.1 skrll insn += sym_value + reloc_entry->addend;
273 1.1 skrll bfd_put_32 (abfd, (bfd_vma) insn, hit_data);
274 1.1 skrll break;
275 1.1 skrll case R_SH_IND12W:
276 1.1 skrll insn = bfd_get_16 (abfd, hit_data);
277 1.1 skrll sym_value += reloc_entry->addend;
278 1.1 skrll sym_value -= (input_section->output_section->vma
279 1.1 skrll + input_section->output_offset
280 1.1 skrll + addr
281 1.1 skrll + 4);
282 1.1 skrll sym_value += (insn & 0xfff) << 1;
283 1.1 skrll if (insn & 0x800)
284 1.1 skrll sym_value -= 0x1000;
285 1.1 skrll insn = (insn & 0xf000) | (sym_value & 0xfff);
286 1.1 skrll bfd_put_16 (abfd, (bfd_vma) insn, hit_data);
287 1.1 skrll if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
288 1.1 skrll return bfd_reloc_overflow;
289 1.1 skrll break;
290 1.1 skrll default:
291 1.1 skrll abort ();
292 1.1 skrll break;
293 1.1 skrll }
294 1.1 skrll
295 1.1 skrll return bfd_reloc_ok;
296 1.1 skrll }
297 1.1 skrll
298 1.1 skrll /* This function is used for relocs which are only used for relaxing,
299 1.1 skrll which the linker should otherwise ignore. */
300 1.1 skrll
301 1.1 skrll static bfd_reloc_status_type
302 1.1 skrll sh_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
303 1.1 skrll asymbol *symbol ATTRIBUTE_UNUSED,
304 1.1 skrll void *data ATTRIBUTE_UNUSED, asection *input_section,
305 1.1 skrll bfd *output_bfd,
306 1.1 skrll char **error_message ATTRIBUTE_UNUSED)
307 1.1 skrll {
308 1.1 skrll if (output_bfd != NULL)
309 1.1 skrll reloc_entry->address += input_section->output_offset;
310 1.1 skrll return bfd_reloc_ok;
311 1.1 skrll }
312 1.1 skrll
313 1.1 skrll /* This structure is used to map BFD reloc codes to SH ELF relocs. */
314 1.1 skrll
315 1.1 skrll struct elf_reloc_map
316 1.1 skrll {
317 1.1 skrll bfd_reloc_code_real_type bfd_reloc_val;
318 1.1 skrll unsigned char elf_reloc_val;
319 1.1 skrll };
320 1.1 skrll
321 1.1 skrll /* An array mapping BFD reloc codes to SH ELF relocs. */
322 1.1 skrll
323 1.1 skrll static const struct elf_reloc_map sh_reloc_map[] =
324 1.1 skrll {
325 1.1 skrll { BFD_RELOC_NONE, R_SH_NONE },
326 1.1 skrll { BFD_RELOC_32, R_SH_DIR32 },
327 1.1 skrll { BFD_RELOC_16, R_SH_DIR16 },
328 1.1 skrll { BFD_RELOC_8, R_SH_DIR8 },
329 1.1 skrll { BFD_RELOC_CTOR, R_SH_DIR32 },
330 1.1 skrll { BFD_RELOC_32_PCREL, R_SH_REL32 },
331 1.1 skrll { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
332 1.1 skrll { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
333 1.1 skrll { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
334 1.1 skrll { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
335 1.1 skrll { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
336 1.1 skrll { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
337 1.1 skrll { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
338 1.1 skrll { BFD_RELOC_SH_USES, R_SH_USES },
339 1.1 skrll { BFD_RELOC_SH_COUNT, R_SH_COUNT },
340 1.1 skrll { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
341 1.1 skrll { BFD_RELOC_SH_CODE, R_SH_CODE },
342 1.1 skrll { BFD_RELOC_SH_DATA, R_SH_DATA },
343 1.1 skrll { BFD_RELOC_SH_LABEL, R_SH_LABEL },
344 1.1 skrll { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
345 1.1 skrll { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
346 1.1 skrll { BFD_RELOC_SH_LOOP_START, R_SH_LOOP_START },
347 1.1 skrll { BFD_RELOC_SH_LOOP_END, R_SH_LOOP_END },
348 1.1 skrll { BFD_RELOC_SH_TLS_GD_32, R_SH_TLS_GD_32 },
349 1.1 skrll { BFD_RELOC_SH_TLS_LD_32, R_SH_TLS_LD_32 },
350 1.1 skrll { BFD_RELOC_SH_TLS_LDO_32, R_SH_TLS_LDO_32 },
351 1.1 skrll { BFD_RELOC_SH_TLS_IE_32, R_SH_TLS_IE_32 },
352 1.1 skrll { BFD_RELOC_SH_TLS_LE_32, R_SH_TLS_LE_32 },
353 1.1 skrll { BFD_RELOC_SH_TLS_DTPMOD32, R_SH_TLS_DTPMOD32 },
354 1.1 skrll { BFD_RELOC_SH_TLS_DTPOFF32, R_SH_TLS_DTPOFF32 },
355 1.1 skrll { BFD_RELOC_SH_TLS_TPOFF32, R_SH_TLS_TPOFF32 },
356 1.1 skrll { BFD_RELOC_32_GOT_PCREL, R_SH_GOT32 },
357 1.1 skrll { BFD_RELOC_32_PLT_PCREL, R_SH_PLT32 },
358 1.1 skrll { BFD_RELOC_SH_COPY, R_SH_COPY },
359 1.1 skrll { BFD_RELOC_SH_GLOB_DAT, R_SH_GLOB_DAT },
360 1.1 skrll { BFD_RELOC_SH_JMP_SLOT, R_SH_JMP_SLOT },
361 1.1 skrll { BFD_RELOC_SH_RELATIVE, R_SH_RELATIVE },
362 1.1 skrll { BFD_RELOC_32_GOTOFF, R_SH_GOTOFF },
363 1.3 christos { BFD_RELOC_SH_GOTPC, R_SH_GOTPC },
364 1.3 christos { BFD_RELOC_SH_GOTPLT32, R_SH_GOTPLT32 },
365 1.3 christos { BFD_RELOC_SH_GOT20, R_SH_GOT20 },
366 1.3 christos { BFD_RELOC_SH_GOTOFF20, R_SH_GOTOFF20 },
367 1.3 christos { BFD_RELOC_SH_GOTFUNCDESC, R_SH_GOTFUNCDESC },
368 1.3 christos { BFD_RELOC_SH_GOTFUNCDESC20, R_SH_GOTFUNCDESC20 },
369 1.3 christos { BFD_RELOC_SH_GOTOFFFUNCDESC, R_SH_GOTOFFFUNCDESC },
370 1.1 skrll { BFD_RELOC_SH_GOTOFFFUNCDESC20, R_SH_GOTOFFFUNCDESC20 },
371 1.1 skrll { BFD_RELOC_SH_FUNCDESC, R_SH_FUNCDESC },
372 1.1 skrll #ifdef INCLUDE_SHMEDIA
373 1.1 skrll { BFD_RELOC_SH_GOT_LOW16, R_SH_GOT_LOW16 },
374 1.1 skrll { BFD_RELOC_SH_GOT_MEDLOW16, R_SH_GOT_MEDLOW16 },
375 1.1 skrll { BFD_RELOC_SH_GOT_MEDHI16, R_SH_GOT_MEDHI16 },
376 1.1 skrll { BFD_RELOC_SH_GOT_HI16, R_SH_GOT_HI16 },
377 1.1 skrll { BFD_RELOC_SH_GOTPLT_LOW16, R_SH_GOTPLT_LOW16 },
378 1.1 skrll { BFD_RELOC_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDLOW16 },
379 1.1 skrll { BFD_RELOC_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_MEDHI16 },
380 1.1 skrll { BFD_RELOC_SH_GOTPLT_HI16, R_SH_GOTPLT_HI16 },
381 1.1 skrll { BFD_RELOC_SH_PLT_LOW16, R_SH_PLT_LOW16 },
382 1.1 skrll { BFD_RELOC_SH_PLT_MEDLOW16, R_SH_PLT_MEDLOW16 },
383 1.1 skrll { BFD_RELOC_SH_PLT_MEDHI16, R_SH_PLT_MEDHI16 },
384 1.1 skrll { BFD_RELOC_SH_PLT_HI16, R_SH_PLT_HI16 },
385 1.1 skrll { BFD_RELOC_SH_GOTOFF_LOW16, R_SH_GOTOFF_LOW16 },
386 1.1 skrll { BFD_RELOC_SH_GOTOFF_MEDLOW16, R_SH_GOTOFF_MEDLOW16 },
387 1.1 skrll { BFD_RELOC_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_MEDHI16 },
388 1.1 skrll { BFD_RELOC_SH_GOTOFF_HI16, R_SH_GOTOFF_HI16 },
389 1.1 skrll { BFD_RELOC_SH_GOTPC_LOW16, R_SH_GOTPC_LOW16 },
390 1.1 skrll { BFD_RELOC_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDLOW16 },
391 1.1 skrll { BFD_RELOC_SH_GOTPC_MEDHI16, R_SH_GOTPC_MEDHI16 },
392 1.1 skrll { BFD_RELOC_SH_GOTPC_HI16, R_SH_GOTPC_HI16 },
393 1.1 skrll { BFD_RELOC_SH_COPY64, R_SH_COPY64 },
394 1.1 skrll { BFD_RELOC_SH_GLOB_DAT64, R_SH_GLOB_DAT64 },
395 1.1 skrll { BFD_RELOC_SH_JMP_SLOT64, R_SH_JMP_SLOT64 },
396 1.1 skrll { BFD_RELOC_SH_RELATIVE64, R_SH_RELATIVE64 },
397 1.1 skrll { BFD_RELOC_SH_GOT10BY4, R_SH_GOT10BY4 },
398 1.1 skrll { BFD_RELOC_SH_GOT10BY8, R_SH_GOT10BY8 },
399 1.1 skrll { BFD_RELOC_SH_GOTPLT10BY4, R_SH_GOTPLT10BY4 },
400 1.1 skrll { BFD_RELOC_SH_GOTPLT10BY8, R_SH_GOTPLT10BY8 },
401 1.1 skrll { BFD_RELOC_SH_PT_16, R_SH_PT_16 },
402 1.1 skrll { BFD_RELOC_SH_SHMEDIA_CODE, R_SH_SHMEDIA_CODE },
403 1.1 skrll { BFD_RELOC_SH_IMMU5, R_SH_DIR5U },
404 1.1 skrll { BFD_RELOC_SH_IMMS6, R_SH_DIR6S },
405 1.1 skrll { BFD_RELOC_SH_IMMU6, R_SH_DIR6U },
406 1.1 skrll { BFD_RELOC_SH_IMMS10, R_SH_DIR10S },
407 1.1 skrll { BFD_RELOC_SH_IMMS10BY2, R_SH_DIR10SW },
408 1.1 skrll { BFD_RELOC_SH_IMMS10BY4, R_SH_DIR10SL },
409 1.1 skrll { BFD_RELOC_SH_IMMS10BY8, R_SH_DIR10SQ },
410 1.1 skrll { BFD_RELOC_SH_IMMS16, R_SH_IMMS16 },
411 1.1 skrll { BFD_RELOC_SH_IMMU16, R_SH_IMMU16 },
412 1.1 skrll { BFD_RELOC_SH_IMM_LOW16, R_SH_IMM_LOW16 },
413 1.1 skrll { BFD_RELOC_SH_IMM_LOW16_PCREL, R_SH_IMM_LOW16_PCREL },
414 1.1 skrll { BFD_RELOC_SH_IMM_MEDLOW16, R_SH_IMM_MEDLOW16 },
415 1.1 skrll { BFD_RELOC_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDLOW16_PCREL },
416 1.1 skrll { BFD_RELOC_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16 },
417 1.1 skrll { BFD_RELOC_SH_IMM_MEDHI16_PCREL, R_SH_IMM_MEDHI16_PCREL },
418 1.1 skrll { BFD_RELOC_SH_IMM_HI16, R_SH_IMM_HI16 },
419 1.1 skrll { BFD_RELOC_SH_IMM_HI16_PCREL, R_SH_IMM_HI16_PCREL },
420 1.1 skrll { BFD_RELOC_64, R_SH_64 },
421 1.1 skrll { BFD_RELOC_64_PCREL, R_SH_64_PCREL },
422 1.1 skrll #endif /* not INCLUDE_SHMEDIA */
423 1.1 skrll };
424 1.1 skrll
425 1.1 skrll /* Given a BFD reloc code, return the howto structure for the
426 1.1 skrll corresponding SH ELF reloc. */
427 1.1 skrll
428 1.1 skrll static reloc_howto_type *
429 1.1 skrll sh_elf_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
430 1.1 skrll {
431 1.1 skrll unsigned int i;
432 1.1 skrll
433 1.1 skrll for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
434 1.1 skrll {
435 1.1 skrll if (sh_reloc_map[i].bfd_reloc_val == code)
436 1.1 skrll return get_howto_table (abfd) + (int) sh_reloc_map[i].elf_reloc_val;
437 1.1 skrll }
438 1.1 skrll
439 1.1 skrll return NULL;
440 1.1 skrll }
441 1.1 skrll
442 1.1 skrll static reloc_howto_type *
443 1.1 skrll sh_elf_reloc_name_lookup (bfd *abfd, const char *r_name)
444 1.1 skrll {
445 1.1 skrll unsigned int i;
446 1.1 skrll
447 1.1 skrll if (vxworks_object_p (abfd))
448 1.1 skrll {
449 1.1 skrll for (i = 0;
450 1.1 skrll i < (sizeof (sh_vxworks_howto_table)
451 1.1 skrll / sizeof (sh_vxworks_howto_table[0]));
452 1.1 skrll i++)
453 1.1 skrll if (sh_vxworks_howto_table[i].name != NULL
454 1.1 skrll && strcasecmp (sh_vxworks_howto_table[i].name, r_name) == 0)
455 1.1 skrll return &sh_vxworks_howto_table[i];
456 1.1 skrll }
457 1.1 skrll else
458 1.1 skrll {
459 1.1 skrll for (i = 0;
460 1.1 skrll i < (sizeof (sh_elf_howto_table)
461 1.1 skrll / sizeof (sh_elf_howto_table[0]));
462 1.1 skrll i++)
463 1.1 skrll if (sh_elf_howto_table[i].name != NULL
464 1.1 skrll && strcasecmp (sh_elf_howto_table[i].name, r_name) == 0)
465 1.1 skrll return &sh_elf_howto_table[i];
466 1.1 skrll }
467 1.1 skrll
468 1.1 skrll return NULL;
469 1.1 skrll }
470 1.1 skrll
471 1.1 skrll /* Given an ELF reloc, fill in the howto field of a relent. */
472 1.1 skrll
473 1.1 skrll static void
474 1.1 skrll sh_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
475 1.1 skrll {
476 1.1 skrll unsigned int r;
477 1.1 skrll
478 1.1 skrll r = ELF32_R_TYPE (dst->r_info);
479 1.1 skrll
480 1.1 skrll BFD_ASSERT (r < (unsigned int) R_SH_max);
481 1.1 skrll BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
482 1.1 skrll BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2);
483 1.1 skrll BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_LAST_INVALID_RELOC_3);
484 1.3 christos BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4);
485 1.1 skrll BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_5 || r > R_SH_LAST_INVALID_RELOC_5);
486 1.1 skrll BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_6 || r > R_SH_LAST_INVALID_RELOC_6);
487 1.1 skrll
488 1.1 skrll cache_ptr->howto = get_howto_table (abfd) + r;
489 1.1 skrll }
490 1.1 skrll
491 1.1 skrll /* This function handles relaxing for SH ELF. See the corresponding
493 1.1 skrll function in coff-sh.c for a description of what this does. FIXME:
494 1.1 skrll There is a lot of duplication here between this code and the COFF
495 1.1 skrll specific code. The format of relocs and symbols is wound deeply
496 1.1 skrll into this code, but it would still be better if the duplication
497 1.1 skrll could be eliminated somehow. Note in particular that although both
498 1.1 skrll functions use symbols like R_SH_CODE, those symbols have different
499 1.1 skrll values; in coff-sh.c they come from include/coff/sh.h, whereas here
500 1.1 skrll they come from enum elf_sh_reloc_type in include/elf/sh.h. */
501 1.1 skrll
502 1.1 skrll static bfd_boolean
503 1.1 skrll sh_elf_relax_section (bfd *abfd, asection *sec,
504 1.1 skrll struct bfd_link_info *link_info, bfd_boolean *again)
505 1.1 skrll {
506 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
507 1.1 skrll Elf_Internal_Rela *internal_relocs;
508 1.1 skrll bfd_boolean have_code;
509 1.1 skrll Elf_Internal_Rela *irel, *irelend;
510 1.1 skrll bfd_byte *contents = NULL;
511 1.1 skrll Elf_Internal_Sym *isymbuf = NULL;
512 1.1 skrll
513 1.1 skrll *again = FALSE;
514 1.1 skrll
515 1.1 skrll if (link_info->relocatable
516 1.1 skrll || (sec->flags & SEC_RELOC) == 0
517 1.1 skrll || sec->reloc_count == 0)
518 1.1 skrll return TRUE;
519 1.1 skrll
520 1.1 skrll #ifdef INCLUDE_SHMEDIA
521 1.1 skrll if (elf_section_data (sec)->this_hdr.sh_flags
522 1.1 skrll & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED))
523 1.1 skrll {
524 1.1 skrll return TRUE;
525 1.1 skrll }
526 1.1 skrll #endif
527 1.1 skrll
528 1.1 skrll symtab_hdr = &elf_symtab_hdr (abfd);
529 1.1 skrll
530 1.1 skrll internal_relocs = (_bfd_elf_link_read_relocs
531 1.1 skrll (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
532 1.1 skrll link_info->keep_memory));
533 1.1 skrll if (internal_relocs == NULL)
534 1.1 skrll goto error_return;
535 1.1 skrll
536 1.1 skrll have_code = FALSE;
537 1.1 skrll
538 1.1 skrll irelend = internal_relocs + sec->reloc_count;
539 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++)
540 1.1 skrll {
541 1.1 skrll bfd_vma laddr, paddr, symval;
542 1.1 skrll unsigned short insn;
543 1.1 skrll Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
544 1.1 skrll bfd_signed_vma foff;
545 1.1 skrll
546 1.1 skrll if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
547 1.1 skrll have_code = TRUE;
548 1.1 skrll
549 1.1 skrll if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
550 1.1 skrll continue;
551 1.1 skrll
552 1.1 skrll /* Get the section contents. */
553 1.1 skrll if (contents == NULL)
554 1.1 skrll {
555 1.1 skrll if (elf_section_data (sec)->this_hdr.contents != NULL)
556 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents;
557 1.1 skrll else
558 1.1 skrll {
559 1.1 skrll if (!bfd_malloc_and_get_section (abfd, sec, &contents))
560 1.1 skrll goto error_return;
561 1.1 skrll }
562 1.1 skrll }
563 1.1 skrll
564 1.1 skrll /* The r_addend field of the R_SH_USES reloc will point us to
565 1.1 skrll the register load. The 4 is because the r_addend field is
566 1.1 skrll computed as though it were a jump offset, which are based
567 1.1 skrll from 4 bytes after the jump instruction. */
568 1.1 skrll laddr = irel->r_offset + 4 + irel->r_addend;
569 1.1 skrll if (laddr >= sec->size)
570 1.1 skrll {
571 1.1 skrll (*_bfd_error_handler) (_("%B: 0x%lx: warning: bad R_SH_USES offset"),
572 1.1 skrll abfd,
573 1.1 skrll (unsigned long) irel->r_offset);
574 1.1 skrll continue;
575 1.1 skrll }
576 1.1 skrll insn = bfd_get_16 (abfd, contents + laddr);
577 1.1 skrll
578 1.1 skrll /* If the instruction is not mov.l NN,rN, we don't know what to
579 1.1 skrll do. */
580 1.1 skrll if ((insn & 0xf000) != 0xd000)
581 1.1 skrll {
582 1.1 skrll ((*_bfd_error_handler)
583 1.1 skrll (_("%B: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
584 1.1 skrll abfd, (unsigned long) irel->r_offset, insn));
585 1.1 skrll continue;
586 1.1 skrll }
587 1.1 skrll
588 1.1 skrll /* Get the address from which the register is being loaded. The
589 1.1 skrll displacement in the mov.l instruction is quadrupled. It is a
590 1.1 skrll displacement from four bytes after the movl instruction, but,
591 1.1 skrll before adding in the PC address, two least significant bits
592 1.1 skrll of the PC are cleared. We assume that the section is aligned
593 1.1 skrll on a four byte boundary. */
594 1.1 skrll paddr = insn & 0xff;
595 1.1 skrll paddr *= 4;
596 1.1 skrll paddr += (laddr + 4) &~ (bfd_vma) 3;
597 1.1 skrll if (paddr >= sec->size)
598 1.1 skrll {
599 1.1 skrll ((*_bfd_error_handler)
600 1.1 skrll (_("%B: 0x%lx: warning: bad R_SH_USES load offset"),
601 1.1 skrll abfd, (unsigned long) irel->r_offset));
602 1.1 skrll continue;
603 1.1 skrll }
604 1.1 skrll
605 1.1 skrll /* Get the reloc for the address from which the register is
606 1.1 skrll being loaded. This reloc will tell us which function is
607 1.1 skrll actually being called. */
608 1.1 skrll for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
609 1.1 skrll if (irelfn->r_offset == paddr
610 1.1 skrll && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
611 1.1 skrll break;
612 1.1 skrll if (irelfn >= irelend)
613 1.1 skrll {
614 1.1 skrll ((*_bfd_error_handler)
615 1.1 skrll (_("%B: 0x%lx: warning: could not find expected reloc"),
616 1.1 skrll abfd, (unsigned long) paddr));
617 1.1 skrll continue;
618 1.1 skrll }
619 1.1 skrll
620 1.1 skrll /* Read this BFD's symbols if we haven't done so already. */
621 1.1 skrll if (isymbuf == NULL && symtab_hdr->sh_info != 0)
622 1.1 skrll {
623 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
624 1.1 skrll if (isymbuf == NULL)
625 1.1 skrll isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
626 1.1 skrll symtab_hdr->sh_info, 0,
627 1.1 skrll NULL, NULL, NULL);
628 1.1 skrll if (isymbuf == NULL)
629 1.1 skrll goto error_return;
630 1.1 skrll }
631 1.1 skrll
632 1.1 skrll /* Get the value of the symbol referred to by the reloc. */
633 1.1 skrll if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
634 1.1 skrll {
635 1.1 skrll /* A local symbol. */
636 1.1 skrll Elf_Internal_Sym *isym;
637 1.1 skrll
638 1.1 skrll isym = isymbuf + ELF32_R_SYM (irelfn->r_info);
639 1.1 skrll if (isym->st_shndx
640 1.1 skrll != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec))
641 1.1 skrll {
642 1.1 skrll ((*_bfd_error_handler)
643 1.1 skrll (_("%B: 0x%lx: warning: symbol in unexpected section"),
644 1.1 skrll abfd, (unsigned long) paddr));
645 1.1 skrll continue;
646 1.1 skrll }
647 1.1 skrll
648 1.1 skrll symval = (isym->st_value
649 1.1 skrll + sec->output_section->vma
650 1.1 skrll + sec->output_offset);
651 1.1 skrll }
652 1.1 skrll else
653 1.1 skrll {
654 1.1 skrll unsigned long indx;
655 1.1 skrll struct elf_link_hash_entry *h;
656 1.1 skrll
657 1.1 skrll indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
658 1.1 skrll h = elf_sym_hashes (abfd)[indx];
659 1.1 skrll BFD_ASSERT (h != NULL);
660 1.1 skrll if (h->root.type != bfd_link_hash_defined
661 1.1 skrll && h->root.type != bfd_link_hash_defweak)
662 1.1 skrll {
663 1.1 skrll /* This appears to be a reference to an undefined
664 1.1 skrll symbol. Just ignore it--it will be caught by the
665 1.1 skrll regular reloc processing. */
666 1.1 skrll continue;
667 1.1 skrll }
668 1.1 skrll
669 1.1 skrll symval = (h->root.u.def.value
670 1.1 skrll + h->root.u.def.section->output_section->vma
671 1.1 skrll + h->root.u.def.section->output_offset);
672 1.1 skrll }
673 1.1 skrll
674 1.1 skrll if (get_howto_table (abfd)[R_SH_DIR32].partial_inplace)
675 1.1 skrll symval += bfd_get_32 (abfd, contents + paddr);
676 1.1 skrll else
677 1.1 skrll symval += irelfn->r_addend;
678 1.1 skrll
679 1.1 skrll /* See if this function call can be shortened. */
680 1.1 skrll foff = (symval
681 1.1 skrll - (irel->r_offset
682 1.1 skrll + sec->output_section->vma
683 1.1 skrll + sec->output_offset
684 1.1 skrll + 4));
685 1.1 skrll /* A branch to an address beyond ours might be increased by an
686 1.1 skrll .align that doesn't move when bytes behind us are deleted.
687 1.1 skrll So, we add some slop in this calculation to allow for
688 1.1 skrll that. */
689 1.1 skrll if (foff < -0x1000 || foff >= 0x1000 - 8)
690 1.1 skrll {
691 1.1 skrll /* After all that work, we can't shorten this function call. */
692 1.1 skrll continue;
693 1.1 skrll }
694 1.1 skrll
695 1.1 skrll /* Shorten the function call. */
696 1.1 skrll
697 1.1 skrll /* For simplicity of coding, we are going to modify the section
698 1.1 skrll contents, the section relocs, and the BFD symbol table. We
699 1.1 skrll must tell the rest of the code not to free up this
700 1.1 skrll information. It would be possible to instead create a table
701 1.1 skrll of changes which have to be made, as is done in coff-mips.c;
702 1.1 skrll that would be more work, but would require less memory when
703 1.1 skrll the linker is run. */
704 1.1 skrll
705 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
706 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
707 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
708 1.1 skrll
709 1.1 skrll /* Replace the jsr with a bsr. */
710 1.1 skrll
711 1.1 skrll /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
712 1.1 skrll replace the jsr with a bsr. */
713 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
714 1.1 skrll /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
715 1.1 skrll here, but that only checks if the symbol is an external symbol,
716 1.1 skrll not if the symbol is in a different section. Besides, we need
717 1.1 skrll a consistent meaning for the relocation, so we just assume here that
718 1.1 skrll the value of the symbol is not available. */
719 1.1 skrll
720 1.1 skrll /* We can't fully resolve this yet, because the external
721 1.1 skrll symbol value may be changed by future relaxing. We let
722 1.1 skrll the final link phase handle it. */
723 1.1 skrll bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset);
724 1.1 skrll
725 1.1 skrll irel->r_addend = -4;
726 1.1 skrll
727 1.1 skrll /* When we calculated the symbol "value" we had an offset in the
728 1.1 skrll DIR32's word in memory (we read and add it above). However,
729 1.1 skrll the jsr we create does NOT have this offset encoded, so we
730 1.1 skrll have to add it to the addend to preserve it. */
731 1.1 skrll irel->r_addend += bfd_get_32 (abfd, contents + paddr);
732 1.1 skrll
733 1.1 skrll /* See if there is another R_SH_USES reloc referring to the same
734 1.1 skrll register load. */
735 1.1 skrll for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
736 1.1 skrll if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
737 1.1 skrll && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
738 1.1 skrll break;
739 1.1 skrll if (irelscan < irelend)
740 1.1 skrll {
741 1.1 skrll /* Some other function call depends upon this register load,
742 1.1 skrll and we have not yet converted that function call.
743 1.1 skrll Indeed, we may never be able to convert it. There is
744 1.1 skrll nothing else we can do at this point. */
745 1.1 skrll continue;
746 1.1 skrll }
747 1.1 skrll
748 1.1 skrll /* Look for a R_SH_COUNT reloc on the location where the
749 1.1 skrll function address is stored. Do this before deleting any
750 1.1 skrll bytes, to avoid confusion about the address. */
751 1.1 skrll for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
752 1.1 skrll if (irelcount->r_offset == paddr
753 1.1 skrll && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
754 1.1 skrll break;
755 1.1 skrll
756 1.1 skrll /* Delete the register load. */
757 1.1 skrll if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
758 1.1 skrll goto error_return;
759 1.1 skrll
760 1.1 skrll /* That will change things, so, just in case it permits some
761 1.1 skrll other function call to come within range, we should relax
762 1.1 skrll again. Note that this is not required, and it may be slow. */
763 1.1 skrll *again = TRUE;
764 1.1 skrll
765 1.1 skrll /* Now check whether we got a COUNT reloc. */
766 1.1 skrll if (irelcount >= irelend)
767 1.1 skrll {
768 1.1 skrll ((*_bfd_error_handler)
769 1.1 skrll (_("%B: 0x%lx: warning: could not find expected COUNT reloc"),
770 1.1 skrll abfd, (unsigned long) paddr));
771 1.1 skrll continue;
772 1.1 skrll }
773 1.1 skrll
774 1.1 skrll /* The number of uses is stored in the r_addend field. We've
775 1.1 skrll just deleted one. */
776 1.1 skrll if (irelcount->r_addend == 0)
777 1.1 skrll {
778 1.1 skrll ((*_bfd_error_handler) (_("%B: 0x%lx: warning: bad count"),
779 1.1 skrll abfd,
780 1.1 skrll (unsigned long) paddr));
781 1.1 skrll continue;
782 1.1 skrll }
783 1.1 skrll
784 1.1 skrll --irelcount->r_addend;
785 1.1 skrll
786 1.1 skrll /* If there are no more uses, we can delete the address. Reload
787 1.1 skrll the address from irelfn, in case it was changed by the
788 1.1 skrll previous call to sh_elf_relax_delete_bytes. */
789 1.1 skrll if (irelcount->r_addend == 0)
790 1.1 skrll {
791 1.1 skrll if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
792 1.1 skrll goto error_return;
793 1.1 skrll }
794 1.1 skrll
795 1.1 skrll /* We've done all we can with that function call. */
796 1.1 skrll }
797 1.1 skrll
798 1.1 skrll /* Look for load and store instructions that we can align on four
799 1.1 skrll byte boundaries. */
800 1.1 skrll if ((elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK) != EF_SH4
801 1.1 skrll && have_code)
802 1.1 skrll {
803 1.1 skrll bfd_boolean swapped;
804 1.1 skrll
805 1.1 skrll /* Get the section contents. */
806 1.1 skrll if (contents == NULL)
807 1.1 skrll {
808 1.1 skrll if (elf_section_data (sec)->this_hdr.contents != NULL)
809 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents;
810 1.1 skrll else
811 1.1 skrll {
812 1.1 skrll if (!bfd_malloc_and_get_section (abfd, sec, &contents))
813 1.1 skrll goto error_return;
814 1.1 skrll }
815 1.1 skrll }
816 1.1 skrll
817 1.1 skrll if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
818 1.1 skrll &swapped))
819 1.1 skrll goto error_return;
820 1.1 skrll
821 1.1 skrll if (swapped)
822 1.1 skrll {
823 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
824 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
825 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
826 1.1 skrll }
827 1.1 skrll }
828 1.1 skrll
829 1.1 skrll if (isymbuf != NULL
830 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
831 1.1 skrll {
832 1.1 skrll if (! link_info->keep_memory)
833 1.1 skrll free (isymbuf);
834 1.1 skrll else
835 1.1 skrll {
836 1.1 skrll /* Cache the symbols for elf_link_input_bfd. */
837 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
838 1.1 skrll }
839 1.1 skrll }
840 1.1 skrll
841 1.1 skrll if (contents != NULL
842 1.1 skrll && elf_section_data (sec)->this_hdr.contents != contents)
843 1.1 skrll {
844 1.1 skrll if (! link_info->keep_memory)
845 1.1 skrll free (contents);
846 1.1 skrll else
847 1.1 skrll {
848 1.1 skrll /* Cache the section contents for elf_link_input_bfd. */
849 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
850 1.1 skrll }
851 1.1 skrll }
852 1.1 skrll
853 1.1 skrll if (internal_relocs != NULL
854 1.1 skrll && elf_section_data (sec)->relocs != internal_relocs)
855 1.1 skrll free (internal_relocs);
856 1.1 skrll
857 1.1 skrll return TRUE;
858 1.1 skrll
859 1.1 skrll error_return:
860 1.1 skrll if (isymbuf != NULL
861 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
862 1.1 skrll free (isymbuf);
863 1.1 skrll if (contents != NULL
864 1.1 skrll && elf_section_data (sec)->this_hdr.contents != contents)
865 1.1 skrll free (contents);
866 1.1 skrll if (internal_relocs != NULL
867 1.1 skrll && elf_section_data (sec)->relocs != internal_relocs)
868 1.1 skrll free (internal_relocs);
869 1.1 skrll
870 1.1 skrll return FALSE;
871 1.1 skrll }
872 1.1 skrll
873 1.1 skrll /* Delete some bytes from a section while relaxing. FIXME: There is a
874 1.1 skrll lot of duplication between this function and sh_relax_delete_bytes
875 1.1 skrll in coff-sh.c. */
876 1.1 skrll
877 1.1 skrll static bfd_boolean
878 1.1 skrll sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr,
879 1.1 skrll int count)
880 1.1 skrll {
881 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
882 1.1 skrll unsigned int sec_shndx;
883 1.1 skrll bfd_byte *contents;
884 1.1 skrll Elf_Internal_Rela *irel, *irelend;
885 1.1 skrll Elf_Internal_Rela *irelalign;
886 1.1 skrll bfd_vma toaddr;
887 1.1 skrll Elf_Internal_Sym *isymbuf, *isym, *isymend;
888 1.1 skrll struct elf_link_hash_entry **sym_hashes;
889 1.1 skrll struct elf_link_hash_entry **end_hashes;
890 1.1 skrll unsigned int symcount;
891 1.1 skrll asection *o;
892 1.1 skrll
893 1.1 skrll symtab_hdr = &elf_symtab_hdr (abfd);
894 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
895 1.1 skrll
896 1.1 skrll sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
897 1.1 skrll
898 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents;
899 1.1 skrll
900 1.1 skrll /* The deletion must stop at the next ALIGN reloc for an aligment
901 1.1 skrll power larger than the number of bytes we are deleting. */
902 1.1 skrll
903 1.1 skrll irelalign = NULL;
904 1.1 skrll toaddr = sec->size;
905 1.1 skrll
906 1.1 skrll irel = elf_section_data (sec)->relocs;
907 1.1 skrll irelend = irel + sec->reloc_count;
908 1.1 skrll for (; irel < irelend; irel++)
909 1.1 skrll {
910 1.1 skrll if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
911 1.1 skrll && irel->r_offset > addr
912 1.1 skrll && count < (1 << irel->r_addend))
913 1.1 skrll {
914 1.1 skrll irelalign = irel;
915 1.1 skrll toaddr = irel->r_offset;
916 1.1 skrll break;
917 1.1 skrll }
918 1.1 skrll }
919 1.1 skrll
920 1.1 skrll /* Actually delete the bytes. */
921 1.1 skrll memmove (contents + addr, contents + addr + count,
922 1.1 skrll (size_t) (toaddr - addr - count));
923 1.1 skrll if (irelalign == NULL)
924 1.1 skrll sec->size -= count;
925 1.1 skrll else
926 1.1 skrll {
927 1.1 skrll int i;
928 1.1 skrll
929 1.1 skrll #define NOP_OPCODE (0x0009)
930 1.1 skrll
931 1.1 skrll BFD_ASSERT ((count & 1) == 0);
932 1.1 skrll for (i = 0; i < count; i += 2)
933 1.1 skrll bfd_put_16 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i);
934 1.1 skrll }
935 1.1 skrll
936 1.1 skrll /* Adjust all the relocs. */
937 1.1 skrll for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
938 1.1 skrll {
939 1.1 skrll bfd_vma nraddr, stop;
940 1.1 skrll bfd_vma start = 0;
941 1.1 skrll int insn = 0;
942 1.1 skrll int off, adjust, oinsn;
943 1.1 skrll bfd_signed_vma voff = 0;
944 1.1 skrll bfd_boolean overflow;
945 1.1 skrll
946 1.1 skrll /* Get the new reloc address. */
947 1.1 skrll nraddr = irel->r_offset;
948 1.1 skrll if ((irel->r_offset > addr
949 1.1 skrll && irel->r_offset < toaddr)
950 1.1 skrll || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
951 1.1 skrll && irel->r_offset == toaddr))
952 1.1 skrll nraddr -= count;
953 1.1 skrll
954 1.1 skrll /* See if this reloc was for the bytes we have deleted, in which
955 1.1 skrll case we no longer care about it. Don't delete relocs which
956 1.1 skrll represent addresses, though. */
957 1.1 skrll if (irel->r_offset >= addr
958 1.1 skrll && irel->r_offset < addr + count
959 1.1 skrll && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
960 1.1 skrll && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
961 1.1 skrll && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
962 1.1 skrll && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
963 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
964 1.1 skrll (int) R_SH_NONE);
965 1.1 skrll
966 1.1 skrll /* If this is a PC relative reloc, see if the range it covers
967 1.1 skrll includes the bytes we have deleted. */
968 1.1 skrll switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
969 1.1 skrll {
970 1.1 skrll default:
971 1.1 skrll break;
972 1.1 skrll
973 1.1 skrll case R_SH_DIR8WPN:
974 1.1 skrll case R_SH_IND12W:
975 1.1 skrll case R_SH_DIR8WPZ:
976 1.1 skrll case R_SH_DIR8WPL:
977 1.1 skrll start = irel->r_offset;
978 1.1 skrll insn = bfd_get_16 (abfd, contents + nraddr);
979 1.1 skrll break;
980 1.1 skrll }
981 1.1 skrll
982 1.1 skrll switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
983 1.1 skrll {
984 1.1 skrll default:
985 1.1 skrll start = stop = addr;
986 1.1 skrll break;
987 1.1 skrll
988 1.1 skrll case R_SH_DIR32:
989 1.1 skrll /* If this reloc is against a symbol defined in this
990 1.1 skrll section, and the symbol will not be adjusted below, we
991 1.1 skrll must check the addend to see it will put the value in
992 1.1 skrll range to be adjusted, and hence must be changed. */
993 1.1 skrll if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
994 1.1 skrll {
995 1.1 skrll isym = isymbuf + ELF32_R_SYM (irel->r_info);
996 1.1 skrll if (isym->st_shndx == sec_shndx
997 1.1 skrll && (isym->st_value <= addr
998 1.1 skrll || isym->st_value >= toaddr))
999 1.1 skrll {
1000 1.1 skrll bfd_vma val;
1001 1.1 skrll
1002 1.1 skrll if (get_howto_table (abfd)[R_SH_DIR32].partial_inplace)
1003 1.1 skrll {
1004 1.1 skrll val = bfd_get_32 (abfd, contents + nraddr);
1005 1.1 skrll val += isym->st_value;
1006 1.1 skrll if (val > addr && val < toaddr)
1007 1.1 skrll bfd_put_32 (abfd, val - count, contents + nraddr);
1008 1.1 skrll }
1009 1.1 skrll else
1010 1.1 skrll {
1011 1.1 skrll val = isym->st_value + irel->r_addend;
1012 1.1 skrll if (val > addr && val < toaddr)
1013 1.1 skrll irel->r_addend -= count;
1014 1.1 skrll }
1015 1.1 skrll }
1016 1.1 skrll }
1017 1.1 skrll start = stop = addr;
1018 1.1 skrll break;
1019 1.1 skrll
1020 1.1 skrll case R_SH_DIR8WPN:
1021 1.1 skrll off = insn & 0xff;
1022 1.1 skrll if (off & 0x80)
1023 1.1 skrll off -= 0x100;
1024 1.1 skrll stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1025 1.1 skrll break;
1026 1.1 skrll
1027 1.1 skrll case R_SH_IND12W:
1028 1.1 skrll off = insn & 0xfff;
1029 1.1 skrll if (! off)
1030 1.1 skrll {
1031 1.1 skrll /* This has been made by previous relaxation. Since the
1032 1.1 skrll relocation will be against an external symbol, the
1033 1.1 skrll final relocation will just do the right thing. */
1034 1.1 skrll start = stop = addr;
1035 1.1 skrll }
1036 1.1 skrll else
1037 1.1 skrll {
1038 1.1 skrll if (off & 0x800)
1039 1.1 skrll off -= 0x1000;
1040 1.1 skrll stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1041 1.1 skrll
1042 1.1 skrll /* The addend will be against the section symbol, thus
1043 1.1 skrll for adjusting the addend, the relevant start is the
1044 1.1 skrll start of the section.
1045 1.1 skrll N.B. If we want to abandon in-place changes here and
1046 1.1 skrll test directly using symbol + addend, we have to take into
1047 1.1 skrll account that the addend has already been adjusted by -4. */
1048 1.1 skrll if (stop > addr && stop < toaddr)
1049 1.1 skrll irel->r_addend -= count;
1050 1.1 skrll }
1051 1.1 skrll break;
1052 1.1 skrll
1053 1.1 skrll case R_SH_DIR8WPZ:
1054 1.1 skrll off = insn & 0xff;
1055 1.1 skrll stop = start + 4 + off * 2;
1056 1.1 skrll break;
1057 1.1 skrll
1058 1.1 skrll case R_SH_DIR8WPL:
1059 1.1 skrll off = insn & 0xff;
1060 1.1 skrll stop = (start & ~(bfd_vma) 3) + 4 + off * 4;
1061 1.1 skrll break;
1062 1.1 skrll
1063 1.1 skrll case R_SH_SWITCH8:
1064 1.1 skrll case R_SH_SWITCH16:
1065 1.1 skrll case R_SH_SWITCH32:
1066 1.1 skrll /* These relocs types represent
1067 1.1 skrll .word L2-L1
1068 1.1 skrll The r_addend field holds the difference between the reloc
1069 1.1 skrll address and L1. That is the start of the reloc, and
1070 1.1 skrll adding in the contents gives us the top. We must adjust
1071 1.1 skrll both the r_offset field and the section contents.
1072 1.1 skrll N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
1073 1.1 skrll and the elf bfd r_offset is called r_vaddr. */
1074 1.1 skrll
1075 1.1 skrll stop = irel->r_offset;
1076 1.1 skrll start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
1077 1.1 skrll
1078 1.1 skrll if (start > addr
1079 1.1 skrll && start < toaddr
1080 1.1 skrll && (stop <= addr || stop >= toaddr))
1081 1.1 skrll irel->r_addend += count;
1082 1.1 skrll else if (stop > addr
1083 1.1 skrll && stop < toaddr
1084 1.1 skrll && (start <= addr || start >= toaddr))
1085 1.1 skrll irel->r_addend -= count;
1086 1.1 skrll
1087 1.1 skrll if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
1088 1.1 skrll voff = bfd_get_signed_16 (abfd, contents + nraddr);
1089 1.1 skrll else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
1090 1.1 skrll voff = bfd_get_8 (abfd, contents + nraddr);
1091 1.1 skrll else
1092 1.1 skrll voff = bfd_get_signed_32 (abfd, contents + nraddr);
1093 1.1 skrll stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1094 1.1 skrll
1095 1.1 skrll break;
1096 1.1 skrll
1097 1.1 skrll case R_SH_USES:
1098 1.1 skrll start = irel->r_offset;
1099 1.1 skrll stop = (bfd_vma) ((bfd_signed_vma) start
1100 1.1 skrll + (long) irel->r_addend
1101 1.1 skrll + 4);
1102 1.1 skrll break;
1103 1.1 skrll }
1104 1.1 skrll
1105 1.1 skrll if (start > addr
1106 1.1 skrll && start < toaddr
1107 1.1 skrll && (stop <= addr || stop >= toaddr))
1108 1.1 skrll adjust = count;
1109 1.1 skrll else if (stop > addr
1110 1.1 skrll && stop < toaddr
1111 1.1 skrll && (start <= addr || start >= toaddr))
1112 1.1 skrll adjust = - count;
1113 1.1 skrll else
1114 1.1 skrll adjust = 0;
1115 1.1 skrll
1116 1.1 skrll if (adjust != 0)
1117 1.1 skrll {
1118 1.1 skrll oinsn = insn;
1119 1.1 skrll overflow = FALSE;
1120 1.1 skrll switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1121 1.1 skrll {
1122 1.1 skrll default:
1123 1.1 skrll abort ();
1124 1.1 skrll break;
1125 1.1 skrll
1126 1.1 skrll case R_SH_DIR8WPN:
1127 1.1 skrll case R_SH_DIR8WPZ:
1128 1.1 skrll insn += adjust / 2;
1129 1.1 skrll if ((oinsn & 0xff00) != (insn & 0xff00))
1130 1.1 skrll overflow = TRUE;
1131 1.1 skrll bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
1132 1.1 skrll break;
1133 1.1 skrll
1134 1.1 skrll case R_SH_IND12W:
1135 1.1 skrll insn += adjust / 2;
1136 1.1 skrll if ((oinsn & 0xf000) != (insn & 0xf000))
1137 1.1 skrll overflow = TRUE;
1138 1.1 skrll bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
1139 1.1 skrll break;
1140 1.1 skrll
1141 1.1 skrll case R_SH_DIR8WPL:
1142 1.1 skrll BFD_ASSERT (adjust == count || count >= 4);
1143 1.1 skrll if (count >= 4)
1144 1.1 skrll insn += adjust / 4;
1145 1.1 skrll else
1146 1.1 skrll {
1147 1.1 skrll if ((irel->r_offset & 3) == 0)
1148 1.1 skrll ++insn;
1149 1.1 skrll }
1150 1.1 skrll if ((oinsn & 0xff00) != (insn & 0xff00))
1151 1.1 skrll overflow = TRUE;
1152 1.1 skrll bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
1153 1.1 skrll break;
1154 1.1 skrll
1155 1.1 skrll case R_SH_SWITCH8:
1156 1.1 skrll voff += adjust;
1157 1.1 skrll if (voff < 0 || voff >= 0xff)
1158 1.1 skrll overflow = TRUE;
1159 1.1 skrll bfd_put_8 (abfd, voff, contents + nraddr);
1160 1.1 skrll break;
1161 1.1 skrll
1162 1.1 skrll case R_SH_SWITCH16:
1163 1.1 skrll voff += adjust;
1164 1.1 skrll if (voff < - 0x8000 || voff >= 0x8000)
1165 1.1 skrll overflow = TRUE;
1166 1.1 skrll bfd_put_signed_16 (abfd, (bfd_vma) voff, contents + nraddr);
1167 1.1 skrll break;
1168 1.1 skrll
1169 1.1 skrll case R_SH_SWITCH32:
1170 1.1 skrll voff += adjust;
1171 1.1 skrll bfd_put_signed_32 (abfd, (bfd_vma) voff, contents + nraddr);
1172 1.1 skrll break;
1173 1.1 skrll
1174 1.1 skrll case R_SH_USES:
1175 1.1 skrll irel->r_addend += adjust;
1176 1.1 skrll break;
1177 1.1 skrll }
1178 1.1 skrll
1179 1.1 skrll if (overflow)
1180 1.1 skrll {
1181 1.1 skrll ((*_bfd_error_handler)
1182 1.1 skrll (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
1183 1.1 skrll abfd, (unsigned long) irel->r_offset));
1184 1.1 skrll bfd_set_error (bfd_error_bad_value);
1185 1.1 skrll return FALSE;
1186 1.1 skrll }
1187 1.1 skrll }
1188 1.1 skrll
1189 1.1 skrll irel->r_offset = nraddr;
1190 1.1 skrll }
1191 1.1 skrll
1192 1.1 skrll /* Look through all the other sections. If there contain any IMM32
1193 1.1 skrll relocs against internal symbols which we are not going to adjust
1194 1.1 skrll below, we may need to adjust the addends. */
1195 1.1 skrll for (o = abfd->sections; o != NULL; o = o->next)
1196 1.1 skrll {
1197 1.1 skrll Elf_Internal_Rela *internal_relocs;
1198 1.1 skrll Elf_Internal_Rela *irelscan, *irelscanend;
1199 1.1 skrll bfd_byte *ocontents;
1200 1.1 skrll
1201 1.1 skrll if (o == sec
1202 1.1 skrll || (o->flags & SEC_RELOC) == 0
1203 1.1 skrll || o->reloc_count == 0)
1204 1.1 skrll continue;
1205 1.1 skrll
1206 1.1 skrll /* We always cache the relocs. Perhaps, if info->keep_memory is
1207 1.1 skrll FALSE, we should free them, if we are permitted to, when we
1208 1.1 skrll leave sh_coff_relax_section. */
1209 1.1 skrll internal_relocs = (_bfd_elf_link_read_relocs
1210 1.1 skrll (abfd, o, NULL, (Elf_Internal_Rela *) NULL, TRUE));
1211 1.1 skrll if (internal_relocs == NULL)
1212 1.1 skrll return FALSE;
1213 1.1 skrll
1214 1.1 skrll ocontents = NULL;
1215 1.1 skrll irelscanend = internal_relocs + o->reloc_count;
1216 1.1 skrll for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
1217 1.1 skrll {
1218 1.1 skrll /* Dwarf line numbers use R_SH_SWITCH32 relocs. */
1219 1.1 skrll if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32)
1220 1.1 skrll {
1221 1.1 skrll bfd_vma start, stop;
1222 1.1 skrll bfd_signed_vma voff;
1223 1.1 skrll
1224 1.1 skrll if (ocontents == NULL)
1225 1.1 skrll {
1226 1.1 skrll if (elf_section_data (o)->this_hdr.contents != NULL)
1227 1.1 skrll ocontents = elf_section_data (o)->this_hdr.contents;
1228 1.1 skrll else
1229 1.1 skrll {
1230 1.1 skrll /* We always cache the section contents.
1231 1.1 skrll Perhaps, if info->keep_memory is FALSE, we
1232 1.1 skrll should free them, if we are permitted to,
1233 1.1 skrll when we leave sh_coff_relax_section. */
1234 1.1 skrll if (!bfd_malloc_and_get_section (abfd, o, &ocontents))
1235 1.1 skrll {
1236 1.1 skrll if (ocontents != NULL)
1237 1.1 skrll free (ocontents);
1238 1.1 skrll return FALSE;
1239 1.1 skrll }
1240 1.1 skrll
1241 1.1 skrll elf_section_data (o)->this_hdr.contents = ocontents;
1242 1.1 skrll }
1243 1.1 skrll }
1244 1.1 skrll
1245 1.1 skrll stop = irelscan->r_offset;
1246 1.1 skrll start
1247 1.1 skrll = (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend);
1248 1.1 skrll
1249 1.1 skrll /* STOP is in a different section, so it won't change. */
1250 1.1 skrll if (start > addr && start < toaddr)
1251 1.1 skrll irelscan->r_addend += count;
1252 1.1 skrll
1253 1.1 skrll voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset);
1254 1.1 skrll stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1255 1.1 skrll
1256 1.1 skrll if (start > addr
1257 1.1 skrll && start < toaddr
1258 1.1 skrll && (stop <= addr || stop >= toaddr))
1259 1.1 skrll bfd_put_signed_32 (abfd, (bfd_vma) voff + count,
1260 1.1 skrll ocontents + irelscan->r_offset);
1261 1.1 skrll else if (stop > addr
1262 1.1 skrll && stop < toaddr
1263 1.1 skrll && (start <= addr || start >= toaddr))
1264 1.1 skrll bfd_put_signed_32 (abfd, (bfd_vma) voff - count,
1265 1.1 skrll ocontents + irelscan->r_offset);
1266 1.1 skrll }
1267 1.1 skrll
1268 1.1 skrll if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
1269 1.1 skrll continue;
1270 1.1 skrll
1271 1.1 skrll if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
1272 1.1 skrll continue;
1273 1.1 skrll
1274 1.1 skrll
1275 1.1 skrll isym = isymbuf + ELF32_R_SYM (irelscan->r_info);
1276 1.1 skrll if (isym->st_shndx == sec_shndx
1277 1.1 skrll && (isym->st_value <= addr
1278 1.1 skrll || isym->st_value >= toaddr))
1279 1.1 skrll {
1280 1.1 skrll bfd_vma val;
1281 1.1 skrll
1282 1.1 skrll if (ocontents == NULL)
1283 1.1 skrll {
1284 1.1 skrll if (elf_section_data (o)->this_hdr.contents != NULL)
1285 1.1 skrll ocontents = elf_section_data (o)->this_hdr.contents;
1286 1.1 skrll else
1287 1.1 skrll {
1288 1.1 skrll /* We always cache the section contents.
1289 1.1 skrll Perhaps, if info->keep_memory is FALSE, we
1290 1.1 skrll should free them, if we are permitted to,
1291 1.1 skrll when we leave sh_coff_relax_section. */
1292 1.1 skrll if (!bfd_malloc_and_get_section (abfd, o, &ocontents))
1293 1.1 skrll {
1294 1.1 skrll if (ocontents != NULL)
1295 1.1 skrll free (ocontents);
1296 1.1 skrll return FALSE;
1297 1.1 skrll }
1298 1.1 skrll
1299 1.1 skrll elf_section_data (o)->this_hdr.contents = ocontents;
1300 1.1 skrll }
1301 1.1 skrll }
1302 1.1 skrll
1303 1.1 skrll val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
1304 1.1 skrll val += isym->st_value;
1305 1.1 skrll if (val > addr && val < toaddr)
1306 1.1 skrll bfd_put_32 (abfd, val - count,
1307 1.1 skrll ocontents + irelscan->r_offset);
1308 1.1 skrll }
1309 1.1 skrll }
1310 1.1 skrll }
1311 1.1 skrll
1312 1.1 skrll /* Adjust the local symbols defined in this section. */
1313 1.1 skrll isymend = isymbuf + symtab_hdr->sh_info;
1314 1.1 skrll for (isym = isymbuf; isym < isymend; isym++)
1315 1.1 skrll {
1316 1.1 skrll if (isym->st_shndx == sec_shndx
1317 1.1 skrll && isym->st_value > addr
1318 1.1 skrll && isym->st_value < toaddr)
1319 1.1 skrll isym->st_value -= count;
1320 1.1 skrll }
1321 1.1 skrll
1322 1.1 skrll /* Now adjust the global symbols defined in this section. */
1323 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1324 1.1 skrll - symtab_hdr->sh_info);
1325 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
1326 1.1 skrll end_hashes = sym_hashes + symcount;
1327 1.1 skrll for (; sym_hashes < end_hashes; sym_hashes++)
1328 1.1 skrll {
1329 1.1 skrll struct elf_link_hash_entry *sym_hash = *sym_hashes;
1330 1.1 skrll if ((sym_hash->root.type == bfd_link_hash_defined
1331 1.1 skrll || sym_hash->root.type == bfd_link_hash_defweak)
1332 1.1 skrll && sym_hash->root.u.def.section == sec
1333 1.1 skrll && sym_hash->root.u.def.value > addr
1334 1.1 skrll && sym_hash->root.u.def.value < toaddr)
1335 1.1 skrll {
1336 1.1 skrll sym_hash->root.u.def.value -= count;
1337 1.1 skrll }
1338 1.1 skrll }
1339 1.1 skrll
1340 1.1 skrll /* See if we can move the ALIGN reloc forward. We have adjusted
1341 1.1 skrll r_offset for it already. */
1342 1.1 skrll if (irelalign != NULL)
1343 1.1 skrll {
1344 1.1 skrll bfd_vma alignto, alignaddr;
1345 1.1 skrll
1346 1.1 skrll alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
1347 1.1 skrll alignaddr = BFD_ALIGN (irelalign->r_offset,
1348 1.1 skrll 1 << irelalign->r_addend);
1349 1.1 skrll if (alignto != alignaddr)
1350 1.1 skrll {
1351 1.1 skrll /* Tail recursion. */
1352 1.1 skrll return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
1353 1.1 skrll (int) (alignto - alignaddr));
1354 1.1 skrll }
1355 1.1 skrll }
1356 1.1 skrll
1357 1.1 skrll return TRUE;
1358 1.1 skrll }
1359 1.1 skrll
1360 1.1 skrll /* Look for loads and stores which we can align to four byte
1361 1.1 skrll boundaries. This is like sh_align_loads in coff-sh.c. */
1362 1.1 skrll
1363 1.1 skrll static bfd_boolean
1364 1.1 skrll sh_elf_align_loads (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
1365 1.1 skrll Elf_Internal_Rela *internal_relocs,
1366 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED,
1367 1.1 skrll bfd_boolean *pswapped)
1368 1.1 skrll {
1369 1.1 skrll Elf_Internal_Rela *irel, *irelend;
1370 1.1 skrll bfd_vma *labels = NULL;
1371 1.1 skrll bfd_vma *label, *label_end;
1372 1.1 skrll bfd_size_type amt;
1373 1.1 skrll
1374 1.1 skrll *pswapped = FALSE;
1375 1.1 skrll
1376 1.1 skrll irelend = internal_relocs + sec->reloc_count;
1377 1.1 skrll
1378 1.1 skrll /* Get all the addresses with labels on them. */
1379 1.1 skrll amt = sec->reloc_count;
1380 1.1 skrll amt *= sizeof (bfd_vma);
1381 1.1 skrll labels = (bfd_vma *) bfd_malloc (amt);
1382 1.1 skrll if (labels == NULL)
1383 1.1 skrll goto error_return;
1384 1.1 skrll label_end = labels;
1385 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++)
1386 1.1 skrll {
1387 1.1 skrll if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
1388 1.1 skrll {
1389 1.1 skrll *label_end = irel->r_offset;
1390 1.1 skrll ++label_end;
1391 1.1 skrll }
1392 1.1 skrll }
1393 1.1 skrll
1394 1.1 skrll /* Note that the assembler currently always outputs relocs in
1395 1.1 skrll address order. If that ever changes, this code will need to sort
1396 1.1 skrll the label values and the relocs. */
1397 1.1 skrll
1398 1.1 skrll label = labels;
1399 1.1 skrll
1400 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++)
1401 1.1 skrll {
1402 1.1 skrll bfd_vma start, stop;
1403 1.1 skrll
1404 1.1 skrll if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
1405 1.1 skrll continue;
1406 1.1 skrll
1407 1.1 skrll start = irel->r_offset;
1408 1.1 skrll
1409 1.1 skrll for (irel++; irel < irelend; irel++)
1410 1.1 skrll if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
1411 1.1 skrll break;
1412 1.1 skrll if (irel < irelend)
1413 1.1 skrll stop = irel->r_offset;
1414 1.1 skrll else
1415 1.1 skrll stop = sec->size;
1416 1.1 skrll
1417 1.1 skrll if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
1418 1.1 skrll internal_relocs, &label,
1419 1.1 skrll label_end, start, stop, pswapped))
1420 1.1 skrll goto error_return;
1421 1.1 skrll }
1422 1.1 skrll
1423 1.1 skrll free (labels);
1424 1.1 skrll
1425 1.1 skrll return TRUE;
1426 1.1 skrll
1427 1.1 skrll error_return:
1428 1.1 skrll if (labels != NULL)
1429 1.1 skrll free (labels);
1430 1.1 skrll return FALSE;
1431 1.1 skrll }
1432 1.1 skrll
1433 1.1 skrll #ifndef SH64_ELF
1434 1.1 skrll /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */
1435 1.1 skrll
1436 1.1 skrll static bfd_boolean
1437 1.1 skrll sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs,
1438 1.1 skrll bfd_byte *contents, bfd_vma addr)
1439 1.1 skrll {
1440 1.1 skrll Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
1441 1.1 skrll unsigned short i1, i2;
1442 1.1 skrll Elf_Internal_Rela *irel, *irelend;
1443 1.1 skrll
1444 1.1 skrll /* Swap the instructions themselves. */
1445 1.1 skrll i1 = bfd_get_16 (abfd, contents + addr);
1446 1.1 skrll i2 = bfd_get_16 (abfd, contents + addr + 2);
1447 1.1 skrll bfd_put_16 (abfd, (bfd_vma) i2, contents + addr);
1448 1.1 skrll bfd_put_16 (abfd, (bfd_vma) i1, contents + addr + 2);
1449 1.1 skrll
1450 1.1 skrll /* Adjust all reloc addresses. */
1451 1.1 skrll irelend = internal_relocs + sec->reloc_count;
1452 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++)
1453 1.1 skrll {
1454 1.1 skrll enum elf_sh_reloc_type type;
1455 1.1 skrll int add;
1456 1.1 skrll
1457 1.1 skrll /* There are a few special types of relocs that we don't want to
1458 1.1 skrll adjust. These relocs do not apply to the instruction itself,
1459 1.1 skrll but are only associated with the address. */
1460 1.1 skrll type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
1461 1.1 skrll if (type == R_SH_ALIGN
1462 1.1 skrll || type == R_SH_CODE
1463 1.1 skrll || type == R_SH_DATA
1464 1.1 skrll || type == R_SH_LABEL)
1465 1.1 skrll continue;
1466 1.1 skrll
1467 1.1 skrll /* If an R_SH_USES reloc points to one of the addresses being
1468 1.1 skrll swapped, we must adjust it. It would be incorrect to do this
1469 1.1 skrll for a jump, though, since we want to execute both
1470 1.1 skrll instructions after the jump. (We have avoided swapping
1471 1.1 skrll around a label, so the jump will not wind up executing an
1472 1.1 skrll instruction it shouldn't). */
1473 1.1 skrll if (type == R_SH_USES)
1474 1.1 skrll {
1475 1.1 skrll bfd_vma off;
1476 1.1 skrll
1477 1.1 skrll off = irel->r_offset + 4 + irel->r_addend;
1478 1.1 skrll if (off == addr)
1479 1.1 skrll irel->r_offset += 2;
1480 1.1 skrll else if (off == addr + 2)
1481 1.1 skrll irel->r_offset -= 2;
1482 1.1 skrll }
1483 1.1 skrll
1484 1.1 skrll if (irel->r_offset == addr)
1485 1.1 skrll {
1486 1.1 skrll irel->r_offset += 2;
1487 1.1 skrll add = -2;
1488 1.1 skrll }
1489 1.1 skrll else if (irel->r_offset == addr + 2)
1490 1.1 skrll {
1491 1.1 skrll irel->r_offset -= 2;
1492 1.1 skrll add = 2;
1493 1.1 skrll }
1494 1.1 skrll else
1495 1.1 skrll add = 0;
1496 1.1 skrll
1497 1.1 skrll if (add != 0)
1498 1.1 skrll {
1499 1.1 skrll bfd_byte *loc;
1500 1.1 skrll unsigned short insn, oinsn;
1501 1.1 skrll bfd_boolean overflow;
1502 1.1 skrll
1503 1.1 skrll loc = contents + irel->r_offset;
1504 1.1 skrll overflow = FALSE;
1505 1.1 skrll switch (type)
1506 1.1 skrll {
1507 1.1 skrll default:
1508 1.1 skrll break;
1509 1.1 skrll
1510 1.1 skrll case R_SH_DIR8WPN:
1511 1.1 skrll case R_SH_DIR8WPZ:
1512 1.1 skrll insn = bfd_get_16 (abfd, loc);
1513 1.1 skrll oinsn = insn;
1514 1.1 skrll insn += add / 2;
1515 1.1 skrll if ((oinsn & 0xff00) != (insn & 0xff00))
1516 1.1 skrll overflow = TRUE;
1517 1.1 skrll bfd_put_16 (abfd, (bfd_vma) insn, loc);
1518 1.1 skrll break;
1519 1.1 skrll
1520 1.1 skrll case R_SH_IND12W:
1521 1.1 skrll insn = bfd_get_16 (abfd, loc);
1522 1.1 skrll oinsn = insn;
1523 1.1 skrll insn += add / 2;
1524 1.1 skrll if ((oinsn & 0xf000) != (insn & 0xf000))
1525 1.1 skrll overflow = TRUE;
1526 1.1 skrll bfd_put_16 (abfd, (bfd_vma) insn, loc);
1527 1.1 skrll break;
1528 1.1 skrll
1529 1.1 skrll case R_SH_DIR8WPL:
1530 1.1 skrll /* This reloc ignores the least significant 3 bits of
1531 1.1 skrll the program counter before adding in the offset.
1532 1.1 skrll This means that if ADDR is at an even address, the
1533 1.1 skrll swap will not affect the offset. If ADDR is an at an
1534 1.1 skrll odd address, then the instruction will be crossing a
1535 1.1 skrll four byte boundary, and must be adjusted. */
1536 1.1 skrll if ((addr & 3) != 0)
1537 1.1 skrll {
1538 1.1 skrll insn = bfd_get_16 (abfd, loc);
1539 1.1 skrll oinsn = insn;
1540 1.1 skrll insn += add / 2;
1541 1.1 skrll if ((oinsn & 0xff00) != (insn & 0xff00))
1542 1.1 skrll overflow = TRUE;
1543 1.1 skrll bfd_put_16 (abfd, (bfd_vma) insn, loc);
1544 1.1 skrll }
1545 1.1 skrll
1546 1.1 skrll break;
1547 1.1 skrll }
1548 1.1 skrll
1549 1.1 skrll if (overflow)
1550 1.1 skrll {
1551 1.1 skrll ((*_bfd_error_handler)
1552 1.1 skrll (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
1553 1.1 skrll abfd, (unsigned long) irel->r_offset));
1554 1.1 skrll bfd_set_error (bfd_error_bad_value);
1555 1.1 skrll return FALSE;
1556 1.1 skrll }
1557 1.1 skrll }
1558 1.1 skrll }
1559 1.1 skrll
1560 1.1 skrll return TRUE;
1561 1.1 skrll }
1562 1.1 skrll #endif /* defined SH64_ELF */
1563 1.1 skrll
1564 1.1 skrll /* Describes one of the various PLT styles. */
1566 1.1 skrll
1567 1.1 skrll struct elf_sh_plt_info
1568 1.1 skrll {
1569 1.1 skrll /* The template for the first PLT entry, or NULL if there is no special
1570 1.1 skrll first entry. */
1571 1.1 skrll const bfd_byte *plt0_entry;
1572 1.1 skrll
1573 1.1 skrll /* The size of PLT0_ENTRY in bytes, or 0 if PLT0_ENTRY is NULL. */
1574 1.1 skrll bfd_vma plt0_entry_size;
1575 1.1 skrll
1576 1.1 skrll /* Index I is the offset into PLT0_ENTRY of a pointer to
1577 1.1 skrll _GLOBAL_OFFSET_TABLE_ + I * 4. The value is MINUS_ONE
1578 1.1 skrll if there is no such pointer. */
1579 1.1 skrll bfd_vma plt0_got_fields[3];
1580 1.1 skrll
1581 1.1 skrll /* The template for a symbol's PLT entry. */
1582 1.1 skrll const bfd_byte *symbol_entry;
1583 1.1 skrll
1584 1.1 skrll /* The size of SYMBOL_ENTRY in bytes. */
1585 1.1 skrll bfd_vma symbol_entry_size;
1586 1.1 skrll
1587 1.1 skrll /* Byte offsets of fields in SYMBOL_ENTRY. Not all fields are used
1588 1.1 skrll on all targets. The comments by each member indicate the value
1589 1.1 skrll that the field must hold. */
1590 1.3 christos struct {
1591 1.3 christos bfd_vma got_entry; /* the address of the symbol's .got.plt entry */
1592 1.3 christos bfd_vma plt; /* .plt (or a branch to .plt on VxWorks) */
1593 1.1 skrll bfd_vma reloc_offset; /* the offset of the symbol's JMP_SLOT reloc */
1594 1.1 skrll bfd_boolean got20; /* TRUE if got_entry points to a movi20
1595 1.1 skrll instruction (instead of a constant pool
1596 1.1 skrll entry). */
1597 1.3 christos } symbol_fields;
1598 1.3 christos
1599 1.3 christos /* The offset of the resolver stub from the start of SYMBOL_ENTRY. */
1600 1.3 christos bfd_vma symbol_resolve_offset;
1601 1.3 christos
1602 1.1 skrll /* A different PLT layout which can be used for the first
1603 1.1 skrll MAX_SHORT_PLT entries. It must share the same plt0. NULL in
1604 1.1 skrll other cases. */
1605 1.1 skrll const struct elf_sh_plt_info *short_plt;
1606 1.1 skrll };
1607 1.1 skrll
1608 1.1 skrll #ifdef INCLUDE_SHMEDIA
1609 1.1 skrll
1610 1.1 skrll /* The size in bytes of an entry in the procedure linkage table. */
1611 1.1 skrll
1612 1.1 skrll #define ELF_PLT_ENTRY_SIZE 64
1613 1.1 skrll
1614 1.1 skrll /* First entry in an absolute procedure linkage table look like this. */
1615 1.1 skrll
1616 1.1 skrll static const bfd_byte elf_sh_plt0_entry_be[ELF_PLT_ENTRY_SIZE] =
1617 1.1 skrll {
1618 1.1 skrll 0xcc, 0x00, 0x01, 0x10, /* movi .got.plt >> 16, r17 */
1619 1.1 skrll 0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
1620 1.1 skrll 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
1621 1.1 skrll 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
1622 1.1 skrll 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
1623 1.1 skrll 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
1624 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1625 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1626 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1627 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1628 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1629 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1630 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1631 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1632 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1633 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1634 1.1 skrll };
1635 1.1 skrll
1636 1.1 skrll static const bfd_byte elf_sh_plt0_entry_le[ELF_PLT_ENTRY_SIZE] =
1637 1.1 skrll {
1638 1.1 skrll 0x10, 0x01, 0x00, 0xcc, /* movi .got.plt >> 16, r17 */
1639 1.1 skrll 0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
1640 1.1 skrll 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
1641 1.1 skrll 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
1642 1.1 skrll 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
1643 1.1 skrll 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
1644 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1645 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1646 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1647 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1648 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1649 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1650 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1651 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1652 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1653 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1654 1.1 skrll };
1655 1.1 skrll
1656 1.1 skrll /* Sebsequent entries in an absolute procedure linkage table look like
1657 1.1 skrll this. */
1658 1.1 skrll
1659 1.1 skrll static const bfd_byte elf_sh_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
1660 1.1 skrll {
1661 1.1 skrll 0xcc, 0x00, 0x01, 0x90, /* movi nameN-in-GOT >> 16, r25 */
1662 1.1 skrll 0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
1663 1.1 skrll 0x89, 0x90, 0x01, 0x90, /* ld.l r25, 0, r25 */
1664 1.1 skrll 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
1665 1.1 skrll 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
1666 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1667 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1668 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1669 1.1 skrll 0xcc, 0x00, 0x01, 0x90, /* movi .PLT0 >> 16, r25 */
1670 1.1 skrll 0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */
1671 1.1 skrll 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
1672 1.1 skrll 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
1673 1.1 skrll 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
1674 1.1 skrll 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
1675 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1676 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1677 1.1 skrll };
1678 1.1 skrll
1679 1.1 skrll static const bfd_byte elf_sh_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
1680 1.1 skrll {
1681 1.1 skrll 0x90, 0x01, 0x00, 0xcc, /* movi nameN-in-GOT >> 16, r25 */
1682 1.1 skrll 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
1683 1.1 skrll 0x90, 0x01, 0x90, 0x89, /* ld.l r25, 0, r25 */
1684 1.1 skrll 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
1685 1.1 skrll 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
1686 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1687 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1688 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1689 1.1 skrll 0x90, 0x01, 0x00, 0xcc, /* movi .PLT0 >> 16, r25 */
1690 1.1 skrll 0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */
1691 1.1 skrll 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
1692 1.1 skrll 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
1693 1.1 skrll 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
1694 1.1 skrll 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
1695 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1696 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1697 1.1 skrll };
1698 1.1 skrll
1699 1.1 skrll /* Entries in a PIC procedure linkage table look like this. */
1700 1.1 skrll
1701 1.1 skrll static const bfd_byte elf_sh_pic_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
1702 1.1 skrll {
1703 1.1 skrll 0xcc, 0x00, 0x01, 0x90, /* movi nameN@GOT >> 16, r25 */
1704 1.1 skrll 0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
1705 1.1 skrll 0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */
1706 1.1 skrll 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
1707 1.1 skrll 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
1708 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1709 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1710 1.1 skrll 0x6f, 0xf0, 0xff, 0xf0, /* nop */
1711 1.1 skrll 0xce, 0x00, 0x01, 0x10, /* movi -GOT_BIAS, r17 */
1712 1.1 skrll 0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */
1713 1.1 skrll 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
1714 1.1 skrll 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
1715 1.1 skrll 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
1716 1.1 skrll 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
1717 1.1 skrll 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
1718 1.1 skrll 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
1719 1.1 skrll };
1720 1.1 skrll
1721 1.1 skrll static const bfd_byte elf_sh_pic_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
1722 1.1 skrll {
1723 1.1 skrll 0x90, 0x01, 0x00, 0xcc, /* movi nameN@GOT >> 16, r25 */
1724 1.1 skrll 0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
1725 1.1 skrll 0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */
1726 1.1 skrll 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
1727 1.1 skrll 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
1728 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1729 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1730 1.1 skrll 0xf0, 0xff, 0xf0, 0x6f, /* nop */
1731 1.1 skrll 0x10, 0x01, 0x00, 0xce, /* movi -GOT_BIAS, r17 */
1732 1.1 skrll 0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */
1733 1.1 skrll 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
1734 1.1 skrll 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
1735 1.1 skrll 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
1736 1.1 skrll 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
1737 1.1 skrll 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
1738 1.1 skrll 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
1739 1.1 skrll };
1740 1.1 skrll
1741 1.1 skrll static const struct elf_sh_plt_info elf_sh_plts[2][2] = {
1742 1.1 skrll {
1743 1.1 skrll {
1744 1.1 skrll /* Big-endian non-PIC. */
1745 1.1 skrll elf_sh_plt0_entry_be,
1746 1.3 christos ELF_PLT_ENTRY_SIZE,
1747 1.3 christos { 0, MINUS_ONE, MINUS_ONE },
1748 1.3 christos elf_sh_plt_entry_be,
1749 1.1 skrll ELF_PLT_ENTRY_SIZE,
1750 1.1 skrll { 0, 32, 48, FALSE },
1751 1.1 skrll 33, /* includes ISA encoding */
1752 1.1 skrll NULL
1753 1.1 skrll },
1754 1.1 skrll {
1755 1.1 skrll /* Little-endian non-PIC. */
1756 1.1 skrll elf_sh_plt0_entry_le,
1757 1.3 christos ELF_PLT_ENTRY_SIZE,
1758 1.3 christos { 0, MINUS_ONE, MINUS_ONE },
1759 1.3 christos elf_sh_plt_entry_le,
1760 1.1 skrll ELF_PLT_ENTRY_SIZE,
1761 1.1 skrll { 0, 32, 48, FALSE },
1762 1.1 skrll 33, /* includes ISA encoding */
1763 1.1 skrll NULL
1764 1.1 skrll },
1765 1.1 skrll },
1766 1.1 skrll {
1767 1.1 skrll {
1768 1.1 skrll /* Big-endian PIC. */
1769 1.1 skrll elf_sh_plt0_entry_be,
1770 1.3 christos ELF_PLT_ENTRY_SIZE,
1771 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
1772 1.3 christos elf_sh_pic_plt_entry_be,
1773 1.1 skrll ELF_PLT_ENTRY_SIZE,
1774 1.1 skrll { 0, MINUS_ONE, 52, FALSE },
1775 1.1 skrll 33, /* includes ISA encoding */
1776 1.1 skrll NULL
1777 1.1 skrll },
1778 1.1 skrll {
1779 1.1 skrll /* Little-endian PIC. */
1780 1.1 skrll elf_sh_plt0_entry_le,
1781 1.3 christos ELF_PLT_ENTRY_SIZE,
1782 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
1783 1.3 christos elf_sh_pic_plt_entry_le,
1784 1.1 skrll ELF_PLT_ENTRY_SIZE,
1785 1.1 skrll { 0, MINUS_ONE, 52, FALSE },
1786 1.1 skrll 33, /* includes ISA encoding */
1787 1.1 skrll NULL
1788 1.1 skrll },
1789 1.1 skrll }
1790 1.1 skrll };
1791 1.1 skrll
1792 1.1 skrll /* Return offset of the linker in PLT0 entry. */
1793 1.1 skrll #define elf_sh_plt0_gotplt_offset(info) 0
1794 1.1 skrll
1795 1.1 skrll /* Install a 32-bit PLT field starting at ADDR, which occurs in OUTPUT_BFD.
1796 1.1 skrll VALUE is the field's value and CODE_P is true if VALUE refers to code,
1797 1.1 skrll not data.
1798 1.1 skrll
1799 1.1 skrll On SH64, each 32-bit field is loaded by a movi/shori pair. */
1800 1.1 skrll
1801 1.1 skrll inline static void
1802 1.1 skrll install_plt_field (bfd *output_bfd, bfd_boolean code_p,
1803 1.1 skrll unsigned long value, bfd_byte *addr)
1804 1.1 skrll {
1805 1.1 skrll value |= code_p;
1806 1.1 skrll bfd_put_32 (output_bfd,
1807 1.1 skrll bfd_get_32 (output_bfd, addr)
1808 1.1 skrll | ((value >> 6) & 0x3fffc00),
1809 1.1 skrll addr);
1810 1.1 skrll bfd_put_32 (output_bfd,
1811 1.1 skrll bfd_get_32 (output_bfd, addr + 4)
1812 1.1 skrll | ((value << 10) & 0x3fffc00),
1813 1.1 skrll addr + 4);
1814 1.1 skrll }
1815 1.1 skrll
1816 1.1 skrll /* Return the type of PLT associated with ABFD. PIC_P is true if
1817 1.1 skrll the object is position-independent. */
1818 1.1 skrll
1819 1.1 skrll static const struct elf_sh_plt_info *
1820 1.1 skrll get_plt_info (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean pic_p)
1821 1.1 skrll {
1822 1.1 skrll return &elf_sh_plts[pic_p][!bfd_big_endian (abfd)];
1823 1.1 skrll }
1824 1.1 skrll #else
1825 1.1 skrll /* The size in bytes of an entry in the procedure linkage table. */
1826 1.1 skrll
1827 1.1 skrll #define ELF_PLT_ENTRY_SIZE 28
1828 1.1 skrll
1829 1.1 skrll /* First entry in an absolute procedure linkage table look like this. */
1830 1.1 skrll
1831 1.1 skrll /* Note - this code has been "optimised" not to use r2. r2 is used by
1832 1.1 skrll GCC to return the address of large structures, so it should not be
1833 1.1 skrll corrupted here. This does mean however, that this PLT does not conform
1834 1.1 skrll to the SH PIC ABI. That spec says that r0 contains the type of the PLT
1835 1.1 skrll and r2 contains the GOT id. This version stores the GOT id in r0 and
1836 1.1 skrll ignores the type. Loaders can easily detect this difference however,
1837 1.1 skrll since the type will always be 0 or 8, and the GOT ids will always be
1838 1.1 skrll greater than or equal to 12. */
1839 1.1 skrll static const bfd_byte elf_sh_plt0_entry_be[ELF_PLT_ENTRY_SIZE] =
1840 1.1 skrll {
1841 1.1 skrll 0xd0, 0x05, /* mov.l 2f,r0 */
1842 1.1 skrll 0x60, 0x02, /* mov.l @r0,r0 */
1843 1.1 skrll 0x2f, 0x06, /* mov.l r0,@-r15 */
1844 1.1 skrll 0xd0, 0x03, /* mov.l 1f,r0 */
1845 1.1 skrll 0x60, 0x02, /* mov.l @r0,r0 */
1846 1.1 skrll 0x40, 0x2b, /* jmp @r0 */
1847 1.1 skrll 0x60, 0xf6, /* mov.l @r15+,r0 */
1848 1.1 skrll 0x00, 0x09, /* nop */
1849 1.1 skrll 0x00, 0x09, /* nop */
1850 1.1 skrll 0x00, 0x09, /* nop */
1851 1.1 skrll 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
1852 1.1 skrll 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
1853 1.1 skrll };
1854 1.1 skrll
1855 1.1 skrll static const bfd_byte elf_sh_plt0_entry_le[ELF_PLT_ENTRY_SIZE] =
1856 1.1 skrll {
1857 1.1 skrll 0x05, 0xd0, /* mov.l 2f,r0 */
1858 1.1 skrll 0x02, 0x60, /* mov.l @r0,r0 */
1859 1.1 skrll 0x06, 0x2f, /* mov.l r0,@-r15 */
1860 1.1 skrll 0x03, 0xd0, /* mov.l 1f,r0 */
1861 1.1 skrll 0x02, 0x60, /* mov.l @r0,r0 */
1862 1.1 skrll 0x2b, 0x40, /* jmp @r0 */
1863 1.1 skrll 0xf6, 0x60, /* mov.l @r15+,r0 */
1864 1.1 skrll 0x09, 0x00, /* nop */
1865 1.1 skrll 0x09, 0x00, /* nop */
1866 1.1 skrll 0x09, 0x00, /* nop */
1867 1.1 skrll 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
1868 1.1 skrll 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
1869 1.1 skrll };
1870 1.1 skrll
1871 1.1 skrll /* Sebsequent entries in an absolute procedure linkage table look like
1872 1.1 skrll this. */
1873 1.1 skrll
1874 1.1 skrll static const bfd_byte elf_sh_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
1875 1.1 skrll {
1876 1.1 skrll 0xd0, 0x04, /* mov.l 1f,r0 */
1877 1.1 skrll 0x60, 0x02, /* mov.l @(r0,r12),r0 */
1878 1.1 skrll 0xd1, 0x02, /* mov.l 0f,r1 */
1879 1.1 skrll 0x40, 0x2b, /* jmp @r0 */
1880 1.1 skrll 0x60, 0x13, /* mov r1,r0 */
1881 1.1 skrll 0xd1, 0x03, /* mov.l 2f,r1 */
1882 1.1 skrll 0x40, 0x2b, /* jmp @r0 */
1883 1.1 skrll 0x00, 0x09, /* nop */
1884 1.1 skrll 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
1885 1.1 skrll 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
1886 1.1 skrll 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
1887 1.1 skrll };
1888 1.1 skrll
1889 1.1 skrll static const bfd_byte elf_sh_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
1890 1.1 skrll {
1891 1.1 skrll 0x04, 0xd0, /* mov.l 1f,r0 */
1892 1.1 skrll 0x02, 0x60, /* mov.l @r0,r0 */
1893 1.1 skrll 0x02, 0xd1, /* mov.l 0f,r1 */
1894 1.1 skrll 0x2b, 0x40, /* jmp @r0 */
1895 1.1 skrll 0x13, 0x60, /* mov r1,r0 */
1896 1.1 skrll 0x03, 0xd1, /* mov.l 2f,r1 */
1897 1.1 skrll 0x2b, 0x40, /* jmp @r0 */
1898 1.1 skrll 0x09, 0x00, /* nop */
1899 1.1 skrll 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
1900 1.1 skrll 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
1901 1.1 skrll 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
1902 1.1 skrll };
1903 1.1 skrll
1904 1.1 skrll /* Entries in a PIC procedure linkage table look like this. */
1905 1.1 skrll
1906 1.1 skrll static const bfd_byte elf_sh_pic_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
1907 1.1 skrll {
1908 1.1 skrll 0xd0, 0x04, /* mov.l 1f,r0 */
1909 1.1 skrll 0x00, 0xce, /* mov.l @(r0,r12),r0 */
1910 1.1 skrll 0x40, 0x2b, /* jmp @r0 */
1911 1.1 skrll 0x00, 0x09, /* nop */
1912 1.1 skrll 0x50, 0xc2, /* mov.l @(8,r12),r0 */
1913 1.1 skrll 0xd1, 0x03, /* mov.l 2f,r1 */
1914 1.1 skrll 0x40, 0x2b, /* jmp @r0 */
1915 1.1 skrll 0x50, 0xc1, /* mov.l @(4,r12),r0 */
1916 1.1 skrll 0x00, 0x09, /* nop */
1917 1.1 skrll 0x00, 0x09, /* nop */
1918 1.1 skrll 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
1919 1.1 skrll 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
1920 1.1 skrll };
1921 1.1 skrll
1922 1.1 skrll static const bfd_byte elf_sh_pic_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
1923 1.1 skrll {
1924 1.1 skrll 0x04, 0xd0, /* mov.l 1f,r0 */
1925 1.1 skrll 0xce, 0x00, /* mov.l @(r0,r12),r0 */
1926 1.1 skrll 0x2b, 0x40, /* jmp @r0 */
1927 1.1 skrll 0x09, 0x00, /* nop */
1928 1.1 skrll 0xc2, 0x50, /* mov.l @(8,r12),r0 */
1929 1.1 skrll 0x03, 0xd1, /* mov.l 2f,r1 */
1930 1.1 skrll 0x2b, 0x40, /* jmp @r0 */
1931 1.1 skrll 0xc1, 0x50, /* mov.l @(4,r12),r0 */
1932 1.1 skrll 0x09, 0x00, /* nop */
1933 1.1 skrll 0x09, 0x00, /* nop */
1934 1.1 skrll 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
1935 1.1 skrll 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
1936 1.1 skrll };
1937 1.1 skrll
1938 1.1 skrll static const struct elf_sh_plt_info elf_sh_plts[2][2] = {
1939 1.1 skrll {
1940 1.1 skrll {
1941 1.1 skrll /* Big-endian non-PIC. */
1942 1.1 skrll elf_sh_plt0_entry_be,
1943 1.3 christos ELF_PLT_ENTRY_SIZE,
1944 1.3 christos { MINUS_ONE, 24, 20 },
1945 1.3 christos elf_sh_plt_entry_be,
1946 1.1 skrll ELF_PLT_ENTRY_SIZE,
1947 1.1 skrll { 20, 16, 24, FALSE },
1948 1.1 skrll 8,
1949 1.1 skrll NULL
1950 1.1 skrll },
1951 1.1 skrll {
1952 1.1 skrll /* Little-endian non-PIC. */
1953 1.1 skrll elf_sh_plt0_entry_le,
1954 1.3 christos ELF_PLT_ENTRY_SIZE,
1955 1.3 christos { MINUS_ONE, 24, 20 },
1956 1.3 christos elf_sh_plt_entry_le,
1957 1.1 skrll ELF_PLT_ENTRY_SIZE,
1958 1.1 skrll { 20, 16, 24, FALSE },
1959 1.1 skrll 8,
1960 1.1 skrll NULL
1961 1.1 skrll },
1962 1.1 skrll },
1963 1.1 skrll {
1964 1.1 skrll {
1965 1.1 skrll /* Big-endian PIC. */
1966 1.1 skrll elf_sh_plt0_entry_be,
1967 1.3 christos ELF_PLT_ENTRY_SIZE,
1968 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
1969 1.3 christos elf_sh_pic_plt_entry_be,
1970 1.1 skrll ELF_PLT_ENTRY_SIZE,
1971 1.1 skrll { 20, MINUS_ONE, 24, FALSE },
1972 1.1 skrll 8,
1973 1.1 skrll NULL
1974 1.1 skrll },
1975 1.1 skrll {
1976 1.1 skrll /* Little-endian PIC. */
1977 1.1 skrll elf_sh_plt0_entry_le,
1978 1.3 christos ELF_PLT_ENTRY_SIZE,
1979 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
1980 1.3 christos elf_sh_pic_plt_entry_le,
1981 1.1 skrll ELF_PLT_ENTRY_SIZE,
1982 1.1 skrll { 20, MINUS_ONE, 24, FALSE },
1983 1.1 skrll 8,
1984 1.1 skrll NULL
1985 1.1 skrll },
1986 1.1 skrll }
1987 1.1 skrll };
1988 1.1 skrll
1989 1.1 skrll #define VXWORKS_PLT_HEADER_SIZE 12
1990 1.1 skrll #define VXWORKS_PLT_ENTRY_SIZE 24
1991 1.1 skrll
1992 1.1 skrll static const bfd_byte vxworks_sh_plt0_entry_be[VXWORKS_PLT_HEADER_SIZE] =
1993 1.1 skrll {
1994 1.1 skrll 0xd1, 0x01, /* mov.l @(8,pc),r1 */
1995 1.1 skrll 0x61, 0x12, /* mov.l @r1,r1 */
1996 1.1 skrll 0x41, 0x2b, /* jmp @r1 */
1997 1.1 skrll 0x00, 0x09, /* nop */
1998 1.1 skrll 0, 0, 0, 0 /* 0: replaced with _GLOBAL_OFFSET_TABLE+8. */
1999 1.1 skrll };
2000 1.1 skrll
2001 1.1 skrll static const bfd_byte vxworks_sh_plt0_entry_le[VXWORKS_PLT_HEADER_SIZE] =
2002 1.1 skrll {
2003 1.1 skrll 0x01, 0xd1, /* mov.l @(8,pc),r1 */
2004 1.1 skrll 0x12, 0x61, /* mov.l @r1,r1 */
2005 1.1 skrll 0x2b, 0x41, /* jmp @r1 */
2006 1.1 skrll 0x09, 0x00, /* nop */
2007 1.1 skrll 0, 0, 0, 0 /* 0: replaced with _GLOBAL_OFFSET_TABLE+8. */
2008 1.1 skrll };
2009 1.1 skrll
2010 1.1 skrll static const bfd_byte vxworks_sh_plt_entry_be[VXWORKS_PLT_ENTRY_SIZE] =
2011 1.1 skrll {
2012 1.1 skrll 0xd0, 0x01, /* mov.l @(8,pc),r0 */
2013 1.1 skrll 0x60, 0x02, /* mov.l @r0,r0 */
2014 1.1 skrll 0x40, 0x2b, /* jmp @r0 */
2015 1.1 skrll 0x00, 0x09, /* nop */
2016 1.1 skrll 0, 0, 0, 0, /* 0: replaced with address of this symbol in .got. */
2017 1.1 skrll 0xd0, 0x01, /* mov.l @(8,pc),r0 */
2018 1.1 skrll 0xa0, 0x00, /* bra PLT (We need to fix the offset.) */
2019 1.1 skrll 0x00, 0x09, /* nop */
2020 1.1 skrll 0x00, 0x09, /* nop */
2021 1.1 skrll 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2022 1.1 skrll };
2023 1.1 skrll
2024 1.1 skrll static const bfd_byte vxworks_sh_plt_entry_le[VXWORKS_PLT_ENTRY_SIZE] =
2025 1.1 skrll {
2026 1.1 skrll 0x01, 0xd0, /* mov.l @(8,pc),r0 */
2027 1.1 skrll 0x02, 0x60, /* mov.l @r0,r0 */
2028 1.1 skrll 0x2b, 0x40, /* jmp @r0 */
2029 1.1 skrll 0x09, 0x00, /* nop */
2030 1.1 skrll 0, 0, 0, 0, /* 0: replaced with address of this symbol in .got. */
2031 1.1 skrll 0x01, 0xd0, /* mov.l @(8,pc),r0 */
2032 1.1 skrll 0x00, 0xa0, /* bra PLT (We need to fix the offset.) */
2033 1.1 skrll 0x09, 0x00, /* nop */
2034 1.1 skrll 0x09, 0x00, /* nop */
2035 1.1 skrll 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2036 1.1 skrll };
2037 1.1 skrll
2038 1.1 skrll static const bfd_byte vxworks_sh_pic_plt_entry_be[VXWORKS_PLT_ENTRY_SIZE] =
2039 1.1 skrll {
2040 1.1 skrll 0xd0, 0x01, /* mov.l @(8,pc),r0 */
2041 1.1 skrll 0x00, 0xce, /* mov.l @(r0,r12),r0 */
2042 1.1 skrll 0x40, 0x2b, /* jmp @r0 */
2043 1.1 skrll 0x00, 0x09, /* nop */
2044 1.1 skrll 0, 0, 0, 0, /* 0: replaced with offset of this symbol in .got. */
2045 1.1 skrll 0xd0, 0x01, /* mov.l @(8,pc),r0 */
2046 1.1 skrll 0x51, 0xc2, /* mov.l @(8,r12),r1 */
2047 1.1 skrll 0x41, 0x2b, /* jmp @r1 */
2048 1.1 skrll 0x00, 0x09, /* nop */
2049 1.1 skrll 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2050 1.1 skrll };
2051 1.1 skrll
2052 1.1 skrll static const bfd_byte vxworks_sh_pic_plt_entry_le[VXWORKS_PLT_ENTRY_SIZE] =
2053 1.1 skrll {
2054 1.1 skrll 0x01, 0xd0, /* mov.l @(8,pc),r0 */
2055 1.1 skrll 0xce, 0x00, /* mov.l @(r0,r12),r0 */
2056 1.1 skrll 0x2b, 0x40, /* jmp @r0 */
2057 1.1 skrll 0x09, 0x00, /* nop */
2058 1.1 skrll 0, 0, 0, 0, /* 0: replaced with offset of this symbol in .got. */
2059 1.1 skrll 0x01, 0xd0, /* mov.l @(8,pc),r0 */
2060 1.1 skrll 0xc2, 0x51, /* mov.l @(8,r12),r1 */
2061 1.1 skrll 0x2b, 0x41, /* jmp @r1 */
2062 1.1 skrll 0x09, 0x00, /* nop */
2063 1.1 skrll 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2064 1.1 skrll };
2065 1.1 skrll
2066 1.1 skrll static const struct elf_sh_plt_info vxworks_sh_plts[2][2] = {
2067 1.1 skrll {
2068 1.1 skrll {
2069 1.1 skrll /* Big-endian non-PIC. */
2070 1.1 skrll vxworks_sh_plt0_entry_be,
2071 1.3 christos VXWORKS_PLT_HEADER_SIZE,
2072 1.3 christos { MINUS_ONE, MINUS_ONE, 8 },
2073 1.3 christos vxworks_sh_plt_entry_be,
2074 1.1 skrll VXWORKS_PLT_ENTRY_SIZE,
2075 1.1 skrll { 8, 14, 20, FALSE },
2076 1.1 skrll 12,
2077 1.1 skrll NULL
2078 1.1 skrll },
2079 1.1 skrll {
2080 1.1 skrll /* Little-endian non-PIC. */
2081 1.1 skrll vxworks_sh_plt0_entry_le,
2082 1.3 christos VXWORKS_PLT_HEADER_SIZE,
2083 1.3 christos { MINUS_ONE, MINUS_ONE, 8 },
2084 1.3 christos vxworks_sh_plt_entry_le,
2085 1.1 skrll VXWORKS_PLT_ENTRY_SIZE,
2086 1.1 skrll { 8, 14, 20, FALSE },
2087 1.1 skrll 12,
2088 1.1 skrll NULL
2089 1.1 skrll },
2090 1.1 skrll },
2091 1.1 skrll {
2092 1.1 skrll {
2093 1.1 skrll /* Big-endian PIC. */
2094 1.1 skrll NULL,
2095 1.3 christos 0,
2096 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2097 1.3 christos vxworks_sh_pic_plt_entry_be,
2098 1.1 skrll VXWORKS_PLT_ENTRY_SIZE,
2099 1.1 skrll { 8, MINUS_ONE, 20, FALSE },
2100 1.1 skrll 12,
2101 1.1 skrll NULL
2102 1.1 skrll },
2103 1.1 skrll {
2104 1.1 skrll /* Little-endian PIC. */
2105 1.1 skrll NULL,
2106 1.3 christos 0,
2107 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2108 1.3 christos vxworks_sh_pic_plt_entry_le,
2109 1.1 skrll VXWORKS_PLT_ENTRY_SIZE,
2110 1.1 skrll { 8, MINUS_ONE, 20, FALSE },
2111 1.1 skrll 12,
2112 1.1 skrll NULL
2113 1.3 christos },
2114 1.3 christos }
2115 1.3 christos };
2116 1.3 christos
2117 1.3 christos /* FDPIC PLT entries. Two unimplemented optimizations for lazy
2118 1.3 christos binding are to omit the lazy binding stub when linking with -z now
2119 1.3 christos and to move lazy binding stubs into a separate region for better
2120 1.3 christos cache behavior. */
2121 1.3 christos
2122 1.3 christos #define FDPIC_PLT_ENTRY_SIZE 28
2123 1.3 christos #define FDPIC_PLT_LAZY_OFFSET 20
2124 1.3 christos
2125 1.3 christos /* FIXME: The lazy binding stub requires a plt0 - which may need to be
2126 1.3 christos duplicated if it is out of range, or which can be inlined. So
2127 1.3 christos right now it is always inlined, which wastes a word per stub. It
2128 1.3 christos might be easier to handle the duplication if we put the lazy
2129 1.3 christos stubs separately. */
2130 1.3 christos
2131 1.3 christos static const bfd_byte fdpic_sh_plt_entry_be[FDPIC_PLT_ENTRY_SIZE] =
2132 1.3 christos {
2133 1.3 christos 0xd0, 0x02, /* mov.l @(12,pc),r0 */
2134 1.3 christos 0x01, 0xce, /* mov.l @(r0,r12),r1 */
2135 1.3 christos 0x70, 0x04, /* add #4, r0 */
2136 1.3 christos 0x41, 0x2b, /* jmp @r1 */
2137 1.3 christos 0x0c, 0xce, /* mov.l @(r0,r12),r12 */
2138 1.3 christos 0x00, 0x09, /* nop */
2139 1.3 christos 0, 0, 0, 0, /* 0: replaced with offset of this symbol's funcdesc */
2140 1.3 christos 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2141 1.3 christos 0x60, 0xc2, /* mov.l @r12,r0 */
2142 1.3 christos 0x40, 0x2b, /* jmp @r0 */
2143 1.3 christos 0x53, 0xc1, /* mov.l @(4,r12),r3 */
2144 1.3 christos 0x00, 0x09, /* nop */
2145 1.3 christos };
2146 1.3 christos
2147 1.3 christos static const bfd_byte fdpic_sh_plt_entry_le[FDPIC_PLT_ENTRY_SIZE] =
2148 1.3 christos {
2149 1.3 christos 0x02, 0xd0, /* mov.l @(12,pc),r0 */
2150 1.3 christos 0xce, 0x01, /* mov.l @(r0,r12),r1 */
2151 1.3 christos 0x04, 0x70, /* add #4, r0 */
2152 1.3 christos 0x2b, 0x41, /* jmp @r1 */
2153 1.3 christos 0xce, 0x0c, /* mov.l @(r0,r12),r12 */
2154 1.3 christos 0x09, 0x00, /* nop */
2155 1.3 christos 0, 0, 0, 0, /* 0: replaced with offset of this symbol's funcdesc */
2156 1.3 christos 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2157 1.3 christos 0xc2, 0x60, /* mov.l @r12,r0 */
2158 1.3 christos 0x2b, 0x40, /* jmp @r0 */
2159 1.3 christos 0xc1, 0x53, /* mov.l @(4,r12),r3 */
2160 1.3 christos 0x09, 0x00, /* nop */
2161 1.3 christos };
2162 1.3 christos
2163 1.3 christos static const struct elf_sh_plt_info fdpic_sh_plts[2] = {
2164 1.3 christos {
2165 1.3 christos /* Big-endian PIC. */
2166 1.3 christos NULL,
2167 1.3 christos 0,
2168 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2169 1.3 christos fdpic_sh_plt_entry_be,
2170 1.3 christos FDPIC_PLT_ENTRY_SIZE,
2171 1.3 christos { 12, MINUS_ONE, 16, FALSE },
2172 1.3 christos FDPIC_PLT_LAZY_OFFSET,
2173 1.3 christos NULL
2174 1.3 christos },
2175 1.3 christos {
2176 1.3 christos /* Little-endian PIC. */
2177 1.3 christos NULL,
2178 1.3 christos 0,
2179 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2180 1.3 christos fdpic_sh_plt_entry_le,
2181 1.3 christos FDPIC_PLT_ENTRY_SIZE,
2182 1.3 christos { 12, MINUS_ONE, 16, FALSE },
2183 1.3 christos FDPIC_PLT_LAZY_OFFSET,
2184 1.3 christos NULL
2185 1.3 christos },
2186 1.3 christos };
2187 1.3 christos
2188 1.3 christos /* On SH2A, we can use the movi20 instruction to generate shorter PLT
2189 1.3 christos entries for the first 64K slots. We use the normal FDPIC PLT entry
2190 1.3 christos past that point; we could also use movi20s, which might be faster,
2191 1.3 christos but would not be any smaller. */
2192 1.3 christos
2193 1.3 christos #define FDPIC_SH2A_PLT_ENTRY_SIZE 24
2194 1.3 christos #define FDPIC_SH2A_PLT_LAZY_OFFSET 16
2195 1.3 christos
2196 1.3 christos static const bfd_byte fdpic_sh2a_plt_entry_be[FDPIC_SH2A_PLT_ENTRY_SIZE] =
2197 1.3 christos {
2198 1.3 christos 0, 0, 0, 0, /* movi20 #gotofffuncdesc,r0 */
2199 1.3 christos 0x01, 0xce, /* mov.l @(r0,r12),r1 */
2200 1.3 christos 0x70, 0x04, /* add #4, r0 */
2201 1.3 christos 0x41, 0x2b, /* jmp @r1 */
2202 1.3 christos 0x0c, 0xce, /* mov.l @(r0,r12),r12 */
2203 1.3 christos 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2204 1.3 christos 0x60, 0xc2, /* mov.l @r12,r0 */
2205 1.3 christos 0x40, 0x2b, /* jmp @r0 */
2206 1.3 christos 0x53, 0xc1, /* mov.l @(4,r12),r3 */
2207 1.3 christos 0x00, 0x09, /* nop */
2208 1.3 christos };
2209 1.3 christos
2210 1.3 christos static const bfd_byte fdpic_sh2a_plt_entry_le[FDPIC_SH2A_PLT_ENTRY_SIZE] =
2211 1.3 christos {
2212 1.3 christos 0, 0, 0, 0, /* movi20 #gotofffuncdesc,r0 */
2213 1.3 christos 0xce, 0x01, /* mov.l @(r0,r12),r1 */
2214 1.3 christos 0x04, 0x70, /* add #4, r0 */
2215 1.3 christos 0x2b, 0x41, /* jmp @r1 */
2216 1.3 christos 0xce, 0x0c, /* mov.l @(r0,r12),r12 */
2217 1.3 christos 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */
2218 1.3 christos 0xc2, 0x60, /* mov.l @r12,r0 */
2219 1.3 christos 0x2b, 0x40, /* jmp @r0 */
2220 1.3 christos 0xc1, 0x53, /* mov.l @(4,r12),r3 */
2221 1.3 christos 0x09, 0x00, /* nop */
2222 1.3 christos };
2223 1.3 christos
2224 1.3 christos static const struct elf_sh_plt_info fdpic_sh2a_short_plt_be = {
2225 1.3 christos /* Big-endian FDPIC, max index 64K. */
2226 1.3 christos NULL,
2227 1.3 christos 0,
2228 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2229 1.3 christos fdpic_sh2a_plt_entry_be,
2230 1.3 christos FDPIC_SH2A_PLT_ENTRY_SIZE,
2231 1.3 christos { 0, MINUS_ONE, 12, TRUE },
2232 1.3 christos FDPIC_SH2A_PLT_LAZY_OFFSET,
2233 1.3 christos NULL
2234 1.3 christos };
2235 1.3 christos
2236 1.3 christos static const struct elf_sh_plt_info fdpic_sh2a_short_plt_le = {
2237 1.3 christos /* Little-endian FDPIC, max index 64K. */
2238 1.3 christos NULL,
2239 1.3 christos 0,
2240 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2241 1.3 christos fdpic_sh2a_plt_entry_le,
2242 1.3 christos FDPIC_SH2A_PLT_ENTRY_SIZE,
2243 1.3 christos { 0, MINUS_ONE, 12, TRUE },
2244 1.3 christos FDPIC_SH2A_PLT_LAZY_OFFSET,
2245 1.3 christos NULL
2246 1.3 christos };
2247 1.3 christos
2248 1.3 christos static const struct elf_sh_plt_info fdpic_sh2a_plts[2] = {
2249 1.3 christos {
2250 1.3 christos /* Big-endian PIC. */
2251 1.3 christos NULL,
2252 1.3 christos 0,
2253 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2254 1.3 christos fdpic_sh_plt_entry_be,
2255 1.3 christos FDPIC_PLT_ENTRY_SIZE,
2256 1.3 christos { 12, MINUS_ONE, 16, FALSE },
2257 1.3 christos FDPIC_PLT_LAZY_OFFSET,
2258 1.3 christos &fdpic_sh2a_short_plt_be
2259 1.3 christos },
2260 1.3 christos {
2261 1.3 christos /* Little-endian PIC. */
2262 1.3 christos NULL,
2263 1.3 christos 0,
2264 1.3 christos { MINUS_ONE, MINUS_ONE, MINUS_ONE },
2265 1.3 christos fdpic_sh_plt_entry_le,
2266 1.3 christos FDPIC_PLT_ENTRY_SIZE,
2267 1.3 christos { 12, MINUS_ONE, 16, FALSE },
2268 1.3 christos FDPIC_PLT_LAZY_OFFSET,
2269 1.1 skrll &fdpic_sh2a_short_plt_le
2270 1.1 skrll },
2271 1.1 skrll };
2272 1.1 skrll
2273 1.3 christos /* Return the type of PLT associated with ABFD. PIC_P is true if
2274 1.1 skrll the object is position-independent. */
2275 1.3 christos
2276 1.3 christos static const struct elf_sh_plt_info *
2277 1.3 christos get_plt_info (bfd *abfd, bfd_boolean pic_p)
2278 1.3 christos {
2279 1.3 christos if (fdpic_object_p (abfd))
2280 1.3 christos {
2281 1.3 christos /* If any input file requires SH2A we can use a shorter PLT
2282 1.3 christos sequence. */
2283 1.3 christos if (sh_get_arch_from_bfd_mach (bfd_get_mach (abfd)) & arch_sh2a_base)
2284 1.1 skrll return &fdpic_sh2a_plts[!bfd_big_endian (abfd)];
2285 1.1 skrll else
2286 1.1 skrll return &fdpic_sh_plts[!bfd_big_endian (abfd)];
2287 1.1 skrll }
2288 1.1 skrll if (vxworks_object_p (abfd))
2289 1.1 skrll return &vxworks_sh_plts[pic_p][!bfd_big_endian (abfd)];
2290 1.1 skrll return &elf_sh_plts[pic_p][!bfd_big_endian (abfd)];
2291 1.1 skrll }
2292 1.1 skrll
2293 1.1 skrll /* Install a 32-bit PLT field starting at ADDR, which occurs in OUTPUT_BFD.
2294 1.1 skrll VALUE is the field's value and CODE_P is true if VALUE refers to code,
2295 1.1 skrll not data. */
2296 1.1 skrll
2297 1.1 skrll inline static void
2298 1.1 skrll install_plt_field (bfd *output_bfd, bfd_boolean code_p ATTRIBUTE_UNUSED,
2299 1.1 skrll unsigned long value, bfd_byte *addr)
2300 1.1 skrll {
2301 1.3 christos bfd_put_32 (output_bfd, value, addr);
2302 1.3 christos }
2303 1.3 christos #endif
2304 1.3 christos
2305 1.3 christos /* The number of PLT entries which can use a shorter PLT, if any.
2306 1.3 christos Currently always 64K, since only SH-2A FDPIC uses this; a
2307 1.1 skrll 20-bit movi20 can address that many function descriptors below
2308 1.1 skrll _GLOBAL_OFFSET_TABLE_. */
2309 1.1 skrll #define MAX_SHORT_PLT 65536
2310 1.1 skrll
2311 1.1 skrll /* Return the index of the PLT entry at byte offset OFFSET. */
2312 1.3 christos
2313 1.3 christos static bfd_vma
2314 1.3 christos get_plt_index (const struct elf_sh_plt_info *info, bfd_vma offset)
2315 1.3 christos {
2316 1.3 christos bfd_vma plt_index = 0;
2317 1.3 christos
2318 1.3 christos offset -= info->plt0_entry_size;
2319 1.3 christos if (info->short_plt != NULL)
2320 1.3 christos {
2321 1.3 christos if (offset > MAX_SHORT_PLT * info->short_plt->symbol_entry_size)
2322 1.3 christos {
2323 1.3 christos plt_index = MAX_SHORT_PLT;
2324 1.3 christos offset -= MAX_SHORT_PLT * info->short_plt->symbol_entry_size;
2325 1.3 christos }
2326 1.1 skrll else
2327 1.1 skrll info = info->short_plt;
2328 1.1 skrll }
2329 1.1 skrll return plt_index + offset / info->symbol_entry_size;
2330 1.1 skrll }
2331 1.3 christos
2332 1.1 skrll /* Do the inverse operation. */
2333 1.3 christos
2334 1.3 christos static bfd_vma
2335 1.3 christos get_plt_offset (const struct elf_sh_plt_info *info, bfd_vma plt_index)
2336 1.3 christos {
2337 1.3 christos bfd_vma offset = 0;
2338 1.3 christos
2339 1.3 christos if (info->short_plt != NULL)
2340 1.3 christos {
2341 1.3 christos if (plt_index > MAX_SHORT_PLT)
2342 1.3 christos {
2343 1.3 christos offset = MAX_SHORT_PLT * info->short_plt->symbol_entry_size;
2344 1.3 christos plt_index -= MAX_SHORT_PLT;
2345 1.3 christos }
2346 1.3 christos else
2347 1.1 skrll info = info->short_plt;
2348 1.1 skrll }
2349 1.1 skrll return (offset + info->plt0_entry_size
2350 1.1 skrll + (plt_index * info->symbol_entry_size));
2351 1.1 skrll }
2352 1.1 skrll
2353 1.1 skrll /* The sh linker needs to keep track of the number of relocs that it
2354 1.1 skrll decides to copy as dynamic relocs in check_relocs for each symbol.
2355 1.1 skrll This is so that it can later discard them if they are found to be
2356 1.1 skrll unnecessary. We store the information in a field extending the
2357 1.1 skrll regular ELF linker hash table. */
2358 1.1 skrll
2359 1.1 skrll struct elf_sh_dyn_relocs
2360 1.1 skrll {
2361 1.1 skrll struct elf_sh_dyn_relocs *next;
2362 1.1 skrll
2363 1.1 skrll /* The input section of the reloc. */
2364 1.1 skrll asection *sec;
2365 1.1 skrll
2366 1.1 skrll /* Total number of relocs copied for the input section. */
2367 1.1 skrll bfd_size_type count;
2368 1.1 skrll
2369 1.3 christos /* Number of pc-relative relocs copied for the input section. */
2370 1.3 christos bfd_size_type pc_count;
2371 1.3 christos };
2372 1.3 christos
2373 1.3 christos union gotref
2374 1.3 christos {
2375 1.1 skrll bfd_signed_vma refcount;
2376 1.1 skrll bfd_vma offset;
2377 1.1 skrll };
2378 1.1 skrll
2379 1.1 skrll /* sh ELF linker hash entry. */
2380 1.1 skrll
2381 1.1 skrll struct elf_sh_link_hash_entry
2382 1.1 skrll {
2383 1.1 skrll struct elf_link_hash_entry root;
2384 1.1 skrll
2385 1.1 skrll #ifdef INCLUDE_SHMEDIA
2386 1.1 skrll union
2387 1.1 skrll {
2388 1.1 skrll bfd_signed_vma refcount;
2389 1.1 skrll bfd_vma offset;
2390 1.1 skrll } datalabel_got;
2391 1.1 skrll #endif
2392 1.1 skrll
2393 1.1 skrll /* Track dynamic relocs copied for this symbol. */
2394 1.3 christos struct elf_sh_dyn_relocs *dyn_relocs;
2395 1.3 christos
2396 1.3 christos bfd_signed_vma gotplt_refcount;
2397 1.3 christos
2398 1.3 christos /* A local function descriptor, for FDPIC. The refcount counts
2399 1.3 christos R_SH_FUNCDESC, R_SH_GOTOFFFUNCDESC, and R_SH_GOTOFFFUNCDESC20
2400 1.3 christos relocations; the PLT and GOT entry are accounted
2401 1.3 christos for separately. After adjust_dynamic_symbol, the offset is
2402 1.3 christos MINUS_ONE if there is no local descriptor (dynamic linker
2403 1.3 christos managed and no PLT entry, or undefined weak non-dynamic).
2404 1.3 christos During check_relocs we do not yet know whether the local
2405 1.3 christos descriptor will be canonical. */
2406 1.3 christos union gotref funcdesc;
2407 1.3 christos
2408 1.1 skrll /* How many of the above refcounted relocations were R_SH_FUNCDESC,
2409 1.3 christos and thus require fixups or relocations. */
2410 1.3 christos bfd_signed_vma abs_funcdesc_refcount;
2411 1.1 skrll
2412 1.1 skrll enum {
2413 1.1 skrll GOT_UNKNOWN = 0, GOT_NORMAL, GOT_TLS_GD, GOT_TLS_IE, GOT_FUNCDESC
2414 1.1 skrll } got_type;
2415 1.1 skrll };
2416 1.1 skrll
2417 1.1 skrll #define sh_elf_hash_entry(ent) ((struct elf_sh_link_hash_entry *)(ent))
2418 1.1 skrll
2419 1.3 christos struct sh_elf_obj_tdata
2420 1.3 christos {
2421 1.3 christos struct elf_obj_tdata root;
2422 1.3 christos
2423 1.3 christos /* got_type for each local got entry. */
2424 1.1 skrll char *local_got_type;
2425 1.1 skrll
2426 1.1 skrll /* Function descriptor refcount and offset for each local symbol. */
2427 1.1 skrll union gotref *local_funcdesc;
2428 1.1 skrll };
2429 1.3 christos
2430 1.3 christos #define sh_elf_tdata(abfd) \
2431 1.3 christos ((struct sh_elf_obj_tdata *) (abfd)->tdata.any)
2432 1.3 christos
2433 1.3 christos #define sh_elf_local_got_type(abfd) \
2434 1.1 skrll (sh_elf_tdata (abfd)->local_got_type)
2435 1.1 skrll
2436 1.1 skrll #define sh_elf_local_funcdesc(abfd) \
2437 1.1 skrll (sh_elf_tdata (abfd)->local_funcdesc)
2438 1.3 christos
2439 1.1 skrll #define is_sh_elf(bfd) \
2440 1.1 skrll (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2441 1.1 skrll && elf_tdata (bfd) != NULL \
2442 1.1 skrll && elf_object_id (bfd) == SH_ELF_DATA)
2443 1.1 skrll
2444 1.1 skrll /* Override the generic function because we need to store sh_elf_obj_tdata
2445 1.1 skrll as the specific tdata. */
2446 1.1 skrll
2447 1.3 christos static bfd_boolean
2448 1.1 skrll sh_elf_mkobject (bfd *abfd)
2449 1.1 skrll {
2450 1.1 skrll return bfd_elf_allocate_object (abfd, sizeof (struct sh_elf_obj_tdata),
2451 1.1 skrll SH_ELF_DATA);
2452 1.1 skrll }
2453 1.1 skrll
2454 1.1 skrll /* sh ELF linker hash table. */
2455 1.1 skrll
2456 1.1 skrll struct elf_sh_link_hash_table
2457 1.1 skrll {
2458 1.1 skrll struct elf_link_hash_table root;
2459 1.1 skrll
2460 1.1 skrll /* Short-cuts to get to dynamic linker sections. */
2461 1.1 skrll asection *sgot;
2462 1.1 skrll asection *sgotplt;
2463 1.1 skrll asection *srelgot;
2464 1.3 christos asection *splt;
2465 1.3 christos asection *srelplt;
2466 1.3 christos asection *sdynbss;
2467 1.1 skrll asection *srelbss;
2468 1.1 skrll asection *sfuncdesc;
2469 1.1 skrll asection *srelfuncdesc;
2470 1.1 skrll asection *srofixup;
2471 1.3 christos
2472 1.3 christos /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
2473 1.1 skrll asection *srelplt2;
2474 1.1 skrll
2475 1.1 skrll /* Small local sym cache. */
2476 1.1 skrll struct sym_cache sym_cache;
2477 1.1 skrll
2478 1.1 skrll /* A counter or offset to track a TLS got entry. */
2479 1.1 skrll union
2480 1.1 skrll {
2481 1.1 skrll bfd_signed_vma refcount;
2482 1.1 skrll bfd_vma offset;
2483 1.1 skrll } tls_ldm_got;
2484 1.1 skrll
2485 1.1 skrll /* The type of PLT to use. */
2486 1.3 christos const struct elf_sh_plt_info *plt_info;
2487 1.3 christos
2488 1.3 christos /* True if the target system is VxWorks. */
2489 1.1 skrll bfd_boolean vxworks_p;
2490 1.1 skrll
2491 1.1 skrll /* True if the target system uses FDPIC. */
2492 1.1 skrll bfd_boolean fdpic_p;
2493 1.1 skrll };
2494 1.1 skrll
2495 1.1 skrll /* Traverse an sh ELF linker hash table. */
2496 1.1 skrll
2497 1.1 skrll #define sh_elf_link_hash_traverse(table, func, info) \
2498 1.1 skrll (elf_link_hash_traverse \
2499 1.1 skrll (&(table)->root, \
2500 1.1 skrll (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2501 1.1 skrll (info)))
2502 1.3 christos
2503 1.3 christos /* Get the sh ELF linker hash table from a link_info structure. */
2504 1.1 skrll
2505 1.1 skrll #define sh_elf_hash_table(p) \
2506 1.1 skrll (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
2507 1.1 skrll == SH_ELF_DATA ? ((struct elf_sh_link_hash_table *) ((p)->hash)) : NULL)
2508 1.1 skrll
2509 1.1 skrll /* Create an entry in an sh ELF linker hash table. */
2510 1.1 skrll
2511 1.1 skrll static struct bfd_hash_entry *
2512 1.1 skrll sh_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
2513 1.1 skrll struct bfd_hash_table *table,
2514 1.1 skrll const char *string)
2515 1.1 skrll {
2516 1.1 skrll struct elf_sh_link_hash_entry *ret =
2517 1.1 skrll (struct elf_sh_link_hash_entry *) entry;
2518 1.1 skrll
2519 1.1 skrll /* Allocate the structure if it has not already been allocated by a
2520 1.1 skrll subclass. */
2521 1.1 skrll if (ret == (struct elf_sh_link_hash_entry *) NULL)
2522 1.1 skrll ret = ((struct elf_sh_link_hash_entry *)
2523 1.1 skrll bfd_hash_allocate (table,
2524 1.1 skrll sizeof (struct elf_sh_link_hash_entry)));
2525 1.1 skrll if (ret == (struct elf_sh_link_hash_entry *) NULL)
2526 1.1 skrll return (struct bfd_hash_entry *) ret;
2527 1.1 skrll
2528 1.1 skrll /* Call the allocation method of the superclass. */
2529 1.1 skrll ret = ((struct elf_sh_link_hash_entry *)
2530 1.1 skrll _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2531 1.1 skrll table, string));
2532 1.1 skrll if (ret != (struct elf_sh_link_hash_entry *) NULL)
2533 1.1 skrll {
2534 1.1 skrll ret->dyn_relocs = NULL;
2535 1.3 christos ret->gotplt_refcount = 0;
2536 1.3 christos #ifdef INCLUDE_SHMEDIA
2537 1.3 christos ret->datalabel_got.refcount = ret->root.got.refcount;
2538 1.1 skrll #endif
2539 1.1 skrll ret->funcdesc.refcount = 0;
2540 1.1 skrll ret->abs_funcdesc_refcount = 0;
2541 1.1 skrll ret->got_type = GOT_UNKNOWN;
2542 1.1 skrll }
2543 1.1 skrll
2544 1.1 skrll return (struct bfd_hash_entry *) ret;
2545 1.1 skrll }
2546 1.1 skrll
2547 1.1 skrll /* Create an sh ELF linker hash table. */
2548 1.1 skrll
2549 1.1 skrll static struct bfd_link_hash_table *
2550 1.1 skrll sh_elf_link_hash_table_create (bfd *abfd)
2551 1.1 skrll {
2552 1.1 skrll struct elf_sh_link_hash_table *ret;
2553 1.1 skrll bfd_size_type amt = sizeof (struct elf_sh_link_hash_table);
2554 1.1 skrll
2555 1.1 skrll ret = (struct elf_sh_link_hash_table *) bfd_malloc (amt);
2556 1.1 skrll if (ret == (struct elf_sh_link_hash_table *) NULL)
2557 1.3 christos return NULL;
2558 1.3 christos
2559 1.1 skrll if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
2560 1.1 skrll sh_elf_link_hash_newfunc,
2561 1.1 skrll sizeof (struct elf_sh_link_hash_entry),
2562 1.1 skrll SH_ELF_DATA))
2563 1.1 skrll {
2564 1.1 skrll free (ret);
2565 1.1 skrll return NULL;
2566 1.1 skrll }
2567 1.1 skrll
2568 1.1 skrll ret->sgot = NULL;
2569 1.1 skrll ret->sgotplt = NULL;
2570 1.1 skrll ret->srelgot = NULL;
2571 1.1 skrll ret->splt = NULL;
2572 1.3 christos ret->srelplt = NULL;
2573 1.1 skrll ret->sdynbss = NULL;
2574 1.1 skrll ret->srelbss = NULL;
2575 1.1 skrll ret->srelplt2 = NULL;
2576 1.3 christos ret->sym_cache.abfd = NULL;
2577 1.1 skrll ret->tls_ldm_got.refcount = 0;
2578 1.1 skrll ret->plt_info = NULL;
2579 1.1 skrll ret->vxworks_p = vxworks_object_p (abfd);
2580 1.1 skrll ret->fdpic_p = fdpic_object_p (abfd);
2581 1.3 christos
2582 1.3 christos return &ret->root.root;
2583 1.3 christos }
2584 1.3 christos
2585 1.3 christos static bfd_boolean
2586 1.3 christos sh_elf_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
2587 1.3 christos struct bfd_link_info *info, asection *p)
2588 1.3 christos {
2589 1.3 christos struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info);
2590 1.3 christos
2591 1.3 christos /* Non-FDPIC binaries do not need dynamic symbols for sections. */
2592 1.3 christos if (!htab->fdpic_p)
2593 1.3 christos return TRUE;
2594 1.3 christos
2595 1.3 christos /* We need dynamic symbols for every section, since segments can
2596 1.3 christos relocate independently. */
2597 1.3 christos switch (elf_section_data (p)->this_hdr.sh_type)
2598 1.3 christos {
2599 1.3 christos case SHT_PROGBITS:
2600 1.3 christos case SHT_NOBITS:
2601 1.3 christos /* If sh_type is yet undecided, assume it could be
2602 1.3 christos SHT_PROGBITS/SHT_NOBITS. */
2603 1.3 christos case SHT_NULL:
2604 1.3 christos return FALSE;
2605 1.3 christos
2606 1.3 christos /* There shouldn't be section relative relocations
2607 1.3 christos against any other section. */
2608 1.3 christos default:
2609 1.1 skrll return TRUE;
2610 1.1 skrll }
2611 1.1 skrll }
2612 1.1 skrll
2613 1.1 skrll /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
2614 1.1 skrll shortcuts to them in our hash table. */
2615 1.1 skrll
2616 1.1 skrll static bfd_boolean
2617 1.1 skrll create_got_section (bfd *dynobj, struct bfd_link_info *info)
2618 1.1 skrll {
2619 1.1 skrll struct elf_sh_link_hash_table *htab;
2620 1.1 skrll
2621 1.3 christos if (! _bfd_elf_create_got_section (dynobj, info))
2622 1.3 christos return FALSE;
2623 1.3 christos
2624 1.1 skrll htab = sh_elf_hash_table (info);
2625 1.1 skrll if (htab == NULL)
2626 1.3 christos return FALSE;
2627 1.3 christos
2628 1.1 skrll htab->sgot = bfd_get_section_by_name (dynobj, ".got");
2629 1.1 skrll htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
2630 1.3 christos htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2631 1.3 christos if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
2632 1.3 christos abort ();
2633 1.3 christos
2634 1.3 christos htab->sfuncdesc = bfd_make_section_with_flags (dynobj, ".got.funcdesc",
2635 1.3 christos (SEC_ALLOC | SEC_LOAD
2636 1.3 christos | SEC_HAS_CONTENTS
2637 1.3 christos | SEC_IN_MEMORY
2638 1.3 christos | SEC_LINKER_CREATED));
2639 1.3 christos if (htab->sfuncdesc == NULL
2640 1.3 christos || ! bfd_set_section_alignment (dynobj, htab->sfuncdesc, 2))
2641 1.3 christos return FALSE;
2642 1.3 christos
2643 1.3 christos htab->srelfuncdesc = bfd_make_section_with_flags (dynobj,
2644 1.3 christos ".rela.got.funcdesc",
2645 1.3 christos (SEC_ALLOC | SEC_LOAD
2646 1.3 christos | SEC_HAS_CONTENTS
2647 1.3 christos | SEC_IN_MEMORY
2648 1.3 christos | SEC_LINKER_CREATED
2649 1.3 christos | SEC_READONLY));
2650 1.3 christos if (htab->srelfuncdesc == NULL
2651 1.3 christos || ! bfd_set_section_alignment (dynobj, htab->srelfuncdesc, 2))
2652 1.3 christos return FALSE;
2653 1.3 christos
2654 1.3 christos /* Also create .rofixup. */
2655 1.3 christos htab->srofixup = bfd_make_section_with_flags (dynobj, ".rofixup",
2656 1.3 christos (SEC_ALLOC | SEC_LOAD
2657 1.3 christos | SEC_HAS_CONTENTS
2658 1.3 christos | SEC_IN_MEMORY
2659 1.1 skrll | SEC_LINKER_CREATED
2660 1.3 christos | SEC_READONLY));
2661 1.1 skrll if (htab->srofixup == NULL
2662 1.1 skrll || ! bfd_set_section_alignment (dynobj, htab->srofixup, 2))
2663 1.1 skrll return FALSE;
2664 1.1 skrll
2665 1.1 skrll return TRUE;
2666 1.1 skrll }
2667 1.1 skrll
2668 1.1 skrll /* Create dynamic sections when linking against a dynamic object. */
2669 1.1 skrll
2670 1.1 skrll static bfd_boolean
2671 1.3 christos sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2672 1.1 skrll {
2673 1.1 skrll struct elf_sh_link_hash_table *htab;
2674 1.1 skrll flagword flags, pltflags;
2675 1.1 skrll asection *s;
2676 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2677 1.1 skrll int ptralign = 0;
2678 1.1 skrll
2679 1.1 skrll switch (bed->s->arch_size)
2680 1.1 skrll {
2681 1.1 skrll case 32:
2682 1.1 skrll ptralign = 2;
2683 1.1 skrll break;
2684 1.1 skrll
2685 1.1 skrll case 64:
2686 1.1 skrll ptralign = 3;
2687 1.1 skrll break;
2688 1.1 skrll
2689 1.1 skrll default:
2690 1.1 skrll bfd_set_error (bfd_error_bad_value);
2691 1.3 christos return FALSE;
2692 1.3 christos }
2693 1.3 christos
2694 1.1 skrll htab = sh_elf_hash_table (info);
2695 1.1 skrll if (htab == NULL)
2696 1.1 skrll return FALSE;
2697 1.1 skrll
2698 1.1 skrll if (htab->root.dynamic_sections_created)
2699 1.1 skrll return TRUE;
2700 1.1 skrll
2701 1.1 skrll /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2702 1.1 skrll .rel[a].bss sections. */
2703 1.1 skrll
2704 1.1 skrll flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2705 1.1 skrll | SEC_LINKER_CREATED);
2706 1.1 skrll
2707 1.1 skrll pltflags = flags;
2708 1.1 skrll pltflags |= SEC_CODE;
2709 1.1 skrll if (bed->plt_not_loaded)
2710 1.1 skrll pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
2711 1.1 skrll if (bed->plt_readonly)
2712 1.1 skrll pltflags |= SEC_READONLY;
2713 1.1 skrll
2714 1.1 skrll s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
2715 1.1 skrll htab->splt = s;
2716 1.1 skrll if (s == NULL
2717 1.1 skrll || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
2718 1.1 skrll return FALSE;
2719 1.1 skrll
2720 1.1 skrll if (bed->want_plt_sym)
2721 1.1 skrll {
2722 1.1 skrll /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2723 1.1 skrll .plt section. */
2724 1.1 skrll struct elf_link_hash_entry *h;
2725 1.1 skrll struct bfd_link_hash_entry *bh = NULL;
2726 1.1 skrll
2727 1.1 skrll if (! (_bfd_generic_link_add_one_symbol
2728 1.1 skrll (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
2729 1.1 skrll (bfd_vma) 0, (const char *) NULL, FALSE,
2730 1.1 skrll get_elf_backend_data (abfd)->collect, &bh)))
2731 1.1 skrll return FALSE;
2732 1.1 skrll
2733 1.1 skrll h = (struct elf_link_hash_entry *) bh;
2734 1.1 skrll h->def_regular = 1;
2735 1.1 skrll h->type = STT_OBJECT;
2736 1.1 skrll htab->root.hplt = h;
2737 1.1 skrll
2738 1.1 skrll if (info->shared
2739 1.1 skrll && ! bfd_elf_link_record_dynamic_symbol (info, h))
2740 1.1 skrll return FALSE;
2741 1.1 skrll }
2742 1.1 skrll
2743 1.1 skrll s = bfd_make_section_with_flags (abfd,
2744 1.1 skrll bed->default_use_rela_p ? ".rela.plt" : ".rel.plt",
2745 1.1 skrll flags | SEC_READONLY);
2746 1.1 skrll htab->srelplt = s;
2747 1.1 skrll if (s == NULL
2748 1.1 skrll || ! bfd_set_section_alignment (abfd, s, ptralign))
2749 1.1 skrll return FALSE;
2750 1.1 skrll
2751 1.1 skrll if (htab->sgot == NULL
2752 1.1 skrll && !create_got_section (abfd, info))
2753 1.1 skrll return FALSE;
2754 1.1 skrll
2755 1.1 skrll {
2756 1.1 skrll const char *secname;
2757 1.1 skrll char *relname;
2758 1.1 skrll flagword secflags;
2759 1.1 skrll asection *sec;
2760 1.1 skrll
2761 1.1 skrll for (sec = abfd->sections; sec; sec = sec->next)
2762 1.1 skrll {
2763 1.1 skrll secflags = bfd_get_section_flags (abfd, sec);
2764 1.1 skrll if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
2765 1.1 skrll || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
2766 1.1 skrll continue;
2767 1.1 skrll secname = bfd_get_section_name (abfd, sec);
2768 1.1 skrll relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
2769 1.1 skrll strcpy (relname, ".rela");
2770 1.1 skrll strcat (relname, secname);
2771 1.1 skrll if (bfd_get_section_by_name (abfd, secname))
2772 1.1 skrll continue;
2773 1.1 skrll s = bfd_make_section_with_flags (abfd, relname,
2774 1.1 skrll flags | SEC_READONLY);
2775 1.1 skrll if (s == NULL
2776 1.1 skrll || ! bfd_set_section_alignment (abfd, s, ptralign))
2777 1.1 skrll return FALSE;
2778 1.1 skrll }
2779 1.1 skrll }
2780 1.1 skrll
2781 1.1 skrll if (bed->want_dynbss)
2782 1.1 skrll {
2783 1.1 skrll /* The .dynbss section is a place to put symbols which are defined
2784 1.1 skrll by dynamic objects, are referenced by regular objects, and are
2785 1.1 skrll not functions. We must allocate space for them in the process
2786 1.1 skrll image and use a R_*_COPY reloc to tell the dynamic linker to
2787 1.1 skrll initialize them at run time. The linker script puts the .dynbss
2788 1.1 skrll section into the .bss section of the final image. */
2789 1.1 skrll s = bfd_make_section_with_flags (abfd, ".dynbss",
2790 1.1 skrll SEC_ALLOC | SEC_LINKER_CREATED);
2791 1.1 skrll htab->sdynbss = s;
2792 1.1 skrll if (s == NULL)
2793 1.1 skrll return FALSE;
2794 1.1 skrll
2795 1.1 skrll /* The .rel[a].bss section holds copy relocs. This section is not
2796 1.1 skrll normally needed. We need to create it here, though, so that the
2797 1.1 skrll linker will map it to an output section. We can't just create it
2798 1.1 skrll only if we need it, because we will not know whether we need it
2799 1.1 skrll until we have seen all the input files, and the first time the
2800 1.1 skrll main linker code calls BFD after examining all the input files
2801 1.1 skrll (size_dynamic_sections) the input sections have already been
2802 1.1 skrll mapped to the output sections. If the section turns out not to
2803 1.1 skrll be needed, we can discard it later. We will never need this
2804 1.1 skrll section when generating a shared object, since they do not use
2805 1.1 skrll copy relocs. */
2806 1.1 skrll if (! info->shared)
2807 1.1 skrll {
2808 1.1 skrll s = bfd_make_section_with_flags (abfd,
2809 1.1 skrll (bed->default_use_rela_p
2810 1.1 skrll ? ".rela.bss" : ".rel.bss"),
2811 1.1 skrll flags | SEC_READONLY);
2812 1.1 skrll htab->srelbss = s;
2813 1.1 skrll if (s == NULL
2814 1.1 skrll || ! bfd_set_section_alignment (abfd, s, ptralign))
2815 1.1 skrll return FALSE;
2816 1.1 skrll }
2817 1.1 skrll }
2818 1.1 skrll
2819 1.1 skrll if (htab->vxworks_p)
2820 1.1 skrll {
2821 1.1 skrll if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
2822 1.1 skrll return FALSE;
2823 1.1 skrll }
2824 1.1 skrll
2825 1.1 skrll return TRUE;
2826 1.1 skrll }
2827 1.1 skrll
2828 1.1 skrll /* Adjust a symbol defined by a dynamic object and referenced by a
2830 1.1 skrll regular object. The current definition is in some section of the
2831 1.1 skrll dynamic object, but we're not including those sections. We have to
2832 1.1 skrll change the definition to something the rest of the link can
2833 1.1 skrll understand. */
2834 1.1 skrll
2835 1.1 skrll static bfd_boolean
2836 1.1 skrll sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2837 1.1 skrll struct elf_link_hash_entry *h)
2838 1.1 skrll {
2839 1.1 skrll struct elf_sh_link_hash_table *htab;
2840 1.3 christos struct elf_sh_link_hash_entry *eh;
2841 1.3 christos struct elf_sh_dyn_relocs *p;
2842 1.1 skrll asection *s;
2843 1.1 skrll
2844 1.1 skrll htab = sh_elf_hash_table (info);
2845 1.1 skrll if (htab == NULL)
2846 1.1 skrll return FALSE;
2847 1.1 skrll
2848 1.1 skrll /* Make sure we know what is going on here. */
2849 1.1 skrll BFD_ASSERT (htab->root.dynobj != NULL
2850 1.1 skrll && (h->needs_plt
2851 1.1 skrll || h->u.weakdef != NULL
2852 1.1 skrll || (h->def_dynamic
2853 1.1 skrll && h->ref_regular
2854 1.1 skrll && !h->def_regular)));
2855 1.1 skrll
2856 1.1 skrll /* If this is a function, put it in the procedure linkage table. We
2857 1.1 skrll will fill in the contents of the procedure linkage table later,
2858 1.1 skrll when we know the address of the .got section. */
2859 1.1 skrll if (h->type == STT_FUNC
2860 1.1 skrll || h->needs_plt)
2861 1.1 skrll {
2862 1.1 skrll if (h->plt.refcount <= 0
2863 1.1 skrll || SYMBOL_CALLS_LOCAL (info, h)
2864 1.1 skrll || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2865 1.1 skrll && h->root.type == bfd_link_hash_undefweak))
2866 1.1 skrll {
2867 1.1 skrll /* This case can occur if we saw a PLT reloc in an input
2868 1.1 skrll file, but the symbol was never referred to by a dynamic
2869 1.1 skrll object. In such a case, we don't actually need to build
2870 1.1 skrll a procedure linkage table, and we can just do a REL32
2871 1.1 skrll reloc instead. */
2872 1.1 skrll h->plt.offset = (bfd_vma) -1;
2873 1.1 skrll h->needs_plt = 0;
2874 1.1 skrll }
2875 1.1 skrll
2876 1.1 skrll return TRUE;
2877 1.1 skrll }
2878 1.1 skrll else
2879 1.1 skrll h->plt.offset = (bfd_vma) -1;
2880 1.1 skrll
2881 1.1 skrll /* If this is a weak symbol, and there is a real definition, the
2882 1.1 skrll processor independent code will have arranged for us to see the
2883 1.1 skrll real definition first, and we can just use the same value. */
2884 1.1 skrll if (h->u.weakdef != NULL)
2885 1.1 skrll {
2886 1.1 skrll BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2887 1.1 skrll || h->u.weakdef->root.type == bfd_link_hash_defweak);
2888 1.1 skrll h->root.u.def.section = h->u.weakdef->root.u.def.section;
2889 1.1 skrll h->root.u.def.value = h->u.weakdef->root.u.def.value;
2890 1.1 skrll if (info->nocopyreloc)
2891 1.1 skrll h->non_got_ref = h->u.weakdef->non_got_ref;
2892 1.1 skrll return TRUE;
2893 1.1 skrll }
2894 1.1 skrll
2895 1.1 skrll /* This is a reference to a symbol defined by a dynamic object which
2896 1.1 skrll is not a function. */
2897 1.1 skrll
2898 1.1 skrll /* If we are creating a shared library, we must presume that the
2899 1.1 skrll only references to the symbol are via the global offset table.
2900 1.1 skrll For such cases we need not do anything here; the relocations will
2901 1.1 skrll be handled correctly by relocate_section. */
2902 1.1 skrll if (info->shared)
2903 1.1 skrll return TRUE;
2904 1.1 skrll
2905 1.1 skrll /* If there are no references to this symbol that do not use the
2906 1.1 skrll GOT, we don't need to generate a copy reloc. */
2907 1.1 skrll if (!h->non_got_ref)
2908 1.1 skrll return TRUE;
2909 1.1 skrll
2910 1.1 skrll /* If -z nocopyreloc was given, we won't generate them either. */
2911 1.1 skrll if (info->nocopyreloc)
2912 1.1 skrll {
2913 1.1 skrll h->non_got_ref = 0;
2914 1.1 skrll return TRUE;
2915 1.1 skrll }
2916 1.1 skrll
2917 1.1 skrll eh = (struct elf_sh_link_hash_entry *) h;
2918 1.1 skrll for (p = eh->dyn_relocs; p != NULL; p = p->next)
2919 1.1 skrll {
2920 1.1 skrll s = p->sec->output_section;
2921 1.1 skrll if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
2922 1.1 skrll break;
2923 1.1 skrll }
2924 1.1 skrll
2925 1.1 skrll /* If we didn't find any dynamic relocs in sections which needs the
2926 1.1 skrll copy reloc, then we'll be keeping the dynamic relocs and avoiding
2927 1.1 skrll the copy reloc. */
2928 1.1 skrll if (p == NULL)
2929 1.1 skrll {
2930 1.1 skrll h->non_got_ref = 0;
2931 1.1 skrll return TRUE;
2932 1.1 skrll }
2933 1.1 skrll
2934 1.1 skrll if (h->size == 0)
2935 1.1 skrll {
2936 1.1 skrll (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
2937 1.1 skrll h->root.root.string);
2938 1.1 skrll return TRUE;
2939 1.1 skrll }
2940 1.1 skrll
2941 1.1 skrll /* We must allocate the symbol in our .dynbss section, which will
2942 1.1 skrll become part of the .bss section of the executable. There will be
2943 1.1 skrll an entry for this symbol in the .dynsym section. The dynamic
2944 1.1 skrll object will contain position independent code, so all references
2945 1.1 skrll from the dynamic object to this symbol will go through the global
2946 1.1 skrll offset table. The dynamic linker will use the .dynsym entry to
2947 1.1 skrll determine the address it must put in the global offset table, so
2948 1.1 skrll both the dynamic object and the regular object will refer to the
2949 1.1 skrll same memory location for the variable. */
2950 1.1 skrll
2951 1.1 skrll s = htab->sdynbss;
2952 1.1 skrll BFD_ASSERT (s != NULL);
2953 1.1 skrll
2954 1.1 skrll /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
2955 1.1 skrll copy the initial value out of the dynamic object and into the
2956 1.1 skrll runtime process image. We need to remember the offset into the
2957 1.1 skrll .rela.bss section we are going to use. */
2958 1.1 skrll if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2959 1.1 skrll {
2960 1.1 skrll asection *srel;
2961 1.1 skrll
2962 1.1 skrll srel = htab->srelbss;
2963 1.1 skrll BFD_ASSERT (srel != NULL);
2964 1.1 skrll srel->size += sizeof (Elf32_External_Rela);
2965 1.1 skrll h->needs_copy = 1;
2966 1.1 skrll }
2967 1.1 skrll
2968 1.1 skrll return _bfd_elf_adjust_dynamic_copy (h, s);
2969 1.1 skrll }
2970 1.1 skrll
2971 1.1 skrll /* Allocate space in .plt, .got and associated reloc sections for
2972 1.1 skrll dynamic relocs. */
2973 1.1 skrll
2974 1.1 skrll static bfd_boolean
2975 1.1 skrll allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2976 1.1 skrll {
2977 1.1 skrll struct bfd_link_info *info;
2978 1.1 skrll struct elf_sh_link_hash_table *htab;
2979 1.1 skrll struct elf_sh_link_hash_entry *eh;
2980 1.1 skrll struct elf_sh_dyn_relocs *p;
2981 1.1 skrll
2982 1.1 skrll if (h->root.type == bfd_link_hash_indirect)
2983 1.1 skrll return TRUE;
2984 1.1 skrll
2985 1.1 skrll if (h->root.type == bfd_link_hash_warning)
2986 1.1 skrll /* When warning symbols are created, they **replace** the "real"
2987 1.1 skrll entry in the hash table, thus we never get to see the real
2988 1.3 christos symbol in a hash traversal. So look at it now. */
2989 1.3 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
2990 1.1 skrll
2991 1.1 skrll info = (struct bfd_link_info *) inf;
2992 1.1 skrll htab = sh_elf_hash_table (info);
2993 1.1 skrll if (htab == NULL)
2994 1.1 skrll return FALSE;
2995 1.1 skrll
2996 1.1 skrll eh = (struct elf_sh_link_hash_entry *) h;
2997 1.1 skrll if ((h->got.refcount > 0
2998 1.1 skrll || h->forced_local)
2999 1.1 skrll && eh->gotplt_refcount > 0)
3000 1.1 skrll {
3001 1.1 skrll /* The symbol has been forced local, or we have some direct got refs,
3002 1.1 skrll so treat all the gotplt refs as got refs. */
3003 1.1 skrll h->got.refcount += eh->gotplt_refcount;
3004 1.1 skrll if (h->plt.refcount >= eh->gotplt_refcount)
3005 1.1 skrll h->plt.refcount -= eh->gotplt_refcount;
3006 1.1 skrll }
3007 1.1 skrll
3008 1.1 skrll if (htab->root.dynamic_sections_created
3009 1.1 skrll && h->plt.refcount > 0
3010 1.1 skrll && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3011 1.1 skrll || h->root.type != bfd_link_hash_undefweak))
3012 1.1 skrll {
3013 1.1 skrll /* Make sure this symbol is output as a dynamic symbol.
3014 1.1 skrll Undefined weak syms won't yet be marked as dynamic. */
3015 1.1 skrll if (h->dynindx == -1
3016 1.1 skrll && !h->forced_local)
3017 1.1 skrll {
3018 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h))
3019 1.1 skrll return FALSE;
3020 1.1 skrll }
3021 1.3 christos
3022 1.1 skrll if (info->shared
3023 1.1 skrll || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3024 1.1 skrll {
3025 1.1 skrll asection *s = htab->splt;
3026 1.1 skrll const struct elf_sh_plt_info *plt_info;
3027 1.1 skrll
3028 1.1 skrll /* If this is the first .plt entry, make room for the special
3029 1.1 skrll first entry. */
3030 1.1 skrll if (s->size == 0)
3031 1.1 skrll s->size += htab->plt_info->plt0_entry_size;
3032 1.1 skrll
3033 1.1 skrll h->plt.offset = s->size;
3034 1.3 christos
3035 1.3 christos /* If this symbol is not defined in a regular file, and we are
3036 1.3 christos not generating a shared library, then set the symbol to this
3037 1.3 christos location in the .plt. This is required to make function
3038 1.1 skrll pointers compare as equal between the normal executable and
3039 1.1 skrll the shared library. Skip this for FDPIC, since the
3040 1.1 skrll function's address will be the address of the canonical
3041 1.1 skrll function descriptor. */
3042 1.1 skrll if (!htab->fdpic_p && !info->shared && !h->def_regular)
3043 1.1 skrll {
3044 1.3 christos h->root.u.def.section = s;
3045 1.3 christos h->root.u.def.value = h->plt.offset;
3046 1.3 christos }
3047 1.3 christos
3048 1.3 christos /* Make room for this entry. */
3049 1.1 skrll plt_info = htab->plt_info;
3050 1.1 skrll if (plt_info->short_plt != NULL
3051 1.1 skrll && (get_plt_index (plt_info->short_plt, s->size) < MAX_SHORT_PLT))
3052 1.3 christos plt_info = plt_info->short_plt;
3053 1.3 christos s->size += plt_info->symbol_entry_size;
3054 1.3 christos
3055 1.3 christos /* We also need to make an entry in the .got.plt section, which
3056 1.1 skrll will be placed in the .got section by the linker script. */
3057 1.1 skrll if (!htab->fdpic_p)
3058 1.1 skrll htab->sgotplt->size += 4;
3059 1.1 skrll else
3060 1.1 skrll htab->sgotplt->size += 8;
3061 1.1 skrll
3062 1.1 skrll /* We also need to make an entry in the .rel.plt section. */
3063 1.1 skrll htab->srelplt->size += sizeof (Elf32_External_Rela);
3064 1.1 skrll
3065 1.1 skrll if (htab->vxworks_p && !info->shared)
3066 1.1 skrll {
3067 1.1 skrll /* VxWorks executables have a second set of relocations
3068 1.1 skrll for each PLT entry. They go in a separate relocation
3069 1.1 skrll section, which is processed by the kernel loader. */
3070 1.1 skrll
3071 1.1 skrll /* There is a relocation for the initial PLT entry:
3072 1.1 skrll an R_SH_DIR32 relocation for _GLOBAL_OFFSET_TABLE_. */
3073 1.1 skrll if (h->plt.offset == htab->plt_info->plt0_entry_size)
3074 1.1 skrll htab->srelplt2->size += sizeof (Elf32_External_Rela);
3075 1.1 skrll
3076 1.1 skrll /* There are two extra relocations for each subsequent
3077 1.1 skrll PLT entry: an R_SH_DIR32 relocation for the GOT entry,
3078 1.1 skrll and an R_SH_DIR32 relocation for the PLT entry. */
3079 1.1 skrll htab->srelplt2->size += sizeof (Elf32_External_Rela) * 2;
3080 1.1 skrll }
3081 1.1 skrll }
3082 1.1 skrll else
3083 1.1 skrll {
3084 1.1 skrll h->plt.offset = (bfd_vma) -1;
3085 1.1 skrll h->needs_plt = 0;
3086 1.1 skrll }
3087 1.1 skrll }
3088 1.1 skrll else
3089 1.1 skrll {
3090 1.1 skrll h->plt.offset = (bfd_vma) -1;
3091 1.1 skrll h->needs_plt = 0;
3092 1.1 skrll }
3093 1.3 christos
3094 1.1 skrll if (h->got.refcount > 0)
3095 1.1 skrll {
3096 1.1 skrll asection *s;
3097 1.1 skrll bfd_boolean dyn;
3098 1.1 skrll int got_type = sh_elf_hash_entry (h)->got_type;
3099 1.1 skrll
3100 1.1 skrll /* Make sure this symbol is output as a dynamic symbol.
3101 1.1 skrll Undefined weak syms won't yet be marked as dynamic. */
3102 1.1 skrll if (h->dynindx == -1
3103 1.1 skrll && !h->forced_local)
3104 1.1 skrll {
3105 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h))
3106 1.1 skrll return FALSE;
3107 1.1 skrll }
3108 1.3 christos
3109 1.1 skrll s = htab->sgot;
3110 1.1 skrll h->got.offset = s->size;
3111 1.3 christos s->size += 4;
3112 1.3 christos /* R_SH_TLS_GD needs 2 consecutive GOT slots. */
3113 1.3 christos if (got_type == GOT_TLS_GD)
3114 1.3 christos s->size += 4;
3115 1.3 christos dyn = htab->root.dynamic_sections_created;
3116 1.3 christos if (!dyn)
3117 1.3 christos {
3118 1.3 christos /* No dynamic relocations required. */
3119 1.1 skrll if (htab->fdpic_p && !info->shared
3120 1.1 skrll && h->root.type != bfd_link_hash_undefweak
3121 1.3 christos && (got_type == GOT_NORMAL || got_type == GOT_FUNCDESC))
3122 1.3 christos htab->srofixup->size += 4;
3123 1.1 skrll }
3124 1.3 christos /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
3125 1.1 skrll R_SH_TLS_GD needs one if local symbol and two if global. */
3126 1.3 christos else if ((got_type == GOT_TLS_GD && h->dynindx == -1)
3127 1.3 christos || got_type == GOT_TLS_IE)
3128 1.3 christos htab->srelgot->size += sizeof (Elf32_External_Rela);
3129 1.3 christos else if (got_type == GOT_TLS_GD)
3130 1.3 christos htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
3131 1.3 christos else if (got_type == GOT_FUNCDESC)
3132 1.3 christos {
3133 1.1 skrll if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
3134 1.1 skrll htab->srofixup->size += 4;
3135 1.1 skrll else
3136 1.1 skrll htab->srelgot->size += sizeof (Elf32_External_Rela);
3137 1.1 skrll }
3138 1.3 christos else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3139 1.3 christos || h->root.type != bfd_link_hash_undefweak)
3140 1.3 christos && (info->shared
3141 1.3 christos || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
3142 1.1 skrll htab->srelgot->size += sizeof (Elf32_External_Rela);
3143 1.1 skrll else if (htab->fdpic_p && !info->shared && got_type == GOT_NORMAL
3144 1.1 skrll && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3145 1.1 skrll || h->root.type != bfd_link_hash_undefweak))
3146 1.1 skrll htab->srofixup->size += 4;
3147 1.1 skrll }
3148 1.1 skrll else
3149 1.1 skrll h->got.offset = (bfd_vma) -1;
3150 1.1 skrll
3151 1.1 skrll #ifdef INCLUDE_SHMEDIA
3152 1.1 skrll if (eh->datalabel_got.refcount > 0)
3153 1.1 skrll {
3154 1.1 skrll asection *s;
3155 1.1 skrll bfd_boolean dyn;
3156 1.1 skrll
3157 1.1 skrll /* Make sure this symbol is output as a dynamic symbol.
3158 1.1 skrll Undefined weak syms won't yet be marked as dynamic. */
3159 1.1 skrll if (h->dynindx == -1
3160 1.1 skrll && !h->forced_local)
3161 1.1 skrll {
3162 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h))
3163 1.1 skrll return FALSE;
3164 1.1 skrll }
3165 1.1 skrll
3166 1.1 skrll s = htab->sgot;
3167 1.1 skrll eh->datalabel_got.offset = s->size;
3168 1.1 skrll s->size += 4;
3169 1.1 skrll dyn = htab->root.dynamic_sections_created;
3170 1.1 skrll if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
3171 1.1 skrll htab->srelgot->size += sizeof (Elf32_External_Rela);
3172 1.3 christos }
3173 1.3 christos else
3174 1.3 christos eh->datalabel_got.offset = (bfd_vma) -1;
3175 1.3 christos #endif
3176 1.3 christos
3177 1.3 christos /* Allocate space for any dynamic relocations to function
3178 1.3 christos descriptors, canonical or otherwise. We need to relocate the
3179 1.3 christos reference unless it resolves to zero, which only happens for
3180 1.3 christos undefined weak symbols (either non-default visibility, or when
3181 1.3 christos static linking). Any GOT slot is accounted for elsewhere. */
3182 1.3 christos if (eh->abs_funcdesc_refcount > 0
3183 1.3 christos && (h->root.type != bfd_link_hash_undefweak
3184 1.3 christos || (htab->root.dynamic_sections_created
3185 1.3 christos && ! SYMBOL_CALLS_LOCAL (info, h))))
3186 1.3 christos {
3187 1.3 christos if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
3188 1.3 christos htab->srofixup->size += eh->abs_funcdesc_refcount * 4;
3189 1.3 christos else
3190 1.3 christos htab->srelgot->size
3191 1.3 christos += eh->abs_funcdesc_refcount * sizeof (Elf32_External_Rela);
3192 1.3 christos }
3193 1.3 christos
3194 1.3 christos /* We must allocate a function descriptor if there are references to
3195 1.3 christos a canonical descriptor (R_SH_GOTFUNCDESC or R_SH_FUNCDESC) and
3196 1.3 christos the dynamic linker isn't going to allocate it. None of this
3197 1.3 christos applies if we already created one in .got.plt, but if the
3198 1.3 christos canonical function descriptor can be in this object, there
3199 1.3 christos won't be a PLT entry at all. */
3200 1.3 christos if ((eh->funcdesc.refcount > 0
3201 1.3 christos || (h->got.offset != MINUS_ONE && eh->got_type == GOT_FUNCDESC))
3202 1.3 christos && h->root.type != bfd_link_hash_undefweak
3203 1.3 christos && SYMBOL_FUNCDESC_LOCAL (info, h))
3204 1.3 christos {
3205 1.3 christos /* Make room for this function descriptor. */
3206 1.3 christos eh->funcdesc.offset = htab->sfuncdesc->size;
3207 1.3 christos htab->sfuncdesc->size += 8;
3208 1.3 christos
3209 1.3 christos /* We will need a relocation or two fixups to initialize the
3210 1.3 christos function descriptor, so allocate those too. */
3211 1.3 christos if (!info->shared && SYMBOL_CALLS_LOCAL (info, h))
3212 1.1 skrll htab->srofixup->size += 8;
3213 1.1 skrll else
3214 1.1 skrll htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
3215 1.1 skrll }
3216 1.1 skrll
3217 1.1 skrll if (eh->dyn_relocs == NULL)
3218 1.1 skrll return TRUE;
3219 1.1 skrll
3220 1.1 skrll /* In the shared -Bsymbolic case, discard space allocated for
3221 1.1 skrll dynamic pc-relative relocs against symbols which turn out to be
3222 1.1 skrll defined in regular objects. For the normal shared case, discard
3223 1.1 skrll space for pc-relative relocs that have become local due to symbol
3224 1.1 skrll visibility changes. */
3225 1.1 skrll
3226 1.1 skrll if (info->shared)
3227 1.1 skrll {
3228 1.1 skrll if (SYMBOL_CALLS_LOCAL (info, h))
3229 1.1 skrll {
3230 1.1 skrll struct elf_sh_dyn_relocs **pp;
3231 1.1 skrll
3232 1.1 skrll for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3233 1.1 skrll {
3234 1.1 skrll p->count -= p->pc_count;
3235 1.1 skrll p->pc_count = 0;
3236 1.1 skrll if (p->count == 0)
3237 1.1 skrll *pp = p->next;
3238 1.1 skrll else
3239 1.1 skrll pp = &p->next;
3240 1.1 skrll }
3241 1.1 skrll }
3242 1.1 skrll
3243 1.1 skrll if (htab->vxworks_p)
3244 1.1 skrll {
3245 1.1 skrll struct elf_sh_dyn_relocs **pp;
3246 1.1 skrll
3247 1.1 skrll for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3248 1.1 skrll {
3249 1.1 skrll if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
3250 1.1 skrll *pp = p->next;
3251 1.1 skrll else
3252 1.1 skrll pp = &p->next;
3253 1.1 skrll }
3254 1.1 skrll }
3255 1.1 skrll
3256 1.1 skrll /* Also discard relocs on undefined weak syms with non-default
3257 1.1 skrll visibility. */
3258 1.1 skrll if (eh->dyn_relocs != NULL
3259 1.1 skrll && h->root.type == bfd_link_hash_undefweak)
3260 1.1 skrll {
3261 1.1 skrll if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3262 1.1 skrll eh->dyn_relocs = NULL;
3263 1.1 skrll
3264 1.1 skrll /* Make sure undefined weak symbols are output as a dynamic
3265 1.1 skrll symbol in PIEs. */
3266 1.1 skrll else if (h->dynindx == -1
3267 1.1 skrll && !h->forced_local)
3268 1.1 skrll {
3269 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h))
3270 1.1 skrll return FALSE;
3271 1.1 skrll }
3272 1.1 skrll }
3273 1.1 skrll }
3274 1.1 skrll else
3275 1.1 skrll {
3276 1.1 skrll /* For the non-shared case, discard space for relocs against
3277 1.1 skrll symbols which turn out to need copy relocs or are not
3278 1.1 skrll dynamic. */
3279 1.1 skrll
3280 1.1 skrll if (!h->non_got_ref
3281 1.1 skrll && ((h->def_dynamic
3282 1.1 skrll && !h->def_regular)
3283 1.1 skrll || (htab->root.dynamic_sections_created
3284 1.1 skrll && (h->root.type == bfd_link_hash_undefweak
3285 1.1 skrll || h->root.type == bfd_link_hash_undefined))))
3286 1.1 skrll {
3287 1.1 skrll /* Make sure this symbol is output as a dynamic symbol.
3288 1.1 skrll Undefined weak syms won't yet be marked as dynamic. */
3289 1.1 skrll if (h->dynindx == -1
3290 1.1 skrll && !h->forced_local)
3291 1.1 skrll {
3292 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h))
3293 1.1 skrll return FALSE;
3294 1.1 skrll }
3295 1.1 skrll
3296 1.1 skrll /* If that succeeded, we know we'll be keeping all the
3297 1.1 skrll relocs. */
3298 1.1 skrll if (h->dynindx != -1)
3299 1.1 skrll goto keep;
3300 1.1 skrll }
3301 1.1 skrll
3302 1.1 skrll eh->dyn_relocs = NULL;
3303 1.1 skrll
3304 1.1 skrll keep: ;
3305 1.1 skrll }
3306 1.1 skrll
3307 1.3 christos /* Finally, allocate space. */
3308 1.3 christos for (p = eh->dyn_relocs; p != NULL; p = p->next)
3309 1.3 christos {
3310 1.3 christos asection *sreloc = elf_section_data (p->sec)->sreloc;
3311 1.1 skrll sreloc->size += p->count * sizeof (Elf32_External_Rela);
3312 1.1 skrll
3313 1.1 skrll /* If we need relocations, we do not need fixups. */
3314 1.1 skrll if (htab->fdpic_p && !info->shared)
3315 1.1 skrll htab->srofixup->size -= 4 * (p->count - p->pc_count);
3316 1.1 skrll }
3317 1.1 skrll
3318 1.1 skrll return TRUE;
3319 1.1 skrll }
3320 1.1 skrll
3321 1.1 skrll /* Find any dynamic relocs that apply to read-only sections. */
3322 1.1 skrll
3323 1.1 skrll static bfd_boolean
3324 1.1 skrll readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3325 1.1 skrll {
3326 1.1 skrll struct elf_sh_link_hash_entry *eh;
3327 1.1 skrll struct elf_sh_dyn_relocs *p;
3328 1.1 skrll
3329 1.1 skrll if (h->root.type == bfd_link_hash_warning)
3330 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
3331 1.1 skrll
3332 1.1 skrll eh = (struct elf_sh_link_hash_entry *) h;
3333 1.1 skrll for (p = eh->dyn_relocs; p != NULL; p = p->next)
3334 1.1 skrll {
3335 1.1 skrll asection *s = p->sec->output_section;
3336 1.2 skrll
3337 1.2 skrll if (s != NULL && (s->flags & SEC_READONLY) != 0)
3338 1.2 skrll {
3339 1.2 skrll struct bfd_link_info *info = (struct bfd_link_info *) inf;
3340 1.1 skrll
3341 1.1 skrll if (info->warn_shared_textrel)
3342 1.1 skrll (*_bfd_error_handler)
3343 1.1 skrll (_("warning: dynamic relocation in readonly section `%s'"),
3344 1.1 skrll h->root.root.string);
3345 1.1 skrll info->flags |= DF_TEXTREL;
3346 1.1 skrll
3347 1.1 skrll /* Not an error, just cut short the traversal. */
3348 1.1 skrll return FALSE;
3349 1.1 skrll }
3350 1.1 skrll }
3351 1.1 skrll return TRUE;
3352 1.1 skrll }
3353 1.1 skrll
3354 1.1 skrll /* This function is called after all the input files have been read,
3355 1.1 skrll and the input sections have been assigned to output sections.
3356 1.1 skrll It's a convenient place to determine the PLT style. */
3357 1.3 christos
3358 1.3 christos static bfd_boolean
3359 1.3 christos sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
3360 1.3 christos {
3361 1.3 christos sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared);
3362 1.3 christos
3363 1.3 christos if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable)
3364 1.3 christos {
3365 1.3 christos struct elf_link_hash_entry *h;
3366 1.3 christos
3367 1.3 christos /* Force a PT_GNU_STACK segment to be created. */
3368 1.3 christos if (! elf_tdata (output_bfd)->stack_flags)
3369 1.3 christos elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
3370 1.3 christos
3371 1.3 christos /* Define __stacksize if it's not defined yet. */
3372 1.3 christos h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
3373 1.3 christos FALSE, FALSE, FALSE);
3374 1.3 christos if (! h || h->root.type != bfd_link_hash_defined
3375 1.3 christos || h->type != STT_OBJECT
3376 1.3 christos || !h->def_regular)
3377 1.3 christos {
3378 1.3 christos struct bfd_link_hash_entry *bh = NULL;
3379 1.3 christos
3380 1.3 christos if (!(_bfd_generic_link_add_one_symbol
3381 1.3 christos (info, output_bfd, "__stacksize",
3382 1.3 christos BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
3383 1.3 christos (const char *) NULL, FALSE,
3384 1.3 christos get_elf_backend_data (output_bfd)->collect, &bh)))
3385 1.3 christos return FALSE;
3386 1.3 christos
3387 1.3 christos h = (struct elf_link_hash_entry *) bh;
3388 1.3 christos h->def_regular = 1;
3389 1.3 christos h->type = STT_OBJECT;
3390 1.3 christos }
3391 1.3 christos }
3392 1.3 christos return TRUE;
3393 1.3 christos }
3394 1.3 christos
3395 1.3 christos #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
3396 1.3 christos
3397 1.3 christos static bfd_boolean
3398 1.3 christos sh_elf_modify_program_headers (bfd *output_bfd, struct bfd_link_info *info)
3399 1.3 christos {
3400 1.3 christos struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
3401 1.3 christos struct elf_segment_map *m;
3402 1.3 christos Elf_Internal_Phdr *p;
3403 1.3 christos
3404 1.3 christos /* objcopy and strip preserve what's already there using
3405 1.3 christos sh_elf_copy_private_bfd_data (). */
3406 1.3 christos if (! info)
3407 1.3 christos return TRUE;
3408 1.3 christos
3409 1.3 christos for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
3410 1.3 christos if (m->p_type == PT_GNU_STACK)
3411 1.3 christos break;
3412 1.3 christos
3413 1.3 christos if (m)
3414 1.3 christos {
3415 1.3 christos struct elf_link_hash_entry *h;
3416 1.3 christos
3417 1.3 christos /* Obtain the pointer to the __stacksize symbol. */
3418 1.3 christos h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
3419 1.3 christos FALSE, FALSE, FALSE);
3420 1.3 christos if (h)
3421 1.3 christos {
3422 1.3 christos while (h->root.type == bfd_link_hash_indirect
3423 1.3 christos || h->root.type == bfd_link_hash_warning)
3424 1.3 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
3425 1.3 christos BFD_ASSERT (h->root.type == bfd_link_hash_defined);
3426 1.3 christos }
3427 1.3 christos
3428 1.3 christos /* Set the header p_memsz from the symbol value. We
3429 1.3 christos intentionally ignore the symbol section. */
3430 1.3 christos if (h && h->root.type == bfd_link_hash_defined)
3431 1.3 christos p->p_memsz = h->root.u.def.value;
3432 1.3 christos else
3433 1.1 skrll p->p_memsz = DEFAULT_STACK_SIZE;
3434 1.1 skrll
3435 1.1 skrll p->p_align = 8;
3436 1.3 christos }
3437 1.3 christos
3438 1.1 skrll return TRUE;
3439 1.1 skrll }
3440 1.1 skrll
3441 1.1 skrll #endif
3442 1.1 skrll
3443 1.1 skrll /* Set the sizes of the dynamic sections. */
3444 1.1 skrll
3445 1.1 skrll static bfd_boolean
3446 1.1 skrll sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3447 1.1 skrll struct bfd_link_info *info)
3448 1.1 skrll {
3449 1.1 skrll struct elf_sh_link_hash_table *htab;
3450 1.1 skrll bfd *dynobj;
3451 1.3 christos asection *s;
3452 1.3 christos bfd_boolean relocs;
3453 1.3 christos bfd *ibfd;
3454 1.1 skrll
3455 1.1 skrll htab = sh_elf_hash_table (info);
3456 1.1 skrll if (htab == NULL)
3457 1.1 skrll return FALSE;
3458 1.1 skrll
3459 1.1 skrll dynobj = htab->root.dynobj;
3460 1.1 skrll BFD_ASSERT (dynobj != NULL);
3461 1.1 skrll
3462 1.1 skrll if (htab->root.dynamic_sections_created)
3463 1.1 skrll {
3464 1.1 skrll /* Set the contents of the .interp section to the interpreter. */
3465 1.1 skrll if (info->executable)
3466 1.1 skrll {
3467 1.1 skrll s = bfd_get_section_by_name (dynobj, ".interp");
3468 1.1 skrll BFD_ASSERT (s != NULL);
3469 1.1 skrll s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3470 1.1 skrll s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3471 1.1 skrll }
3472 1.1 skrll }
3473 1.1 skrll
3474 1.1 skrll /* Set up .got offsets for local syms, and space for local dynamic
3475 1.3 christos relocs. */
3476 1.3 christos for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3477 1.1 skrll {
3478 1.1 skrll bfd_signed_vma *local_got;
3479 1.1 skrll bfd_signed_vma *end_local_got;
3480 1.1 skrll union gotref *local_funcdesc, *end_local_funcdesc;
3481 1.1 skrll char *local_got_type;
3482 1.1 skrll bfd_size_type locsymcount;
3483 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
3484 1.1 skrll asection *srel;
3485 1.1 skrll
3486 1.1 skrll if (! is_sh_elf (ibfd))
3487 1.1 skrll continue;
3488 1.1 skrll
3489 1.1 skrll for (s = ibfd->sections; s != NULL; s = s->next)
3490 1.1 skrll {
3491 1.1 skrll struct elf_sh_dyn_relocs *p;
3492 1.1 skrll
3493 1.1 skrll for (p = ((struct elf_sh_dyn_relocs *)
3494 1.1 skrll elf_section_data (s)->local_dynrel);
3495 1.1 skrll p != NULL;
3496 1.1 skrll p = p->next)
3497 1.1 skrll {
3498 1.1 skrll if (! bfd_is_abs_section (p->sec)
3499 1.1 skrll && bfd_is_abs_section (p->sec->output_section))
3500 1.1 skrll {
3501 1.1 skrll /* Input section has been discarded, either because
3502 1.1 skrll it is a copy of a linkonce section or due to
3503 1.1 skrll linker script /DISCARD/, so we'll be discarding
3504 1.1 skrll the relocs too. */
3505 1.1 skrll }
3506 1.1 skrll else if (htab->vxworks_p
3507 1.1 skrll && strcmp (p->sec->output_section->name,
3508 1.1 skrll ".tls_vars") == 0)
3509 1.1 skrll {
3510 1.1 skrll /* Relocations in vxworks .tls_vars sections are
3511 1.1 skrll handled specially by the loader. */
3512 1.1 skrll }
3513 1.1 skrll else if (p->count != 0)
3514 1.3 christos {
3515 1.3 christos srel = elf_section_data (p->sec)->sreloc;
3516 1.3 christos srel->size += p->count * sizeof (Elf32_External_Rela);
3517 1.3 christos if ((p->sec->output_section->flags & SEC_READONLY) != 0)
3518 1.1 skrll info->flags |= DF_TEXTREL;
3519 1.1 skrll
3520 1.1 skrll /* If we need relocations, we do not need fixups. */
3521 1.1 skrll if (htab->fdpic_p && !info->shared)
3522 1.1 skrll htab->srofixup->size -= 4 * (p->count - p->pc_count);
3523 1.1 skrll }
3524 1.1 skrll }
3525 1.1 skrll }
3526 1.1 skrll
3527 1.1 skrll symtab_hdr = &elf_symtab_hdr (ibfd);
3528 1.1 skrll locsymcount = symtab_hdr->sh_info;
3529 1.1 skrll #ifdef INCLUDE_SHMEDIA
3530 1.3 christos /* Count datalabel local GOT. */
3531 1.3 christos locsymcount *= 2;
3532 1.3 christos #endif
3533 1.1 skrll s = htab->sgot;
3534 1.3 christos srel = htab->srelgot;
3535 1.3 christos
3536 1.3 christos local_got = elf_local_got_refcounts (ibfd);
3537 1.3 christos if (local_got)
3538 1.3 christos {
3539 1.3 christos end_local_got = local_got + locsymcount;
3540 1.3 christos local_got_type = sh_elf_local_got_type (ibfd);
3541 1.3 christos local_funcdesc = sh_elf_local_funcdesc (ibfd);
3542 1.3 christos for (; local_got < end_local_got; ++local_got)
3543 1.3 christos {
3544 1.3 christos if (*local_got > 0)
3545 1.3 christos {
3546 1.3 christos *local_got = s->size;
3547 1.3 christos s->size += 4;
3548 1.3 christos if (*local_got_type == GOT_TLS_GD)
3549 1.3 christos s->size += 4;
3550 1.3 christos if (info->shared)
3551 1.3 christos srel->size += sizeof (Elf32_External_Rela);
3552 1.3 christos else
3553 1.3 christos htab->srofixup->size += 4;
3554 1.3 christos
3555 1.3 christos if (*local_got_type == GOT_FUNCDESC)
3556 1.3 christos {
3557 1.3 christos if (local_funcdesc == NULL)
3558 1.3 christos {
3559 1.3 christos bfd_size_type size;
3560 1.3 christos
3561 1.3 christos size = locsymcount * sizeof (union gotref);
3562 1.3 christos local_funcdesc = (union gotref *) bfd_zalloc (ibfd,
3563 1.3 christos size);
3564 1.3 christos if (local_funcdesc == NULL)
3565 1.3 christos return FALSE;
3566 1.3 christos sh_elf_local_funcdesc (ibfd) = local_funcdesc;
3567 1.3 christos local_funcdesc += (local_got
3568 1.3 christos - elf_local_got_refcounts (ibfd));
3569 1.3 christos }
3570 1.3 christos local_funcdesc->refcount++;
3571 1.3 christos ++local_funcdesc;
3572 1.3 christos }
3573 1.3 christos }
3574 1.3 christos else
3575 1.3 christos *local_got = (bfd_vma) -1;
3576 1.3 christos ++local_got_type;
3577 1.3 christos }
3578 1.3 christos }
3579 1.3 christos
3580 1.3 christos local_funcdesc = sh_elf_local_funcdesc (ibfd);
3581 1.1 skrll if (local_funcdesc)
3582 1.3 christos {
3583 1.3 christos end_local_funcdesc = local_funcdesc + locsymcount;
3584 1.3 christos
3585 1.3 christos for (; local_funcdesc < end_local_funcdesc; ++local_funcdesc)
3586 1.3 christos {
3587 1.3 christos if (local_funcdesc->refcount > 0)
3588 1.3 christos {
3589 1.3 christos local_funcdesc->offset = htab->sfuncdesc->size;
3590 1.3 christos htab->sfuncdesc->size += 8;
3591 1.3 christos if (!info->shared)
3592 1.3 christos htab->srofixup->size += 8;
3593 1.1 skrll else
3594 1.1 skrll htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
3595 1.3 christos }
3596 1.1 skrll else
3597 1.1 skrll local_funcdesc->offset = MINUS_ONE;
3598 1.1 skrll }
3599 1.1 skrll }
3600 1.1 skrll
3601 1.1 skrll }
3602 1.1 skrll
3603 1.1 skrll if (htab->tls_ldm_got.refcount > 0)
3604 1.1 skrll {
3605 1.1 skrll /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
3606 1.1 skrll relocs. */
3607 1.1 skrll htab->tls_ldm_got.offset = htab->sgot->size;
3608 1.1 skrll htab->sgot->size += 8;
3609 1.3 christos htab->srelgot->size += sizeof (Elf32_External_Rela);
3610 1.3 christos }
3611 1.3 christos else
3612 1.3 christos htab->tls_ldm_got.offset = -1;
3613 1.3 christos
3614 1.3 christos /* Only the reserved entries should be present. For FDPIC, they go at
3615 1.3 christos the end of .got.plt. */
3616 1.3 christos if (htab->fdpic_p)
3617 1.1 skrll {
3618 1.1 skrll BFD_ASSERT (htab->sgotplt && htab->sgotplt->size == 12);
3619 1.1 skrll htab->sgotplt->size = 0;
3620 1.1 skrll }
3621 1.3 christos
3622 1.3 christos /* Allocate global sym .plt and .got entries, and space for global
3623 1.3 christos sym dynamic relocs. */
3624 1.3 christos elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
3625 1.3 christos
3626 1.3 christos /* Move the reserved entries and the _GLOBAL_OFFSET_TABLE_ symbol to the
3627 1.3 christos end of the FDPIC .got.plt. */
3628 1.3 christos if (htab->fdpic_p)
3629 1.3 christos {
3630 1.3 christos htab->root.hgot->root.u.def.value = htab->sgotplt->size;
3631 1.3 christos htab->sgotplt->size += 12;
3632 1.3 christos }
3633 1.1 skrll
3634 1.1 skrll /* At the very end of the .rofixup section is a pointer to the GOT. */
3635 1.1 skrll if (htab->fdpic_p && htab->srofixup != NULL)
3636 1.1 skrll htab->srofixup->size += 4;
3637 1.1 skrll
3638 1.1 skrll /* We now have determined the sizes of the various dynamic sections.
3639 1.1 skrll Allocate memory for them. */
3640 1.1 skrll relocs = FALSE;
3641 1.1 skrll for (s = dynobj->sections; s != NULL; s = s->next)
3642 1.1 skrll {
3643 1.1 skrll if ((s->flags & SEC_LINKER_CREATED) == 0)
3644 1.3 christos continue;
3645 1.3 christos
3646 1.1 skrll if (s == htab->splt
3647 1.1 skrll || s == htab->sgot
3648 1.1 skrll || s == htab->sgotplt
3649 1.1 skrll || s == htab->sfuncdesc
3650 1.1 skrll || s == htab->srofixup
3651 1.1 skrll || s == htab->sdynbss)
3652 1.1 skrll {
3653 1.1 skrll /* Strip this section if we don't need it; see the
3654 1.1 skrll comment below. */
3655 1.1 skrll }
3656 1.1 skrll else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3657 1.1 skrll {
3658 1.1 skrll if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2)
3659 1.1 skrll relocs = TRUE;
3660 1.1 skrll
3661 1.1 skrll /* We use the reloc_count field as a counter if we need
3662 1.1 skrll to copy relocs into the output file. */
3663 1.1 skrll s->reloc_count = 0;
3664 1.1 skrll }
3665 1.1 skrll else
3666 1.1 skrll {
3667 1.1 skrll /* It's not one of our sections, so don't allocate space. */
3668 1.1 skrll continue;
3669 1.1 skrll }
3670 1.1 skrll
3671 1.1 skrll if (s->size == 0)
3672 1.1 skrll {
3673 1.1 skrll /* If we don't need this section, strip it from the
3674 1.1 skrll output file. This is mostly to handle .rela.bss and
3675 1.1 skrll .rela.plt. We must create both sections in
3676 1.1 skrll create_dynamic_sections, because they must be created
3677 1.1 skrll before the linker maps input sections to output
3678 1.1 skrll sections. The linker does that before
3679 1.1 skrll adjust_dynamic_symbol is called, and it is that
3680 1.1 skrll function which decides whether anything needs to go
3681 1.1 skrll into these sections. */
3682 1.1 skrll
3683 1.1 skrll s->flags |= SEC_EXCLUDE;
3684 1.1 skrll continue;
3685 1.1 skrll }
3686 1.1 skrll
3687 1.1 skrll if ((s->flags & SEC_HAS_CONTENTS) == 0)
3688 1.1 skrll continue;
3689 1.1 skrll
3690 1.1 skrll /* Allocate memory for the section contents. We use bfd_zalloc
3691 1.1 skrll here in case unused entries are not reclaimed before the
3692 1.1 skrll section's contents are written out. This should not happen,
3693 1.1 skrll but this way if it does, we get a R_SH_NONE reloc instead
3694 1.1 skrll of garbage. */
3695 1.1 skrll s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3696 1.1 skrll if (s->contents == NULL)
3697 1.1 skrll return FALSE;
3698 1.1 skrll }
3699 1.1 skrll
3700 1.1 skrll if (htab->root.dynamic_sections_created)
3701 1.1 skrll {
3702 1.1 skrll /* Add some entries to the .dynamic section. We fill in the
3703 1.1 skrll values later, in sh_elf_finish_dynamic_sections, but we
3704 1.1 skrll must add the entries now so that we get the correct size for
3705 1.1 skrll the .dynamic section. The DT_DEBUG entry is filled in by the
3706 1.1 skrll dynamic linker and used by the debugger. */
3707 1.1 skrll #define add_dynamic_entry(TAG, VAL) \
3708 1.1 skrll _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3709 1.1 skrll
3710 1.1 skrll if (info->executable)
3711 1.1 skrll {
3712 1.1 skrll if (! add_dynamic_entry (DT_DEBUG, 0))
3713 1.1 skrll return FALSE;
3714 1.1 skrll }
3715 1.1 skrll
3716 1.1 skrll if (htab->splt->size != 0)
3717 1.1 skrll {
3718 1.1 skrll if (! add_dynamic_entry (DT_PLTGOT, 0)
3719 1.3 christos || ! add_dynamic_entry (DT_PLTRELSZ, 0)
3720 1.3 christos || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
3721 1.3 christos || ! add_dynamic_entry (DT_JMPREL, 0))
3722 1.3 christos return FALSE;
3723 1.3 christos }
3724 1.3 christos else if ((elf_elfheader (output_bfd)->e_flags & EF_SH_FDPIC)
3725 1.1 skrll && htab->sgot->size != 0)
3726 1.1 skrll {
3727 1.1 skrll if (! add_dynamic_entry (DT_PLTGOT, 0))
3728 1.1 skrll return FALSE;
3729 1.1 skrll }
3730 1.1 skrll
3731 1.1 skrll if (relocs)
3732 1.1 skrll {
3733 1.1 skrll if (! add_dynamic_entry (DT_RELA, 0)
3734 1.1 skrll || ! add_dynamic_entry (DT_RELASZ, 0)
3735 1.1 skrll || ! add_dynamic_entry (DT_RELAENT,
3736 1.1 skrll sizeof (Elf32_External_Rela)))
3737 1.1 skrll return FALSE;
3738 1.1 skrll
3739 1.1 skrll /* If any dynamic relocs apply to a read-only section,
3740 1.1 skrll then we need a DT_TEXTREL entry. */
3741 1.1 skrll if ((info->flags & DF_TEXTREL) == 0)
3742 1.1 skrll elf_link_hash_traverse (&htab->root, readonly_dynrelocs, info);
3743 1.1 skrll
3744 1.1 skrll if ((info->flags & DF_TEXTREL) != 0)
3745 1.1 skrll {
3746 1.1 skrll if (! add_dynamic_entry (DT_TEXTREL, 0))
3747 1.1 skrll return FALSE;
3748 1.1 skrll }
3749 1.1 skrll }
3750 1.1 skrll if (htab->vxworks_p
3751 1.1 skrll && !elf_vxworks_add_dynamic_entries (output_bfd, info))
3752 1.1 skrll return FALSE;
3753 1.1 skrll }
3754 1.3 christos #undef add_dynamic_entry
3755 1.3 christos
3756 1.3 christos return TRUE;
3757 1.3 christos }
3758 1.3 christos
3759 1.3 christos /* Add a dynamic relocation to the SRELOC section. */
3761 1.3 christos
3762 1.3 christos inline static bfd_vma
3763 1.3 christos sh_elf_add_dyn_reloc (bfd *output_bfd, asection *sreloc, bfd_vma offset,
3764 1.3 christos int reloc_type, long dynindx, bfd_vma addend)
3765 1.3 christos {
3766 1.3 christos Elf_Internal_Rela outrel;
3767 1.3 christos bfd_vma reloc_offset;
3768 1.3 christos
3769 1.3 christos outrel.r_offset = offset;
3770 1.3 christos outrel.r_info = ELF32_R_INFO (dynindx, reloc_type);
3771 1.3 christos outrel.r_addend = addend;
3772 1.3 christos
3773 1.3 christos reloc_offset = sreloc->reloc_count * sizeof (Elf32_External_Rela);
3774 1.3 christos BFD_ASSERT (reloc_offset < sreloc->size);
3775 1.3 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3776 1.3 christos sreloc->contents + reloc_offset);
3777 1.3 christos sreloc->reloc_count++;
3778 1.3 christos
3779 1.3 christos return reloc_offset;
3780 1.3 christos }
3781 1.3 christos
3782 1.3 christos /* Add an FDPIC read-only fixup. */
3783 1.3 christos
3784 1.3 christos inline static void
3785 1.3 christos sh_elf_add_rofixup (bfd *output_bfd, asection *srofixup, bfd_vma offset)
3786 1.3 christos {
3787 1.3 christos bfd_vma fixup_offset;
3788 1.3 christos
3789 1.3 christos fixup_offset = srofixup->reloc_count++ * 4;
3790 1.3 christos BFD_ASSERT (fixup_offset < srofixup->size);
3791 1.3 christos bfd_put_32 (output_bfd, offset, srofixup->contents + fixup_offset);
3792 1.3 christos }
3793 1.3 christos
3794 1.3 christos /* Return the offset of the generated .got section from the
3795 1.3 christos _GLOBAL_OFFSET_TABLE_ symbol. */
3796 1.3 christos
3797 1.3 christos static bfd_signed_vma
3798 1.3 christos sh_elf_got_offset (struct elf_sh_link_hash_table *htab)
3799 1.3 christos {
3800 1.3 christos return (htab->sgot->output_offset - htab->sgotplt->output_offset
3801 1.3 christos - htab->root.hgot->root.u.def.value);
3802 1.3 christos }
3803 1.3 christos
3804 1.3 christos /* Find the segment number in which OSEC, and output section, is
3805 1.3 christos located. */
3806 1.3 christos
3807 1.3 christos static unsigned
3808 1.3 christos sh_elf_osec_to_segment (bfd *output_bfd, asection *osec)
3809 1.3 christos {
3810 1.3 christos Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section (output_bfd,
3811 1.3 christos osec);
3812 1.3 christos
3813 1.3 christos /* FIXME: Nothing ever says what this index is relative to. The kernel
3814 1.3 christos supplies data in terms of the number of load segments but this is
3815 1.3 christos a phdr index and the first phdr may not be a load segment. */
3816 1.3 christos return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1;
3817 1.3 christos }
3818 1.3 christos
3819 1.3 christos static bfd_boolean
3820 1.3 christos sh_elf_osec_readonly_p (bfd *output_bfd, asection *osec)
3821 1.3 christos {
3822 1.3 christos unsigned seg = sh_elf_osec_to_segment (output_bfd, osec);
3823 1.3 christos
3824 1.3 christos return ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W);
3825 1.3 christos }
3826 1.3 christos
3827 1.3 christos /* Generate the initial contents of a local function descriptor, along
3828 1.3 christos with any relocations or fixups required. */
3829 1.3 christos static bfd_boolean
3830 1.3 christos sh_elf_initialize_funcdesc (bfd *output_bfd,
3831 1.3 christos struct bfd_link_info *info,
3832 1.3 christos struct elf_link_hash_entry *h,
3833 1.3 christos bfd_vma offset,
3834 1.3 christos asection *section,
3835 1.3 christos bfd_vma value)
3836 1.3 christos {
3837 1.3 christos struct elf_sh_link_hash_table *htab;
3838 1.3 christos int dynindx;
3839 1.3 christos bfd_vma addr, seg;
3840 1.3 christos
3841 1.3 christos htab = sh_elf_hash_table (info);
3842 1.3 christos
3843 1.3 christos /* FIXME: The ABI says that the offset to the function goes in the
3844 1.3 christos descriptor, along with the segment index. We're RELA, so it could
3845 1.3 christos go in the reloc instead... */
3846 1.3 christos
3847 1.3 christos if (h != NULL && SYMBOL_CALLS_LOCAL (info, h))
3848 1.3 christos {
3849 1.3 christos section = h->root.u.def.section;
3850 1.3 christos value = h->root.u.def.value;
3851 1.3 christos }
3852 1.3 christos
3853 1.3 christos if (h == NULL || SYMBOL_CALLS_LOCAL (info, h))
3854 1.3 christos {
3855 1.3 christos dynindx = elf_section_data (section->output_section)->dynindx;
3856 1.3 christos addr = value + section->output_offset;
3857 1.3 christos seg = sh_elf_osec_to_segment (output_bfd, section->output_section);
3858 1.3 christos }
3859 1.3 christos else
3860 1.3 christos {
3861 1.3 christos BFD_ASSERT (h->dynindx != -1);
3862 1.3 christos dynindx = h->dynindx;
3863 1.3 christos addr = seg = 0;
3864 1.3 christos }
3865 1.3 christos
3866 1.3 christos if (!info->shared && SYMBOL_CALLS_LOCAL (info, h))
3867 1.3 christos {
3868 1.3 christos if (h == NULL || h->root.type != bfd_link_hash_undefweak)
3869 1.3 christos {
3870 1.3 christos sh_elf_add_rofixup (output_bfd, htab->srofixup,
3871 1.3 christos offset
3872 1.3 christos + htab->sfuncdesc->output_section->vma
3873 1.3 christos + htab->sfuncdesc->output_offset);
3874 1.3 christos sh_elf_add_rofixup (output_bfd, htab->srofixup,
3875 1.3 christos offset + 4
3876 1.3 christos + htab->sfuncdesc->output_section->vma
3877 1.3 christos + htab->sfuncdesc->output_offset);
3878 1.3 christos }
3879 1.3 christos
3880 1.3 christos /* There are no dynamic relocations so fill in the final
3881 1.3 christos address and gp value (barring fixups). */
3882 1.3 christos addr += section->output_section->vma;
3883 1.3 christos seg = htab->root.hgot->root.u.def.value
3884 1.3 christos + htab->root.hgot->root.u.def.section->output_section->vma
3885 1.3 christos + htab->root.hgot->root.u.def.section->output_offset;
3886 1.3 christos }
3887 1.3 christos else
3888 1.3 christos sh_elf_add_dyn_reloc (output_bfd, htab->srelfuncdesc,
3889 1.3 christos offset
3890 1.3 christos + htab->sfuncdesc->output_section->vma
3891 1.3 christos + htab->sfuncdesc->output_offset,
3892 1.3 christos R_SH_FUNCDESC_VALUE, dynindx, 0);
3893 1.3 christos
3894 1.3 christos bfd_put_32 (output_bfd, addr, htab->sfuncdesc->contents + offset);
3895 1.3 christos bfd_put_32 (output_bfd, seg, htab->sfuncdesc->contents + offset + 4);
3896 1.3 christos
3897 1.3 christos return TRUE;
3898 1.3 christos }
3899 1.3 christos
3900 1.3 christos /* Install a 20-bit movi20 field starting at ADDR, which occurs in OUTPUT_BFD.
3901 1.3 christos VALUE is the field's value. Return bfd_reloc_ok if successful or an error
3902 1.3 christos otherwise. */
3903 1.3 christos
3904 1.3 christos static bfd_reloc_status_type
3905 1.3 christos install_movi20_field (bfd *output_bfd, unsigned long relocation,
3906 1.3 christos bfd *input_bfd, asection *input_section,
3907 1.3 christos bfd_byte *contents, bfd_vma offset)
3908 1.3 christos {
3909 1.3 christos unsigned long cur_val;
3910 1.3 christos bfd_byte *addr;
3911 1.3 christos bfd_reloc_status_type r;
3912 1.3 christos
3913 1.3 christos if (offset > bfd_get_section_limit (input_bfd, input_section))
3914 1.3 christos return bfd_reloc_outofrange;
3915 1.3 christos
3916 1.3 christos r = bfd_check_overflow (complain_overflow_signed, 20, 0,
3917 1.3 christos bfd_arch_bits_per_address (input_bfd), relocation);
3918 1.3 christos if (r != bfd_reloc_ok)
3919 1.3 christos return r;
3920 1.3 christos
3921 1.3 christos addr = contents + offset;
3922 1.3 christos cur_val = bfd_get_16 (output_bfd, addr);
3923 1.1 skrll bfd_put_16 (output_bfd, cur_val | ((relocation & 0xf0000) >> 12), addr);
3924 1.1 skrll bfd_put_16 (output_bfd, relocation & 0xffff, addr + 2);
3925 1.1 skrll
3926 1.1 skrll return bfd_reloc_ok;
3927 1.1 skrll }
3928 1.1 skrll
3929 1.1 skrll /* Relocate an SH ELF section. */
3930 1.1 skrll
3931 1.1 skrll static bfd_boolean
3932 1.1 skrll sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
3933 1.1 skrll bfd *input_bfd, asection *input_section,
3934 1.1 skrll bfd_byte *contents, Elf_Internal_Rela *relocs,
3935 1.1 skrll Elf_Internal_Sym *local_syms,
3936 1.3 christos asection **local_sections)
3937 1.1 skrll {
3938 1.3 christos struct elf_sh_link_hash_table *htab;
3939 1.3 christos Elf_Internal_Shdr *symtab_hdr;
3940 1.3 christos struct elf_link_hash_entry **sym_hashes;
3941 1.3 christos Elf_Internal_Rela *rel, *relend;
3942 1.3 christos bfd *dynobj = NULL;
3943 1.3 christos bfd_vma *local_got_offsets;
3944 1.3 christos asection *sgot = NULL;
3945 1.3 christos asection *sgotplt = NULL;
3946 1.1 skrll asection *splt = NULL;
3947 1.1 skrll asection *sreloc = NULL;
3948 1.1 skrll asection *srelgot = NULL;
3949 1.1 skrll bfd_boolean is_vxworks_tls;
3950 1.3 christos unsigned isec_segment, got_segment, plt_segment, check_segment[2];
3951 1.3 christos bfd_boolean fdpic_p = FALSE;
3952 1.3 christos
3953 1.3 christos BFD_ASSERT (is_sh_elf (input_bfd));
3954 1.3 christos
3955 1.3 christos htab = sh_elf_hash_table (info);
3956 1.3 christos if (htab != NULL)
3957 1.3 christos {
3958 1.1 skrll dynobj = htab->root.dynobj;
3959 1.1 skrll sgot = htab->sgot;
3960 1.1 skrll sgotplt = htab->sgotplt;
3961 1.1 skrll splt = htab->splt;
3962 1.3 christos fdpic_p = htab->fdpic_p;
3963 1.3 christos }
3964 1.3 christos symtab_hdr = &elf_symtab_hdr (input_bfd);
3965 1.3 christos sym_hashes = elf_sym_hashes (input_bfd);
3966 1.3 christos local_got_offsets = elf_local_got_offsets (input_bfd);
3967 1.3 christos
3968 1.3 christos isec_segment = sh_elf_osec_to_segment (output_bfd,
3969 1.3 christos input_section->output_section);
3970 1.3 christos if (fdpic_p && sgot)
3971 1.3 christos got_segment = sh_elf_osec_to_segment (output_bfd,
3972 1.3 christos sgot->output_section);
3973 1.3 christos else
3974 1.3 christos got_segment = -1;
3975 1.1 skrll if (fdpic_p && splt)
3976 1.1 skrll plt_segment = sh_elf_osec_to_segment (output_bfd,
3977 1.3 christos splt->output_section);
3978 1.1 skrll else
3979 1.1 skrll plt_segment = -1;
3980 1.1 skrll
3981 1.1 skrll /* We have to handle relocations in vxworks .tls_vars sections
3982 1.1 skrll specially, because the dynamic loader is 'weird'. */
3983 1.1 skrll is_vxworks_tls = (htab && htab->vxworks_p && info->shared
3984 1.1 skrll && !strcmp (input_section->output_section->name,
3985 1.1 skrll ".tls_vars"));
3986 1.1 skrll
3987 1.1 skrll rel = relocs;
3988 1.1 skrll relend = relocs + input_section->reloc_count;
3989 1.1 skrll for (; rel < relend; rel++)
3990 1.1 skrll {
3991 1.1 skrll int r_type;
3992 1.1 skrll reloc_howto_type *howto;
3993 1.1 skrll unsigned long r_symndx;
3994 1.1 skrll Elf_Internal_Sym *sym;
3995 1.1 skrll asection *sec;
3996 1.3 christos struct elf_link_hash_entry *h;
3997 1.3 christos bfd_vma relocation;
3998 1.1 skrll bfd_vma addend = (bfd_vma) 0;
3999 1.1 skrll bfd_reloc_status_type r;
4000 1.1 skrll int seen_stt_datalabel = 0;
4001 1.1 skrll bfd_vma off;
4002 1.1 skrll int got_type;
4003 1.1 skrll const char *symname = NULL;
4004 1.1 skrll
4005 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
4006 1.1 skrll
4007 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
4008 1.1 skrll
4009 1.1 skrll /* Many of the relocs are only used for relaxing, and are
4010 1.1 skrll handled entirely by the relaxation code. */
4011 1.1 skrll if (r_type >= (int) R_SH_GNU_VTINHERIT
4012 1.1 skrll && r_type <= (int) R_SH_LABEL)
4013 1.1 skrll continue;
4014 1.1 skrll if (r_type == (int) R_SH_NONE)
4015 1.3 christos continue;
4016 1.3 christos
4017 1.1 skrll if (r_type < 0
4018 1.1 skrll || r_type >= R_SH_max
4019 1.1 skrll || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
4020 1.1 skrll && r_type <= (int) R_SH_LAST_INVALID_RELOC)
4021 1.1 skrll || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
4022 1.1 skrll && r_type <= (int) R_SH_LAST_INVALID_RELOC_2)
4023 1.3 christos || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_3
4024 1.3 christos && r_type <= (int) R_SH_LAST_INVALID_RELOC_3)
4025 1.1 skrll || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_4
4026 1.1 skrll && r_type <= (int) R_SH_LAST_INVALID_RELOC_4)
4027 1.1 skrll || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_5
4028 1.1 skrll && r_type <= (int) R_SH_LAST_INVALID_RELOC_5)
4029 1.1 skrll || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_6
4030 1.1 skrll && r_type <= (int) R_SH_LAST_INVALID_RELOC_6))
4031 1.1 skrll {
4032 1.1 skrll bfd_set_error (bfd_error_bad_value);
4033 1.1 skrll return FALSE;
4034 1.1 skrll }
4035 1.1 skrll
4036 1.1 skrll howto = get_howto_table (output_bfd) + r_type;
4037 1.1 skrll
4038 1.1 skrll /* For relocs that aren't partial_inplace, we get the addend from
4039 1.1 skrll the relocation. */
4040 1.3 christos if (! howto->partial_inplace)
4041 1.3 christos addend = rel->r_addend;
4042 1.1 skrll
4043 1.1 skrll h = NULL;
4044 1.1 skrll sym = NULL;
4045 1.1 skrll sec = NULL;
4046 1.3 christos check_segment[0] = -1;
4047 1.3 christos check_segment[1] = -1;
4048 1.3 christos if (r_symndx < symtab_hdr->sh_info)
4049 1.3 christos {
4050 1.3 christos sym = local_syms + r_symndx;
4051 1.3 christos sec = local_sections[r_symndx];
4052 1.1 skrll
4053 1.1 skrll symname = bfd_elf_string_from_elf_section
4054 1.1 skrll (input_bfd, symtab_hdr->sh_link, sym->st_name);
4055 1.1 skrll if (symname == NULL || *symname == '\0')
4056 1.1 skrll symname = bfd_section_name (input_bfd, sec);
4057 1.1 skrll
4058 1.1 skrll relocation = (sec->output_section->vma
4059 1.1 skrll + sec->output_offset
4060 1.1 skrll + sym->st_value);
4061 1.1 skrll /* A local symbol never has STO_SH5_ISA32, so we don't need
4062 1.1 skrll datalabel processing here. Make sure this does not change
4063 1.1 skrll without notice. */
4064 1.1 skrll if ((sym->st_other & STO_SH5_ISA32) != 0)
4065 1.1 skrll ((*info->callbacks->reloc_dangerous)
4066 1.1 skrll (info,
4067 1.1 skrll _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
4068 1.1 skrll input_bfd, input_section, rel->r_offset));
4069 1.1 skrll
4070 1.1 skrll if (sec != NULL && elf_discarded_section (sec))
4071 1.1 skrll /* Handled below. */
4072 1.1 skrll ;
4073 1.1 skrll else if (info->relocatable)
4074 1.1 skrll {
4075 1.1 skrll /* This is a relocatable link. We don't have to change
4076 1.1 skrll anything, unless the reloc is against a section symbol,
4077 1.1 skrll in which case we have to adjust according to where the
4078 1.1 skrll section symbol winds up in the output section. */
4079 1.1 skrll if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4080 1.1 skrll {
4081 1.1 skrll if (! howto->partial_inplace)
4082 1.1 skrll {
4083 1.1 skrll /* For relocations with the addend in the
4084 1.1 skrll relocation, we need just to update the addend.
4085 1.1 skrll All real relocs are of type partial_inplace; this
4086 1.1 skrll code is mostly for completeness. */
4087 1.1 skrll rel->r_addend += sec->output_offset;
4088 1.1 skrll
4089 1.1 skrll continue;
4090 1.1 skrll }
4091 1.1 skrll
4092 1.1 skrll /* Relocs of type partial_inplace need to pick up the
4093 1.1 skrll contents in the contents and add the offset resulting
4094 1.1 skrll from the changed location of the section symbol.
4095 1.1 skrll Using _bfd_final_link_relocate (e.g. goto
4096 1.1 skrll final_link_relocate) here would be wrong, because
4097 1.1 skrll relocations marked pc_relative would get the current
4098 1.1 skrll location subtracted, and we must only do that at the
4099 1.1 skrll final link. */
4100 1.1 skrll r = _bfd_relocate_contents (howto, input_bfd,
4101 1.1 skrll sec->output_offset
4102 1.1 skrll + sym->st_value,
4103 1.1 skrll contents + rel->r_offset);
4104 1.1 skrll goto relocation_done;
4105 1.1 skrll }
4106 1.1 skrll
4107 1.1 skrll continue;
4108 1.1 skrll }
4109 1.1 skrll else if (! howto->partial_inplace)
4110 1.1 skrll {
4111 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4112 1.1 skrll addend = rel->r_addend;
4113 1.1 skrll }
4114 1.1 skrll else if ((sec->flags & SEC_MERGE)
4115 1.1 skrll && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4116 1.1 skrll {
4117 1.1 skrll asection *msec;
4118 1.1 skrll
4119 1.1 skrll if (howto->rightshift || howto->src_mask != 0xffffffff)
4120 1.1 skrll {
4121 1.1 skrll (*_bfd_error_handler)
4122 1.1 skrll (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
4123 1.1 skrll input_bfd, input_section,
4124 1.1 skrll (long) rel->r_offset, howto->name);
4125 1.1 skrll return FALSE;
4126 1.1 skrll }
4127 1.1 skrll
4128 1.1 skrll addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
4129 1.1 skrll msec = sec;
4130 1.1 skrll addend =
4131 1.1 skrll _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
4132 1.1 skrll - relocation;
4133 1.1 skrll addend += msec->output_section->vma + msec->output_offset;
4134 1.1 skrll bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
4135 1.1 skrll addend = 0;
4136 1.1 skrll }
4137 1.1 skrll }
4138 1.3 christos else
4139 1.1 skrll {
4140 1.1 skrll /* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro. */
4141 1.1 skrll
4142 1.1 skrll relocation = 0;
4143 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4144 1.1 skrll symname = h->root.root.string;
4145 1.1 skrll while (h->root.type == bfd_link_hash_indirect
4146 1.1 skrll || h->root.type == bfd_link_hash_warning)
4147 1.1 skrll {
4148 1.1 skrll #ifdef INCLUDE_SHMEDIA
4149 1.1 skrll /* If the reference passes a symbol marked with
4150 1.1 skrll STT_DATALABEL, then any STO_SH5_ISA32 on the final value
4151 1.1 skrll doesn't count. */
4152 1.1 skrll seen_stt_datalabel |= h->type == STT_DATALABEL;
4153 1.1 skrll #endif
4154 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
4155 1.3 christos }
4156 1.1 skrll if (h->root.type == bfd_link_hash_defined
4157 1.1 skrll || h->root.type == bfd_link_hash_defweak)
4158 1.1 skrll {
4159 1.1 skrll bfd_boolean dyn;
4160 1.1 skrll
4161 1.1 skrll dyn = htab ? htab->root.dynamic_sections_created : FALSE;
4162 1.1 skrll sec = h->root.u.def.section;
4163 1.1 skrll /* In these cases, we don't need the relocation value.
4164 1.1 skrll We check specially because in some obscure cases
4165 1.1 skrll sec->output_section will be NULL. */
4166 1.1 skrll if (r_type == R_SH_GOTPC
4167 1.1 skrll || r_type == R_SH_GOTPC_LOW16
4168 1.1 skrll || r_type == R_SH_GOTPC_MEDLOW16
4169 1.1 skrll || r_type == R_SH_GOTPC_MEDHI16
4170 1.1 skrll || r_type == R_SH_GOTPC_HI16
4171 1.1 skrll || ((r_type == R_SH_PLT32
4172 1.3 christos || r_type == R_SH_PLT_LOW16
4173 1.3 christos || r_type == R_SH_PLT_MEDLOW16
4174 1.3 christos || r_type == R_SH_PLT_MEDHI16
4175 1.3 christos || r_type == R_SH_PLT_HI16)
4176 1.3 christos && h->plt.offset != (bfd_vma) -1)
4177 1.3 christos || ((r_type == R_SH_GOT32
4178 1.1 skrll || r_type == R_SH_GOT20
4179 1.1 skrll || r_type == R_SH_GOTFUNCDESC
4180 1.1 skrll || r_type == R_SH_GOTFUNCDESC20
4181 1.1 skrll || r_type == R_SH_GOTOFFFUNCDESC
4182 1.1 skrll || r_type == R_SH_GOTOFFFUNCDESC20
4183 1.1 skrll || r_type == R_SH_FUNCDESC
4184 1.1 skrll || r_type == R_SH_GOT_LOW16
4185 1.1 skrll || r_type == R_SH_GOT_MEDLOW16
4186 1.1 skrll || r_type == R_SH_GOT_MEDHI16
4187 1.1 skrll || r_type == R_SH_GOT_HI16)
4188 1.1 skrll && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4189 1.1 skrll && (! info->shared
4190 1.1 skrll || (! info->symbolic && h->dynindx != -1)
4191 1.1 skrll || !h->def_regular))
4192 1.1 skrll /* The cases above are those in which relocation is
4193 1.1 skrll overwritten in the switch block below. The cases
4194 1.1 skrll below are those in which we must defer relocation
4195 1.1 skrll to run-time, because we can't resolve absolute
4196 1.1 skrll addresses when creating a shared library. */
4197 1.1 skrll || (info->shared
4198 1.1 skrll && ((! info->symbolic && h->dynindx != -1)
4199 1.1 skrll || !h->def_regular)
4200 1.1 skrll && ((r_type == R_SH_DIR32
4201 1.1 skrll && !h->forced_local)
4202 1.1 skrll || (r_type == R_SH_REL32
4203 1.1 skrll && !SYMBOL_CALLS_LOCAL (info, h)))
4204 1.1 skrll && ((input_section->flags & SEC_ALLOC) != 0
4205 1.1 skrll /* DWARF will emit R_SH_DIR32 relocations in its
4206 1.1 skrll sections against symbols defined externally
4207 1.1 skrll in shared libraries. We can't do anything
4208 1.1 skrll with them here. */
4209 1.1 skrll || ((input_section->flags & SEC_DEBUGGING) != 0
4210 1.1 skrll && h->def_dynamic)))
4211 1.1 skrll /* Dynamic relocs are not propagated for SEC_DEBUGGING
4212 1.3 christos sections because such sections are not SEC_ALLOC and
4213 1.3 christos thus ld.so will not process them. */
4214 1.1 skrll || (sec->output_section == NULL
4215 1.1 skrll && ((input_section->flags & SEC_DEBUGGING) != 0
4216 1.1 skrll && h->def_dynamic))
4217 1.1 skrll || (sec->output_section == NULL
4218 1.1 skrll && (sh_elf_hash_entry (h)->got_type == GOT_TLS_IE
4219 1.1 skrll || sh_elf_hash_entry (h)->got_type == GOT_TLS_GD)))
4220 1.1 skrll ;
4221 1.1 skrll else if (sec->output_section != NULL)
4222 1.1 skrll relocation = ((h->root.u.def.value
4223 1.1 skrll + sec->output_section->vma
4224 1.1 skrll + sec->output_offset)
4225 1.1 skrll /* A STO_SH5_ISA32 causes a "bitor 1" to the
4226 1.1 skrll symbol value, unless we've seen
4227 1.1 skrll STT_DATALABEL on the way to it. */
4228 1.1 skrll | ((h->other & STO_SH5_ISA32) != 0
4229 1.1 skrll && ! seen_stt_datalabel));
4230 1.1 skrll else if (!info->relocatable)
4231 1.1 skrll {
4232 1.1 skrll (*_bfd_error_handler)
4233 1.1 skrll (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4234 1.1 skrll input_bfd,
4235 1.1 skrll input_section,
4236 1.1 skrll (long) rel->r_offset,
4237 1.1 skrll howto->name,
4238 1.1 skrll h->root.root.string);
4239 1.1 skrll return FALSE;
4240 1.1 skrll }
4241 1.1 skrll }
4242 1.1 skrll else if (h->root.type == bfd_link_hash_undefweak)
4243 1.1 skrll ;
4244 1.1 skrll else if (info->unresolved_syms_in_objects == RM_IGNORE
4245 1.1 skrll && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
4246 1.1 skrll ;
4247 1.1 skrll else if (!info->relocatable)
4248 1.1 skrll {
4249 1.1 skrll if (! info->callbacks->undefined_symbol
4250 1.1 skrll (info, h->root.root.string, input_bfd,
4251 1.1 skrll input_section, rel->r_offset,
4252 1.1 skrll (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
4253 1.3 christos || ELF_ST_VISIBILITY (h->other))))
4254 1.3 christos return FALSE;
4255 1.1 skrll }
4256 1.1 skrll }
4257 1.1 skrll
4258 1.1 skrll if (sec != NULL && elf_discarded_section (sec))
4259 1.3 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4260 1.3 christos rel, relend, howto, contents);
4261 1.3 christos
4262 1.3 christos if (info->relocatable)
4263 1.3 christos continue;
4264 1.3 christos
4265 1.3 christos /* Check for inter-segment relocations in FDPIC files. Most
4266 1.3 christos relocations connect the relocation site to the location of
4267 1.3 christos the target symbol, but there are some exceptions below. */
4268 1.3 christos check_segment[0] = isec_segment;
4269 1.1 skrll if (sec != NULL)
4270 1.1 skrll check_segment[1] = sh_elf_osec_to_segment (output_bfd,
4271 1.1 skrll sec->output_section);
4272 1.1 skrll else
4273 1.1 skrll check_segment[1] = -1;
4274 1.1 skrll
4275 1.1 skrll switch ((int) r_type)
4276 1.1 skrll {
4277 1.1 skrll final_link_relocate:
4278 1.1 skrll /* COFF relocs don't use the addend. The addend is used for
4279 1.1 skrll R_SH_DIR32 to be compatible with other compilers. */
4280 1.1 skrll r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4281 1.1 skrll contents, rel->r_offset,
4282 1.1 skrll relocation, addend);
4283 1.1 skrll break;
4284 1.1 skrll
4285 1.1 skrll case R_SH_IND12W:
4286 1.1 skrll goto final_link_relocate;
4287 1.1 skrll
4288 1.1 skrll case R_SH_DIR8WPN:
4289 1.1 skrll case R_SH_DIR8WPZ:
4290 1.1 skrll case R_SH_DIR8WPL:
4291 1.1 skrll /* If the reloc is against the start of this section, then
4292 1.1 skrll the assembler has already taken care of it and the reloc
4293 1.1 skrll is here only to assist in relaxing. If the reloc is not
4294 1.1 skrll against the start of this section, then it's against an
4295 1.1 skrll external symbol and we must deal with it ourselves. */
4296 1.1 skrll if (input_section->output_section->vma + input_section->output_offset
4297 1.1 skrll != relocation)
4298 1.1 skrll {
4299 1.1 skrll int disp = (relocation
4300 1.1 skrll - input_section->output_section->vma
4301 1.1 skrll - input_section->output_offset
4302 1.1 skrll - rel->r_offset);
4303 1.1 skrll int mask = 0;
4304 1.1 skrll switch (r_type)
4305 1.1 skrll {
4306 1.1 skrll case R_SH_DIR8WPN:
4307 1.1 skrll case R_SH_DIR8WPZ: mask = 1; break;
4308 1.1 skrll case R_SH_DIR8WPL: mask = 3; break;
4309 1.1 skrll default: mask = 0; break;
4310 1.1 skrll }
4311 1.1 skrll if (disp & mask)
4312 1.1 skrll {
4313 1.1 skrll ((*_bfd_error_handler)
4314 1.1 skrll (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
4315 1.1 skrll input_section->owner,
4316 1.1 skrll (unsigned long) rel->r_offset));
4317 1.1 skrll bfd_set_error (bfd_error_bad_value);
4318 1.1 skrll return FALSE;
4319 1.1 skrll }
4320 1.1 skrll relocation -= 4;
4321 1.1 skrll goto final_link_relocate;
4322 1.1 skrll }
4323 1.1 skrll r = bfd_reloc_ok;
4324 1.1 skrll break;
4325 1.1 skrll
4326 1.1 skrll default:
4327 1.1 skrll #ifdef INCLUDE_SHMEDIA
4328 1.1 skrll if (shmedia_prepare_reloc (info, input_bfd, input_section,
4329 1.1 skrll contents, rel, &relocation))
4330 1.1 skrll goto final_link_relocate;
4331 1.1 skrll #endif
4332 1.1 skrll bfd_set_error (bfd_error_bad_value);
4333 1.1 skrll return FALSE;
4334 1.1 skrll
4335 1.1 skrll case R_SH_DIR16:
4336 1.1 skrll case R_SH_DIR8:
4337 1.1 skrll case R_SH_DIR8U:
4338 1.1 skrll case R_SH_DIR8S:
4339 1.1 skrll case R_SH_DIR4U:
4340 1.1 skrll goto final_link_relocate;
4341 1.1 skrll
4342 1.1 skrll case R_SH_DIR8UL:
4343 1.1 skrll case R_SH_DIR4UL:
4344 1.1 skrll if (relocation & 3)
4345 1.1 skrll {
4346 1.1 skrll ((*_bfd_error_handler)
4347 1.1 skrll (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
4348 1.1 skrll input_section->owner,
4349 1.1 skrll (unsigned long) rel->r_offset, howto->name,
4350 1.1 skrll (unsigned long) relocation));
4351 1.1 skrll bfd_set_error (bfd_error_bad_value);
4352 1.1 skrll return FALSE;
4353 1.1 skrll }
4354 1.1 skrll goto final_link_relocate;
4355 1.1 skrll
4356 1.1 skrll case R_SH_DIR8UW:
4357 1.1 skrll case R_SH_DIR8SW:
4358 1.1 skrll case R_SH_DIR4UW:
4359 1.1 skrll if (relocation & 1)
4360 1.1 skrll {
4361 1.1 skrll ((*_bfd_error_handler)
4362 1.1 skrll (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
4363 1.1 skrll input_section->owner,
4364 1.1 skrll (unsigned long) rel->r_offset, howto->name,
4365 1.1 skrll (unsigned long) relocation));
4366 1.1 skrll bfd_set_error (bfd_error_bad_value);
4367 1.1 skrll return FALSE;
4368 1.1 skrll }
4369 1.1 skrll goto final_link_relocate;
4370 1.1 skrll
4371 1.1 skrll case R_SH_PSHA:
4372 1.1 skrll if ((signed int)relocation < -32
4373 1.1 skrll || (signed int)relocation > 32)
4374 1.1 skrll {
4375 1.1 skrll ((*_bfd_error_handler)
4376 1.1 skrll (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
4377 1.1 skrll input_section->owner,
4378 1.1 skrll (unsigned long) rel->r_offset,
4379 1.1 skrll (unsigned long) relocation));
4380 1.1 skrll bfd_set_error (bfd_error_bad_value);
4381 1.1 skrll return FALSE;
4382 1.1 skrll }
4383 1.1 skrll goto final_link_relocate;
4384 1.1 skrll
4385 1.1 skrll case R_SH_PSHL:
4386 1.1 skrll if ((signed int)relocation < -16
4387 1.1 skrll || (signed int)relocation > 16)
4388 1.1 skrll {
4389 1.1 skrll ((*_bfd_error_handler)
4390 1.1 skrll (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
4391 1.1 skrll input_section->owner,
4392 1.1 skrll (unsigned long) rel->r_offset,
4393 1.1 skrll (unsigned long) relocation));
4394 1.1 skrll bfd_set_error (bfd_error_bad_value);
4395 1.1 skrll return FALSE;
4396 1.1 skrll }
4397 1.1 skrll goto final_link_relocate;
4398 1.1 skrll
4399 1.1 skrll case R_SH_DIR32:
4400 1.1 skrll case R_SH_REL32:
4401 1.1 skrll #ifdef INCLUDE_SHMEDIA
4402 1.1 skrll case R_SH_IMM_LOW16_PCREL:
4403 1.1 skrll case R_SH_IMM_MEDLOW16_PCREL:
4404 1.1 skrll case R_SH_IMM_MEDHI16_PCREL:
4405 1.3 christos case R_SH_IMM_HI16_PCREL:
4406 1.1 skrll #endif
4407 1.1 skrll if (info->shared
4408 1.1 skrll && (h == NULL
4409 1.1 skrll || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4410 1.1 skrll || h->root.type != bfd_link_hash_undefweak)
4411 1.1 skrll && r_symndx != STN_UNDEF
4412 1.1 skrll && (input_section->flags & SEC_ALLOC) != 0
4413 1.1 skrll && !is_vxworks_tls
4414 1.1 skrll && (r_type == R_SH_DIR32
4415 1.1 skrll || !SYMBOL_CALLS_LOCAL (info, h)))
4416 1.1 skrll {
4417 1.1 skrll Elf_Internal_Rela outrel;
4418 1.1 skrll bfd_byte *loc;
4419 1.1 skrll bfd_boolean skip, relocate;
4420 1.1 skrll
4421 1.3 christos /* When generating a shared object, these relocations
4422 1.3 christos are copied into the output file to be resolved at run
4423 1.3 christos time. */
4424 1.1 skrll
4425 1.1 skrll if (sreloc == NULL)
4426 1.1 skrll {
4427 1.1 skrll sreloc = _bfd_elf_get_dynamic_reloc_section
4428 1.1 skrll (input_bfd, input_section, /*rela?*/ TRUE);
4429 1.1 skrll if (sreloc == NULL)
4430 1.1 skrll return FALSE;
4431 1.1 skrll }
4432 1.1 skrll
4433 1.1 skrll skip = FALSE;
4434 1.1 skrll relocate = FALSE;
4435 1.1 skrll
4436 1.1 skrll outrel.r_offset =
4437 1.1 skrll _bfd_elf_section_offset (output_bfd, info, input_section,
4438 1.1 skrll rel->r_offset);
4439 1.1 skrll if (outrel.r_offset == (bfd_vma) -1)
4440 1.1 skrll skip = TRUE;
4441 1.1 skrll else if (outrel.r_offset == (bfd_vma) -2)
4442 1.1 skrll skip = TRUE, relocate = TRUE;
4443 1.1 skrll outrel.r_offset += (input_section->output_section->vma
4444 1.1 skrll + input_section->output_offset);
4445 1.1 skrll
4446 1.1 skrll if (skip)
4447 1.1 skrll memset (&outrel, 0, sizeof outrel);
4448 1.1 skrll else if (r_type == R_SH_REL32)
4449 1.1 skrll {
4450 1.1 skrll BFD_ASSERT (h != NULL && h->dynindx != -1);
4451 1.1 skrll outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
4452 1.1 skrll outrel.r_addend
4453 1.1 skrll = (howto->partial_inplace
4454 1.1 skrll ? bfd_get_32 (input_bfd, contents + rel->r_offset)
4455 1.1 skrll : addend);
4456 1.1 skrll }
4457 1.1 skrll #ifdef INCLUDE_SHMEDIA
4458 1.1 skrll else if (r_type == R_SH_IMM_LOW16_PCREL
4459 1.1 skrll || r_type == R_SH_IMM_MEDLOW16_PCREL
4460 1.1 skrll || r_type == R_SH_IMM_MEDHI16_PCREL
4461 1.1 skrll || r_type == R_SH_IMM_HI16_PCREL)
4462 1.3 christos {
4463 1.3 christos BFD_ASSERT (h != NULL && h->dynindx != -1);
4464 1.3 christos outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4465 1.3 christos outrel.r_addend = addend;
4466 1.3 christos }
4467 1.3 christos #endif
4468 1.3 christos else if (fdpic_p
4469 1.3 christos && (h == NULL
4470 1.3 christos || ((info->symbolic || h->dynindx == -1)
4471 1.3 christos && h->def_regular)))
4472 1.3 christos {
4473 1.3 christos int dynindx;
4474 1.3 christos
4475 1.3 christos BFD_ASSERT (sec != NULL);
4476 1.3 christos BFD_ASSERT (sec->output_section != NULL);
4477 1.3 christos dynindx = elf_section_data (sec->output_section)->dynindx;
4478 1.3 christos outrel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
4479 1.3 christos outrel.r_addend = relocation;
4480 1.1 skrll outrel.r_addend
4481 1.1 skrll += (howto->partial_inplace
4482 1.1 skrll ? bfd_get_32 (input_bfd, contents + rel->r_offset)
4483 1.1 skrll : addend);
4484 1.1 skrll outrel.r_addend -= sec->output_section->vma;
4485 1.1 skrll }
4486 1.1 skrll else
4487 1.1 skrll {
4488 1.1 skrll /* h->dynindx may be -1 if this symbol was marked to
4489 1.1 skrll become local. */
4490 1.1 skrll if (h == NULL
4491 1.1 skrll || ((info->symbolic || h->dynindx == -1)
4492 1.1 skrll && h->def_regular))
4493 1.1 skrll {
4494 1.1 skrll relocate = howto->partial_inplace;
4495 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
4496 1.1 skrll }
4497 1.1 skrll else
4498 1.1 skrll {
4499 1.1 skrll BFD_ASSERT (h->dynindx != -1);
4500 1.1 skrll outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
4501 1.1 skrll }
4502 1.1 skrll outrel.r_addend = relocation;
4503 1.1 skrll outrel.r_addend
4504 1.1 skrll += (howto->partial_inplace
4505 1.1 skrll ? bfd_get_32 (input_bfd, contents + rel->r_offset)
4506 1.1 skrll : addend);
4507 1.3 christos }
4508 1.3 christos
4509 1.1 skrll loc = sreloc->contents;
4510 1.1 skrll loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4511 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4512 1.1 skrll
4513 1.1 skrll check_segment[0] = check_segment[1] = -1;
4514 1.1 skrll
4515 1.1 skrll /* If this reloc is against an external symbol, we do
4516 1.3 christos not want to fiddle with the addend. Otherwise, we
4517 1.3 christos need to include the symbol value so that it becomes
4518 1.3 christos an addend for the dynamic reloc. */
4519 1.3 christos if (! relocate)
4520 1.3 christos continue;
4521 1.3 christos }
4522 1.3 christos else if (fdpic_p && !info->shared
4523 1.3 christos && r_type == R_SH_DIR32
4524 1.3 christos && (input_section->flags & SEC_ALLOC) != 0)
4525 1.3 christos {
4526 1.3 christos bfd_vma offset;
4527 1.3 christos
4528 1.3 christos BFD_ASSERT (htab);
4529 1.3 christos
4530 1.3 christos if (sh_elf_osec_readonly_p (output_bfd,
4531 1.3 christos input_section->output_section))
4532 1.3 christos {
4533 1.3 christos (*_bfd_error_handler)
4534 1.3 christos (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"),
4535 1.3 christos input_bfd,
4536 1.3 christos input_section,
4537 1.3 christos (long) rel->r_offset,
4538 1.3 christos symname);
4539 1.3 christos return FALSE;
4540 1.3 christos }
4541 1.3 christos
4542 1.3 christos offset = _bfd_elf_section_offset (output_bfd, info,
4543 1.3 christos input_section, rel->r_offset);
4544 1.3 christos if (offset != (bfd_vma)-1)
4545 1.3 christos sh_elf_add_rofixup (output_bfd, htab->srofixup,
4546 1.1 skrll input_section->output_section->vma
4547 1.1 skrll + input_section->output_offset
4548 1.1 skrll + rel->r_offset);
4549 1.1 skrll
4550 1.1 skrll check_segment[0] = check_segment[1] = -1;
4551 1.1 skrll }
4552 1.1 skrll goto final_link_relocate;
4553 1.1 skrll
4554 1.1 skrll case R_SH_GOTPLT32:
4555 1.1 skrll #ifdef INCLUDE_SHMEDIA
4556 1.1 skrll case R_SH_GOTPLT_LOW16:
4557 1.1 skrll case R_SH_GOTPLT_MEDLOW16:
4558 1.1 skrll case R_SH_GOTPLT_MEDHI16:
4559 1.1 skrll case R_SH_GOTPLT_HI16:
4560 1.1 skrll case R_SH_GOTPLT10BY4:
4561 1.1 skrll case R_SH_GOTPLT10BY8:
4562 1.1 skrll #endif
4563 1.1 skrll /* Relocation is to the entry for this symbol in the
4564 1.1 skrll procedure linkage table. */
4565 1.1 skrll
4566 1.1 skrll if (h == NULL
4567 1.1 skrll || h->forced_local
4568 1.1 skrll || ! info->shared
4569 1.1 skrll || info->symbolic
4570 1.1 skrll || h->dynindx == -1
4571 1.1 skrll || h->plt.offset == (bfd_vma) -1
4572 1.3 christos || h->got.offset != (bfd_vma) -1)
4573 1.1 skrll goto force_got;
4574 1.1 skrll
4575 1.1 skrll /* Relocation is to the entry for this symbol in the global
4576 1.1 skrll offset table extension for the procedure linkage table. */
4577 1.1 skrll
4578 1.1 skrll BFD_ASSERT (htab);
4579 1.1 skrll BFD_ASSERT (sgotplt != NULL);
4580 1.1 skrll relocation = (sgotplt->output_offset
4581 1.1 skrll + (get_plt_index (htab->plt_info, h->plt.offset)
4582 1.1 skrll + 3) * 4);
4583 1.1 skrll
4584 1.1 skrll #ifdef GOT_BIAS
4585 1.1 skrll relocation -= GOT_BIAS;
4586 1.3 christos #endif
4587 1.1 skrll
4588 1.1 skrll goto final_link_relocate;
4589 1.1 skrll
4590 1.1 skrll force_got:
4591 1.1 skrll case R_SH_GOT32:
4592 1.1 skrll case R_SH_GOT20:
4593 1.1 skrll #ifdef INCLUDE_SHMEDIA
4594 1.1 skrll case R_SH_GOT_LOW16:
4595 1.1 skrll case R_SH_GOT_MEDLOW16:
4596 1.1 skrll case R_SH_GOT_MEDHI16:
4597 1.1 skrll case R_SH_GOT_HI16:
4598 1.3 christos case R_SH_GOT10BY4:
4599 1.1 skrll case R_SH_GOT10BY8:
4600 1.3 christos #endif
4601 1.1 skrll /* Relocation is to the entry for this symbol in the global
4602 1.1 skrll offset table. */
4603 1.1 skrll
4604 1.1 skrll BFD_ASSERT (htab);
4605 1.1 skrll BFD_ASSERT (sgot != NULL);
4606 1.1 skrll check_segment[0] = check_segment[1] = -1;
4607 1.1 skrll
4608 1.1 skrll if (h != NULL)
4609 1.1 skrll {
4610 1.1 skrll bfd_boolean dyn;
4611 1.1 skrll
4612 1.1 skrll off = h->got.offset;
4613 1.1 skrll #ifdef INCLUDE_SHMEDIA
4614 1.1 skrll if (seen_stt_datalabel)
4615 1.1 skrll {
4616 1.1 skrll struct elf_sh_link_hash_entry *hsh;
4617 1.1 skrll
4618 1.1 skrll hsh = (struct elf_sh_link_hash_entry *)h;
4619 1.1 skrll off = hsh->datalabel_got.offset;
4620 1.1 skrll }
4621 1.1 skrll #endif
4622 1.1 skrll BFD_ASSERT (off != (bfd_vma) -1);
4623 1.1 skrll
4624 1.1 skrll dyn = htab->root.dynamic_sections_created;
4625 1.1 skrll if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4626 1.1 skrll || (info->shared
4627 1.1 skrll && SYMBOL_REFERENCES_LOCAL (info, h))
4628 1.1 skrll || (ELF_ST_VISIBILITY (h->other)
4629 1.1 skrll && h->root.type == bfd_link_hash_undefweak))
4630 1.1 skrll {
4631 1.1 skrll /* This is actually a static link, or it is a
4632 1.1 skrll -Bsymbolic link and the symbol is defined
4633 1.1 skrll locally, or the symbol was forced to be local
4634 1.1 skrll because of a version file. We must initialize
4635 1.1 skrll this entry in the global offset table. Since the
4636 1.1 skrll offset must always be a multiple of 4, we use the
4637 1.1 skrll least significant bit to record whether we have
4638 1.1 skrll initialized it already.
4639 1.1 skrll
4640 1.1 skrll When doing a dynamic link, we create a .rela.got
4641 1.1 skrll relocation entry to initialize the value. This
4642 1.1 skrll is done in the finish_dynamic_symbol routine. */
4643 1.1 skrll if ((off & 1) != 0)
4644 1.1 skrll off &= ~1;
4645 1.1 skrll else
4646 1.1 skrll {
4647 1.1 skrll bfd_put_32 (output_bfd, relocation,
4648 1.1 skrll sgot->contents + off);
4649 1.1 skrll #ifdef INCLUDE_SHMEDIA
4650 1.1 skrll if (seen_stt_datalabel)
4651 1.1 skrll {
4652 1.1 skrll struct elf_sh_link_hash_entry *hsh;
4653 1.1 skrll
4654 1.3 christos hsh = (struct elf_sh_link_hash_entry *)h;
4655 1.3 christos hsh->datalabel_got.offset |= 1;
4656 1.3 christos }
4657 1.3 christos else
4658 1.3 christos #endif
4659 1.3 christos h->got.offset |= 1;
4660 1.3 christos
4661 1.3 christos /* If we initialize the GOT entry here with a valid
4662 1.3 christos symbol address, also add a fixup. */
4663 1.3 christos if (fdpic_p && !info->shared
4664 1.3 christos && sh_elf_hash_entry (h)->got_type == GOT_NORMAL
4665 1.1 skrll && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4666 1.1 skrll || h->root.type != bfd_link_hash_undefweak))
4667 1.1 skrll sh_elf_add_rofixup (output_bfd, htab->srofixup,
4668 1.3 christos sgot->output_section->vma
4669 1.1 skrll + sgot->output_offset
4670 1.1 skrll + off);
4671 1.1 skrll }
4672 1.1 skrll }
4673 1.1 skrll
4674 1.1 skrll relocation = sh_elf_got_offset (htab) + off;
4675 1.1 skrll }
4676 1.1 skrll else
4677 1.1 skrll {
4678 1.1 skrll #ifdef INCLUDE_SHMEDIA
4679 1.1 skrll if (rel->r_addend)
4680 1.1 skrll {
4681 1.1 skrll BFD_ASSERT (local_got_offsets != NULL
4682 1.1 skrll && (local_got_offsets[symtab_hdr->sh_info
4683 1.1 skrll + r_symndx]
4684 1.1 skrll != (bfd_vma) -1));
4685 1.1 skrll
4686 1.1 skrll off = local_got_offsets[symtab_hdr->sh_info
4687 1.1 skrll + r_symndx];
4688 1.1 skrll }
4689 1.1 skrll else
4690 1.1 skrll {
4691 1.1 skrll #endif
4692 1.1 skrll BFD_ASSERT (local_got_offsets != NULL
4693 1.1 skrll && local_got_offsets[r_symndx] != (bfd_vma) -1);
4694 1.1 skrll
4695 1.1 skrll off = local_got_offsets[r_symndx];
4696 1.1 skrll #ifdef INCLUDE_SHMEDIA
4697 1.1 skrll }
4698 1.1 skrll #endif
4699 1.1 skrll
4700 1.1 skrll /* The offset must always be a multiple of 4. We use
4701 1.1 skrll the least significant bit to record whether we have
4702 1.1 skrll already generated the necessary reloc. */
4703 1.1 skrll if ((off & 1) != 0)
4704 1.1 skrll off &= ~1;
4705 1.1 skrll else
4706 1.1 skrll {
4707 1.1 skrll bfd_put_32 (output_bfd, relocation, sgot->contents + off);
4708 1.1 skrll
4709 1.1 skrll if (info->shared)
4710 1.1 skrll {
4711 1.1 skrll Elf_Internal_Rela outrel;
4712 1.1 skrll bfd_byte *loc;
4713 1.1 skrll
4714 1.1 skrll if (srelgot == NULL)
4715 1.1 skrll {
4716 1.1 skrll srelgot = bfd_get_section_by_name (dynobj,
4717 1.1 skrll ".rela.got");
4718 1.3 christos BFD_ASSERT (srelgot != NULL);
4719 1.3 christos }
4720 1.3 christos
4721 1.3 christos outrel.r_offset = (sgot->output_section->vma
4722 1.3 christos + sgot->output_offset
4723 1.3 christos + off);
4724 1.3 christos if (fdpic_p)
4725 1.3 christos {
4726 1.3 christos int dynindx
4727 1.3 christos = elf_section_data (sec->output_section)->dynindx;
4728 1.3 christos outrel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
4729 1.3 christos outrel.r_addend = relocation;
4730 1.3 christos outrel.r_addend -= sec->output_section->vma;
4731 1.1 skrll }
4732 1.1 skrll else
4733 1.1 skrll {
4734 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
4735 1.3 christos outrel.r_addend = relocation;
4736 1.3 christos }
4737 1.3 christos loc = srelgot->contents;
4738 1.3 christos loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4739 1.3 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4740 1.3 christos }
4741 1.3 christos else if (fdpic_p
4742 1.1 skrll && (sh_elf_local_got_type (input_bfd) [r_symndx]
4743 1.1 skrll == GOT_NORMAL))
4744 1.1 skrll sh_elf_add_rofixup (output_bfd, htab->srofixup,
4745 1.1 skrll sgot->output_section->vma
4746 1.1 skrll + sgot->output_offset
4747 1.1 skrll + off);
4748 1.1 skrll
4749 1.1 skrll #ifdef INCLUDE_SHMEDIA
4750 1.1 skrll if (rel->r_addend)
4751 1.3 christos local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1;
4752 1.1 skrll else
4753 1.1 skrll #endif
4754 1.1 skrll local_got_offsets[r_symndx] |= 1;
4755 1.1 skrll }
4756 1.1 skrll
4757 1.1 skrll relocation = sh_elf_got_offset (htab) + off;
4758 1.3 christos }
4759 1.3 christos
4760 1.3 christos #ifdef GOT_BIAS
4761 1.3 christos relocation -= GOT_BIAS;
4762 1.3 christos #endif
4763 1.3 christos
4764 1.3 christos if (r_type == R_SH_GOT20)
4765 1.3 christos {
4766 1.3 christos r = install_movi20_field (output_bfd, relocation + addend,
4767 1.1 skrll input_bfd, input_section, contents,
4768 1.1 skrll rel->r_offset);
4769 1.3 christos break;
4770 1.1 skrll }
4771 1.1 skrll else
4772 1.1 skrll goto final_link_relocate;
4773 1.1 skrll
4774 1.1 skrll case R_SH_GOTOFF:
4775 1.1 skrll case R_SH_GOTOFF20:
4776 1.3 christos #ifdef INCLUDE_SHMEDIA
4777 1.3 christos case R_SH_GOTOFF_LOW16:
4778 1.3 christos case R_SH_GOTOFF_MEDLOW16:
4779 1.3 christos case R_SH_GOTOFF_MEDHI16:
4780 1.3 christos case R_SH_GOTOFF_HI16:
4781 1.3 christos #endif
4782 1.3 christos /* GOTOFF relocations are relative to _GLOBAL_OFFSET_TABLE_, which
4783 1.3 christos we place at the start of the .got.plt section. This is the same
4784 1.3 christos as the start of the output .got section, unless there are function
4785 1.1 skrll descriptors in front of it. */
4786 1.1 skrll BFD_ASSERT (htab);
4787 1.1 skrll BFD_ASSERT (sgotplt != NULL);
4788 1.1 skrll check_segment[0] = got_segment;
4789 1.1 skrll relocation -= sgotplt->output_section->vma + sgotplt->output_offset
4790 1.1 skrll + htab->root.hgot->root.u.def.value;
4791 1.1 skrll
4792 1.3 christos #ifdef GOT_BIAS
4793 1.3 christos relocation -= GOT_BIAS;
4794 1.3 christos #endif
4795 1.3 christos
4796 1.3 christos addend = rel->r_addend;
4797 1.3 christos
4798 1.3 christos if (r_type == R_SH_GOTOFF20)
4799 1.3 christos {
4800 1.3 christos r = install_movi20_field (output_bfd, relocation + addend,
4801 1.1 skrll input_bfd, input_section, contents,
4802 1.1 skrll rel->r_offset);
4803 1.1 skrll break;
4804 1.1 skrll }
4805 1.1 skrll else
4806 1.1 skrll goto final_link_relocate;
4807 1.1 skrll
4808 1.1 skrll case R_SH_GOTPC:
4809 1.1 skrll #ifdef INCLUDE_SHMEDIA
4810 1.1 skrll case R_SH_GOTPC_LOW16:
4811 1.3 christos case R_SH_GOTPC_MEDLOW16:
4812 1.3 christos case R_SH_GOTPC_MEDHI16:
4813 1.1 skrll case R_SH_GOTPC_HI16:
4814 1.1 skrll #endif
4815 1.1 skrll /* Use global offset table as symbol value. */
4816 1.1 skrll
4817 1.1 skrll BFD_ASSERT (sgotplt != NULL);
4818 1.1 skrll relocation = sgotplt->output_section->vma + sgotplt->output_offset;
4819 1.1 skrll
4820 1.1 skrll #ifdef GOT_BIAS
4821 1.1 skrll relocation += GOT_BIAS;
4822 1.1 skrll #endif
4823 1.1 skrll
4824 1.1 skrll addend = rel->r_addend;
4825 1.1 skrll
4826 1.1 skrll goto final_link_relocate;
4827 1.1 skrll
4828 1.1 skrll case R_SH_PLT32:
4829 1.1 skrll #ifdef INCLUDE_SHMEDIA
4830 1.1 skrll case R_SH_PLT_LOW16:
4831 1.1 skrll case R_SH_PLT_MEDLOW16:
4832 1.1 skrll case R_SH_PLT_MEDHI16:
4833 1.1 skrll case R_SH_PLT_HI16:
4834 1.1 skrll #endif
4835 1.1 skrll /* Relocation is to the entry for this symbol in the
4836 1.1 skrll procedure linkage table. */
4837 1.3 christos
4838 1.3 christos /* Resolve a PLT reloc against a local symbol directly,
4839 1.3 christos without using the procedure linkage table. */
4840 1.3 christos if (h == NULL)
4841 1.3 christos goto final_link_relocate;
4842 1.3 christos
4843 1.3 christos /* We don't want to warn on calls to undefined weak symbols,
4844 1.1 skrll as calls to them must be protected by non-NULL tests
4845 1.1 skrll anyway, and unprotected calls would invoke undefined
4846 1.1 skrll behavior. */
4847 1.1 skrll if (h->root.type == bfd_link_hash_undefweak)
4848 1.1 skrll check_segment[0] = check_segment[1] = -1;
4849 1.1 skrll
4850 1.1 skrll if (h->forced_local)
4851 1.1 skrll goto final_link_relocate;
4852 1.1 skrll
4853 1.1 skrll if (h->plt.offset == (bfd_vma) -1)
4854 1.1 skrll {
4855 1.1 skrll /* We didn't make a PLT entry for this symbol. This
4856 1.3 christos happens when statically linking PIC code, or when
4857 1.1 skrll using -Bsymbolic. */
4858 1.1 skrll goto final_link_relocate;
4859 1.1 skrll }
4860 1.1 skrll
4861 1.1 skrll BFD_ASSERT (splt != NULL);
4862 1.1 skrll check_segment[1] = plt_segment;
4863 1.1 skrll relocation = (splt->output_section->vma
4864 1.1 skrll + splt->output_offset
4865 1.1 skrll + h->plt.offset);
4866 1.1 skrll
4867 1.1 skrll #ifdef INCLUDE_SHMEDIA
4868 1.1 skrll relocation++;
4869 1.3 christos #endif
4870 1.3 christos
4871 1.3 christos addend = rel->r_addend;
4872 1.3 christos
4873 1.3 christos goto final_link_relocate;
4874 1.3 christos
4875 1.3 christos /* Relocation is to the canonical function descriptor for this
4876 1.3 christos symbol, possibly via the GOT. Initialize the GOT
4877 1.3 christos entry and function descriptor if necessary. */
4878 1.3 christos case R_SH_GOTFUNCDESC:
4879 1.3 christos case R_SH_GOTFUNCDESC20:
4880 1.3 christos case R_SH_FUNCDESC:
4881 1.3 christos {
4882 1.3 christos int dynindx = -1;
4883 1.3 christos asection *reloc_section;
4884 1.3 christos bfd_vma reloc_offset;
4885 1.3 christos int reloc_type = R_SH_FUNCDESC;
4886 1.3 christos
4887 1.3 christos BFD_ASSERT (htab);
4888 1.3 christos
4889 1.3 christos check_segment[0] = check_segment[1] = -1;
4890 1.3 christos
4891 1.3 christos /* FIXME: See what FRV does for global symbols in the
4892 1.3 christos executable, with --export-dynamic. Do they need ld.so
4893 1.3 christos to allocate official descriptors? See what this code
4894 1.3 christos does. */
4895 1.3 christos
4896 1.3 christos relocation = 0;
4897 1.3 christos addend = 0;
4898 1.3 christos
4899 1.3 christos if (r_type == R_SH_FUNCDESC)
4900 1.3 christos {
4901 1.3 christos reloc_section = input_section;
4902 1.3 christos reloc_offset = rel->r_offset;
4903 1.3 christos }
4904 1.3 christos else
4905 1.3 christos {
4906 1.3 christos reloc_section = sgot;
4907 1.3 christos
4908 1.3 christos if (h != NULL)
4909 1.3 christos reloc_offset = h->got.offset;
4910 1.3 christos else
4911 1.3 christos {
4912 1.3 christos BFD_ASSERT (local_got_offsets != NULL);
4913 1.3 christos reloc_offset = local_got_offsets[r_symndx];
4914 1.3 christos }
4915 1.3 christos BFD_ASSERT (reloc_offset != MINUS_ONE);
4916 1.3 christos
4917 1.3 christos if (reloc_offset & 1)
4918 1.3 christos {
4919 1.3 christos reloc_offset &= ~1;
4920 1.3 christos goto funcdesc_done_got;
4921 1.3 christos }
4922 1.3 christos }
4923 1.3 christos
4924 1.3 christos if (h && h->root.type == bfd_link_hash_undefweak
4925 1.3 christos && (SYMBOL_CALLS_LOCAL (info, h)
4926 1.3 christos || !htab->root.dynamic_sections_created))
4927 1.3 christos /* Undefined weak symbol which will not be dynamically
4928 1.3 christos resolved later; leave it at zero. */
4929 1.3 christos goto funcdesc_leave_zero;
4930 1.3 christos else if (SYMBOL_CALLS_LOCAL (info, h)
4931 1.3 christos && ! SYMBOL_FUNCDESC_LOCAL (info, h))
4932 1.3 christos {
4933 1.3 christos /* If the symbol needs a non-local function descriptor
4934 1.3 christos but binds locally (i.e., its visibility is
4935 1.3 christos protected), emit a dynamic relocation decayed to
4936 1.3 christos section+offset. This is an optimization; the dynamic
4937 1.3 christos linker would resolve our function descriptor request
4938 1.3 christos to our copy of the function anyway. */
4939 1.3 christos dynindx = elf_section_data (h->root.u.def.section
4940 1.3 christos ->output_section)->dynindx;
4941 1.3 christos relocation += h->root.u.def.section->output_offset
4942 1.3 christos + h->root.u.def.value;
4943 1.3 christos }
4944 1.3 christos else if (! SYMBOL_FUNCDESC_LOCAL (info, h))
4945 1.3 christos {
4946 1.3 christos /* If the symbol is dynamic and there will be dynamic
4947 1.3 christos symbol resolution because we are or are linked with a
4948 1.3 christos shared library, emit a FUNCDESC relocation such that
4949 1.3 christos the dynamic linker will allocate the function
4950 1.3 christos descriptor. */
4951 1.3 christos BFD_ASSERT (h->dynindx != -1);
4952 1.3 christos dynindx = h->dynindx;
4953 1.3 christos }
4954 1.3 christos else
4955 1.3 christos {
4956 1.3 christos bfd_vma offset;
4957 1.3 christos
4958 1.3 christos /* Otherwise, we know we have a private function
4959 1.3 christos descriptor, so reference it directly. */
4960 1.3 christos reloc_type = R_SH_DIR32;
4961 1.3 christos dynindx = elf_section_data (htab->sfuncdesc
4962 1.3 christos ->output_section)->dynindx;
4963 1.3 christos
4964 1.3 christos if (h)
4965 1.3 christos {
4966 1.3 christos offset = sh_elf_hash_entry (h)->funcdesc.offset;
4967 1.3 christos BFD_ASSERT (offset != MINUS_ONE);
4968 1.3 christos if ((offset & 1) == 0)
4969 1.3 christos {
4970 1.3 christos if (!sh_elf_initialize_funcdesc (output_bfd, info, h,
4971 1.3 christos offset, NULL, 0))
4972 1.3 christos return FALSE;
4973 1.3 christos sh_elf_hash_entry (h)->funcdesc.offset |= 1;
4974 1.3 christos }
4975 1.3 christos }
4976 1.3 christos else
4977 1.3 christos {
4978 1.3 christos union gotref *local_funcdesc;
4979 1.3 christos
4980 1.3 christos local_funcdesc = sh_elf_local_funcdesc (input_bfd);
4981 1.3 christos offset = local_funcdesc[r_symndx].offset;
4982 1.3 christos BFD_ASSERT (offset != MINUS_ONE);
4983 1.3 christos if ((offset & 1) == 0)
4984 1.3 christos {
4985 1.3 christos if (!sh_elf_initialize_funcdesc (output_bfd, info, NULL,
4986 1.3 christos offset, sec,
4987 1.3 christos sym->st_value))
4988 1.3 christos return FALSE;
4989 1.3 christos local_funcdesc[r_symndx].offset |= 1;
4990 1.3 christos }
4991 1.3 christos }
4992 1.3 christos
4993 1.3 christos relocation = htab->sfuncdesc->output_offset + (offset & ~1);
4994 1.3 christos }
4995 1.3 christos
4996 1.3 christos if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
4997 1.3 christos {
4998 1.3 christos bfd_vma offset;
4999 1.3 christos
5000 1.3 christos if (sh_elf_osec_readonly_p (output_bfd,
5001 1.3 christos reloc_section->output_section))
5002 1.3 christos {
5003 1.3 christos (*_bfd_error_handler)
5004 1.3 christos (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"),
5005 1.3 christos input_bfd,
5006 1.3 christos input_section,
5007 1.3 christos (long) rel->r_offset,
5008 1.3 christos symname);
5009 1.3 christos return FALSE;
5010 1.3 christos }
5011 1.3 christos
5012 1.3 christos offset = _bfd_elf_section_offset (output_bfd, info,
5013 1.3 christos reloc_section, reloc_offset);
5014 1.3 christos
5015 1.3 christos if (offset != (bfd_vma)-1)
5016 1.3 christos sh_elf_add_rofixup (output_bfd, htab->srofixup,
5017 1.3 christos offset
5018 1.3 christos + reloc_section->output_section->vma
5019 1.3 christos + reloc_section->output_offset);
5020 1.3 christos }
5021 1.3 christos else if ((reloc_section->output_section->flags
5022 1.3 christos & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
5023 1.3 christos {
5024 1.3 christos bfd_vma offset;
5025 1.3 christos
5026 1.3 christos if (sh_elf_osec_readonly_p (output_bfd,
5027 1.3 christos reloc_section->output_section))
5028 1.3 christos {
5029 1.3 christos info->callbacks->warning
5030 1.3 christos (info,
5031 1.3 christos _("cannot emit dynamic relocations in read-only section"),
5032 1.3 christos symname, input_bfd, reloc_section, reloc_offset);
5033 1.3 christos return FALSE;
5034 1.3 christos }
5035 1.3 christos
5036 1.3 christos if (srelgot == NULL)
5037 1.3 christos {
5038 1.3 christos srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
5039 1.3 christos BFD_ASSERT (srelgot != NULL);
5040 1.3 christos }
5041 1.3 christos
5042 1.3 christos offset = _bfd_elf_section_offset (output_bfd, info,
5043 1.3 christos reloc_section, reloc_offset);
5044 1.3 christos
5045 1.3 christos if (offset != (bfd_vma)-1)
5046 1.3 christos sh_elf_add_dyn_reloc (output_bfd, srelgot,
5047 1.3 christos offset
5048 1.3 christos + reloc_section->output_section->vma
5049 1.3 christos + reloc_section->output_offset,
5050 1.3 christos reloc_type, dynindx, relocation);
5051 1.3 christos
5052 1.3 christos if (r_type == R_SH_FUNCDESC)
5053 1.3 christos {
5054 1.3 christos r = bfd_reloc_ok;
5055 1.3 christos break;
5056 1.3 christos }
5057 1.3 christos else
5058 1.3 christos {
5059 1.3 christos relocation = 0;
5060 1.3 christos goto funcdesc_leave_zero;
5061 1.3 christos }
5062 1.3 christos }
5063 1.3 christos
5064 1.3 christos if (SYMBOL_FUNCDESC_LOCAL (info, h))
5065 1.3 christos relocation += htab->sfuncdesc->output_section->vma;
5066 1.3 christos funcdesc_leave_zero:
5067 1.3 christos if (r_type != R_SH_FUNCDESC)
5068 1.3 christos {
5069 1.3 christos bfd_put_32 (output_bfd, relocation,
5070 1.3 christos reloc_section->contents + reloc_offset);
5071 1.3 christos if (h != NULL)
5072 1.3 christos h->got.offset |= 1;
5073 1.3 christos else
5074 1.3 christos local_got_offsets[r_symndx] |= 1;
5075 1.3 christos
5076 1.3 christos funcdesc_done_got:
5077 1.3 christos
5078 1.3 christos relocation = sh_elf_got_offset (htab) + reloc_offset;
5079 1.3 christos #ifdef GOT_BIAS
5080 1.3 christos relocation -= GOT_BIAS;
5081 1.3 christos #endif
5082 1.3 christos }
5083 1.3 christos if (r_type == R_SH_GOTFUNCDESC20)
5084 1.3 christos {
5085 1.3 christos r = install_movi20_field (output_bfd, relocation + addend,
5086 1.3 christos input_bfd, input_section, contents,
5087 1.3 christos rel->r_offset);
5088 1.3 christos break;
5089 1.3 christos }
5090 1.3 christos else
5091 1.3 christos goto final_link_relocate;
5092 1.3 christos }
5093 1.3 christos break;
5094 1.3 christos
5095 1.3 christos case R_SH_GOTOFFFUNCDESC:
5096 1.3 christos case R_SH_GOTOFFFUNCDESC20:
5097 1.3 christos /* FIXME: See R_SH_FUNCDESC comment about global symbols in the
5098 1.3 christos executable and --export-dynamic. If such symbols get
5099 1.3 christos ld.so-allocated descriptors we can not use R_SH_GOTOFFFUNCDESC
5100 1.3 christos for them. */
5101 1.3 christos BFD_ASSERT (htab);
5102 1.3 christos
5103 1.3 christos check_segment[0] = check_segment[1] = -1;
5104 1.3 christos relocation = 0;
5105 1.3 christos addend = rel->r_addend;
5106 1.3 christos
5107 1.3 christos if (h && (h->root.type == bfd_link_hash_undefweak
5108 1.3 christos || !SYMBOL_FUNCDESC_LOCAL (info, h)))
5109 1.3 christos {
5110 1.3 christos _bfd_error_handler
5111 1.3 christos (_("%B(%A+0x%lx): %s relocation against external symbol \"%s\""),
5112 1.3 christos input_bfd, input_section, (long) rel->r_offset, howto->name,
5113 1.3 christos h->root.root.string);
5114 1.3 christos return FALSE;
5115 1.3 christos }
5116 1.3 christos else
5117 1.3 christos {
5118 1.3 christos bfd_vma offset;
5119 1.3 christos
5120 1.3 christos /* Otherwise, we know we have a private function
5121 1.3 christos descriptor, so reference it directly. */
5122 1.3 christos if (h)
5123 1.3 christos {
5124 1.3 christos offset = sh_elf_hash_entry (h)->funcdesc.offset;
5125 1.3 christos BFD_ASSERT (offset != MINUS_ONE);
5126 1.3 christos if ((offset & 1) == 0)
5127 1.3 christos {
5128 1.3 christos if (!sh_elf_initialize_funcdesc (output_bfd, info, h,
5129 1.3 christos offset, NULL, 0))
5130 1.3 christos return FALSE;
5131 1.3 christos sh_elf_hash_entry (h)->funcdesc.offset |= 1;
5132 1.3 christos }
5133 1.3 christos }
5134 1.3 christos else
5135 1.3 christos {
5136 1.3 christos union gotref *local_funcdesc;
5137 1.3 christos
5138 1.3 christos local_funcdesc = sh_elf_local_funcdesc (input_bfd);
5139 1.3 christos offset = local_funcdesc[r_symndx].offset;
5140 1.3 christos BFD_ASSERT (offset != MINUS_ONE);
5141 1.3 christos if ((offset & 1) == 0)
5142 1.3 christos {
5143 1.3 christos if (!sh_elf_initialize_funcdesc (output_bfd, info, NULL,
5144 1.3 christos offset, sec,
5145 1.3 christos sym->st_value))
5146 1.3 christos return FALSE;
5147 1.3 christos local_funcdesc[r_symndx].offset |= 1;
5148 1.3 christos }
5149 1.3 christos }
5150 1.3 christos
5151 1.3 christos relocation = htab->sfuncdesc->output_offset + (offset & ~1);
5152 1.3 christos }
5153 1.3 christos
5154 1.3 christos relocation -= (htab->root.hgot->root.u.def.value
5155 1.3 christos + sgotplt->output_offset);
5156 1.3 christos #ifdef GOT_BIAS
5157 1.3 christos relocation -= GOT_BIAS;
5158 1.3 christos #endif
5159 1.3 christos
5160 1.3 christos if (r_type == R_SH_GOTOFFFUNCDESC20)
5161 1.3 christos {
5162 1.3 christos r = install_movi20_field (output_bfd, relocation + addend,
5163 1.3 christos input_bfd, input_section, contents,
5164 1.1 skrll rel->r_offset);
5165 1.1 skrll break;
5166 1.1 skrll }
5167 1.1 skrll else
5168 1.1 skrll goto final_link_relocate;
5169 1.1 skrll
5170 1.1 skrll case R_SH_LOOP_START:
5171 1.1 skrll {
5172 1.1 skrll static bfd_vma start, end;
5173 1.1 skrll
5174 1.1 skrll start = (relocation + rel->r_addend
5175 1.1 skrll - (sec->output_section->vma + sec->output_offset));
5176 1.1 skrll r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
5177 1.1 skrll rel->r_offset, sec, start, end);
5178 1.1 skrll break;
5179 1.1 skrll
5180 1.1 skrll case R_SH_LOOP_END:
5181 1.1 skrll end = (relocation + rel->r_addend
5182 1.1 skrll - (sec->output_section->vma + sec->output_offset));
5183 1.1 skrll r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
5184 1.3 christos rel->r_offset, sec, start, end);
5185 1.3 christos break;
5186 1.1 skrll }
5187 1.3 christos
5188 1.1 skrll case R_SH_TLS_GD_32:
5189 1.3 christos case R_SH_TLS_IE_32:
5190 1.1 skrll BFD_ASSERT (htab);
5191 1.1 skrll check_segment[0] = check_segment[1] = -1;
5192 1.3 christos r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
5193 1.1 skrll got_type = GOT_UNKNOWN;
5194 1.1 skrll if (h == NULL && local_got_offsets)
5195 1.1 skrll got_type = sh_elf_local_got_type (input_bfd) [r_symndx];
5196 1.1 skrll else if (h != NULL)
5197 1.1 skrll {
5198 1.1 skrll got_type = sh_elf_hash_entry (h)->got_type;
5199 1.3 christos if (! info->shared
5200 1.1 skrll && (h->dynindx == -1
5201 1.1 skrll || h->def_regular))
5202 1.1 skrll r_type = R_SH_TLS_LE_32;
5203 1.1 skrll }
5204 1.1 skrll
5205 1.1 skrll if (r_type == R_SH_TLS_GD_32 && got_type == GOT_TLS_IE)
5206 1.1 skrll r_type = R_SH_TLS_IE_32;
5207 1.1 skrll
5208 1.1 skrll if (r_type == R_SH_TLS_LE_32)
5209 1.1 skrll {
5210 1.1 skrll bfd_vma offset;
5211 1.1 skrll unsigned short insn;
5212 1.1 skrll
5213 1.1 skrll if (ELF32_R_TYPE (rel->r_info) == R_SH_TLS_GD_32)
5214 1.1 skrll {
5215 1.1 skrll /* GD->LE transition:
5216 1.1 skrll mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5217 1.1 skrll jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5218 1.1 skrll 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5219 1.1 skrll We change it into:
5220 1.1 skrll mov.l 1f,r4; stc gbr,r0; add r4,r0; nop;
5221 1.1 skrll nop; nop; ...
5222 1.1 skrll 1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:. */
5223 1.1 skrll
5224 1.1 skrll offset = rel->r_offset;
5225 1.1 skrll BFD_ASSERT (offset >= 16);
5226 1.1 skrll /* Size of GD instructions is 16 or 18. */
5227 1.1 skrll offset -= 16;
5228 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5229 1.1 skrll if ((insn & 0xff00) == 0xc700)
5230 1.1 skrll {
5231 1.1 skrll BFD_ASSERT (offset >= 2);
5232 1.1 skrll offset -= 2;
5233 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5234 1.1 skrll }
5235 1.1 skrll
5236 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xd400);
5237 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 2);
5238 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xc700);
5239 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 4);
5240 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xd100);
5241 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 6);
5242 1.1 skrll BFD_ASSERT (insn == 0x310c);
5243 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 8);
5244 1.1 skrll BFD_ASSERT (insn == 0x410b);
5245 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 10);
5246 1.1 skrll BFD_ASSERT (insn == 0x34cc);
5247 1.1 skrll
5248 1.1 skrll bfd_put_16 (output_bfd, 0x0012, contents + offset + 2);
5249 1.1 skrll bfd_put_16 (output_bfd, 0x304c, contents + offset + 4);
5250 1.3 christos bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
5251 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
5252 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
5253 1.1 skrll }
5254 1.1 skrll else
5255 1.1 skrll {
5256 1.1 skrll int target;
5257 1.1 skrll
5258 1.1 skrll /* IE->LE transition:
5259 1.1 skrll mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM;
5260 1.1 skrll bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2:
5261 1.1 skrll We change it into:
5262 1.1 skrll mov.l .Ln,rM; stc gbr,rN; nop; ...;
5263 1.1 skrll 1: x@TPOFF; 2:. */
5264 1.1 skrll
5265 1.1 skrll offset = rel->r_offset;
5266 1.1 skrll BFD_ASSERT (offset >= 16);
5267 1.1 skrll /* Size of IE instructions is 10 or 12. */
5268 1.1 skrll offset -= 10;
5269 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5270 1.1 skrll if ((insn & 0xf0ff) == 0x0012)
5271 1.1 skrll {
5272 1.3 christos BFD_ASSERT (offset >= 2);
5273 1.1 skrll offset -= 2;
5274 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5275 1.1 skrll }
5276 1.1 skrll
5277 1.3 christos BFD_ASSERT ((insn & 0xff00) == 0xd000);
5278 1.1 skrll target = insn & 0x00ff;
5279 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 2);
5280 1.1 skrll BFD_ASSERT ((insn & 0xf0ff) == 0x0012);
5281 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 4);
5282 1.1 skrll BFD_ASSERT ((insn & 0xf0ff) == 0x00ce);
5283 1.1 skrll insn = 0xd000 | (insn & 0x0f00) | target;
5284 1.1 skrll bfd_put_16 (output_bfd, insn, contents + offset + 0);
5285 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
5286 1.1 skrll }
5287 1.3 christos
5288 1.1 skrll bfd_put_32 (output_bfd, tpoff (info, relocation),
5289 1.1 skrll contents + rel->r_offset);
5290 1.1 skrll continue;
5291 1.1 skrll }
5292 1.1 skrll
5293 1.1 skrll if (sgot == NULL || sgotplt == NULL)
5294 1.1 skrll abort ();
5295 1.1 skrll
5296 1.1 skrll if (h != NULL)
5297 1.1 skrll off = h->got.offset;
5298 1.1 skrll else
5299 1.1 skrll {
5300 1.1 skrll if (local_got_offsets == NULL)
5301 1.1 skrll abort ();
5302 1.1 skrll
5303 1.1 skrll off = local_got_offsets[r_symndx];
5304 1.1 skrll }
5305 1.1 skrll
5306 1.1 skrll /* Relocate R_SH_TLS_IE_32 directly when statically linking. */
5307 1.3 christos if (r_type == R_SH_TLS_IE_32
5308 1.1 skrll && ! htab->root.dynamic_sections_created)
5309 1.1 skrll {
5310 1.1 skrll off &= ~1;
5311 1.1 skrll bfd_put_32 (output_bfd, tpoff (info, relocation),
5312 1.1 skrll sgot->contents + off);
5313 1.1 skrll bfd_put_32 (output_bfd, sh_elf_got_offset (htab) + off,
5314 1.1 skrll contents + rel->r_offset);
5315 1.1 skrll continue;
5316 1.1 skrll }
5317 1.1 skrll
5318 1.1 skrll if ((off & 1) != 0)
5319 1.1 skrll off &= ~1;
5320 1.1 skrll else
5321 1.1 skrll {
5322 1.1 skrll Elf_Internal_Rela outrel;
5323 1.1 skrll bfd_byte *loc;
5324 1.1 skrll int dr_type, indx;
5325 1.1 skrll
5326 1.1 skrll if (srelgot == NULL)
5327 1.1 skrll {
5328 1.1 skrll srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
5329 1.1 skrll BFD_ASSERT (srelgot != NULL);
5330 1.1 skrll }
5331 1.1 skrll
5332 1.1 skrll outrel.r_offset = (sgot->output_section->vma
5333 1.1 skrll + sgot->output_offset + off);
5334 1.1 skrll
5335 1.1 skrll if (h == NULL || h->dynindx == -1)
5336 1.1 skrll indx = 0;
5337 1.1 skrll else
5338 1.1 skrll indx = h->dynindx;
5339 1.1 skrll
5340 1.1 skrll dr_type = (r_type == R_SH_TLS_GD_32 ? R_SH_TLS_DTPMOD32 :
5341 1.1 skrll R_SH_TLS_TPOFF32);
5342 1.1 skrll if (dr_type == R_SH_TLS_TPOFF32 && indx == 0)
5343 1.1 skrll outrel.r_addend = relocation - dtpoff_base (info);
5344 1.1 skrll else
5345 1.1 skrll outrel.r_addend = 0;
5346 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, dr_type);
5347 1.1 skrll loc = srelgot->contents;
5348 1.1 skrll loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
5349 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5350 1.1 skrll
5351 1.1 skrll if (r_type == R_SH_TLS_GD_32)
5352 1.1 skrll {
5353 1.1 skrll if (indx == 0)
5354 1.1 skrll {
5355 1.1 skrll bfd_put_32 (output_bfd,
5356 1.1 skrll relocation - dtpoff_base (info),
5357 1.1 skrll sgot->contents + off + 4);
5358 1.1 skrll }
5359 1.1 skrll else
5360 1.1 skrll {
5361 1.1 skrll outrel.r_info = ELF32_R_INFO (indx,
5362 1.1 skrll R_SH_TLS_DTPOFF32);
5363 1.1 skrll outrel.r_offset += 4;
5364 1.1 skrll outrel.r_addend = 0;
5365 1.1 skrll srelgot->reloc_count++;
5366 1.1 skrll loc += sizeof (Elf32_External_Rela);
5367 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5368 1.1 skrll }
5369 1.1 skrll }
5370 1.1 skrll
5371 1.1 skrll if (h != NULL)
5372 1.1 skrll h->got.offset |= 1;
5373 1.1 skrll else
5374 1.1 skrll local_got_offsets[r_symndx] |= 1;
5375 1.3 christos }
5376 1.1 skrll
5377 1.1 skrll if (off >= (bfd_vma) -2)
5378 1.1 skrll abort ();
5379 1.1 skrll
5380 1.1 skrll if (r_type == (int) ELF32_R_TYPE (rel->r_info))
5381 1.1 skrll relocation = sh_elf_got_offset (htab) + off;
5382 1.1 skrll else
5383 1.1 skrll {
5384 1.1 skrll bfd_vma offset;
5385 1.1 skrll unsigned short insn;
5386 1.1 skrll
5387 1.1 skrll /* GD->IE transition:
5388 1.1 skrll mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5389 1.1 skrll jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5390 1.1 skrll 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5391 1.1 skrll We change it into:
5392 1.1 skrll mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0;
5393 1.1 skrll nop; nop; bra 3f; nop; .align 2;
5394 1.1 skrll 1: .long x@TPOFF; 2:...; 3:. */
5395 1.1 skrll
5396 1.1 skrll offset = rel->r_offset;
5397 1.1 skrll BFD_ASSERT (offset >= 16);
5398 1.1 skrll /* Size of GD instructions is 16 or 18. */
5399 1.1 skrll offset -= 16;
5400 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5401 1.1 skrll if ((insn & 0xff00) == 0xc700)
5402 1.1 skrll {
5403 1.1 skrll BFD_ASSERT (offset >= 2);
5404 1.1 skrll offset -= 2;
5405 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5406 1.1 skrll }
5407 1.1 skrll
5408 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xd400);
5409 1.1 skrll
5410 1.1 skrll /* Replace mov.l 1f,R4 with mov.l 1f,r0. */
5411 1.1 skrll bfd_put_16 (output_bfd, insn & 0xf0ff, contents + offset);
5412 1.1 skrll
5413 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 2);
5414 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xc700);
5415 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 4);
5416 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xd100);
5417 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 6);
5418 1.1 skrll BFD_ASSERT (insn == 0x310c);
5419 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 8);
5420 1.1 skrll BFD_ASSERT (insn == 0x410b);
5421 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 10);
5422 1.1 skrll BFD_ASSERT (insn == 0x34cc);
5423 1.1 skrll
5424 1.3 christos bfd_put_16 (output_bfd, 0x0412, contents + offset + 2);
5425 1.1 skrll bfd_put_16 (output_bfd, 0x00ce, contents + offset + 4);
5426 1.1 skrll bfd_put_16 (output_bfd, 0x304c, contents + offset + 6);
5427 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
5428 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
5429 1.1 skrll
5430 1.1 skrll bfd_put_32 (output_bfd, sh_elf_got_offset (htab) + off,
5431 1.1 skrll contents + rel->r_offset);
5432 1.1 skrll
5433 1.1 skrll continue;
5434 1.1 skrll }
5435 1.3 christos
5436 1.3 christos addend = rel->r_addend;
5437 1.1 skrll
5438 1.1 skrll goto final_link_relocate;
5439 1.1 skrll
5440 1.1 skrll case R_SH_TLS_LD_32:
5441 1.1 skrll BFD_ASSERT (htab);
5442 1.1 skrll check_segment[0] = check_segment[1] = -1;
5443 1.1 skrll if (! info->shared)
5444 1.1 skrll {
5445 1.1 skrll bfd_vma offset;
5446 1.1 skrll unsigned short insn;
5447 1.1 skrll
5448 1.1 skrll /* LD->LE transition:
5449 1.1 skrll mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5450 1.1 skrll jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5451 1.1 skrll 1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3:
5452 1.1 skrll We change it into:
5453 1.1 skrll stc gbr,r0; nop; nop; nop;
5454 1.1 skrll nop; nop; bra 3f; ...; 3:. */
5455 1.1 skrll
5456 1.1 skrll offset = rel->r_offset;
5457 1.1 skrll BFD_ASSERT (offset >= 16);
5458 1.1 skrll /* Size of LD instructions is 16 or 18. */
5459 1.1 skrll offset -= 16;
5460 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5461 1.1 skrll if ((insn & 0xff00) == 0xc700)
5462 1.1 skrll {
5463 1.1 skrll BFD_ASSERT (offset >= 2);
5464 1.1 skrll offset -= 2;
5465 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 0);
5466 1.1 skrll }
5467 1.1 skrll
5468 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xd400);
5469 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 2);
5470 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xc700);
5471 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 4);
5472 1.1 skrll BFD_ASSERT ((insn & 0xff00) == 0xd100);
5473 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 6);
5474 1.1 skrll BFD_ASSERT (insn == 0x310c);
5475 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 8);
5476 1.1 skrll BFD_ASSERT (insn == 0x410b);
5477 1.1 skrll insn = bfd_get_16 (input_bfd, contents + offset + 10);
5478 1.1 skrll BFD_ASSERT (insn == 0x34cc);
5479 1.1 skrll
5480 1.1 skrll bfd_put_16 (output_bfd, 0x0012, contents + offset + 0);
5481 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 2);
5482 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
5483 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
5484 1.3 christos bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
5485 1.1 skrll bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
5486 1.1 skrll
5487 1.1 skrll continue;
5488 1.1 skrll }
5489 1.1 skrll
5490 1.1 skrll if (sgot == NULL || sgotplt == NULL)
5491 1.1 skrll abort ();
5492 1.1 skrll
5493 1.1 skrll off = htab->tls_ldm_got.offset;
5494 1.1 skrll if (off & 1)
5495 1.1 skrll off &= ~1;
5496 1.1 skrll else
5497 1.1 skrll {
5498 1.1 skrll Elf_Internal_Rela outrel;
5499 1.1 skrll bfd_byte *loc;
5500 1.1 skrll
5501 1.1 skrll srelgot = htab->srelgot;
5502 1.1 skrll if (srelgot == NULL)
5503 1.1 skrll abort ();
5504 1.1 skrll
5505 1.1 skrll outrel.r_offset = (sgot->output_section->vma
5506 1.1 skrll + sgot->output_offset + off);
5507 1.1 skrll outrel.r_addend = 0;
5508 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_SH_TLS_DTPMOD32);
5509 1.3 christos loc = srelgot->contents;
5510 1.1 skrll loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
5511 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5512 1.1 skrll htab->tls_ldm_got.offset |= 1;
5513 1.1 skrll }
5514 1.1 skrll
5515 1.3 christos relocation = sh_elf_got_offset (htab) + off;
5516 1.1 skrll addend = rel->r_addend;
5517 1.1 skrll
5518 1.1 skrll goto final_link_relocate;
5519 1.1 skrll
5520 1.1 skrll case R_SH_TLS_LDO_32:
5521 1.1 skrll check_segment[0] = check_segment[1] = -1;
5522 1.1 skrll if (! info->shared)
5523 1.1 skrll relocation = tpoff (info, relocation);
5524 1.1 skrll else
5525 1.1 skrll relocation -= dtpoff_base (info);
5526 1.1 skrll
5527 1.1 skrll addend = rel->r_addend;
5528 1.1 skrll goto final_link_relocate;
5529 1.1 skrll
5530 1.3 christos case R_SH_TLS_LE_32:
5531 1.3 christos {
5532 1.1 skrll int indx;
5533 1.1 skrll Elf_Internal_Rela outrel;
5534 1.1 skrll bfd_byte *loc;
5535 1.1 skrll
5536 1.1 skrll check_segment[0] = check_segment[1] = -1;
5537 1.1 skrll
5538 1.1 skrll if (! info->shared)
5539 1.1 skrll {
5540 1.1 skrll relocation = tpoff (info, relocation);
5541 1.3 christos addend = rel->r_addend;
5542 1.3 christos goto final_link_relocate;
5543 1.3 christos }
5544 1.1 skrll
5545 1.1 skrll if (sreloc == NULL)
5546 1.1 skrll {
5547 1.1 skrll sreloc = _bfd_elf_get_dynamic_reloc_section
5548 1.1 skrll (input_bfd, input_section, /*rela?*/ TRUE);
5549 1.1 skrll if (sreloc == NULL)
5550 1.1 skrll return FALSE;
5551 1.1 skrll }
5552 1.1 skrll
5553 1.1 skrll if (h == NULL || h->dynindx == -1)
5554 1.1 skrll indx = 0;
5555 1.1 skrll else
5556 1.1 skrll indx = h->dynindx;
5557 1.1 skrll
5558 1.1 skrll outrel.r_offset = (input_section->output_section->vma
5559 1.1 skrll + input_section->output_offset
5560 1.1 skrll + rel->r_offset);
5561 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, R_SH_TLS_TPOFF32);
5562 1.1 skrll if (indx == 0)
5563 1.1 skrll outrel.r_addend = relocation - dtpoff_base (info);
5564 1.1 skrll else
5565 1.1 skrll outrel.r_addend = 0;
5566 1.1 skrll
5567 1.1 skrll loc = sreloc->contents;
5568 1.1 skrll loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5569 1.3 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5570 1.3 christos continue;
5571 1.3 christos }
5572 1.3 christos }
5573 1.3 christos
5574 1.3 christos relocation_done:
5575 1.3 christos if (fdpic_p && check_segment[0] != (unsigned) -1
5576 1.3 christos && check_segment[0] != check_segment[1])
5577 1.3 christos {
5578 1.3 christos /* We don't want duplicate errors for undefined symbols. */
5579 1.3 christos if (!h || h->root.type != bfd_link_hash_undefined)
5580 1.3 christos {
5581 1.3 christos if (info->shared)
5582 1.3 christos {
5583 1.3 christos info->callbacks->einfo
5584 1.3 christos (_("%X%C: relocation to \"%s\" references a different segment\n"),
5585 1.3 christos input_bfd, input_section, rel->r_offset, symname);
5586 1.3 christos return FALSE;
5587 1.3 christos }
5588 1.3 christos else
5589 1.3 christos info->callbacks->einfo
5590 1.3 christos (_("%C: warning: relocation to \"%s\" references a different segment\n"),
5591 1.1 skrll input_bfd, input_section, rel->r_offset, symname);
5592 1.1 skrll }
5593 1.1 skrll
5594 1.1 skrll elf_elfheader (output_bfd)->e_flags &= ~EF_SH_PIC;
5595 1.1 skrll }
5596 1.1 skrll
5597 1.1 skrll if (r != bfd_reloc_ok)
5598 1.1 skrll {
5599 1.1 skrll switch (r)
5600 1.1 skrll {
5601 1.1 skrll default:
5602 1.1 skrll case bfd_reloc_outofrange:
5603 1.1 skrll abort ();
5604 1.1 skrll case bfd_reloc_overflow:
5605 1.1 skrll {
5606 1.1 skrll const char *name;
5607 1.1 skrll
5608 1.1 skrll if (h != NULL)
5609 1.1 skrll name = NULL;
5610 1.1 skrll else
5611 1.1 skrll {
5612 1.1 skrll name = (bfd_elf_string_from_elf_section
5613 1.1 skrll (input_bfd, symtab_hdr->sh_link, sym->st_name));
5614 1.1 skrll if (name == NULL)
5615 1.1 skrll return FALSE;
5616 1.1 skrll if (*name == '\0')
5617 1.1 skrll name = bfd_section_name (input_bfd, sec);
5618 1.1 skrll }
5619 1.1 skrll if (! ((*info->callbacks->reloc_overflow)
5620 1.1 skrll (info, (h ? &h->root : NULL), name, howto->name,
5621 1.1 skrll (bfd_vma) 0, input_bfd, input_section,
5622 1.1 skrll rel->r_offset)))
5623 1.1 skrll return FALSE;
5624 1.1 skrll }
5625 1.1 skrll break;
5626 1.1 skrll }
5627 1.1 skrll }
5628 1.1 skrll }
5629 1.1 skrll
5630 1.1 skrll return TRUE;
5631 1.1 skrll }
5632 1.1 skrll
5633 1.1 skrll /* This is a version of bfd_generic_get_relocated_section_contents
5634 1.1 skrll which uses sh_elf_relocate_section. */
5635 1.1 skrll
5636 1.1 skrll static bfd_byte *
5637 1.1 skrll sh_elf_get_relocated_section_contents (bfd *output_bfd,
5638 1.1 skrll struct bfd_link_info *link_info,
5639 1.1 skrll struct bfd_link_order *link_order,
5640 1.1 skrll bfd_byte *data,
5641 1.1 skrll bfd_boolean relocatable,
5642 1.1 skrll asymbol **symbols)
5643 1.1 skrll {
5644 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
5645 1.1 skrll asection *input_section = link_order->u.indirect.section;
5646 1.1 skrll bfd *input_bfd = input_section->owner;
5647 1.1 skrll asection **sections = NULL;
5648 1.1 skrll Elf_Internal_Rela *internal_relocs = NULL;
5649 1.1 skrll Elf_Internal_Sym *isymbuf = NULL;
5650 1.1 skrll
5651 1.1 skrll /* We only need to handle the case of relaxing, or of having a
5652 1.1 skrll particular set of section contents, specially. */
5653 1.1 skrll if (relocatable
5654 1.1 skrll || elf_section_data (input_section)->this_hdr.contents == NULL)
5655 1.1 skrll return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
5656 1.1 skrll link_order, data,
5657 1.1 skrll relocatable,
5658 1.1 skrll symbols);
5659 1.1 skrll
5660 1.1 skrll symtab_hdr = &elf_symtab_hdr (input_bfd);
5661 1.1 skrll
5662 1.1 skrll memcpy (data, elf_section_data (input_section)->this_hdr.contents,
5663 1.1 skrll (size_t) input_section->size);
5664 1.1 skrll
5665 1.1 skrll if ((input_section->flags & SEC_RELOC) != 0
5666 1.1 skrll && input_section->reloc_count > 0)
5667 1.1 skrll {
5668 1.1 skrll asection **secpp;
5669 1.1 skrll Elf_Internal_Sym *isym, *isymend;
5670 1.1 skrll bfd_size_type amt;
5671 1.1 skrll
5672 1.1 skrll internal_relocs = (_bfd_elf_link_read_relocs
5673 1.1 skrll (input_bfd, input_section, NULL,
5674 1.1 skrll (Elf_Internal_Rela *) NULL, FALSE));
5675 1.1 skrll if (internal_relocs == NULL)
5676 1.1 skrll goto error_return;
5677 1.1 skrll
5678 1.1 skrll if (symtab_hdr->sh_info != 0)
5679 1.1 skrll {
5680 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5681 1.1 skrll if (isymbuf == NULL)
5682 1.1 skrll isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
5683 1.1 skrll symtab_hdr->sh_info, 0,
5684 1.1 skrll NULL, NULL, NULL);
5685 1.1 skrll if (isymbuf == NULL)
5686 1.1 skrll goto error_return;
5687 1.1 skrll }
5688 1.1 skrll
5689 1.1 skrll amt = symtab_hdr->sh_info;
5690 1.1 skrll amt *= sizeof (asection *);
5691 1.1 skrll sections = (asection **) bfd_malloc (amt);
5692 1.1 skrll if (sections == NULL && amt != 0)
5693 1.1 skrll goto error_return;
5694 1.1 skrll
5695 1.1 skrll isymend = isymbuf + symtab_hdr->sh_info;
5696 1.1 skrll for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
5697 1.1 skrll {
5698 1.1 skrll asection *isec;
5699 1.1 skrll
5700 1.1 skrll if (isym->st_shndx == SHN_UNDEF)
5701 1.1 skrll isec = bfd_und_section_ptr;
5702 1.1 skrll else if (isym->st_shndx == SHN_ABS)
5703 1.1 skrll isec = bfd_abs_section_ptr;
5704 1.1 skrll else if (isym->st_shndx == SHN_COMMON)
5705 1.1 skrll isec = bfd_com_section_ptr;
5706 1.1 skrll else
5707 1.1 skrll isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
5708 1.1 skrll
5709 1.1 skrll *secpp = isec;
5710 1.1 skrll }
5711 1.1 skrll
5712 1.1 skrll if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
5713 1.1 skrll input_section, data, internal_relocs,
5714 1.1 skrll isymbuf, sections))
5715 1.1 skrll goto error_return;
5716 1.1 skrll
5717 1.1 skrll if (sections != NULL)
5718 1.1 skrll free (sections);
5719 1.1 skrll if (isymbuf != NULL
5720 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
5721 1.1 skrll free (isymbuf);
5722 1.1 skrll if (elf_section_data (input_section)->relocs != internal_relocs)
5723 1.1 skrll free (internal_relocs);
5724 1.1 skrll }
5725 1.1 skrll
5726 1.1 skrll return data;
5727 1.1 skrll
5728 1.1 skrll error_return:
5729 1.1 skrll if (sections != NULL)
5730 1.1 skrll free (sections);
5731 1.1 skrll if (isymbuf != NULL
5732 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
5733 1.1 skrll free (isymbuf);
5734 1.1 skrll if (internal_relocs != NULL
5735 1.1 skrll && elf_section_data (input_section)->relocs != internal_relocs)
5736 1.1 skrll free (internal_relocs);
5737 1.1 skrll return NULL;
5738 1.1 skrll }
5739 1.1 skrll
5740 1.1 skrll /* Return the base VMA address which should be subtracted from real addresses
5741 1.1 skrll when resolving @dtpoff relocation.
5742 1.1 skrll This is PT_TLS segment p_vaddr. */
5743 1.1 skrll
5744 1.1 skrll static bfd_vma
5745 1.1 skrll dtpoff_base (struct bfd_link_info *info)
5746 1.1 skrll {
5747 1.1 skrll /* If tls_sec is NULL, we should have signalled an error already. */
5748 1.1 skrll if (elf_hash_table (info)->tls_sec == NULL)
5749 1.1 skrll return 0;
5750 1.1 skrll return elf_hash_table (info)->tls_sec->vma;
5751 1.1 skrll }
5752 1.1 skrll
5753 1.1 skrll /* Return the relocation value for R_SH_TLS_TPOFF32.. */
5754 1.1 skrll
5755 1.1 skrll static bfd_vma
5756 1.1 skrll tpoff (struct bfd_link_info *info, bfd_vma address)
5757 1.1 skrll {
5758 1.1 skrll /* If tls_sec is NULL, we should have signalled an error already. */
5759 1.1 skrll if (elf_hash_table (info)->tls_sec == NULL)
5760 1.1 skrll return 0;
5761 1.1 skrll /* SH TLS ABI is variant I and static TLS block start just after tcbhead
5762 1.1 skrll structure which has 2 pointer fields. */
5763 1.1 skrll return (address - elf_hash_table (info)->tls_sec->vma
5764 1.1 skrll + align_power ((bfd_vma) 8,
5765 1.1 skrll elf_hash_table (info)->tls_sec->alignment_power));
5766 1.1 skrll }
5767 1.1 skrll
5768 1.1 skrll static asection *
5769 1.1 skrll sh_elf_gc_mark_hook (asection *sec,
5770 1.1 skrll struct bfd_link_info *info,
5771 1.1 skrll Elf_Internal_Rela *rel,
5772 1.1 skrll struct elf_link_hash_entry *h,
5773 1.1 skrll Elf_Internal_Sym *sym)
5774 1.1 skrll {
5775 1.1 skrll if (h != NULL)
5776 1.1 skrll switch (ELF32_R_TYPE (rel->r_info))
5777 1.1 skrll {
5778 1.1 skrll case R_SH_GNU_VTINHERIT:
5779 1.1 skrll case R_SH_GNU_VTENTRY:
5780 1.1 skrll return NULL;
5781 1.1 skrll }
5782 1.1 skrll
5783 1.1 skrll return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5784 1.1 skrll }
5785 1.1 skrll
5786 1.1 skrll /* Update the got entry reference counts for the section being removed. */
5787 1.1 skrll
5788 1.1 skrll static bfd_boolean
5789 1.3 christos sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
5790 1.1 skrll asection *sec, const Elf_Internal_Rela *relocs)
5791 1.1 skrll {
5792 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
5793 1.1 skrll struct elf_link_hash_entry **sym_hashes;
5794 1.1 skrll bfd_signed_vma *local_got_refcounts;
5795 1.1 skrll union gotref *local_funcdesc;
5796 1.1 skrll const Elf_Internal_Rela *rel, *relend;
5797 1.1 skrll
5798 1.1 skrll if (info->relocatable)
5799 1.1 skrll return TRUE;
5800 1.3 christos
5801 1.1 skrll elf_section_data (sec)->local_dynrel = NULL;
5802 1.1 skrll
5803 1.1 skrll symtab_hdr = &elf_symtab_hdr (abfd);
5804 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
5805 1.1 skrll local_got_refcounts = elf_local_got_refcounts (abfd);
5806 1.1 skrll local_funcdesc = sh_elf_local_funcdesc (abfd);
5807 1.1 skrll
5808 1.1 skrll relend = relocs + sec->reloc_count;
5809 1.1 skrll for (rel = relocs; rel < relend; rel++)
5810 1.1 skrll {
5811 1.1 skrll unsigned long r_symndx;
5812 1.1 skrll unsigned int r_type;
5813 1.1 skrll struct elf_link_hash_entry *h = NULL;
5814 1.1 skrll #ifdef INCLUDE_SHMEDIA
5815 1.1 skrll int seen_stt_datalabel = 0;
5816 1.1 skrll #endif
5817 1.1 skrll
5818 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
5819 1.1 skrll if (r_symndx >= symtab_hdr->sh_info)
5820 1.1 skrll {
5821 1.1 skrll struct elf_sh_link_hash_entry *eh;
5822 1.1 skrll struct elf_sh_dyn_relocs **pp;
5823 1.1 skrll struct elf_sh_dyn_relocs *p;
5824 1.1 skrll
5825 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5826 1.1 skrll while (h->root.type == bfd_link_hash_indirect
5827 1.1 skrll || h->root.type == bfd_link_hash_warning)
5828 1.1 skrll {
5829 1.1 skrll #ifdef INCLUDE_SHMEDIA
5830 1.1 skrll seen_stt_datalabel |= h->type == STT_DATALABEL;
5831 1.1 skrll #endif
5832 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
5833 1.1 skrll }
5834 1.1 skrll eh = (struct elf_sh_link_hash_entry *) h;
5835 1.1 skrll for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5836 1.1 skrll if (p->sec == sec)
5837 1.1 skrll {
5838 1.1 skrll /* Everything must go for SEC. */
5839 1.1 skrll *pp = p->next;
5840 1.1 skrll break;
5841 1.1 skrll }
5842 1.1 skrll }
5843 1.1 skrll
5844 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
5845 1.1 skrll switch (sh_elf_optimized_tls_reloc (info, r_type, h != NULL))
5846 1.1 skrll {
5847 1.3 christos case R_SH_TLS_LD_32:
5848 1.1 skrll if (sh_elf_hash_table (info)->tls_ldm_got.refcount > 0)
5849 1.3 christos sh_elf_hash_table (info)->tls_ldm_got.refcount -= 1;
5850 1.1 skrll break;
5851 1.1 skrll
5852 1.1 skrll case R_SH_GOT32:
5853 1.1 skrll case R_SH_GOT20:
5854 1.1 skrll case R_SH_GOTOFF:
5855 1.1 skrll case R_SH_GOTOFF20:
5856 1.1 skrll case R_SH_GOTPC:
5857 1.1 skrll #ifdef INCLUDE_SHMEDIA
5858 1.1 skrll case R_SH_GOT_LOW16:
5859 1.1 skrll case R_SH_GOT_MEDLOW16:
5860 1.1 skrll case R_SH_GOT_MEDHI16:
5861 1.1 skrll case R_SH_GOT_HI16:
5862 1.1 skrll case R_SH_GOT10BY4:
5863 1.1 skrll case R_SH_GOT10BY8:
5864 1.1 skrll case R_SH_GOTOFF_LOW16:
5865 1.1 skrll case R_SH_GOTOFF_MEDLOW16:
5866 1.1 skrll case R_SH_GOTOFF_MEDHI16:
5867 1.1 skrll case R_SH_GOTOFF_HI16:
5868 1.1 skrll case R_SH_GOTPC_LOW16:
5869 1.3 christos case R_SH_GOTPC_MEDLOW16:
5870 1.3 christos case R_SH_GOTPC_MEDHI16:
5871 1.1 skrll case R_SH_GOTPC_HI16:
5872 1.1 skrll #endif
5873 1.1 skrll case R_SH_TLS_GD_32:
5874 1.1 skrll case R_SH_TLS_IE_32:
5875 1.1 skrll case R_SH_GOTFUNCDESC:
5876 1.1 skrll case R_SH_GOTFUNCDESC20:
5877 1.1 skrll if (h != NULL)
5878 1.1 skrll {
5879 1.1 skrll #ifdef INCLUDE_SHMEDIA
5880 1.1 skrll if (seen_stt_datalabel)
5881 1.1 skrll {
5882 1.1 skrll struct elf_sh_link_hash_entry *eh;
5883 1.1 skrll eh = (struct elf_sh_link_hash_entry *) h;
5884 1.1 skrll if (eh->datalabel_got.refcount > 0)
5885 1.1 skrll eh->datalabel_got.refcount -= 1;
5886 1.1 skrll }
5887 1.1 skrll else
5888 1.1 skrll #endif
5889 1.1 skrll if (h->got.refcount > 0)
5890 1.1 skrll h->got.refcount -= 1;
5891 1.1 skrll }
5892 1.1 skrll else if (local_got_refcounts != NULL)
5893 1.1 skrll {
5894 1.1 skrll #ifdef INCLUDE_SHMEDIA
5895 1.1 skrll if (rel->r_addend & 1)
5896 1.1 skrll {
5897 1.1 skrll if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
5898 1.1 skrll local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
5899 1.1 skrll }
5900 1.1 skrll else
5901 1.3 christos #endif
5902 1.3 christos if (local_got_refcounts[r_symndx] > 0)
5903 1.3 christos local_got_refcounts[r_symndx] -= 1;
5904 1.3 christos }
5905 1.3 christos break;
5906 1.3 christos
5907 1.3 christos case R_SH_FUNCDESC:
5908 1.3 christos if (h != NULL)
5909 1.3 christos sh_elf_hash_entry (h)->abs_funcdesc_refcount -= 1;
5910 1.3 christos else if (sh_elf_hash_table (info)->fdpic_p && !info->shared)
5911 1.3 christos sh_elf_hash_table (info)->srofixup->size -= 4;
5912 1.3 christos
5913 1.3 christos /* Fall through. */
5914 1.3 christos
5915 1.3 christos case R_SH_GOTOFFFUNCDESC:
5916 1.3 christos case R_SH_GOTOFFFUNCDESC20:
5917 1.1 skrll if (h != NULL)
5918 1.3 christos sh_elf_hash_entry (h)->funcdesc.refcount -= 1;
5919 1.3 christos else
5920 1.3 christos local_funcdesc[r_symndx].refcount -= 1;
5921 1.3 christos break;
5922 1.3 christos
5923 1.1 skrll case R_SH_DIR32:
5924 1.1 skrll if (sh_elf_hash_table (info)->fdpic_p && !info->shared
5925 1.1 skrll && (sec->flags & SEC_ALLOC) != 0)
5926 1.1 skrll sh_elf_hash_table (info)->srofixup->size -= 4;
5927 1.1 skrll /* Fall thru */
5928 1.1 skrll
5929 1.1 skrll case R_SH_REL32:
5930 1.1 skrll if (info->shared)
5931 1.1 skrll break;
5932 1.1 skrll /* Fall thru */
5933 1.1 skrll
5934 1.1 skrll case R_SH_PLT32:
5935 1.1 skrll #ifdef INCLUDE_SHMEDIA
5936 1.1 skrll case R_SH_PLT_LOW16:
5937 1.1 skrll case R_SH_PLT_MEDLOW16:
5938 1.1 skrll case R_SH_PLT_MEDHI16:
5939 1.1 skrll case R_SH_PLT_HI16:
5940 1.1 skrll #endif
5941 1.1 skrll if (h != NULL)
5942 1.1 skrll {
5943 1.1 skrll if (h->plt.refcount > 0)
5944 1.1 skrll h->plt.refcount -= 1;
5945 1.1 skrll }
5946 1.1 skrll break;
5947 1.1 skrll
5948 1.1 skrll case R_SH_GOTPLT32:
5949 1.1 skrll #ifdef INCLUDE_SHMEDIA
5950 1.1 skrll case R_SH_GOTPLT_LOW16:
5951 1.1 skrll case R_SH_GOTPLT_MEDLOW16:
5952 1.1 skrll case R_SH_GOTPLT_MEDHI16:
5953 1.1 skrll case R_SH_GOTPLT_HI16:
5954 1.1 skrll case R_SH_GOTPLT10BY4:
5955 1.1 skrll case R_SH_GOTPLT10BY8:
5956 1.1 skrll #endif
5957 1.1 skrll if (h != NULL)
5958 1.1 skrll {
5959 1.1 skrll struct elf_sh_link_hash_entry *eh;
5960 1.1 skrll eh = (struct elf_sh_link_hash_entry *) h;
5961 1.1 skrll if (eh->gotplt_refcount > 0)
5962 1.1 skrll {
5963 1.1 skrll eh->gotplt_refcount -= 1;
5964 1.1 skrll if (h->plt.refcount > 0)
5965 1.1 skrll h->plt.refcount -= 1;
5966 1.1 skrll }
5967 1.1 skrll #ifdef INCLUDE_SHMEDIA
5968 1.1 skrll else if (seen_stt_datalabel)
5969 1.1 skrll {
5970 1.1 skrll if (eh->datalabel_got.refcount > 0)
5971 1.1 skrll eh->datalabel_got.refcount -= 1;
5972 1.1 skrll }
5973 1.1 skrll #endif
5974 1.1 skrll else if (h->got.refcount > 0)
5975 1.1 skrll h->got.refcount -= 1;
5976 1.1 skrll }
5977 1.1 skrll else if (local_got_refcounts != NULL)
5978 1.1 skrll {
5979 1.1 skrll #ifdef INCLUDE_SHMEDIA
5980 1.1 skrll if (rel->r_addend & 1)
5981 1.1 skrll {
5982 1.1 skrll if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
5983 1.1 skrll local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
5984 1.1 skrll }
5985 1.1 skrll else
5986 1.1 skrll #endif
5987 1.1 skrll if (local_got_refcounts[r_symndx] > 0)
5988 1.1 skrll local_got_refcounts[r_symndx] -= 1;
5989 1.1 skrll }
5990 1.1 skrll break;
5991 1.1 skrll
5992 1.1 skrll default:
5993 1.1 skrll break;
5994 1.1 skrll }
5995 1.1 skrll }
5996 1.1 skrll
5997 1.1 skrll return TRUE;
5998 1.1 skrll }
5999 1.1 skrll
6000 1.1 skrll /* Copy the extra info we tack onto an elf_link_hash_entry. */
6001 1.1 skrll
6002 1.1 skrll static void
6003 1.1 skrll sh_elf_copy_indirect_symbol (struct bfd_link_info *info,
6004 1.1 skrll struct elf_link_hash_entry *dir,
6005 1.1 skrll struct elf_link_hash_entry *ind)
6006 1.1 skrll {
6007 1.1 skrll struct elf_sh_link_hash_entry *edir, *eind;
6008 1.1 skrll
6009 1.1 skrll edir = (struct elf_sh_link_hash_entry *) dir;
6010 1.1 skrll eind = (struct elf_sh_link_hash_entry *) ind;
6011 1.1 skrll
6012 1.1 skrll if (eind->dyn_relocs != NULL)
6013 1.1 skrll {
6014 1.1 skrll if (edir->dyn_relocs != NULL)
6015 1.1 skrll {
6016 1.1 skrll struct elf_sh_dyn_relocs **pp;
6017 1.1 skrll struct elf_sh_dyn_relocs *p;
6018 1.1 skrll
6019 1.1 skrll /* Add reloc counts against the indirect sym to the direct sym
6020 1.1 skrll list. Merge any entries against the same section. */
6021 1.1 skrll for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
6022 1.1 skrll {
6023 1.1 skrll struct elf_sh_dyn_relocs *q;
6024 1.1 skrll
6025 1.1 skrll for (q = edir->dyn_relocs; q != NULL; q = q->next)
6026 1.1 skrll if (q->sec == p->sec)
6027 1.1 skrll {
6028 1.1 skrll q->pc_count += p->pc_count;
6029 1.1 skrll q->count += p->count;
6030 1.1 skrll *pp = p->next;
6031 1.1 skrll break;
6032 1.1 skrll }
6033 1.1 skrll if (q == NULL)
6034 1.1 skrll pp = &p->next;
6035 1.1 skrll }
6036 1.1 skrll *pp = edir->dyn_relocs;
6037 1.1 skrll }
6038 1.1 skrll
6039 1.1 skrll edir->dyn_relocs = eind->dyn_relocs;
6040 1.1 skrll eind->dyn_relocs = NULL;
6041 1.1 skrll }
6042 1.3 christos edir->gotplt_refcount = eind->gotplt_refcount;
6043 1.3 christos eind->gotplt_refcount = 0;
6044 1.3 christos #ifdef INCLUDE_SHMEDIA
6045 1.3 christos edir->datalabel_got.refcount += eind->datalabel_got.refcount;
6046 1.1 skrll eind->datalabel_got.refcount = 0;
6047 1.1 skrll #endif
6048 1.1 skrll edir->funcdesc.refcount += eind->funcdesc.refcount;
6049 1.1 skrll eind->funcdesc.refcount = 0;
6050 1.3 christos edir->abs_funcdesc_refcount += eind->abs_funcdesc_refcount;
6051 1.3 christos eind->abs_funcdesc_refcount = 0;
6052 1.1 skrll
6053 1.1 skrll if (ind->root.type == bfd_link_hash_indirect
6054 1.1 skrll && dir->got.refcount <= 0)
6055 1.1 skrll {
6056 1.1 skrll edir->got_type = eind->got_type;
6057 1.1 skrll eind->got_type = GOT_UNKNOWN;
6058 1.1 skrll }
6059 1.1 skrll
6060 1.1 skrll if (ind->root.type != bfd_link_hash_indirect
6061 1.1 skrll && dir->dynamic_adjusted)
6062 1.1 skrll {
6063 1.1 skrll /* If called to transfer flags for a weakdef during processing
6064 1.1 skrll of elf_adjust_dynamic_symbol, don't copy non_got_ref.
6065 1.1 skrll We clear it ourselves for ELIMINATE_COPY_RELOCS. */
6066 1.1 skrll dir->ref_dynamic |= ind->ref_dynamic;
6067 1.1 skrll dir->ref_regular |= ind->ref_regular;
6068 1.1 skrll dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
6069 1.1 skrll dir->needs_plt |= ind->needs_plt;
6070 1.1 skrll }
6071 1.1 skrll else
6072 1.1 skrll _bfd_elf_link_hash_copy_indirect (info, dir, ind);
6073 1.1 skrll }
6074 1.1 skrll
6075 1.1 skrll static int
6076 1.1 skrll sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type,
6077 1.1 skrll int is_local)
6078 1.1 skrll {
6079 1.1 skrll if (info->shared)
6080 1.1 skrll return r_type;
6081 1.1 skrll
6082 1.1 skrll switch (r_type)
6083 1.1 skrll {
6084 1.1 skrll case R_SH_TLS_GD_32:
6085 1.1 skrll case R_SH_TLS_IE_32:
6086 1.1 skrll if (is_local)
6087 1.1 skrll return R_SH_TLS_LE_32;
6088 1.1 skrll return R_SH_TLS_IE_32;
6089 1.1 skrll case R_SH_TLS_LD_32:
6090 1.1 skrll return R_SH_TLS_LE_32;
6091 1.1 skrll }
6092 1.1 skrll
6093 1.1 skrll return r_type;
6094 1.1 skrll }
6095 1.1 skrll
6096 1.1 skrll /* Look through the relocs for a section during the first phase.
6097 1.1 skrll Since we don't do .gots or .plts, we just need to consider the
6098 1.1 skrll virtual table relocs for gc. */
6099 1.1 skrll
6100 1.1 skrll static bfd_boolean
6101 1.1 skrll sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
6102 1.1 skrll const Elf_Internal_Rela *relocs)
6103 1.1 skrll {
6104 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
6105 1.3 christos struct elf_link_hash_entry **sym_hashes;
6106 1.1 skrll struct elf_sh_link_hash_table *htab;
6107 1.1 skrll const Elf_Internal_Rela *rel;
6108 1.1 skrll const Elf_Internal_Rela *rel_end;
6109 1.1 skrll asection *sreloc;
6110 1.1 skrll unsigned int r_type;
6111 1.1 skrll int got_type, old_got_type;
6112 1.1 skrll
6113 1.1 skrll sreloc = NULL;
6114 1.1 skrll
6115 1.1 skrll if (info->relocatable)
6116 1.1 skrll return TRUE;
6117 1.1 skrll
6118 1.3 christos BFD_ASSERT (is_sh_elf (abfd));
6119 1.3 christos
6120 1.1 skrll symtab_hdr = &elf_symtab_hdr (abfd);
6121 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
6122 1.1 skrll
6123 1.1 skrll htab = sh_elf_hash_table (info);
6124 1.1 skrll if (htab == NULL)
6125 1.1 skrll return FALSE;
6126 1.1 skrll
6127 1.1 skrll rel_end = relocs + sec->reloc_count;
6128 1.1 skrll for (rel = relocs; rel < rel_end; rel++)
6129 1.1 skrll {
6130 1.1 skrll struct elf_link_hash_entry *h;
6131 1.1 skrll unsigned long r_symndx;
6132 1.1 skrll #ifdef INCLUDE_SHMEDIA
6133 1.1 skrll int seen_stt_datalabel = 0;
6134 1.1 skrll #endif
6135 1.1 skrll
6136 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
6137 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
6138 1.1 skrll
6139 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
6140 1.1 skrll h = NULL;
6141 1.1 skrll else
6142 1.1 skrll {
6143 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6144 1.1 skrll while (h->root.type == bfd_link_hash_indirect
6145 1.1 skrll || h->root.type == bfd_link_hash_warning)
6146 1.1 skrll {
6147 1.1 skrll #ifdef INCLUDE_SHMEDIA
6148 1.1 skrll seen_stt_datalabel |= h->type == STT_DATALABEL;
6149 1.1 skrll #endif
6150 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
6151 1.1 skrll }
6152 1.1 skrll }
6153 1.1 skrll
6154 1.1 skrll r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
6155 1.1 skrll if (! info->shared
6156 1.1 skrll && r_type == R_SH_TLS_IE_32
6157 1.1 skrll && h != NULL
6158 1.3 christos && h->root.type != bfd_link_hash_undefined
6159 1.3 christos && h->root.type != bfd_link_hash_undefweak
6160 1.3 christos && (h->dynindx == -1
6161 1.3 christos || h->def_regular))
6162 1.3 christos r_type = R_SH_TLS_LE_32;
6163 1.3 christos
6164 1.3 christos if (htab->fdpic_p)
6165 1.3 christos switch (r_type)
6166 1.3 christos {
6167 1.3 christos case R_SH_GOTOFFFUNCDESC:
6168 1.3 christos case R_SH_GOTOFFFUNCDESC20:
6169 1.3 christos case R_SH_FUNCDESC:
6170 1.3 christos case R_SH_GOTFUNCDESC:
6171 1.3 christos case R_SH_GOTFUNCDESC20:
6172 1.3 christos if (h != NULL)
6173 1.3 christos {
6174 1.3 christos if (h->dynindx == -1)
6175 1.3 christos switch (ELF_ST_VISIBILITY (h->other))
6176 1.3 christos {
6177 1.3 christos case STV_INTERNAL:
6178 1.3 christos case STV_HIDDEN:
6179 1.3 christos break;
6180 1.3 christos default:
6181 1.3 christos bfd_elf_link_record_dynamic_symbol (info, h);
6182 1.1 skrll break;
6183 1.1 skrll }
6184 1.1 skrll }
6185 1.1 skrll break;
6186 1.1 skrll }
6187 1.3 christos
6188 1.3 christos /* Some relocs require a global offset table. */
6189 1.3 christos if (htab->sgot == NULL)
6190 1.3 christos {
6191 1.1 skrll switch (r_type)
6192 1.1 skrll {
6193 1.3 christos case R_SH_DIR32:
6194 1.1 skrll /* This may require an rofixup. */
6195 1.3 christos if (!htab->fdpic_p)
6196 1.3 christos break;
6197 1.3 christos case R_SH_GOTPLT32:
6198 1.3 christos case R_SH_GOT32:
6199 1.3 christos case R_SH_GOT20:
6200 1.3 christos case R_SH_GOTOFF:
6201 1.1 skrll case R_SH_GOTOFF20:
6202 1.1 skrll case R_SH_FUNCDESC:
6203 1.1 skrll case R_SH_GOTFUNCDESC:
6204 1.1 skrll case R_SH_GOTFUNCDESC20:
6205 1.1 skrll case R_SH_GOTOFFFUNCDESC:
6206 1.1 skrll case R_SH_GOTOFFFUNCDESC20:
6207 1.1 skrll case R_SH_GOTPC:
6208 1.1 skrll #ifdef INCLUDE_SHMEDIA
6209 1.1 skrll case R_SH_GOTPLT_LOW16:
6210 1.1 skrll case R_SH_GOTPLT_MEDLOW16:
6211 1.1 skrll case R_SH_GOTPLT_MEDHI16:
6212 1.1 skrll case R_SH_GOTPLT_HI16:
6213 1.1 skrll case R_SH_GOTPLT10BY4:
6214 1.1 skrll case R_SH_GOTPLT10BY8:
6215 1.1 skrll case R_SH_GOT_LOW16:
6216 1.1 skrll case R_SH_GOT_MEDLOW16:
6217 1.1 skrll case R_SH_GOT_MEDHI16:
6218 1.1 skrll case R_SH_GOT_HI16:
6219 1.1 skrll case R_SH_GOT10BY4:
6220 1.1 skrll case R_SH_GOT10BY8:
6221 1.1 skrll case R_SH_GOTOFF_LOW16:
6222 1.1 skrll case R_SH_GOTOFF_MEDLOW16:
6223 1.1 skrll case R_SH_GOTOFF_MEDHI16:
6224 1.1 skrll case R_SH_GOTOFF_HI16:
6225 1.1 skrll case R_SH_GOTPC_LOW16:
6226 1.1 skrll case R_SH_GOTPC_MEDLOW16:
6227 1.3 christos case R_SH_GOTPC_MEDHI16:
6228 1.3 christos case R_SH_GOTPC_HI16:
6229 1.3 christos #endif
6230 1.3 christos case R_SH_TLS_GD_32:
6231 1.1 skrll case R_SH_TLS_LD_32:
6232 1.1 skrll case R_SH_TLS_IE_32:
6233 1.1 skrll if (htab->root.dynobj == NULL)
6234 1.1 skrll htab->root.dynobj = abfd;
6235 1.1 skrll if (!create_got_section (htab->root.dynobj, info))
6236 1.1 skrll return FALSE;
6237 1.1 skrll break;
6238 1.1 skrll
6239 1.1 skrll default:
6240 1.1 skrll break;
6241 1.1 skrll }
6242 1.1 skrll }
6243 1.1 skrll
6244 1.1 skrll switch (r_type)
6245 1.1 skrll {
6246 1.1 skrll /* This relocation describes the C++ object vtable hierarchy.
6247 1.1 skrll Reconstruct it for later use during GC. */
6248 1.1 skrll case R_SH_GNU_VTINHERIT:
6249 1.1 skrll if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6250 1.1 skrll return FALSE;
6251 1.1 skrll break;
6252 1.1 skrll
6253 1.1 skrll /* This relocation describes which C++ vtable entries are actually
6254 1.1 skrll used. Record for later use during GC. */
6255 1.1 skrll case R_SH_GNU_VTENTRY:
6256 1.1 skrll BFD_ASSERT (h != NULL);
6257 1.1 skrll if (h != NULL
6258 1.1 skrll && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
6259 1.1 skrll return FALSE;
6260 1.1 skrll break;
6261 1.1 skrll
6262 1.1 skrll case R_SH_TLS_IE_32:
6263 1.1 skrll if (info->shared)
6264 1.3 christos info->flags |= DF_STATIC_TLS;
6265 1.1 skrll
6266 1.1 skrll /* FALLTHROUGH */
6267 1.1 skrll force_got:
6268 1.1 skrll case R_SH_TLS_GD_32:
6269 1.1 skrll case R_SH_GOT32:
6270 1.1 skrll case R_SH_GOT20:
6271 1.1 skrll #ifdef INCLUDE_SHMEDIA
6272 1.1 skrll case R_SH_GOT_LOW16:
6273 1.3 christos case R_SH_GOT_MEDLOW16:
6274 1.3 christos case R_SH_GOT_MEDHI16:
6275 1.1 skrll case R_SH_GOT_HI16:
6276 1.1 skrll case R_SH_GOT10BY4:
6277 1.1 skrll case R_SH_GOT10BY8:
6278 1.3 christos #endif
6279 1.1 skrll case R_SH_GOTFUNCDESC:
6280 1.1 skrll case R_SH_GOTFUNCDESC20:
6281 1.3 christos switch (r_type)
6282 1.1 skrll {
6283 1.1 skrll default:
6284 1.3 christos got_type = GOT_NORMAL;
6285 1.3 christos break;
6286 1.3 christos case R_SH_TLS_GD_32:
6287 1.3 christos got_type = GOT_TLS_GD;
6288 1.3 christos break;
6289 1.1 skrll case R_SH_TLS_IE_32:
6290 1.1 skrll got_type = GOT_TLS_IE;
6291 1.1 skrll break;
6292 1.1 skrll case R_SH_GOTFUNCDESC:
6293 1.1 skrll case R_SH_GOTFUNCDESC20:
6294 1.1 skrll got_type = GOT_FUNCDESC;
6295 1.1 skrll break;
6296 1.1 skrll }
6297 1.1 skrll
6298 1.1 skrll if (h != NULL)
6299 1.1 skrll {
6300 1.1 skrll #ifdef INCLUDE_SHMEDIA
6301 1.1 skrll if (seen_stt_datalabel)
6302 1.1 skrll {
6303 1.1 skrll struct elf_sh_link_hash_entry *eh
6304 1.1 skrll = (struct elf_sh_link_hash_entry *) h;
6305 1.3 christos
6306 1.1 skrll eh->datalabel_got.refcount += 1;
6307 1.1 skrll }
6308 1.1 skrll else
6309 1.1 skrll #endif
6310 1.1 skrll h->got.refcount += 1;
6311 1.1 skrll old_got_type = sh_elf_hash_entry (h)->got_type;
6312 1.1 skrll }
6313 1.1 skrll else
6314 1.1 skrll {
6315 1.1 skrll bfd_signed_vma *local_got_refcounts;
6316 1.1 skrll
6317 1.1 skrll /* This is a global offset table entry for a local
6318 1.1 skrll symbol. */
6319 1.1 skrll local_got_refcounts = elf_local_got_refcounts (abfd);
6320 1.1 skrll if (local_got_refcounts == NULL)
6321 1.1 skrll {
6322 1.1 skrll bfd_size_type size;
6323 1.1 skrll
6324 1.1 skrll size = symtab_hdr->sh_info;
6325 1.1 skrll size *= sizeof (bfd_signed_vma);
6326 1.1 skrll #ifdef INCLUDE_SHMEDIA
6327 1.1 skrll /* Reserve space for both the datalabel and
6328 1.1 skrll codelabel local GOT offsets. */
6329 1.1 skrll size *= 2;
6330 1.1 skrll #endif
6331 1.1 skrll size += symtab_hdr->sh_info;
6332 1.1 skrll local_got_refcounts = ((bfd_signed_vma *)
6333 1.1 skrll bfd_zalloc (abfd, size));
6334 1.3 christos if (local_got_refcounts == NULL)
6335 1.1 skrll return FALSE;
6336 1.1 skrll elf_local_got_refcounts (abfd) = local_got_refcounts;
6337 1.3 christos #ifdef INCLUDE_SHMEDIA
6338 1.1 skrll /* Take care of both the datalabel and codelabel local
6339 1.1 skrll GOT offsets. */
6340 1.1 skrll sh_elf_local_got_type (abfd)
6341 1.1 skrll = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
6342 1.1 skrll #else
6343 1.1 skrll sh_elf_local_got_type (abfd)
6344 1.1 skrll = (char *) (local_got_refcounts + symtab_hdr->sh_info);
6345 1.1 skrll #endif
6346 1.1 skrll }
6347 1.3 christos #ifdef INCLUDE_SHMEDIA
6348 1.1 skrll if (rel->r_addend & 1)
6349 1.1 skrll local_got_refcounts[symtab_hdr->sh_info + r_symndx] += 1;
6350 1.1 skrll else
6351 1.1 skrll #endif
6352 1.3 christos local_got_refcounts[r_symndx] += 1;
6353 1.3 christos old_got_type = sh_elf_local_got_type (abfd) [r_symndx];
6354 1.1 skrll }
6355 1.3 christos
6356 1.3 christos /* If a TLS symbol is accessed using IE at least once,
6357 1.1 skrll there is no point to use dynamic model for it. */
6358 1.1 skrll if (old_got_type != got_type && old_got_type != GOT_UNKNOWN
6359 1.3 christos && (old_got_type != GOT_TLS_GD || got_type != GOT_TLS_IE))
6360 1.3 christos {
6361 1.3 christos if (old_got_type == GOT_TLS_IE && got_type == GOT_TLS_GD)
6362 1.3 christos got_type = GOT_TLS_IE;
6363 1.3 christos else
6364 1.3 christos {
6365 1.3 christos if ((old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC)
6366 1.3 christos && (old_got_type == GOT_NORMAL || got_type == GOT_NORMAL))
6367 1.3 christos (*_bfd_error_handler)
6368 1.3 christos (_("%B: `%s' accessed both as normal and FDPIC symbol"),
6369 1.3 christos abfd, h->root.root.string);
6370 1.3 christos else if (old_got_type == GOT_FUNCDESC
6371 1.1 skrll || got_type == GOT_FUNCDESC)
6372 1.1 skrll (*_bfd_error_handler)
6373 1.1 skrll (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
6374 1.1 skrll abfd, h->root.root.string);
6375 1.1 skrll else
6376 1.1 skrll (*_bfd_error_handler)
6377 1.3 christos (_("%B: `%s' accessed both as normal and thread local symbol"),
6378 1.1 skrll abfd, h->root.root.string);
6379 1.1 skrll return FALSE;
6380 1.3 christos }
6381 1.1 skrll }
6382 1.3 christos
6383 1.1 skrll if (old_got_type != got_type)
6384 1.1 skrll {
6385 1.1 skrll if (h != NULL)
6386 1.1 skrll sh_elf_hash_entry (h)->got_type = got_type;
6387 1.1 skrll else
6388 1.1 skrll sh_elf_local_got_type (abfd) [r_symndx] = got_type;
6389 1.1 skrll }
6390 1.1 skrll
6391 1.3 christos break;
6392 1.3 christos
6393 1.3 christos case R_SH_TLS_LD_32:
6394 1.3 christos sh_elf_hash_table(info)->tls_ldm_got.refcount += 1;
6395 1.3 christos break;
6396 1.3 christos
6397 1.3 christos case R_SH_FUNCDESC:
6398 1.3 christos case R_SH_GOTOFFFUNCDESC:
6399 1.3 christos case R_SH_GOTOFFFUNCDESC20:
6400 1.3 christos if (rel->r_addend)
6401 1.3 christos {
6402 1.3 christos (*_bfd_error_handler)
6403 1.3 christos (_("%B: Function descriptor relocation with non-zero addend"),
6404 1.3 christos abfd);
6405 1.3 christos return FALSE;
6406 1.3 christos }
6407 1.3 christos
6408 1.3 christos if (h == NULL)
6409 1.3 christos {
6410 1.3 christos union gotref *local_funcdesc;
6411 1.3 christos
6412 1.3 christos /* We need a function descriptor for a local symbol. */
6413 1.3 christos local_funcdesc = sh_elf_local_funcdesc (abfd);
6414 1.3 christos if (local_funcdesc == NULL)
6415 1.3 christos {
6416 1.3 christos bfd_size_type size;
6417 1.3 christos
6418 1.3 christos size = symtab_hdr->sh_info * sizeof (union gotref);
6419 1.3 christos #ifdef INCLUDE_SHMEDIA
6420 1.3 christos /* Count datalabel local GOT. */
6421 1.3 christos size *= 2;
6422 1.3 christos #endif
6423 1.3 christos local_funcdesc = (union gotref *) bfd_zalloc (abfd, size);
6424 1.3 christos if (local_funcdesc == NULL)
6425 1.3 christos return FALSE;
6426 1.3 christos sh_elf_local_funcdesc (abfd) = local_funcdesc;
6427 1.3 christos }
6428 1.3 christos local_funcdesc[r_symndx].refcount += 1;
6429 1.3 christos
6430 1.3 christos if (r_type == R_SH_FUNCDESC)
6431 1.3 christos {
6432 1.3 christos if (!info->shared)
6433 1.3 christos htab->srofixup->size += 4;
6434 1.3 christos else
6435 1.3 christos htab->srelgot->size += sizeof (Elf32_External_Rela);
6436 1.3 christos }
6437 1.3 christos }
6438 1.3 christos else
6439 1.3 christos {
6440 1.3 christos sh_elf_hash_entry (h)->funcdesc.refcount++;
6441 1.3 christos if (r_type == R_SH_FUNCDESC)
6442 1.3 christos sh_elf_hash_entry (h)->abs_funcdesc_refcount++;
6443 1.3 christos
6444 1.3 christos /* If there is a function descriptor reference, then
6445 1.3 christos there should not be any non-FDPIC references. */
6446 1.3 christos old_got_type = sh_elf_hash_entry (h)->got_type;
6447 1.3 christos if (old_got_type != GOT_FUNCDESC && old_got_type != GOT_UNKNOWN)
6448 1.3 christos {
6449 1.3 christos if (old_got_type == GOT_NORMAL)
6450 1.3 christos (*_bfd_error_handler)
6451 1.3 christos (_("%B: `%s' accessed both as normal and FDPIC symbol"),
6452 1.3 christos abfd, h->root.root.string);
6453 1.3 christos else
6454 1.3 christos (*_bfd_error_handler)
6455 1.1 skrll (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
6456 1.1 skrll abfd, h->root.root.string);
6457 1.1 skrll }
6458 1.1 skrll }
6459 1.1 skrll break;
6460 1.1 skrll
6461 1.1 skrll case R_SH_GOTPLT32:
6462 1.1 skrll #ifdef INCLUDE_SHMEDIA
6463 1.1 skrll case R_SH_GOTPLT_LOW16:
6464 1.1 skrll case R_SH_GOTPLT_MEDLOW16:
6465 1.1 skrll case R_SH_GOTPLT_MEDHI16:
6466 1.1 skrll case R_SH_GOTPLT_HI16:
6467 1.1 skrll case R_SH_GOTPLT10BY4:
6468 1.1 skrll case R_SH_GOTPLT10BY8:
6469 1.1 skrll #endif
6470 1.1 skrll /* If this is a local symbol, we resolve it directly without
6471 1.1 skrll creating a procedure linkage table entry. */
6472 1.1 skrll
6473 1.1 skrll if (h == NULL
6474 1.1 skrll || h->forced_local
6475 1.1 skrll || ! info->shared
6476 1.1 skrll || info->symbolic
6477 1.1 skrll || h->dynindx == -1)
6478 1.1 skrll goto force_got;
6479 1.1 skrll
6480 1.1 skrll h->needs_plt = 1;
6481 1.1 skrll h->plt.refcount += 1;
6482 1.1 skrll ((struct elf_sh_link_hash_entry *) h)->gotplt_refcount += 1;
6483 1.1 skrll
6484 1.1 skrll break;
6485 1.1 skrll
6486 1.1 skrll case R_SH_PLT32:
6487 1.1 skrll #ifdef INCLUDE_SHMEDIA
6488 1.1 skrll case R_SH_PLT_LOW16:
6489 1.1 skrll case R_SH_PLT_MEDLOW16:
6490 1.1 skrll case R_SH_PLT_MEDHI16:
6491 1.1 skrll case R_SH_PLT_HI16:
6492 1.1 skrll #endif
6493 1.1 skrll /* This symbol requires a procedure linkage table entry. We
6494 1.1 skrll actually build the entry in adjust_dynamic_symbol,
6495 1.1 skrll because this might be a case of linking PIC code which is
6496 1.1 skrll never referenced by a dynamic object, in which case we
6497 1.1 skrll don't need to generate a procedure linkage table entry
6498 1.1 skrll after all. */
6499 1.1 skrll
6500 1.1 skrll /* If this is a local symbol, we resolve it directly without
6501 1.1 skrll creating a procedure linkage table entry. */
6502 1.1 skrll if (h == NULL)
6503 1.1 skrll continue;
6504 1.1 skrll
6505 1.1 skrll if (h->forced_local)
6506 1.1 skrll break;
6507 1.1 skrll
6508 1.1 skrll h->needs_plt = 1;
6509 1.1 skrll h->plt.refcount += 1;
6510 1.1 skrll break;
6511 1.1 skrll
6512 1.1 skrll case R_SH_DIR32:
6513 1.1 skrll case R_SH_REL32:
6514 1.1 skrll #ifdef INCLUDE_SHMEDIA
6515 1.1 skrll case R_SH_IMM_LOW16_PCREL:
6516 1.1 skrll case R_SH_IMM_MEDLOW16_PCREL:
6517 1.1 skrll case R_SH_IMM_MEDHI16_PCREL:
6518 1.1 skrll case R_SH_IMM_HI16_PCREL:
6519 1.1 skrll #endif
6520 1.1 skrll if (h != NULL && ! info->shared)
6521 1.1 skrll {
6522 1.1 skrll h->non_got_ref = 1;
6523 1.1 skrll h->plt.refcount += 1;
6524 1.1 skrll }
6525 1.1 skrll
6526 1.1 skrll /* If we are creating a shared library, and this is a reloc
6527 1.1 skrll against a global symbol, or a non PC relative reloc
6528 1.1 skrll against a local symbol, then we need to copy the reloc
6529 1.1 skrll into the shared library. However, if we are linking with
6530 1.1 skrll -Bsymbolic, we do not need to copy a reloc against a
6531 1.1 skrll global symbol which is defined in an object we are
6532 1.1 skrll including in the link (i.e., DEF_REGULAR is set). At
6533 1.1 skrll this point we have not seen all the input files, so it is
6534 1.1 skrll possible that DEF_REGULAR is not set now but will be set
6535 1.1 skrll later (it is never cleared). We account for that
6536 1.1 skrll possibility below by storing information in the
6537 1.1 skrll dyn_relocs field of the hash table entry. A similar
6538 1.1 skrll situation occurs when creating shared libraries and symbol
6539 1.1 skrll visibility changes render the symbol local.
6540 1.1 skrll
6541 1.1 skrll If on the other hand, we are creating an executable, we
6542 1.1 skrll may need to keep relocations for symbols satisfied by a
6543 1.1 skrll dynamic library if we manage to avoid copy relocs for the
6544 1.1 skrll symbol. */
6545 1.1 skrll if ((info->shared
6546 1.1 skrll && (sec->flags & SEC_ALLOC) != 0
6547 1.1 skrll && (r_type != R_SH_REL32
6548 1.1 skrll || (h != NULL
6549 1.1 skrll && (! info->symbolic
6550 1.1 skrll || h->root.type == bfd_link_hash_defweak
6551 1.1 skrll || !h->def_regular))))
6552 1.1 skrll || (! info->shared
6553 1.1 skrll && (sec->flags & SEC_ALLOC) != 0
6554 1.1 skrll && h != NULL
6555 1.1 skrll && (h->root.type == bfd_link_hash_defweak
6556 1.1 skrll || !h->def_regular)))
6557 1.1 skrll {
6558 1.1 skrll struct elf_sh_dyn_relocs *p;
6559 1.1 skrll struct elf_sh_dyn_relocs **head;
6560 1.1 skrll
6561 1.1 skrll if (htab->root.dynobj == NULL)
6562 1.1 skrll htab->root.dynobj = abfd;
6563 1.3 christos
6564 1.3 christos /* When creating a shared object, we must copy these
6565 1.1 skrll reloc types into the output file. We create a reloc
6566 1.3 christos section in dynobj and make room for this reloc. */
6567 1.1 skrll if (sreloc == NULL)
6568 1.1 skrll {
6569 1.1 skrll sreloc = _bfd_elf_make_dynamic_reloc_section
6570 1.1 skrll (sec, htab->root.dynobj, 2, abfd, /*rela?*/ TRUE);
6571 1.1 skrll
6572 1.1 skrll if (sreloc == NULL)
6573 1.1 skrll return FALSE;
6574 1.1 skrll }
6575 1.1 skrll
6576 1.3 christos /* If this is a global symbol, we count the number of
6577 1.1 skrll relocations we need for this symbol. */
6578 1.1 skrll if (h != NULL)
6579 1.3 christos head = &((struct elf_sh_link_hash_entry *) h)->dyn_relocs;
6580 1.3 christos else
6581 1.3 christos {
6582 1.3 christos /* Track dynamic relocs needed for local syms too. */
6583 1.3 christos asection *s;
6584 1.3 christos void *vpp;
6585 1.1 skrll Elf_Internal_Sym *isym;
6586 1.3 christos
6587 1.1 skrll isym = bfd_sym_from_r_symndx (&htab->sym_cache,
6588 1.3 christos abfd, r_symndx);
6589 1.1 skrll if (isym == NULL)
6590 1.1 skrll return FALSE;
6591 1.1 skrll
6592 1.1 skrll s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6593 1.1 skrll if (s == NULL)
6594 1.1 skrll s = sec;
6595 1.1 skrll
6596 1.1 skrll vpp = &elf_section_data (s)->local_dynrel;
6597 1.1 skrll head = (struct elf_sh_dyn_relocs **) vpp;
6598 1.1 skrll }
6599 1.1 skrll
6600 1.1 skrll p = *head;
6601 1.1 skrll if (p == NULL || p->sec != sec)
6602 1.1 skrll {
6603 1.1 skrll bfd_size_type amt = sizeof (*p);
6604 1.1 skrll p = bfd_alloc (htab->root.dynobj, amt);
6605 1.1 skrll if (p == NULL)
6606 1.1 skrll return FALSE;
6607 1.1 skrll p->next = *head;
6608 1.1 skrll *head = p;
6609 1.1 skrll p->sec = sec;
6610 1.1 skrll p->count = 0;
6611 1.1 skrll p->pc_count = 0;
6612 1.1 skrll }
6613 1.1 skrll
6614 1.1 skrll p->count += 1;
6615 1.1 skrll if (r_type == R_SH_REL32
6616 1.1 skrll #ifdef INCLUDE_SHMEDIA
6617 1.1 skrll || r_type == R_SH_IMM_LOW16_PCREL
6618 1.1 skrll || r_type == R_SH_IMM_MEDLOW16_PCREL
6619 1.1 skrll || r_type == R_SH_IMM_MEDHI16_PCREL
6620 1.3 christos || r_type == R_SH_IMM_HI16_PCREL
6621 1.3 christos #endif
6622 1.3 christos )
6623 1.3 christos p->pc_count += 1;
6624 1.3 christos }
6625 1.3 christos
6626 1.3 christos /* Allocate the fixup regardless of whether we need a relocation.
6627 1.1 skrll If we end up generating the relocation, we'll unallocate the
6628 1.1 skrll fixup. */
6629 1.1 skrll if (htab->fdpic_p && !info->shared
6630 1.1 skrll && r_type == R_SH_DIR32
6631 1.1 skrll && (sec->flags & SEC_ALLOC) != 0)
6632 1.1 skrll htab->srofixup->size += 4;
6633 1.1 skrll break;
6634 1.1 skrll
6635 1.1 skrll case R_SH_TLS_LE_32:
6636 1.1 skrll if (info->shared)
6637 1.1 skrll {
6638 1.1 skrll (*_bfd_error_handler)
6639 1.1 skrll (_("%B: TLS local exec code cannot be linked into shared objects"),
6640 1.1 skrll abfd);
6641 1.1 skrll return FALSE;
6642 1.1 skrll }
6643 1.1 skrll
6644 1.1 skrll break;
6645 1.1 skrll
6646 1.1 skrll case R_SH_TLS_LDO_32:
6647 1.1 skrll /* Nothing to do. */
6648 1.1 skrll break;
6649 1.1 skrll
6650 1.1 skrll default:
6651 1.1 skrll break;
6652 1.1 skrll }
6653 1.1 skrll }
6654 1.1 skrll
6655 1.1 skrll return TRUE;
6656 1.1 skrll }
6657 1.1 skrll
6658 1.1 skrll #ifndef sh_elf_set_mach_from_flags
6659 1.1 skrll static unsigned int sh_ef_bfd_table[] = { EF_SH_BFD_TABLE };
6660 1.1 skrll
6661 1.1 skrll static bfd_boolean
6662 1.1 skrll sh_elf_set_mach_from_flags (bfd *abfd)
6663 1.1 skrll {
6664 1.1 skrll flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK;
6665 1.1 skrll
6666 1.1 skrll if (flags >= sizeof(sh_ef_bfd_table))
6667 1.1 skrll return FALSE;
6668 1.1 skrll
6669 1.1 skrll if (sh_ef_bfd_table[flags] == 0)
6670 1.1 skrll return FALSE;
6671 1.1 skrll
6672 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]);
6673 1.1 skrll
6674 1.1 skrll return TRUE;
6675 1.1 skrll }
6676 1.1 skrll
6677 1.1 skrll
6678 1.1 skrll /* Reverse table lookup for sh_ef_bfd_table[].
6679 1.1 skrll Given a bfd MACH value from archures.c
6680 1.1 skrll return the equivalent ELF flags from the table.
6681 1.1 skrll Return -1 if no match is found. */
6682 1.1 skrll
6683 1.1 skrll int
6684 1.1 skrll sh_elf_get_flags_from_mach (unsigned long mach)
6685 1.1 skrll {
6686 1.1 skrll int i = ARRAY_SIZE (sh_ef_bfd_table) - 1;
6687 1.1 skrll
6688 1.1 skrll for (; i>0; i--)
6689 1.1 skrll if (sh_ef_bfd_table[i] == mach)
6690 1.1 skrll return i;
6691 1.1 skrll
6692 1.1 skrll /* shouldn't get here */
6693 1.1 skrll BFD_FAIL();
6694 1.1 skrll
6695 1.1 skrll return -1;
6696 1.1 skrll }
6697 1.1 skrll #endif /* not sh_elf_set_mach_from_flags */
6698 1.1 skrll
6699 1.1 skrll #ifndef sh_elf_set_private_flags
6700 1.1 skrll /* Function to keep SH specific file flags. */
6701 1.1 skrll
6702 1.1 skrll static bfd_boolean
6703 1.1 skrll sh_elf_set_private_flags (bfd *abfd, flagword flags)
6704 1.1 skrll {
6705 1.1 skrll BFD_ASSERT (! elf_flags_init (abfd)
6706 1.1 skrll || elf_elfheader (abfd)->e_flags == flags);
6707 1.1 skrll
6708 1.1 skrll elf_elfheader (abfd)->e_flags = flags;
6709 1.1 skrll elf_flags_init (abfd) = TRUE;
6710 1.1 skrll return sh_elf_set_mach_from_flags (abfd);
6711 1.1 skrll }
6712 1.1 skrll #endif /* not sh_elf_set_private_flags */
6713 1.1 skrll
6714 1.1 skrll #ifndef sh_elf_copy_private_data
6715 1.1 skrll /* Copy backend specific data from one object module to another */
6716 1.1 skrll
6717 1.1 skrll static bfd_boolean
6718 1.1 skrll sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
6719 1.1 skrll {
6720 1.3 christos /* Copy object attributes. */
6721 1.3 christos _bfd_elf_copy_obj_attributes (ibfd, obfd);
6722 1.3 christos
6723 1.3 christos if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
6724 1.3 christos return TRUE;
6725 1.3 christos
6726 1.3 christos /* Copy the stack size. */
6727 1.3 christos if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr
6728 1.3 christos && fdpic_object_p (ibfd) && fdpic_object_p (obfd))
6729 1.3 christos {
6730 1.3 christos unsigned i;
6731 1.3 christos
6732 1.3 christos for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
6733 1.3 christos if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
6734 1.3 christos {
6735 1.3 christos Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
6736 1.3 christos
6737 1.3 christos for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
6738 1.3 christos if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
6739 1.3 christos {
6740 1.3 christos memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
6741 1.3 christos
6742 1.3 christos /* Rewrite the phdrs, since we're only called after they
6743 1.3 christos were first written. */
6744 1.3 christos if (bfd_seek (obfd,
6745 1.3 christos (bfd_signed_vma) get_elf_backend_data (obfd)
6746 1.3 christos ->s->sizeof_ehdr, SEEK_SET) != 0
6747 1.3 christos || get_elf_backend_data (obfd)->s
6748 1.3 christos ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
6749 1.3 christos elf_elfheader (obfd)->e_phnum) != 0)
6750 1.3 christos return FALSE;
6751 1.3 christos break;
6752 1.1 skrll }
6753 1.1 skrll
6754 1.1 skrll break;
6755 1.1 skrll }
6756 1.1 skrll }
6757 1.1 skrll
6758 1.1 skrll return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
6759 1.1 skrll }
6760 1.1 skrll #endif /* not sh_elf_copy_private_data */
6761 1.1 skrll
6762 1.1 skrll #ifndef sh_elf_merge_private_data
6763 1.1 skrll
6764 1.1 skrll /* This function returns the ELF architecture number that
6765 1.1 skrll corresponds to the given arch_sh* flags. */
6766 1.1 skrll
6767 1.1 skrll int
6768 1.1 skrll sh_find_elf_flags (unsigned int arch_set)
6769 1.1 skrll {
6770 1.1 skrll extern unsigned long sh_get_bfd_mach_from_arch_set (unsigned int);
6771 1.1 skrll unsigned long bfd_mach = sh_get_bfd_mach_from_arch_set (arch_set);
6772 1.1 skrll
6773 1.1 skrll return sh_elf_get_flags_from_mach (bfd_mach);
6774 1.1 skrll }
6775 1.1 skrll
6776 1.1 skrll /* This routine initialises the elf flags when required and
6777 1.1 skrll calls sh_merge_bfd_arch() to check dsp/fpu compatibility. */
6778 1.1 skrll
6779 1.1 skrll static bfd_boolean
6780 1.1 skrll sh_elf_merge_private_data (bfd *ibfd, bfd *obfd)
6781 1.1 skrll {
6782 1.1 skrll extern bfd_boolean sh_merge_bfd_arch (bfd *, bfd *);
6783 1.1 skrll
6784 1.1 skrll if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
6785 1.3 christos return TRUE;
6786 1.1 skrll
6787 1.3 christos if (! elf_flags_init (obfd))
6788 1.3 christos {
6789 1.1 skrll /* This happens when ld starts out with a 'blank' output file. */
6790 1.1 skrll elf_flags_init (obfd) = TRUE;
6791 1.1 skrll elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6792 1.1 skrll sh_elf_set_mach_from_flags (obfd);
6793 1.1 skrll if (elf_elfheader (obfd)->e_flags & EF_SH_FDPIC)
6794 1.1 skrll elf_elfheader (obfd)->e_flags |= EF_SH_PIC;
6795 1.1 skrll }
6796 1.1 skrll
6797 1.1 skrll if (! sh_merge_bfd_arch (ibfd, obfd))
6798 1.1 skrll {
6799 1.1 skrll _bfd_error_handler ("%B: uses instructions which are incompatible "
6800 1.3 christos "with instructions used in previous modules",
6801 1.3 christos ibfd);
6802 1.1 skrll bfd_set_error (bfd_error_bad_value);
6803 1.3 christos return FALSE;
6804 1.3 christos }
6805 1.3 christos
6806 1.3 christos elf_elfheader (obfd)->e_flags &= ~EF_SH_MACH_MASK;
6807 1.3 christos elf_elfheader (obfd)->e_flags |=
6808 1.3 christos sh_elf_get_flags_from_mach (bfd_get_mach (obfd));
6809 1.3 christos
6810 1.3 christos if (fdpic_object_p (ibfd) != fdpic_object_p (obfd))
6811 1.3 christos {
6812 1.1 skrll _bfd_error_handler ("%B: attempt to mix FDPIC and non-FDPIC objects",
6813 1.1 skrll ibfd);
6814 1.1 skrll bfd_set_error (bfd_error_bad_value);
6815 1.1 skrll return FALSE;
6816 1.1 skrll }
6817 1.1 skrll
6818 1.1 skrll return TRUE;
6819 1.1 skrll }
6820 1.1 skrll #endif /* not sh_elf_merge_private_data */
6821 1.1 skrll
6822 1.1 skrll /* Override the generic function because we need to store sh_elf_obj_tdata
6823 1.3 christos as the specific tdata. We set also the machine architecture from flags
6824 1.3 christos here. */
6825 1.3 christos
6826 1.3 christos static bfd_boolean
6827 1.3 christos sh_elf_object_p (bfd *abfd)
6828 1.1 skrll {
6829 1.1 skrll if (! sh_elf_set_mach_from_flags (abfd))
6830 1.1 skrll return FALSE;
6831 1.1 skrll
6832 1.1 skrll return (((elf_elfheader (abfd)->e_flags & EF_SH_FDPIC) != 0)
6833 1.1 skrll == fdpic_object_p (abfd));
6834 1.1 skrll }
6835 1.1 skrll
6836 1.1 skrll /* Finish up dynamic symbol handling. We set the contents of various
6837 1.1 skrll dynamic sections here. */
6838 1.1 skrll
6839 1.1 skrll static bfd_boolean
6840 1.1 skrll sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
6841 1.3 christos struct elf_link_hash_entry *h,
6842 1.3 christos Elf_Internal_Sym *sym)
6843 1.1 skrll {
6844 1.1 skrll struct elf_sh_link_hash_table *htab;
6845 1.1 skrll
6846 1.1 skrll htab = sh_elf_hash_table (info);
6847 1.3 christos if (htab == NULL)
6848 1.3 christos return FALSE;
6849 1.1 skrll
6850 1.1 skrll if (h->plt.offset != (bfd_vma) -1)
6851 1.1 skrll {
6852 1.1 skrll asection *splt;
6853 1.1 skrll asection *sgotplt;
6854 1.3 christos asection *srelplt;
6855 1.1 skrll
6856 1.1 skrll bfd_vma plt_index;
6857 1.1 skrll bfd_vma got_offset;
6858 1.1 skrll Elf_Internal_Rela rel;
6859 1.1 skrll bfd_byte *loc;
6860 1.1 skrll const struct elf_sh_plt_info *plt_info;
6861 1.1 skrll
6862 1.3 christos /* This symbol has an entry in the procedure linkage table. Set
6863 1.3 christos it up. */
6864 1.3 christos
6865 1.1 skrll BFD_ASSERT (h->dynindx != -1);
6866 1.1 skrll
6867 1.1 skrll splt = htab->splt;
6868 1.1 skrll sgotplt = htab->sgotplt;
6869 1.1 skrll srelplt = htab->srelplt;
6870 1.1 skrll BFD_ASSERT (splt != NULL && sgotplt != NULL && srelplt != NULL);
6871 1.1 skrll
6872 1.3 christos /* Get the index in the procedure linkage table which
6873 1.3 christos corresponds to this symbol. This is the index of this symbol
6874 1.3 christos in all the symbols for which we are making plt entries. The
6875 1.3 christos first entry in the procedure linkage table is reserved. */
6876 1.1 skrll plt_index = get_plt_index (htab->plt_info, h->plt.offset);
6877 1.3 christos
6878 1.3 christos plt_info = htab->plt_info;
6879 1.3 christos if (plt_info->short_plt != NULL && plt_index <= MAX_SHORT_PLT)
6880 1.3 christos plt_info = plt_info->short_plt;
6881 1.3 christos
6882 1.3 christos /* Get the offset into the .got table of the entry that
6883 1.3 christos corresponds to this function. */
6884 1.3 christos if (htab->fdpic_p)
6885 1.3 christos /* The offset must be relative to the GOT symbol, twelve bytes
6886 1.3 christos before the end of .got.plt. Each descriptor is eight
6887 1.1 skrll bytes. */
6888 1.1 skrll got_offset = plt_index * 8 + 12 - sgotplt->size;
6889 1.1 skrll else
6890 1.1 skrll /* Each .got entry is 4 bytes. The first three are
6891 1.1 skrll reserved. */
6892 1.1 skrll got_offset = (plt_index + 3) * 4;
6893 1.1 skrll
6894 1.1 skrll #ifdef GOT_BIAS
6895 1.3 christos if (info->shared)
6896 1.3 christos got_offset -= GOT_BIAS;
6897 1.1 skrll #endif
6898 1.3 christos
6899 1.3 christos /* Fill in the entry in the procedure linkage table. */
6900 1.3 christos memcpy (splt->contents + h->plt.offset,
6901 1.3 christos plt_info->symbol_entry,
6902 1.3 christos plt_info->symbol_entry_size);
6903 1.3 christos
6904 1.3 christos if (info->shared || htab->fdpic_p)
6905 1.3 christos {
6906 1.3 christos if (plt_info->symbol_fields.got20)
6907 1.3 christos {
6908 1.3 christos bfd_reloc_status_type r;
6909 1.3 christos r = install_movi20_field (output_bfd, got_offset,
6910 1.3 christos splt->owner, splt, splt->contents,
6911 1.3 christos h->plt.offset
6912 1.3 christos + plt_info->symbol_fields.got_entry);
6913 1.3 christos BFD_ASSERT (r == bfd_reloc_ok);
6914 1.3 christos }
6915 1.1 skrll else
6916 1.1 skrll install_plt_field (output_bfd, FALSE, got_offset,
6917 1.3 christos (splt->contents
6918 1.3 christos + h->plt.offset
6919 1.1 skrll + plt_info->symbol_fields.got_entry));
6920 1.3 christos }
6921 1.3 christos else
6922 1.1 skrll {
6923 1.1 skrll BFD_ASSERT (!plt_info->symbol_fields.got20);
6924 1.1 skrll
6925 1.3 christos install_plt_field (output_bfd, FALSE,
6926 1.1 skrll (sgotplt->output_section->vma
6927 1.1 skrll + sgotplt->output_offset
6928 1.1 skrll + got_offset),
6929 1.1 skrll (splt->contents
6930 1.1 skrll + h->plt.offset
6931 1.1 skrll + plt_info->symbol_fields.got_entry));
6932 1.1 skrll if (htab->vxworks_p)
6933 1.1 skrll {
6934 1.1 skrll unsigned int reachable_plts, plts_per_4k;
6935 1.1 skrll int distance;
6936 1.1 skrll
6937 1.1 skrll /* Divide the PLT into groups. The first group contains
6938 1.1 skrll REACHABLE_PLTS entries and the other groups contain
6939 1.3 christos PLTS_PER_4K entries. Entries in the first group can
6940 1.3 christos branch directly to .plt; those in later groups branch
6941 1.3 christos to the last element of the previous group. */
6942 1.3 christos /* ??? It would be better to create multiple copies of
6943 1.1 skrll the common resolver stub. */
6944 1.1 skrll reachable_plts = ((4096
6945 1.3 christos - plt_info->plt0_entry_size
6946 1.1 skrll - (plt_info->symbol_fields.plt + 4))
6947 1.1 skrll / plt_info->symbol_entry_size) + 1;
6948 1.3 christos plts_per_4k = (4096 / plt_info->symbol_entry_size);
6949 1.1 skrll if (plt_index < reachable_plts)
6950 1.1 skrll distance = -(h->plt.offset
6951 1.1 skrll + plt_info->symbol_fields.plt);
6952 1.1 skrll else
6953 1.1 skrll distance = -(((plt_index - reachable_plts) % plts_per_4k + 1)
6954 1.1 skrll * plt_info->symbol_entry_size);
6955 1.3 christos
6956 1.1 skrll /* Install the 'bra' with this offset. */
6957 1.1 skrll bfd_put_16 (output_bfd,
6958 1.1 skrll 0xa000 | (0x0fff & ((distance - 4) / 2)),
6959 1.1 skrll (splt->contents
6960 1.1 skrll + h->plt.offset
6961 1.1 skrll + plt_info->symbol_fields.plt));
6962 1.3 christos }
6963 1.1 skrll else
6964 1.1 skrll install_plt_field (output_bfd, TRUE,
6965 1.3 christos splt->output_section->vma + splt->output_offset,
6966 1.1 skrll (splt->contents
6967 1.1 skrll + h->plt.offset
6968 1.1 skrll + plt_info->symbol_fields.plt));
6969 1.1 skrll }
6970 1.3 christos
6971 1.3 christos /* Make got_offset relative to the start of .got.plt. */
6972 1.1 skrll #ifdef GOT_BIAS
6973 1.3 christos if (info->shared)
6974 1.3 christos got_offset += GOT_BIAS;
6975 1.3 christos #endif
6976 1.3 christos if (htab->fdpic_p)
6977 1.3 christos got_offset = plt_index * 8;
6978 1.3 christos
6979 1.1 skrll if (plt_info->symbol_fields.reloc_offset != MINUS_ONE)
6980 1.1 skrll install_plt_field (output_bfd, FALSE,
6981 1.1 skrll plt_index * sizeof (Elf32_External_Rela),
6982 1.1 skrll (splt->contents
6983 1.1 skrll + h->plt.offset
6984 1.1 skrll + plt_info->symbol_fields.reloc_offset));
6985 1.3 christos
6986 1.3 christos /* Fill in the entry in the global offset table. */
6987 1.3 christos bfd_put_32 (output_bfd,
6988 1.3 christos (splt->output_section->vma
6989 1.3 christos + splt->output_offset
6990 1.3 christos + h->plt.offset
6991 1.3 christos + plt_info->symbol_resolve_offset),
6992 1.1 skrll sgotplt->contents + got_offset);
6993 1.1 skrll if (htab->fdpic_p)
6994 1.3 christos bfd_put_32 (output_bfd,
6995 1.3 christos sh_elf_osec_to_segment (output_bfd,
6996 1.1 skrll htab->splt->output_section),
6997 1.3 christos sgotplt->contents + got_offset + 4);
6998 1.3 christos
6999 1.3 christos /* Fill in the entry in the .rela.plt section. */
7000 1.3 christos rel.r_offset = (sgotplt->output_section->vma
7001 1.1 skrll + sgotplt->output_offset
7002 1.1 skrll + got_offset);
7003 1.1 skrll if (htab->fdpic_p)
7004 1.1 skrll rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_FUNCDESC_VALUE);
7005 1.3 christos else
7006 1.1 skrll rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_JMP_SLOT);
7007 1.1 skrll rel.r_addend = 0;
7008 1.1 skrll #ifdef GOT_BIAS
7009 1.1 skrll rel.r_addend = GOT_BIAS;
7010 1.1 skrll #endif
7011 1.1 skrll loc = srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
7012 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7013 1.1 skrll
7014 1.1 skrll if (htab->vxworks_p && !info->shared)
7015 1.1 skrll {
7016 1.1 skrll /* Create the .rela.plt.unloaded relocations for this PLT entry.
7017 1.1 skrll Begin by pointing LOC to the first such relocation. */
7018 1.1 skrll loc = (htab->srelplt2->contents
7019 1.1 skrll + (plt_index * 2 + 1) * sizeof (Elf32_External_Rela));
7020 1.3 christos
7021 1.1 skrll /* Create a .rela.plt.unloaded R_SH_DIR32 relocation
7022 1.1 skrll for the PLT entry's pointer to the .got.plt entry. */
7023 1.1 skrll rel.r_offset = (htab->splt->output_section->vma
7024 1.1 skrll + htab->splt->output_offset
7025 1.1 skrll + h->plt.offset
7026 1.1 skrll + plt_info->symbol_fields.got_entry);
7027 1.1 skrll rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
7028 1.3 christos rel.r_addend = got_offset;
7029 1.3 christos bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7030 1.1 skrll loc += sizeof (Elf32_External_Rela);
7031 1.1 skrll
7032 1.1 skrll /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for
7033 1.1 skrll the .got.plt entry, which initially points to .plt. */
7034 1.1 skrll rel.r_offset = (sgotplt->output_section->vma
7035 1.1 skrll + sgotplt->output_offset
7036 1.1 skrll + got_offset);
7037 1.1 skrll rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_SH_DIR32);
7038 1.1 skrll rel.r_addend = 0;
7039 1.1 skrll bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7040 1.1 skrll }
7041 1.1 skrll
7042 1.1 skrll if (!h->def_regular)
7043 1.1 skrll {
7044 1.1 skrll /* Mark the symbol as undefined, rather than as defined in
7045 1.3 christos the .plt section. Leave the value alone. */
7046 1.3 christos sym->st_shndx = SHN_UNDEF;
7047 1.3 christos }
7048 1.1 skrll }
7049 1.1 skrll
7050 1.3 christos if (h->got.offset != (bfd_vma) -1
7051 1.1 skrll && sh_elf_hash_entry (h)->got_type != GOT_TLS_GD
7052 1.1 skrll && sh_elf_hash_entry (h)->got_type != GOT_TLS_IE
7053 1.1 skrll && sh_elf_hash_entry (h)->got_type != GOT_FUNCDESC)
7054 1.1 skrll {
7055 1.1 skrll asection *sgot;
7056 1.1 skrll asection *srelgot;
7057 1.1 skrll Elf_Internal_Rela rel;
7058 1.3 christos bfd_byte *loc;
7059 1.3 christos
7060 1.1 skrll /* This symbol has an entry in the global offset table. Set it
7061 1.1 skrll up. */
7062 1.1 skrll
7063 1.1 skrll sgot = htab->sgot;
7064 1.1 skrll srelgot = htab->srelgot;
7065 1.1 skrll BFD_ASSERT (sgot != NULL && srelgot != NULL);
7066 1.1 skrll
7067 1.1 skrll rel.r_offset = (sgot->output_section->vma
7068 1.1 skrll + sgot->output_offset
7069 1.1 skrll + (h->got.offset &~ (bfd_vma) 1));
7070 1.1 skrll
7071 1.1 skrll /* If this is a static link, or it is a -Bsymbolic link and the
7072 1.1 skrll symbol is defined locally or was forced to be local because
7073 1.3 christos of a version file, we just want to emit a RELATIVE reloc.
7074 1.3 christos The entry in the global offset table will already have been
7075 1.3 christos initialized in the relocate_section function. */
7076 1.3 christos if (info->shared
7077 1.3 christos && SYMBOL_REFERENCES_LOCAL (info, h))
7078 1.3 christos {
7079 1.3 christos if (htab->fdpic_p)
7080 1.3 christos {
7081 1.3 christos asection *sec = h->root.u.def.section;
7082 1.3 christos int dynindx
7083 1.3 christos = elf_section_data (sec->output_section)->dynindx;
7084 1.3 christos
7085 1.3 christos rel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
7086 1.3 christos rel.r_addend = (h->root.u.def.value
7087 1.3 christos + h->root.u.def.section->output_offset);
7088 1.3 christos }
7089 1.3 christos else
7090 1.1 skrll {
7091 1.1 skrll rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
7092 1.1 skrll rel.r_addend = (h->root.u.def.value
7093 1.1 skrll + h->root.u.def.section->output_section->vma
7094 1.1 skrll + h->root.u.def.section->output_offset);
7095 1.1 skrll }
7096 1.1 skrll }
7097 1.1 skrll else
7098 1.3 christos {
7099 1.3 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
7100 1.1 skrll rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
7101 1.1 skrll rel.r_addend = 0;
7102 1.1 skrll }
7103 1.1 skrll
7104 1.1 skrll loc = srelgot->contents;
7105 1.1 skrll loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
7106 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7107 1.1 skrll }
7108 1.1 skrll
7109 1.1 skrll #ifdef INCLUDE_SHMEDIA
7110 1.1 skrll {
7111 1.3 christos struct elf_sh_link_hash_entry *eh;
7112 1.1 skrll
7113 1.1 skrll eh = (struct elf_sh_link_hash_entry *) h;
7114 1.1 skrll if (eh->datalabel_got.offset != (bfd_vma) -1)
7115 1.1 skrll {
7116 1.1 skrll asection *sgot;
7117 1.1 skrll asection *srelgot;
7118 1.1 skrll Elf_Internal_Rela rel;
7119 1.3 christos bfd_byte *loc;
7120 1.3 christos
7121 1.1 skrll /* This symbol has a datalabel entry in the global offset table.
7122 1.1 skrll Set it up. */
7123 1.1 skrll
7124 1.1 skrll sgot = htab->sgot;
7125 1.1 skrll srelgot = htab->srelgot;
7126 1.1 skrll BFD_ASSERT (sgot != NULL && srelgot != NULL);
7127 1.1 skrll
7128 1.1 skrll rel.r_offset = (sgot->output_section->vma
7129 1.1 skrll + sgot->output_offset
7130 1.1 skrll + (eh->datalabel_got.offset &~ (bfd_vma) 1));
7131 1.1 skrll
7132 1.1 skrll /* If this is a static link, or it is a -Bsymbolic link and the
7133 1.1 skrll symbol is defined locally or was forced to be local because
7134 1.3 christos of a version file, we just want to emit a RELATIVE reloc.
7135 1.3 christos The entry in the global offset table will already have been
7136 1.3 christos initialized in the relocate_section function. */
7137 1.3 christos if (info->shared
7138 1.3 christos && SYMBOL_REFERENCES_LOCAL (info, h))
7139 1.3 christos {
7140 1.3 christos if (htab->fdpic_p)
7141 1.3 christos {
7142 1.3 christos asection *sec = h->root.u.def.section;
7143 1.3 christos int dynindx
7144 1.3 christos = elf_section_data (sec->output_section)->dynindx;
7145 1.3 christos
7146 1.3 christos rel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
7147 1.3 christos rel.r_addend = (h->root.u.def.value
7148 1.3 christos + h->root.u.def.section->output_offset);
7149 1.3 christos }
7150 1.3 christos else
7151 1.1 skrll {
7152 1.1 skrll rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
7153 1.1 skrll rel.r_addend = (h->root.u.def.value
7154 1.1 skrll + h->root.u.def.section->output_section->vma
7155 1.1 skrll + h->root.u.def.section->output_offset);
7156 1.1 skrll }
7157 1.1 skrll }
7158 1.1 skrll else
7159 1.1 skrll {
7160 1.3 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents
7161 1.3 christos + eh->datalabel_got.offset);
7162 1.1 skrll rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
7163 1.1 skrll rel.r_addend = 0;
7164 1.1 skrll }
7165 1.1 skrll
7166 1.1 skrll loc = srelgot->contents;
7167 1.1 skrll loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
7168 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7169 1.1 skrll }
7170 1.1 skrll }
7171 1.1 skrll #endif
7172 1.1 skrll
7173 1.1 skrll if (h->needs_copy)
7174 1.1 skrll {
7175 1.1 skrll asection *s;
7176 1.1 skrll Elf_Internal_Rela rel;
7177 1.1 skrll bfd_byte *loc;
7178 1.1 skrll
7179 1.1 skrll /* This symbol needs a copy reloc. Set it up. */
7180 1.1 skrll
7181 1.1 skrll BFD_ASSERT (h->dynindx != -1
7182 1.1 skrll && (h->root.type == bfd_link_hash_defined
7183 1.1 skrll || h->root.type == bfd_link_hash_defweak));
7184 1.1 skrll
7185 1.1 skrll s = bfd_get_section_by_name (h->root.u.def.section->owner,
7186 1.1 skrll ".rela.bss");
7187 1.1 skrll BFD_ASSERT (s != NULL);
7188 1.1 skrll
7189 1.1 skrll rel.r_offset = (h->root.u.def.value
7190 1.1 skrll + h->root.u.def.section->output_section->vma
7191 1.1 skrll + h->root.u.def.section->output_offset);
7192 1.1 skrll rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_COPY);
7193 1.1 skrll rel.r_addend = 0;
7194 1.1 skrll loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
7195 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7196 1.1 skrll }
7197 1.1 skrll
7198 1.1 skrll /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
7199 1.1 skrll _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
7200 1.1 skrll ".got" section. */
7201 1.1 skrll if (strcmp (h->root.root.string, "_DYNAMIC") == 0
7202 1.1 skrll || (!htab->vxworks_p && h == htab->root.hgot))
7203 1.1 skrll sym->st_shndx = SHN_ABS;
7204 1.1 skrll
7205 1.1 skrll return TRUE;
7206 1.1 skrll }
7207 1.1 skrll
7208 1.3 christos /* Finish up the dynamic sections. */
7209 1.1 skrll
7210 1.1 skrll static bfd_boolean
7211 1.1 skrll sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
7212 1.3 christos {
7213 1.3 christos struct elf_sh_link_hash_table *htab;
7214 1.3 christos asection *sgotplt;
7215 1.3 christos asection *sdyn;
7216 1.1 skrll
7217 1.1 skrll htab = sh_elf_hash_table (info);
7218 1.1 skrll if (htab == NULL)
7219 1.1 skrll return FALSE;
7220 1.1 skrll
7221 1.1 skrll sgotplt = htab->sgotplt;
7222 1.1 skrll sdyn = bfd_get_section_by_name (htab->root.dynobj, ".dynamic");
7223 1.3 christos
7224 1.1 skrll if (htab->root.dynamic_sections_created)
7225 1.1 skrll {
7226 1.1 skrll asection *splt;
7227 1.1 skrll Elf32_External_Dyn *dyncon, *dynconend;
7228 1.1 skrll
7229 1.1 skrll BFD_ASSERT (sgotplt != NULL && sdyn != NULL);
7230 1.1 skrll
7231 1.1 skrll dyncon = (Elf32_External_Dyn *) sdyn->contents;
7232 1.1 skrll dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
7233 1.1 skrll for (; dyncon < dynconend; dyncon++)
7234 1.1 skrll {
7235 1.1 skrll Elf_Internal_Dyn dyn;
7236 1.1 skrll asection *s;
7237 1.1 skrll #ifdef INCLUDE_SHMEDIA
7238 1.1 skrll const char *name;
7239 1.1 skrll #endif
7240 1.1 skrll
7241 1.1 skrll bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn);
7242 1.1 skrll
7243 1.1 skrll switch (dyn.d_tag)
7244 1.1 skrll {
7245 1.1 skrll default:
7246 1.1 skrll if (htab->vxworks_p
7247 1.1 skrll && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
7248 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7249 1.1 skrll break;
7250 1.1 skrll
7251 1.1 skrll #ifdef INCLUDE_SHMEDIA
7252 1.1 skrll case DT_INIT:
7253 1.1 skrll name = info->init_function;
7254 1.1 skrll goto get_sym;
7255 1.1 skrll
7256 1.1 skrll case DT_FINI:
7257 1.1 skrll name = info->fini_function;
7258 1.1 skrll get_sym:
7259 1.1 skrll if (dyn.d_un.d_val != 0)
7260 1.1 skrll {
7261 1.1 skrll struct elf_link_hash_entry *h;
7262 1.1 skrll
7263 1.1 skrll h = elf_link_hash_lookup (&htab->root, name,
7264 1.1 skrll FALSE, FALSE, TRUE);
7265 1.1 skrll if (h != NULL && (h->other & STO_SH5_ISA32))
7266 1.1 skrll {
7267 1.1 skrll dyn.d_un.d_val |= 1;
7268 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7269 1.3 christos }
7270 1.3 christos }
7271 1.3 christos break;
7272 1.3 christos #endif
7273 1.3 christos
7274 1.3 christos case DT_PLTGOT:
7275 1.1 skrll BFD_ASSERT (htab->root.hgot != NULL);
7276 1.1 skrll s = htab->root.hgot->root.u.def.section;
7277 1.1 skrll dyn.d_un.d_ptr = htab->root.hgot->root.u.def.value
7278 1.1 skrll + s->output_section->vma + s->output_offset;
7279 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7280 1.1 skrll break;
7281 1.1 skrll
7282 1.1 skrll case DT_JMPREL:
7283 1.1 skrll s = htab->srelplt->output_section;
7284 1.1 skrll BFD_ASSERT (s != NULL);
7285 1.1 skrll dyn.d_un.d_ptr = s->vma;
7286 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7287 1.1 skrll break;
7288 1.1 skrll
7289 1.1 skrll case DT_PLTRELSZ:
7290 1.1 skrll s = htab->srelplt->output_section;
7291 1.1 skrll BFD_ASSERT (s != NULL);
7292 1.1 skrll dyn.d_un.d_val = s->size;
7293 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7294 1.1 skrll break;
7295 1.1 skrll
7296 1.1 skrll case DT_RELASZ:
7297 1.1 skrll /* My reading of the SVR4 ABI indicates that the
7298 1.1 skrll procedure linkage table relocs (DT_JMPREL) should be
7299 1.1 skrll included in the overall relocs (DT_RELA). This is
7300 1.1 skrll what Solaris does. However, UnixWare can not handle
7301 1.1 skrll that case. Therefore, we override the DT_RELASZ entry
7302 1.1 skrll here to make it not include the JMPREL relocs. Since
7303 1.1 skrll the linker script arranges for .rela.plt to follow all
7304 1.1 skrll other relocation sections, we don't have to worry
7305 1.1 skrll about changing the DT_RELA entry. */
7306 1.1 skrll if (htab->srelplt != NULL)
7307 1.1 skrll {
7308 1.1 skrll s = htab->srelplt->output_section;
7309 1.1 skrll dyn.d_un.d_val -= s->size;
7310 1.1 skrll }
7311 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7312 1.1 skrll break;
7313 1.1 skrll }
7314 1.1 skrll }
7315 1.1 skrll
7316 1.1 skrll /* Fill in the first entry in the procedure linkage table. */
7317 1.1 skrll splt = htab->splt;
7318 1.1 skrll if (splt && splt->size > 0 && htab->plt_info->plt0_entry)
7319 1.1 skrll {
7320 1.1 skrll unsigned int i;
7321 1.1 skrll
7322 1.3 christos memcpy (splt->contents,
7323 1.3 christos htab->plt_info->plt0_entry,
7324 1.1 skrll htab->plt_info->plt0_entry_size);
7325 1.1 skrll for (i = 0; i < ARRAY_SIZE (htab->plt_info->plt0_got_fields); i++)
7326 1.1 skrll if (htab->plt_info->plt0_got_fields[i] != MINUS_ONE)
7327 1.1 skrll install_plt_field (output_bfd, FALSE,
7328 1.1 skrll (sgotplt->output_section->vma
7329 1.1 skrll + sgotplt->output_offset
7330 1.1 skrll + (i * 4)),
7331 1.1 skrll (splt->contents
7332 1.1 skrll + htab->plt_info->plt0_got_fields[i]));
7333 1.1 skrll
7334 1.1 skrll if (htab->vxworks_p)
7335 1.1 skrll {
7336 1.1 skrll /* Finalize the .rela.plt.unloaded contents. */
7337 1.1 skrll Elf_Internal_Rela rel;
7338 1.1 skrll bfd_byte *loc;
7339 1.1 skrll
7340 1.1 skrll /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for the
7341 1.1 skrll first PLT entry's pointer to _GLOBAL_OFFSET_TABLE_ + 8. */
7342 1.1 skrll loc = htab->srelplt2->contents;
7343 1.1 skrll rel.r_offset = (splt->output_section->vma
7344 1.1 skrll + splt->output_offset
7345 1.1 skrll + htab->plt_info->plt0_got_fields[2]);
7346 1.1 skrll rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
7347 1.1 skrll rel.r_addend = 8;
7348 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7349 1.1 skrll loc += sizeof (Elf32_External_Rela);
7350 1.1 skrll
7351 1.1 skrll /* Fix up the remaining .rela.plt.unloaded relocations.
7352 1.1 skrll They may have the wrong symbol index for _G_O_T_ or
7353 1.1 skrll _P_L_T_ depending on the order in which symbols were
7354 1.1 skrll output. */
7355 1.1 skrll while (loc < htab->srelplt2->contents + htab->srelplt2->size)
7356 1.1 skrll {
7357 1.1 skrll /* The PLT entry's pointer to the .got.plt slot. */
7358 1.1 skrll bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7359 1.1 skrll rel.r_info = ELF32_R_INFO (htab->root.hgot->indx,
7360 1.1 skrll R_SH_DIR32);
7361 1.1 skrll bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7362 1.1 skrll loc += sizeof (Elf32_External_Rela);
7363 1.1 skrll
7364 1.1 skrll /* The .got.plt slot's pointer to .plt. */
7365 1.1 skrll bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7366 1.1 skrll rel.r_info = ELF32_R_INFO (htab->root.hplt->indx,
7367 1.1 skrll R_SH_DIR32);
7368 1.1 skrll bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7369 1.1 skrll loc += sizeof (Elf32_External_Rela);
7370 1.1 skrll }
7371 1.1 skrll }
7372 1.1 skrll
7373 1.1 skrll /* UnixWare sets the entsize of .plt to 4, although that doesn't
7374 1.3 christos really seem like the right value. */
7375 1.1 skrll elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
7376 1.1 skrll }
7377 1.3 christos }
7378 1.1 skrll
7379 1.1 skrll /* Fill in the first three entries in the global offset table. */
7380 1.1 skrll if (sgotplt && sgotplt->size > 0 && !htab->fdpic_p)
7381 1.3 christos {
7382 1.3 christos if (sdyn == NULL)
7383 1.3 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
7384 1.3 christos else
7385 1.1 skrll bfd_put_32 (output_bfd,
7386 1.3 christos sdyn->output_section->vma + sdyn->output_offset,
7387 1.3 christos sgotplt->contents);
7388 1.3 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
7389 1.3 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
7390 1.3 christos }
7391 1.3 christos
7392 1.3 christos if (sgotplt && sgotplt->size > 0)
7393 1.3 christos elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
7394 1.3 christos
7395 1.3 christos /* At the very end of the .rofixup section is a pointer to the GOT. */
7396 1.3 christos if (htab->fdpic_p && htab->srofixup != NULL)
7397 1.3 christos {
7398 1.3 christos struct elf_link_hash_entry *hgot = htab->root.hgot;
7399 1.3 christos bfd_vma got_value = hgot->root.u.def.value
7400 1.3 christos + hgot->root.u.def.section->output_section->vma
7401 1.1 skrll + hgot->root.u.def.section->output_offset;
7402 1.1 skrll
7403 1.3 christos sh_elf_add_rofixup (output_bfd, htab->srofixup, got_value);
7404 1.3 christos
7405 1.3 christos /* Make sure we allocated and generated the same number of fixups. */
7406 1.3 christos BFD_ASSERT (htab->srofixup->reloc_count * 4 == htab->srofixup->size);
7407 1.3 christos }
7408 1.3 christos
7409 1.3 christos if (htab->srelfuncdesc)
7410 1.3 christos BFD_ASSERT (htab->srelfuncdesc->reloc_count * sizeof (Elf32_External_Rela)
7411 1.1 skrll == htab->srelfuncdesc->size);
7412 1.1 skrll
7413 1.1 skrll if (htab->srelgot)
7414 1.1 skrll BFD_ASSERT (htab->srelgot->reloc_count * sizeof (Elf32_External_Rela)
7415 1.1 skrll == htab->srelgot->size);
7416 1.1 skrll
7417 1.1 skrll return TRUE;
7418 1.1 skrll }
7419 1.1 skrll
7420 1.1 skrll static enum elf_reloc_type_class
7421 1.1 skrll sh_elf_reloc_type_class (const Elf_Internal_Rela *rela)
7422 1.1 skrll {
7423 1.1 skrll switch ((int) ELF32_R_TYPE (rela->r_info))
7424 1.1 skrll {
7425 1.1 skrll case R_SH_RELATIVE:
7426 1.1 skrll return reloc_class_relative;
7427 1.1 skrll case R_SH_JMP_SLOT:
7428 1.1 skrll return reloc_class_plt;
7429 1.1 skrll case R_SH_COPY:
7430 1.1 skrll return reloc_class_copy;
7431 1.1 skrll default:
7432 1.1 skrll return reloc_class_normal;
7433 1.1 skrll }
7434 1.1 skrll }
7435 1.1 skrll
7436 1.1 skrll #if !defined SH_TARGET_ALREADY_DEFINED
7437 1.1 skrll /* Support for Linux core dump NOTE sections. */
7438 1.1 skrll
7439 1.1 skrll static bfd_boolean
7440 1.1 skrll elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
7441 1.1 skrll {
7442 1.1 skrll int offset;
7443 1.1 skrll unsigned int size;
7444 1.1 skrll
7445 1.1 skrll switch (note->descsz)
7446 1.1 skrll {
7447 1.1 skrll default:
7448 1.1 skrll return FALSE;
7449 1.3 christos
7450 1.1 skrll case 168: /* Linux/SH */
7451 1.1 skrll /* pr_cursig */
7452 1.1 skrll elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
7453 1.1 skrll
7454 1.1 skrll /* pr_pid */
7455 1.1 skrll elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
7456 1.1 skrll
7457 1.1 skrll /* pr_reg */
7458 1.1 skrll offset = 72;
7459 1.1 skrll size = 92;
7460 1.1 skrll
7461 1.1 skrll break;
7462 1.1 skrll }
7463 1.1 skrll
7464 1.1 skrll /* Make a ".reg/999" section. */
7465 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
7466 1.1 skrll size, note->descpos + offset);
7467 1.1 skrll }
7468 1.1 skrll
7469 1.1 skrll static bfd_boolean
7470 1.1 skrll elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
7471 1.1 skrll {
7472 1.1 skrll switch (note->descsz)
7473 1.1 skrll {
7474 1.1 skrll default:
7475 1.1 skrll return FALSE;
7476 1.1 skrll
7477 1.1 skrll case 124: /* Linux/SH elf_prpsinfo */
7478 1.1 skrll elf_tdata (abfd)->core_program
7479 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
7480 1.1 skrll elf_tdata (abfd)->core_command
7481 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
7482 1.1 skrll }
7483 1.1 skrll
7484 1.1 skrll /* Note that for some reason, a spurious space is tacked
7485 1.1 skrll onto the end of the args in some (at least one anyway)
7486 1.1 skrll implementations, so strip it off if it exists. */
7487 1.1 skrll
7488 1.1 skrll {
7489 1.1 skrll char *command = elf_tdata (abfd)->core_command;
7490 1.1 skrll int n = strlen (command);
7491 1.1 skrll
7492 1.1 skrll if (0 < n && command[n - 1] == ' ')
7493 1.1 skrll command[n - 1] = '\0';
7494 1.1 skrll }
7495 1.1 skrll
7496 1.1 skrll return TRUE;
7497 1.1 skrll }
7498 1.1 skrll #endif /* not SH_TARGET_ALREADY_DEFINED */
7499 1.1 skrll
7500 1.1 skrll
7501 1.1 skrll /* Return address for Ith PLT stub in section PLT, for relocation REL
7502 1.1 skrll or (bfd_vma) -1 if it should not be included. */
7503 1.1 skrll
7504 1.1 skrll static bfd_vma
7505 1.1 skrll sh_elf_plt_sym_val (bfd_vma i, const asection *plt,
7506 1.1 skrll const arelent *rel ATTRIBUTE_UNUSED)
7507 1.1 skrll {
7508 1.3 christos const struct elf_sh_plt_info *plt_info;
7509 1.3 christos
7510 1.3 christos plt_info = get_plt_info (plt->owner, (plt->owner->flags & DYNAMIC) != 0);
7511 1.3 christos return plt->vma + get_plt_offset (plt_info, i);
7512 1.3 christos }
7513 1.3 christos
7514 1.3 christos /* Decide whether to attempt to turn absptr or lsda encodings in
7515 1.3 christos shared libraries into pcrel within the given input section. */
7516 1.3 christos
7517 1.3 christos static bfd_boolean
7518 1.3 christos sh_elf_use_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
7519 1.3 christos struct bfd_link_info *info,
7520 1.3 christos asection *eh_frame_section ATTRIBUTE_UNUSED)
7521 1.3 christos {
7522 1.3 christos struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info);
7523 1.3 christos
7524 1.3 christos /* We can't use PC-relative encodings in FDPIC binaries, in general. */
7525 1.3 christos if (htab->fdpic_p)
7526 1.3 christos return FALSE;
7527 1.3 christos
7528 1.3 christos return TRUE;
7529 1.3 christos }
7530 1.3 christos
7531 1.3 christos /* Adjust the contents of an eh_frame_hdr section before they're output. */
7532 1.3 christos
7533 1.3 christos static bfd_byte
7534 1.3 christos sh_elf_encode_eh_address (bfd *abfd,
7535 1.3 christos struct bfd_link_info *info,
7536 1.3 christos asection *osec, bfd_vma offset,
7537 1.3 christos asection *loc_sec, bfd_vma loc_offset,
7538 1.3 christos bfd_vma *encoded)
7539 1.3 christos {
7540 1.3 christos struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info);
7541 1.3 christos struct elf_link_hash_entry *h;
7542 1.3 christos
7543 1.3 christos if (!htab->fdpic_p)
7544 1.3 christos return _bfd_elf_encode_eh_address (abfd, info, osec, offset, loc_sec,
7545 1.3 christos loc_offset, encoded);
7546 1.3 christos
7547 1.3 christos h = htab->root.hgot;
7548 1.3 christos BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
7549 1.3 christos
7550 1.3 christos if (! h || (sh_elf_osec_to_segment (abfd, osec)
7551 1.3 christos == sh_elf_osec_to_segment (abfd, loc_sec->output_section)))
7552 1.3 christos return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
7553 1.3 christos loc_sec, loc_offset, encoded);
7554 1.3 christos
7555 1.3 christos BFD_ASSERT (sh_elf_osec_to_segment (abfd, osec)
7556 1.3 christos == (sh_elf_osec_to_segment
7557 1.3 christos (abfd, h->root.u.def.section->output_section)));
7558 1.3 christos
7559 1.3 christos *encoded = osec->vma + offset
7560 1.3 christos - (h->root.u.def.value
7561 1.1 skrll + h->root.u.def.section->output_section->vma
7562 1.1 skrll + h->root.u.def.section->output_offset);
7563 1.1 skrll
7564 1.1 skrll return DW_EH_PE_datarel | DW_EH_PE_sdata4;
7565 1.1 skrll }
7566 1.1 skrll
7567 1.1 skrll #if !defined SH_TARGET_ALREADY_DEFINED
7568 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_sh_vec
7569 1.3 christos #define TARGET_BIG_NAME "elf32-sh"
7570 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf32_shl_vec
7571 1.1 skrll #define TARGET_LITTLE_NAME "elf32-shl"
7572 1.1 skrll #endif
7573 1.1 skrll
7574 1.1 skrll #define ELF_ARCH bfd_arch_sh
7575 1.1 skrll #define ELF_TARGET_ID SH_ELF_DATA
7576 1.1 skrll #define ELF_MACHINE_CODE EM_SH
7577 1.1 skrll #ifdef __QNXTARGET__
7578 1.1 skrll #define ELF_MAXPAGESIZE 0x1000
7579 1.1 skrll #else
7580 1.1 skrll #define ELF_MAXPAGESIZE 0x80
7581 1.1 skrll #endif
7582 1.1 skrll
7583 1.1 skrll #define elf_symbol_leading_char '_'
7584 1.1 skrll
7585 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
7586 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup \
7587 1.1 skrll sh_elf_reloc_name_lookup
7588 1.1 skrll #define elf_info_to_howto sh_elf_info_to_howto
7589 1.1 skrll #define bfd_elf32_bfd_relax_section sh_elf_relax_section
7590 1.1 skrll #define elf_backend_relocate_section sh_elf_relocate_section
7591 1.1 skrll #define bfd_elf32_bfd_get_relocated_section_contents \
7592 1.1 skrll sh_elf_get_relocated_section_contents
7593 1.1 skrll #define bfd_elf32_mkobject sh_elf_mkobject
7594 1.1 skrll #define elf_backend_object_p sh_elf_object_p
7595 1.1 skrll #define bfd_elf32_bfd_set_private_bfd_flags \
7596 1.1 skrll sh_elf_set_private_flags
7597 1.1 skrll #define bfd_elf32_bfd_copy_private_bfd_data \
7598 1.1 skrll sh_elf_copy_private_data
7599 1.1 skrll #define bfd_elf32_bfd_merge_private_bfd_data \
7600 1.1 skrll sh_elf_merge_private_data
7601 1.1 skrll
7602 1.1 skrll #define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
7603 1.1 skrll #define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
7604 1.1 skrll #define elf_backend_check_relocs sh_elf_check_relocs
7605 1.1 skrll #define elf_backend_copy_indirect_symbol \
7606 1.1 skrll sh_elf_copy_indirect_symbol
7607 1.1 skrll #define elf_backend_create_dynamic_sections \
7608 1.1 skrll sh_elf_create_dynamic_sections
7609 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create \
7610 1.1 skrll sh_elf_link_hash_table_create
7611 1.3 christos #define elf_backend_adjust_dynamic_symbol \
7612 1.1 skrll sh_elf_adjust_dynamic_symbol
7613 1.1 skrll #define elf_backend_always_size_sections \
7614 1.1 skrll sh_elf_always_size_sections
7615 1.1 skrll #define elf_backend_size_dynamic_sections \
7616 1.1 skrll sh_elf_size_dynamic_sections
7617 1.1 skrll #define elf_backend_omit_section_dynsym sh_elf_omit_section_dynsym
7618 1.3 christos #define elf_backend_finish_dynamic_symbol \
7619 1.3 christos sh_elf_finish_dynamic_symbol
7620 1.3 christos #define elf_backend_finish_dynamic_sections \
7621 1.3 christos sh_elf_finish_dynamic_sections
7622 1.3 christos #define elf_backend_reloc_type_class sh_elf_reloc_type_class
7623 1.3 christos #define elf_backend_plt_sym_val sh_elf_plt_sym_val
7624 1.1 skrll #define elf_backend_can_make_relative_eh_frame \
7625 1.1 skrll sh_elf_use_relative_eh_frame
7626 1.1 skrll #define elf_backend_can_make_lsda_relative_eh_frame \
7627 1.1 skrll sh_elf_use_relative_eh_frame
7628 1.1 skrll #define elf_backend_encode_eh_address \
7629 1.1 skrll sh_elf_encode_eh_address
7630 1.1 skrll
7631 1.1 skrll #define elf_backend_can_gc_sections 1
7632 1.1 skrll #define elf_backend_can_refcount 1
7633 1.1 skrll #define elf_backend_want_got_plt 1
7634 1.1 skrll #define elf_backend_plt_readonly 1
7635 1.1 skrll #define elf_backend_want_plt_sym 0
7636 1.1 skrll #define elf_backend_got_header_size 12
7637 1.1 skrll
7638 1.1 skrll #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
7639 1.1 skrll
7640 1.1 skrll #include "elf32-target.h"
7641 1.1 skrll
7642 1.1 skrll /* NetBSD support. */
7643 1.1 skrll #undef TARGET_BIG_SYM
7644 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_shnbsd_vec
7645 1.1 skrll #undef TARGET_BIG_NAME
7646 1.1 skrll #define TARGET_BIG_NAME "elf32-sh-nbsd"
7647 1.1 skrll #undef TARGET_LITTLE_SYM
7648 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf32_shlnbsd_vec
7649 1.1 skrll #undef TARGET_LITTLE_NAME
7650 1.1 skrll #define TARGET_LITTLE_NAME "elf32-shl-nbsd"
7651 1.1 skrll #undef ELF_MAXPAGESIZE
7652 1.1 skrll #define ELF_MAXPAGESIZE 0x10000
7653 1.1 skrll #undef ELF_COMMONPAGESIZE
7654 1.1 skrll #undef elf_symbol_leading_char
7655 1.1 skrll #define elf_symbol_leading_char 0
7656 1.1 skrll #undef elf32_bed
7657 1.1 skrll #define elf32_bed elf32_sh_nbsd_bed
7658 1.1 skrll
7659 1.1 skrll #include "elf32-target.h"
7660 1.1 skrll
7661 1.1 skrll
7662 1.1 skrll /* Linux support. */
7663 1.1 skrll #undef TARGET_BIG_SYM
7664 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_shblin_vec
7665 1.1 skrll #undef TARGET_BIG_NAME
7666 1.1 skrll #define TARGET_BIG_NAME "elf32-shbig-linux"
7667 1.1 skrll #undef TARGET_LITTLE_SYM
7668 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf32_shlin_vec
7669 1.1 skrll #undef TARGET_LITTLE_NAME
7670 1.1 skrll #define TARGET_LITTLE_NAME "elf32-sh-linux"
7671 1.1 skrll #undef ELF_COMMONPAGESIZE
7672 1.1 skrll #define ELF_COMMONPAGESIZE 0x1000
7673 1.1 skrll
7674 1.1 skrll #undef elf_backend_grok_prstatus
7675 1.1 skrll #define elf_backend_grok_prstatus elf32_shlin_grok_prstatus
7676 1.1 skrll #undef elf_backend_grok_psinfo
7677 1.3 christos #define elf_backend_grok_psinfo elf32_shlin_grok_psinfo
7678 1.3 christos #undef elf32_bed
7679 1.3 christos #define elf32_bed elf32_sh_lin_bed
7680 1.3 christos
7681 1.3 christos #include "elf32-target.h"
7682 1.3 christos
7683 1.3 christos
7684 1.3 christos /* FDPIC support. */
7685 1.3 christos #undef TARGET_BIG_SYM
7686 1.3 christos #define TARGET_BIG_SYM bfd_elf32_shbfd_vec
7687 1.3 christos #undef TARGET_BIG_NAME
7688 1.3 christos #define TARGET_BIG_NAME "elf32-shbig-fdpic"
7689 1.3 christos #undef TARGET_LITTLE_SYM
7690 1.3 christos #define TARGET_LITTLE_SYM bfd_elf32_shfd_vec
7691 1.3 christos #undef TARGET_LITTLE_NAME
7692 1.3 christos #define TARGET_LITTLE_NAME "elf32-sh-fdpic"
7693 1.3 christos #undef elf_backend_modify_program_headers
7694 1.3 christos #define elf_backend_modify_program_headers \
7695 1.3 christos sh_elf_modify_program_headers
7696 1.3 christos
7697 1.3 christos #undef elf32_bed
7698 1.3 christos #define elf32_bed elf32_sh_fd_bed
7699 1.1 skrll
7700 1.1 skrll #include "elf32-target.h"
7701 1.1 skrll
7702 1.1 skrll #undef elf_backend_modify_program_headers
7703 1.1 skrll
7704 1.1 skrll /* VxWorks support. */
7705 1.1 skrll #undef TARGET_BIG_SYM
7706 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_shvxworks_vec
7707 1.1 skrll #undef TARGET_BIG_NAME
7708 1.1 skrll #define TARGET_BIG_NAME "elf32-sh-vxworks"
7709 1.1 skrll #undef TARGET_LITTLE_SYM
7710 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf32_shlvxworks_vec
7711 1.1 skrll #undef TARGET_LITTLE_NAME
7712 1.1 skrll #define TARGET_LITTLE_NAME "elf32-shl-vxworks"
7713 1.1 skrll #undef elf32_bed
7714 1.1 skrll #define elf32_bed elf32_sh_vxworks_bed
7715 1.1 skrll
7716 1.1 skrll #undef elf_backend_want_plt_sym
7717 1.1 skrll #define elf_backend_want_plt_sym 1
7718 1.1 skrll #undef elf_symbol_leading_char
7719 1.1 skrll #define elf_symbol_leading_char '_'
7720 1.1 skrll #define elf_backend_want_got_underscore 1
7721 1.1 skrll #undef elf_backend_grok_prstatus
7722 1.1 skrll #undef elf_backend_grok_psinfo
7723 1.1 skrll #undef elf_backend_add_symbol_hook
7724 1.1 skrll #define elf_backend_add_symbol_hook elf_vxworks_add_symbol_hook
7725 1.1 skrll #undef elf_backend_link_output_symbol_hook
7726 1.1 skrll #define elf_backend_link_output_symbol_hook \
7727 1.1 skrll elf_vxworks_link_output_symbol_hook
7728 1.1 skrll #undef elf_backend_emit_relocs
7729 1.1 skrll #define elf_backend_emit_relocs elf_vxworks_emit_relocs
7730 1.1 skrll #undef elf_backend_final_write_processing
7731 1.1 skrll #define elf_backend_final_write_processing \
7732 1.1 skrll elf_vxworks_final_write_processing
7733 1.1 skrll #undef ELF_MAXPAGESIZE
7734 #define ELF_MAXPAGESIZE 0x1000
7735 #undef ELF_COMMONPAGESIZE
7736
7737 #include "elf32-target.h"
7738
7739 #endif /* neither INCLUDE_SHMEDIA nor SH_TARGET_ALREADY_DEFINED */
7740