elf32-cris.c revision 1.1 1 1.1 skrll /* CRIS-specific support for 32-bit ELF.
2 1.1 skrll Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 1.1 skrll Free Software Foundation, Inc.
4 1.1 skrll Contributed by Axis Communications AB.
5 1.1 skrll Written by Hans-Peter Nilsson, based on elf32-fr30.c
6 1.1 skrll PIC and shlib bits based primarily on elf32-m68k.c and elf32-i386.c.
7 1.1 skrll
8 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
9 1.1 skrll
10 1.1 skrll This program is free software; you can redistribute it and/or modify
11 1.1 skrll it under the terms of the GNU General Public License as published by
12 1.1 skrll the Free Software Foundation; either version 3 of the License, or
13 1.1 skrll (at your option) any later version.
14 1.1 skrll
15 1.1 skrll This program is distributed in the hope that it will be useful,
16 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
17 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 1.1 skrll GNU General Public License for more details.
19 1.1 skrll
20 1.1 skrll You should have received a copy of the GNU General Public License
21 1.1 skrll along with this program; if not, write to the Free Software
22 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 1.1 skrll MA 02110-1301, USA. */
24 1.1 skrll
25 1.1 skrll #include "sysdep.h"
26 1.1 skrll #include "bfd.h"
27 1.1 skrll #include "libbfd.h"
28 1.1 skrll #include "elf-bfd.h"
29 1.1 skrll #include "elf/cris.h"
30 1.1 skrll
31 1.1 skrll /* Forward declarations. */
32 1.1 skrll static reloc_howto_type * cris_reloc_type_lookup
33 1.1 skrll PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
34 1.1 skrll
35 1.1 skrll static void cris_info_to_howto_rela
36 1.1 skrll PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
37 1.1 skrll
38 1.1 skrll static bfd_reloc_status_type cris_elf_pcrel_reloc
39 1.1 skrll PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
40 1.1 skrll
41 1.1 skrll static bfd_boolean cris_elf_grok_prstatus
42 1.1 skrll PARAMS ((bfd *abfd, Elf_Internal_Note *note));
43 1.1 skrll
44 1.1 skrll static bfd_boolean cris_elf_grok_psinfo
45 1.1 skrll PARAMS ((bfd *abfd, Elf_Internal_Note *note));
46 1.1 skrll
47 1.1 skrll static bfd_boolean cris_elf_relocate_section
48 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
49 1.1 skrll Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
50 1.1 skrll
51 1.1 skrll static bfd_reloc_status_type cris_final_link_relocate
52 1.1 skrll PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
53 1.1 skrll Elf_Internal_Rela *, bfd_vma));
54 1.1 skrll
55 1.1 skrll static bfd_boolean cris_elf_object_p PARAMS ((bfd *));
56 1.1 skrll
57 1.1 skrll static void cris_elf_final_write_processing PARAMS ((bfd *, bfd_boolean));
58 1.1 skrll
59 1.1 skrll static bfd_boolean cris_elf_set_mach_from_flags
60 1.1 skrll PARAMS ((bfd *, unsigned long int));
61 1.1 skrll
62 1.1 skrll static bfd_boolean cris_elf_print_private_bfd_data PARAMS ((bfd *, PTR));
63 1.1 skrll
64 1.1 skrll static bfd_boolean cris_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));
65 1.1 skrll static bfd_boolean cris_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *));
66 1.1 skrll
67 1.1 skrll struct elf_cris_link_hash_entry;
68 1.1 skrll static bfd_boolean elf_cris_discard_excess_dso_dynamics
69 1.1 skrll PARAMS ((struct elf_cris_link_hash_entry *, PTR));
70 1.1 skrll static bfd_boolean elf_cris_discard_excess_program_dynamics
71 1.1 skrll PARAMS ((struct elf_cris_link_hash_entry *, PTR));
72 1.1 skrll static bfd_boolean elf_cris_adjust_gotplt_to_got
73 1.1 skrll PARAMS ((struct elf_cris_link_hash_entry *, PTR));
74 1.1 skrll static bfd_boolean elf_cris_try_fold_plt_to_got
75 1.1 skrll PARAMS ((struct elf_cris_link_hash_entry *, PTR));
76 1.1 skrll static struct bfd_hash_entry *elf_cris_link_hash_newfunc
77 1.1 skrll PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
78 1.1 skrll static struct bfd_link_hash_table *elf_cris_link_hash_table_create
79 1.1 skrll PARAMS ((bfd *));
80 1.1 skrll static bfd_boolean elf_cris_adjust_dynamic_symbol
81 1.1 skrll PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
82 1.1 skrll static bfd_boolean cris_elf_check_relocs
83 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *, asection *,
84 1.1 skrll const Elf_Internal_Rela *));
85 1.1 skrll
86 1.1 skrll static bfd_boolean elf_cris_size_dynamic_sections
87 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *));
88 1.1 skrll static bfd_boolean elf_cris_finish_dynamic_symbol
89 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
90 1.1 skrll Elf_Internal_Sym *));
91 1.1 skrll static bfd_boolean elf_cris_finish_dynamic_sections
92 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *));
93 1.1 skrll static void elf_cris_hide_symbol
94 1.1 skrll PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean));
95 1.1 skrll static enum elf_reloc_type_class elf_cris_reloc_type_class
96 1.1 skrll PARAMS ((const Elf_Internal_Rela *));
97 1.1 skrll
98 1.1 skrll static reloc_howto_type cris_elf_howto_table [] =
99 1.1 skrll {
100 1.1 skrll /* This reloc does nothing. */
101 1.1 skrll HOWTO (R_CRIS_NONE, /* type */
102 1.1 skrll 0, /* rightshift */
103 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
104 1.1 skrll 32, /* bitsize */
105 1.1 skrll FALSE, /* pc_relative */
106 1.1 skrll 0, /* bitpos */
107 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
108 1.1 skrll bfd_elf_generic_reloc, /* special_function */
109 1.1 skrll "R_CRIS_NONE", /* name */
110 1.1 skrll FALSE, /* partial_inplace */
111 1.1 skrll 0, /* src_mask */
112 1.1 skrll 0, /* dst_mask */
113 1.1 skrll FALSE), /* pcrel_offset */
114 1.1 skrll
115 1.1 skrll /* An 8 bit absolute relocation. */
116 1.1 skrll HOWTO (R_CRIS_8, /* type */
117 1.1 skrll 0, /* rightshift */
118 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
119 1.1 skrll 8, /* bitsize */
120 1.1 skrll FALSE, /* pc_relative */
121 1.1 skrll 0, /* bitpos */
122 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
123 1.1 skrll bfd_elf_generic_reloc, /* special_function */
124 1.1 skrll "R_CRIS_8", /* name */
125 1.1 skrll FALSE, /* partial_inplace */
126 1.1 skrll 0x0000, /* src_mask */
127 1.1 skrll 0x00ff, /* dst_mask */
128 1.1 skrll FALSE), /* pcrel_offset */
129 1.1 skrll
130 1.1 skrll /* A 16 bit absolute relocation. */
131 1.1 skrll HOWTO (R_CRIS_16, /* type */
132 1.1 skrll 0, /* rightshift */
133 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
134 1.1 skrll 16, /* bitsize */
135 1.1 skrll FALSE, /* pc_relative */
136 1.1 skrll 0, /* bitpos */
137 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
138 1.1 skrll bfd_elf_generic_reloc, /* special_function */
139 1.1 skrll "R_CRIS_16", /* name */
140 1.1 skrll FALSE, /* partial_inplace */
141 1.1 skrll 0x00000000, /* src_mask */
142 1.1 skrll 0x0000ffff, /* dst_mask */
143 1.1 skrll FALSE), /* pcrel_offset */
144 1.1 skrll
145 1.1 skrll /* A 32 bit absolute relocation. */
146 1.1 skrll HOWTO (R_CRIS_32, /* type */
147 1.1 skrll 0, /* rightshift */
148 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
149 1.1 skrll 32, /* bitsize */
150 1.1 skrll FALSE, /* pc_relative */
151 1.1 skrll 0, /* bitpos */
152 1.1 skrll /* We don't want overflow complaints for 64-bit vma builds
153 1.1 skrll for e.g. sym+0x40000000 (or actually sym-0xc0000000 in
154 1.1 skrll 32-bit ELF) where sym=0xc0001234.
155 1.1 skrll Don't do this for the PIC relocs, as we don't expect to
156 1.1 skrll see them with large offsets. */
157 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
158 1.1 skrll bfd_elf_generic_reloc, /* special_function */
159 1.1 skrll "R_CRIS_32", /* name */
160 1.1 skrll FALSE, /* partial_inplace */
161 1.1 skrll 0x00000000, /* src_mask */
162 1.1 skrll 0xffffffff, /* dst_mask */
163 1.1 skrll FALSE), /* pcrel_offset */
164 1.1 skrll
165 1.1 skrll /* An 8 bit PC-relative relocation. */
166 1.1 skrll HOWTO (R_CRIS_8_PCREL, /* type */
167 1.1 skrll 0, /* rightshift */
168 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
169 1.1 skrll 8, /* bitsize */
170 1.1 skrll TRUE, /* pc_relative */
171 1.1 skrll 0, /* bitpos */
172 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
173 1.1 skrll cris_elf_pcrel_reloc, /* special_function */
174 1.1 skrll "R_CRIS_8_PCREL", /* name */
175 1.1 skrll FALSE, /* partial_inplace */
176 1.1 skrll 0x0000, /* src_mask */
177 1.1 skrll 0x00ff, /* dst_mask */
178 1.1 skrll TRUE), /* pcrel_offset */
179 1.1 skrll
180 1.1 skrll /* A 16 bit PC-relative relocation. */
181 1.1 skrll HOWTO (R_CRIS_16_PCREL, /* type */
182 1.1 skrll 0, /* rightshift */
183 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
184 1.1 skrll 16, /* bitsize */
185 1.1 skrll TRUE, /* pc_relative */
186 1.1 skrll 0, /* bitpos */
187 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
188 1.1 skrll cris_elf_pcrel_reloc, /* special_function */
189 1.1 skrll "R_CRIS_16_PCREL", /* name */
190 1.1 skrll FALSE, /* partial_inplace */
191 1.1 skrll 0x00000000, /* src_mask */
192 1.1 skrll 0x0000ffff, /* dst_mask */
193 1.1 skrll TRUE), /* pcrel_offset */
194 1.1 skrll
195 1.1 skrll /* A 32 bit PC-relative relocation. */
196 1.1 skrll HOWTO (R_CRIS_32_PCREL, /* type */
197 1.1 skrll 0, /* rightshift */
198 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
199 1.1 skrll 32, /* bitsize */
200 1.1 skrll TRUE, /* pc_relative */
201 1.1 skrll 0, /* bitpos */
202 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
203 1.1 skrll cris_elf_pcrel_reloc, /* special_function */
204 1.1 skrll "R_CRIS_32_PCREL", /* name */
205 1.1 skrll FALSE, /* partial_inplace */
206 1.1 skrll 0x00000000, /* src_mask */
207 1.1 skrll 0xffffffff, /* dst_mask */
208 1.1 skrll TRUE), /* pcrel_offset */
209 1.1 skrll
210 1.1 skrll /* GNU extension to record C++ vtable hierarchy. */
211 1.1 skrll HOWTO (R_CRIS_GNU_VTINHERIT, /* type */
212 1.1 skrll 0, /* rightshift */
213 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
214 1.1 skrll 0, /* bitsize */
215 1.1 skrll FALSE, /* pc_relative */
216 1.1 skrll 0, /* bitpos */
217 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
218 1.1 skrll NULL, /* special_function */
219 1.1 skrll "R_CRIS_GNU_VTINHERIT", /* name */
220 1.1 skrll FALSE, /* partial_inplace */
221 1.1 skrll 0, /* src_mask */
222 1.1 skrll 0, /* dst_mask */
223 1.1 skrll FALSE), /* pcrel_offset */
224 1.1 skrll
225 1.1 skrll /* GNU extension to record C++ vtable member usage. */
226 1.1 skrll HOWTO (R_CRIS_GNU_VTENTRY, /* type */
227 1.1 skrll 0, /* rightshift */
228 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
229 1.1 skrll 0, /* bitsize */
230 1.1 skrll FALSE, /* pc_relative */
231 1.1 skrll 0, /* bitpos */
232 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
233 1.1 skrll _bfd_elf_rel_vtable_reloc_fn, /* special_function */
234 1.1 skrll "R_CRIS_GNU_VTENTRY", /* name */
235 1.1 skrll FALSE, /* partial_inplace */
236 1.1 skrll 0, /* src_mask */
237 1.1 skrll 0, /* dst_mask */
238 1.1 skrll FALSE), /* pcrel_offset */
239 1.1 skrll
240 1.1 skrll /* This is used only by the dynamic linker. The symbol should exist
241 1.1 skrll both in the object being run and in some shared library. The
242 1.1 skrll dynamic linker copies the data addressed by the symbol from the
243 1.1 skrll shared library into the object, because the object being
244 1.1 skrll run has to have the data at some particular address. */
245 1.1 skrll HOWTO (R_CRIS_COPY, /* type */
246 1.1 skrll 0, /* rightshift */
247 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
248 1.1 skrll 32, /* bitsize */
249 1.1 skrll FALSE, /* pc_relative */
250 1.1 skrll 0, /* bitpos */
251 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
252 1.1 skrll bfd_elf_generic_reloc, /* special_function */
253 1.1 skrll "R_CRIS_COPY", /* name */
254 1.1 skrll FALSE, /* partial_inplace */
255 1.1 skrll 0, /* src_mask */
256 1.1 skrll 0, /* dst_mask */
257 1.1 skrll FALSE), /* pcrel_offset */
258 1.1 skrll
259 1.1 skrll /* Like R_CRIS_32, but used when setting global offset table entries. */
260 1.1 skrll HOWTO (R_CRIS_GLOB_DAT, /* type */
261 1.1 skrll 0, /* rightshift */
262 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
263 1.1 skrll 32, /* bitsize */
264 1.1 skrll FALSE, /* pc_relative */
265 1.1 skrll 0, /* bitpos */
266 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
267 1.1 skrll bfd_elf_generic_reloc, /* special_function */
268 1.1 skrll "R_CRIS_GLOB_DAT", /* name */
269 1.1 skrll FALSE, /* partial_inplace */
270 1.1 skrll 0, /* src_mask */
271 1.1 skrll 0xffffffff, /* dst_mask */
272 1.1 skrll FALSE), /* pcrel_offset */
273 1.1 skrll
274 1.1 skrll /* Marks a procedure linkage table entry for a symbol. */
275 1.1 skrll HOWTO (R_CRIS_JUMP_SLOT, /* type */
276 1.1 skrll 0, /* rightshift */
277 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
278 1.1 skrll 32, /* bitsize */
279 1.1 skrll FALSE, /* pc_relative */
280 1.1 skrll 0, /* bitpos */
281 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
282 1.1 skrll bfd_elf_generic_reloc, /* special_function */
283 1.1 skrll "R_CRIS_JUMP_SLOT", /* name */
284 1.1 skrll FALSE, /* partial_inplace */
285 1.1 skrll 0, /* src_mask */
286 1.1 skrll 0, /* dst_mask */
287 1.1 skrll FALSE), /* pcrel_offset */
288 1.1 skrll
289 1.1 skrll /* Used only by the dynamic linker. When the object is run, this
290 1.1 skrll longword is set to the load address of the object, plus the
291 1.1 skrll addend. */
292 1.1 skrll HOWTO (R_CRIS_RELATIVE, /* type */
293 1.1 skrll 0, /* rightshift */
294 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
295 1.1 skrll 32, /* bitsize */
296 1.1 skrll FALSE, /* pc_relative */
297 1.1 skrll 0, /* bitpos */
298 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
299 1.1 skrll bfd_elf_generic_reloc, /* special_function */
300 1.1 skrll "R_CRIS_RELATIVE", /* name */
301 1.1 skrll FALSE, /* partial_inplace */
302 1.1 skrll 0, /* src_mask */
303 1.1 skrll 0xffffffff, /* dst_mask */
304 1.1 skrll FALSE), /* pcrel_offset */
305 1.1 skrll
306 1.1 skrll /* Like R_CRIS_32, but referring to the GOT table entry for the symbol. */
307 1.1 skrll HOWTO (R_CRIS_16_GOT, /* type */
308 1.1 skrll 0, /* rightshift */
309 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
310 1.1 skrll 16, /* bitsize */
311 1.1 skrll FALSE, /* pc_relative */
312 1.1 skrll 0, /* bitpos */
313 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
314 1.1 skrll bfd_elf_generic_reloc, /* special_function */
315 1.1 skrll "R_CRIS_16_GOT", /* name */
316 1.1 skrll FALSE, /* partial_inplace */
317 1.1 skrll 0, /* src_mask */
318 1.1 skrll 0xffff, /* dst_mask */
319 1.1 skrll FALSE), /* pcrel_offset */
320 1.1 skrll
321 1.1 skrll HOWTO (R_CRIS_32_GOT, /* type */
322 1.1 skrll 0, /* rightshift */
323 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
324 1.1 skrll 32, /* bitsize */
325 1.1 skrll FALSE, /* pc_relative */
326 1.1 skrll 0, /* bitpos */
327 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
328 1.1 skrll bfd_elf_generic_reloc, /* special_function */
329 1.1 skrll "R_CRIS_32_GOT", /* name */
330 1.1 skrll FALSE, /* partial_inplace */
331 1.1 skrll 0, /* src_mask */
332 1.1 skrll 0xffffffff, /* dst_mask */
333 1.1 skrll FALSE), /* pcrel_offset */
334 1.1 skrll
335 1.1 skrll /* Like R_CRIS_32_GOT, but referring to (and requesting a) PLT part of
336 1.1 skrll the GOT table for the symbol. */
337 1.1 skrll HOWTO (R_CRIS_16_GOTPLT, /* type */
338 1.1 skrll 0, /* rightshift */
339 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
340 1.1 skrll 16, /* bitsize */
341 1.1 skrll FALSE, /* pc_relative */
342 1.1 skrll 0, /* bitpos */
343 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
344 1.1 skrll bfd_elf_generic_reloc, /* special_function */
345 1.1 skrll "R_CRIS_16_GOTPLT", /* name */
346 1.1 skrll FALSE, /* partial_inplace */
347 1.1 skrll 0, /* src_mask */
348 1.1 skrll 0xffff, /* dst_mask */
349 1.1 skrll FALSE), /* pcrel_offset */
350 1.1 skrll
351 1.1 skrll HOWTO (R_CRIS_32_GOTPLT, /* type */
352 1.1 skrll 0, /* rightshift */
353 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
354 1.1 skrll 32, /* bitsize */
355 1.1 skrll FALSE, /* pc_relative */
356 1.1 skrll 0, /* bitpos */
357 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
358 1.1 skrll bfd_elf_generic_reloc, /* special_function */
359 1.1 skrll "R_CRIS_32_GOTPLT", /* name */
360 1.1 skrll FALSE, /* partial_inplace */
361 1.1 skrll 0, /* src_mask */
362 1.1 skrll 0xffffffff, /* dst_mask */
363 1.1 skrll FALSE), /* pcrel_offset */
364 1.1 skrll
365 1.1 skrll /* A 32-bit offset from GOT to (local const) symbol: no GOT entry should
366 1.1 skrll be necessary. */
367 1.1 skrll HOWTO (R_CRIS_32_GOTREL, /* type */
368 1.1 skrll 0, /* rightshift */
369 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
370 1.1 skrll 32, /* bitsize */
371 1.1 skrll FALSE, /* pc_relative */
372 1.1 skrll 0, /* bitpos */
373 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
374 1.1 skrll bfd_elf_generic_reloc, /* special_function */
375 1.1 skrll "R_CRIS_32_GOTREL", /* name */
376 1.1 skrll FALSE, /* partial_inplace */
377 1.1 skrll 0, /* src_mask */
378 1.1 skrll 0xffffffff, /* dst_mask */
379 1.1 skrll FALSE), /* pcrel_offset */
380 1.1 skrll
381 1.1 skrll /* A 32-bit offset from GOT to entry for this symbol in PLT and request
382 1.1 skrll to create PLT entry for symbol. */
383 1.1 skrll HOWTO (R_CRIS_32_PLT_GOTREL, /* type */
384 1.1 skrll 0, /* rightshift */
385 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
386 1.1 skrll 32, /* bitsize */
387 1.1 skrll FALSE, /* pc_relative */
388 1.1 skrll 0, /* bitpos */
389 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
390 1.1 skrll bfd_elf_generic_reloc, /* special_function */
391 1.1 skrll "R_CRIS_32_PLT_GOTREL", /* name */
392 1.1 skrll FALSE, /* partial_inplace */
393 1.1 skrll 0, /* src_mask */
394 1.1 skrll 0xffffffff, /* dst_mask */
395 1.1 skrll FALSE), /* pcrel_offset */
396 1.1 skrll
397 1.1 skrll /* A 32-bit offset from PC (location after the relocation) + addend to
398 1.1 skrll entry for this symbol in PLT and request to create PLT entry for
399 1.1 skrll symbol. */
400 1.1 skrll HOWTO (R_CRIS_32_PLT_PCREL, /* type */
401 1.1 skrll 0, /* rightshift */
402 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
403 1.1 skrll 32, /* bitsize */
404 1.1 skrll TRUE, /* pc_relative */
405 1.1 skrll 0, /* bitpos */
406 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
407 1.1 skrll cris_elf_pcrel_reloc, /* special_function */
408 1.1 skrll "R_CRIS_32_PLT_PCREL", /* name */
409 1.1 skrll FALSE, /* partial_inplace */
410 1.1 skrll 0, /* src_mask */
411 1.1 skrll 0xffffffff, /* dst_mask */
412 1.1 skrll TRUE) /* pcrel_offset */
413 1.1 skrll };
414 1.1 skrll
415 1.1 skrll /* Map BFD reloc types to CRIS ELF reloc types. */
417 1.1 skrll
418 1.1 skrll struct cris_reloc_map
419 1.1 skrll {
420 1.1 skrll bfd_reloc_code_real_type bfd_reloc_val;
421 1.1 skrll unsigned int cris_reloc_val;
422 1.1 skrll };
423 1.1 skrll
424 1.1 skrll static const struct cris_reloc_map cris_reloc_map [] =
425 1.1 skrll {
426 1.1 skrll { BFD_RELOC_NONE, R_CRIS_NONE },
427 1.1 skrll { BFD_RELOC_8, R_CRIS_8 },
428 1.1 skrll { BFD_RELOC_16, R_CRIS_16 },
429 1.1 skrll { BFD_RELOC_32, R_CRIS_32 },
430 1.1 skrll { BFD_RELOC_8_PCREL, R_CRIS_8_PCREL },
431 1.1 skrll { BFD_RELOC_16_PCREL, R_CRIS_16_PCREL },
432 1.1 skrll { BFD_RELOC_32_PCREL, R_CRIS_32_PCREL },
433 1.1 skrll { BFD_RELOC_VTABLE_INHERIT, R_CRIS_GNU_VTINHERIT },
434 1.1 skrll { BFD_RELOC_VTABLE_ENTRY, R_CRIS_GNU_VTENTRY },
435 1.1 skrll { BFD_RELOC_CRIS_COPY, R_CRIS_COPY },
436 1.1 skrll { BFD_RELOC_CRIS_GLOB_DAT, R_CRIS_GLOB_DAT },
437 1.1 skrll { BFD_RELOC_CRIS_JUMP_SLOT, R_CRIS_JUMP_SLOT },
438 1.1 skrll { BFD_RELOC_CRIS_RELATIVE, R_CRIS_RELATIVE },
439 1.1 skrll { BFD_RELOC_CRIS_16_GOT, R_CRIS_16_GOT },
440 1.1 skrll { BFD_RELOC_CRIS_32_GOT, R_CRIS_32_GOT },
441 1.1 skrll { BFD_RELOC_CRIS_16_GOTPLT, R_CRIS_16_GOTPLT },
442 1.1 skrll { BFD_RELOC_CRIS_32_GOTPLT, R_CRIS_32_GOTPLT },
443 1.1 skrll { BFD_RELOC_CRIS_32_GOTREL, R_CRIS_32_GOTREL },
444 1.1 skrll { BFD_RELOC_CRIS_32_PLT_GOTREL, R_CRIS_32_PLT_GOTREL },
445 1.1 skrll { BFD_RELOC_CRIS_32_PLT_PCREL, R_CRIS_32_PLT_PCREL }
446 1.1 skrll };
447 1.1 skrll
448 1.1 skrll static reloc_howto_type *
449 1.1 skrll cris_reloc_type_lookup (abfd, code)
450 1.1 skrll bfd * abfd ATTRIBUTE_UNUSED;
451 1.1 skrll bfd_reloc_code_real_type code;
452 1.1 skrll {
453 1.1 skrll unsigned int i;
454 1.1 skrll
455 1.1 skrll for (i = 0; i < sizeof (cris_reloc_map) / sizeof (cris_reloc_map[0]); i++)
456 1.1 skrll if (cris_reloc_map [i].bfd_reloc_val == code)
457 1.1 skrll return & cris_elf_howto_table [cris_reloc_map[i].cris_reloc_val];
458 1.1 skrll
459 1.1 skrll return NULL;
460 1.1 skrll }
461 1.1 skrll
462 1.1 skrll static reloc_howto_type *
463 1.1 skrll cris_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
464 1.1 skrll {
465 1.1 skrll unsigned int i;
466 1.1 skrll
467 1.1 skrll for (i = 0;
468 1.1 skrll i < sizeof (cris_elf_howto_table) / sizeof (cris_elf_howto_table[0]);
469 1.1 skrll i++)
470 1.1 skrll if (cris_elf_howto_table[i].name != NULL
471 1.1 skrll && strcasecmp (cris_elf_howto_table[i].name, r_name) == 0)
472 1.1 skrll return &cris_elf_howto_table[i];
473 1.1 skrll
474 1.1 skrll return NULL;
475 1.1 skrll }
476 1.1 skrll
477 1.1 skrll /* Set the howto pointer for an CRIS ELF reloc. */
478 1.1 skrll
479 1.1 skrll static void
480 1.1 skrll cris_info_to_howto_rela (abfd, cache_ptr, dst)
481 1.1 skrll bfd * abfd ATTRIBUTE_UNUSED;
482 1.1 skrll arelent * cache_ptr;
483 1.1 skrll Elf_Internal_Rela * dst;
484 1.1 skrll {
485 1.1 skrll unsigned int r_type;
486 1.1 skrll
487 1.1 skrll r_type = ELF32_R_TYPE (dst->r_info);
488 1.1 skrll BFD_ASSERT (r_type < (unsigned int) R_CRIS_max);
489 1.1 skrll cache_ptr->howto = & cris_elf_howto_table [r_type];
490 1.1 skrll }
491 1.1 skrll
492 1.1 skrll bfd_reloc_status_type
493 1.1 skrll cris_elf_pcrel_reloc (abfd, reloc_entry, symbol, data, input_section,
494 1.1 skrll output_bfd, error_message)
495 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
496 1.1 skrll arelent *reloc_entry;
497 1.1 skrll asymbol *symbol;
498 1.1 skrll PTR data ATTRIBUTE_UNUSED;
499 1.1 skrll asection *input_section;
500 1.1 skrll bfd *output_bfd;
501 1.1 skrll char **error_message ATTRIBUTE_UNUSED;
502 1.1 skrll {
503 1.1 skrll /* By default (using only bfd_elf_generic_reloc when linking to
504 1.1 skrll non-ELF formats) PC-relative relocs are relative to the beginning
505 1.1 skrll of the reloc. CRIS PC-relative relocs are relative to the position
506 1.1 skrll *after* the reloc because that's what pre-CRISv32 PC points to
507 1.1 skrll after reading an insn field with that reloc. (For CRISv32, PC is
508 1.1 skrll actually relative to the start of the insn, but we keep the old
509 1.1 skrll definition.) Still, we use as much generic machinery as we can.
510 1.1 skrll
511 1.1 skrll Only adjust when doing a final link. */
512 1.1 skrll if (output_bfd == (bfd *) NULL)
513 1.1 skrll reloc_entry->addend -= 1 << reloc_entry->howto->size;
514 1.1 skrll
515 1.1 skrll return
516 1.1 skrll bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
517 1.1 skrll input_section, output_bfd, error_message);
518 1.1 skrll }
519 1.1 skrll
520 1.1 skrll /* Support for core dump NOTE sections.
522 1.1 skrll The slightly unintuitive code layout is an attempt to keep at least
523 1.1 skrll some similarities with other ports, hoping to simplify general
524 1.1 skrll changes, while still keeping Linux/CRIS and Linux/CRISv32 code apart. */
525 1.1 skrll
526 1.1 skrll static bfd_boolean
527 1.1 skrll cris_elf_grok_prstatus (abfd, note)
528 1.1 skrll bfd *abfd;
529 1.1 skrll Elf_Internal_Note *note;
530 1.1 skrll {
531 1.1 skrll int offset;
532 1.1 skrll size_t size;
533 1.1 skrll
534 1.1 skrll if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
535 1.1 skrll switch (note->descsz)
536 1.1 skrll {
537 1.1 skrll default:
538 1.1 skrll return FALSE;
539 1.1 skrll
540 1.1 skrll case 202: /* Linux/CRISv32 */
541 1.1 skrll /* pr_cursig */
542 1.1 skrll elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
543 1.1 skrll
544 1.1 skrll /* pr_pid */
545 1.1 skrll elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 22);
546 1.1 skrll
547 1.1 skrll /* pr_reg */
548 1.1 skrll offset = 70;
549 1.1 skrll size = 128;
550 1.1 skrll
551 1.1 skrll break;
552 1.1 skrll }
553 1.1 skrll else
554 1.1 skrll switch (note->descsz)
555 1.1 skrll {
556 1.1 skrll default:
557 1.1 skrll return FALSE;
558 1.1 skrll
559 1.1 skrll case 214: /* Linux/CRIS */
560 1.1 skrll /* pr_cursig */
561 1.1 skrll elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
562 1.1 skrll
563 1.1 skrll /* pr_pid */
564 1.1 skrll elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 22);
565 1.1 skrll
566 1.1 skrll /* pr_reg */
567 1.1 skrll offset = 70;
568 1.1 skrll size = 140;
569 1.1 skrll
570 1.1 skrll break;
571 1.1 skrll }
572 1.1 skrll
573 1.1 skrll /* Make a ".reg/999" section. */
574 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
575 1.1 skrll size, note->descpos + offset);
576 1.1 skrll }
577 1.1 skrll
578 1.1 skrll static bfd_boolean
579 1.1 skrll cris_elf_grok_psinfo (abfd, note)
580 1.1 skrll bfd *abfd;
581 1.1 skrll Elf_Internal_Note *note;
582 1.1 skrll {
583 1.1 skrll if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
584 1.1 skrll switch (note->descsz)
585 1.1 skrll {
586 1.1 skrll default:
587 1.1 skrll return FALSE;
588 1.1 skrll
589 1.1 skrll case 124: /* Linux/CRISv32 elf_prpsinfo */
590 1.1 skrll elf_tdata (abfd)->core_program
591 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
592 1.1 skrll elf_tdata (abfd)->core_command
593 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
594 1.1 skrll }
595 1.1 skrll else
596 1.1 skrll switch (note->descsz)
597 1.1 skrll {
598 1.1 skrll default:
599 1.1 skrll return FALSE;
600 1.1 skrll
601 1.1 skrll case 124: /* Linux/CRIS elf_prpsinfo */
602 1.1 skrll elf_tdata (abfd)->core_program
603 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
604 1.1 skrll elf_tdata (abfd)->core_command
605 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
606 1.1 skrll }
607 1.1 skrll
608 1.1 skrll /* Note that for some reason, a spurious space is tacked
609 1.1 skrll onto the end of the args in some (at least one anyway)
610 1.1 skrll implementations, so strip it off if it exists. */
611 1.1 skrll
612 1.1 skrll {
613 1.1 skrll char *command = elf_tdata (abfd)->core_command;
614 1.1 skrll int n = strlen (command);
615 1.1 skrll
616 1.1 skrll if (0 < n && command[n - 1] == ' ')
617 1.1 skrll command[n - 1] = '\0';
618 1.1 skrll }
619 1.1 skrll
620 1.1 skrll return TRUE;
621 1.1 skrll }
622 1.1 skrll
623 1.1 skrll /* The name of the dynamic interpreter. This is put in the .interp
625 1.1 skrll section. */
626 1.1 skrll
627 1.1 skrll #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
628 1.1 skrll
629 1.1 skrll /* The size in bytes of an entry in the procedure linkage table. */
630 1.1 skrll
631 1.1 skrll #define PLT_ENTRY_SIZE 20
632 1.1 skrll #define PLT_ENTRY_SIZE_V32 26
633 1.1 skrll
634 1.1 skrll /* The first entry in an absolute procedure linkage table looks like this. */
635 1.1 skrll
636 1.1 skrll static const bfd_byte elf_cris_plt0_entry[PLT_ENTRY_SIZE] =
637 1.1 skrll {
638 1.1 skrll 0xfc, 0xe1,
639 1.1 skrll 0x7e, 0x7e, /* push mof. */
640 1.1 skrll 0x7f, 0x0d, /* (dip [pc+]) */
641 1.1 skrll 0, 0, 0, 0, /* Replaced with address of .got + 4. */
642 1.1 skrll 0x30, 0x7a, /* move [...],mof */
643 1.1 skrll 0x7f, 0x0d, /* (dip [pc+]) */
644 1.1 skrll 0, 0, 0, 0, /* Replaced with address of .got + 8. */
645 1.1 skrll 0x30, 0x09 /* jump [...] */
646 1.1 skrll };
647 1.1 skrll
648 1.1 skrll static const bfd_byte elf_cris_plt0_entry_v32[PLT_ENTRY_SIZE_V32] =
649 1.1 skrll {
650 1.1 skrll 0x84, 0xe2, /* subq 4,$sp */
651 1.1 skrll 0x6f, 0xfe, /* move.d 0,$acr */
652 1.1 skrll 0, 0, 0, 0, /* Replaced by address of .got + 4. */
653 1.1 skrll 0x7e, 0x7a, /* move $mof,[$sp] */
654 1.1 skrll 0x3f, 0x7a, /* move [$acr],$mof */
655 1.1 skrll 0x04, 0xf2, /* addq 4,acr */
656 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */
657 1.1 skrll 0xbf, 0x09, /* jump $acr */
658 1.1 skrll 0xb0, 0x05, /* nop */
659 1.1 skrll 0, 0 /* Pad out to 26 bytes. */
660 1.1 skrll };
661 1.1 skrll
662 1.1 skrll /* Subsequent entries in an absolute procedure linkage table look like
663 1.1 skrll this. */
664 1.1 skrll
665 1.1 skrll static const bfd_byte elf_cris_plt_entry[PLT_ENTRY_SIZE] =
666 1.1 skrll {
667 1.1 skrll 0x7f, 0x0d, /* (dip [pc+]) */
668 1.1 skrll 0, 0, 0, 0, /* Replaced with address of this symbol in .got. */
669 1.1 skrll 0x30, 0x09, /* jump [...] */
670 1.1 skrll 0x3f, 0x7e, /* move [pc+],mof */
671 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */
672 1.1 skrll 0x2f, 0xfe, /* add.d [pc+],pc */
673 1.1 skrll 0xec, 0xff,
674 1.1 skrll 0xff, 0xff /* Replaced with offset to start of .plt. */
675 1.1 skrll };
676 1.1 skrll
677 1.1 skrll static const bfd_byte elf_cris_plt_entry_v32[PLT_ENTRY_SIZE_V32] =
678 1.1 skrll {
679 1.1 skrll 0x6f, 0xfe, /* move.d 0,$acr */
680 1.1 skrll 0, 0, 0, 0, /* Replaced with address of this symbol in .got. */
681 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */
682 1.1 skrll 0xbf, 0x09, /* jump $acr */
683 1.1 skrll 0xb0, 0x05, /* nop */
684 1.1 skrll 0x3f, 0x7e, /* move 0,mof */
685 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */
686 1.1 skrll 0xbf, 0x0e, /* ba start_of_plt0_entry */
687 1.1 skrll 0, 0, 0, 0, /* Replaced with offset to plt0 entry. */
688 1.1 skrll 0xb0, 0x05 /* nop */
689 1.1 skrll };
690 1.1 skrll
691 1.1 skrll /* The first entry in a PIC procedure linkage table looks like this. */
692 1.1 skrll
693 1.1 skrll static const bfd_byte elf_cris_pic_plt0_entry[PLT_ENTRY_SIZE] =
694 1.1 skrll {
695 1.1 skrll 0xfc, 0xe1, 0x7e, 0x7e, /* push mof */
696 1.1 skrll 0x04, 0x01, 0x30, 0x7a, /* move [r0+4],mof */
697 1.1 skrll 0x08, 0x01, 0x30, 0x09, /* jump [r0+8] */
698 1.1 skrll 0, 0, 0, 0, 0, 0, 0, 0, /* Pad out to 20 bytes. */
699 1.1 skrll };
700 1.1 skrll
701 1.1 skrll static const bfd_byte elf_cris_pic_plt0_entry_v32[PLT_ENTRY_SIZE_V32] =
702 1.1 skrll {
703 1.1 skrll 0x84, 0xe2, /* subq 4,$sp */
704 1.1 skrll 0x04, 0x01, /* addoq 4,$r0,$acr */
705 1.1 skrll 0x7e, 0x7a, /* move $mof,[$sp] */
706 1.1 skrll 0x3f, 0x7a, /* move [$acr],$mof */
707 1.1 skrll 0x04, 0xf2, /* addq 4,$acr */
708 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */
709 1.1 skrll 0xbf, 0x09, /* jump $acr */
710 1.1 skrll 0xb0, 0x05, /* nop */
711 1.1 skrll 0, 0, /* Pad out to 26 bytes. */
712 1.1 skrll 0, 0, 0, 0,
713 1.1 skrll 0, 0, 0, 0
714 1.1 skrll };
715 1.1 skrll
716 1.1 skrll /* Subsequent entries in a PIC procedure linkage table look like this. */
717 1.1 skrll
718 1.1 skrll static const bfd_byte elf_cris_pic_plt_entry[PLT_ENTRY_SIZE] =
719 1.1 skrll {
720 1.1 skrll 0x6f, 0x0d, /* (bdap [pc+].d,r0) */
721 1.1 skrll 0, 0, 0, 0, /* Replaced with offset of this symbol in .got. */
722 1.1 skrll 0x30, 0x09, /* jump [...] */
723 1.1 skrll 0x3f, 0x7e, /* move [pc+],mof */
724 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */
725 1.1 skrll 0x2f, 0xfe, /* add.d [pc+],pc */
726 1.1 skrll 0xec, 0xff, /* Replaced with offset to start of .plt. */
727 1.1 skrll 0xff, 0xff
728 1.1 skrll };
729 1.1 skrll
730 1.1 skrll static const bfd_byte elf_cris_pic_plt_entry_v32[PLT_ENTRY_SIZE_V32] =
731 1.1 skrll {
732 1.1 skrll 0x6f, 0x0d, /* addo.d 0,$r0,$acr */
733 1.1 skrll 0, 0, 0, 0, /* Replaced with offset of this symbol in .got. */
734 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */
735 1.1 skrll 0xbf, 0x09, /* jump $acr */
736 1.1 skrll 0xb0, 0x05, /* nop */
737 1.1 skrll 0x3f, 0x7e, /* move relocoffs,$mof */
738 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */
739 1.1 skrll 0xbf, 0x0e, /* ba start_of_plt */
740 1.1 skrll 0, 0, 0, 0, /* Replaced with offset to start of .plt. */
741 1.1 skrll 0xb0, 0x05 /* nop */
742 1.1 skrll };
743 1.1 skrll
744 1.1 skrll /* We copy elf32-m68k.c and elf32-i386.c for the basic linker hash bits
746 1.1 skrll (and most other PIC/shlib stuff). Check that we don't drift away
747 1.1 skrll without reason.
748 1.1 skrll
749 1.1 skrll The CRIS linker, like the m68k and i386 linkers (and probably the rest
750 1.1 skrll too) needs to keep track of the number of relocs that it decides to
751 1.1 skrll copy in check_relocs for each symbol. This is so that it can discard
752 1.1 skrll PC relative relocs if it doesn't need them when linking with
753 1.1 skrll -Bsymbolic. We store the information in a field extending the regular
754 1.1 skrll ELF linker hash table. */
755 1.1 skrll
756 1.1 skrll /* This structure keeps track of the number of PC relative relocs we have
757 1.1 skrll copied for a given symbol. */
758 1.1 skrll
759 1.1 skrll struct elf_cris_pcrel_relocs_copied
760 1.1 skrll {
761 1.1 skrll /* Next section. */
762 1.1 skrll struct elf_cris_pcrel_relocs_copied *next;
763 1.1 skrll /* A section in dynobj. */
764 1.1 skrll asection *section;
765 1.1 skrll /* Number of relocs copied in this section. */
766 1.1 skrll bfd_size_type count;
767 1.1 skrll };
768 1.1 skrll
769 1.1 skrll /* CRIS ELF linker hash entry. */
770 1.1 skrll
771 1.1 skrll struct elf_cris_link_hash_entry
772 1.1 skrll {
773 1.1 skrll struct elf_link_hash_entry root;
774 1.1 skrll
775 1.1 skrll /* Number of PC relative relocs copied for this symbol. */
776 1.1 skrll struct elf_cris_pcrel_relocs_copied *pcrel_relocs_copied;
777 1.1 skrll
778 1.1 skrll /* The GOTPLT references are CRIS-specific; the goal is to avoid having
779 1.1 skrll both a general GOT and a PLT-specific GOT entry for the same symbol,
780 1.1 skrll when it is referenced both as a function and as a function pointer.
781 1.1 skrll
782 1.1 skrll Number of GOTPLT references for a function. */
783 1.1 skrll bfd_signed_vma gotplt_refcount;
784 1.1 skrll
785 1.1 skrll /* Actual GOTPLT index for this symbol, if applicable, or zero if not
786 1.1 skrll (zero is never used as an index). FIXME: We should be able to fold
787 1.1 skrll this with gotplt_refcount in a union, like the got and plt unions in
788 1.1 skrll elf_link_hash_entry. */
789 1.1 skrll bfd_size_type gotplt_offset;
790 1.1 skrll };
791 1.1 skrll
792 1.1 skrll /* CRIS ELF linker hash table. */
793 1.1 skrll
794 1.1 skrll struct elf_cris_link_hash_table
795 1.1 skrll {
796 1.1 skrll struct elf_link_hash_table root;
797 1.1 skrll
798 1.1 skrll /* We can't use the PLT offset and calculate to get the GOTPLT offset,
799 1.1 skrll since we try and avoid creating GOTPLT:s when there's already a GOT.
800 1.1 skrll Instead, we keep and update the next available index here. */
801 1.1 skrll bfd_size_type next_gotplt_entry;
802 1.1 skrll };
803 1.1 skrll
804 1.1 skrll /* Traverse a CRIS ELF linker hash table. */
805 1.1 skrll
806 1.1 skrll #define elf_cris_link_hash_traverse(table, func, info) \
807 1.1 skrll (elf_link_hash_traverse \
808 1.1 skrll (&(table)->root, \
809 1.1 skrll (bfd_boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
810 1.1 skrll (info)))
811 1.1 skrll
812 1.1 skrll /* Get the CRIS ELF linker hash table from a link_info structure. */
813 1.1 skrll
814 1.1 skrll #define elf_cris_hash_table(p) \
815 1.1 skrll ((struct elf_cris_link_hash_table *) (p)->hash)
816 1.1 skrll
817 1.1 skrll /* Create an entry in a CRIS ELF linker hash table. */
818 1.1 skrll
819 1.1 skrll static struct bfd_hash_entry *
820 1.1 skrll elf_cris_link_hash_newfunc (entry, table, string)
821 1.1 skrll struct bfd_hash_entry *entry;
822 1.1 skrll struct bfd_hash_table *table;
823 1.1 skrll const char *string;
824 1.1 skrll {
825 1.1 skrll struct elf_cris_link_hash_entry *ret =
826 1.1 skrll (struct elf_cris_link_hash_entry *) entry;
827 1.1 skrll
828 1.1 skrll /* Allocate the structure if it has not already been allocated by a
829 1.1 skrll subclass. */
830 1.1 skrll if (ret == (struct elf_cris_link_hash_entry *) NULL)
831 1.1 skrll ret = ((struct elf_cris_link_hash_entry *)
832 1.1 skrll bfd_hash_allocate (table,
833 1.1 skrll sizeof (struct elf_cris_link_hash_entry)));
834 1.1 skrll if (ret == (struct elf_cris_link_hash_entry *) NULL)
835 1.1 skrll return (struct bfd_hash_entry *) ret;
836 1.1 skrll
837 1.1 skrll /* Call the allocation method of the superclass. */
838 1.1 skrll ret = ((struct elf_cris_link_hash_entry *)
839 1.1 skrll _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
840 1.1 skrll table, string));
841 1.1 skrll if (ret != (struct elf_cris_link_hash_entry *) NULL)
842 1.1 skrll {
843 1.1 skrll ret->pcrel_relocs_copied = NULL;
844 1.1 skrll ret->gotplt_refcount = 0;
845 1.1 skrll ret->gotplt_offset = 0;
846 1.1 skrll }
847 1.1 skrll
848 1.1 skrll return (struct bfd_hash_entry *) ret;
849 1.1 skrll }
850 1.1 skrll
851 1.1 skrll /* Create a CRIS ELF linker hash table. */
852 1.1 skrll
853 1.1 skrll static struct bfd_link_hash_table *
854 1.1 skrll elf_cris_link_hash_table_create (abfd)
855 1.1 skrll bfd *abfd;
856 1.1 skrll {
857 1.1 skrll struct elf_cris_link_hash_table *ret;
858 1.1 skrll bfd_size_type amt = sizeof (struct elf_cris_link_hash_table);
859 1.1 skrll
860 1.1 skrll ret = ((struct elf_cris_link_hash_table *) bfd_malloc (amt));
861 1.1 skrll if (ret == (struct elf_cris_link_hash_table *) NULL)
862 1.1 skrll return NULL;
863 1.1 skrll
864 1.1 skrll if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
865 1.1 skrll elf_cris_link_hash_newfunc,
866 1.1 skrll sizeof (struct elf_cris_link_hash_entry)))
867 1.1 skrll {
868 1.1 skrll free (ret);
869 1.1 skrll return NULL;
870 1.1 skrll }
871 1.1 skrll
872 1.1 skrll /* Initialize to skip over the first three entries in the gotplt; they
873 1.1 skrll are used for run-time symbol evaluation. */
874 1.1 skrll ret->next_gotplt_entry = 12;
875 1.1 skrll
876 1.1 skrll return &ret->root.root;
877 1.1 skrll }
878 1.1 skrll
879 1.1 skrll /* Perform a single relocation. By default we use the standard BFD
881 1.1 skrll routines, with a few tweaks. */
882 1.1 skrll
883 1.1 skrll static bfd_reloc_status_type
884 1.1 skrll cris_final_link_relocate (howto, input_bfd, input_section, contents, rel,
885 1.1 skrll relocation)
886 1.1 skrll reloc_howto_type * howto;
887 1.1 skrll bfd * input_bfd;
888 1.1 skrll asection * input_section;
889 1.1 skrll bfd_byte * contents;
890 1.1 skrll Elf_Internal_Rela * rel;
891 1.1 skrll bfd_vma relocation;
892 1.1 skrll {
893 1.1 skrll bfd_reloc_status_type r;
894 1.1 skrll
895 1.1 skrll /* PC-relative relocations are relative to the position *after*
896 1.1 skrll the reloc. Note that for R_CRIS_8_PCREL the adjustment is
897 1.1 skrll not a single byte, since PC must be 16-bit-aligned. */
898 1.1 skrll switch (ELF32_R_TYPE (rel->r_info))
899 1.1 skrll {
900 1.1 skrll /* Check that the 16-bit GOT relocs are positive. */
901 1.1 skrll case R_CRIS_16_GOTPLT:
902 1.1 skrll case R_CRIS_16_GOT:
903 1.1 skrll if ((bfd_signed_vma) relocation < 0)
904 1.1 skrll return bfd_reloc_overflow;
905 1.1 skrll break;
906 1.1 skrll
907 1.1 skrll case R_CRIS_32_PLT_PCREL:
908 1.1 skrll case R_CRIS_32_PCREL:
909 1.1 skrll relocation -= 2;
910 1.1 skrll /* Fall through. */
911 1.1 skrll case R_CRIS_8_PCREL:
912 1.1 skrll case R_CRIS_16_PCREL:
913 1.1 skrll relocation -= 2;
914 1.1 skrll break;
915 1.1 skrll
916 1.1 skrll default:
917 1.1 skrll break;
918 1.1 skrll }
919 1.1 skrll
920 1.1 skrll r = _bfd_final_link_relocate (howto, input_bfd, input_section,
921 1.1 skrll contents, rel->r_offset,
922 1.1 skrll relocation, rel->r_addend);
923 1.1 skrll return r;
924 1.1 skrll }
925 1.1 skrll
926 1.1 skrll /* Relocate an CRIS ELF section. See elf32-fr30.c, from where this was
928 1.1 skrll copied, for further comments. */
929 1.1 skrll
930 1.1 skrll static bfd_boolean
931 1.1 skrll cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
932 1.1 skrll contents, relocs, local_syms, local_sections)
933 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
934 1.1 skrll struct bfd_link_info *info;
935 1.1 skrll bfd *input_bfd;
936 1.1 skrll asection *input_section;
937 1.1 skrll bfd_byte *contents;
938 1.1 skrll Elf_Internal_Rela *relocs;
939 1.1 skrll Elf_Internal_Sym *local_syms;
940 1.1 skrll asection **local_sections;
941 1.1 skrll {
942 1.1 skrll bfd *dynobj;
943 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
944 1.1 skrll struct elf_link_hash_entry **sym_hashes;
945 1.1 skrll bfd_vma *local_got_offsets;
946 1.1 skrll asection *sgot;
947 1.1 skrll asection *splt;
948 1.1 skrll asection *sreloc;
949 1.1 skrll Elf_Internal_Rela *rel;
950 1.1 skrll Elf_Internal_Rela *relend;
951 1.1 skrll
952 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
953 1.1 skrll local_got_offsets = elf_local_got_offsets (input_bfd);
954 1.1 skrll symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
955 1.1 skrll sym_hashes = elf_sym_hashes (input_bfd);
956 1.1 skrll relend = relocs + input_section->reloc_count;
957 1.1 skrll
958 1.1 skrll sgot = NULL;
959 1.1 skrll splt = NULL;
960 1.1 skrll sreloc = NULL;
961 1.1 skrll
962 1.1 skrll if (dynobj != NULL)
963 1.1 skrll {
964 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
965 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
966 1.1 skrll }
967 1.1 skrll
968 1.1 skrll for (rel = relocs; rel < relend; rel ++)
969 1.1 skrll {
970 1.1 skrll reloc_howto_type *howto;
971 1.1 skrll unsigned long r_symndx;
972 1.1 skrll Elf_Internal_Sym *sym;
973 1.1 skrll asection *sec;
974 1.1 skrll struct elf_link_hash_entry *h;
975 1.1 skrll bfd_vma relocation;
976 1.1 skrll bfd_reloc_status_type r;
977 1.1 skrll const char *symname = NULL;
978 1.1 skrll int r_type;
979 1.1 skrll
980 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
981 1.1 skrll
982 1.1 skrll if ( r_type == R_CRIS_GNU_VTINHERIT
983 1.1 skrll || r_type == R_CRIS_GNU_VTENTRY)
984 1.1 skrll continue;
985 1.1 skrll
986 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
987 1.1 skrll howto = cris_elf_howto_table + r_type;
988 1.1 skrll h = NULL;
989 1.1 skrll sym = NULL;
990 1.1 skrll sec = NULL;
991 1.1 skrll
992 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
993 1.1 skrll {
994 1.1 skrll sym = local_syms + r_symndx;
995 1.1 skrll sec = local_sections [r_symndx];
996 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
997 1.1 skrll
998 1.1 skrll symname = (bfd_elf_string_from_elf_section
999 1.1 skrll (input_bfd, symtab_hdr->sh_link, sym->st_name));
1000 1.1 skrll if (symname == NULL)
1001 1.1 skrll symname = bfd_section_name (input_bfd, sec);
1002 1.1 skrll }
1003 1.1 skrll else
1004 1.1 skrll {
1005 1.1 skrll bfd_boolean warned;
1006 1.1 skrll bfd_boolean unresolved_reloc;
1007 1.1 skrll
1008 1.1 skrll RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1009 1.1 skrll r_symndx, symtab_hdr, sym_hashes,
1010 1.1 skrll h, sec, relocation,
1011 1.1 skrll unresolved_reloc, warned);
1012 1.1 skrll
1013 1.1 skrll if (unresolved_reloc
1014 1.1 skrll /* Perhaps we should detect the cases that
1015 1.1 skrll sec->output_section is expected to be NULL like i386 and
1016 1.1 skrll m68k, but apparently (and according to elfxx-ia64.c) all
1017 1.1 skrll valid cases are where the symbol is defined in a shared
1018 1.1 skrll object which we link dynamically against. This includes
1019 1.1 skrll PLT relocs for which we've created a PLT entry and other
1020 1.1 skrll relocs for which we're prepared to create dynamic
1021 1.1 skrll relocations.
1022 1.1 skrll
1023 1.1 skrll For now, new situations cause us to just err when
1024 1.1 skrll sec->output_offset is NULL but the object with the symbol
1025 1.1 skrll is *not* dynamically linked against. Thus this will
1026 1.1 skrll automatically remind us so we can see if there are other
1027 1.1 skrll valid cases we need to revisit. */
1028 1.1 skrll && (sec->owner->flags & DYNAMIC) != 0)
1029 1.1 skrll relocation = 0;
1030 1.1 skrll
1031 1.1 skrll else if (h->root.type == bfd_link_hash_defined
1032 1.1 skrll || h->root.type == bfd_link_hash_defweak)
1033 1.1 skrll {
1034 1.1 skrll /* Here follow the cases where the relocation value must
1035 1.1 skrll be zero (or when further handling is simplified when
1036 1.1 skrll zero). I can't claim to understand the various
1037 1.1 skrll conditions and they weren't described in the files
1038 1.1 skrll where I copied them from (elf32-m68k.c and
1039 1.1 skrll elf32-i386.c), but let's mention examples of where
1040 1.1 skrll they happen. FIXME: Perhaps define and use a
1041 1.1 skrll dynamic_symbol_p function like ia64.
1042 1.1 skrll
1043 1.1 skrll - When creating a shared library, we can have an
1044 1.1 skrll ordinary relocation for a symbol defined in a shared
1045 1.1 skrll library (perhaps the one we create). We then make
1046 1.1 skrll the relocation value zero, as the value seen now will
1047 1.1 skrll be added into the relocation addend in this shared
1048 1.1 skrll library, but must be handled only at dynamic-link
1049 1.1 skrll time. FIXME: Not sure this example covers the
1050 1.1 skrll h->elf_link_hash_flags test, though it's there in
1051 1.1 skrll other targets. */
1052 1.1 skrll if (info->shared
1053 1.1 skrll && ((! info->symbolic && h->dynindx != -1)
1054 1.1 skrll || !h->def_regular)
1055 1.1 skrll && (input_section->flags & SEC_ALLOC) != 0
1056 1.1 skrll && (r_type == R_CRIS_8
1057 1.1 skrll || r_type == R_CRIS_16
1058 1.1 skrll || r_type == R_CRIS_32
1059 1.1 skrll || r_type == R_CRIS_8_PCREL
1060 1.1 skrll || r_type == R_CRIS_16_PCREL
1061 1.1 skrll || r_type == R_CRIS_32_PCREL))
1062 1.1 skrll relocation = 0;
1063 1.1 skrll else if (!info->relocatable && unresolved_reloc)
1064 1.1 skrll {
1065 1.1 skrll _bfd_error_handler
1066 1.1 skrll (_("%B, section %A: unresolvable relocation %s against symbol `%s'"),
1067 1.1 skrll input_bfd,
1068 1.1 skrll input_section,
1069 1.1 skrll cris_elf_howto_table[r_type].name,
1070 1.1 skrll symname);
1071 1.1 skrll bfd_set_error (bfd_error_bad_value);
1072 1.1 skrll return FALSE;
1073 1.1 skrll }
1074 1.1 skrll }
1075 1.1 skrll }
1076 1.1 skrll
1077 1.1 skrll if (sec != NULL && elf_discarded_section (sec))
1078 1.1 skrll {
1079 1.1 skrll /* For relocs against symbols from removed linkonce sections,
1080 1.1 skrll or sections discarded by a linker script, we just want the
1081 1.1 skrll section contents zeroed. Avoid any special processing. */
1082 1.1 skrll _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1083 1.1 skrll rel->r_info = 0;
1084 1.1 skrll rel->r_addend = 0;
1085 1.1 skrll continue;
1086 1.1 skrll }
1087 1.1 skrll
1088 1.1 skrll if (info->relocatable)
1089 1.1 skrll continue;
1090 1.1 skrll
1091 1.1 skrll switch (r_type)
1092 1.1 skrll {
1093 1.1 skrll case R_CRIS_16_GOTPLT:
1094 1.1 skrll case R_CRIS_32_GOTPLT:
1095 1.1 skrll /* This is like the case for R_CRIS_32_GOT and R_CRIS_16_GOT,
1096 1.1 skrll but we require a PLT, and the PLT handling will take care of
1097 1.1 skrll filling in the PLT-specific GOT entry. For the GOT offset,
1098 1.1 skrll calculate it as we do when filling it in for the .got.plt
1099 1.1 skrll section. If we don't have a PLT, punt to GOT handling. */
1100 1.1 skrll if (h != NULL
1101 1.1 skrll && ((struct elf_cris_link_hash_entry *) h)->gotplt_offset != 0)
1102 1.1 skrll {
1103 1.1 skrll asection *sgotplt
1104 1.1 skrll = bfd_get_section_by_name (dynobj, ".got.plt");
1105 1.1 skrll bfd_vma got_offset;
1106 1.1 skrll
1107 1.1 skrll BFD_ASSERT (h->dynindx != -1);
1108 1.1 skrll BFD_ASSERT (sgotplt != NULL);
1109 1.1 skrll
1110 1.1 skrll got_offset
1111 1.1 skrll = ((struct elf_cris_link_hash_entry *) h)->gotplt_offset;
1112 1.1 skrll
1113 1.1 skrll relocation = got_offset;
1114 1.1 skrll break;
1115 1.1 skrll }
1116 1.1 skrll
1117 1.1 skrll /* We didn't make a PLT entry for this symbol. Maybe everything is
1118 1.1 skrll folded into the GOT. Other than folding, this happens when
1119 1.1 skrll statically linking PIC code, or when using -Bsymbolic. Check
1120 1.1 skrll that we instead have a GOT entry as done for us by
1121 1.1 skrll elf_cris_adjust_dynamic_symbol, and drop through into the
1122 1.1 skrll ordinary GOT cases. This must not happen for the
1123 1.1 skrll executable, because any reference it does to a function
1124 1.1 skrll that is satisfied by a DSO must generate a PLT. We assume
1125 1.1 skrll these call-specific relocs don't address non-functions. */
1126 1.1 skrll if (h != NULL
1127 1.1 skrll && (h->got.offset == (bfd_vma) -1
1128 1.1 skrll || (!info->shared
1129 1.1 skrll && !(h->def_regular
1130 1.1 skrll || (!h->def_dynamic
1131 1.1 skrll && h->root.type == bfd_link_hash_undefweak)))))
1132 1.1 skrll {
1133 1.1 skrll (*_bfd_error_handler)
1134 1.1 skrll ((h->got.offset == (bfd_vma) -1)
1135 1.1 skrll ? _("%B, section %A: No PLT nor GOT for relocation %s"
1136 1.1 skrll " against symbol `%s'")
1137 1.1 skrll : _("%B, section %A: No PLT for relocation %s"
1138 1.1 skrll " against symbol `%s'"),
1139 1.1 skrll input_bfd,
1140 1.1 skrll input_section,
1141 1.1 skrll cris_elf_howto_table[r_type].name,
1142 1.1 skrll (symname != NULL && symname[0] != '\0'
1143 1.1 skrll ? symname : _("[whose name is lost]")));
1144 1.1 skrll
1145 1.1 skrll /* FIXME: Perhaps blaming input is not the right thing to
1146 1.1 skrll do; this is probably an internal error. But it is true
1147 1.1 skrll that we didn't like that particular input. */
1148 1.1 skrll bfd_set_error (bfd_error_bad_value);
1149 1.1 skrll return FALSE;
1150 1.1 skrll }
1151 1.1 skrll /* Fall through. */
1152 1.1 skrll
1153 1.1 skrll /* The size of the actual relocation is not used here; we only
1154 1.1 skrll fill in the GOT table here. */
1155 1.1 skrll case R_CRIS_16_GOT:
1156 1.1 skrll case R_CRIS_32_GOT:
1157 1.1 skrll {
1158 1.1 skrll bfd_vma off;
1159 1.1 skrll
1160 1.1 skrll /* Note that despite using RELA relocations, the .got contents
1161 1.1 skrll is always filled in with the link-relative relocation
1162 1.1 skrll value; the addend. */
1163 1.1 skrll
1164 1.1 skrll if (h != NULL)
1165 1.1 skrll {
1166 1.1 skrll off = h->got.offset;
1167 1.1 skrll BFD_ASSERT (off != (bfd_vma) -1);
1168 1.1 skrll
1169 1.1 skrll if (!elf_hash_table (info)->dynamic_sections_created
1170 1.1 skrll || (! info->shared
1171 1.1 skrll && (h->def_regular
1172 1.1 skrll || h->type == STT_FUNC
1173 1.1 skrll || h->needs_plt))
1174 1.1 skrll || (info->shared
1175 1.1 skrll && (info->symbolic || h->dynindx == -1)
1176 1.1 skrll && h->def_regular))
1177 1.1 skrll {
1178 1.1 skrll /* This wasn't checked above for ! info->shared, but
1179 1.1 skrll must hold there if we get here; the symbol must
1180 1.1 skrll be defined in the regular program or be undefweak
1181 1.1 skrll or be a function or otherwise need a PLT. */
1182 1.1 skrll BFD_ASSERT (!elf_hash_table (info)->dynamic_sections_created
1183 1.1 skrll || info->shared
1184 1.1 skrll || h->def_regular
1185 1.1 skrll || h->type == STT_FUNC
1186 1.1 skrll || h->needs_plt
1187 1.1 skrll || h->root.type == bfd_link_hash_undefweak);
1188 1.1 skrll
1189 1.1 skrll /* This is actually a static link, or it is a
1190 1.1 skrll -Bsymbolic link and the symbol is defined locally,
1191 1.1 skrll or is undefweak, or the symbol was forced to be
1192 1.1 skrll local because of a version file, or we're not
1193 1.1 skrll creating a dynamic object. We must initialize this
1194 1.1 skrll entry in the global offset table. Since the offset
1195 1.1 skrll must always be a multiple of 4, we use the least
1196 1.1 skrll significant bit to record whether we have
1197 1.1 skrll initialized it already.
1198 1.1 skrll
1199 1.1 skrll If this GOT entry should be runtime-initialized, we
1200 1.1 skrll will create a .rela.got relocation entry to
1201 1.1 skrll initialize the value. This is done in the
1202 1.1 skrll finish_dynamic_symbol routine. */
1203 1.1 skrll if ((off & 1) != 0)
1204 1.1 skrll off &= ~1;
1205 1.1 skrll else
1206 1.1 skrll {
1207 1.1 skrll bfd_put_32 (output_bfd, relocation,
1208 1.1 skrll sgot->contents + off);
1209 1.1 skrll h->got.offset |= 1;
1210 1.1 skrll }
1211 1.1 skrll }
1212 1.1 skrll }
1213 1.1 skrll else
1214 1.1 skrll {
1215 1.1 skrll BFD_ASSERT (local_got_offsets != NULL
1216 1.1 skrll && local_got_offsets[r_symndx] != (bfd_vma) -1);
1217 1.1 skrll
1218 1.1 skrll off = local_got_offsets[r_symndx];
1219 1.1 skrll
1220 1.1 skrll /* The offset must always be a multiple of 4. We use
1221 1.1 skrll the least significant bit to record whether we have
1222 1.1 skrll already generated the necessary reloc. */
1223 1.1 skrll if ((off & 1) != 0)
1224 1.1 skrll off &= ~1;
1225 1.1 skrll else
1226 1.1 skrll {
1227 1.1 skrll bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1228 1.1 skrll
1229 1.1 skrll if (info->shared)
1230 1.1 skrll {
1231 1.1 skrll asection *s;
1232 1.1 skrll Elf_Internal_Rela outrel;
1233 1.1 skrll bfd_byte *loc;
1234 1.1 skrll
1235 1.1 skrll s = bfd_get_section_by_name (dynobj, ".rela.got");
1236 1.1 skrll BFD_ASSERT (s != NULL);
1237 1.1 skrll
1238 1.1 skrll outrel.r_offset = (sgot->output_section->vma
1239 1.1 skrll + sgot->output_offset
1240 1.1 skrll + off);
1241 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1242 1.1 skrll outrel.r_addend = relocation;
1243 1.1 skrll loc = s->contents;
1244 1.1 skrll loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
1245 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1246 1.1 skrll }
1247 1.1 skrll
1248 1.1 skrll local_got_offsets[r_symndx] |= 1;
1249 1.1 skrll }
1250 1.1 skrll }
1251 1.1 skrll
1252 1.1 skrll relocation = sgot->output_offset + off;
1253 1.1 skrll if (rel->r_addend != 0)
1254 1.1 skrll {
1255 1.1 skrll /* We can't do anything for a relocation which is against
1256 1.1 skrll a symbol *plus offset*. GOT holds relocations for
1257 1.1 skrll symbols. Make this an error; the compiler isn't
1258 1.1 skrll allowed to pass us these kinds of things. */
1259 1.1 skrll if (h == NULL)
1260 1.1 skrll (*_bfd_error_handler)
1261 1.1 skrll (_("%B, section %A: relocation %s with non-zero addend %d"
1262 1.1 skrll " against local symbol"),
1263 1.1 skrll input_bfd,
1264 1.1 skrll input_section,
1265 1.1 skrll cris_elf_howto_table[r_type].name,
1266 1.1 skrll rel->r_addend);
1267 1.1 skrll else
1268 1.1 skrll (*_bfd_error_handler)
1269 1.1 skrll (_("%B, section %A: relocation %s with non-zero addend %d"
1270 1.1 skrll " against symbol `%s'"),
1271 1.1 skrll input_bfd,
1272 1.1 skrll input_section,
1273 1.1 skrll cris_elf_howto_table[r_type].name,
1274 1.1 skrll rel->r_addend,
1275 1.1 skrll symname[0] != '\0' ? symname : _("[whose name is lost]"));
1276 1.1 skrll
1277 1.1 skrll bfd_set_error (bfd_error_bad_value);
1278 1.1 skrll return FALSE;
1279 1.1 skrll }
1280 1.1 skrll }
1281 1.1 skrll break;
1282 1.1 skrll
1283 1.1 skrll case R_CRIS_32_GOTREL:
1284 1.1 skrll /* This relocation must only be performed against local symbols.
1285 1.1 skrll It's also ok when we link a program and the symbol is either
1286 1.1 skrll defined in an ordinary (non-DSO) object or is undefined weak. */
1287 1.1 skrll if (h != NULL
1288 1.1 skrll && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1289 1.1 skrll && !(!info->shared
1290 1.1 skrll && (h->def_regular
1291 1.1 skrll || (!h->def_dynamic
1292 1.1 skrll && h->root.type == bfd_link_hash_undefweak))))
1293 1.1 skrll {
1294 1.1 skrll (*_bfd_error_handler)
1295 1.1 skrll (_("%B, section %A: relocation %s is"
1296 1.1 skrll " not allowed for global symbol: `%s'"),
1297 1.1 skrll input_bfd,
1298 1.1 skrll input_section,
1299 1.1 skrll cris_elf_howto_table[r_type].name,
1300 1.1 skrll symname);
1301 1.1 skrll bfd_set_error (bfd_error_bad_value);
1302 1.1 skrll return FALSE;
1303 1.1 skrll }
1304 1.1 skrll
1305 1.1 skrll /* This can happen if we get a link error with the input ELF
1306 1.1 skrll variant mismatching the output variant. Emit an error so
1307 1.1 skrll it's noticed if it happens elsewhere. */
1308 1.1 skrll if (sgot == NULL)
1309 1.1 skrll {
1310 1.1 skrll (*_bfd_error_handler)
1311 1.1 skrll (_("%B, section %A: relocation %s with no GOT created"),
1312 1.1 skrll input_bfd,
1313 1.1 skrll input_section,
1314 1.1 skrll cris_elf_howto_table[r_type].name);
1315 1.1 skrll bfd_set_error (bfd_error_bad_value);
1316 1.1 skrll return FALSE;
1317 1.1 skrll }
1318 1.1 skrll
1319 1.1 skrll /* This relocation is like a PC-relative one, except the
1320 1.1 skrll reference point is the location of GOT. Note that
1321 1.1 skrll sgot->output_offset is not involved in this calculation. We
1322 1.1 skrll always want the start of entire .got section, not the
1323 1.1 skrll position after the reserved header. */
1324 1.1 skrll relocation -= sgot->output_section->vma;
1325 1.1 skrll break;
1326 1.1 skrll
1327 1.1 skrll case R_CRIS_32_PLT_PCREL:
1328 1.1 skrll /* Relocation is to the entry for this symbol in the
1329 1.1 skrll procedure linkage table. */
1330 1.1 skrll
1331 1.1 skrll /* Resolve a PLT_PCREL reloc against a local symbol directly,
1332 1.1 skrll without using the procedure linkage table. */
1333 1.1 skrll if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1334 1.1 skrll break;
1335 1.1 skrll
1336 1.1 skrll if (h->plt.offset == (bfd_vma) -1
1337 1.1 skrll || splt == NULL)
1338 1.1 skrll {
1339 1.1 skrll /* We didn't make a PLT entry for this symbol. This
1340 1.1 skrll happens when statically linking PIC code, or when
1341 1.1 skrll using -Bsymbolic. */
1342 1.1 skrll break;
1343 1.1 skrll }
1344 1.1 skrll
1345 1.1 skrll relocation = (splt->output_section->vma
1346 1.1 skrll + splt->output_offset
1347 1.1 skrll + h->plt.offset);
1348 1.1 skrll break;
1349 1.1 skrll
1350 1.1 skrll case R_CRIS_32_PLT_GOTREL:
1351 1.1 skrll /* Like R_CRIS_32_PLT_PCREL, but the reference point is the
1352 1.1 skrll start of the .got section. See also comment at
1353 1.1 skrll R_CRIS_32_GOT. */
1354 1.1 skrll relocation -= sgot->output_section->vma;
1355 1.1 skrll
1356 1.1 skrll /* Resolve a PLT_GOTREL reloc against a local symbol directly,
1357 1.1 skrll without using the procedure linkage table. */
1358 1.1 skrll if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1359 1.1 skrll break;
1360 1.1 skrll
1361 1.1 skrll if (h->plt.offset == (bfd_vma) -1
1362 1.1 skrll || splt == NULL)
1363 1.1 skrll {
1364 1.1 skrll /* We didn't make a PLT entry for this symbol. This
1365 1.1 skrll happens when statically linking PIC code, or when
1366 1.1 skrll using -Bsymbolic. */
1367 1.1 skrll break;
1368 1.1 skrll }
1369 1.1 skrll
1370 1.1 skrll relocation = (splt->output_section->vma
1371 1.1 skrll + splt->output_offset
1372 1.1 skrll + h->plt.offset
1373 1.1 skrll - sgot->output_section->vma);
1374 1.1 skrll break;
1375 1.1 skrll
1376 1.1 skrll case R_CRIS_8_PCREL:
1377 1.1 skrll case R_CRIS_16_PCREL:
1378 1.1 skrll case R_CRIS_32_PCREL:
1379 1.1 skrll /* If the symbol was local, we need no shlib-specific handling. */
1380 1.1 skrll if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1381 1.1 skrll break;
1382 1.1 skrll
1383 1.1 skrll /* Fall through. */
1384 1.1 skrll case R_CRIS_8:
1385 1.1 skrll case R_CRIS_16:
1386 1.1 skrll case R_CRIS_32:
1387 1.1 skrll if (info->shared
1388 1.1 skrll && r_symndx != 0
1389 1.1 skrll && (input_section->flags & SEC_ALLOC) != 0
1390 1.1 skrll && ((r_type != R_CRIS_8_PCREL
1391 1.1 skrll && r_type != R_CRIS_16_PCREL
1392 1.1 skrll && r_type != R_CRIS_32_PCREL)
1393 1.1 skrll || (!info->symbolic
1394 1.1 skrll || !h->def_regular)))
1395 1.1 skrll {
1396 1.1 skrll Elf_Internal_Rela outrel;
1397 1.1 skrll bfd_byte *loc;
1398 1.1 skrll bfd_boolean skip, relocate;
1399 1.1 skrll
1400 1.1 skrll /* When generating a shared object, these relocations
1401 1.1 skrll are copied into the output file to be resolved at run
1402 1.1 skrll time. */
1403 1.1 skrll
1404 1.1 skrll if (sreloc == NULL)
1405 1.1 skrll {
1406 1.1 skrll const char *name;
1407 1.1 skrll
1408 1.1 skrll name = (bfd_elf_string_from_elf_section
1409 1.1 skrll (input_bfd,
1410 1.1 skrll elf_elfheader (input_bfd)->e_shstrndx,
1411 1.1 skrll elf_section_data (input_section)->rel_hdr.sh_name));
1412 1.1 skrll if (name == NULL)
1413 1.1 skrll return FALSE;
1414 1.1 skrll
1415 1.1 skrll BFD_ASSERT (CONST_STRNEQ (name, ".rela")
1416 1.1 skrll && strcmp (bfd_get_section_name (input_bfd,
1417 1.1 skrll input_section),
1418 1.1 skrll name + 5) == 0);
1419 1.1 skrll
1420 1.1 skrll sreloc = bfd_get_section_by_name (dynobj, name);
1421 1.1 skrll
1422 1.1 skrll /* That section should have been created in
1423 1.1 skrll cris_elf_check_relocs, but that function will not be
1424 1.1 skrll called for objects which fail in
1425 1.1 skrll cris_elf_merge_private_bfd_data. */
1426 1.1 skrll if (sreloc == NULL)
1427 1.1 skrll {
1428 1.1 skrll (*_bfd_error_handler)
1429 1.1 skrll (_("%B: Internal inconsistency; no relocation section %s"),
1430 1.1 skrll input_bfd,
1431 1.1 skrll name);
1432 1.1 skrll
1433 1.1 skrll bfd_set_error (bfd_error_bad_value);
1434 1.1 skrll return FALSE;
1435 1.1 skrll }
1436 1.1 skrll }
1437 1.1 skrll
1438 1.1 skrll skip = FALSE;
1439 1.1 skrll relocate = FALSE;
1440 1.1 skrll
1441 1.1 skrll outrel.r_offset =
1442 1.1 skrll _bfd_elf_section_offset (output_bfd, info, input_section,
1443 1.1 skrll rel->r_offset);
1444 1.1 skrll if (outrel.r_offset == (bfd_vma) -1)
1445 1.1 skrll skip = TRUE;
1446 1.1 skrll else if (outrel.r_offset == (bfd_vma) -2)
1447 1.1 skrll skip = TRUE, relocate = TRUE;
1448 1.1 skrll outrel.r_offset += (input_section->output_section->vma
1449 1.1 skrll + input_section->output_offset);
1450 1.1 skrll
1451 1.1 skrll if (skip)
1452 1.1 skrll memset (&outrel, 0, sizeof outrel);
1453 1.1 skrll /* h->dynindx may be -1 if the symbol was marked to
1454 1.1 skrll become local. */
1455 1.1 skrll else if (h != NULL
1456 1.1 skrll && ((! info->symbolic && h->dynindx != -1)
1457 1.1 skrll || !h->def_regular))
1458 1.1 skrll {
1459 1.1 skrll BFD_ASSERT (h->dynindx != -1);
1460 1.1 skrll outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1461 1.1 skrll outrel.r_addend = relocation + rel->r_addend;
1462 1.1 skrll }
1463 1.1 skrll else
1464 1.1 skrll {
1465 1.1 skrll outrel.r_addend = relocation + rel->r_addend;
1466 1.1 skrll
1467 1.1 skrll if (r_type == R_CRIS_32)
1468 1.1 skrll {
1469 1.1 skrll relocate = TRUE;
1470 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1471 1.1 skrll }
1472 1.1 skrll else
1473 1.1 skrll {
1474 1.1 skrll long indx;
1475 1.1 skrll
1476 1.1 skrll if (bfd_is_abs_section (sec))
1477 1.1 skrll indx = 0;
1478 1.1 skrll else if (sec == NULL || sec->owner == NULL)
1479 1.1 skrll {
1480 1.1 skrll bfd_set_error (bfd_error_bad_value);
1481 1.1 skrll return FALSE;
1482 1.1 skrll }
1483 1.1 skrll else
1484 1.1 skrll {
1485 1.1 skrll asection *osec;
1486 1.1 skrll
1487 1.1 skrll /* We are turning this relocation into one
1488 1.1 skrll against a section symbol. It would be
1489 1.1 skrll proper to subtract the symbol's value,
1490 1.1 skrll osec->vma, from the emitted reloc addend,
1491 1.1 skrll but ld.so expects buggy relocs. */
1492 1.1 skrll osec = sec->output_section;
1493 1.1 skrll indx = elf_section_data (osec)->dynindx;
1494 1.1 skrll if (indx == 0)
1495 1.1 skrll {
1496 1.1 skrll struct elf_cris_link_hash_table *htab;
1497 1.1 skrll htab = elf_cris_hash_table (info);
1498 1.1 skrll osec = htab->root.text_index_section;
1499 1.1 skrll indx = elf_section_data (osec)->dynindx;
1500 1.1 skrll }
1501 1.1 skrll BFD_ASSERT (indx != 0);
1502 1.1 skrll }
1503 1.1 skrll
1504 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, r_type);
1505 1.1 skrll }
1506 1.1 skrll }
1507 1.1 skrll
1508 1.1 skrll loc = sreloc->contents;
1509 1.1 skrll loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1510 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1511 1.1 skrll
1512 1.1 skrll /* This reloc will be computed at runtime, so there's no
1513 1.1 skrll need to do anything now, except for R_CRIS_32 relocations
1514 1.1 skrll that have been turned into R_CRIS_RELATIVE. */
1515 1.1 skrll if (!relocate)
1516 1.1 skrll continue;
1517 1.1 skrll }
1518 1.1 skrll
1519 1.1 skrll break;
1520 1.1 skrll }
1521 1.1 skrll
1522 1.1 skrll r = cris_final_link_relocate (howto, input_bfd, input_section,
1523 1.1 skrll contents, rel, relocation);
1524 1.1 skrll
1525 1.1 skrll if (r != bfd_reloc_ok)
1526 1.1 skrll {
1527 1.1 skrll const char * msg = (const char *) NULL;
1528 1.1 skrll
1529 1.1 skrll switch (r)
1530 1.1 skrll {
1531 1.1 skrll case bfd_reloc_overflow:
1532 1.1 skrll r = info->callbacks->reloc_overflow
1533 1.1 skrll (info, (h ? &h->root : NULL), symname, howto->name,
1534 1.1 skrll (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1535 1.1 skrll break;
1536 1.1 skrll
1537 1.1 skrll case bfd_reloc_undefined:
1538 1.1 skrll r = info->callbacks->undefined_symbol
1539 1.1 skrll (info, symname, input_bfd, input_section, rel->r_offset,
1540 1.1 skrll TRUE);
1541 1.1 skrll break;
1542 1.1 skrll
1543 1.1 skrll case bfd_reloc_outofrange:
1544 1.1 skrll msg = _("internal error: out of range error");
1545 1.1 skrll break;
1546 1.1 skrll
1547 1.1 skrll case bfd_reloc_notsupported:
1548 1.1 skrll msg = _("internal error: unsupported relocation error");
1549 1.1 skrll break;
1550 1.1 skrll
1551 1.1 skrll case bfd_reloc_dangerous:
1552 1.1 skrll msg = _("internal error: dangerous relocation");
1553 1.1 skrll break;
1554 1.1 skrll
1555 1.1 skrll default:
1556 1.1 skrll msg = _("internal error: unknown error");
1557 1.1 skrll break;
1558 1.1 skrll }
1559 1.1 skrll
1560 1.1 skrll if (msg)
1561 1.1 skrll r = info->callbacks->warning
1562 1.1 skrll (info, msg, symname, input_bfd, input_section, rel->r_offset);
1563 1.1 skrll
1564 1.1 skrll if (! r)
1565 1.1 skrll return FALSE;
1566 1.1 skrll }
1567 1.1 skrll }
1568 1.1 skrll
1569 1.1 skrll return TRUE;
1570 1.1 skrll }
1571 1.1 skrll
1572 1.1 skrll /* Finish up dynamic symbol handling. We set the contents of various
1574 1.1 skrll dynamic sections here. */
1575 1.1 skrll
1576 1.1 skrll static bfd_boolean
1577 1.1 skrll elf_cris_finish_dynamic_symbol (output_bfd, info, h, sym)
1578 1.1 skrll bfd *output_bfd;
1579 1.1 skrll struct bfd_link_info *info;
1580 1.1 skrll struct elf_link_hash_entry *h;
1581 1.1 skrll Elf_Internal_Sym *sym;
1582 1.1 skrll {
1583 1.1 skrll bfd *dynobj;
1584 1.1 skrll
1585 1.1 skrll /* Where in the plt entry to put values. */
1586 1.1 skrll int plt_off1 = 2, plt_off2 = 10, plt_off3 = 16;
1587 1.1 skrll
1588 1.1 skrll /* What offset to add to the distance to the first PLT entry for the
1589 1.1 skrll value at plt_off3. */
1590 1.1 skrll int plt_off3_value_bias = 4;
1591 1.1 skrll
1592 1.1 skrll /* Where in the PLT entry the call-dynlink-stub is (happens to be same
1593 1.1 skrll for PIC and non-PIC for v32 and pre-v32). */
1594 1.1 skrll int plt_stub_offset = 8;
1595 1.1 skrll int plt_entry_size = PLT_ENTRY_SIZE;
1596 1.1 skrll const bfd_byte *plt_entry = elf_cris_plt_entry;
1597 1.1 skrll const bfd_byte *plt_pic_entry = elf_cris_pic_plt_entry;
1598 1.1 skrll
1599 1.1 skrll /* Adjust the various PLT entry offsets. */
1600 1.1 skrll if (bfd_get_mach (output_bfd) == bfd_mach_cris_v32)
1601 1.1 skrll {
1602 1.1 skrll plt_off2 = 14;
1603 1.1 skrll plt_off3 = 20;
1604 1.1 skrll plt_off3_value_bias = -2;
1605 1.1 skrll plt_stub_offset = 12;
1606 1.1 skrll plt_entry_size = PLT_ENTRY_SIZE_V32;
1607 1.1 skrll plt_entry = elf_cris_plt_entry_v32;
1608 1.1 skrll plt_pic_entry = elf_cris_pic_plt_entry_v32;
1609 1.1 skrll }
1610 1.1 skrll
1611 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
1612 1.1 skrll
1613 1.1 skrll if (h->plt.offset != (bfd_vma) -1)
1614 1.1 skrll {
1615 1.1 skrll asection *splt;
1616 1.1 skrll asection *sgotplt;
1617 1.1 skrll asection *sgot;
1618 1.1 skrll asection *srela;
1619 1.1 skrll bfd_vma got_base;
1620 1.1 skrll
1621 1.1 skrll bfd_vma gotplt_offset
1622 1.1 skrll = ((struct elf_cris_link_hash_entry *) h)->gotplt_offset;
1623 1.1 skrll Elf_Internal_Rela rela;
1624 1.1 skrll bfd_byte *loc;
1625 1.1 skrll bfd_boolean has_gotplt = gotplt_offset != 0;
1626 1.1 skrll
1627 1.1 skrll /* Get the index in the procedure linkage table which
1628 1.1 skrll corresponds to this symbol. This is the index of this symbol
1629 1.1 skrll in all the symbols for which we are making plt entries. The
1630 1.1 skrll first entry in the procedure linkage table is reserved. */
1631 1.1 skrll /* We have to count backwards here, and the result is only valid as
1632 1.1 skrll an index into .got.plt and its relocations. FIXME: Constants... */
1633 1.1 skrll bfd_vma gotplt_index = gotplt_offset/4 - 3;
1634 1.1 skrll
1635 1.1 skrll /* Get the offset into the .got table of the entry that corresponds
1636 1.1 skrll to this function. Note that we embed knowledge that "incoming"
1637 1.1 skrll .got goes after .got.plt in the output without padding (pointer
1638 1.1 skrll aligned). However, that knowledge is present in several other
1639 1.1 skrll places too. */
1640 1.1 skrll bfd_vma got_offset
1641 1.1 skrll = (has_gotplt
1642 1.1 skrll ? gotplt_offset
1643 1.1 skrll : h->got.offset + elf_cris_hash_table(info)->next_gotplt_entry);
1644 1.1 skrll
1645 1.1 skrll /* This symbol has an entry in the procedure linkage table. Set it
1646 1.1 skrll up. */
1647 1.1 skrll
1648 1.1 skrll BFD_ASSERT (h->dynindx != -1);
1649 1.1 skrll
1650 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
1651 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
1652 1.1 skrll sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1653 1.1 skrll srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1654 1.1 skrll BFD_ASSERT (splt != NULL && sgotplt != NULL
1655 1.1 skrll && (! has_gotplt || srela != NULL));
1656 1.1 skrll
1657 1.1 skrll got_base = sgotplt->output_section->vma + sgotplt->output_offset;
1658 1.1 skrll
1659 1.1 skrll /* Fill in the entry in the procedure linkage table. */
1660 1.1 skrll if (! info->shared)
1661 1.1 skrll {
1662 1.1 skrll memcpy (splt->contents + h->plt.offset, plt_entry,
1663 1.1 skrll plt_entry_size);
1664 1.1 skrll
1665 1.1 skrll /* We need to enter the absolute address of the GOT entry here. */
1666 1.1 skrll bfd_put_32 (output_bfd, got_base + got_offset,
1667 1.1 skrll splt->contents + h->plt.offset + plt_off1);
1668 1.1 skrll }
1669 1.1 skrll else
1670 1.1 skrll {
1671 1.1 skrll memcpy (splt->contents + h->plt.offset, plt_pic_entry,
1672 1.1 skrll plt_entry_size);
1673 1.1 skrll bfd_put_32 (output_bfd, got_offset,
1674 1.1 skrll splt->contents + h->plt.offset + plt_off1);
1675 1.1 skrll }
1676 1.1 skrll
1677 1.1 skrll /* Fill in the plt entry and make a relocation, if this is a "real"
1678 1.1 skrll PLT entry. */
1679 1.1 skrll if (has_gotplt)
1680 1.1 skrll {
1681 1.1 skrll /* Fill in the offset to the reloc table. */
1682 1.1 skrll bfd_put_32 (output_bfd,
1683 1.1 skrll gotplt_index * sizeof (Elf32_External_Rela),
1684 1.1 skrll splt->contents + h->plt.offset + plt_off2);
1685 1.1 skrll
1686 1.1 skrll /* Fill in the offset to the first PLT entry, where to "jump". */
1687 1.1 skrll bfd_put_32 (output_bfd,
1688 1.1 skrll - (h->plt.offset + plt_off3 + plt_off3_value_bias),
1689 1.1 skrll splt->contents + h->plt.offset + plt_off3);
1690 1.1 skrll
1691 1.1 skrll /* Fill in the entry in the global offset table with the address of
1692 1.1 skrll the relocating stub. */
1693 1.1 skrll bfd_put_32 (output_bfd,
1694 1.1 skrll (splt->output_section->vma
1695 1.1 skrll + splt->output_offset
1696 1.1 skrll + h->plt.offset
1697 1.1 skrll + plt_stub_offset),
1698 1.1 skrll sgotplt->contents + got_offset);
1699 1.1 skrll
1700 1.1 skrll /* Fill in the entry in the .rela.plt section. */
1701 1.1 skrll rela.r_offset = (sgotplt->output_section->vma
1702 1.1 skrll + sgotplt->output_offset
1703 1.1 skrll + got_offset);
1704 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_JUMP_SLOT);
1705 1.1 skrll rela.r_addend = 0;
1706 1.1 skrll loc = srela->contents + gotplt_index * sizeof (Elf32_External_Rela);
1707 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1708 1.1 skrll }
1709 1.1 skrll
1710 1.1 skrll if (!h->def_regular)
1711 1.1 skrll {
1712 1.1 skrll /* Mark the symbol as undefined, rather than as defined in
1713 1.1 skrll the .plt section. Leave the value alone. */
1714 1.1 skrll sym->st_shndx = SHN_UNDEF;
1715 1.1 skrll
1716 1.1 skrll /* FIXME: From elf32-sparc.c 2001-02-19 (1.18). I still don't
1717 1.1 skrll know whether resetting the value is significant; if it really
1718 1.1 skrll is, rather than a quirk or bug in the sparc port, then I
1719 1.1 skrll believe we'd see this elsewhere. */
1720 1.1 skrll /* If the symbol is weak, we do need to clear the value.
1721 1.1 skrll Otherwise, the PLT entry would provide a definition for
1722 1.1 skrll the symbol even if the symbol wasn't defined anywhere,
1723 1.1 skrll and so the symbol would never be NULL. */
1724 1.1 skrll if (!h->ref_regular_nonweak)
1725 1.1 skrll sym->st_value = 0;
1726 1.1 skrll }
1727 1.1 skrll }
1728 1.1 skrll
1729 1.1 skrll /* For an ordinary program, we emit .got relocs only for symbols that
1730 1.1 skrll are in the dynamic-symbols table and are either defined by the
1731 1.1 skrll program or are undefined weak symbols, or are function symbols
1732 1.1 skrll where we do not output a PLT: the PLT reloc was output above and all
1733 1.1 skrll references to the function symbol are redirected to the PLT. */
1734 1.1 skrll if (h->got.offset != (bfd_vma) -1
1735 1.1 skrll && (info->shared
1736 1.1 skrll || (h->dynindx != -1
1737 1.1 skrll && h->plt.offset == (bfd_vma) -1
1738 1.1 skrll && !h->def_regular
1739 1.1 skrll && h->root.type != bfd_link_hash_undefweak)))
1740 1.1 skrll {
1741 1.1 skrll asection *sgot;
1742 1.1 skrll asection *srela;
1743 1.1 skrll Elf_Internal_Rela rela;
1744 1.1 skrll bfd_byte *loc;
1745 1.1 skrll bfd_byte *where;
1746 1.1 skrll
1747 1.1 skrll /* This symbol has an entry in the global offset table. Set it up. */
1748 1.1 skrll
1749 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
1750 1.1 skrll srela = bfd_get_section_by_name (dynobj, ".rela.got");
1751 1.1 skrll BFD_ASSERT (sgot != NULL && srela != NULL);
1752 1.1 skrll
1753 1.1 skrll rela.r_offset = (sgot->output_section->vma
1754 1.1 skrll + sgot->output_offset
1755 1.1 skrll + (h->got.offset &~ (bfd_vma) 1));
1756 1.1 skrll
1757 1.1 skrll /* If this is a static link, or it is a -Bsymbolic link and the
1758 1.1 skrll symbol is defined locally or was forced to be local because
1759 1.1 skrll of a version file, we just want to emit a RELATIVE reloc.
1760 1.1 skrll The entry in the global offset table will already have been
1761 1.1 skrll initialized in the relocate_section function. */
1762 1.1 skrll where = sgot->contents + (h->got.offset &~ (bfd_vma) 1);
1763 1.1 skrll if (! elf_hash_table (info)->dynamic_sections_created
1764 1.1 skrll || (info->shared
1765 1.1 skrll && (info->symbolic || h->dynindx == -1)
1766 1.1 skrll && h->def_regular))
1767 1.1 skrll {
1768 1.1 skrll rela.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1769 1.1 skrll rela.r_addend = bfd_get_signed_32 (output_bfd, where);
1770 1.1 skrll }
1771 1.1 skrll else
1772 1.1 skrll {
1773 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, where);
1774 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_GLOB_DAT);
1775 1.1 skrll rela.r_addend = 0;
1776 1.1 skrll }
1777 1.1 skrll
1778 1.1 skrll loc = srela->contents;
1779 1.1 skrll loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
1780 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1781 1.1 skrll }
1782 1.1 skrll
1783 1.1 skrll if (h->needs_copy)
1784 1.1 skrll {
1785 1.1 skrll asection *s;
1786 1.1 skrll Elf_Internal_Rela rela;
1787 1.1 skrll bfd_byte *loc;
1788 1.1 skrll
1789 1.1 skrll /* This symbol needs a copy reloc. Set it up. */
1790 1.1 skrll
1791 1.1 skrll BFD_ASSERT (h->dynindx != -1
1792 1.1 skrll && (h->root.type == bfd_link_hash_defined
1793 1.1 skrll || h->root.type == bfd_link_hash_defweak));
1794 1.1 skrll
1795 1.1 skrll s = bfd_get_section_by_name (h->root.u.def.section->owner,
1796 1.1 skrll ".rela.bss");
1797 1.1 skrll BFD_ASSERT (s != NULL);
1798 1.1 skrll
1799 1.1 skrll rela.r_offset = (h->root.u.def.value
1800 1.1 skrll + h->root.u.def.section->output_section->vma
1801 1.1 skrll + h->root.u.def.section->output_offset);
1802 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_COPY);
1803 1.1 skrll rela.r_addend = 0;
1804 1.1 skrll loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
1805 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1806 1.1 skrll }
1807 1.1 skrll
1808 1.1 skrll /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
1809 1.1 skrll if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1810 1.1 skrll || h == elf_hash_table (info)->hgot)
1811 1.1 skrll sym->st_shndx = SHN_ABS;
1812 1.1 skrll
1813 1.1 skrll return TRUE;
1814 1.1 skrll }
1815 1.1 skrll
1816 1.1 skrll /* Finish up the dynamic sections. */
1818 1.1 skrll
1819 1.1 skrll static bfd_boolean
1820 1.1 skrll elf_cris_finish_dynamic_sections (output_bfd, info)
1821 1.1 skrll bfd *output_bfd;
1822 1.1 skrll struct bfd_link_info *info;
1823 1.1 skrll {
1824 1.1 skrll bfd *dynobj;
1825 1.1 skrll asection *sgot;
1826 1.1 skrll asection *sdyn;
1827 1.1 skrll
1828 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
1829 1.1 skrll
1830 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1831 1.1 skrll BFD_ASSERT (sgot != NULL);
1832 1.1 skrll sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1833 1.1 skrll
1834 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created)
1835 1.1 skrll {
1836 1.1 skrll asection *splt;
1837 1.1 skrll Elf32_External_Dyn *dyncon, *dynconend;
1838 1.1 skrll
1839 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
1840 1.1 skrll BFD_ASSERT (splt != NULL && sdyn != NULL);
1841 1.1 skrll
1842 1.1 skrll dyncon = (Elf32_External_Dyn *) sdyn->contents;
1843 1.1 skrll dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
1844 1.1 skrll for (; dyncon < dynconend; dyncon++)
1845 1.1 skrll {
1846 1.1 skrll Elf_Internal_Dyn dyn;
1847 1.1 skrll asection *s;
1848 1.1 skrll
1849 1.1 skrll bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1850 1.1 skrll
1851 1.1 skrll switch (dyn.d_tag)
1852 1.1 skrll {
1853 1.1 skrll default:
1854 1.1 skrll break;
1855 1.1 skrll
1856 1.1 skrll case DT_PLTGOT:
1857 1.1 skrll s = bfd_get_section_by_name (output_bfd, ".got");
1858 1.1 skrll BFD_ASSERT (s != NULL);
1859 1.1 skrll dyn.d_un.d_ptr = s->vma;
1860 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1861 1.1 skrll break;
1862 1.1 skrll
1863 1.1 skrll case DT_JMPREL:
1864 1.1 skrll /* Yes, we *can* have a .plt and no .plt.rela, for instance
1865 1.1 skrll if all symbols are found in the .got (not .got.plt). */
1866 1.1 skrll s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1867 1.1 skrll dyn.d_un.d_ptr = s != NULL ? s->vma : 0;
1868 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1869 1.1 skrll break;
1870 1.1 skrll
1871 1.1 skrll case DT_PLTRELSZ:
1872 1.1 skrll s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1873 1.1 skrll if (s == NULL)
1874 1.1 skrll dyn.d_un.d_val = 0;
1875 1.1 skrll else
1876 1.1 skrll dyn.d_un.d_val = s->size;
1877 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1878 1.1 skrll break;
1879 1.1 skrll
1880 1.1 skrll case DT_RELASZ:
1881 1.1 skrll /* The procedure linkage table relocs (DT_JMPREL) should
1882 1.1 skrll not be included in the overall relocs (DT_RELA).
1883 1.1 skrll Therefore, we override the DT_RELASZ entry here to
1884 1.1 skrll make it not include the JMPREL relocs. Since the
1885 1.1 skrll linker script arranges for .rela.plt to follow all
1886 1.1 skrll other relocation sections, we don't have to worry
1887 1.1 skrll about changing the DT_RELA entry. */
1888 1.1 skrll s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1889 1.1 skrll if (s != NULL)
1890 1.1 skrll dyn.d_un.d_val -= s->size;
1891 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1892 1.1 skrll break;
1893 1.1 skrll }
1894 1.1 skrll }
1895 1.1 skrll
1896 1.1 skrll /* Fill in the first entry in the procedure linkage table. */
1897 1.1 skrll if (splt->size > 0)
1898 1.1 skrll {
1899 1.1 skrll if (bfd_get_mach (output_bfd) == bfd_mach_cris_v32)
1900 1.1 skrll {
1901 1.1 skrll if (info->shared)
1902 1.1 skrll memcpy (splt->contents, elf_cris_pic_plt0_entry_v32,
1903 1.1 skrll PLT_ENTRY_SIZE_V32);
1904 1.1 skrll else
1905 1.1 skrll {
1906 1.1 skrll memcpy (splt->contents, elf_cris_plt0_entry_v32,
1907 1.1 skrll PLT_ENTRY_SIZE_V32);
1908 1.1 skrll bfd_put_32 (output_bfd,
1909 1.1 skrll sgot->output_section->vma
1910 1.1 skrll + sgot->output_offset + 4,
1911 1.1 skrll splt->contents + 4);
1912 1.1 skrll
1913 1.1 skrll elf_section_data (splt->output_section)->this_hdr.sh_entsize
1914 1.1 skrll = PLT_ENTRY_SIZE_V32;
1915 1.1 skrll }
1916 1.1 skrll }
1917 1.1 skrll else
1918 1.1 skrll {
1919 1.1 skrll if (info->shared)
1920 1.1 skrll memcpy (splt->contents, elf_cris_pic_plt0_entry,
1921 1.1 skrll PLT_ENTRY_SIZE);
1922 1.1 skrll else
1923 1.1 skrll {
1924 1.1 skrll memcpy (splt->contents, elf_cris_plt0_entry,
1925 1.1 skrll PLT_ENTRY_SIZE);
1926 1.1 skrll bfd_put_32 (output_bfd,
1927 1.1 skrll sgot->output_section->vma
1928 1.1 skrll + sgot->output_offset + 4,
1929 1.1 skrll splt->contents + 6);
1930 1.1 skrll bfd_put_32 (output_bfd,
1931 1.1 skrll sgot->output_section->vma
1932 1.1 skrll + sgot->output_offset + 8,
1933 1.1 skrll splt->contents + 14);
1934 1.1 skrll
1935 1.1 skrll elf_section_data (splt->output_section)->this_hdr.sh_entsize
1936 1.1 skrll = PLT_ENTRY_SIZE;
1937 1.1 skrll }
1938 1.1 skrll }
1939 1.1 skrll }
1940 1.1 skrll }
1941 1.1 skrll
1942 1.1 skrll /* Fill in the first three entries in the global offset table. */
1943 1.1 skrll if (sgot->size > 0)
1944 1.1 skrll {
1945 1.1 skrll if (sdyn == NULL)
1946 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1947 1.1 skrll else
1948 1.1 skrll bfd_put_32 (output_bfd,
1949 1.1 skrll sdyn->output_section->vma + sdyn->output_offset,
1950 1.1 skrll sgot->contents);
1951 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
1952 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
1953 1.1 skrll }
1954 1.1 skrll
1955 1.1 skrll elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1956 1.1 skrll
1957 1.1 skrll return TRUE;
1958 1.1 skrll }
1959 1.1 skrll
1960 1.1 skrll /* Return the section that should be marked against GC for a given
1962 1.1 skrll relocation. */
1963 1.1 skrll
1964 1.1 skrll static asection *
1965 1.1 skrll cris_elf_gc_mark_hook (asection *sec,
1966 1.1 skrll struct bfd_link_info *info,
1967 1.1 skrll Elf_Internal_Rela *rel,
1968 1.1 skrll struct elf_link_hash_entry *h,
1969 1.1 skrll Elf_Internal_Sym *sym)
1970 1.1 skrll {
1971 1.1 skrll if (h != NULL)
1972 1.1 skrll switch (ELF32_R_TYPE (rel->r_info))
1973 1.1 skrll {
1974 1.1 skrll case R_CRIS_GNU_VTINHERIT:
1975 1.1 skrll case R_CRIS_GNU_VTENTRY:
1976 1.1 skrll return NULL;
1977 1.1 skrll }
1978 1.1 skrll
1979 1.1 skrll return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1980 1.1 skrll }
1981 1.1 skrll
1982 1.1 skrll /* Update the got entry reference counts for the section being removed. */
1983 1.1 skrll
1984 1.1 skrll static bfd_boolean
1985 1.1 skrll cris_elf_gc_sweep_hook (bfd *abfd,
1986 1.1 skrll struct bfd_link_info *info,
1987 1.1 skrll asection *sec,
1988 1.1 skrll const Elf_Internal_Rela *relocs)
1989 1.1 skrll {
1990 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1991 1.1 skrll struct elf_link_hash_entry **sym_hashes;
1992 1.1 skrll bfd_signed_vma *local_got_refcounts;
1993 1.1 skrll const Elf_Internal_Rela *rel, *relend;
1994 1.1 skrll bfd *dynobj;
1995 1.1 skrll asection *sgot;
1996 1.1 skrll asection *srelgot;
1997 1.1 skrll
1998 1.1 skrll if (info->relocatable)
1999 1.1 skrll return TRUE;
2000 1.1 skrll
2001 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2002 1.1 skrll if (dynobj == NULL)
2003 1.1 skrll return TRUE;
2004 1.1 skrll
2005 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2006 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
2007 1.1 skrll local_got_refcounts = elf_local_got_refcounts (abfd);
2008 1.1 skrll
2009 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
2010 1.1 skrll srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2011 1.1 skrll
2012 1.1 skrll relend = relocs + sec->reloc_count;
2013 1.1 skrll for (rel = relocs; rel < relend; rel++)
2014 1.1 skrll {
2015 1.1 skrll unsigned long r_symndx;
2016 1.1 skrll struct elf_link_hash_entry *h = NULL;
2017 1.1 skrll
2018 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
2019 1.1 skrll if (r_symndx >= symtab_hdr->sh_info)
2020 1.1 skrll {
2021 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2022 1.1 skrll while (h->root.type == bfd_link_hash_indirect
2023 1.1 skrll || h->root.type == bfd_link_hash_warning)
2024 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
2025 1.1 skrll }
2026 1.1 skrll
2027 1.1 skrll switch (ELF32_R_TYPE (rel->r_info))
2028 1.1 skrll {
2029 1.1 skrll case R_CRIS_16_GOT:
2030 1.1 skrll case R_CRIS_32_GOT:
2031 1.1 skrll if (h != NULL)
2032 1.1 skrll {
2033 1.1 skrll if (h->got.refcount > 0)
2034 1.1 skrll {
2035 1.1 skrll --h->got.refcount;
2036 1.1 skrll if (h->got.refcount == 0)
2037 1.1 skrll {
2038 1.1 skrll /* We don't need the .got entry any more. */
2039 1.1 skrll sgot->size -= 4;
2040 1.1 skrll srelgot->size -= sizeof (Elf32_External_Rela);
2041 1.1 skrll }
2042 1.1 skrll }
2043 1.1 skrll break;
2044 1.1 skrll }
2045 1.1 skrll
2046 1.1 skrll local_got_reloc:
2047 1.1 skrll if (local_got_refcounts != NULL)
2048 1.1 skrll {
2049 1.1 skrll if (local_got_refcounts[r_symndx] > 0)
2050 1.1 skrll {
2051 1.1 skrll --local_got_refcounts[r_symndx];
2052 1.1 skrll if (local_got_refcounts[r_symndx] == 0)
2053 1.1 skrll {
2054 1.1 skrll /* We don't need the .got entry any more. */
2055 1.1 skrll sgot->size -= 4;
2056 1.1 skrll if (info->shared)
2057 1.1 skrll srelgot->size -= sizeof (Elf32_External_Rela);
2058 1.1 skrll }
2059 1.1 skrll }
2060 1.1 skrll }
2061 1.1 skrll break;
2062 1.1 skrll
2063 1.1 skrll case R_CRIS_16_GOTPLT:
2064 1.1 skrll case R_CRIS_32_GOTPLT:
2065 1.1 skrll /* For local symbols, treat these like GOT relocs. */
2066 1.1 skrll if (h == NULL)
2067 1.1 skrll goto local_got_reloc;
2068 1.1 skrll /* Fall through. */
2069 1.1 skrll
2070 1.1 skrll case R_CRIS_32_PLT_GOTREL:
2071 1.1 skrll /* FIXME: We don't garbage-collect away the .got section. */
2072 1.1 skrll if (local_got_refcounts != NULL)
2073 1.1 skrll local_got_refcounts[-1]--;
2074 1.1 skrll /* Fall through. */
2075 1.1 skrll
2076 1.1 skrll case R_CRIS_8_PCREL:
2077 1.1 skrll case R_CRIS_16_PCREL:
2078 1.1 skrll case R_CRIS_32_PCREL:
2079 1.1 skrll case R_CRIS_32_PLT_PCREL:
2080 1.1 skrll if (h != NULL)
2081 1.1 skrll {
2082 1.1 skrll if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2083 1.1 skrll && h->plt.refcount > 0)
2084 1.1 skrll --h->plt.refcount;
2085 1.1 skrll }
2086 1.1 skrll break;
2087 1.1 skrll
2088 1.1 skrll default:
2089 1.1 skrll break;
2090 1.1 skrll }
2091 1.1 skrll }
2092 1.1 skrll
2093 1.1 skrll return TRUE;
2094 1.1 skrll }
2095 1.1 skrll
2096 1.1 skrll /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
2097 1.1 skrll entry but we found we will not create any. Called when we find we will
2098 1.1 skrll not have any PLT for this symbol, by for example
2099 1.1 skrll elf_cris_adjust_dynamic_symbol when we're doing a proper dynamic link,
2100 1.1 skrll or elf_cris_size_dynamic_sections if no dynamic sections will be
2101 1.1 skrll created (we're only linking static objects). */
2102 1.1 skrll
2103 1.1 skrll static bfd_boolean
2104 1.1 skrll elf_cris_adjust_gotplt_to_got (h, p)
2105 1.1 skrll struct elf_cris_link_hash_entry *h;
2106 1.1 skrll PTR p;
2107 1.1 skrll {
2108 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) p;
2109 1.1 skrll
2110 1.1 skrll if (h->root.root.type == bfd_link_hash_warning)
2111 1.1 skrll h = (struct elf_cris_link_hash_entry *) h->root.root.u.i.link;
2112 1.1 skrll
2113 1.1 skrll /* If nobody wanted a GOTPLT with this symbol, we're done. */
2114 1.1 skrll if (h->gotplt_refcount <= 0)
2115 1.1 skrll return TRUE;
2116 1.1 skrll
2117 1.1 skrll if (h->root.got.refcount > 0)
2118 1.1 skrll {
2119 1.1 skrll /* There's a GOT entry for this symbol. Just adjust the refcount.
2120 1.1 skrll Probably not necessary at this stage, but keeping it accurate
2121 1.1 skrll helps avoiding surprises later. */
2122 1.1 skrll h->root.got.refcount += h->gotplt_refcount;
2123 1.1 skrll h->gotplt_refcount = 0;
2124 1.1 skrll }
2125 1.1 skrll else
2126 1.1 skrll {
2127 1.1 skrll /* No GOT entry for this symbol. We need to create one. */
2128 1.1 skrll bfd *dynobj = elf_hash_table (info)->dynobj;
2129 1.1 skrll asection *sgot;
2130 1.1 skrll asection *srelgot;
2131 1.1 skrll
2132 1.1 skrll BFD_ASSERT (dynobj != NULL);
2133 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
2134 1.1 skrll srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2135 1.1 skrll
2136 1.1 skrll /* Put an accurate refcount there. */
2137 1.1 skrll h->root.got.refcount = h->gotplt_refcount;
2138 1.1 skrll
2139 1.1 skrll h->gotplt_refcount = 0;
2140 1.1 skrll
2141 1.1 skrll /* We always have a .got and a .rela.got section if there were
2142 1.1 skrll GOTPLT relocs in input. */
2143 1.1 skrll BFD_ASSERT (sgot != NULL && srelgot != NULL);
2144 1.1 skrll
2145 1.1 skrll /* Allocate space in the .got section. */
2146 1.1 skrll sgot->size += 4;
2147 1.1 skrll
2148 1.1 skrll /* Allocate relocation space. */
2149 1.1 skrll srelgot->size += sizeof (Elf32_External_Rela);
2150 1.1 skrll }
2151 1.1 skrll
2152 1.1 skrll return TRUE;
2153 1.1 skrll }
2154 1.1 skrll
2155 1.1 skrll /* Try to fold PLT entries with GOT entries. There are two cases when we
2156 1.1 skrll want to do this:
2157 1.1 skrll
2158 1.1 skrll - When all PLT references are GOTPLT references, and there are GOT
2159 1.1 skrll references, and this is not the executable. We don't have to
2160 1.1 skrll generate a PLT at all.
2161 1.1 skrll
2162 1.1 skrll - When there are both (ordinary) PLT references and GOT references,
2163 1.1 skrll and this isn't the executable.
2164 1.1 skrll We want to make the PLT reference use the ordinary GOT entry rather
2165 1.1 skrll than R_CRIS_JUMP_SLOT, a run-time dynamically resolved GOTPLT entry,
2166 1.1 skrll since the GOT entry will have to be resolved at startup anyway.
2167 1.1 skrll
2168 1.1 skrll Though the latter case is handled when room for the PLT is allocated,
2169 1.1 skrll not here.
2170 1.1 skrll
2171 1.1 skrll By folding into the GOT, we may need a round-trip to a PLT in the
2172 1.1 skrll executable for calls, a loss in performance. Still, losing a
2173 1.1 skrll reloc is a win in size and at least in start-up time.
2174 1.1 skrll
2175 1.1 skrll Note that this function is called before symbols are forced local by
2176 1.1 skrll version scripts. The differing cases are handled by
2177 1.1 skrll elf_cris_hide_symbol. */
2178 1.1 skrll
2179 1.1 skrll static bfd_boolean
2180 1.1 skrll elf_cris_try_fold_plt_to_got (h, p)
2181 1.1 skrll struct elf_cris_link_hash_entry *h;
2182 1.1 skrll PTR p;
2183 1.1 skrll {
2184 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) p;
2185 1.1 skrll
2186 1.1 skrll /* If there are no GOT references for this symbol, we can't fold any
2187 1.1 skrll other reference so there's nothing to do. Likewise if there are no
2188 1.1 skrll PLT references; GOTPLT references included. */
2189 1.1 skrll if (h->root.got.refcount <= 0 || h->root.plt.refcount <= 0)
2190 1.1 skrll return TRUE;
2191 1.1 skrll
2192 1.1 skrll /* GOTPLT relocs are supposed to be included into the PLT refcount. */
2193 1.1 skrll BFD_ASSERT (h->gotplt_refcount <= h->root.plt.refcount);
2194 1.1 skrll
2195 1.1 skrll if (h->gotplt_refcount == h->root.plt.refcount)
2196 1.1 skrll {
2197 1.1 skrll /* The only PLT references are GOTPLT references, and there are GOT
2198 1.1 skrll references. Convert PLT to GOT references. */
2199 1.1 skrll if (! elf_cris_adjust_gotplt_to_got (h, info))
2200 1.1 skrll return FALSE;
2201 1.1 skrll
2202 1.1 skrll /* Clear the PLT references, so no PLT will be created. */
2203 1.1 skrll h->root.plt.offset = (bfd_vma) -1;
2204 1.1 skrll }
2205 1.1 skrll
2206 1.1 skrll return TRUE;
2207 1.1 skrll }
2208 1.1 skrll
2209 1.1 skrll /* Our own version of hide_symbol, so that we can adjust a GOTPLT reloc
2210 1.1 skrll to use a GOT entry (and create one) rather than requiring a GOTPLT
2211 1.1 skrll entry. */
2212 1.1 skrll
2213 1.1 skrll static void
2214 1.1 skrll elf_cris_hide_symbol (info, h, force_local)
2215 1.1 skrll struct bfd_link_info *info;
2216 1.1 skrll struct elf_link_hash_entry *h;
2217 1.1 skrll bfd_boolean force_local;
2218 1.1 skrll {
2219 1.1 skrll elf_cris_adjust_gotplt_to_got ((struct elf_cris_link_hash_entry *) h, info);
2220 1.1 skrll
2221 1.1 skrll _bfd_elf_link_hash_hide_symbol (info, h, force_local);
2222 1.1 skrll }
2223 1.1 skrll
2224 1.1 skrll /* Adjust a symbol defined by a dynamic object and referenced by a
2225 1.1 skrll regular object. The current definition is in some section of the
2226 1.1 skrll dynamic object, but we're not including those sections. We have to
2227 1.1 skrll change the definition to something the rest of the link can
2228 1.1 skrll understand. */
2229 1.1 skrll
2230 1.1 skrll static bfd_boolean
2231 1.1 skrll elf_cris_adjust_dynamic_symbol (info, h)
2232 1.1 skrll struct bfd_link_info *info;
2233 1.1 skrll struct elf_link_hash_entry *h;
2234 1.1 skrll {
2235 1.1 skrll bfd *dynobj;
2236 1.1 skrll asection *s;
2237 1.1 skrll bfd_size_type plt_entry_size;
2238 1.1 skrll
2239 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2240 1.1 skrll
2241 1.1 skrll /* Make sure we know what is going on here. */
2242 1.1 skrll BFD_ASSERT (dynobj != NULL
2243 1.1 skrll && (h->needs_plt
2244 1.1 skrll || h->u.weakdef != NULL
2245 1.1 skrll || (h->def_dynamic
2246 1.1 skrll && h->ref_regular
2247 1.1 skrll && !h->def_regular)));
2248 1.1 skrll
2249 1.1 skrll plt_entry_size
2250 1.1 skrll = (bfd_get_mach (dynobj) == bfd_mach_cris_v32
2251 1.1 skrll ? PLT_ENTRY_SIZE_V32 : PLT_ENTRY_SIZE);
2252 1.1 skrll
2253 1.1 skrll /* If this is a function, put it in the procedure linkage table. We
2254 1.1 skrll will fill in the contents of the procedure linkage table later,
2255 1.1 skrll when we know the address of the .got section. */
2256 1.1 skrll if (h->type == STT_FUNC
2257 1.1 skrll || h->needs_plt)
2258 1.1 skrll {
2259 1.1 skrll /* If we link a program (not a DSO), we'll get rid of unnecessary
2260 1.1 skrll PLT entries; we point to the actual symbols -- even for pic
2261 1.1 skrll relocs, because a program built with -fpic should have the same
2262 1.1 skrll result as one built without -fpic, specifically considering weak
2263 1.1 skrll symbols.
2264 1.1 skrll FIXME: m68k and i386 differ here, for unclear reasons. */
2265 1.1 skrll if (! info->shared
2266 1.1 skrll && !h->def_dynamic)
2267 1.1 skrll {
2268 1.1 skrll /* This case can occur if we saw a PLT reloc in an input file,
2269 1.1 skrll but the symbol was not defined by a dynamic object. In such
2270 1.1 skrll a case, we don't actually need to build a procedure linkage
2271 1.1 skrll table, and we can just do an absolute or PC reloc instead, or
2272 1.1 skrll change a .got.plt index to a .got index for GOTPLT relocs. */
2273 1.1 skrll BFD_ASSERT (h->needs_plt);
2274 1.1 skrll h->needs_plt = 0;
2275 1.1 skrll h->plt.offset = (bfd_vma) -1;
2276 1.1 skrll return
2277 1.1 skrll elf_cris_adjust_gotplt_to_got ((struct
2278 1.1 skrll elf_cris_link_hash_entry *) h,
2279 1.1 skrll info);
2280 1.1 skrll }
2281 1.1 skrll
2282 1.1 skrll /* If we had a R_CRIS_GLOB_DAT that didn't have to point to a PLT;
2283 1.1 skrll where a pointer-equivalent symbol was unimportant (i.e. more
2284 1.1 skrll like R_CRIS_JUMP_SLOT after symbol evaluation) we could get rid
2285 1.1 skrll of the PLT. We can't for the executable, because the GOT
2286 1.1 skrll entries will point to the PLT there (and be constant). */
2287 1.1 skrll if (info->shared
2288 1.1 skrll && !elf_cris_try_fold_plt_to_got ((struct elf_cris_link_hash_entry*)
2289 1.1 skrll h, info))
2290 1.1 skrll return FALSE;
2291 1.1 skrll
2292 1.1 skrll /* GC or folding may have rendered this entry unused. */
2293 1.1 skrll if (h->plt.refcount <= 0)
2294 1.1 skrll {
2295 1.1 skrll h->needs_plt = 0;
2296 1.1 skrll h->plt.offset = (bfd_vma) -1;
2297 1.1 skrll return TRUE;
2298 1.1 skrll }
2299 1.1 skrll
2300 1.1 skrll /* Make sure this symbol is output as a dynamic symbol. */
2301 1.1 skrll if (h->dynindx == -1)
2302 1.1 skrll {
2303 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h))
2304 1.1 skrll return FALSE;
2305 1.1 skrll }
2306 1.1 skrll
2307 1.1 skrll s = bfd_get_section_by_name (dynobj, ".plt");
2308 1.1 skrll BFD_ASSERT (s != NULL);
2309 1.1 skrll
2310 1.1 skrll /* If this is the first .plt entry, make room for the special
2311 1.1 skrll first entry. */
2312 1.1 skrll if (s->size == 0)
2313 1.1 skrll s->size += plt_entry_size;
2314 1.1 skrll
2315 1.1 skrll /* If this symbol is not defined in a regular file, and we are
2316 1.1 skrll not generating a shared library, then set the symbol to this
2317 1.1 skrll location in the .plt. */
2318 1.1 skrll if (!info->shared
2319 1.1 skrll && !h->def_regular)
2320 1.1 skrll {
2321 1.1 skrll h->root.u.def.section = s;
2322 1.1 skrll h->root.u.def.value = s->size;
2323 1.1 skrll }
2324 1.1 skrll
2325 1.1 skrll /* If there's already a GOT entry, use that, not a .got.plt. A
2326 1.1 skrll GOT field still has a reference count when we get here; it's
2327 1.1 skrll not yet changed to an offset. We can't do this for an
2328 1.1 skrll executable, because then the reloc associated with the PLT
2329 1.1 skrll would get a non-PLT reloc pointing to the PLT. FIXME: Move
2330 1.1 skrll this to elf_cris_try_fold_plt_to_got. */
2331 1.1 skrll if (info->shared && h->got.refcount > 0)
2332 1.1 skrll {
2333 1.1 skrll h->got.refcount += h->plt.refcount;
2334 1.1 skrll
2335 1.1 skrll /* Mark the PLT offset to use the GOT entry by setting the low
2336 1.1 skrll bit in the plt offset; it is always a multiple of
2337 1.1 skrll plt_entry_size (which is at least a multiple of 2). */
2338 1.1 skrll BFD_ASSERT ((s->size % plt_entry_size) == 0);
2339 1.1 skrll
2340 1.1 skrll /* Change the PLT refcount to an offset. */
2341 1.1 skrll h->plt.offset = s->size;
2342 1.1 skrll
2343 1.1 skrll /* By not setting gotplt_offset (i.e. it remains at 0), we signal
2344 1.1 skrll that the got entry should be used instead. */
2345 1.1 skrll BFD_ASSERT (((struct elf_cris_link_hash_entry *)
2346 1.1 skrll h)->gotplt_offset == 0);
2347 1.1 skrll
2348 1.1 skrll /* Make room for this entry. */
2349 1.1 skrll s->size += plt_entry_size;
2350 1.1 skrll
2351 1.1 skrll return TRUE;
2352 1.1 skrll }
2353 1.1 skrll
2354 1.1 skrll /* No GOT reference for this symbol; prepare for an ordinary PLT. */
2355 1.1 skrll h->plt.offset = s->size;
2356 1.1 skrll
2357 1.1 skrll /* Make room for this entry. */
2358 1.1 skrll s->size += plt_entry_size;
2359 1.1 skrll
2360 1.1 skrll /* We also need to make an entry in the .got.plt section, which
2361 1.1 skrll will be placed in the .got section by the linker script. */
2362 1.1 skrll ((struct elf_cris_link_hash_entry *) h)->gotplt_offset
2363 1.1 skrll = elf_cris_hash_table (info)->next_gotplt_entry;
2364 1.1 skrll elf_cris_hash_table (info)->next_gotplt_entry += 4;
2365 1.1 skrll
2366 1.1 skrll s = bfd_get_section_by_name (dynobj, ".got.plt");
2367 1.1 skrll BFD_ASSERT (s != NULL);
2368 1.1 skrll s->size += 4;
2369 1.1 skrll
2370 1.1 skrll /* We also need to make an entry in the .rela.plt section. */
2371 1.1 skrll
2372 1.1 skrll s = bfd_get_section_by_name (dynobj, ".rela.plt");
2373 1.1 skrll BFD_ASSERT (s != NULL);
2374 1.1 skrll s->size += sizeof (Elf32_External_Rela);
2375 1.1 skrll
2376 1.1 skrll return TRUE;
2377 1.1 skrll }
2378 1.1 skrll
2379 1.1 skrll /* Reinitialize the plt offset now that it is not used as a reference
2380 1.1 skrll count any more. */
2381 1.1 skrll h->plt.offset = (bfd_vma) -1;
2382 1.1 skrll
2383 1.1 skrll /* If this is a weak symbol, and there is a real definition, the
2384 1.1 skrll processor independent code will have arranged for us to see the
2385 1.1 skrll real definition first, and we can just use the same value. */
2386 1.1 skrll if (h->u.weakdef != NULL)
2387 1.1 skrll {
2388 1.1 skrll BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2389 1.1 skrll || h->u.weakdef->root.type == bfd_link_hash_defweak);
2390 1.1 skrll h->root.u.def.section = h->u.weakdef->root.u.def.section;
2391 1.1 skrll h->root.u.def.value = h->u.weakdef->root.u.def.value;
2392 1.1 skrll return TRUE;
2393 1.1 skrll }
2394 1.1 skrll
2395 1.1 skrll /* This is a reference to a symbol defined by a dynamic object which
2396 1.1 skrll is not a function. */
2397 1.1 skrll
2398 1.1 skrll /* If we are creating a shared library, we must presume that the
2399 1.1 skrll only references to the symbol are via the global offset table.
2400 1.1 skrll For such cases we need not do anything here; the relocations will
2401 1.1 skrll be handled correctly by relocate_section. */
2402 1.1 skrll if (info->shared)
2403 1.1 skrll return TRUE;
2404 1.1 skrll
2405 1.1 skrll /* If there are no references to this symbol that do not use the
2406 1.1 skrll GOT, we don't need to generate a copy reloc. */
2407 1.1 skrll if (!h->non_got_ref)
2408 1.1 skrll return TRUE;
2409 1.1 skrll
2410 1.1 skrll if (h->size == 0)
2411 1.1 skrll {
2412 1.1 skrll (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
2413 1.1 skrll h->root.root.string);
2414 1.1 skrll return TRUE;
2415 1.1 skrll }
2416 1.1 skrll
2417 1.1 skrll /* We must allocate the symbol in our .dynbss section, which will
2418 1.1 skrll become part of the .bss section of the executable. There will be
2419 1.1 skrll an entry for this symbol in the .dynsym section. The dynamic
2420 1.1 skrll object will contain position independent code, so all references
2421 1.1 skrll from the dynamic object to this symbol will go through the global
2422 1.1 skrll offset table. The dynamic linker will use the .dynsym entry to
2423 1.1 skrll determine the address it must put in the global offset table, so
2424 1.1 skrll both the dynamic object and the regular object will refer to the
2425 1.1 skrll same memory location for the variable. */
2426 1.1 skrll
2427 1.1 skrll s = bfd_get_section_by_name (dynobj, ".dynbss");
2428 1.1 skrll BFD_ASSERT (s != NULL);
2429 1.1 skrll
2430 1.1 skrll /* We must generate a R_CRIS_COPY reloc to tell the dynamic linker to
2431 1.1 skrll copy the initial value out of the dynamic object and into the
2432 1.1 skrll runtime process image. We need to remember the offset into the
2433 1.1 skrll .rela.bss section we are going to use. */
2434 1.1 skrll if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2435 1.1 skrll {
2436 1.1 skrll asection *srel;
2437 1.1 skrll
2438 1.1 skrll srel = bfd_get_section_by_name (dynobj, ".rela.bss");
2439 1.1 skrll BFD_ASSERT (srel != NULL);
2440 1.1 skrll srel->size += sizeof (Elf32_External_Rela);
2441 1.1 skrll h->needs_copy = 1;
2442 1.1 skrll }
2443 1.1 skrll
2444 1.1 skrll return _bfd_elf_adjust_dynamic_copy (h, s);
2445 1.1 skrll }
2446 1.1 skrll
2447 1.1 skrll /* Look through the relocs for a section during the first phase. */
2448 1.1 skrll
2449 1.1 skrll static bfd_boolean
2450 1.1 skrll cris_elf_check_relocs (abfd, info, sec, relocs)
2451 1.1 skrll bfd *abfd;
2452 1.1 skrll struct bfd_link_info *info;
2453 1.1 skrll asection *sec;
2454 1.1 skrll const Elf_Internal_Rela *relocs;
2455 1.1 skrll {
2456 1.1 skrll bfd *dynobj;
2457 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2458 1.1 skrll struct elf_link_hash_entry **sym_hashes;
2459 1.1 skrll bfd_signed_vma *local_got_refcounts;
2460 1.1 skrll const Elf_Internal_Rela *rel;
2461 1.1 skrll const Elf_Internal_Rela *rel_end;
2462 1.1 skrll asection *sgot;
2463 1.1 skrll asection *srelgot;
2464 1.1 skrll asection *sreloc;
2465 1.1 skrll
2466 1.1 skrll if (info->relocatable)
2467 1.1 skrll return TRUE;
2468 1.1 skrll
2469 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2470 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2471 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
2472 1.1 skrll local_got_refcounts = elf_local_got_refcounts (abfd);
2473 1.1 skrll
2474 1.1 skrll sgot = NULL;
2475 1.1 skrll srelgot = NULL;
2476 1.1 skrll sreloc = NULL;
2477 1.1 skrll
2478 1.1 skrll rel_end = relocs + sec->reloc_count;
2479 1.1 skrll for (rel = relocs; rel < rel_end; rel++)
2480 1.1 skrll {
2481 1.1 skrll struct elf_link_hash_entry *h;
2482 1.1 skrll unsigned long r_symndx;
2483 1.1 skrll enum elf_cris_reloc_type r_type;
2484 1.1 skrll
2485 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
2486 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
2487 1.1 skrll h = NULL;
2488 1.1 skrll else
2489 1.1 skrll {
2490 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2491 1.1 skrll while (h->root.type == bfd_link_hash_indirect
2492 1.1 skrll || h->root.type == bfd_link_hash_warning)
2493 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
2494 1.1 skrll }
2495 1.1 skrll
2496 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
2497 1.1 skrll
2498 1.1 skrll /* Some relocs require linker-created sections; we need to hang them
2499 1.1 skrll on the first input bfd we found that contained dynamic relocs. */
2500 1.1 skrll switch (r_type)
2501 1.1 skrll {
2502 1.1 skrll case R_CRIS_16_GOT:
2503 1.1 skrll case R_CRIS_32_GOT:
2504 1.1 skrll case R_CRIS_32_GOTREL:
2505 1.1 skrll case R_CRIS_32_PLT_GOTREL:
2506 1.1 skrll case R_CRIS_32_PLT_PCREL:
2507 1.1 skrll case R_CRIS_16_GOTPLT:
2508 1.1 skrll case R_CRIS_32_GOTPLT:
2509 1.1 skrll if (dynobj == NULL)
2510 1.1 skrll {
2511 1.1 skrll elf_hash_table (info)->dynobj = dynobj = abfd;
2512 1.1 skrll
2513 1.1 skrll /* We could handle this if we can get a handle on the
2514 1.1 skrll output bfd in elf_cris_adjust_dynamic_symbol. Failing
2515 1.1 skrll that, we must insist on dynobj being a specific mach. */
2516 1.1 skrll if (bfd_get_mach (dynobj) == bfd_mach_cris_v10_v32)
2517 1.1 skrll {
2518 1.1 skrll (*_bfd_error_handler)
2519 1.1 skrll (_("%B, section %A:\n v10/v32 compatible object %s"
2520 1.1 skrll " must not contain a PIC relocation"),
2521 1.1 skrll abfd, sec);
2522 1.1 skrll return FALSE;
2523 1.1 skrll }
2524 1.1 skrll
2525 1.1 skrll /* Create the .got section, so we can assume it's always
2526 1.1 skrll present whenever there's a dynobj. */
2527 1.1 skrll if (!_bfd_elf_create_got_section (dynobj, info))
2528 1.1 skrll return FALSE;
2529 1.1 skrll }
2530 1.1 skrll break;
2531 1.1 skrll
2532 1.1 skrll default:
2533 1.1 skrll break;
2534 1.1 skrll }
2535 1.1 skrll
2536 1.1 skrll /* Some relocs require a global offset table (but perhaps not a
2537 1.1 skrll specific GOT entry). */
2538 1.1 skrll switch (r_type)
2539 1.1 skrll {
2540 1.1 skrll /* For R_CRIS_16_GOTPLT and R_CRIS_32_GOTPLT, we need a GOT
2541 1.1 skrll entry only for local symbols. Unfortunately, we don't know
2542 1.1 skrll until later on if there's a version script that forces the
2543 1.1 skrll symbol local. We must have the .rela.got section in place
2544 1.1 skrll before we know if the symbol looks global now, so we need
2545 1.1 skrll to treat the reloc just like for R_CRIS_16_GOT and
2546 1.1 skrll R_CRIS_32_GOT. */
2547 1.1 skrll case R_CRIS_16_GOTPLT:
2548 1.1 skrll case R_CRIS_32_GOTPLT:
2549 1.1 skrll case R_CRIS_16_GOT:
2550 1.1 skrll case R_CRIS_32_GOT:
2551 1.1 skrll if (srelgot == NULL
2552 1.1 skrll && (h != NULL || info->shared))
2553 1.1 skrll {
2554 1.1 skrll srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2555 1.1 skrll if (srelgot == NULL)
2556 1.1 skrll {
2557 1.1 skrll srelgot = bfd_make_section_with_flags (dynobj,
2558 1.1 skrll ".rela.got",
2559 1.1 skrll (SEC_ALLOC
2560 1.1 skrll | SEC_LOAD
2561 1.1 skrll | SEC_HAS_CONTENTS
2562 1.1 skrll | SEC_IN_MEMORY
2563 1.1 skrll | SEC_LINKER_CREATED
2564 1.1 skrll | SEC_READONLY));
2565 1.1 skrll if (srelgot == NULL
2566 1.1 skrll || !bfd_set_section_alignment (dynobj, srelgot, 2))
2567 1.1 skrll return FALSE;
2568 1.1 skrll }
2569 1.1 skrll }
2570 1.1 skrll /* Fall through. */
2571 1.1 skrll
2572 1.1 skrll case R_CRIS_32_GOTREL:
2573 1.1 skrll case R_CRIS_32_PLT_GOTREL:
2574 1.1 skrll if (sgot == NULL)
2575 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
2576 1.1 skrll
2577 1.1 skrll if (local_got_refcounts == NULL)
2578 1.1 skrll {
2579 1.1 skrll bfd_size_type amt;
2580 1.1 skrll
2581 1.1 skrll /* We use index local_got_refcounts[-1] to count all
2582 1.1 skrll GOT-relative relocations that do not have explicit
2583 1.1 skrll GOT entries. */
2584 1.1 skrll amt = symtab_hdr->sh_info + 1;
2585 1.1 skrll amt *= sizeof (bfd_signed_vma);
2586 1.1 skrll local_got_refcounts = ((bfd_signed_vma *) bfd_zalloc (abfd, amt));
2587 1.1 skrll if (local_got_refcounts == NULL)
2588 1.1 skrll return FALSE;
2589 1.1 skrll
2590 1.1 skrll local_got_refcounts++;
2591 1.1 skrll elf_local_got_refcounts (abfd) = local_got_refcounts;
2592 1.1 skrll }
2593 1.1 skrll break;
2594 1.1 skrll
2595 1.1 skrll default:
2596 1.1 skrll break;
2597 1.1 skrll }
2598 1.1 skrll
2599 1.1 skrll switch (r_type)
2600 1.1 skrll {
2601 1.1 skrll case R_CRIS_16_GOTPLT:
2602 1.1 skrll case R_CRIS_32_GOTPLT:
2603 1.1 skrll /* Mark that we need a GOT entry if the PLT entry (and its GOT
2604 1.1 skrll entry) is eliminated. We can only do this for a non-local
2605 1.1 skrll symbol. */
2606 1.1 skrll if (h != NULL)
2607 1.1 skrll {
2608 1.1 skrll ((struct elf_cris_link_hash_entry *) h)->gotplt_refcount++;
2609 1.1 skrll goto handle_gotplt_reloc;
2610 1.1 skrll }
2611 1.1 skrll /* If h is NULL then this is a local symbol, and we must make a
2612 1.1 skrll GOT entry for it, so handle it like a GOT reloc. */
2613 1.1 skrll /* Fall through. */
2614 1.1 skrll
2615 1.1 skrll case R_CRIS_16_GOT:
2616 1.1 skrll case R_CRIS_32_GOT:
2617 1.1 skrll /* This symbol requires a global offset table entry. */
2618 1.1 skrll if (h != NULL)
2619 1.1 skrll {
2620 1.1 skrll if (h->got.refcount == 0)
2621 1.1 skrll {
2622 1.1 skrll /* Make sure this symbol is output as a dynamic symbol. */
2623 1.1 skrll if (h->dynindx == -1)
2624 1.1 skrll {
2625 1.1 skrll if (!bfd_elf_link_record_dynamic_symbol (info, h))
2626 1.1 skrll return FALSE;
2627 1.1 skrll }
2628 1.1 skrll
2629 1.1 skrll /* Allocate space in the .got section. */
2630 1.1 skrll sgot->size += 4;
2631 1.1 skrll /* Allocate relocation space. */
2632 1.1 skrll srelgot->size += sizeof (Elf32_External_Rela);
2633 1.1 skrll }
2634 1.1 skrll h->got.refcount++;
2635 1.1 skrll }
2636 1.1 skrll else
2637 1.1 skrll {
2638 1.1 skrll /* This is a global offset table entry for a local symbol. */
2639 1.1 skrll if (local_got_refcounts[r_symndx] == 0)
2640 1.1 skrll {
2641 1.1 skrll sgot->size += 4;
2642 1.1 skrll if (info->shared)
2643 1.1 skrll {
2644 1.1 skrll /* If we are generating a shared object, we need to
2645 1.1 skrll output a R_CRIS_RELATIVE reloc so that the dynamic
2646 1.1 skrll linker can adjust this GOT entry. */
2647 1.1 skrll srelgot->size += sizeof (Elf32_External_Rela);
2648 1.1 skrll }
2649 1.1 skrll }
2650 1.1 skrll local_got_refcounts[r_symndx]++;
2651 1.1 skrll }
2652 1.1 skrll break;
2653 1.1 skrll
2654 1.1 skrll case R_CRIS_32_GOTREL:
2655 1.1 skrll /* This reference requires a global offset table.
2656 1.1 skrll FIXME: The actual refcount isn't used currently; the .got
2657 1.1 skrll section can't be removed if there were any references in the
2658 1.1 skrll input. */
2659 1.1 skrll local_got_refcounts[-1]++;
2660 1.1 skrll break;
2661 1.1 skrll
2662 1.1 skrll handle_gotplt_reloc:
2663 1.1 skrll
2664 1.1 skrll case R_CRIS_32_PLT_GOTREL:
2665 1.1 skrll /* This reference requires a global offset table. */
2666 1.1 skrll local_got_refcounts[-1]++;
2667 1.1 skrll /* Fall through. */
2668 1.1 skrll
2669 1.1 skrll case R_CRIS_32_PLT_PCREL:
2670 1.1 skrll /* This symbol requires a procedure linkage table entry. We
2671 1.1 skrll actually build the entry in adjust_dynamic_symbol,
2672 1.1 skrll because this might be a case of linking PIC code which is
2673 1.1 skrll never referenced by a dynamic object, in which case we
2674 1.1 skrll don't need to generate a procedure linkage table entry
2675 1.1 skrll after all. */
2676 1.1 skrll
2677 1.1 skrll /* Beware: if we'd check for visibility of the symbol here
2678 1.1 skrll (and not marking the need for a PLT when non-visible), we'd
2679 1.1 skrll get into trouble with keeping handling consistent with
2680 1.1 skrll regards to relocs found before definition and GOTPLT
2681 1.1 skrll handling. Eliminable PLT entries will be dealt with later
2682 1.1 skrll anyway. */
2683 1.1 skrll if (h == NULL)
2684 1.1 skrll continue;
2685 1.1 skrll
2686 1.1 skrll h->needs_plt = 1;
2687 1.1 skrll h->plt.refcount++;
2688 1.1 skrll break;
2689 1.1 skrll
2690 1.1 skrll case R_CRIS_8:
2691 1.1 skrll case R_CRIS_16:
2692 1.1 skrll case R_CRIS_32:
2693 1.1 skrll /* Let's help debug shared library creation. Any of these
2694 1.1 skrll relocs can be used in shared libs, but pages containing them
2695 1.1 skrll cannot be shared. Don't warn for sections we don't care
2696 1.1 skrll about, such as debug sections or non-constant sections. We
2697 1.1 skrll can't help tables of (global) function pointers, for example,
2698 1.1 skrll though they must be emitted in a data section to avoid having
2699 1.1 skrll impure text sections. */
2700 1.1 skrll if (info->shared
2701 1.1 skrll && (sec->flags & SEC_ALLOC) != 0
2702 1.1 skrll && (sec->flags & SEC_READONLY) != 0)
2703 1.1 skrll {
2704 1.1 skrll /* FIXME: How do we make this optionally a warning only? */
2705 1.1 skrll (*_bfd_error_handler)
2706 1.1 skrll (_("%B, section %A:\n relocation %s should not"
2707 1.1 skrll " be used in a shared object; recompile with -fPIC"),
2708 1.1 skrll abfd,
2709 1.1 skrll sec,
2710 1.1 skrll cris_elf_howto_table[r_type].name);
2711 1.1 skrll }
2712 1.1 skrll /* Fall through. */
2713 1.1 skrll
2714 1.1 skrll case R_CRIS_8_PCREL:
2715 1.1 skrll case R_CRIS_16_PCREL:
2716 1.1 skrll case R_CRIS_32_PCREL:
2717 1.1 skrll if (h != NULL)
2718 1.1 skrll {
2719 1.1 skrll h->non_got_ref = 1;
2720 1.1 skrll
2721 1.1 skrll /* Make sure a plt entry is created for this symbol if it
2722 1.1 skrll turns out to be a function defined by a dynamic object. */
2723 1.1 skrll if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2724 1.1 skrll h->plt.refcount++;
2725 1.1 skrll }
2726 1.1 skrll
2727 1.1 skrll /* If we are creating a shared library and this is not a local
2728 1.1 skrll symbol, we need to copy the reloc into the shared library.
2729 1.1 skrll However when linking with -Bsymbolic and this is a global
2730 1.1 skrll symbol which is defined in an object we are including in the
2731 1.1 skrll link (i.e., DEF_REGULAR is set), then we can resolve the
2732 1.1 skrll reloc directly. At this point we have not seen all the input
2733 1.1 skrll files, so it is possible that DEF_REGULAR is not set now but
2734 1.1 skrll will be set later (it is never cleared). In case of a weak
2735 1.1 skrll definition, DEF_REGULAR may be cleared later by a strong
2736 1.1 skrll definition in a shared library. We account for that
2737 1.1 skrll possibility below by storing information in the relocs_copied
2738 1.1 skrll field of the hash table entry. A similar situation occurs
2739 1.1 skrll when creating shared libraries and symbol visibility changes
2740 1.1 skrll render the symbol local. */
2741 1.1 skrll
2742 1.1 skrll /* No need to do anything if we're not creating a shared object. */
2743 1.1 skrll if (! info->shared)
2744 1.1 skrll break;
2745 1.1 skrll
2746 1.1 skrll /* We don't need to handle relocs into sections not going into
2747 1.1 skrll the "real" output. */
2748 1.1 skrll if ((sec->flags & SEC_ALLOC) == 0)
2749 1.1 skrll break;
2750 1.1 skrll
2751 1.1 skrll /* We can only eliminate PC-relative relocs. */
2752 1.1 skrll if (r_type == R_CRIS_8_PCREL
2753 1.1 skrll || r_type == R_CRIS_16_PCREL
2754 1.1 skrll || r_type == R_CRIS_32_PCREL)
2755 1.1 skrll {
2756 1.1 skrll /* If the symbol is local, then we can eliminate the reloc. */
2757 1.1 skrll if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2758 1.1 skrll break;
2759 1.1 skrll
2760 1.1 skrll /* If this is with -Bsymbolic and the symbol isn't weak, and
2761 1.1 skrll is defined by an ordinary object (the ones we include in
2762 1.1 skrll this shared library) then we can also eliminate the
2763 1.1 skrll reloc. See comment above for more eliminable cases which
2764 1.1 skrll we can't identify at this time. */
2765 1.1 skrll if (info->symbolic
2766 1.1 skrll && h->root.type != bfd_link_hash_defweak
2767 1.1 skrll && h->def_regular)
2768 1.1 skrll break;
2769 1.1 skrll
2770 1.1 skrll if ((sec->flags & SEC_READONLY) != 0)
2771 1.1 skrll {
2772 1.1 skrll /* FIXME: How do we make this optionally a warning only? */
2773 1.1 skrll (*_bfd_error_handler)
2774 1.1 skrll (_("%B, section %A:\n relocation %s should not be used"
2775 1.1 skrll " in a shared object; recompile with -fPIC"),
2776 1.1 skrll abfd,
2777 1.1 skrll sec,
2778 1.1 skrll cris_elf_howto_table[r_type].name);
2779 1.1 skrll }
2780 1.1 skrll }
2781 1.1 skrll
2782 1.1 skrll /* We create a reloc section in dynobj and make room for this
2783 1.1 skrll reloc. */
2784 1.1 skrll if (sreloc == NULL)
2785 1.1 skrll {
2786 1.1 skrll const char *name;
2787 1.1 skrll
2788 1.1 skrll name = (bfd_elf_string_from_elf_section
2789 1.1 skrll (abfd,
2790 1.1 skrll elf_elfheader (abfd)->e_shstrndx,
2791 1.1 skrll elf_section_data (sec)->rel_hdr.sh_name));
2792 1.1 skrll if (name == NULL)
2793 1.1 skrll return FALSE;
2794 1.1 skrll
2795 1.1 skrll BFD_ASSERT (CONST_STRNEQ (name, ".rela")
2796 1.1 skrll && strcmp (bfd_get_section_name (abfd, sec),
2797 1.1 skrll name + 5) == 0);
2798 1.1 skrll
2799 1.1 skrll sreloc = bfd_get_section_by_name (dynobj, name);
2800 1.1 skrll if (sreloc == NULL)
2801 1.1 skrll {
2802 1.1 skrll sreloc = bfd_make_section_with_flags (dynobj, name,
2803 1.1 skrll (SEC_ALLOC
2804 1.1 skrll | SEC_LOAD
2805 1.1 skrll | SEC_HAS_CONTENTS
2806 1.1 skrll | SEC_IN_MEMORY
2807 1.1 skrll | SEC_LINKER_CREATED
2808 1.1 skrll | SEC_READONLY));
2809 1.1 skrll if (sreloc == NULL
2810 1.1 skrll || !bfd_set_section_alignment (dynobj, sreloc, 2))
2811 1.1 skrll return FALSE;
2812 1.1 skrll }
2813 1.1 skrll if (sec->flags & SEC_READONLY)
2814 1.1 skrll info->flags |= DF_TEXTREL;
2815 1.1 skrll }
2816 1.1 skrll
2817 1.1 skrll sreloc->size += sizeof (Elf32_External_Rela);
2818 1.1 skrll
2819 1.1 skrll /* If we are linking with -Bsymbolic, we count the number of PC
2820 1.1 skrll relative relocations we have entered for this symbol, so that
2821 1.1 skrll we can discard them again if the symbol is later defined by a
2822 1.1 skrll regular object. We know that h is really a pointer to an
2823 1.1 skrll elf_cris_link_hash_entry. */
2824 1.1 skrll if ((r_type == R_CRIS_8_PCREL
2825 1.1 skrll || r_type == R_CRIS_16_PCREL
2826 1.1 skrll || r_type == R_CRIS_32_PCREL)
2827 1.1 skrll && info->symbolic)
2828 1.1 skrll {
2829 1.1 skrll struct elf_cris_link_hash_entry *eh;
2830 1.1 skrll struct elf_cris_pcrel_relocs_copied *p;
2831 1.1 skrll
2832 1.1 skrll eh = (struct elf_cris_link_hash_entry *) h;
2833 1.1 skrll
2834 1.1 skrll for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
2835 1.1 skrll if (p->section == sreloc)
2836 1.1 skrll break;
2837 1.1 skrll
2838 1.1 skrll if (p == NULL)
2839 1.1 skrll {
2840 1.1 skrll p = ((struct elf_cris_pcrel_relocs_copied *)
2841 1.1 skrll bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
2842 1.1 skrll if (p == NULL)
2843 1.1 skrll return FALSE;
2844 1.1 skrll p->next = eh->pcrel_relocs_copied;
2845 1.1 skrll eh->pcrel_relocs_copied = p;
2846 1.1 skrll p->section = sreloc;
2847 1.1 skrll p->count = 0;
2848 1.1 skrll }
2849 1.1 skrll
2850 1.1 skrll ++p->count;
2851 1.1 skrll }
2852 1.1 skrll break;
2853 1.1 skrll
2854 1.1 skrll /* This relocation describes the C++ object vtable hierarchy.
2855 1.1 skrll Reconstruct it for later use during GC. */
2856 1.1 skrll case R_CRIS_GNU_VTINHERIT:
2857 1.1 skrll if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2858 1.1 skrll return FALSE;
2859 1.1 skrll break;
2860 1.1 skrll
2861 1.1 skrll /* This relocation describes which C++ vtable entries are actually
2862 1.1 skrll used. Record for later use during GC. */
2863 1.1 skrll case R_CRIS_GNU_VTENTRY:
2864 1.1 skrll BFD_ASSERT (h != NULL);
2865 1.1 skrll if (h != NULL
2866 1.1 skrll && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2867 1.1 skrll return FALSE;
2868 1.1 skrll break;
2869 1.1 skrll
2870 1.1 skrll default:
2871 1.1 skrll /* Other relocs do not appear here. */
2872 1.1 skrll bfd_set_error (bfd_error_bad_value);
2873 1.1 skrll return FALSE;
2874 1.1 skrll }
2875 1.1 skrll }
2876 1.1 skrll
2877 1.1 skrll return TRUE;
2878 1.1 skrll }
2879 1.1 skrll
2880 1.1 skrll /* Set the sizes of the dynamic sections. */
2881 1.1 skrll
2882 1.1 skrll static bfd_boolean
2883 1.1 skrll elf_cris_size_dynamic_sections (output_bfd, info)
2884 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2885 1.1 skrll struct bfd_link_info *info;
2886 1.1 skrll {
2887 1.1 skrll bfd *dynobj;
2888 1.1 skrll asection *s;
2889 1.1 skrll bfd_boolean plt;
2890 1.1 skrll bfd_boolean relocs;
2891 1.1 skrll
2892 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2893 1.1 skrll BFD_ASSERT (dynobj != NULL);
2894 1.1 skrll
2895 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created)
2896 1.1 skrll {
2897 1.1 skrll /* Set the contents of the .interp section to the interpreter. */
2898 1.1 skrll if (info->executable)
2899 1.1 skrll {
2900 1.1 skrll s = bfd_get_section_by_name (dynobj, ".interp");
2901 1.1 skrll BFD_ASSERT (s != NULL);
2902 1.1 skrll s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2903 1.1 skrll s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2904 1.1 skrll }
2905 1.1 skrll }
2906 1.1 skrll else
2907 1.1 skrll {
2908 1.1 skrll /* Adjust all expected GOTPLT uses to use a GOT entry instead. */
2909 1.1 skrll elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2910 1.1 skrll elf_cris_adjust_gotplt_to_got,
2911 1.1 skrll (PTR) info);
2912 1.1 skrll
2913 1.1 skrll /* We may have created entries in the .rela.got section.
2914 1.1 skrll However, if we are not creating the dynamic sections, we will
2915 1.1 skrll not actually use these entries. Reset the size of .rela.got,
2916 1.1 skrll which will cause it to get stripped from the output file
2917 1.1 skrll below. */
2918 1.1 skrll s = bfd_get_section_by_name (dynobj, ".rela.got");
2919 1.1 skrll if (s != NULL)
2920 1.1 skrll s->size = 0;
2921 1.1 skrll }
2922 1.1 skrll
2923 1.1 skrll /* If this is a -Bsymbolic shared link, then we need to discard all PC
2924 1.1 skrll relative relocs against symbols defined in a regular object. We
2925 1.1 skrll allocated space for them in the check_relocs routine, but we will not
2926 1.1 skrll fill them in in the relocate_section routine. We also discard space
2927 1.1 skrll for relocs that have become for local symbols due to symbol
2928 1.1 skrll visibility changes. For programs, we discard space for relocs for
2929 1.1 skrll symbols not referenced by any dynamic object. */
2930 1.1 skrll if (info->shared)
2931 1.1 skrll elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2932 1.1 skrll elf_cris_discard_excess_dso_dynamics,
2933 1.1 skrll (PTR) info);
2934 1.1 skrll else
2935 1.1 skrll elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2936 1.1 skrll elf_cris_discard_excess_program_dynamics,
2937 1.1 skrll (PTR) info);
2938 1.1 skrll
2939 1.1 skrll /* The check_relocs and adjust_dynamic_symbol entry points have
2940 1.1 skrll determined the sizes of the various dynamic sections. Allocate
2941 1.1 skrll memory for them. */
2942 1.1 skrll plt = FALSE;
2943 1.1 skrll relocs = FALSE;
2944 1.1 skrll for (s = dynobj->sections; s != NULL; s = s->next)
2945 1.1 skrll {
2946 1.1 skrll const char *name;
2947 1.1 skrll
2948 1.1 skrll if ((s->flags & SEC_LINKER_CREATED) == 0)
2949 1.1 skrll continue;
2950 1.1 skrll
2951 1.1 skrll /* It's OK to base decisions on the section name, because none
2952 1.1 skrll of the dynobj section names depend upon the input files. */
2953 1.1 skrll name = bfd_get_section_name (dynobj, s);
2954 1.1 skrll
2955 1.1 skrll if (strcmp (name, ".plt") == 0)
2956 1.1 skrll {
2957 1.1 skrll /* Remember whether there is a PLT. */
2958 1.1 skrll plt = s->size != 0;
2959 1.1 skrll }
2960 1.1 skrll else if (CONST_STRNEQ (name, ".rela"))
2961 1.1 skrll {
2962 1.1 skrll if (s->size != 0)
2963 1.1 skrll {
2964 1.1 skrll /* Remember whether there are any reloc sections other
2965 1.1 skrll than .rela.plt. */
2966 1.1 skrll if (strcmp (name, ".rela.plt") != 0)
2967 1.1 skrll relocs = TRUE;
2968 1.1 skrll
2969 1.1 skrll /* We use the reloc_count field as a counter if we need
2970 1.1 skrll to copy relocs into the output file. */
2971 1.1 skrll s->reloc_count = 0;
2972 1.1 skrll }
2973 1.1 skrll }
2974 1.1 skrll else if (! CONST_STRNEQ (name, ".got")
2975 1.1 skrll && strcmp (name, ".dynbss") != 0)
2976 1.1 skrll {
2977 1.1 skrll /* It's not one of our sections, so don't allocate space. */
2978 1.1 skrll continue;
2979 1.1 skrll }
2980 1.1 skrll
2981 1.1 skrll if (s->size == 0)
2982 1.1 skrll {
2983 1.1 skrll /* If we don't need this section, strip it from the
2984 1.1 skrll output file. This is mostly to handle .rela.bss and
2985 1.1 skrll .rela.plt. We must create both sections in
2986 1.1 skrll create_dynamic_sections, because they must be created
2987 1.1 skrll before the linker maps input sections to output
2988 1.1 skrll sections. The linker does that before
2989 1.1 skrll adjust_dynamic_symbol is called, and it is that
2990 1.1 skrll function which decides whether anything needs to go
2991 1.1 skrll into these sections. */
2992 1.1 skrll s->flags |= SEC_EXCLUDE;
2993 1.1 skrll continue;
2994 1.1 skrll }
2995 1.1 skrll
2996 1.1 skrll if ((s->flags & SEC_HAS_CONTENTS) == 0)
2997 1.1 skrll continue;
2998 1.1 skrll
2999 1.1 skrll /* Allocate memory for the section contents. We use bfd_zalloc here
3000 1.1 skrll in case unused entries are not reclaimed before the section's
3001 1.1 skrll contents are written out. This should not happen, but this way
3002 1.1 skrll if it does, we will not write out garbage. For reloc sections,
3003 1.1 skrll this will make entries have the type R_CRIS_NONE. */
3004 1.1 skrll s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3005 1.1 skrll if (s->contents == NULL)
3006 1.1 skrll return FALSE;
3007 1.1 skrll }
3008 1.1 skrll
3009 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created)
3010 1.1 skrll {
3011 1.1 skrll /* Add some entries to the .dynamic section. We fill in the
3012 1.1 skrll values later, in elf_cris_finish_dynamic_sections, but we
3013 1.1 skrll must add the entries now so that we get the correct size for
3014 1.1 skrll the .dynamic section. The DT_DEBUG entry is filled in by the
3015 1.1 skrll dynamic linker and used by the debugger. */
3016 1.1 skrll #define add_dynamic_entry(TAG, VAL) \
3017 1.1 skrll _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3018 1.1 skrll
3019 1.1 skrll if (!info->shared)
3020 1.1 skrll {
3021 1.1 skrll if (!add_dynamic_entry (DT_DEBUG, 0))
3022 1.1 skrll return FALSE;
3023 1.1 skrll }
3024 1.1 skrll
3025 1.1 skrll if (plt)
3026 1.1 skrll {
3027 1.1 skrll if (!add_dynamic_entry (DT_PLTGOT, 0)
3028 1.1 skrll || !add_dynamic_entry (DT_PLTRELSZ, 0)
3029 1.1 skrll || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3030 1.1 skrll || !add_dynamic_entry (DT_JMPREL, 0))
3031 1.1 skrll return FALSE;
3032 1.1 skrll }
3033 1.1 skrll
3034 1.1 skrll if (relocs)
3035 1.1 skrll {
3036 1.1 skrll if (!add_dynamic_entry (DT_RELA, 0)
3037 1.1 skrll || !add_dynamic_entry (DT_RELASZ, 0)
3038 1.1 skrll || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
3039 1.1 skrll return FALSE;
3040 1.1 skrll }
3041 1.1 skrll
3042 1.1 skrll if ((info->flags & DF_TEXTREL) != 0)
3043 1.1 skrll {
3044 1.1 skrll if (!add_dynamic_entry (DT_TEXTREL, 0))
3045 1.1 skrll return FALSE;
3046 1.1 skrll info->flags |= DF_TEXTREL;
3047 1.1 skrll }
3048 1.1 skrll }
3049 1.1 skrll #undef add_dynamic_entry
3050 1.1 skrll
3051 1.1 skrll return TRUE;
3052 1.1 skrll }
3053 1.1 skrll
3054 1.1 skrll /* This function is called via elf_cris_link_hash_traverse if we are
3055 1.1 skrll creating a shared object. In the -Bsymbolic case, it discards the
3056 1.1 skrll space allocated to copy PC relative relocs against symbols which
3057 1.1 skrll are defined in regular objects. For the normal non-symbolic case,
3058 1.1 skrll we also discard space for relocs that have become local due to
3059 1.1 skrll symbol visibility changes. We allocated space for them in the
3060 1.1 skrll check_relocs routine, but we won't fill them in in the
3061 1.1 skrll relocate_section routine. */
3062 1.1 skrll
3063 1.1 skrll static bfd_boolean
3064 1.1 skrll elf_cris_discard_excess_dso_dynamics (h, inf)
3065 1.1 skrll struct elf_cris_link_hash_entry *h;
3066 1.1 skrll PTR inf;
3067 1.1 skrll {
3068 1.1 skrll struct elf_cris_pcrel_relocs_copied *s;
3069 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) inf;
3070 1.1 skrll
3071 1.1 skrll if (h->root.root.type == bfd_link_hash_warning)
3072 1.1 skrll h = (struct elf_cris_link_hash_entry *) h->root.root.u.i.link;
3073 1.1 skrll
3074 1.1 skrll /* If a symbol has been forced local or we have found a regular
3075 1.1 skrll definition for the symbolic link case, then we won't be needing
3076 1.1 skrll any relocs. */
3077 1.1 skrll if (h->root.def_regular
3078 1.1 skrll && (h->root.forced_local
3079 1.1 skrll || info->symbolic))
3080 1.1 skrll {
3081 1.1 skrll for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
3082 1.1 skrll s->section->size -= s->count * sizeof (Elf32_External_Rela);
3083 1.1 skrll }
3084 1.1 skrll
3085 1.1 skrll return TRUE;
3086 1.1 skrll }
3087 1.1 skrll
3088 1.1 skrll /* This function is called via elf_cris_link_hash_traverse if we are *not*
3089 1.1 skrll creating a shared object. We discard space for relocs for symbols put
3090 1.1 skrll in the .got, but which we found we do not have to resolve at run-time. */
3091 1.1 skrll
3092 1.1 skrll static bfd_boolean
3093 1.1 skrll elf_cris_discard_excess_program_dynamics (h, inf)
3094 1.1 skrll struct elf_cris_link_hash_entry *h;
3095 1.1 skrll PTR inf;
3096 1.1 skrll {
3097 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) inf;
3098 1.1 skrll
3099 1.1 skrll if (h->root.root.type == bfd_link_hash_warning)
3100 1.1 skrll h = (struct elf_cris_link_hash_entry *) h->root.root.u.i.link;
3101 1.1 skrll
3102 1.1 skrll /* If we're not creating a shared library and have a symbol which is
3103 1.1 skrll referred to by .got references, but the symbol is defined locally,
3104 1.1 skrll (or rather, not defined by a DSO) then lose the reloc for the .got
3105 1.1 skrll (don't allocate room for it). Likewise for relocs for something
3106 1.1 skrll for which we create a PLT. */
3107 1.1 skrll if (!h->root.def_dynamic
3108 1.1 skrll || h->root.plt.refcount > 0)
3109 1.1 skrll {
3110 1.1 skrll if (h->root.got.refcount > 0
3111 1.1 skrll /* The size of this section is only valid and in sync with the
3112 1.1 skrll various reference counts if we do dynamic; don't decrement it
3113 1.1 skrll otherwise. */
3114 1.1 skrll && elf_hash_table (info)->dynamic_sections_created)
3115 1.1 skrll {
3116 1.1 skrll bfd *dynobj = elf_hash_table (info)->dynobj;
3117 1.1 skrll asection *srelgot;
3118 1.1 skrll
3119 1.1 skrll BFD_ASSERT (dynobj != NULL);
3120 1.1 skrll
3121 1.1 skrll srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3122 1.1 skrll
3123 1.1 skrll BFD_ASSERT (srelgot != NULL);
3124 1.1 skrll
3125 1.1 skrll srelgot->size -= sizeof (Elf32_External_Rela);
3126 1.1 skrll }
3127 1.1 skrll
3128 1.1 skrll /* If the locally-defined symbol isn't used by a DSO, then we don't
3129 1.1 skrll have to export it as a dynamic symbol. This was already done for
3130 1.1 skrll functions; doing this for all symbols would presumably not
3131 1.1 skrll introduce new problems. Of course we don't do this if we're
3132 1.1 skrll exporting all dynamic symbols. */
3133 1.1 skrll if (! info->export_dynamic
3134 1.1 skrll && h->root.dynindx != -1
3135 1.1 skrll && !h->root.def_dynamic
3136 1.1 skrll && !h->root.ref_dynamic)
3137 1.1 skrll {
3138 1.1 skrll h->root.dynindx = -1;
3139 1.1 skrll _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3140 1.1 skrll h->root.dynstr_index);
3141 1.1 skrll }
3142 1.1 skrll }
3143 1.1 skrll
3144 1.1 skrll return TRUE;
3145 1.1 skrll }
3146 1.1 skrll
3147 1.1 skrll /* Reject a file depending on presence and expectation of prefixed
3148 1.1 skrll underscores on symbols. */
3149 1.1 skrll
3150 1.1 skrll static bfd_boolean
3151 1.1 skrll cris_elf_object_p (abfd)
3152 1.1 skrll bfd *abfd;
3153 1.1 skrll {
3154 1.1 skrll if (! cris_elf_set_mach_from_flags (abfd, elf_elfheader (abfd)->e_flags))
3155 1.1 skrll return FALSE;
3156 1.1 skrll
3157 1.1 skrll if ((elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE))
3158 1.1 skrll return (bfd_get_symbol_leading_char (abfd) == '_');
3159 1.1 skrll else
3160 1.1 skrll return (bfd_get_symbol_leading_char (abfd) == 0);
3161 1.1 skrll }
3162 1.1 skrll
3163 1.1 skrll /* Mark presence or absence of leading underscore. Set machine type
3164 1.1 skrll flags from mach type. */
3165 1.1 skrll
3166 1.1 skrll static void
3167 1.1 skrll cris_elf_final_write_processing (abfd, linker)
3168 1.1 skrll bfd *abfd;
3169 1.1 skrll bfd_boolean linker ATTRIBUTE_UNUSED;
3170 1.1 skrll {
3171 1.1 skrll unsigned long e_flags = elf_elfheader (abfd)->e_flags;
3172 1.1 skrll
3173 1.1 skrll e_flags &= ~EF_CRIS_UNDERSCORE;
3174 1.1 skrll if (bfd_get_symbol_leading_char (abfd) == '_')
3175 1.1 skrll e_flags |= EF_CRIS_UNDERSCORE;
3176 1.1 skrll
3177 1.1 skrll switch (bfd_get_mach (abfd))
3178 1.1 skrll {
3179 1.1 skrll case bfd_mach_cris_v0_v10:
3180 1.1 skrll e_flags |= EF_CRIS_VARIANT_ANY_V0_V10;
3181 1.1 skrll break;
3182 1.1 skrll
3183 1.1 skrll case bfd_mach_cris_v10_v32:
3184 1.1 skrll e_flags |= EF_CRIS_VARIANT_COMMON_V10_V32;
3185 1.1 skrll break;
3186 1.1 skrll
3187 1.1 skrll case bfd_mach_cris_v32:
3188 1.1 skrll e_flags |= EF_CRIS_VARIANT_V32;
3189 1.1 skrll break;
3190 1.1 skrll
3191 1.1 skrll default:
3192 1.1 skrll _bfd_abort (__FILE__, __LINE__,
3193 1.1 skrll _("Unexpected machine number"));
3194 1.1 skrll }
3195 1.1 skrll
3196 1.1 skrll elf_elfheader (abfd)->e_flags = e_flags;
3197 1.1 skrll }
3198 1.1 skrll
3199 1.1 skrll /* Set the mach type from e_flags value. */
3200 1.1 skrll
3201 1.1 skrll static bfd_boolean
3202 1.1 skrll cris_elf_set_mach_from_flags (abfd, flags)
3203 1.1 skrll bfd *abfd;
3204 1.1 skrll unsigned long flags;
3205 1.1 skrll {
3206 1.1 skrll switch (flags & EF_CRIS_VARIANT_MASK)
3207 1.1 skrll {
3208 1.1 skrll case EF_CRIS_VARIANT_ANY_V0_V10:
3209 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_cris, bfd_mach_cris_v0_v10);
3210 1.1 skrll break;
3211 1.1 skrll
3212 1.1 skrll case EF_CRIS_VARIANT_V32:
3213 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_cris, bfd_mach_cris_v32);
3214 1.1 skrll break;
3215 1.1 skrll
3216 1.1 skrll case EF_CRIS_VARIANT_COMMON_V10_V32:
3217 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_cris, bfd_mach_cris_v10_v32);
3218 1.1 skrll break;
3219 1.1 skrll
3220 1.1 skrll default:
3221 1.1 skrll /* Since we don't recognize them, we obviously can't support them
3222 1.1 skrll with this code; we'd have to require that all future handling
3223 1.1 skrll would be optional. */
3224 1.1 skrll bfd_set_error (bfd_error_wrong_format);
3225 1.1 skrll return FALSE;
3226 1.1 skrll }
3227 1.1 skrll
3228 1.1 skrll return TRUE;
3229 1.1 skrll }
3230 1.1 skrll
3231 1.1 skrll /* Display the flags field. */
3232 1.1 skrll
3233 1.1 skrll static bfd_boolean
3234 1.1 skrll cris_elf_print_private_bfd_data (abfd, ptr)
3235 1.1 skrll bfd *abfd;
3236 1.1 skrll PTR ptr;
3237 1.1 skrll {
3238 1.1 skrll FILE *file = (FILE *) ptr;
3239 1.1 skrll
3240 1.1 skrll BFD_ASSERT (abfd != NULL && ptr != NULL);
3241 1.1 skrll
3242 1.1 skrll _bfd_elf_print_private_bfd_data (abfd, ptr);
3243 1.1 skrll
3244 1.1 skrll fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
3245 1.1 skrll
3246 1.1 skrll if (elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE)
3247 1.1 skrll fprintf (file, _(" [symbols have a _ prefix]"));
3248 1.1 skrll if ((elf_elfheader (abfd)->e_flags & EF_CRIS_VARIANT_MASK)
3249 1.1 skrll == EF_CRIS_VARIANT_COMMON_V10_V32)
3250 1.1 skrll fprintf (file, _(" [v10 and v32]"));
3251 1.1 skrll if ((elf_elfheader (abfd)->e_flags & EF_CRIS_VARIANT_MASK)
3252 1.1 skrll == EF_CRIS_VARIANT_V32)
3253 1.1 skrll fprintf (file, _(" [v32]"));
3254 1.1 skrll
3255 1.1 skrll fputc ('\n', file);
3256 1.1 skrll return TRUE;
3257 1.1 skrll }
3258 1.1 skrll
3259 1.1 skrll /* Don't mix files with and without a leading underscore. */
3260 1.1 skrll
3261 1.1 skrll static bfd_boolean
3262 1.1 skrll cris_elf_merge_private_bfd_data (ibfd, obfd)
3263 1.1 skrll bfd *ibfd;
3264 1.1 skrll bfd *obfd;
3265 1.1 skrll {
3266 1.1 skrll int imach, omach;
3267 1.1 skrll
3268 1.1 skrll if (! _bfd_generic_verify_endian_match (ibfd, obfd))
3269 1.1 skrll return FALSE;
3270 1.1 skrll
3271 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3272 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3273 1.1 skrll return TRUE;
3274 1.1 skrll
3275 1.1 skrll imach = bfd_get_mach (ibfd);
3276 1.1 skrll
3277 1.1 skrll if (! elf_flags_init (obfd))
3278 1.1 skrll {
3279 1.1 skrll /* This happens when ld starts out with a 'blank' output file. */
3280 1.1 skrll elf_flags_init (obfd) = TRUE;
3281 1.1 skrll
3282 1.1 skrll /* We ignore the linker-set mach, and instead set it according to
3283 1.1 skrll the first input file. This would also happen if we could
3284 1.1 skrll somehow filter out the OUTPUT_ARCH () setting from elf.sc.
3285 1.1 skrll This allows us to keep the same linker config across
3286 1.1 skrll cris(v0..v10) and crisv32. The drawback is that we can't force
3287 1.1 skrll the output type, which might be a sane thing to do for a
3288 1.1 skrll v10+v32 compatibility object. */
3289 1.1 skrll if (! bfd_set_arch_mach (obfd, bfd_arch_cris, imach))
3290 1.1 skrll return FALSE;
3291 1.1 skrll }
3292 1.1 skrll
3293 1.1 skrll if (bfd_get_symbol_leading_char (ibfd)
3294 1.1 skrll != bfd_get_symbol_leading_char (obfd))
3295 1.1 skrll {
3296 1.1 skrll (*_bfd_error_handler)
3297 1.1 skrll (bfd_get_symbol_leading_char (ibfd) == '_'
3298 1.1 skrll ? _("%B: uses _-prefixed symbols, but writing file with non-prefixed symbols")
3299 1.1 skrll : _("%B: uses non-prefixed symbols, but writing file with _-prefixed symbols"),
3300 1.1 skrll ibfd);
3301 1.1 skrll bfd_set_error (bfd_error_bad_value);
3302 1.1 skrll return FALSE;
3303 1.1 skrll }
3304 1.1 skrll
3305 1.1 skrll omach = bfd_get_mach (obfd);
3306 1.1 skrll
3307 1.1 skrll if (imach != omach)
3308 1.1 skrll {
3309 1.1 skrll /* We can get an incompatible combination only if either is
3310 1.1 skrll bfd_mach_cris_v32, and the other one isn't compatible. */
3311 1.1 skrll if ((imach == bfd_mach_cris_v32
3312 1.1 skrll && omach != bfd_mach_cris_v10_v32)
3313 1.1 skrll || (omach == bfd_mach_cris_v32
3314 1.1 skrll && imach != bfd_mach_cris_v10_v32))
3315 1.1 skrll {
3316 1.1 skrll (*_bfd_error_handler)
3317 1.1 skrll ((imach == bfd_mach_cris_v32)
3318 1.1 skrll ? _("%B contains CRIS v32 code, incompatible"
3319 1.1 skrll " with previous objects")
3320 1.1 skrll : _("%B contains non-CRIS-v32 code, incompatible"
3321 1.1 skrll " with previous objects"),
3322 1.1 skrll ibfd);
3323 1.1 skrll bfd_set_error (bfd_error_bad_value);
3324 1.1 skrll return FALSE;
3325 1.1 skrll }
3326 1.1 skrll
3327 1.1 skrll /* We don't have to check the case where the input is compatible
3328 1.1 skrll with v10 and v32, because the output is already known to be set
3329 1.1 skrll to the other (compatible) mach. */
3330 1.1 skrll if (omach == bfd_mach_cris_v10_v32
3331 1.1 skrll && ! bfd_set_arch_mach (obfd, bfd_arch_cris, imach))
3332 1.1 skrll return FALSE;
3333 1.1 skrll }
3334 1.1 skrll
3335 1.1 skrll return TRUE;
3336 1.1 skrll }
3337 1.1 skrll
3338 1.1 skrll /* Do side-effects of e_flags copying to obfd. */
3339 1.1 skrll
3340 1.1 skrll static bfd_boolean
3341 1.1 skrll cris_elf_copy_private_bfd_data (ibfd, obfd)
3342 1.1 skrll bfd *ibfd;
3343 1.1 skrll bfd *obfd;
3344 1.1 skrll {
3345 1.1 skrll /* Call the base function. */
3346 1.1 skrll if (!_bfd_elf_copy_private_bfd_data (ibfd, obfd))
3347 1.1 skrll return FALSE;
3348 1.1 skrll
3349 1.1 skrll /* If output is big-endian for some obscure reason, stop here. */
3350 1.1 skrll if (_bfd_generic_verify_endian_match (ibfd, obfd) == FALSE)
3351 1.1 skrll return FALSE;
3352 1.1 skrll
3353 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3354 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3355 1.1 skrll return TRUE;
3356 1.1 skrll
3357 1.1 skrll /* Do what we really came here for. */
3358 1.1 skrll return bfd_set_arch_mach (obfd, bfd_arch_cris, bfd_get_mach (ibfd));
3359 1.1 skrll }
3360 1.1 skrll
3361 1.1 skrll static enum elf_reloc_type_class
3362 1.1 skrll elf_cris_reloc_type_class (rela)
3363 1.1 skrll const Elf_Internal_Rela *rela;
3364 1.1 skrll {
3365 1.1 skrll switch ((int) ELF32_R_TYPE (rela->r_info))
3366 1.1 skrll {
3367 1.1 skrll case R_CRIS_RELATIVE:
3368 1.1 skrll return reloc_class_relative;
3369 1.1 skrll case R_CRIS_JUMP_SLOT:
3370 1.1 skrll return reloc_class_plt;
3371 1.1 skrll case R_CRIS_COPY:
3372 1.1 skrll return reloc_class_copy;
3373 1.1 skrll default:
3374 1.1 skrll return reloc_class_normal;
3375 1.1 skrll }
3376 1.1 skrll }
3377 1.1 skrll
3378 1.1 skrll #define ELF_ARCH bfd_arch_cris
3380 1.1 skrll #define ELF_MACHINE_CODE EM_CRIS
3381 1.1 skrll #define ELF_MAXPAGESIZE 0x2000
3382 1.1 skrll
3383 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf32_cris_vec
3384 1.1 skrll #define TARGET_LITTLE_NAME "elf32-cris"
3385 1.1 skrll #define elf_symbol_leading_char 0
3386 1.1 skrll
3387 1.1 skrll #define elf_info_to_howto_rel NULL
3388 1.1 skrll #define elf_info_to_howto cris_info_to_howto_rela
3389 1.1 skrll #define elf_backend_relocate_section cris_elf_relocate_section
3390 1.1 skrll #define elf_backend_gc_mark_hook cris_elf_gc_mark_hook
3391 1.1 skrll #define elf_backend_gc_sweep_hook cris_elf_gc_sweep_hook
3392 1.1 skrll #define elf_backend_check_relocs cris_elf_check_relocs
3393 1.1 skrll #define elf_backend_grok_prstatus cris_elf_grok_prstatus
3394 1.1 skrll #define elf_backend_grok_psinfo cris_elf_grok_psinfo
3395 1.1 skrll
3396 1.1 skrll #define elf_backend_can_gc_sections 1
3397 1.1 skrll #define elf_backend_can_refcount 1
3398 1.1 skrll
3399 1.1 skrll #define elf_backend_object_p cris_elf_object_p
3400 1.1 skrll #define elf_backend_final_write_processing \
3401 1.1 skrll cris_elf_final_write_processing
3402 1.1 skrll #define bfd_elf32_bfd_print_private_bfd_data \
3403 1.1 skrll cris_elf_print_private_bfd_data
3404 1.1 skrll #define bfd_elf32_bfd_merge_private_bfd_data \
3405 1.1 skrll cris_elf_merge_private_bfd_data
3406 1.1 skrll #define bfd_elf32_bfd_copy_private_bfd_data \
3407 1.1 skrll cris_elf_copy_private_bfd_data
3408 1.1 skrll
3409 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup cris_reloc_type_lookup
3410 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup cris_reloc_name_lookup
3411 1.1 skrll
3412 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create \
3413 1.1 skrll elf_cris_link_hash_table_create
3414 1.1 skrll #define elf_backend_adjust_dynamic_symbol \
3415 1.1 skrll elf_cris_adjust_dynamic_symbol
3416 1.1 skrll #define elf_backend_size_dynamic_sections \
3417 1.1 skrll elf_cris_size_dynamic_sections
3418 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3419 1.1 skrll #define elf_backend_finish_dynamic_symbol \
3420 1.1 skrll elf_cris_finish_dynamic_symbol
3421 1.1 skrll #define elf_backend_finish_dynamic_sections \
3422 1.1 skrll elf_cris_finish_dynamic_sections
3423 1.1 skrll #define elf_backend_create_dynamic_sections \
3424 1.1 skrll _bfd_elf_create_dynamic_sections
3425 1.1 skrll #define bfd_elf32_bfd_final_link \
3426 1.1 skrll bfd_elf_gc_common_final_link
3427 1.1 skrll #define elf_backend_hide_symbol elf_cris_hide_symbol
3428 1.1 skrll #define elf_backend_reloc_type_class elf_cris_reloc_type_class
3429 1.1 skrll
3430 1.1 skrll #define elf_backend_want_got_plt 1
3431 1.1 skrll #define elf_backend_plt_readonly 1
3432 1.1 skrll #define elf_backend_want_plt_sym 0
3433 1.1 skrll #define elf_backend_got_header_size 12
3434 1.1 skrll
3435 1.1 skrll /* Later, we my want to optimize RELA entries into REL entries for dynamic
3436 1.1 skrll linking and libraries (if it's a win of any significance). Until then,
3437 1.1 skrll take the easy route. */
3438 1.1 skrll #define elf_backend_may_use_rel_p 0
3439 1.1 skrll #define elf_backend_may_use_rela_p 1
3440 1.1 skrll #define elf_backend_rela_normal 1
3441 1.1 skrll
3442 1.1 skrll #include "elf32-target.h"
3443 1.1 skrll
3444 1.1 skrll #undef TARGET_LITTLE_SYM
3445 #undef TARGET_LITTLE_NAME
3446 #undef elf_symbol_leading_char
3447
3448 #define TARGET_LITTLE_SYM bfd_elf32_us_cris_vec
3449 #define TARGET_LITTLE_NAME "elf32-us-cris"
3450 #define elf_symbol_leading_char '_'
3451 #undef elf32_bed
3452 #define elf32_bed elf32_us_cris_bed
3453
3454 #include "elf32-target.h"
3455