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