elf32-or1k.c revision 1.1.1.1 1 1.1 christos /* Or1k-specific support for 32-bit ELF.
2 1.1 christos Copyright (C) 2001-2015 Free Software Foundation, Inc.
3 1.1 christos Contributed for OR32 by Johan Rydberg, jrydberg (at) opencores.org
4 1.1 christos
5 1.1 christos PIC parts added by Stefan Kristiansson, stefan.kristiansson (at) saunalahti.fi,
6 1.1 christos largely based on elf32-m32r.c and elf32-microblaze.c.
7 1.1 christos
8 1.1 christos This file is part of BFD, the Binary File Descriptor library.
9 1.1 christos
10 1.1 christos This program is free software; you can redistribute it and/or modify
11 1.1 christos it under the terms of the GNU General Public License as published by
12 1.1 christos the Free Software Foundation; either version 3 of the License, or
13 1.1 christos (at your option) any later version.
14 1.1 christos
15 1.1 christos This program is distributed in the hope that it will be useful,
16 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
17 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 1.1 christos GNU General Public License for more details.
19 1.1 christos
20 1.1 christos You should have received a copy of the GNU General Public License
21 1.1 christos along with this program; if not, see <http://www.gnu.org/licenses/>. */
22 1.1 christos
23 1.1 christos #include "sysdep.h"
24 1.1 christos #include "bfd.h"
25 1.1 christos #include "libbfd.h"
26 1.1 christos #include "elf-bfd.h"
27 1.1 christos #include "elf/or1k.h"
28 1.1 christos #include "libiberty.h"
29 1.1 christos
30 1.1 christos #define PLT_ENTRY_SIZE 20
31 1.1 christos
32 1.1 christos #define PLT0_ENTRY_WORD0 0x19800000 /* l.movhi r12, 0 <- hi(.got+4) */
33 1.1 christos #define PLT0_ENTRY_WORD1 0xa98c0000 /* l.ori r12, r12, 0 <- lo(.got+4) */
34 1.1 christos #define PLT0_ENTRY_WORD2 0x85ec0004 /* l.lwz r15, 4(r12) <- *(.got+8)*/
35 1.1 christos #define PLT0_ENTRY_WORD3 0x44007800 /* l.jr r15 */
36 1.1 christos #define PLT0_ENTRY_WORD4 0x858c0000 /* l.lwz r12, 0(r12) */
37 1.1 christos
38 1.1 christos #define PLT0_PIC_ENTRY_WORD0 0x85900004 /* l.lwz r12, 4(r16) */
39 1.1 christos #define PLT0_PIC_ENTRY_WORD1 0x85f00008 /* l.lwz r15, 8(r16) */
40 1.1 christos #define PLT0_PIC_ENTRY_WORD2 0x44007800 /* l.jr r15 */
41 1.1 christos #define PLT0_PIC_ENTRY_WORD3 0x15000000 /* l.nop */
42 1.1 christos #define PLT0_PIC_ENTRY_WORD4 0x15000000 /* l.nop */
43 1.1 christos
44 1.1 christos #define PLT_ENTRY_WORD0 0x19800000 /* l.movhi r12, 0 <- hi(got idx addr) */
45 1.1 christos #define PLT_ENTRY_WORD1 0xa98c0000 /* l.ori r12, r12, 0 <- lo(got idx addr) */
46 1.1 christos #define PLT_ENTRY_WORD2 0x858c0000 /* l.lwz r12, 0(r12) */
47 1.1 christos #define PLT_ENTRY_WORD3 0x44006000 /* l.jr r12 */
48 1.1 christos #define PLT_ENTRY_WORD4 0xa9600000 /* l.ori r11, r0, 0 <- reloc offset */
49 1.1 christos
50 1.1 christos #define PLT_PIC_ENTRY_WORD0 0x85900000 /* l.lwz r12, 0(r16) <- index in got */
51 1.1 christos #define PLT_PIC_ENTRY_WORD1 0xa9600000 /* l.ori r11, r0, 0 <- reloc offset */
52 1.1 christos #define PLT_PIC_ENTRY_WORD2 0x44006000 /* l.jr r12 */
53 1.1 christos #define PLT_PIC_ENTRY_WORD3 0x15000000 /* l.nop */
54 1.1 christos #define PLT_PIC_ENTRY_WORD4 0x15000000 /* l.nop */
55 1.1 christos
56 1.1 christos #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
57 1.1 christos
58 1.1 christos static reloc_howto_type or1k_elf_howto_table[] =
59 1.1 christos {
60 1.1 christos /* This reloc does nothing. */
61 1.1 christos HOWTO (R_OR1K_NONE, /* type */
62 1.1 christos 0, /* rightshift */
63 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
64 1.1 christos 32, /* bitsize */
65 1.1 christos FALSE, /* pc_relative */
66 1.1 christos 0, /* bitpos */
67 1.1 christos complain_overflow_dont, /* complain_on_overflow */
68 1.1 christos bfd_elf_generic_reloc, /* special_function */
69 1.1 christos "R_OR1K_NONE", /* name */
70 1.1 christos FALSE, /* partial_inplace */
71 1.1 christos 0, /* src_mask */
72 1.1 christos 0, /* dst_mask */
73 1.1 christos FALSE), /* pcrel_offset */
74 1.1 christos
75 1.1 christos HOWTO (R_OR1K_32,
76 1.1 christos 0, /* rightshift */
77 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
78 1.1 christos 32, /* bitsize */
79 1.1 christos FALSE, /* pc_relative */
80 1.1 christos 0, /* bitpos */
81 1.1 christos complain_overflow_unsigned, /* complain_on_overflow */
82 1.1 christos bfd_elf_generic_reloc, /* special_function */
83 1.1 christos "R_OR1K_32", /* name */
84 1.1 christos FALSE, /* partial_inplace */
85 1.1 christos 0, /* src_mask */
86 1.1 christos 0xffffffff, /* dst_mask */
87 1.1 christos FALSE), /* pcrel_offset */
88 1.1 christos
89 1.1 christos HOWTO (R_OR1K_16,
90 1.1 christos 0, /* rightshift */
91 1.1 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
92 1.1 christos 16, /* bitsize */
93 1.1 christos FALSE, /* pc_relative */
94 1.1 christos 0, /* bitpos */
95 1.1 christos complain_overflow_unsigned, /* complain_on_overflow */
96 1.1 christos bfd_elf_generic_reloc, /* special_function */
97 1.1 christos "R_OR1K_16", /* name */
98 1.1 christos FALSE, /* partial_inplace */
99 1.1 christos 0, /* src_mask */
100 1.1 christos 0xffff, /* dst_mask */
101 1.1 christos FALSE), /* pcrel_offset */
102 1.1 christos
103 1.1 christos HOWTO (R_OR1K_8,
104 1.1 christos 0, /* rightshift */
105 1.1 christos 0, /* size (0 = byte, 1 = short, 2 = long) */
106 1.1 christos 8, /* bitsize */
107 1.1 christos FALSE, /* pc_relative */
108 1.1 christos 0, /* bitpos */
109 1.1 christos complain_overflow_unsigned, /* complain_on_overflow */
110 1.1 christos bfd_elf_generic_reloc, /* special_function */
111 1.1 christos "R_OR1K_8", /* name */
112 1.1 christos FALSE, /* partial_inplace */
113 1.1 christos 0, /* src_mask */
114 1.1 christos 0xff, /* dst_mask */
115 1.1 christos FALSE), /* pcrel_offset */
116 1.1 christos
117 1.1 christos HOWTO (R_OR1K_LO_16_IN_INSN, /* type */
118 1.1 christos 0, /* rightshift */
119 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
120 1.1 christos 16, /* bitsize */
121 1.1 christos FALSE, /* pc_relative */
122 1.1 christos 0, /* bitpos */
123 1.1 christos complain_overflow_dont, /* complain_on_overflow */
124 1.1 christos bfd_elf_generic_reloc, /* special_function */
125 1.1 christos "R_OR1K_LO_16_IN_INSN", /* name */
126 1.1 christos FALSE, /* partial_inplace */
127 1.1 christos 0, /* src_mask */
128 1.1 christos 0x0000ffff, /* dst_mask */
129 1.1 christos FALSE), /* pcrel_offset */
130 1.1 christos
131 1.1 christos HOWTO (R_OR1K_HI_16_IN_INSN, /* type */
132 1.1 christos 16, /* rightshift */
133 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
134 1.1 christos 16, /* bitsize */
135 1.1 christos FALSE, /* pc_relative */
136 1.1 christos 0, /* bitpos */
137 1.1 christos complain_overflow_dont, /* complain_on_overflow */
138 1.1 christos bfd_elf_generic_reloc, /* special_function */
139 1.1 christos "R_OR1K_HI_16_IN_INSN", /* name */
140 1.1 christos FALSE, /* partial_inplace */
141 1.1 christos 0, /* src_mask */
142 1.1 christos 0x0000ffff, /* dst_mask */
143 1.1 christos FALSE), /* pcrel_offset */
144 1.1 christos
145 1.1 christos /* A PC relative 26 bit relocation, right shifted by 2. */
146 1.1 christos HOWTO (R_OR1K_INSN_REL_26, /* type */
147 1.1 christos 2, /* rightshift */
148 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
149 1.1 christos 26, /* bitsize */
150 1.1 christos TRUE, /* pc_relative */
151 1.1 christos 0, /* bitpos */
152 1.1 christos complain_overflow_signed, /* complain_on_overflow */
153 1.1 christos bfd_elf_generic_reloc, /* special_function */
154 1.1 christos "R_OR1K_INSN_REL_26", /* name */
155 1.1 christos FALSE, /* partial_inplace */
156 1.1 christos 0, /* src_mask */
157 1.1 christos 0x03ffffff, /* dst_mask */
158 1.1 christos TRUE), /* pcrel_offset */
159 1.1 christos
160 1.1 christos /* GNU extension to record C++ vtable hierarchy. */
161 1.1 christos HOWTO (R_OR1K_GNU_VTINHERIT, /* type */
162 1.1 christos 0, /* rightshift */
163 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
164 1.1 christos 0, /* bitsize */
165 1.1 christos FALSE, /* pc_relative */
166 1.1 christos 0, /* bitpos */
167 1.1 christos complain_overflow_dont, /* complain_on_overflow */
168 1.1 christos NULL, /* special_function */
169 1.1 christos "R_OR1K_GNU_VTINHERIT", /* name */
170 1.1 christos FALSE, /* partial_inplace */
171 1.1 christos 0, /* src_mask */
172 1.1 christos 0, /* dst_mask */
173 1.1 christos FALSE), /* pcrel_offset */
174 1.1 christos
175 1.1 christos /* GNU extension to record C++ vtable member usage. */
176 1.1 christos HOWTO (R_OR1K_GNU_VTENTRY, /* type */
177 1.1 christos 0, /* rightshift */
178 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
179 1.1 christos 0, /* bitsize */
180 1.1 christos FALSE, /* pc_relative */
181 1.1 christos 0, /* bitpos */
182 1.1 christos complain_overflow_dont, /* complain_on_overflow */
183 1.1 christos _bfd_elf_rel_vtable_reloc_fn, /* special_function */
184 1.1 christos "R_OR1K_GNU_VTENTRY", /* name */
185 1.1 christos FALSE, /* partial_inplace */
186 1.1 christos 0, /* src_mask */
187 1.1 christos 0, /* dst_mask */
188 1.1 christos FALSE), /* pcrel_offset */
189 1.1 christos
190 1.1 christos HOWTO (R_OR1K_32_PCREL,
191 1.1 christos 0, /* rightshift */
192 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
193 1.1 christos 32, /* bitsize */
194 1.1 christos TRUE, /* pc_relative */
195 1.1 christos 0, /* bitpos */
196 1.1 christos complain_overflow_signed, /* complain_on_overflow */
197 1.1 christos bfd_elf_generic_reloc, /* special_function */
198 1.1 christos "R_OR1K_32_PCREL", /* name */
199 1.1 christos FALSE, /* partial_inplace */
200 1.1 christos 0, /* src_mask */
201 1.1 christos 0xffffffff, /* dst_mask */
202 1.1 christos FALSE), /* pcrel_offset */
203 1.1 christos
204 1.1 christos HOWTO (R_OR1K_16_PCREL,
205 1.1 christos 0, /* rightshift */
206 1.1 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
207 1.1 christos 16, /* bitsize */
208 1.1 christos TRUE, /* pc_relative */
209 1.1 christos 0, /* bitpos */
210 1.1 christos complain_overflow_signed, /* complain_on_overflow */
211 1.1 christos bfd_elf_generic_reloc, /* special_function */
212 1.1 christos "R_OR1K_16_PCREL", /* name */
213 1.1 christos FALSE, /* partial_inplace */
214 1.1 christos 0, /* src_mask */
215 1.1 christos 0xffff, /* dst_mask */
216 1.1 christos FALSE), /* pcrel_offset */
217 1.1 christos
218 1.1 christos HOWTO (R_OR1K_8_PCREL,
219 1.1 christos 0, /* rightshift */
220 1.1 christos 0, /* size (0 = byte, 1 = short, 2 = long) */
221 1.1 christos 8, /* bitsize */
222 1.1 christos TRUE, /* pc_relative */
223 1.1 christos 0, /* bitpos */
224 1.1 christos complain_overflow_signed, /* complain_on_overflow */
225 1.1 christos bfd_elf_generic_reloc, /* special_function */
226 1.1 christos "R_OR1K_8_PCREL", /* name */
227 1.1 christos FALSE, /* partial_inplace */
228 1.1 christos 0, /* src_mask */
229 1.1 christos 0xff, /* dst_mask */
230 1.1 christos FALSE), /* pcrel_offset */
231 1.1 christos
232 1.1 christos HOWTO (R_OR1K_GOTPC_HI16, /* Type. */
233 1.1 christos 16, /* Rightshift. */
234 1.1 christos 2, /* Size (0 = byte, 1 = short, 2 = long). */
235 1.1 christos 16, /* Bitsize. */
236 1.1 christos TRUE, /* PC_relative. */
237 1.1 christos 0, /* Bitpos. */
238 1.1 christos complain_overflow_dont, /* Complain on overflow. */
239 1.1 christos bfd_elf_generic_reloc, /* Special Function. */
240 1.1 christos "R_OR1K_GOTPC_HI16", /* Name. */
241 1.1 christos FALSE, /* Partial Inplace. */
242 1.1 christos 0, /* Source Mask. */
243 1.1 christos 0xffff, /* Dest Mask. */
244 1.1 christos TRUE), /* PC relative offset? */
245 1.1 christos
246 1.1 christos HOWTO (R_OR1K_GOTPC_LO16, /* Type. */
247 1.1 christos 0, /* Rightshift. */
248 1.1 christos 2, /* Size (0 = byte, 1 = short, 2 = long). */
249 1.1 christos 16, /* Bitsize. */
250 1.1 christos TRUE, /* PC_relative. */
251 1.1 christos 0, /* Bitpos. */
252 1.1 christos complain_overflow_dont, /* Complain on overflow. */
253 1.1 christos bfd_elf_generic_reloc, /* Special Function. */
254 1.1 christos "R_OR1K_GOTPC_LO16", /* Name. */
255 1.1 christos FALSE, /* Partial Inplace. */
256 1.1 christos 0, /* Source Mask. */
257 1.1 christos 0xffff, /* Dest Mask. */
258 1.1 christos TRUE), /* PC relative offset? */
259 1.1 christos
260 1.1 christos HOWTO (R_OR1K_GOT16, /* type */
261 1.1 christos 0, /* rightshift */
262 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
263 1.1 christos 16, /* bitsize */
264 1.1 christos FALSE, /* pc_relative */
265 1.1 christos 0, /* bitpos */
266 1.1 christos complain_overflow_signed, /* complain_on_overflow */
267 1.1 christos bfd_elf_generic_reloc, /* special_function */
268 1.1 christos "R_OR1K_GOT16", /* name */
269 1.1 christos FALSE, /* partial_inplace */
270 1.1 christos 0, /* src_mask */
271 1.1 christos 0xffff, /* dst_mask */
272 1.1 christos FALSE), /* pcrel_offset */
273 1.1 christos
274 1.1 christos /* A 26 bit PLT relocation. Shifted by 2. */
275 1.1 christos HOWTO (R_OR1K_PLT26, /* Type. */
276 1.1 christos 2, /* Rightshift. */
277 1.1 christos 2, /* Size (0 = byte, 1 = short, 2 = long). */
278 1.1 christos 26, /* Bitsize. */
279 1.1 christos TRUE, /* PC_relative. */
280 1.1 christos 0, /* Bitpos. */
281 1.1 christos complain_overflow_dont, /* Complain on overflow. */
282 1.1 christos bfd_elf_generic_reloc,/* Special Function. */
283 1.1 christos "R_OR1K_PLT26", /* Name. */
284 1.1 christos FALSE, /* Partial Inplace. */
285 1.1 christos 0, /* Source Mask. */
286 1.1 christos 0x03ffffff, /* Dest Mask. */
287 1.1 christos TRUE), /* PC relative offset? */
288 1.1 christos
289 1.1 christos HOWTO (R_OR1K_GOTOFF_HI16, /* type */
290 1.1 christos 16, /* rightshift */
291 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
292 1.1 christos 16, /* bitsize */
293 1.1 christos FALSE, /* pc_relative */
294 1.1 christos 0, /* bitpos */
295 1.1 christos complain_overflow_dont, /* complain_on_overflow */
296 1.1 christos bfd_elf_generic_reloc, /* special_function */
297 1.1 christos "R_OR1K_GOTOFF_HI16", /* name */
298 1.1 christos FALSE, /* partial_inplace */
299 1.1 christos 0x0, /* src_mask */
300 1.1 christos 0xffff, /* dst_mask */
301 1.1 christos FALSE), /* pcrel_offset */
302 1.1 christos
303 1.1 christos HOWTO (R_OR1K_GOTOFF_LO16, /* type */
304 1.1 christos 0, /* rightshift */
305 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
306 1.1 christos 16, /* bitsize */
307 1.1 christos FALSE, /* pc_relative */
308 1.1 christos 0, /* bitpos */
309 1.1 christos complain_overflow_dont, /* complain_on_overflow */
310 1.1 christos bfd_elf_generic_reloc, /* special_function */
311 1.1 christos "R_OR1K_GOTOFF_LO16", /* name */
312 1.1 christos FALSE, /* partial_inplace */
313 1.1 christos 0x0, /* src_mask */
314 1.1 christos 0xffff, /* dst_mask */
315 1.1 christos FALSE), /* pcrel_offset */
316 1.1 christos
317 1.1 christos HOWTO (R_OR1K_COPY, /* type */
318 1.1 christos 0, /* rightshift */
319 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
320 1.1 christos 32, /* bitsize */
321 1.1 christos FALSE, /* pc_relative */
322 1.1 christos 0, /* bitpos */
323 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */
324 1.1 christos bfd_elf_generic_reloc, /* special_function */
325 1.1 christos "R_OR1K_COPY", /* name */
326 1.1 christos FALSE, /* partial_inplace */
327 1.1 christos 0xffffffff, /* src_mask */
328 1.1 christos 0xffffffff, /* dst_mask */
329 1.1 christos FALSE), /* pcrel_offset */
330 1.1 christos
331 1.1 christos HOWTO (R_OR1K_GLOB_DAT, /* type */
332 1.1 christos 0, /* rightshift */
333 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
334 1.1 christos 32, /* bitsize */
335 1.1 christos FALSE, /* pc_relative */
336 1.1 christos 0, /* bitpos */
337 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */
338 1.1 christos bfd_elf_generic_reloc, /* special_function */
339 1.1 christos "R_OR1K_GLOB_DAT", /* name */
340 1.1 christos FALSE, /* partial_inplace */
341 1.1 christos 0xffffffff, /* src_mask */
342 1.1 christos 0xffffffff, /* dst_mask */
343 1.1 christos FALSE), /* pcrel_offset */
344 1.1 christos
345 1.1 christos HOWTO (R_OR1K_JMP_SLOT, /* type */
346 1.1 christos 0, /* rightshift */
347 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
348 1.1 christos 32, /* bitsize */
349 1.1 christos FALSE, /* pc_relative */
350 1.1 christos 0, /* bitpos */
351 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */
352 1.1 christos bfd_elf_generic_reloc, /* special_function */
353 1.1 christos "R_OR1K_JMP_SLOT", /* name */
354 1.1 christos FALSE, /* partial_inplace */
355 1.1 christos 0xffffffff, /* src_mask */
356 1.1 christos 0xffffffff, /* dst_mask */
357 1.1 christos FALSE), /* pcrel_offset */
358 1.1 christos
359 1.1 christos HOWTO (R_OR1K_RELATIVE, /* type */
360 1.1 christos 0, /* rightshift */
361 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
362 1.1 christos 32, /* bitsize */
363 1.1 christos FALSE, /* pc_relative */
364 1.1 christos 0, /* bitpos */
365 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */
366 1.1 christos bfd_elf_generic_reloc, /* special_function */
367 1.1 christos "R_OR1K_RELATIVE", /* name */
368 1.1 christos FALSE, /* partial_inplace */
369 1.1 christos 0xffffffff, /* src_mask */
370 1.1 christos 0xffffffff, /* dst_mask */
371 1.1 christos FALSE), /* pcrel_offset */
372 1.1 christos
373 1.1 christos HOWTO (R_OR1K_TLS_GD_HI16, /* type */
374 1.1 christos 16, /* rightshift */
375 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
376 1.1 christos 16, /* bitsize */
377 1.1 christos FALSE, /* pc_relative */
378 1.1 christos 0, /* bitpos */
379 1.1 christos complain_overflow_dont, /* complain_on_overflow */
380 1.1 christos bfd_elf_generic_reloc, /* special_function */
381 1.1 christos "R_OR1K_TLS_GD_HI16", /* name */
382 1.1 christos FALSE, /* partial_inplace */
383 1.1 christos 0x0, /* src_mask */
384 1.1 christos 0xffff, /* dst_mask */
385 1.1 christos FALSE), /* pcrel_offset */
386 1.1 christos
387 1.1 christos HOWTO (R_OR1K_TLS_GD_LO16, /* type */
388 1.1 christos 0, /* rightshift */
389 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
390 1.1 christos 16, /* bitsize */
391 1.1 christos FALSE, /* pc_relative */
392 1.1 christos 0, /* bitpos */
393 1.1 christos complain_overflow_dont, /* complain_on_overflow */
394 1.1 christos bfd_elf_generic_reloc, /* special_function */
395 1.1 christos "R_OR1K_TLS_GD_LO16", /* name */
396 1.1 christos FALSE, /* partial_inplace */
397 1.1 christos 0x0, /* src_mask */
398 1.1 christos 0xffff, /* dst_mask */
399 1.1 christos FALSE), /* pcrel_offset */
400 1.1 christos
401 1.1 christos HOWTO (R_OR1K_TLS_LDM_HI16, /* type */
402 1.1 christos 16, /* rightshift */
403 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
404 1.1 christos 16, /* bitsize */
405 1.1 christos FALSE, /* pc_relative */
406 1.1 christos 0, /* bitpos */
407 1.1 christos complain_overflow_dont, /* complain_on_overflow */
408 1.1 christos bfd_elf_generic_reloc, /* special_function */
409 1.1 christos "R_OR1K_TLS_LDM_HI16", /* name */
410 1.1 christos FALSE, /* partial_inplace */
411 1.1 christos 0x0, /* src_mask */
412 1.1 christos 0xffff, /* dst_mask */
413 1.1 christos FALSE), /* pcrel_offset */
414 1.1 christos
415 1.1 christos HOWTO (R_OR1K_TLS_LDM_LO16, /* type */
416 1.1 christos 0, /* rightshift */
417 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
418 1.1 christos 16, /* bitsize */
419 1.1 christos FALSE, /* pc_relative */
420 1.1 christos 0, /* bitpos */
421 1.1 christos complain_overflow_dont, /* complain_on_overflow */
422 1.1 christos bfd_elf_generic_reloc, /* special_function */
423 1.1 christos "R_OR1K_TLS_LDM_LO16", /* name */
424 1.1 christos FALSE, /* partial_inplace */
425 1.1 christos 0x0, /* src_mask */
426 1.1 christos 0xffff, /* dst_mask */
427 1.1 christos FALSE), /* pcrel_offset */
428 1.1 christos
429 1.1 christos HOWTO (R_OR1K_TLS_LDO_HI16, /* type */
430 1.1 christos 16, /* rightshift */
431 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
432 1.1 christos 16, /* bitsize */
433 1.1 christos FALSE, /* pc_relative */
434 1.1 christos 0, /* bitpos */
435 1.1 christos complain_overflow_dont, /* complain_on_overflow */
436 1.1 christos bfd_elf_generic_reloc, /* special_function */
437 1.1 christos "R_OR1K_TLS_LDO_HI16", /* name */
438 1.1 christos FALSE, /* partial_inplace */
439 1.1 christos 0x0, /* src_mask */
440 1.1 christos 0xffff, /* dst_mask */
441 1.1 christos FALSE), /* pcrel_offset */
442 1.1 christos
443 1.1 christos HOWTO (R_OR1K_TLS_LDO_LO16, /* type */
444 1.1 christos 0, /* rightshift */
445 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
446 1.1 christos 16, /* bitsize */
447 1.1 christos FALSE, /* pc_relative */
448 1.1 christos 0, /* bitpos */
449 1.1 christos complain_overflow_dont, /* complain_on_overflow */
450 1.1 christos bfd_elf_generic_reloc, /* special_function */
451 1.1 christos "R_OR1K_TLS_LDO_LO16", /* name */
452 1.1 christos FALSE, /* partial_inplace */
453 1.1 christos 0x0, /* src_mask */
454 1.1 christos 0xffff, /* dst_mask */
455 1.1 christos FALSE), /* pcrel_offset */
456 1.1 christos
457 1.1 christos HOWTO (R_OR1K_TLS_IE_HI16, /* type */
458 1.1 christos 16, /* rightshift */
459 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
460 1.1 christos 16, /* bitsize */
461 1.1 christos FALSE, /* pc_relative */
462 1.1 christos 0, /* bitpos */
463 1.1 christos complain_overflow_dont, /* complain_on_overflow */
464 1.1 christos bfd_elf_generic_reloc, /* special_function */
465 1.1 christos "R_OR1K_TLS_IE_HI16", /* name */
466 1.1 christos FALSE, /* partial_inplace */
467 1.1 christos 0x0, /* src_mask */
468 1.1 christos 0xffff, /* dst_mask */
469 1.1 christos FALSE), /* pcrel_offset */
470 1.1 christos
471 1.1 christos HOWTO (R_OR1K_TLS_IE_LO16, /* type */
472 1.1 christos 0, /* rightshift */
473 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
474 1.1 christos 16, /* bitsize */
475 1.1 christos FALSE, /* pc_relative */
476 1.1 christos 0, /* bitpos */
477 1.1 christos complain_overflow_dont, /* complain_on_overflow */
478 1.1 christos bfd_elf_generic_reloc, /* special_function */
479 1.1 christos "R_OR1K_TLS_IE_LO16", /* name */
480 1.1 christos FALSE, /* partial_inplace */
481 1.1 christos 0x0, /* src_mask */
482 1.1 christos 0xffff, /* dst_mask */
483 1.1 christos FALSE), /* pcrel_offset */
484 1.1 christos
485 1.1 christos HOWTO (R_OR1K_TLS_LE_HI16, /* type */
486 1.1 christos 16, /* rightshift */
487 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
488 1.1 christos 16, /* bitsize */
489 1.1 christos FALSE, /* pc_relative */
490 1.1 christos 0, /* bitpos */
491 1.1 christos complain_overflow_dont, /* complain_on_overflow */
492 1.1 christos bfd_elf_generic_reloc, /* special_function */
493 1.1 christos "R_OR1K_TLS_LE_HI16", /* name */
494 1.1 christos FALSE, /* partial_inplace */
495 1.1 christos 0x0, /* src_mask */
496 1.1 christos 0xffff, /* dst_mask */
497 1.1 christos FALSE), /* pcrel_offset */
498 1.1 christos
499 1.1 christos HOWTO (R_OR1K_TLS_LE_LO16, /* type */
500 1.1 christos 0, /* rightshift */
501 1.1 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
502 1.1 christos 16, /* bitsize */
503 1.1 christos FALSE, /* pc_relative */
504 1.1 christos 0, /* bitpos */
505 1.1 christos complain_overflow_dont, /* complain_on_overflow */
506 1.1 christos bfd_elf_generic_reloc, /* special_function */
507 1.1 christos "R_OR1K_TLS_LE_LO16", /* name */
508 1.1 christos FALSE, /* partial_inplace */
509 1.1 christos 0x0, /* src_mask */
510 1.1 christos 0xffff, /* dst_mask */
511 1.1 christos FALSE), /* pcrel_offset */
512 1.1 christos
513 1.1 christos };
514 1.1 christos
515 1.1 christos /* Map BFD reloc types to Or1k ELF reloc types. */
516 1.1 christos
517 1.1 christos struct or1k_reloc_map
518 1.1 christos {
519 1.1 christos bfd_reloc_code_real_type bfd_reloc_val;
520 1.1 christos unsigned int or1k_reloc_val;
521 1.1 christos };
522 1.1 christos
523 1.1 christos static const struct or1k_reloc_map or1k_reloc_map[] =
524 1.1 christos {
525 1.1 christos { BFD_RELOC_NONE, R_OR1K_NONE },
526 1.1 christos { BFD_RELOC_32, R_OR1K_32 },
527 1.1 christos { BFD_RELOC_16, R_OR1K_16 },
528 1.1 christos { BFD_RELOC_8, R_OR1K_8 },
529 1.1 christos { BFD_RELOC_LO16, R_OR1K_LO_16_IN_INSN },
530 1.1 christos { BFD_RELOC_HI16, R_OR1K_HI_16_IN_INSN },
531 1.1 christos { BFD_RELOC_OR1K_REL_26, R_OR1K_INSN_REL_26 },
532 1.1 christos { BFD_RELOC_VTABLE_ENTRY, R_OR1K_GNU_VTENTRY },
533 1.1 christos { BFD_RELOC_VTABLE_INHERIT, R_OR1K_GNU_VTINHERIT },
534 1.1 christos { BFD_RELOC_32_PCREL, R_OR1K_32_PCREL },
535 1.1 christos { BFD_RELOC_16_PCREL, R_OR1K_16_PCREL },
536 1.1 christos { BFD_RELOC_8_PCREL, R_OR1K_8_PCREL },
537 1.1 christos { BFD_RELOC_OR1K_GOTPC_HI16, R_OR1K_GOTPC_HI16 },
538 1.1 christos { BFD_RELOC_OR1K_GOTPC_LO16, R_OR1K_GOTPC_LO16 },
539 1.1 christos { BFD_RELOC_OR1K_GOT16, R_OR1K_GOT16 },
540 1.1 christos { BFD_RELOC_OR1K_PLT26, R_OR1K_PLT26 },
541 1.1 christos { BFD_RELOC_OR1K_GOTOFF_HI16, R_OR1K_GOTOFF_HI16 },
542 1.1 christos { BFD_RELOC_OR1K_GOTOFF_LO16, R_OR1K_GOTOFF_LO16 },
543 1.1 christos { BFD_RELOC_OR1K_GLOB_DAT, R_OR1K_GLOB_DAT },
544 1.1 christos { BFD_RELOC_OR1K_COPY, R_OR1K_COPY },
545 1.1 christos { BFD_RELOC_OR1K_JMP_SLOT, R_OR1K_JMP_SLOT },
546 1.1 christos { BFD_RELOC_OR1K_RELATIVE, R_OR1K_RELATIVE },
547 1.1 christos { BFD_RELOC_OR1K_TLS_GD_HI16, R_OR1K_TLS_GD_HI16 },
548 1.1 christos { BFD_RELOC_OR1K_TLS_GD_LO16, R_OR1K_TLS_GD_LO16 },
549 1.1 christos { BFD_RELOC_OR1K_TLS_LDM_HI16, R_OR1K_TLS_LDM_HI16 },
550 1.1 christos { BFD_RELOC_OR1K_TLS_LDM_LO16, R_OR1K_TLS_LDM_LO16 },
551 1.1 christos { BFD_RELOC_OR1K_TLS_LDO_HI16, R_OR1K_TLS_LDO_HI16 },
552 1.1 christos { BFD_RELOC_OR1K_TLS_LDO_LO16, R_OR1K_TLS_LDO_LO16 },
553 1.1 christos { BFD_RELOC_OR1K_TLS_IE_HI16, R_OR1K_TLS_IE_HI16 },
554 1.1 christos { BFD_RELOC_OR1K_TLS_IE_LO16, R_OR1K_TLS_IE_LO16 },
555 1.1 christos { BFD_RELOC_OR1K_TLS_LE_HI16, R_OR1K_TLS_LE_HI16 },
556 1.1 christos { BFD_RELOC_OR1K_TLS_LE_LO16, R_OR1K_TLS_LE_LO16 },
557 1.1 christos };
558 1.1 christos
559 1.1 christos /* The linker needs to keep track of the number of relocs that it
560 1.1 christos decides to copy as dynamic relocs in check_relocs for each symbol.
561 1.1 christos This is so that it can later discard them if they are found to be
562 1.1 christos unnecessary. We store the information in a field extending the
563 1.1 christos regular ELF linker hash table. */
564 1.1 christos
565 1.1 christos struct elf_or1k_dyn_relocs
566 1.1 christos {
567 1.1 christos struct elf_or1k_dyn_relocs *next;
568 1.1 christos
569 1.1 christos /* The input section of the reloc. */
570 1.1 christos asection *sec;
571 1.1 christos
572 1.1 christos /* Total number of relocs copied for the input section. */
573 1.1 christos bfd_size_type count;
574 1.1 christos
575 1.1 christos /* Number of pc-relative relocs copied for the input section. */
576 1.1 christos bfd_size_type pc_count;
577 1.1 christos };
578 1.1 christos
579 1.1 christos #define TLS_UNKNOWN 0
580 1.1 christos #define TLS_NONE 1
581 1.1 christos #define TLS_GD 2
582 1.1 christos #define TLS_LD 3
583 1.1 christos #define TLS_IE 4
584 1.1 christos #define TLS_LE 5
585 1.1 christos
586 1.1 christos /* ELF linker hash entry. */
587 1.1 christos struct elf_or1k_link_hash_entry
588 1.1 christos {
589 1.1 christos struct elf_link_hash_entry root;
590 1.1 christos
591 1.1 christos /* Track dynamic relocs copied for this symbol. */
592 1.1 christos struct elf_or1k_dyn_relocs *dyn_relocs;
593 1.1 christos
594 1.1 christos /* Track type of TLS access. */
595 1.1 christos unsigned char tls_type;
596 1.1 christos };
597 1.1 christos
598 1.1 christos /* ELF object data. */
599 1.1 christos struct elf_or1k_obj_tdata
600 1.1 christos {
601 1.1 christos struct elf_obj_tdata root;
602 1.1 christos
603 1.1 christos /* tls_type for each local got entry. */
604 1.1 christos unsigned char *local_tls_type;
605 1.1 christos };
606 1.1 christos
607 1.1 christos #define elf_or1k_tdata(abfd) \
608 1.1 christos ((struct elf_or1k_obj_tdata *) (abfd)->tdata.any)
609 1.1 christos
610 1.1 christos #define elf_or1k_local_tls_type(abfd) \
611 1.1 christos (elf_or1k_tdata (abfd)->local_tls_type)
612 1.1 christos
613 1.1 christos /* ELF linker hash table. */
614 1.1 christos struct elf_or1k_link_hash_table
615 1.1 christos {
616 1.1 christos struct elf_link_hash_table root;
617 1.1 christos
618 1.1 christos /* Short-cuts to get to dynamic linker sections. */
619 1.1 christos asection *sgot;
620 1.1 christos asection *sgotplt;
621 1.1 christos asection *srelgot;
622 1.1 christos asection *splt;
623 1.1 christos asection *srelplt;
624 1.1 christos asection *sdynbss;
625 1.1 christos asection *srelbss;
626 1.1 christos
627 1.1 christos /* Small local sym to section mapping cache. */
628 1.1 christos struct sym_cache sym_sec;
629 1.1 christos };
630 1.1 christos
631 1.1 christos /* Get the ELF linker hash table from a link_info structure. */
632 1.1 christos #define or1k_elf_hash_table(p) \
633 1.1 christos (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
634 1.1 christos == OR1K_ELF_DATA ? ((struct elf_or1k_link_hash_table *) ((p)->hash)) : NULL)
635 1.1 christos
636 1.1 christos static bfd_boolean
637 1.1 christos elf_or1k_mkobject (bfd *abfd)
638 1.1 christos {
639 1.1 christos return bfd_elf_allocate_object (abfd, sizeof (struct elf_or1k_obj_tdata),
640 1.1 christos OR1K_ELF_DATA);
641 1.1 christos }
642 1.1 christos
643 1.1 christos /* Create an entry in an or1k ELF linker hash table. */
644 1.1 christos
645 1.1 christos static struct bfd_hash_entry *
646 1.1 christos or1k_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
647 1.1 christos struct bfd_hash_table *table,
648 1.1 christos const char *string)
649 1.1 christos {
650 1.1 christos struct elf_or1k_link_hash_entry *ret =
651 1.1 christos (struct elf_or1k_link_hash_entry *) entry;
652 1.1 christos
653 1.1 christos /* Allocate the structure if it has not already been allocated by a
654 1.1 christos subclass. */
655 1.1 christos if (ret == NULL)
656 1.1 christos ret = bfd_hash_allocate (table,
657 1.1 christos sizeof (struct elf_or1k_link_hash_entry));
658 1.1 christos if (ret == NULL)
659 1.1 christos return NULL;
660 1.1 christos
661 1.1 christos /* Call the allocation method of the superclass. */
662 1.1 christos ret = ((struct elf_or1k_link_hash_entry *)
663 1.1 christos _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
664 1.1 christos table, string));
665 1.1 christos if (ret != NULL)
666 1.1 christos {
667 1.1 christos struct elf_or1k_link_hash_entry *eh;
668 1.1 christos
669 1.1 christos eh = (struct elf_or1k_link_hash_entry *) ret;
670 1.1 christos eh->dyn_relocs = NULL;
671 1.1 christos eh->tls_type = TLS_UNKNOWN;
672 1.1 christos }
673 1.1 christos
674 1.1 christos return (struct bfd_hash_entry *) ret;
675 1.1 christos }
676 1.1 christos
677 1.1 christos /* Create an or1k ELF linker hash table. */
678 1.1 christos
679 1.1 christos static struct bfd_link_hash_table *
680 1.1 christos or1k_elf_link_hash_table_create (bfd *abfd)
681 1.1 christos {
682 1.1 christos struct elf_or1k_link_hash_table *ret;
683 1.1 christos bfd_size_type amt = sizeof (struct elf_or1k_link_hash_table);
684 1.1 christos
685 1.1 christos ret = bfd_zmalloc (amt);
686 1.1 christos if (ret == NULL)
687 1.1 christos return NULL;
688 1.1 christos
689 1.1 christos if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
690 1.1 christos or1k_elf_link_hash_newfunc,
691 1.1 christos sizeof (struct elf_or1k_link_hash_entry),
692 1.1 christos OR1K_ELF_DATA))
693 1.1 christos {
694 1.1 christos free (ret);
695 1.1 christos return NULL;
696 1.1 christos }
697 1.1 christos
698 1.1 christos return &ret->root.root;
699 1.1 christos }
700 1.1 christos
701 1.1 christos static reloc_howto_type *
702 1.1 christos or1k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
703 1.1 christos bfd_reloc_code_real_type code)
704 1.1 christos {
705 1.1 christos unsigned int i;
706 1.1 christos
707 1.1 christos for (i = ARRAY_SIZE (or1k_reloc_map); --i;)
708 1.1 christos if (or1k_reloc_map[i].bfd_reloc_val == code)
709 1.1 christos return & or1k_elf_howto_table[or1k_reloc_map[i].or1k_reloc_val];
710 1.1 christos
711 1.1 christos return NULL;
712 1.1 christos }
713 1.1 christos
714 1.1 christos static reloc_howto_type *
715 1.1 christos or1k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
716 1.1 christos const char *r_name)
717 1.1 christos {
718 1.1 christos unsigned int i;
719 1.1 christos
720 1.1 christos for (i = 0;
721 1.1 christos i < (sizeof (or1k_elf_howto_table)
722 1.1 christos / sizeof (or1k_elf_howto_table[0]));
723 1.1 christos i++)
724 1.1 christos if (or1k_elf_howto_table[i].name != NULL
725 1.1 christos && strcasecmp (or1k_elf_howto_table[i].name, r_name) == 0)
726 1.1 christos return &or1k_elf_howto_table[i];
727 1.1 christos
728 1.1 christos return NULL;
729 1.1 christos }
730 1.1 christos
731 1.1 christos /* Set the howto pointer for an Or1k ELF reloc. */
732 1.1 christos
733 1.1 christos static void
734 1.1 christos or1k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
735 1.1 christos arelent * cache_ptr,
736 1.1 christos Elf_Internal_Rela * dst)
737 1.1 christos {
738 1.1 christos unsigned int r_type;
739 1.1 christos
740 1.1 christos r_type = ELF32_R_TYPE (dst->r_info);
741 1.1 christos if (r_type >= (unsigned int) R_OR1K_max)
742 1.1 christos {
743 1.1 christos _bfd_error_handler (_("%A: invalid OR1K reloc number: %d"), abfd, r_type);
744 1.1 christos r_type = 0;
745 1.1 christos }
746 1.1 christos cache_ptr->howto = & or1k_elf_howto_table[r_type];
747 1.1 christos }
748 1.1 christos
749 1.1 christos
750 1.1 christos /* Return the relocation value for @tpoff relocations.. */
751 1.1 christos static bfd_vma
752 1.1 christos tpoff (struct bfd_link_info *info, bfd_vma address)
753 1.1 christos {
754 1.1 christos /* If tls_sec is NULL, we should have signalled an error already. */
755 1.1 christos if (elf_hash_table (info)->tls_sec == NULL)
756 1.1 christos return 0;
757 1.1 christos
758 1.1 christos /* The thread pointer on or1k stores the address after the TCB where
759 1.1 christos the data is, just compute the difference. No need to compensate
760 1.1 christos for the size of TCB. */
761 1.1 christos return (address - elf_hash_table (info)->tls_sec->vma);
762 1.1 christos }
763 1.1 christos
764 1.1 christos /* Relocate an Or1k ELF section.
765 1.1 christos
766 1.1 christos The RELOCATE_SECTION function is called by the new ELF backend linker
767 1.1 christos to handle the relocations for a section.
768 1.1 christos
769 1.1 christos The relocs are always passed as Rela structures; if the section
770 1.1 christos actually uses Rel structures, the r_addend field will always be
771 1.1 christos zero.
772 1.1 christos
773 1.1 christos This function is responsible for adjusting the section contents as
774 1.1 christos necessary, and (if using Rela relocs and generating a relocatable
775 1.1 christos output file) adjusting the reloc addend as necessary.
776 1.1 christos
777 1.1 christos This function does not have to worry about setting the reloc
778 1.1 christos address or the reloc symbol index.
779 1.1 christos
780 1.1 christos LOCAL_SYMS is a pointer to the swapped in local symbols.
781 1.1 christos
782 1.1 christos LOCAL_SECTIONS is an array giving the section in the input file
783 1.1 christos corresponding to the st_shndx field of each local symbol.
784 1.1 christos
785 1.1 christos The global hash table entry for the global symbols can be found
786 1.1 christos via elf_sym_hashes (input_bfd).
787 1.1 christos
788 1.1 christos When generating relocatable output, this function must handle
789 1.1 christos STB_LOCAL/STT_SECTION symbols specially. The output symbol is
790 1.1 christos going to be the section symbol corresponding to the output
791 1.1 christos section, which means that the addend must be adjusted
792 1.1 christos accordingly. */
793 1.1 christos
794 1.1 christos static bfd_boolean
795 1.1 christos or1k_elf_relocate_section (bfd *output_bfd,
796 1.1 christos struct bfd_link_info *info,
797 1.1 christos bfd *input_bfd,
798 1.1 christos asection *input_section,
799 1.1 christos bfd_byte *contents,
800 1.1 christos Elf_Internal_Rela *relocs,
801 1.1 christos Elf_Internal_Sym *local_syms,
802 1.1 christos asection **local_sections)
803 1.1 christos {
804 1.1 christos Elf_Internal_Shdr *symtab_hdr;
805 1.1 christos struct elf_link_hash_entry **sym_hashes;
806 1.1 christos Elf_Internal_Rela *rel;
807 1.1 christos Elf_Internal_Rela *relend;
808 1.1 christos struct elf_or1k_link_hash_table *htab = or1k_elf_hash_table (info);
809 1.1 christos bfd *dynobj;
810 1.1 christos asection *sreloc;
811 1.1 christos bfd_vma *local_got_offsets;
812 1.1 christos asection *sgot;
813 1.1 christos
814 1.1 christos if (htab == NULL)
815 1.1 christos return FALSE;
816 1.1 christos
817 1.1 christos dynobj = htab->root.dynobj;
818 1.1 christos local_got_offsets = elf_local_got_offsets (input_bfd);
819 1.1 christos
820 1.1 christos sreloc = elf_section_data (input_section)->sreloc;
821 1.1 christos
822 1.1 christos sgot = htab->sgot;
823 1.1 christos
824 1.1 christos symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
825 1.1 christos sym_hashes = elf_sym_hashes (input_bfd);
826 1.1 christos relend = relocs + input_section->reloc_count;
827 1.1 christos
828 1.1 christos for (rel = relocs; rel < relend; rel++)
829 1.1 christos {
830 1.1 christos reloc_howto_type *howto;
831 1.1 christos unsigned long r_symndx;
832 1.1 christos Elf_Internal_Sym *sym;
833 1.1 christos asection *sec;
834 1.1 christos struct elf_link_hash_entry *h;
835 1.1 christos bfd_vma relocation;
836 1.1 christos bfd_reloc_status_type r;
837 1.1 christos const char *name = NULL;
838 1.1 christos int r_type;
839 1.1 christos
840 1.1 christos r_type = ELF32_R_TYPE (rel->r_info);
841 1.1 christos r_symndx = ELF32_R_SYM (rel->r_info);
842 1.1 christos
843 1.1 christos if (r_type == R_OR1K_GNU_VTINHERIT
844 1.1 christos || r_type == R_OR1K_GNU_VTENTRY)
845 1.1 christos continue;
846 1.1 christos
847 1.1 christos if (r_type < 0 || r_type >= (int) R_OR1K_max)
848 1.1 christos {
849 1.1 christos bfd_set_error (bfd_error_bad_value);
850 1.1 christos return FALSE;
851 1.1 christos }
852 1.1 christos
853 1.1 christos howto = or1k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
854 1.1 christos h = NULL;
855 1.1 christos sym = NULL;
856 1.1 christos sec = NULL;
857 1.1 christos
858 1.1 christos if (r_symndx < symtab_hdr->sh_info)
859 1.1 christos {
860 1.1 christos sym = local_syms + r_symndx;
861 1.1 christos sec = local_sections[r_symndx];
862 1.1 christos relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
863 1.1 christos
864 1.1 christos name = bfd_elf_string_from_elf_section
865 1.1 christos (input_bfd, symtab_hdr->sh_link, sym->st_name);
866 1.1 christos name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
867 1.1 christos }
868 1.1 christos else
869 1.1 christos {
870 1.1 christos bfd_boolean unresolved_reloc, warned, ignored;
871 1.1 christos
872 1.1 christos RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
873 1.1 christos r_symndx, symtab_hdr, sym_hashes,
874 1.1 christos h, sec, relocation,
875 1.1 christos unresolved_reloc, warned, ignored);
876 1.1 christos }
877 1.1 christos
878 1.1 christos if (sec != NULL && discarded_section (sec))
879 1.1 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
880 1.1 christos rel, 1, relend, howto, 0, contents);
881 1.1 christos
882 1.1 christos if (info->relocatable)
883 1.1 christos continue;
884 1.1 christos
885 1.1 christos switch (howto->type)
886 1.1 christos {
887 1.1 christos case R_OR1K_PLT26:
888 1.1 christos {
889 1.1 christos if (htab->splt != NULL && h != NULL
890 1.1 christos && h->plt.offset != (bfd_vma) -1)
891 1.1 christos {
892 1.1 christos relocation = (htab->splt->output_section->vma
893 1.1 christos + htab->splt->output_offset
894 1.1 christos + h->plt.offset);
895 1.1 christos }
896 1.1 christos break;
897 1.1 christos }
898 1.1 christos
899 1.1 christos case R_OR1K_GOT16:
900 1.1 christos /* Relocation is to the entry for this symbol in the global
901 1.1 christos offset table. */
902 1.1 christos BFD_ASSERT (sgot != NULL);
903 1.1 christos if (h != NULL)
904 1.1 christos {
905 1.1 christos bfd_boolean dyn;
906 1.1 christos bfd_vma off;
907 1.1 christos
908 1.1 christos off = h->got.offset;
909 1.1 christos BFD_ASSERT (off != (bfd_vma) -1);
910 1.1 christos
911 1.1 christos dyn = htab->root.dynamic_sections_created;
912 1.1 christos if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
913 1.1 christos || (info->shared
914 1.1 christos && SYMBOL_REFERENCES_LOCAL (info, h)))
915 1.1 christos {
916 1.1 christos /* This is actually a static link, or it is a
917 1.1 christos -Bsymbolic link and the symbol is defined
918 1.1 christos locally, or the symbol was forced to be local
919 1.1 christos because of a version file. We must initialize
920 1.1 christos this entry in the global offset table. Since the
921 1.1 christos offset must always be a multiple of 4, we use the
922 1.1 christos least significant bit to record whether we have
923 1.1 christos initialized it already.
924 1.1 christos
925 1.1 christos When doing a dynamic link, we create a .rela.got
926 1.1 christos relocation entry to initialize the value. This
927 1.1 christos is done in the finish_dynamic_symbol routine. */
928 1.1 christos if ((off & 1) != 0)
929 1.1 christos off &= ~1;
930 1.1 christos else
931 1.1 christos {
932 1.1 christos /* Write entry in GOT. */
933 1.1 christos bfd_put_32 (output_bfd, relocation,
934 1.1 christos sgot->contents + off);
935 1.1 christos /* Mark GOT entry as having been written. */
936 1.1 christos h->got.offset |= 1;
937 1.1 christos }
938 1.1 christos }
939 1.1 christos
940 1.1 christos relocation = sgot->output_offset + off;
941 1.1 christos }
942 1.1 christos else
943 1.1 christos {
944 1.1 christos bfd_vma off;
945 1.1 christos bfd_byte *loc;
946 1.1 christos
947 1.1 christos BFD_ASSERT (local_got_offsets != NULL
948 1.1 christos && local_got_offsets[r_symndx] != (bfd_vma) -1);
949 1.1 christos
950 1.1 christos /* Get offset into GOT table. */
951 1.1 christos off = local_got_offsets[r_symndx];
952 1.1 christos
953 1.1 christos /* The offset must always be a multiple of 4. We use
954 1.1 christos the least significant bit to record whether we have
955 1.1 christos already processed this entry. */
956 1.1 christos if ((off & 1) != 0)
957 1.1 christos off &= ~1;
958 1.1 christos else
959 1.1 christos {
960 1.1 christos /* Write entry in GOT. */
961 1.1 christos bfd_put_32 (output_bfd, relocation, sgot->contents + off);
962 1.1 christos if (info->shared)
963 1.1 christos {
964 1.1 christos asection *srelgot;
965 1.1 christos Elf_Internal_Rela outrel;
966 1.1 christos
967 1.1 christos /* We need to generate a R_OR1K_RELATIVE reloc
968 1.1 christos for the dynamic linker. */
969 1.1 christos srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
970 1.1 christos BFD_ASSERT (srelgot != NULL);
971 1.1 christos
972 1.1 christos outrel.r_offset = (sgot->output_section->vma
973 1.1 christos + sgot->output_offset
974 1.1 christos + off);
975 1.1 christos outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
976 1.1 christos outrel.r_addend = relocation;
977 1.1 christos loc = srelgot->contents;
978 1.1 christos loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
979 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
980 1.1 christos ++srelgot->reloc_count;
981 1.1 christos }
982 1.1 christos
983 1.1 christos local_got_offsets[r_symndx] |= 1;
984 1.1 christos }
985 1.1 christos relocation = sgot->output_offset + off;
986 1.1 christos }
987 1.1 christos
988 1.1 christos /* Addend should be zero. */
989 1.1 christos if (rel->r_addend != 0)
990 1.1 christos (*_bfd_error_handler)
991 1.1 christos (_("internal error: addend should be zero for R_OR1K_GOT16"));
992 1.1 christos
993 1.1 christos break;
994 1.1 christos
995 1.1 christos case R_OR1K_GOTOFF_LO16:
996 1.1 christos case R_OR1K_GOTOFF_HI16:
997 1.1 christos /* Relocation is offset from GOT. */
998 1.1 christos BFD_ASSERT (sgot != NULL);
999 1.1 christos relocation -= sgot->output_section->vma;
1000 1.1 christos break;
1001 1.1 christos
1002 1.1 christos case R_OR1K_INSN_REL_26:
1003 1.1 christos case R_OR1K_HI_16_IN_INSN:
1004 1.1 christos case R_OR1K_LO_16_IN_INSN:
1005 1.1 christos case R_OR1K_32:
1006 1.1 christos /* R_OR1K_16? */
1007 1.1 christos {
1008 1.1 christos /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols
1009 1.1 christos from removed linkonce sections, or sections discarded by
1010 1.1 christos a linker script. */
1011 1.1 christos if (r_symndx == STN_UNDEF
1012 1.1 christos || (input_section->flags & SEC_ALLOC) == 0)
1013 1.1 christos break;
1014 1.1 christos
1015 1.1 christos if ((info->shared
1016 1.1 christos && (h == NULL
1017 1.1 christos || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1018 1.1 christos || h->root.type != bfd_link_hash_undefweak)
1019 1.1 christos && (howto->type != R_OR1K_INSN_REL_26
1020 1.1 christos || !SYMBOL_CALLS_LOCAL (info, h)))
1021 1.1 christos || (!info->shared
1022 1.1 christos && h != NULL
1023 1.1 christos && h->dynindx != -1
1024 1.1 christos && !h->non_got_ref
1025 1.1 christos && ((h->def_dynamic
1026 1.1 christos && !h->def_regular)
1027 1.1 christos || h->root.type == bfd_link_hash_undefweak
1028 1.1 christos || h->root.type == bfd_link_hash_undefined)))
1029 1.1 christos {
1030 1.1 christos Elf_Internal_Rela outrel;
1031 1.1 christos bfd_byte *loc;
1032 1.1 christos bfd_boolean skip;
1033 1.1 christos
1034 1.1 christos /* When generating a shared object, these relocations
1035 1.1 christos are copied into the output file to be resolved at run
1036 1.1 christos time. */
1037 1.1 christos
1038 1.1 christos BFD_ASSERT (sreloc != NULL);
1039 1.1 christos
1040 1.1 christos skip = FALSE;
1041 1.1 christos
1042 1.1 christos outrel.r_offset =
1043 1.1 christos _bfd_elf_section_offset (output_bfd, info, input_section,
1044 1.1 christos rel->r_offset);
1045 1.1 christos if (outrel.r_offset == (bfd_vma) -1)
1046 1.1 christos skip = TRUE;
1047 1.1 christos else if (outrel.r_offset == (bfd_vma) -2)
1048 1.1 christos skip = TRUE;
1049 1.1 christos outrel.r_offset += (input_section->output_section->vma
1050 1.1 christos + input_section->output_offset);
1051 1.1 christos
1052 1.1 christos if (skip)
1053 1.1 christos memset (&outrel, 0, sizeof outrel);
1054 1.1 christos /* h->dynindx may be -1 if the symbol was marked to
1055 1.1 christos become local. */
1056 1.1 christos else if (h != NULL
1057 1.1 christos && ((! info->symbolic && h->dynindx != -1)
1058 1.1 christos || !h->def_regular))
1059 1.1 christos {
1060 1.1 christos BFD_ASSERT (h->dynindx != -1);
1061 1.1 christos outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1062 1.1 christos outrel.r_addend = rel->r_addend;
1063 1.1 christos }
1064 1.1 christos else
1065 1.1 christos {
1066 1.1 christos if (r_type == R_OR1K_32)
1067 1.1 christos {
1068 1.1 christos outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1069 1.1 christos outrel.r_addend = relocation + rel->r_addend;
1070 1.1 christos }
1071 1.1 christos else
1072 1.1 christos {
1073 1.1 christos BFD_FAIL ();
1074 1.1 christos (*_bfd_error_handler)
1075 1.1 christos (_("%B: probably compiled without -fPIC?"),
1076 1.1 christos input_bfd);
1077 1.1 christos bfd_set_error (bfd_error_bad_value);
1078 1.1 christos return FALSE;
1079 1.1 christos }
1080 1.1 christos }
1081 1.1 christos
1082 1.1 christos loc = sreloc->contents;
1083 1.1 christos loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1084 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1085 1.1 christos break;
1086 1.1 christos }
1087 1.1 christos break;
1088 1.1 christos }
1089 1.1 christos
1090 1.1 christos case R_OR1K_TLS_LDM_HI16:
1091 1.1 christos case R_OR1K_TLS_LDM_LO16:
1092 1.1 christos case R_OR1K_TLS_LDO_HI16:
1093 1.1 christos case R_OR1K_TLS_LDO_LO16:
1094 1.1 christos /* TODO: implement support for local dynamic. */
1095 1.1 christos BFD_FAIL ();
1096 1.1 christos (*_bfd_error_handler)
1097 1.1 christos (_("%B: support for local dynamic not implemented"),
1098 1.1 christos input_bfd);
1099 1.1 christos bfd_set_error (bfd_error_bad_value);
1100 1.1 christos return FALSE;
1101 1.1 christos
1102 1.1 christos
1103 1.1 christos case R_OR1K_TLS_GD_HI16:
1104 1.1 christos case R_OR1K_TLS_GD_LO16:
1105 1.1 christos case R_OR1K_TLS_IE_HI16:
1106 1.1 christos case R_OR1K_TLS_IE_LO16:
1107 1.1 christos {
1108 1.1 christos bfd_vma gotoff;
1109 1.1 christos Elf_Internal_Rela rela;
1110 1.1 christos bfd_byte *loc;
1111 1.1 christos int dynamic;
1112 1.1 christos
1113 1.1 christos sreloc = bfd_get_section_by_name (dynobj, ".rela.got");
1114 1.1 christos
1115 1.1 christos /* Mark as TLS related GOT entry by setting
1116 1.1 christos bit 2 as well as bit 1. */
1117 1.1 christos if (h != NULL)
1118 1.1 christos {
1119 1.1 christos gotoff = h->got.offset;
1120 1.1 christos h->got.offset |= 3;
1121 1.1 christos }
1122 1.1 christos else
1123 1.1 christos {
1124 1.1 christos gotoff = local_got_offsets[r_symndx];
1125 1.1 christos local_got_offsets[r_symndx] |= 3;
1126 1.1 christos }
1127 1.1 christos
1128 1.1 christos /* Only process the relocation once. */
1129 1.1 christos if (gotoff & 1)
1130 1.1 christos {
1131 1.1 christos relocation = sgot->output_offset + (gotoff & ~3);
1132 1.1 christos break;
1133 1.1 christos }
1134 1.1 christos
1135 1.1 christos BFD_ASSERT (elf_hash_table (info)->hgot == NULL
1136 1.1 christos || elf_hash_table (info)->hgot->root.u.def.value == 0);
1137 1.1 christos
1138 1.1 christos /* Dynamic entries will require relocations. if we do not need
1139 1.1 christos them we will just use the default R_OR1K_NONE and
1140 1.1 christos not set anything. */
1141 1.1 christos dynamic = info->shared
1142 1.1 christos || (sec && (sec->flags & SEC_ALLOC) != 0
1143 1.1 christos && h != NULL
1144 1.1 christos && (h->root.type == bfd_link_hash_defweak || !h->def_regular));
1145 1.1 christos
1146 1.1 christos /* Shared GD. */
1147 1.1 christos if (dynamic && (howto->type == R_OR1K_TLS_GD_HI16
1148 1.1 christos || howto->type == R_OR1K_TLS_GD_LO16))
1149 1.1 christos {
1150 1.1 christos int i;
1151 1.1 christos
1152 1.1 christos /* Add DTPMOD and DTPOFF GOT and rela entries. */
1153 1.1 christos for (i = 0; i < 2; ++i)
1154 1.1 christos {
1155 1.1 christos rela.r_offset = sgot->output_section->vma +
1156 1.1 christos sgot->output_offset + gotoff + i*4;
1157 1.1 christos if (h != NULL && h->dynindx != -1)
1158 1.1 christos {
1159 1.1 christos rela.r_info = ELF32_R_INFO (h->dynindx,
1160 1.1 christos (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1161 1.1 christos rela.r_addend = 0;
1162 1.1 christos }
1163 1.1 christos else
1164 1.1 christos {
1165 1.1 christos rela.r_info = ELF32_R_INFO (0,
1166 1.1 christos (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1167 1.1 christos rela.r_addend = tpoff (info, relocation);
1168 1.1 christos }
1169 1.1 christos
1170 1.1 christos loc = sreloc->contents;
1171 1.1 christos loc += sreloc->reloc_count++ *
1172 1.1 christos sizeof (Elf32_External_Rela);
1173 1.1 christos
1174 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1175 1.1 christos bfd_put_32 (output_bfd, 0, sgot->contents + gotoff + i*4);
1176 1.1 christos }
1177 1.1 christos }
1178 1.1 christos /* Static GD. */
1179 1.1 christos else if (howto->type == R_OR1K_TLS_GD_HI16
1180 1.1 christos || howto->type == R_OR1K_TLS_GD_LO16)
1181 1.1 christos {
1182 1.1 christos bfd_put_32 (output_bfd, 1, sgot->contents + gotoff);
1183 1.1 christos bfd_put_32 (output_bfd, tpoff (info, relocation),
1184 1.1 christos sgot->contents + gotoff + 4);
1185 1.1 christos }
1186 1.1 christos /* Shared IE. */
1187 1.1 christos else if (dynamic)
1188 1.1 christos {
1189 1.1 christos /* Add TPOFF GOT and rela entries. */
1190 1.1 christos rela.r_offset = sgot->output_section->vma +
1191 1.1 christos sgot->output_offset + gotoff;
1192 1.1 christos if (h != NULL && h->dynindx != -1)
1193 1.1 christos {
1194 1.1 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_TLS_TPOFF);
1195 1.1 christos rela.r_addend = 0;
1196 1.1 christos }
1197 1.1 christos else
1198 1.1 christos {
1199 1.1 christos rela.r_info = ELF32_R_INFO (0, R_OR1K_TLS_TPOFF);
1200 1.1 christos rela.r_addend = tpoff (info, relocation);
1201 1.1 christos }
1202 1.1 christos
1203 1.1 christos loc = sreloc->contents;
1204 1.1 christos loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1205 1.1 christos
1206 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1207 1.1 christos bfd_put_32 (output_bfd, 0, sgot->contents + gotoff);
1208 1.1 christos }
1209 1.1 christos /* Static IE. */
1210 1.1 christos else
1211 1.1 christos {
1212 1.1 christos bfd_put_32 (output_bfd, tpoff (info, relocation),
1213 1.1 christos sgot->contents + gotoff);
1214 1.1 christos }
1215 1.1 christos relocation = sgot->output_offset + gotoff;
1216 1.1 christos break;
1217 1.1 christos }
1218 1.1 christos case R_OR1K_TLS_LE_HI16:
1219 1.1 christos case R_OR1K_TLS_LE_LO16:
1220 1.1 christos
1221 1.1 christos /* Relocation is offset from TP. */
1222 1.1 christos relocation = tpoff (info, relocation);
1223 1.1 christos break;
1224 1.1 christos
1225 1.1 christos case R_OR1K_TLS_DTPMOD:
1226 1.1 christos case R_OR1K_TLS_DTPOFF:
1227 1.1 christos case R_OR1K_TLS_TPOFF:
1228 1.1 christos /* These are resolved dynamically on load and shouldn't
1229 1.1 christos be used as linker input. */
1230 1.1 christos BFD_FAIL ();
1231 1.1 christos (*_bfd_error_handler)
1232 1.1 christos (_("%B: will not resolve runtime TLS relocation"),
1233 1.1 christos input_bfd);
1234 1.1 christos bfd_set_error (bfd_error_bad_value);
1235 1.1 christos return FALSE;
1236 1.1 christos
1237 1.1 christos default:
1238 1.1 christos break;
1239 1.1 christos }
1240 1.1 christos r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
1241 1.1 christos rel->r_offset, relocation, rel->r_addend);
1242 1.1 christos
1243 1.1 christos if (r != bfd_reloc_ok)
1244 1.1 christos {
1245 1.1 christos const char *msg = NULL;
1246 1.1 christos
1247 1.1 christos switch (r)
1248 1.1 christos {
1249 1.1 christos case bfd_reloc_overflow:
1250 1.1 christos r = info->callbacks->reloc_overflow
1251 1.1 christos (info, (h ? &h->root : NULL), name, howto->name,
1252 1.1 christos (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1253 1.1 christos break;
1254 1.1 christos
1255 1.1 christos case bfd_reloc_undefined:
1256 1.1 christos r = info->callbacks->undefined_symbol
1257 1.1 christos (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1258 1.1 christos break;
1259 1.1 christos
1260 1.1 christos case bfd_reloc_outofrange:
1261 1.1 christos msg = _("internal error: out of range error");
1262 1.1 christos break;
1263 1.1 christos
1264 1.1 christos case bfd_reloc_notsupported:
1265 1.1 christos msg = _("internal error: unsupported relocation error");
1266 1.1 christos break;
1267 1.1 christos
1268 1.1 christos case bfd_reloc_dangerous:
1269 1.1 christos msg = _("internal error: dangerous relocation");
1270 1.1 christos break;
1271 1.1 christos
1272 1.1 christos default:
1273 1.1 christos msg = _("internal error: unknown error");
1274 1.1 christos break;
1275 1.1 christos }
1276 1.1 christos
1277 1.1 christos if (msg)
1278 1.1 christos r = info->callbacks->warning
1279 1.1 christos (info, msg, name, input_bfd, input_section, rel->r_offset);
1280 1.1 christos
1281 1.1 christos if (!r)
1282 1.1 christos return FALSE;
1283 1.1 christos }
1284 1.1 christos }
1285 1.1 christos
1286 1.1 christos return TRUE;
1287 1.1 christos }
1288 1.1 christos
1289 1.1 christos /* Return the section that should be marked against GC for a given
1290 1.1 christos relocation. */
1291 1.1 christos
1292 1.1 christos static asection *
1293 1.1 christos or1k_elf_gc_mark_hook (asection *sec,
1294 1.1 christos struct bfd_link_info *info,
1295 1.1 christos Elf_Internal_Rela *rel,
1296 1.1 christos struct elf_link_hash_entry *h,
1297 1.1 christos Elf_Internal_Sym *sym)
1298 1.1 christos {
1299 1.1 christos if (h != NULL)
1300 1.1 christos switch (ELF32_R_TYPE (rel->r_info))
1301 1.1 christos {
1302 1.1 christos case R_OR1K_GNU_VTINHERIT:
1303 1.1 christos case R_OR1K_GNU_VTENTRY:
1304 1.1 christos return NULL;
1305 1.1 christos }
1306 1.1 christos
1307 1.1 christos return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1308 1.1 christos }
1309 1.1 christos
1310 1.1 christos static bfd_boolean
1311 1.1 christos or1k_elf_gc_sweep_hook (bfd *abfd,
1312 1.1 christos struct bfd_link_info *info ATTRIBUTE_UNUSED,
1313 1.1 christos asection *sec,
1314 1.1 christos const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
1315 1.1 christos {
1316 1.1 christos /* Update the got entry reference counts for the section being removed. */
1317 1.1 christos Elf_Internal_Shdr *symtab_hdr;
1318 1.1 christos struct elf_link_hash_entry **sym_hashes;
1319 1.1 christos bfd_signed_vma *local_got_refcounts;
1320 1.1 christos const Elf_Internal_Rela *rel, *relend;
1321 1.1 christos
1322 1.1 christos elf_section_data (sec)->local_dynrel = NULL;
1323 1.1 christos
1324 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1325 1.1 christos sym_hashes = elf_sym_hashes (abfd);
1326 1.1 christos local_got_refcounts = elf_local_got_refcounts (abfd);
1327 1.1 christos
1328 1.1 christos relend = relocs + sec->reloc_count;
1329 1.1 christos for (rel = relocs; rel < relend; rel++)
1330 1.1 christos {
1331 1.1 christos unsigned long r_symndx;
1332 1.1 christos struct elf_link_hash_entry *h = NULL;
1333 1.1 christos
1334 1.1 christos r_symndx = ELF32_R_SYM (rel->r_info);
1335 1.1 christos if (r_symndx >= symtab_hdr->sh_info)
1336 1.1 christos {
1337 1.1 christos h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1338 1.1 christos while (h->root.type == bfd_link_hash_indirect
1339 1.1 christos || h->root.type == bfd_link_hash_warning)
1340 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
1341 1.1 christos }
1342 1.1 christos
1343 1.1 christos switch (ELF32_R_TYPE (rel->r_info))
1344 1.1 christos {
1345 1.1 christos case R_OR1K_GOT16:
1346 1.1 christos if (h != NULL)
1347 1.1 christos {
1348 1.1 christos if (h->got.refcount > 0)
1349 1.1 christos h->got.refcount--;
1350 1.1 christos }
1351 1.1 christos else
1352 1.1 christos {
1353 1.1 christos if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
1354 1.1 christos local_got_refcounts[r_symndx]--;
1355 1.1 christos }
1356 1.1 christos break;
1357 1.1 christos
1358 1.1 christos default:
1359 1.1 christos break;
1360 1.1 christos }
1361 1.1 christos }
1362 1.1 christos return TRUE;
1363 1.1 christos }
1364 1.1 christos
1365 1.1 christos /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
1366 1.1 christos shortcuts to them in our hash table. */
1367 1.1 christos
1368 1.1 christos static bfd_boolean
1369 1.1 christos create_got_section (bfd *dynobj, struct bfd_link_info *info)
1370 1.1 christos {
1371 1.1 christos struct elf_or1k_link_hash_table *htab;
1372 1.1 christos asection *s;
1373 1.1 christos
1374 1.1 christos /* This function may be called more than once. */
1375 1.1 christos s = bfd_get_section_by_name (dynobj, ".got");
1376 1.1 christos if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
1377 1.1 christos return TRUE;
1378 1.1 christos
1379 1.1 christos htab = or1k_elf_hash_table (info);
1380 1.1 christos if (htab == NULL)
1381 1.1 christos return FALSE;
1382 1.1 christos
1383 1.1 christos if (! _bfd_elf_create_got_section (dynobj, info))
1384 1.1 christos return FALSE;
1385 1.1 christos
1386 1.1 christos htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1387 1.1 christos htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1388 1.1 christos htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1389 1.1 christos
1390 1.1 christos if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
1391 1.1 christos abort ();
1392 1.1 christos
1393 1.1 christos if (! bfd_set_section_flags (dynobj, htab->srelgot, SEC_ALLOC
1394 1.1 christos | SEC_LOAD
1395 1.1 christos | SEC_HAS_CONTENTS
1396 1.1 christos | SEC_IN_MEMORY
1397 1.1 christos | SEC_LINKER_CREATED
1398 1.1 christos | SEC_READONLY)
1399 1.1 christos || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
1400 1.1 christos return FALSE;
1401 1.1 christos
1402 1.1 christos return TRUE;
1403 1.1 christos }
1404 1.1 christos
1405 1.1 christos /* Look through the relocs for a section during the first phase. */
1406 1.1 christos
1407 1.1 christos static bfd_boolean
1408 1.1 christos or1k_elf_check_relocs (bfd *abfd,
1409 1.1 christos struct bfd_link_info *info,
1410 1.1 christos asection *sec,
1411 1.1 christos const Elf_Internal_Rela *relocs)
1412 1.1 christos {
1413 1.1 christos Elf_Internal_Shdr *symtab_hdr;
1414 1.1 christos struct elf_link_hash_entry **sym_hashes;
1415 1.1 christos const Elf_Internal_Rela *rel;
1416 1.1 christos
1417 1.1 christos const Elf_Internal_Rela *rel_end;
1418 1.1 christos struct elf_or1k_link_hash_table *htab;
1419 1.1 christos bfd *dynobj;
1420 1.1 christos asection *sreloc = NULL;
1421 1.1 christos
1422 1.1 christos if (info->relocatable)
1423 1.1 christos return TRUE;
1424 1.1 christos
1425 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1426 1.1 christos sym_hashes = elf_sym_hashes (abfd);
1427 1.1 christos
1428 1.1 christos htab = or1k_elf_hash_table (info);
1429 1.1 christos if (htab == NULL)
1430 1.1 christos return FALSE;
1431 1.1 christos
1432 1.1 christos dynobj = htab->root.dynobj;
1433 1.1 christos
1434 1.1 christos rel_end = relocs + sec->reloc_count;
1435 1.1 christos for (rel = relocs; rel < rel_end; rel++)
1436 1.1 christos {
1437 1.1 christos struct elf_link_hash_entry *h;
1438 1.1 christos unsigned long r_symndx;
1439 1.1 christos unsigned char tls_type;
1440 1.1 christos
1441 1.1 christos r_symndx = ELF32_R_SYM (rel->r_info);
1442 1.1 christos if (r_symndx < symtab_hdr->sh_info)
1443 1.1 christos h = NULL;
1444 1.1 christos else
1445 1.1 christos {
1446 1.1 christos h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1447 1.1 christos while (h->root.type == bfd_link_hash_indirect
1448 1.1 christos || h->root.type == bfd_link_hash_warning)
1449 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
1450 1.1 christos
1451 1.1 christos /* PR15323, ref flags aren't set for references in the same
1452 1.1 christos object. */
1453 1.1 christos h->root.non_ir_ref = 1;
1454 1.1 christos }
1455 1.1 christos
1456 1.1 christos switch (ELF32_R_TYPE (rel->r_info))
1457 1.1 christos {
1458 1.1 christos case R_OR1K_TLS_GD_HI16:
1459 1.1 christos case R_OR1K_TLS_GD_LO16:
1460 1.1 christos tls_type = TLS_GD;
1461 1.1 christos break;
1462 1.1 christos case R_OR1K_TLS_LDM_HI16:
1463 1.1 christos case R_OR1K_TLS_LDM_LO16:
1464 1.1 christos case R_OR1K_TLS_LDO_HI16:
1465 1.1 christos case R_OR1K_TLS_LDO_LO16:
1466 1.1 christos tls_type = TLS_LD;
1467 1.1 christos break;
1468 1.1 christos case R_OR1K_TLS_IE_HI16:
1469 1.1 christos case R_OR1K_TLS_IE_LO16:
1470 1.1 christos tls_type = TLS_IE;
1471 1.1 christos break;
1472 1.1 christos case R_OR1K_TLS_LE_HI16:
1473 1.1 christos case R_OR1K_TLS_LE_LO16:
1474 1.1 christos tls_type = TLS_LE;
1475 1.1 christos break;
1476 1.1 christos default:
1477 1.1 christos tls_type = TLS_NONE;
1478 1.1 christos }
1479 1.1 christos
1480 1.1 christos /* Record TLS type. */
1481 1.1 christos if (h != NULL)
1482 1.1 christos ((struct elf_or1k_link_hash_entry *) h)->tls_type = tls_type;
1483 1.1 christos else
1484 1.1 christos {
1485 1.1 christos unsigned char *local_tls_type;
1486 1.1 christos
1487 1.1 christos /* This is a TLS type record for a local symbol. */
1488 1.1 christos local_tls_type = (unsigned char *) elf_or1k_local_tls_type (abfd);
1489 1.1 christos if (local_tls_type == NULL)
1490 1.1 christos {
1491 1.1 christos bfd_size_type size;
1492 1.1 christos
1493 1.1 christos size = symtab_hdr->sh_info;
1494 1.1 christos local_tls_type = bfd_zalloc (abfd, size);
1495 1.1 christos if (local_tls_type == NULL)
1496 1.1 christos return FALSE;
1497 1.1 christos elf_or1k_local_tls_type (abfd) = local_tls_type;
1498 1.1 christos }
1499 1.1 christos local_tls_type[r_symndx] = tls_type;
1500 1.1 christos }
1501 1.1 christos
1502 1.1 christos switch (ELF32_R_TYPE (rel->r_info))
1503 1.1 christos {
1504 1.1 christos /* This relocation describes the C++ object vtable hierarchy.
1505 1.1 christos Reconstruct it for later use during GC. */
1506 1.1 christos case R_OR1K_GNU_VTINHERIT:
1507 1.1 christos if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1508 1.1 christos return FALSE;
1509 1.1 christos break;
1510 1.1 christos
1511 1.1 christos /* This relocation describes which C++ vtable entries are actually
1512 1.1 christos used. Record for later use during GC. */
1513 1.1 christos case R_OR1K_GNU_VTENTRY:
1514 1.1 christos BFD_ASSERT (h != NULL);
1515 1.1 christos if (h != NULL
1516 1.1 christos && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1517 1.1 christos return FALSE;
1518 1.1 christos break;
1519 1.1 christos
1520 1.1 christos /* This relocation requires .plt entry. */
1521 1.1 christos case R_OR1K_PLT26:
1522 1.1 christos if (h != NULL)
1523 1.1 christos {
1524 1.1 christos h->needs_plt = 1;
1525 1.1 christos h->plt.refcount += 1;
1526 1.1 christos }
1527 1.1 christos break;
1528 1.1 christos
1529 1.1 christos case R_OR1K_GOT16:
1530 1.1 christos case R_OR1K_GOTOFF_HI16:
1531 1.1 christos case R_OR1K_GOTOFF_LO16:
1532 1.1 christos case R_OR1K_TLS_GD_HI16:
1533 1.1 christos case R_OR1K_TLS_GD_LO16:
1534 1.1 christos case R_OR1K_TLS_IE_HI16:
1535 1.1 christos case R_OR1K_TLS_IE_LO16:
1536 1.1 christos if (htab->sgot == NULL)
1537 1.1 christos {
1538 1.1 christos if (dynobj == NULL)
1539 1.1 christos htab->root.dynobj = dynobj = abfd;
1540 1.1 christos if (! create_got_section (dynobj, info))
1541 1.1 christos return FALSE;
1542 1.1 christos }
1543 1.1 christos
1544 1.1 christos if (ELF32_R_TYPE (rel->r_info) != R_OR1K_GOTOFF_HI16 &&
1545 1.1 christos ELF32_R_TYPE (rel->r_info) != R_OR1K_GOTOFF_LO16)
1546 1.1 christos {
1547 1.1 christos if (h != NULL)
1548 1.1 christos h->got.refcount += 1;
1549 1.1 christos else
1550 1.1 christos {
1551 1.1 christos bfd_signed_vma *local_got_refcounts;
1552 1.1 christos
1553 1.1 christos /* This is a global offset table entry for a local symbol. */
1554 1.1 christos local_got_refcounts = elf_local_got_refcounts (abfd);
1555 1.1 christos if (local_got_refcounts == NULL)
1556 1.1 christos {
1557 1.1 christos bfd_size_type size;
1558 1.1 christos
1559 1.1 christos size = symtab_hdr->sh_info;
1560 1.1 christos size *= sizeof (bfd_signed_vma);
1561 1.1 christos local_got_refcounts = bfd_zalloc (abfd, size);
1562 1.1 christos if (local_got_refcounts == NULL)
1563 1.1 christos return FALSE;
1564 1.1 christos elf_local_got_refcounts (abfd) = local_got_refcounts;
1565 1.1 christos }
1566 1.1 christos local_got_refcounts[r_symndx] += 1;
1567 1.1 christos }
1568 1.1 christos }
1569 1.1 christos break;
1570 1.1 christos
1571 1.1 christos case R_OR1K_INSN_REL_26:
1572 1.1 christos case R_OR1K_HI_16_IN_INSN:
1573 1.1 christos case R_OR1K_LO_16_IN_INSN:
1574 1.1 christos case R_OR1K_32:
1575 1.1 christos /* R_OR1K_16? */
1576 1.1 christos {
1577 1.1 christos if (h != NULL && !info->shared)
1578 1.1 christos {
1579 1.1 christos /* We may need a copy reloc. */
1580 1.1 christos h->non_got_ref = 1;
1581 1.1 christos
1582 1.1 christos /* We may also need a .plt entry. */
1583 1.1 christos h->plt.refcount += 1;
1584 1.1 christos if (ELF32_R_TYPE (rel->r_info) != R_OR1K_INSN_REL_26)
1585 1.1 christos h->pointer_equality_needed = 1;
1586 1.1 christos }
1587 1.1 christos
1588 1.1 christos /* If we are creating a shared library, and this is a reloc
1589 1.1 christos against a global symbol, or a non PC relative reloc
1590 1.1 christos against a local symbol, then we need to copy the reloc
1591 1.1 christos into the shared library. However, if we are linking with
1592 1.1 christos -Bsymbolic, we do not need to copy a reloc against a
1593 1.1 christos global symbol which is defined in an object we are
1594 1.1 christos including in the link (i.e., DEF_REGULAR is set). At
1595 1.1 christos this point we have not seen all the input files, so it is
1596 1.1 christos possible that DEF_REGULAR is not set now but will be set
1597 1.1 christos later (it is never cleared). In case of a weak definition,
1598 1.1 christos DEF_REGULAR may be cleared later by a strong definition in
1599 1.1 christos a shared library. We account for that possibility below by
1600 1.1 christos storing information in the relocs_copied field of the hash
1601 1.1 christos table entry. A similar situation occurs when creating
1602 1.1 christos shared libraries and symbol visibility changes render the
1603 1.1 christos symbol local.
1604 1.1 christos
1605 1.1 christos If on the other hand, we are creating an executable, we
1606 1.1 christos may need to keep relocations for symbols satisfied by a
1607 1.1 christos dynamic library if we manage to avoid copy relocs for the
1608 1.1 christos symbol. */
1609 1.1 christos
1610 1.1 christos if ((info->shared
1611 1.1 christos && (sec->flags & SEC_ALLOC) != 0
1612 1.1 christos && (ELF32_R_TYPE (rel->r_info) != R_OR1K_INSN_REL_26
1613 1.1 christos || (h != NULL
1614 1.1 christos && (!SYMBOLIC_BIND (info, h)
1615 1.1 christos || h->root.type == bfd_link_hash_defweak
1616 1.1 christos || !h->def_regular))))
1617 1.1 christos || (!info->shared
1618 1.1 christos && (sec->flags & SEC_ALLOC) != 0
1619 1.1 christos && h != NULL
1620 1.1 christos && (h->root.type == bfd_link_hash_defweak
1621 1.1 christos || !h->def_regular)))
1622 1.1 christos {
1623 1.1 christos struct elf_or1k_dyn_relocs *p;
1624 1.1 christos struct elf_or1k_dyn_relocs **head;
1625 1.1 christos
1626 1.1 christos /* When creating a shared object, we must copy these
1627 1.1 christos relocs into the output file. We create a reloc
1628 1.1 christos section in dynobj and make room for the reloc. */
1629 1.1 christos if (sreloc == NULL)
1630 1.1 christos {
1631 1.1 christos const char *name;
1632 1.1 christos unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
1633 1.1 christos unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;
1634 1.1 christos
1635 1.1 christos name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
1636 1.1 christos if (name == NULL)
1637 1.1 christos return FALSE;
1638 1.1 christos
1639 1.1 christos if (strncmp (name, ".rela", 5) != 0
1640 1.1 christos || strcmp (bfd_get_section_name (abfd, sec),
1641 1.1 christos name + 5) != 0)
1642 1.1 christos {
1643 1.1 christos (*_bfd_error_handler)
1644 1.1 christos (_("%B: bad relocation section name `%s\'"),
1645 1.1 christos abfd, name);
1646 1.1 christos }
1647 1.1 christos
1648 1.1 christos if (htab->root.dynobj == NULL)
1649 1.1 christos htab->root.dynobj = abfd;
1650 1.1 christos dynobj = htab->root.dynobj;
1651 1.1 christos
1652 1.1 christos sreloc = bfd_get_section_by_name (dynobj, name);
1653 1.1 christos if (sreloc == NULL)
1654 1.1 christos {
1655 1.1 christos sreloc = _bfd_elf_make_dynamic_reloc_section
1656 1.1 christos (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
1657 1.1 christos
1658 1.1 christos if (sreloc == NULL)
1659 1.1 christos return FALSE;
1660 1.1 christos }
1661 1.1 christos elf_section_data (sec)->sreloc = sreloc;
1662 1.1 christos }
1663 1.1 christos
1664 1.1 christos /* If this is a global symbol, we count the number of
1665 1.1 christos relocations we need for this symbol. */
1666 1.1 christos if (h != NULL)
1667 1.1 christos head = &((struct elf_or1k_link_hash_entry *) h)->dyn_relocs;
1668 1.1 christos else
1669 1.1 christos {
1670 1.1 christos /* Track dynamic relocs needed for local syms too.
1671 1.1 christos We really need local syms available to do this
1672 1.1 christos easily. Oh well. */
1673 1.1 christos
1674 1.1 christos asection *s;
1675 1.1 christos Elf_Internal_Sym *isym;
1676 1.1 christos void *vpp;
1677 1.1 christos
1678 1.1 christos isym = bfd_sym_from_r_symndx (&htab->sym_sec,
1679 1.1 christos abfd, r_symndx);
1680 1.1 christos if (isym == NULL)
1681 1.1 christos return FALSE;
1682 1.1 christos
1683 1.1 christos s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1684 1.1 christos if (s == NULL)
1685 1.1 christos return FALSE;
1686 1.1 christos
1687 1.1 christos vpp = &elf_section_data (s)->local_dynrel;
1688 1.1 christos head = (struct elf_or1k_dyn_relocs **) vpp;
1689 1.1 christos }
1690 1.1 christos
1691 1.1 christos p = *head;
1692 1.1 christos if (p == NULL || p->sec != sec)
1693 1.1 christos {
1694 1.1 christos bfd_size_type amt = sizeof *p;
1695 1.1 christos p = ((struct elf_or1k_dyn_relocs *)
1696 1.1 christos bfd_alloc (htab->root.dynobj, amt));
1697 1.1 christos if (p == NULL)
1698 1.1 christos return FALSE;
1699 1.1 christos p->next = *head;
1700 1.1 christos *head = p;
1701 1.1 christos p->sec = sec;
1702 1.1 christos p->count = 0;
1703 1.1 christos p->pc_count = 0;
1704 1.1 christos }
1705 1.1 christos
1706 1.1 christos p->count += 1;
1707 1.1 christos if (ELF32_R_TYPE (rel->r_info) == R_OR1K_INSN_REL_26)
1708 1.1 christos p->pc_count += 1;
1709 1.1 christos }
1710 1.1 christos }
1711 1.1 christos break;
1712 1.1 christos }
1713 1.1 christos }
1714 1.1 christos
1715 1.1 christos return TRUE;
1716 1.1 christos }
1717 1.1 christos
1718 1.1 christos /* Finish up the dynamic sections. */
1719 1.1 christos
1720 1.1 christos static bfd_boolean
1721 1.1 christos or1k_elf_finish_dynamic_sections (bfd *output_bfd,
1722 1.1 christos struct bfd_link_info *info)
1723 1.1 christos {
1724 1.1 christos bfd *dynobj;
1725 1.1 christos asection *sdyn, *sgot;
1726 1.1 christos struct elf_or1k_link_hash_table *htab;
1727 1.1 christos
1728 1.1 christos htab = or1k_elf_hash_table (info);
1729 1.1 christos if (htab == NULL)
1730 1.1 christos return FALSE;
1731 1.1 christos
1732 1.1 christos dynobj = htab->root.dynobj;
1733 1.1 christos
1734 1.1 christos sgot = htab->sgotplt;
1735 1.1 christos sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1736 1.1 christos
1737 1.1 christos if (htab->root.dynamic_sections_created)
1738 1.1 christos {
1739 1.1 christos asection *splt;
1740 1.1 christos Elf32_External_Dyn *dyncon, *dynconend;
1741 1.1 christos
1742 1.1 christos BFD_ASSERT (sgot != NULL && sdyn != NULL);
1743 1.1 christos
1744 1.1 christos dyncon = (Elf32_External_Dyn *) sdyn->contents;
1745 1.1 christos dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
1746 1.1 christos
1747 1.1 christos for (; dyncon < dynconend; dyncon++)
1748 1.1 christos {
1749 1.1 christos Elf_Internal_Dyn dyn;
1750 1.1 christos asection *s;
1751 1.1 christos
1752 1.1 christos bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1753 1.1 christos
1754 1.1 christos switch (dyn.d_tag)
1755 1.1 christos {
1756 1.1 christos default:
1757 1.1 christos continue;
1758 1.1 christos
1759 1.1 christos case DT_PLTGOT:
1760 1.1 christos s = htab->sgot->output_section;
1761 1.1 christos BFD_ASSERT (s != NULL);
1762 1.1 christos dyn.d_un.d_ptr = s->vma;
1763 1.1 christos break;
1764 1.1 christos
1765 1.1 christos case DT_JMPREL:
1766 1.1 christos s = htab->srelplt->output_section;
1767 1.1 christos BFD_ASSERT (s != NULL);
1768 1.1 christos dyn.d_un.d_ptr = s->vma;
1769 1.1 christos break;
1770 1.1 christos
1771 1.1 christos case DT_PLTRELSZ:
1772 1.1 christos s = htab->srelplt->output_section;
1773 1.1 christos BFD_ASSERT (s != NULL);
1774 1.1 christos dyn.d_un.d_val = s->size;
1775 1.1 christos break;
1776 1.1 christos
1777 1.1 christos case DT_RELASZ:
1778 1.1 christos /* My reading of the SVR4 ABI indicates that the
1779 1.1 christos procedure linkage table relocs (DT_JMPREL) should be
1780 1.1 christos included in the overall relocs (DT_RELA). This is
1781 1.1 christos what Solaris does. However, UnixWare can not handle
1782 1.1 christos that case. Therefore, we override the DT_RELASZ entry
1783 1.1 christos here to make it not include the JMPREL relocs. Since
1784 1.1 christos the linker script arranges for .rela.plt to follow all
1785 1.1 christos other relocation sections, we don't have to worry
1786 1.1 christos about changing the DT_RELA entry. */
1787 1.1 christos if (htab->srelplt != NULL)
1788 1.1 christos {
1789 1.1 christos /* FIXME: this calculation sometimes produces
1790 1.1 christos wrong result, the problem is that the dyn.d_un.d_val
1791 1.1 christos is not always correct, needs investigation why
1792 1.1 christos that happens. In the meantime, reading the
1793 1.1 christos ".rela.dyn" section by name seems to yield
1794 1.1 christos correct result.
1795 1.1 christos
1796 1.1 christos s = htab->srelplt->output_section;
1797 1.1 christos dyn.d_un.d_val -= s->size;
1798 1.1 christos */
1799 1.1 christos
1800 1.1 christos s = bfd_get_section_by_name (output_bfd, ".rela.dyn");
1801 1.1 christos dyn.d_un.d_val = s ? s->size : 0;
1802 1.1 christos }
1803 1.1 christos break;
1804 1.1 christos }
1805 1.1 christos bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1806 1.1 christos }
1807 1.1 christos
1808 1.1 christos
1809 1.1 christos /* Fill in the first entry in the procedure linkage table. */
1810 1.1 christos splt = htab->splt;
1811 1.1 christos if (splt && splt->size > 0)
1812 1.1 christos {
1813 1.1 christos if (info->shared)
1814 1.1 christos {
1815 1.1 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD0,
1816 1.1 christos splt->contents);
1817 1.1 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD1,
1818 1.1 christos splt->contents + 4);
1819 1.1 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD2,
1820 1.1 christos splt->contents + 8);
1821 1.1 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD3,
1822 1.1 christos splt->contents + 12);
1823 1.1 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD4,
1824 1.1 christos splt->contents + 16);
1825 1.1 christos }
1826 1.1 christos else
1827 1.1 christos {
1828 1.1 christos unsigned long addr;
1829 1.1 christos /* addr = .got + 4 */
1830 1.1 christos addr = sgot->output_section->vma + sgot->output_offset + 4;
1831 1.1 christos bfd_put_32 (output_bfd,
1832 1.1 christos PLT0_ENTRY_WORD0 | ((addr >> 16) & 0xffff),
1833 1.1 christos splt->contents);
1834 1.1 christos bfd_put_32 (output_bfd,
1835 1.1 christos PLT0_ENTRY_WORD1 | (addr & 0xffff),
1836 1.1 christos splt->contents + 4);
1837 1.1 christos bfd_put_32 (output_bfd, PLT0_ENTRY_WORD2, splt->contents + 8);
1838 1.1 christos bfd_put_32 (output_bfd, PLT0_ENTRY_WORD3, splt->contents + 12);
1839 1.1 christos bfd_put_32 (output_bfd, PLT0_ENTRY_WORD4, splt->contents + 16);
1840 1.1 christos }
1841 1.1 christos
1842 1.1 christos elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
1843 1.1 christos }
1844 1.1 christos }
1845 1.1 christos
1846 1.1 christos /* Set the first entry in the global offset table to the address of
1847 1.1 christos the dynamic section. */
1848 1.1 christos if (sgot && sgot->size > 0)
1849 1.1 christos {
1850 1.1 christos if (sdyn == NULL)
1851 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1852 1.1 christos else
1853 1.1 christos bfd_put_32 (output_bfd,
1854 1.1 christos sdyn->output_section->vma + sdyn->output_offset,
1855 1.1 christos sgot->contents);
1856 1.1 christos elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1857 1.1 christos }
1858 1.1 christos
1859 1.1 christos if (htab->sgot && htab->sgot->size > 0)
1860 1.1 christos elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
1861 1.1 christos
1862 1.1 christos return TRUE;
1863 1.1 christos }
1864 1.1 christos
1865 1.1 christos /* Finish up dynamic symbol handling. We set the contents of various
1866 1.1 christos dynamic sections here. */
1867 1.1 christos
1868 1.1 christos static bfd_boolean
1869 1.1 christos or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
1870 1.1 christos struct bfd_link_info *info,
1871 1.1 christos struct elf_link_hash_entry *h,
1872 1.1 christos Elf_Internal_Sym *sym)
1873 1.1 christos {
1874 1.1 christos struct elf_or1k_link_hash_table *htab;
1875 1.1 christos bfd_byte *loc;
1876 1.1 christos
1877 1.1 christos htab = or1k_elf_hash_table (info);
1878 1.1 christos if (htab == NULL)
1879 1.1 christos return FALSE;
1880 1.1 christos
1881 1.1 christos if (h->plt.offset != (bfd_vma) -1)
1882 1.1 christos {
1883 1.1 christos asection *splt;
1884 1.1 christos asection *sgot;
1885 1.1 christos asection *srela;
1886 1.1 christos
1887 1.1 christos bfd_vma plt_index;
1888 1.1 christos bfd_vma got_offset;
1889 1.1 christos bfd_vma got_addr;
1890 1.1 christos Elf_Internal_Rela rela;
1891 1.1 christos
1892 1.1 christos /* This symbol has an entry in the procedure linkage table. Set
1893 1.1 christos it up. */
1894 1.1 christos BFD_ASSERT (h->dynindx != -1);
1895 1.1 christos
1896 1.1 christos splt = htab->splt;
1897 1.1 christos sgot = htab->sgotplt;
1898 1.1 christos srela = htab->srelplt;
1899 1.1 christos BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1900 1.1 christos
1901 1.1 christos /* Get the index in the procedure linkage table which
1902 1.1 christos corresponds to this symbol. This is the index of this symbol
1903 1.1 christos in all the symbols for which we are making plt entries. The
1904 1.1 christos first entry in the procedure linkage table is reserved. */
1905 1.1 christos plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1906 1.1 christos
1907 1.1 christos /* Get the offset into the .got table of the entry that
1908 1.1 christos corresponds to this function. Each .got entry is 4 bytes.
1909 1.1 christos The first three are reserved. */
1910 1.1 christos got_offset = (plt_index + 3) * 4;
1911 1.1 christos got_addr = got_offset;
1912 1.1 christos
1913 1.1 christos /* Fill in the entry in the procedure linkage table. */
1914 1.1 christos if (! info->shared)
1915 1.1 christos {
1916 1.1 christos got_addr += htab->sgotplt->output_section->vma
1917 1.1 christos + htab->sgotplt->output_offset;
1918 1.1 christos bfd_put_32 (output_bfd, PLT_ENTRY_WORD0 | ((got_addr >> 16) & 0xffff),
1919 1.1 christos splt->contents + h->plt.offset);
1920 1.1 christos bfd_put_32 (output_bfd, PLT_ENTRY_WORD1 | (got_addr & 0xffff),
1921 1.1 christos splt->contents + h->plt.offset + 4);
1922 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
1923 1.1 christos splt->contents + h->plt.offset + 8);
1924 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD3,
1925 1.1 christos splt->contents + h->plt.offset + 12);
1926 1.1 christos bfd_put_32 (output_bfd, PLT_ENTRY_WORD4
1927 1.1 christos | plt_index * sizeof (Elf32_External_Rela),
1928 1.1 christos splt->contents + h->plt.offset + 16);
1929 1.1 christos }
1930 1.1 christos else
1931 1.1 christos {
1932 1.1 christos bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD0 | (got_addr & 0xffff),
1933 1.1 christos splt->contents + h->plt.offset);
1934 1.1 christos bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD1
1935 1.1 christos | plt_index * sizeof (Elf32_External_Rela),
1936 1.1 christos splt->contents + h->plt.offset + 4);
1937 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD2,
1938 1.1 christos splt->contents + h->plt.offset + 8);
1939 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD3,
1940 1.1 christos splt->contents + h->plt.offset + 12);
1941 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD4,
1942 1.1 christos splt->contents + h->plt.offset + 16);
1943 1.1 christos }
1944 1.1 christos
1945 1.1 christos /* Fill in the entry in the global offset table. */
1946 1.1 christos bfd_put_32 (output_bfd,
1947 1.1 christos (splt->output_section->vma
1948 1.1 christos + splt->output_offset), /* Same offset. */
1949 1.1 christos sgot->contents + got_offset);
1950 1.1 christos
1951 1.1 christos /* Fill in the entry in the .rela.plt section. */
1952 1.1 christos rela.r_offset = (sgot->output_section->vma
1953 1.1 christos + sgot->output_offset
1954 1.1 christos + got_offset);
1955 1.1 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
1956 1.1 christos rela.r_addend = 0;
1957 1.1 christos loc = srela->contents;
1958 1.1 christos loc += plt_index * sizeof (Elf32_External_Rela);
1959 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1960 1.1 christos
1961 1.1 christos if (!h->def_regular)
1962 1.1 christos {
1963 1.1 christos /* Mark the symbol as undefined, rather than as defined in
1964 1.1 christos the .plt section. Leave the value alone. */
1965 1.1 christos sym->st_shndx = SHN_UNDEF;
1966 1.1 christos }
1967 1.1 christos
1968 1.1 christos }
1969 1.1 christos
1970 1.1 christos if (h->got.offset != (bfd_vma) -1
1971 1.1 christos && (h->got.offset & 2) == 0) /* Homemade TLS check. */
1972 1.1 christos {
1973 1.1 christos asection *sgot;
1974 1.1 christos asection *srela;
1975 1.1 christos Elf_Internal_Rela rela;
1976 1.1 christos
1977 1.1 christos /* This symbol has an entry in the global offset table. Set it
1978 1.1 christos up. */
1979 1.1 christos sgot = htab->sgot;
1980 1.1 christos srela = htab->srelgot;
1981 1.1 christos BFD_ASSERT (sgot != NULL && srela != NULL);
1982 1.1 christos
1983 1.1 christos rela.r_offset = (sgot->output_section->vma
1984 1.1 christos + sgot->output_offset
1985 1.1 christos + (h->got.offset &~ 1));
1986 1.1 christos
1987 1.1 christos /* If this is a -Bsymbolic link, and the symbol is defined
1988 1.1 christos locally, we just want to emit a RELATIVE reloc. Likewise if
1989 1.1 christos the symbol was forced to be local because of a version file.
1990 1.1 christos The entry in the global offset table will already have been
1991 1.1 christos initialized in the relocate_section function. */
1992 1.1 christos if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
1993 1.1 christos {
1994 1.1 christos rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1995 1.1 christos rela.r_addend = (h->root.u.def.value
1996 1.1 christos + h->root.u.def.section->output_section->vma
1997 1.1 christos + h->root.u.def.section->output_offset);
1998 1.1 christos }
1999 1.1 christos else
2000 1.1 christos {
2001 1.1 christos BFD_ASSERT ((h->got.offset & 1) == 0);
2002 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
2003 1.1 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
2004 1.1 christos rela.r_addend = 0;
2005 1.1 christos }
2006 1.1 christos
2007 1.1 christos loc = srela->contents;
2008 1.1 christos loc += srela->reloc_count * sizeof (Elf32_External_Rela);
2009 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2010 1.1 christos ++srela->reloc_count;
2011 1.1 christos }
2012 1.1 christos
2013 1.1 christos if (h->needs_copy)
2014 1.1 christos {
2015 1.1 christos asection *s;
2016 1.1 christos Elf_Internal_Rela rela;
2017 1.1 christos
2018 1.1 christos /* This symbols needs a copy reloc. Set it up. */
2019 1.1 christos BFD_ASSERT (h->dynindx != -1
2020 1.1 christos && (h->root.type == bfd_link_hash_defined
2021 1.1 christos || h->root.type == bfd_link_hash_defweak));
2022 1.1 christos
2023 1.1 christos s = bfd_get_section_by_name (h->root.u.def.section->owner,
2024 1.1 christos ".rela.bss");
2025 1.1 christos BFD_ASSERT (s != NULL);
2026 1.1 christos
2027 1.1 christos rela.r_offset = (h->root.u.def.value
2028 1.1 christos + h->root.u.def.section->output_section->vma
2029 1.1 christos + h->root.u.def.section->output_offset);
2030 1.1 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
2031 1.1 christos rela.r_addend = 0;
2032 1.1 christos loc = s->contents;
2033 1.1 christos loc += s->reloc_count * sizeof (Elf32_External_Rela);
2034 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2035 1.1 christos ++s->reloc_count;
2036 1.1 christos }
2037 1.1 christos
2038 1.1 christos /* Mark some specially defined symbols as absolute. */
2039 1.1 christos if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2040 1.1 christos || h == htab->root.hgot)
2041 1.1 christos sym->st_shndx = SHN_ABS;
2042 1.1 christos
2043 1.1 christos return TRUE;
2044 1.1 christos }
2045 1.1 christos
2046 1.1 christos static enum elf_reloc_type_class
2047 1.1 christos or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2048 1.1 christos const asection *rel_sec ATTRIBUTE_UNUSED,
2049 1.1 christos const Elf_Internal_Rela *rela)
2050 1.1 christos {
2051 1.1 christos switch ((int) ELF32_R_TYPE (rela->r_info))
2052 1.1 christos {
2053 1.1 christos case R_OR1K_RELATIVE: return reloc_class_relative;
2054 1.1 christos case R_OR1K_JMP_SLOT: return reloc_class_plt;
2055 1.1 christos case R_OR1K_COPY: return reloc_class_copy;
2056 1.1 christos default: return reloc_class_normal;
2057 1.1 christos }
2058 1.1 christos }
2059 1.1 christos
2060 1.1 christos /* Adjust a symbol defined by a dynamic object and referenced by a
2061 1.1 christos regular object. The current definition is in some section of the
2062 1.1 christos dynamic object, but we're not including those sections. We have to
2063 1.1 christos change the definition to something the rest of the link can
2064 1.1 christos understand. */
2065 1.1 christos
2066 1.1 christos static bfd_boolean
2067 1.1 christos or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2068 1.1 christos struct elf_link_hash_entry *h)
2069 1.1 christos {
2070 1.1 christos struct elf_or1k_link_hash_table *htab;
2071 1.1 christos struct elf_or1k_link_hash_entry *eh;
2072 1.1 christos struct elf_or1k_dyn_relocs *p;
2073 1.1 christos bfd *dynobj;
2074 1.1 christos asection *s;
2075 1.1 christos
2076 1.1 christos dynobj = elf_hash_table (info)->dynobj;
2077 1.1 christos
2078 1.1 christos /* Make sure we know what is going on here. */
2079 1.1 christos BFD_ASSERT (dynobj != NULL
2080 1.1 christos && (h->needs_plt
2081 1.1 christos || h->u.weakdef != NULL
2082 1.1 christos || (h->def_dynamic
2083 1.1 christos && h->ref_regular
2084 1.1 christos && !h->def_regular)));
2085 1.1 christos
2086 1.1 christos /* If this is a function, put it in the procedure linkage table. We
2087 1.1 christos will fill in the contents of the procedure linkage table later,
2088 1.1 christos when we know the address of the .got section. */
2089 1.1 christos if (h->type == STT_FUNC
2090 1.1 christos || h->needs_plt)
2091 1.1 christos {
2092 1.1 christos if (! info->shared
2093 1.1 christos && !h->def_dynamic
2094 1.1 christos && !h->ref_dynamic
2095 1.1 christos && h->root.type != bfd_link_hash_undefweak
2096 1.1 christos && h->root.type != bfd_link_hash_undefined)
2097 1.1 christos {
2098 1.1 christos /* This case can occur if we saw a PLT reloc in an input
2099 1.1 christos file, but the symbol was never referred to by a dynamic
2100 1.1 christos object. In such a case, we don't actually need to build
2101 1.1 christos a procedure linkage table, and we can just do a PCREL
2102 1.1 christos reloc instead. */
2103 1.1 christos h->plt.offset = (bfd_vma) -1;
2104 1.1 christos h->needs_plt = 0;
2105 1.1 christos }
2106 1.1 christos
2107 1.1 christos return TRUE;
2108 1.1 christos }
2109 1.1 christos else
2110 1.1 christos h->plt.offset = (bfd_vma) -1;
2111 1.1 christos
2112 1.1 christos /* If this is a weak symbol, and there is a real definition, the
2113 1.1 christos processor independent code will have arranged for us to see the
2114 1.1 christos real definition first, and we can just use the same value. */
2115 1.1 christos if (h->u.weakdef != NULL)
2116 1.1 christos {
2117 1.1 christos BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2118 1.1 christos || h->u.weakdef->root.type == bfd_link_hash_defweak);
2119 1.1 christos h->root.u.def.section = h->u.weakdef->root.u.def.section;
2120 1.1 christos h->root.u.def.value = h->u.weakdef->root.u.def.value;
2121 1.1 christos return TRUE;
2122 1.1 christos }
2123 1.1 christos
2124 1.1 christos /* This is a reference to a symbol defined by a dynamic object which
2125 1.1 christos is not a function. */
2126 1.1 christos
2127 1.1 christos /* If we are creating a shared library, we must presume that the
2128 1.1 christos only references to the symbol are via the global offset table.
2129 1.1 christos For such cases we need not do anything here; the relocations will
2130 1.1 christos be handled correctly by relocate_section. */
2131 1.1 christos if (info->shared)
2132 1.1 christos return TRUE;
2133 1.1 christos
2134 1.1 christos /* If there are no references to this symbol that do not use the
2135 1.1 christos GOT, we don't need to generate a copy reloc. */
2136 1.1 christos if (!h->non_got_ref)
2137 1.1 christos return TRUE;
2138 1.1 christos
2139 1.1 christos /* If -z nocopyreloc was given, we won't generate them either. */
2140 1.1 christos if (info->nocopyreloc)
2141 1.1 christos {
2142 1.1 christos h->non_got_ref = 0;
2143 1.1 christos return TRUE;
2144 1.1 christos }
2145 1.1 christos
2146 1.1 christos eh = (struct elf_or1k_link_hash_entry *) h;
2147 1.1 christos for (p = eh->dyn_relocs; p != NULL; p = p->next)
2148 1.1 christos {
2149 1.1 christos s = p->sec->output_section;
2150 1.1 christos if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
2151 1.1 christos break;
2152 1.1 christos }
2153 1.1 christos
2154 1.1 christos /* If we didn't find any dynamic relocs in sections which needs the
2155 1.1 christos copy reloc, then we'll be keeping the dynamic relocs and avoiding
2156 1.1 christos the copy reloc. */
2157 1.1 christos if (p == NULL)
2158 1.1 christos {
2159 1.1 christos h->non_got_ref = 0;
2160 1.1 christos return TRUE;
2161 1.1 christos }
2162 1.1 christos
2163 1.1 christos /* We must allocate the symbol in our .dynbss section, which will
2164 1.1 christos become part of the .bss section of the executable. There will be
2165 1.1 christos an entry for this symbol in the .dynsym section. The dynamic
2166 1.1 christos object will contain position independent code, so all references
2167 1.1 christos from the dynamic object to this symbol will go through the global
2168 1.1 christos offset table. The dynamic linker will use the .dynsym entry to
2169 1.1 christos determine the address it must put in the global offset table, so
2170 1.1 christos both the dynamic object and the regular object will refer to the
2171 1.1 christos same memory location for the variable. */
2172 1.1 christos
2173 1.1 christos htab = or1k_elf_hash_table (info);
2174 1.1 christos if (htab == NULL)
2175 1.1 christos return FALSE;
2176 1.1 christos
2177 1.1 christos s = htab->sdynbss;
2178 1.1 christos BFD_ASSERT (s != NULL);
2179 1.1 christos
2180 1.1 christos /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
2181 1.1 christos to copy the initial value out of the dynamic object and into the
2182 1.1 christos runtime process image. We need to remember the offset into the
2183 1.1 christos .rela.bss section we are going to use. */
2184 1.1 christos if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2185 1.1 christos {
2186 1.1 christos asection *srel;
2187 1.1 christos
2188 1.1 christos srel = htab->srelbss;
2189 1.1 christos BFD_ASSERT (srel != NULL);
2190 1.1 christos srel->size += sizeof (Elf32_External_Rela);
2191 1.1 christos h->needs_copy = 1;
2192 1.1 christos }
2193 1.1 christos
2194 1.1 christos return _bfd_elf_adjust_dynamic_copy (info, h, s);
2195 1.1 christos }
2196 1.1 christos
2197 1.1 christos /* Allocate space in .plt, .got and associated reloc sections for
2198 1.1 christos dynamic relocs. */
2199 1.1 christos
2200 1.1 christos static bfd_boolean
2201 1.1 christos allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2202 1.1 christos {
2203 1.1 christos struct bfd_link_info *info;
2204 1.1 christos struct elf_or1k_link_hash_table *htab;
2205 1.1 christos struct elf_or1k_link_hash_entry *eh;
2206 1.1 christos struct elf_or1k_dyn_relocs *p;
2207 1.1 christos
2208 1.1 christos if (h->root.type == bfd_link_hash_indirect)
2209 1.1 christos return TRUE;
2210 1.1 christos
2211 1.1 christos info = (struct bfd_link_info *) inf;
2212 1.1 christos htab = or1k_elf_hash_table (info);
2213 1.1 christos if (htab == NULL)
2214 1.1 christos return FALSE;
2215 1.1 christos
2216 1.1 christos eh = (struct elf_or1k_link_hash_entry *) h;
2217 1.1 christos
2218 1.1 christos if (htab->root.dynamic_sections_created
2219 1.1 christos && h->plt.refcount > 0)
2220 1.1 christos {
2221 1.1 christos /* Make sure this symbol is output as a dynamic symbol.
2222 1.1 christos Undefined weak syms won't yet be marked as dynamic. */
2223 1.1 christos if (h->dynindx == -1
2224 1.1 christos && !h->forced_local)
2225 1.1 christos {
2226 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h))
2227 1.1 christos return FALSE;
2228 1.1 christos }
2229 1.1 christos
2230 1.1 christos if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
2231 1.1 christos {
2232 1.1 christos asection *s = htab->splt;
2233 1.1 christos
2234 1.1 christos /* If this is the first .plt entry, make room for the special
2235 1.1 christos first entry. */
2236 1.1 christos if (s->size == 0)
2237 1.1 christos s->size = PLT_ENTRY_SIZE;
2238 1.1 christos
2239 1.1 christos h->plt.offset = s->size;
2240 1.1 christos
2241 1.1 christos /* If this symbol is not defined in a regular file, and we are
2242 1.1 christos not generating a shared library, then set the symbol to this
2243 1.1 christos location in the .plt. This is required to make function
2244 1.1 christos pointers compare as equal between the normal executable and
2245 1.1 christos the shared library. */
2246 1.1 christos if (! info->shared
2247 1.1 christos && !h->def_regular)
2248 1.1 christos {
2249 1.1 christos h->root.u.def.section = s;
2250 1.1 christos h->root.u.def.value = h->plt.offset;
2251 1.1 christos }
2252 1.1 christos
2253 1.1 christos /* Make room for this entry. */
2254 1.1 christos s->size += PLT_ENTRY_SIZE;
2255 1.1 christos
2256 1.1 christos /* We also need to make an entry in the .got.plt section, which
2257 1.1 christos will be placed in the .got section by the linker script. */
2258 1.1 christos htab->sgotplt->size += 4;
2259 1.1 christos
2260 1.1 christos /* We also need to make an entry in the .rel.plt section. */
2261 1.1 christos htab->srelplt->size += sizeof (Elf32_External_Rela);
2262 1.1 christos }
2263 1.1 christos else
2264 1.1 christos {
2265 1.1 christos h->plt.offset = (bfd_vma) -1;
2266 1.1 christos h->needs_plt = 0;
2267 1.1 christos }
2268 1.1 christos }
2269 1.1 christos else
2270 1.1 christos {
2271 1.1 christos h->plt.offset = (bfd_vma) -1;
2272 1.1 christos h->needs_plt = 0;
2273 1.1 christos }
2274 1.1 christos
2275 1.1 christos if (h->got.refcount > 0)
2276 1.1 christos {
2277 1.1 christos asection *s;
2278 1.1 christos bfd_boolean dyn;
2279 1.1 christos unsigned char tls_type;
2280 1.1 christos
2281 1.1 christos /* Make sure this symbol is output as a dynamic symbol.
2282 1.1 christos Undefined weak syms won't yet be marked as dynamic. */
2283 1.1 christos if (h->dynindx == -1
2284 1.1 christos && !h->forced_local)
2285 1.1 christos {
2286 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h))
2287 1.1 christos return FALSE;
2288 1.1 christos }
2289 1.1 christos
2290 1.1 christos s = htab->sgot;
2291 1.1 christos
2292 1.1 christos h->got.offset = s->size;
2293 1.1 christos
2294 1.1 christos tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
2295 1.1 christos
2296 1.1 christos /* TLS GD requires two GOT and two relocs. */
2297 1.1 christos if (tls_type == TLS_GD)
2298 1.1 christos s->size += 8;
2299 1.1 christos else
2300 1.1 christos s->size += 4;
2301 1.1 christos dyn = htab->root.dynamic_sections_created;
2302 1.1 christos if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
2303 1.1 christos {
2304 1.1 christos if (tls_type == TLS_GD)
2305 1.1 christos htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2306 1.1 christos else
2307 1.1 christos htab->srelgot->size += sizeof (Elf32_External_Rela);
2308 1.1 christos }
2309 1.1 christos }
2310 1.1 christos else
2311 1.1 christos h->got.offset = (bfd_vma) -1;
2312 1.1 christos
2313 1.1 christos if (eh->dyn_relocs == NULL)
2314 1.1 christos return TRUE;
2315 1.1 christos
2316 1.1 christos /* In the shared -Bsymbolic case, discard space allocated for
2317 1.1 christos dynamic pc-relative relocs against symbols which turn out to be
2318 1.1 christos defined in regular objects. For the normal shared case, discard
2319 1.1 christos space for pc-relative relocs that have become local due to symbol
2320 1.1 christos visibility changes. */
2321 1.1 christos
2322 1.1 christos if (info->shared)
2323 1.1 christos {
2324 1.1 christos if (SYMBOL_CALLS_LOCAL (info, h))
2325 1.1 christos {
2326 1.1 christos struct elf_or1k_dyn_relocs **pp;
2327 1.1 christos
2328 1.1 christos for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
2329 1.1 christos {
2330 1.1 christos p->count -= p->pc_count;
2331 1.1 christos p->pc_count = 0;
2332 1.1 christos if (p->count == 0)
2333 1.1 christos *pp = p->next;
2334 1.1 christos else
2335 1.1 christos pp = &p->next;
2336 1.1 christos }
2337 1.1 christos }
2338 1.1 christos
2339 1.1 christos /* Also discard relocs on undefined weak syms with non-default
2340 1.1 christos visibility. */
2341 1.1 christos if (eh->dyn_relocs != NULL
2342 1.1 christos && h->root.type == bfd_link_hash_undefweak)
2343 1.1 christos {
2344 1.1 christos if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2345 1.1 christos eh->dyn_relocs = NULL;
2346 1.1 christos
2347 1.1 christos /* Make sure undefined weak symbols are output as a dynamic
2348 1.1 christos symbol in PIEs. */
2349 1.1 christos else if (h->dynindx == -1
2350 1.1 christos && !h->forced_local)
2351 1.1 christos {
2352 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h))
2353 1.1 christos return FALSE;
2354 1.1 christos }
2355 1.1 christos }
2356 1.1 christos }
2357 1.1 christos else
2358 1.1 christos {
2359 1.1 christos /* For the non-shared case, discard space for relocs against
2360 1.1 christos symbols which turn out to need copy relocs or are not
2361 1.1 christos dynamic. */
2362 1.1 christos
2363 1.1 christos if (!h->non_got_ref
2364 1.1 christos && ((h->def_dynamic
2365 1.1 christos && !h->def_regular)
2366 1.1 christos || (htab->root.dynamic_sections_created
2367 1.1 christos && (h->root.type == bfd_link_hash_undefweak
2368 1.1 christos || h->root.type == bfd_link_hash_undefined))))
2369 1.1 christos {
2370 1.1 christos /* Make sure this symbol is output as a dynamic symbol.
2371 1.1 christos Undefined weak syms won't yet be marked as dynamic. */
2372 1.1 christos if (h->dynindx == -1
2373 1.1 christos && !h->forced_local)
2374 1.1 christos {
2375 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h))
2376 1.1 christos return FALSE;
2377 1.1 christos }
2378 1.1 christos
2379 1.1 christos /* If that succeeded, we know we'll be keeping all the
2380 1.1 christos relocs. */
2381 1.1 christos if (h->dynindx != -1)
2382 1.1 christos goto keep;
2383 1.1 christos }
2384 1.1 christos
2385 1.1 christos eh->dyn_relocs = NULL;
2386 1.1 christos
2387 1.1 christos keep: ;
2388 1.1 christos }
2389 1.1 christos
2390 1.1 christos /* Finally, allocate space. */
2391 1.1 christos for (p = eh->dyn_relocs; p != NULL; p = p->next)
2392 1.1 christos {
2393 1.1 christos asection *sreloc = elf_section_data (p->sec)->sreloc;
2394 1.1 christos sreloc->size += p->count * sizeof (Elf32_External_Rela);
2395 1.1 christos }
2396 1.1 christos
2397 1.1 christos return TRUE;
2398 1.1 christos }
2399 1.1 christos
2400 1.1 christos /* Find any dynamic relocs that apply to read-only sections. */
2401 1.1 christos
2402 1.1 christos static bfd_boolean
2403 1.1 christos readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2404 1.1 christos {
2405 1.1 christos struct elf_or1k_link_hash_entry *eh;
2406 1.1 christos struct elf_or1k_dyn_relocs *p;
2407 1.1 christos
2408 1.1 christos eh = (struct elf_or1k_link_hash_entry *) h;
2409 1.1 christos for (p = eh->dyn_relocs; p != NULL; p = p->next)
2410 1.1 christos {
2411 1.1 christos asection *s = p->sec->output_section;
2412 1.1 christos
2413 1.1 christos if (s != NULL && (s->flags & SEC_READONLY) != 0)
2414 1.1 christos {
2415 1.1 christos struct bfd_link_info *info = (struct bfd_link_info *) inf;
2416 1.1 christos
2417 1.1 christos info->flags |= DF_TEXTREL;
2418 1.1 christos
2419 1.1 christos /* Not an error, just cut short the traversal. */
2420 1.1 christos return FALSE;
2421 1.1 christos }
2422 1.1 christos }
2423 1.1 christos return TRUE;
2424 1.1 christos }
2425 1.1 christos
2426 1.1 christos /* Set the sizes of the dynamic sections. */
2427 1.1 christos
2428 1.1 christos static bfd_boolean
2429 1.1 christos or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2430 1.1 christos struct bfd_link_info *info)
2431 1.1 christos {
2432 1.1 christos struct elf_or1k_link_hash_table *htab;
2433 1.1 christos bfd *dynobj;
2434 1.1 christos asection *s;
2435 1.1 christos bfd_boolean relocs;
2436 1.1 christos bfd *ibfd;
2437 1.1 christos
2438 1.1 christos htab = or1k_elf_hash_table (info);
2439 1.1 christos if (htab == NULL)
2440 1.1 christos return FALSE;
2441 1.1 christos
2442 1.1 christos dynobj = htab->root.dynobj;
2443 1.1 christos BFD_ASSERT (dynobj != NULL);
2444 1.1 christos
2445 1.1 christos if (htab->root.dynamic_sections_created)
2446 1.1 christos {
2447 1.1 christos /* Set the contents of the .interp section to the interpreter. */
2448 1.1 christos if (info->executable)
2449 1.1 christos {
2450 1.1 christos s = bfd_get_section_by_name (dynobj, ".interp");
2451 1.1 christos BFD_ASSERT (s != NULL);
2452 1.1 christos s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2453 1.1 christos s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2454 1.1 christos }
2455 1.1 christos }
2456 1.1 christos
2457 1.1 christos /* Set up .got offsets for local syms, and space for local dynamic
2458 1.1 christos relocs. */
2459 1.1 christos for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2460 1.1 christos {
2461 1.1 christos bfd_signed_vma *local_got;
2462 1.1 christos bfd_signed_vma *end_local_got;
2463 1.1 christos bfd_size_type locsymcount;
2464 1.1 christos Elf_Internal_Shdr *symtab_hdr;
2465 1.1 christos unsigned char *local_tls_type;
2466 1.1 christos asection *srel;
2467 1.1 christos
2468 1.1 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2469 1.1 christos continue;
2470 1.1 christos
2471 1.1 christos for (s = ibfd->sections; s != NULL; s = s->next)
2472 1.1 christos {
2473 1.1 christos struct elf_or1k_dyn_relocs *p;
2474 1.1 christos
2475 1.1 christos for (p = ((struct elf_or1k_dyn_relocs *)
2476 1.1 christos elf_section_data (s)->local_dynrel);
2477 1.1 christos p != NULL;
2478 1.1 christos p = p->next)
2479 1.1 christos {
2480 1.1 christos if (! bfd_is_abs_section (p->sec)
2481 1.1 christos && bfd_is_abs_section (p->sec->output_section))
2482 1.1 christos {
2483 1.1 christos /* Input section has been discarded, either because
2484 1.1 christos it is a copy of a linkonce section or due to
2485 1.1 christos linker script /DISCARD/, so we'll be discarding
2486 1.1 christos the relocs too. */
2487 1.1 christos }
2488 1.1 christos else if (p->count != 0)
2489 1.1 christos {
2490 1.1 christos srel = elf_section_data (p->sec)->sreloc;
2491 1.1 christos srel->size += p->count * sizeof (Elf32_External_Rela);
2492 1.1 christos if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2493 1.1 christos info->flags |= DF_TEXTREL;
2494 1.1 christos }
2495 1.1 christos }
2496 1.1 christos }
2497 1.1 christos
2498 1.1 christos local_got = elf_local_got_refcounts (ibfd);
2499 1.1 christos if (!local_got)
2500 1.1 christos continue;
2501 1.1 christos
2502 1.1 christos symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2503 1.1 christos locsymcount = symtab_hdr->sh_info;
2504 1.1 christos end_local_got = local_got + locsymcount;
2505 1.1 christos s = htab->sgot;
2506 1.1 christos srel = htab->srelgot;
2507 1.1 christos local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
2508 1.1 christos for (; local_got < end_local_got; ++local_got)
2509 1.1 christos {
2510 1.1 christos if (*local_got > 0)
2511 1.1 christos {
2512 1.1 christos *local_got = s->size;
2513 1.1 christos
2514 1.1 christos /* TLS GD requires two GOT and two relocs. */
2515 1.1 christos if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2516 1.1 christos s->size += 8;
2517 1.1 christos else
2518 1.1 christos s->size += 4;
2519 1.1 christos if (info->shared)
2520 1.1 christos {
2521 1.1 christos if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2522 1.1 christos srel->size += 2 * sizeof (Elf32_External_Rela);
2523 1.1 christos else
2524 1.1 christos srel->size += sizeof (Elf32_External_Rela);
2525 1.1 christos }
2526 1.1 christos }
2527 1.1 christos else
2528 1.1 christos
2529 1.1 christos *local_got = (bfd_vma) -1;
2530 1.1 christos
2531 1.1 christos if (local_tls_type)
2532 1.1 christos ++local_tls_type;
2533 1.1 christos }
2534 1.1 christos }
2535 1.1 christos
2536 1.1 christos /* Allocate global sym .plt and .got entries, and space for global
2537 1.1 christos sym dynamic relocs. */
2538 1.1 christos elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
2539 1.1 christos
2540 1.1 christos /* We now have determined the sizes of the various dynamic sections.
2541 1.1 christos Allocate memory for them. */
2542 1.1 christos relocs = FALSE;
2543 1.1 christos for (s = dynobj->sections; s != NULL; s = s->next)
2544 1.1 christos {
2545 1.1 christos if ((s->flags & SEC_LINKER_CREATED) == 0)
2546 1.1 christos continue;
2547 1.1 christos
2548 1.1 christos if (s == htab->splt
2549 1.1 christos || s == htab->sgot
2550 1.1 christos || s == htab->sgotplt
2551 1.1 christos || s == htab->sdynbss)
2552 1.1 christos {
2553 1.1 christos /* Strip this section if we don't need it; see the
2554 1.1 christos comment below. */
2555 1.1 christos }
2556 1.1 christos else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2557 1.1 christos {
2558 1.1 christos if (s->size != 0 && s != htab->srelplt)
2559 1.1 christos relocs = TRUE;
2560 1.1 christos
2561 1.1 christos /* We use the reloc_count field as a counter if we need
2562 1.1 christos to copy relocs into the output file. */
2563 1.1 christos s->reloc_count = 0;
2564 1.1 christos }
2565 1.1 christos else
2566 1.1 christos /* It's not one of our sections, so don't allocate space. */
2567 1.1 christos continue;
2568 1.1 christos
2569 1.1 christos if (s->size == 0)
2570 1.1 christos {
2571 1.1 christos /* If we don't need this section, strip it from the
2572 1.1 christos output file. This is mostly to handle .rela.bss and
2573 1.1 christos .rela.plt. We must create both sections in
2574 1.1 christos create_dynamic_sections, because they must be created
2575 1.1 christos before the linker maps input sections to output
2576 1.1 christos sections. The linker does that before
2577 1.1 christos adjust_dynamic_symbol is called, and it is that
2578 1.1 christos function which decides whether anything needs to go
2579 1.1 christos into these sections. */
2580 1.1 christos s->flags |= SEC_EXCLUDE;
2581 1.1 christos continue;
2582 1.1 christos }
2583 1.1 christos
2584 1.1 christos if ((s->flags & SEC_HAS_CONTENTS) == 0)
2585 1.1 christos continue;
2586 1.1 christos
2587 1.1 christos /* Allocate memory for the section contents. We use bfd_zalloc
2588 1.1 christos here in case unused entries are not reclaimed before the
2589 1.1 christos section's contents are written out. This should not happen,
2590 1.1 christos but this way if it does, we get a R_OR1K_NONE reloc instead
2591 1.1 christos of garbage. */
2592 1.1 christos s->contents = bfd_zalloc (dynobj, s->size);
2593 1.1 christos
2594 1.1 christos if (s->contents == NULL)
2595 1.1 christos return FALSE;
2596 1.1 christos }
2597 1.1 christos
2598 1.1 christos if (htab->root.dynamic_sections_created)
2599 1.1 christos {
2600 1.1 christos /* Add some entries to the .dynamic section. We fill in the
2601 1.1 christos values later, in or1k_elf_finish_dynamic_sections, but we
2602 1.1 christos must add the entries now so that we get the correct size for
2603 1.1 christos the .dynamic section. The DT_DEBUG entry is filled in by the
2604 1.1 christos dynamic linker and used by the debugger. */
2605 1.1 christos #define add_dynamic_entry(TAG, VAL) \
2606 1.1 christos _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2607 1.1 christos
2608 1.1 christos if (info->executable)
2609 1.1 christos {
2610 1.1 christos if (! add_dynamic_entry (DT_DEBUG, 0))
2611 1.1 christos return FALSE;
2612 1.1 christos }
2613 1.1 christos
2614 1.1 christos if (htab->splt->size != 0)
2615 1.1 christos {
2616 1.1 christos if (! add_dynamic_entry (DT_PLTGOT, 0)
2617 1.1 christos || ! add_dynamic_entry (DT_PLTRELSZ, 0)
2618 1.1 christos || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
2619 1.1 christos || ! add_dynamic_entry (DT_JMPREL, 0))
2620 1.1 christos return FALSE;
2621 1.1 christos }
2622 1.1 christos
2623 1.1 christos if (relocs)
2624 1.1 christos {
2625 1.1 christos if (! add_dynamic_entry (DT_RELA, 0)
2626 1.1 christos || ! add_dynamic_entry (DT_RELASZ, 0)
2627 1.1 christos || ! add_dynamic_entry (DT_RELAENT,
2628 1.1 christos sizeof (Elf32_External_Rela)))
2629 1.1 christos return FALSE;
2630 1.1 christos
2631 1.1 christos /* If any dynamic relocs apply to a read-only section,
2632 1.1 christos then we need a DT_TEXTREL entry. */
2633 1.1 christos if ((info->flags & DF_TEXTREL) == 0)
2634 1.1 christos elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
2635 1.1 christos info);
2636 1.1 christos
2637 1.1 christos if ((info->flags & DF_TEXTREL) != 0)
2638 1.1 christos {
2639 1.1 christos if (! add_dynamic_entry (DT_TEXTREL, 0))
2640 1.1 christos return FALSE;
2641 1.1 christos }
2642 1.1 christos }
2643 1.1 christos }
2644 1.1 christos
2645 1.1 christos #undef add_dynamic_entry
2646 1.1 christos return TRUE;
2647 1.1 christos }
2648 1.1 christos
2649 1.1 christos /* Create dynamic sections when linking against a dynamic object. */
2650 1.1 christos
2651 1.1 christos static bfd_boolean
2652 1.1 christos or1k_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
2653 1.1 christos {
2654 1.1 christos struct elf_or1k_link_hash_table *htab;
2655 1.1 christos
2656 1.1 christos htab = or1k_elf_hash_table (info);
2657 1.1 christos if (htab == NULL)
2658 1.1 christos return FALSE;
2659 1.1 christos
2660 1.1 christos if (!htab->sgot && !create_got_section (dynobj, info))
2661 1.1 christos return FALSE;
2662 1.1 christos
2663 1.1 christos if (!_bfd_elf_create_dynamic_sections (dynobj, info))
2664 1.1 christos return FALSE;
2665 1.1 christos
2666 1.1 christos htab->splt = bfd_get_section_by_name (dynobj, ".plt");
2667 1.1 christos htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
2668 1.1 christos htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
2669 1.1 christos if (!info->shared)
2670 1.1 christos htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
2671 1.1 christos
2672 1.1 christos if (!htab->splt || !htab->srelplt || !htab->sdynbss
2673 1.1 christos || (!info->shared && !htab->srelbss))
2674 1.1 christos abort ();
2675 1.1 christos
2676 1.1 christos return TRUE;
2677 1.1 christos }
2678 1.1 christos
2679 1.1 christos /* Copy the extra info we tack onto an elf_link_hash_entry. */
2680 1.1 christos
2681 1.1 christos static void
2682 1.1 christos or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
2683 1.1 christos struct elf_link_hash_entry *dir,
2684 1.1 christos struct elf_link_hash_entry *ind)
2685 1.1 christos {
2686 1.1 christos struct elf_or1k_link_hash_entry * edir;
2687 1.1 christos struct elf_or1k_link_hash_entry * eind;
2688 1.1 christos
2689 1.1 christos edir = (struct elf_or1k_link_hash_entry *) dir;
2690 1.1 christos eind = (struct elf_or1k_link_hash_entry *) ind;
2691 1.1 christos
2692 1.1 christos if (eind->dyn_relocs != NULL)
2693 1.1 christos {
2694 1.1 christos if (edir->dyn_relocs != NULL)
2695 1.1 christos {
2696 1.1 christos struct elf_or1k_dyn_relocs **pp;
2697 1.1 christos struct elf_or1k_dyn_relocs *p;
2698 1.1 christos
2699 1.1 christos /* Add reloc counts against the indirect sym to the direct sym
2700 1.1 christos list. Merge any entries against the same section. */
2701 1.1 christos for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
2702 1.1 christos {
2703 1.1 christos struct elf_or1k_dyn_relocs *q;
2704 1.1 christos
2705 1.1 christos for (q = edir->dyn_relocs; q != NULL; q = q->next)
2706 1.1 christos if (q->sec == p->sec)
2707 1.1 christos {
2708 1.1 christos q->pc_count += p->pc_count;
2709 1.1 christos q->count += p->count;
2710 1.1 christos *pp = p->next;
2711 1.1 christos break;
2712 1.1 christos }
2713 1.1 christos if (q == NULL)
2714 1.1 christos pp = &p->next;
2715 1.1 christos }
2716 1.1 christos *pp = edir->dyn_relocs;
2717 1.1 christos }
2718 1.1 christos
2719 1.1 christos edir->dyn_relocs = eind->dyn_relocs;
2720 1.1 christos eind->dyn_relocs = NULL;
2721 1.1 christos }
2722 1.1 christos
2723 1.1 christos if (ind->root.type == bfd_link_hash_indirect)
2724 1.1 christos {
2725 1.1 christos if (dir->got.refcount <= 0)
2726 1.1 christos {
2727 1.1 christos edir->tls_type = eind->tls_type;
2728 1.1 christos eind->tls_type = TLS_UNKNOWN;
2729 1.1 christos }
2730 1.1 christos }
2731 1.1 christos
2732 1.1 christos _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2733 1.1 christos }
2734 1.1 christos
2735 1.1 christos /* Set the right machine number. */
2736 1.1 christos
2737 1.1 christos static bfd_boolean
2738 1.1 christos or1k_elf_object_p (bfd *abfd)
2739 1.1 christos {
2740 1.1 christos unsigned long mach = bfd_mach_or1k;
2741 1.1 christos
2742 1.1 christos if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
2743 1.1 christos mach = bfd_mach_or1knd;
2744 1.1 christos
2745 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
2746 1.1 christos }
2747 1.1 christos
2748 1.1 christos /* Store the machine number in the flags field. */
2749 1.1 christos
2750 1.1 christos static void
2751 1.1 christos or1k_elf_final_write_processing (bfd *abfd,
2752 1.1 christos bfd_boolean linker ATTRIBUTE_UNUSED)
2753 1.1 christos {
2754 1.1 christos switch (bfd_get_mach (abfd))
2755 1.1 christos {
2756 1.1 christos default:
2757 1.1 christos case bfd_mach_or1k:
2758 1.1 christos break;
2759 1.1 christos case bfd_mach_or1knd:
2760 1.1 christos elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY;
2761 1.1 christos break;
2762 1.1 christos }
2763 1.1 christos }
2764 1.1 christos
2765 1.1 christos static bfd_boolean
2766 1.1 christos or1k_elf_set_private_flags (bfd *abfd, flagword flags)
2767 1.1 christos {
2768 1.1 christos BFD_ASSERT (!elf_flags_init (abfd)
2769 1.1 christos || elf_elfheader (abfd)->e_flags == flags);
2770 1.1 christos
2771 1.1 christos elf_elfheader (abfd)->e_flags = flags;
2772 1.1 christos elf_flags_init (abfd) = TRUE;
2773 1.1 christos return TRUE;
2774 1.1 christos }
2775 1.1 christos
2776 1.1 christos /* Make sure all input files are consistent with respect to
2777 1.1 christos EF_OR1K_NODELAY flag setting. */
2778 1.1 christos
2779 1.1 christos static bfd_boolean
2780 1.1 christos elf32_or1k_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2781 1.1 christos {
2782 1.1 christos flagword out_flags;
2783 1.1 christos flagword in_flags;
2784 1.1 christos
2785 1.1 christos in_flags = elf_elfheader (ibfd)->e_flags;
2786 1.1 christos out_flags = elf_elfheader (obfd)->e_flags;
2787 1.1 christos
2788 1.1 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2789 1.1 christos || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2790 1.1 christos return TRUE;
2791 1.1 christos
2792 1.1 christos if (!elf_flags_init (obfd))
2793 1.1 christos {
2794 1.1 christos elf_flags_init (obfd) = TRUE;
2795 1.1 christos elf_elfheader (obfd)->e_flags = in_flags;
2796 1.1 christos
2797 1.1 christos return TRUE;
2798 1.1 christos }
2799 1.1 christos
2800 1.1 christos if (in_flags == out_flags)
2801 1.1 christos return TRUE;
2802 1.1 christos
2803 1.1 christos if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
2804 1.1 christos {
2805 1.1 christos (*_bfd_error_handler)
2806 1.1 christos (_("%B: EF_OR1K_NODELAY flag mismatch with previous modules"), ibfd);
2807 1.1 christos
2808 1.1 christos bfd_set_error (bfd_error_bad_value);
2809 1.1 christos return FALSE;
2810 1.1 christos }
2811 1.1 christos
2812 1.1 christos return TRUE;
2813 1.1 christos
2814 1.1 christos }
2815 1.1 christos
2816 1.1 christos #define ELF_ARCH bfd_arch_or1k
2817 1.1 christos #define ELF_MACHINE_CODE EM_OR1K
2818 1.1 christos #define ELF_TARGET_ID OR1K_ELF_DATA
2819 1.1 christos #define ELF_MAXPAGESIZE 0x2000
2820 1.1 christos
2821 1.1 christos #define TARGET_BIG_SYM or1k_elf32_vec
2822 1.1 christos #define TARGET_BIG_NAME "elf32-or1k"
2823 1.1 christos
2824 1.1 christos #define elf_info_to_howto_rel NULL
2825 1.1 christos #define elf_info_to_howto or1k_info_to_howto_rela
2826 1.1 christos #define elf_backend_relocate_section or1k_elf_relocate_section
2827 1.1 christos #define elf_backend_gc_mark_hook or1k_elf_gc_mark_hook
2828 1.1 christos #define elf_backend_gc_sweep_hook or1k_elf_gc_sweep_hook
2829 1.1 christos #define elf_backend_check_relocs or1k_elf_check_relocs
2830 1.1 christos #define elf_backend_reloc_type_class or1k_elf_reloc_type_class
2831 1.1 christos #define elf_backend_can_gc_sections 1
2832 1.1 christos #define elf_backend_rela_normal 1
2833 1.1 christos
2834 1.1 christos #define bfd_elf32_mkobject elf_or1k_mkobject
2835 1.1 christos
2836 1.1 christos #define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
2837 1.1 christos #define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
2838 1.1 christos #define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
2839 1.1 christos #define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup
2840 1.1 christos
2841 1.1 christos #define elf_backend_object_p or1k_elf_object_p
2842 1.1 christos #define elf_backend_final_write_processing or1k_elf_final_write_processing
2843 1.1 christos #define elf_backend_can_refcount 1
2844 1.1 christos
2845 1.1 christos #define elf_backend_plt_readonly 1
2846 1.1 christos #define elf_backend_want_got_plt 1
2847 1.1 christos #define elf_backend_want_plt_sym 0
2848 1.1 christos #define elf_backend_got_header_size 12
2849 1.1 christos #define bfd_elf32_bfd_link_hash_table_create or1k_elf_link_hash_table_create
2850 1.1 christos #define elf_backend_copy_indirect_symbol or1k_elf_copy_indirect_symbol
2851 1.1 christos #define elf_backend_create_dynamic_sections or1k_elf_create_dynamic_sections
2852 1.1 christos #define elf_backend_finish_dynamic_sections or1k_elf_finish_dynamic_sections
2853 1.1 christos #define elf_backend_size_dynamic_sections or1k_elf_size_dynamic_sections
2854 1.1 christos #define elf_backend_adjust_dynamic_symbol or1k_elf_adjust_dynamic_symbol
2855 1.1 christos #define elf_backend_finish_dynamic_symbol or1k_elf_finish_dynamic_symbol
2856 1.1 christos
2857 1.1 christos #include "elf32-target.h"
2858