1/* Meta support for 32-bit ELF
2   Copyright (C) 2013-2017 Free Software Foundation, Inc.
3   Contributed by Imagination Technologies Ltd.
4
5   This file is part of BFD, the Binary File Descriptor library.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20   MA 02110-1301, USA.  */
21
22#include "sysdep.h"
23#include "bfd.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "elf32-metag.h"
27#include "elf/metag.h"
28
29#define GOT_ENTRY_SIZE 4
30#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
31
32/* ABI version:
33    0 - original
34    1 - with GOT offset */
35#define METAG_ELF_ABI_VERSION 1
36
37static const unsigned int plt0_entry[] =
38  {
39    0x02000005, /* MOVT D0Re0, #HI(GOT+4) */
40    0x02000000, /* ADD  D0Re0, D0Re0, #LO(GOT+4) */
41    0xb70001e3, /* SETL [A0StP++], D0Re0, D1Re0 */
42    0xc600012a, /* GETD PC, [D0Re0+#4] */
43    0xa0fffffe  /* NOP */
44  };
45
46static const unsigned int plt0_pic_entry[] =
47  {
48    0x82900001, /* ADDT A0.2, CPC0, #0 */
49    0x82100000, /* ADD  A0.2, A0.2, #0 */
50    0xa3100c20, /* MOV  D0Re0, A0.2 */
51    0xb70001e3, /* SETL [A0StP++], D0Re0, D1Re0 */
52    0xc600012a, /* GETD PC, [D0Re0+#4] */
53  };
54
55static const unsigned int plt_entry[] =
56  {
57    0x82100005, /* MOVT A0.2, #HI(GOT+off) */
58    0x82100000, /* ADD  A0.2, A0.2, #LO(GOT+off) */
59    0xc600806a, /* GETD PC, [A0.2] */
60    0x03000004, /* MOV  D1Re0, #LO(offset) */
61    0xa0000000  /* B    PLT0 */
62  };
63
64static const unsigned int plt_pic_entry[] =
65  {
66    0x82900001, /* ADDT A0.2, CPC0, #HI(GOT+off) */
67    0x82100000, /* ADD  A0.2, A0.2, #LO(GOT+off) */
68    0xc600806a, /* GETD PC, [A0.2] */
69    0x03000004, /* MOV  D1Re0, #LO(offset) */
70    0xa0000000  /* B    PLT0 */
71  };
72
73/* Variable names follow a coding style.
74   Please follow this (Apps Hungarian) style:
75
76   Structure/Variable              Prefix
77   elf_link_hash_table             "etab"
78   elf_link_hash_entry             "eh"
79
80   elf_metag_link_hash_table       "htab"
81   elf_metag_link_hash_entry       "hh"
82
83   bfd_link_hash_table             "btab"
84   bfd_link_hash_entry             "bh"
85
86   bfd_hash_table containing stubs "bstab"
87   elf_metag_stub_hash_entry       "hsh"
88
89   elf_metag_dyn_reloc_entry       "hdh"
90
91   Always remember to use GNU Coding Style.  */
92
93#define PLT_ENTRY_SIZE sizeof(plt_entry)
94
95static reloc_howto_type elf_metag_howto_table[] =
96{
97  /* High order 16 bit absolute.  */
98  HOWTO (R_METAG_HIADDR16,	/* type */
99	 16,			/* rightshift */
100	 2,			/* size (0 = byte, 1 = short, 2 = long) */
101	 16,			/* bitsize */
102	 FALSE,			/* pc_relative */
103	 3,			/* bitpos */
104	 complain_overflow_dont, /* complain_on_overflow */
105	 bfd_elf_generic_reloc, /* special_function */
106	 "R_METAG_HIADDR16",	/* name */
107	 FALSE,			/* partial_inplace */
108	 0,			/* src_mask */
109	 0x0007fff8,		/* dst_mask */
110	 FALSE),		/* pcrel_offset */
111
112  /* Low order 16 bit absolute.  */
113  HOWTO (R_METAG_LOADDR16,	/* type */
114	 0,			/* rightshift */
115	 2,			/* size (0 = byte, 1 = short, 2 = long) */
116	 16,			/* bitsize */
117	 FALSE,			/* pc_relative */
118	 3,			/* bitpos */
119	 complain_overflow_dont,/* complain_on_overflow */
120	 bfd_elf_generic_reloc, /* special_function */
121	 "R_METAG_LOADDR16",	/* name */
122	 FALSE,			/* partial_inplace */
123	 0,			/* src_mask */
124	 0x0007fff8,		/* dst_mask */
125	 FALSE),		/* pcrel_offset */
126
127  /* 32 bit absolute.  */
128  HOWTO (R_METAG_ADDR32,	/* type */
129	 0,			/* rightshift */
130	 2,			/* size (0 = byte, 1 = short, 2 = long) */
131	 32,			/* bitsize */
132	 FALSE,			/* pc_relative */
133	 0,			/* bitpos */
134	 complain_overflow_bitfield, /* complain_on_overflow */
135	 bfd_elf_generic_reloc, /* special_function */
136	 "R_METAG_ADDR32",	/* name */
137	 FALSE,			/* partial_inplace */
138	 0x00000000,		/* src_mask */
139	 0xffffffff,		/* dst_mask */
140	 FALSE),		/* pcrel_offset */
141
142  /* No relocation.  */
143  HOWTO (R_METAG_NONE,		/* type */
144	 0,			/* rightshift */
145	 3,			/* size (0 = byte, 1 = short, 2 = long) */
146	 0,			/* bitsize */
147	 FALSE,			/* pc_relative */
148	 0,			/* bitpos */
149	 complain_overflow_dont, /* complain_on_overflow */
150	 bfd_elf_generic_reloc, /* special_function */
151	 "R_METAG_NONE",	/* name */
152	 FALSE,			/* partial_inplace */
153	 0,			/* src_mask */
154	 0,			/* dst_mask */
155	 FALSE),		/* pcrel_offset */
156
157  /* 19 bit pc relative */
158  HOWTO (R_METAG_RELBRANCH,	/* type */
159	 2,			/* rightshift */
160	 2,			/* size (0 = byte, 1 = short, 2 = long) */
161	 19,			/* bitsize */
162	 TRUE,			/* pc_relative */
163	 5,			/* bitpos */
164	 complain_overflow_signed, /* complain_on_overflow */
165	 bfd_elf_generic_reloc, /* special_function */
166	 "R_METAG_RELBRANCH",	/* name */
167	 FALSE,			/* partial_inplace */
168	 0,			/* src_mask */
169	 0x00ffffe0,		/* dst_mask */
170	 FALSE),		/* pcrel_offset */
171
172  /* GET/SET offset */
173  HOWTO (R_METAG_GETSETOFF,	/* type */
174	 0,			/* rightshift */
175	 1,			/* size (0 = byte, 1 = short, 2 = long) */
176	 12,			/* bitsize */
177	 FALSE,			/* pc_relative */
178	 7,			/* bitpos */
179	 complain_overflow_dont, /* complain_on_overflow */
180	 bfd_elf_generic_reloc, /* special_function */
181	 "R_METAG_GETSETOFF",	/* name */
182	 FALSE,			/* partial_inplace */
183	 0,			/* src_mask */
184	 0,			/* dst_mask */
185	 FALSE),		/* pcrel_offset */
186
187  EMPTY_HOWTO (6),
188  EMPTY_HOWTO (7),
189  EMPTY_HOWTO (8),
190  EMPTY_HOWTO (9),
191  EMPTY_HOWTO (10),
192  EMPTY_HOWTO (11),
193  EMPTY_HOWTO (12),
194  EMPTY_HOWTO (13),
195  EMPTY_HOWTO (14),
196  EMPTY_HOWTO (15),
197  EMPTY_HOWTO (16),
198  EMPTY_HOWTO (17),
199  EMPTY_HOWTO (18),
200  EMPTY_HOWTO (19),
201  EMPTY_HOWTO (20),
202  EMPTY_HOWTO (21),
203  EMPTY_HOWTO (22),
204  EMPTY_HOWTO (23),
205  EMPTY_HOWTO (24),
206  EMPTY_HOWTO (25),
207  EMPTY_HOWTO (26),
208  EMPTY_HOWTO (27),
209  EMPTY_HOWTO (28),
210  EMPTY_HOWTO (29),
211
212  HOWTO (R_METAG_GNU_VTINHERIT, /* type */
213	 0,			/* rightshift */
214	 2,			/* size (0 = byte, 1 = short, 2 = long) */
215	 0,			/* bitsize */
216	 FALSE,		/* pc_relative */
217	 0,			/* bitpos */
218	 complain_overflow_dont, /* complain_on_overflow */
219	 NULL,			/* special_function */
220	 "R_METAG_GNU_VTINHERIT", /* name */
221	 FALSE,		/* partial_inplace */
222	 0,			/* src_mask */
223	 0,			/* dst_mask */
224	 FALSE),		/* pcrel_offset */
225
226  HOWTO (R_METAG_GNU_VTENTRY,	/* type */
227	 0,			/* rightshift */
228	 2,			/* size (0 = byte, 1 = short, 2 = long) */
229	 0,			/* bitsize */
230	 FALSE,			/* pc_relative */
231	 0,			/* bitpos */
232	 complain_overflow_dont, /* complain_on_overflow */
233	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
234	 "R_METAG_GNU_VTENTRY",  /* name */
235	 FALSE,			/* partial_inplace */
236	 0,			/* src_mask */
237	 0,			/* dst_mask */
238	 FALSE),		/* pcrel_offset */
239
240  /* High order 16 bit GOT offset */
241  HOWTO (R_METAG_HI16_GOTOFF,	/* type */
242	 16,			/* rightshift */
243	 2,			/* size (0 = byte, 1 = short, 2 = long) */
244	 16,			/* bitsize */
245	 FALSE,			/* pc_relative */
246	 3,			/* bitpos */
247	 complain_overflow_dont, /* complain_on_overflow */
248	 bfd_elf_generic_reloc, /* special_function */
249	 "R_METAG_HI16_GOTOFF", /* name */
250	 FALSE,			/* partial_inplace */
251	 0,			/* src_mask */
252	 0x0007fff8,		/* dst_mask */
253	 FALSE),		/* pcrel_offset */
254
255  /* Low order 16 bit GOT offset */
256  HOWTO (R_METAG_LO16_GOTOFF,	/* type */
257	 0,			/* rightshift */
258	 2,			/* size (0 = byte, 1 = short, 2 = long) */
259	 16,			/* bitsize */
260	 FALSE,			/* pc_relative */
261	 3,			/* bitpos */
262	 complain_overflow_dont, /* complain_on_overflow */
263	 bfd_elf_generic_reloc, /* special_function */
264	 "R_METAG_LO16_GOTOFF", /* name */
265	 FALSE,			/* partial_inplace */
266	 0,			/* src_mask */
267	 0x0007fff8,		/* dst_mask */
268	 FALSE),		/* pcrel_offset */
269
270  /* GET/SET GOT offset */
271  HOWTO (R_METAG_GETSET_GOTOFF, /* type */
272	 0,			/* rightshift */
273	 1,			/* size (0 = byte, 1 = short, 2 = long) */
274	 12,			/* bitsize */
275	 FALSE,			/* pc_relative */
276	 7,			/* bitpos */
277	 complain_overflow_dont, /* complain_on_overflow */
278	 bfd_elf_generic_reloc, /* special_function */
279	 "R_METAG_GETSET_GOTOFF", /* name */
280	 FALSE,			/* partial_inplace */
281	 0,			/* src_mask */
282	 0,			/* dst_mask */
283	 FALSE),		/* pcrel_offset */
284
285  /* GET/SET GOT relative */
286  HOWTO (R_METAG_GETSET_GOT,	/* type */
287	 0,			/* rightshift */
288	 1,			/* size (0 = byte, 1 = short, 2 = long) */
289	 12,			/* bitsize */
290	 FALSE,			/* pc_relative */
291	 7,			/* bitpos */
292	 complain_overflow_dont, /* complain_on_overflow */
293	 bfd_elf_generic_reloc, /* special_function */
294	 "R_METAG_GETSET_GOT",  /* name */
295	 FALSE,			/* partial_inplace */
296	 0,			/* src_mask */
297	 0,			/* dst_mask */
298	 FALSE),		/* pcrel_offset */
299
300  /* High order 16 bit GOT reference */
301  HOWTO (R_METAG_HI16_GOTPC,	/* type */
302	 16,			/* rightshift */
303	 2,			/* size (0 = byte, 1 = short, 2 = long) */
304	 16,			/* bitsize */
305	 FALSE,			/* pc_relative */
306	 3,			/* bitpos */
307	 complain_overflow_dont, /* complain_on_overflow */
308	 bfd_elf_generic_reloc, /* special_function */
309	 "R_METAG_HI16_GOTPC",  /* name */
310	 FALSE,			/* partial_inplace */
311	 0,			/* src_mask */
312	 0x0007fff8,		/* dst_mask */
313	 FALSE),		/* pcrel_offset */
314
315  /* Low order 16 bit GOT reference */
316  HOWTO (R_METAG_LO16_GOTPC,	/* type */
317	 0,			/* rightshift */
318	 2,			/* size (0 = byte, 1 = short, 2 = long) */
319	 16,			/* bitsize */
320	 FALSE,			/* pc_relative */
321	 3,			/* bitpos */
322	 complain_overflow_dont, /* complain_on_overflow */
323	 bfd_elf_generic_reloc, /* special_function */
324	 "R_METAG_LO16_GOTPC",  /* name */
325	 FALSE,			/* partial_inplace */
326	 0,			/* src_mask */
327	 0x0007fff8,		/* dst_mask */
328	 FALSE),		/* pcrel_offset */
329
330  /* High order 16 bit PLT */
331  HOWTO (R_METAG_HI16_PLT,	/* type */
332	 16,			/* rightshift */
333	 2,			/* size (0 = byte, 1 = short, 2 = long) */
334	 16,			/* bitsize */
335	 FALSE,			/* pc_relative */
336	 3,			/* bitpos */
337	 complain_overflow_dont, /* complain_on_overflow */
338	 bfd_elf_generic_reloc, /* special_function */
339	 "R_METAG_HI16_PLT",	/* name */
340	 FALSE,			/* partial_inplace */
341	 0,			/* src_mask */
342	 0x0007fff8,		/* dst_mask */
343	 FALSE),		/* pcrel_offset */
344
345  /* Low order 16 bit PLT */
346  HOWTO (R_METAG_LO16_PLT,	/* type */
347	 0,			/* rightshift */
348	 2,			/* size (0 = byte, 1 = short, 2 = long) */
349	 16,			/* bitsize */
350	 FALSE,			/* pc_relative */
351	 3,			/* bitpos */
352	 complain_overflow_dont, /* complain_on_overflow */
353	 bfd_elf_generic_reloc, /* special_function */
354	 "R_METAG_LO16_PLT",	/* name */
355	 FALSE,			/* partial_inplace */
356	 0,			/* src_mask */
357	 0xffffffff,		/* dst_mask */
358	 FALSE),		/* pcrel_offset */
359
360  HOWTO (R_METAG_RELBRANCH_PLT, /* type */
361	 2,			/* rightshift */
362	 2,			/* size (0 = byte, 1 = short, 2 = long) */
363	 19,			/* bitsize */
364	 TRUE,			/* pc_relative */
365	 5,			/* bitpos */
366	 complain_overflow_signed, /* complain_on_overflow */
367	 bfd_elf_generic_reloc, /* special_function */
368	 "R_METAG_RELBRANCH_PLT", /* name */
369	 FALSE,			/* partial_inplace */
370	 0,			/* src_mask */
371	 0x00ffffe0,		/* dst_mask */
372	 FALSE),		/* pcrel_offset */
373
374  /* Dummy relocs used by the linker internally.  */
375  HOWTO (R_METAG_GOTOFF,	/* type */
376	 0,			/* rightshift */
377	 2,			/* size (0 = byte, 1 = short, 2 = long) */
378	 32,			/* bitsize */
379	 FALSE,			/* pc_relative */
380	 0,			/* bitpos */
381	 complain_overflow_bitfield, /* complain_on_overflow */
382	 bfd_elf_generic_reloc, /* special_function */
383	 "R_METAG_GOTOFF",	/* name */
384	 FALSE,			/* partial_inplace */
385	 0xffffffff,		/* src_mask */
386	 0xffffffff,		/* dst_mask */
387	 FALSE),		/* pcrel_offset */
388
389  HOWTO (R_METAG_PLT,		/* type */
390	 0,			/* rightshift */
391	 2,			/* size (0 = byte, 1 = short, 2 = long) */
392	 32,			/* bitsize */
393	 FALSE,			/* pc_relative */
394	 0,			/* bitpos */
395	 complain_overflow_bitfield, /* complain_on_overflow */
396	 bfd_elf_generic_reloc, /* special_function */
397	 "R_METAG_GOTOFF",	/* name */
398	 FALSE,			/* partial_inplace */
399	 0xffffffff,		/* src_mask */
400	 0xffffffff,		/* dst_mask */
401	 FALSE),		/* pcrel_offset */
402
403  /* This is used only by the dynamic linker.  The symbol should exist
404     both in the object being run and in some shared library.  The
405     dynamic linker copies the data addressed by the symbol from the
406     shared library into the object, because the object being
407     run has to have the data at some particular address.  */
408  HOWTO (R_METAG_COPY,		/* type */
409	 0,			/* rightshift */
410	 2,			/* size (0 = byte, 1 = short, 2 = long) */
411	 32,			/* bitsize */
412	 FALSE,			/* pc_relative */
413	 0,			/* bitpos */
414	 complain_overflow_bitfield, /* complain_on_overflow */
415	 bfd_elf_generic_reloc, /* special_function */
416	 "R_METAG_COPY",	/* name */
417	 FALSE,			/* partial_inplace */
418	 0xffffffff,		/* src_mask */
419	 0xffffffff,		/* dst_mask */
420	 FALSE),		/* pcrel_offset */
421
422  /* Marks a procedure linkage table entry for a symbol.  */
423  HOWTO (R_METAG_JMP_SLOT,	/* type */
424	 0,			/* rightshift */
425	 2,			/* size (0 = byte, 1 = short, 2 = long) */
426	 32,			/* bitsize */
427	 FALSE,			/* pc_relative */
428	 0,			/* bitpos */
429	 complain_overflow_bitfield, /* complain_on_overflow */
430	 bfd_elf_generic_reloc, /* special_function */
431	 "R_METAG_JMP_SLOT",	/* name */
432	 FALSE,			/* partial_inplace */
433	 0xffffffff,		/* src_mask */
434	 0xffffffff,		/* dst_mask */
435	 FALSE),		/* pcrel_offset */
436
437  /* Used only by the dynamic linker.  When the object is run, this
438     longword is set to the load address of the object, plus the
439     addend.  */
440  HOWTO (R_METAG_RELATIVE,	/* type */
441	 0,			/* rightshift */
442	 2,			/* size (0 = byte, 1 = short, 2 = long) */
443	 32,			/* bitsize */
444	 FALSE,			/* pc_relative */
445	 0,			/* bitpos */
446	 complain_overflow_bitfield, /* complain_on_overflow */
447	 bfd_elf_generic_reloc, /* special_function */
448	 "R_METAG_RELATIVE",	/* name */
449	 FALSE,			/* partial_inplace */
450	 0xffffffff,		/* src_mask */
451	 0xffffffff,		/* dst_mask */
452	 FALSE),		/* pcrel_offset */
453
454  HOWTO (R_METAG_GLOB_DAT,	/* type */
455	 0,			/* rightshift */
456	 2,			/* size (0 = byte, 1 = short, 2 = long) */
457	 32,			/* bitsize */
458	 FALSE,			/* pc_relative */
459	 0,			/* bitpos */
460	 complain_overflow_bitfield, /* complain_on_overflow */
461	 bfd_elf_generic_reloc, /* special_function */
462	 "R_METAG_GLOB_DAT",	/* name */
463	 FALSE,			/* partial_inplace */
464	 0xffffffff,		/* src_mask */
465	 0xffffffff,		/* dst_mask */
466	 FALSE),		/* pcrel_offset */
467
468  HOWTO (R_METAG_TLS_GD,	/* type */
469	 0,			/* rightshift */
470	 2,			/* size (0 = byte, 1 = short, 2 = long) */
471	 16,			/* bitsize */
472	 FALSE,			/* pc_relative */
473	 3,			/* bitpos */
474	 complain_overflow_dont, /* complain_on_overflow */
475	 bfd_elf_generic_reloc, /* special_function */
476	 "R_METAG_TLS_GD",	/* name */
477	 FALSE,			/* partial_inplace */
478	 0,			/* src_mask */
479	 0x0007fff8,		/* dst_mask */
480	 FALSE),		/* pcrel_offset */
481
482  HOWTO (R_METAG_TLS_LDM,	/* type */
483	 0,			/* rightshift */
484	 2,			/* size (0 = byte, 1 = short, 2 = long) */
485	 16,			/* bitsize */
486	 FALSE,			/* pc_relative */
487	 3,			/* bitpos */
488	 complain_overflow_bitfield, /* complain_on_overflow */
489	 bfd_elf_generic_reloc, /* special_function */
490	 "R_METAG_TLS_LDM",	/* name */
491	 FALSE,			/* partial_inplace */
492	 0,			/* src_mask */
493	 0x0007fff8,		/* dst_mask */
494	 FALSE),		/* pcrel_offset */
495
496  HOWTO (R_METAG_TLS_LDO_HI16,	/* type */
497	 16,			/* rightshift */
498	 2,			/* size (0 = byte, 1 = short, 2 = long) */
499	 16,			/* bitsize */
500	 FALSE,			/* pc_relative */
501	 3,			/* bitpos */
502	 complain_overflow_bitfield, /* complain_on_overflow */
503	 bfd_elf_generic_reloc, /* special_function */
504	 "R_METAG_TLS_LDO_HI16", /* name */
505	 FALSE,			/* partial_inplace */
506	 0,			/* src_mask */
507	 0x0007fff8,		/* dst_mask */
508	 FALSE),		/* pcrel_offset */
509
510  HOWTO (R_METAG_TLS_LDO_LO16,	/* type */
511	 0,			/* rightshift */
512	 2,			/* size (0 = byte, 1 = short, 2 = long) */
513	 16,			/* bitsize */
514	 FALSE,			/* pc_relative */
515	 3,			/* bitpos */
516	 complain_overflow_bitfield, /* complain_on_overflow */
517	 bfd_elf_generic_reloc, /* special_function */
518	 "R_METAG_TLS_LDO_LO16", /* name */
519	 FALSE,			/* partial_inplace */
520	 0,			/* src_mask */
521	 0x0007fff8,		/* dst_mask */
522	 FALSE),		/* pcrel_offset */
523
524  /* Dummy reloc used by the linker internally.  */
525  HOWTO (R_METAG_TLS_LDO,	/* type */
526	 0,			/* rightshift */
527	 2,			/* size (0 = byte, 1 = short, 2 = long) */
528	 16,			/* bitsize */
529	 FALSE,			/* pc_relative */
530	 3,			/* bitpos */
531	 complain_overflow_bitfield, /* complain_on_overflow */
532	 bfd_elf_generic_reloc, /* special_function */
533	 "R_METAG_TLS_LDO",	/* name */
534	 FALSE,			/* partial_inplace */
535	 0,			/* src_mask */
536	 0x0007fff8,		/* dst_mask */
537	 FALSE),		/* pcrel_offset */
538
539  HOWTO (R_METAG_TLS_IE,	/* type */
540	 2,			/* rightshift */
541	 2,			/* size (0 = byte, 1 = short, 2 = long) */
542	 12,			/* bitsize */
543	 FALSE,			/* pc_relative */
544	 7,			/* bitpos */
545	 complain_overflow_dont, /* complain_on_overflow */
546	 bfd_elf_generic_reloc, /* special_function */
547	 "R_METAG_TLS_IE",	/* name */
548	 FALSE,			/* partial_inplace */
549	 0,			/* src_mask */
550	 0x0007ff80,		/* dst_mask */
551	 FALSE),		/* pcrel_offset */
552
553  /* Dummy reloc used by the linker internally.  */
554  HOWTO (R_METAG_TLS_IENONPIC,  /* type */
555	 0,			/* rightshift */
556	 2,			/* size (0 = byte, 1 = short, 2 = long) */
557	 16,			/* bitsize */
558	 FALSE,			/* pc_relative */
559	 3,			/* bitpos */
560	 complain_overflow_dont, /* complain_on_overflow */
561	 bfd_elf_generic_reloc, /* special_function */
562	 "R_METAG_TLS_IENONPIC", /* name */
563	 FALSE,			/* partial_inplace */
564	 0,			/* src_mask */
565	 0x0007fff8,		/* dst_mask */
566	 FALSE),		/* pcrel_offset */
567
568  HOWTO (R_METAG_TLS_IENONPIC_HI16,/* type */
569	 16,			/* rightshift */
570	 2,			/* size (0 = byte, 1 = short, 2 = long) */
571	 16,			/* bitsize */
572	 FALSE,			/* pc_relative */
573	 3,			/* bitpos */
574	 complain_overflow_dont, /* complain_on_overflow */
575	 bfd_elf_generic_reloc, /* special_function */
576	 "R_METAG_TLS_IENONPIC_HI16", /* name */
577	 FALSE,			/* partial_inplace */
578	 0,			/* src_mask */
579	 0x0007fff8,		/* dst_mask */
580	 FALSE),		/* pcrel_offset */
581
582  HOWTO (R_METAG_TLS_IENONPIC_LO16,/* type */
583	 0,			/* rightshift */
584	 2,			/* size (0 = byte, 1 = short, 2 = long) */
585	 16,			/* bitsize */
586	 FALSE,			/* pc_relative */
587	 3,			/* bitpos */
588	 complain_overflow_dont, /* complain_on_overflow */
589	 bfd_elf_generic_reloc, /* special_function */
590	 "R_METAG_TLS_IENONPIC_LO16", /* name */
591	 FALSE,			/* partial_inplace */
592	 0,			/* src_mask */
593	 0x0007fff8,		/* dst_mask */
594	 FALSE),		/* pcrel_offset */
595
596  HOWTO (R_METAG_TLS_TPOFF,	/* type */
597	 0,			/* rightshift */
598	 2,			/* size (0 = byte, 1 = short, 2 = long) */
599	 32,			/* bitsize */
600	 FALSE,			/* pc_relative */
601	 0,			/* bitpos */
602	 complain_overflow_bitfield, /* complain_on_overflow */
603	 bfd_elf_generic_reloc, /* special_function */
604	 "R_METAG_TLS_TPOFF",	/* name */
605	 FALSE,			/* partial_inplace */
606	 0,			/* src_mask */
607	 0xffffffff,		/* dst_mask */
608	 FALSE),		/* pcrel_offset */
609
610  HOWTO (R_METAG_TLS_DTPMOD,	/* type */
611	 0,			/* rightshift */
612	 2,			/* size (0 = byte, 1 = short, 2 = long) */
613	 32,			/* bitsize */
614	 FALSE,			/* pc_relative */
615	 0,			/* bitpos */
616	 complain_overflow_bitfield, /* complain_on_overflow */
617	 bfd_elf_generic_reloc, /* special_function */
618	 "R_METAG_TLS_DTPMOD",	/* name */
619	 FALSE,			/* partial_inplace */
620	 0,			/* src_mask */
621	 0xffffffff,		/* dst_mask */
622	 FALSE),		/* pcrel_offset */
623
624  HOWTO (R_METAG_TLS_DTPOFF,	/* type */
625	 0,			/* rightshift */
626	 2,			/* size (0 = byte, 1 = short, 2 = long) */
627	 32,			/* bitsize */
628	 FALSE,			/* pc_relative */
629	 0,			/* bitpos */
630	 complain_overflow_bitfield, /* complain_on_overflow */
631	 bfd_elf_generic_reloc, /* special_function */
632	 "R_METAG_TLS_DTPOFF",	/* name */
633	 FALSE,			/* partial_inplace */
634	 0,			/* src_mask */
635	 0xffffffff,		/* dst_mask */
636	 FALSE),		/* pcrel_offset */
637
638  /* Dummy reloc used by the linker internally.  */
639  HOWTO (R_METAG_TLS_LE,	/* type */
640	 0,			/* rightshift */
641	 2,			/* size (0 = byte, 1 = short, 2 = long) */
642	 32,			/* bitsize */
643	 FALSE,			/* pc_relative */
644	 0,			/* bitpos */
645	 complain_overflow_bitfield, /* complain_on_overflow */
646	 bfd_elf_generic_reloc, /* special_function */
647	 "R_METAG_TLS_LE",	/* name */
648	 FALSE,			/* partial_inplace */
649	 0,			/* src_mask */
650	 0xffffffff,		/* dst_mask */
651	 FALSE),		/* pcrel_offset */
652
653  HOWTO (R_METAG_TLS_LE_HI16,	/* type */
654	 16,			/* rightshift */
655	 2,			/* size (0 = byte, 1 = short, 2 = long) */
656	 16,			/* bitsize */
657	 FALSE,			/* pc_relative */
658	 3,			/* bitpos */
659	 complain_overflow_dont, /* complain_on_overflow */
660	 bfd_elf_generic_reloc, /* special_function */
661	 "R_METAG_TLS_LE_HI16", /* name */
662	 FALSE,			/* partial_inplace */
663	 0,			/* src_mask */
664	 0x0007fff8,		/* dst_mask */
665	 FALSE),		/* pcrel_offset */
666
667  HOWTO (R_METAG_TLS_LE_LO16,	/* type */
668	 0,			/* rightshift */
669	 2,			/* size (0 = byte, 1 = short, 2 = long) */
670	 16,			/* bitsize */
671	 FALSE,			/* pc_relative */
672	 3,			/* bitpos */
673	 complain_overflow_dont, /* complain_on_overflow */
674	 bfd_elf_generic_reloc, /* special_function */
675	 "R_METAG_TLS_LE_LO16", /* name */
676	 FALSE,			/* partial_inplace */
677	 0,			/* src_mask */
678	 0x0007fff8,		/* dst_mask */
679	 FALSE),		/* pcrel_offset */
680
681};
682
683#define BRANCH_BITS 19
684
685/* The GOT is typically accessed using a [GS]ETD instruction. The size of the
686   immediate offset which can be used in such instructions therefore limits
687   the usable size of the GOT. If the base register for the [GS]ETD (A1LbP)
688   is pointing to the base of the GOT then the size is limited to the maximum
689   11 bits unsigned dword offset, or 2^13 = 0x2000 bytes. However the offset
690   in a [GS]ETD instruction is signed, so by setting the base address register
691   to an offset of that 0x2000 byte maximum unsigned offset from the base of
692   the GOT we can use negative offsets in addition to positive. This
693   effectively doubles the usable GOT size to 0x4000 bytes.  */
694#define GOT_REG_OFFSET 0x2000
695
696struct metag_reloc_map
697{
698  bfd_reloc_code_real_type bfd_reloc_val;
699  unsigned int metag_reloc_val;
700};
701
702static const struct metag_reloc_map metag_reloc_map [] =
703  {
704    { BFD_RELOC_NONE,                R_METAG_NONE },
705    { BFD_RELOC_32,                  R_METAG_ADDR32 },
706    { BFD_RELOC_METAG_HIADDR16,      R_METAG_HIADDR16 },
707    { BFD_RELOC_METAG_LOADDR16,      R_METAG_LOADDR16 },
708    { BFD_RELOC_METAG_RELBRANCH,     R_METAG_RELBRANCH },
709    { BFD_RELOC_METAG_GETSETOFF,     R_METAG_GETSETOFF },
710    { BFD_RELOC_VTABLE_INHERIT,      R_METAG_GNU_VTINHERIT },
711    { BFD_RELOC_VTABLE_ENTRY,        R_METAG_GNU_VTENTRY },
712    { BFD_RELOC_METAG_REL8,          R_METAG_REL8 },
713    { BFD_RELOC_METAG_REL16,         R_METAG_REL16 },
714    { BFD_RELOC_METAG_HI16_GOTOFF,   R_METAG_HI16_GOTOFF },
715    { BFD_RELOC_METAG_LO16_GOTOFF,   R_METAG_LO16_GOTOFF },
716    { BFD_RELOC_METAG_GETSET_GOTOFF, R_METAG_GETSET_GOTOFF },
717    { BFD_RELOC_METAG_GETSET_GOT,    R_METAG_GETSET_GOT },
718    { BFD_RELOC_METAG_HI16_GOTPC,    R_METAG_HI16_GOTPC },
719    { BFD_RELOC_METAG_LO16_GOTPC,    R_METAG_LO16_GOTPC },
720    { BFD_RELOC_METAG_HI16_PLT,      R_METAG_HI16_PLT },
721    { BFD_RELOC_METAG_LO16_PLT,      R_METAG_LO16_PLT },
722    { BFD_RELOC_METAG_RELBRANCH_PLT, R_METAG_RELBRANCH_PLT },
723    { BFD_RELOC_METAG_GOTOFF,        R_METAG_GOTOFF },
724    { BFD_RELOC_METAG_PLT,           R_METAG_PLT },
725    { BFD_RELOC_METAG_COPY,          R_METAG_COPY },
726    { BFD_RELOC_METAG_JMP_SLOT,      R_METAG_JMP_SLOT },
727    { BFD_RELOC_METAG_RELATIVE,      R_METAG_RELATIVE },
728    { BFD_RELOC_METAG_GLOB_DAT,      R_METAG_GLOB_DAT },
729    { BFD_RELOC_METAG_TLS_GD,        R_METAG_TLS_GD },
730    { BFD_RELOC_METAG_TLS_LDM,       R_METAG_TLS_LDM },
731    { BFD_RELOC_METAG_TLS_LDO_HI16,  R_METAG_TLS_LDO_HI16 },
732    { BFD_RELOC_METAG_TLS_LDO_LO16,  R_METAG_TLS_LDO_LO16 },
733    { BFD_RELOC_METAG_TLS_LDO,       R_METAG_TLS_LDO },
734    { BFD_RELOC_METAG_TLS_IE,        R_METAG_TLS_IE },
735    { BFD_RELOC_METAG_TLS_IENONPIC,  R_METAG_TLS_IENONPIC },
736    { BFD_RELOC_METAG_TLS_IENONPIC_HI16, R_METAG_TLS_IENONPIC_HI16 },
737    { BFD_RELOC_METAG_TLS_IENONPIC_LO16, R_METAG_TLS_IENONPIC_LO16 },
738    { BFD_RELOC_METAG_TLS_TPOFF,     R_METAG_TLS_TPOFF },
739    { BFD_RELOC_METAG_TLS_DTPMOD,    R_METAG_TLS_DTPMOD },
740    { BFD_RELOC_METAG_TLS_DTPOFF,    R_METAG_TLS_DTPOFF },
741    { BFD_RELOC_METAG_TLS_LE,        R_METAG_TLS_LE },
742    { BFD_RELOC_METAG_TLS_LE_HI16,   R_METAG_TLS_LE_HI16 },
743    { BFD_RELOC_METAG_TLS_LE_LO16,   R_METAG_TLS_LE_LO16 },
744  };
745
746enum elf_metag_stub_type
747{
748  metag_stub_long_branch,
749  metag_stub_long_branch_shared,
750  metag_stub_none
751};
752
753struct elf_metag_stub_hash_entry
754{
755  /* Base hash table entry structure.  */
756  struct bfd_hash_entry bh_root;
757
758  /* The stub section.  */
759  asection *stub_sec;
760
761  /* Offset within stub_sec of the beginning of this stub.  */
762  bfd_vma stub_offset;
763
764  /* Given the symbol's value and its section we can determine its final
765     value when building the stubs (so the stub knows where to jump.  */
766  bfd_vma target_value;
767  asection *target_section;
768
769  enum elf_metag_stub_type stub_type;
770
771  /* The symbol table entry, if any, that this was derived from.  */
772  struct elf_metag_link_hash_entry *hh;
773
774  /* And the reloc addend that this was derived from.  */
775  bfd_vma addend;
776
777  /* Where this stub is being called from, or, in the case of combined
778     stub sections, the first input section in the group.  */
779  asection *id_sec;
780};
781
782struct elf_metag_link_hash_entry
783{
784  struct elf_link_hash_entry eh;
785
786  /* A pointer to the most recently used stub hash entry against this
787     symbol.  */
788  struct elf_metag_stub_hash_entry *hsh_cache;
789
790  /* Used to count relocations for delayed sizing of relocation
791     sections.  */
792  struct elf_metag_dyn_reloc_entry {
793
794    /* Next relocation in the chain.  */
795    struct elf_metag_dyn_reloc_entry *hdh_next;
796
797    /* The input section of the reloc.  */
798    asection *sec;
799
800    /* Number of relocs copied in this section.  */
801    bfd_size_type count;
802
803    /* Number of relative relocs copied for the input section.  */
804    bfd_size_type relative_count;
805  } *dyn_relocs;
806
807  enum
808    {
809      GOT_UNKNOWN = 0, GOT_NORMAL = 1, GOT_TLS_IE = 2, GOT_TLS_LDM = 4, GOT_TLS_GD = 8
810    } tls_type;
811};
812
813struct elf_metag_link_hash_table
814{
815  /* The main hash table.  */
816  struct elf_link_hash_table etab;
817
818  /* The stub hash table.  */
819  struct bfd_hash_table bstab;
820
821  /* Linker stub bfd.  */
822  bfd *stub_bfd;
823
824  /* Linker call-backs.  */
825  asection * (*add_stub_section) (const char *, asection *);
826  void (*layout_sections_again) (void);
827
828  /* Array to keep track of which stub sections have been created, and
829     information on stub grouping.  */
830  struct map_stub
831  {
832    /* This is the section to which stubs in the group will be
833       attached.  */
834    asection *link_sec;
835    /* The stub section.  */
836    asection *stub_sec;
837  } *stub_group;
838
839  /* Assorted information used by elf_metag_size_stubs.  */
840  unsigned int bfd_count;
841  unsigned int top_index;
842  asection **input_list;
843  Elf_Internal_Sym **all_local_syms;
844
845  /* Small local sym cache.  */
846  struct sym_cache sym_cache;
847
848  /* Data for LDM relocations.  */
849  union
850  {
851    bfd_signed_vma refcount;
852    bfd_vma offset;
853  } tls_ldm_got;
854};
855
856/* Return the base vma address which should be subtracted from the
857   real address when resolving a dtpoff relocation.  This is PT_TLS
858   segment p_vaddr.  */
859static bfd_vma
860dtpoff_base (struct bfd_link_info *info)
861{
862  /* If tls_sec is NULL, we should have signalled an error already.  */
863  if (elf_hash_table (info)->tls_sec == NULL)
864    return 0;
865  return elf_hash_table (info)->tls_sec->vma;
866}
867
868/* Return the relocation value for R_METAG_TLS_IE */
869static bfd_vma
870tpoff (struct bfd_link_info *info, bfd_vma address)
871{
872  /* If tls_sec is NULL, we should have signalled an error already.  */
873  if (elf_hash_table (info)->tls_sec == NULL)
874    return 0;
875  /* METAG TLS ABI is variant I and static TLS blocks start just after
876     tcbhead structure which has 2 pointer fields.  */
877  return (address - elf_hash_table (info)->tls_sec->vma
878	  + align_power ((bfd_vma) 8,
879			 elf_hash_table (info)->tls_sec->alignment_power));
880}
881
882static void
883metag_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
884			  arelent *cache_ptr,
885			  Elf_Internal_Rela *dst)
886{
887  unsigned int r_type;
888
889  r_type = ELF32_R_TYPE (dst->r_info);
890  if (r_type >= (unsigned int) R_METAG_MAX)
891    {
892      /* xgettext:c-format */
893      _bfd_error_handler (_("%B: invalid METAG reloc number: %d"), abfd, r_type);
894      r_type = 0;
895    }
896  cache_ptr->howto = & elf_metag_howto_table [r_type];
897}
898
899static reloc_howto_type *
900metag_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
901			 bfd_reloc_code_real_type code)
902{
903  unsigned int i;
904
905  for (i = 0; i < sizeof (metag_reloc_map) / sizeof (metag_reloc_map[0]); i++)
906    if (metag_reloc_map [i].bfd_reloc_val == code)
907      return & elf_metag_howto_table [metag_reloc_map[i].metag_reloc_val];
908
909  return NULL;
910}
911
912static reloc_howto_type *
913metag_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
914			 const char *r_name)
915{
916  unsigned int i;
917
918  for (i = 0; i < sizeof (elf_metag_howto_table) / sizeof (elf_metag_howto_table[0]); i++)
919    if (elf_metag_howto_table[i].name != NULL
920	&& strcasecmp (elf_metag_howto_table[i].name, r_name) == 0)
921      return &elf_metag_howto_table[i];
922
923  return NULL;
924}
925
926/* Various hash macros and functions.  */
927#define metag_link_hash_table(p) \
928  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
929  == METAG_ELF_DATA ? ((struct elf_metag_link_hash_table *) ((p)->hash)) : NULL)
930
931#define metag_elf_hash_entry(ent) \
932  ((struct elf_metag_link_hash_entry *)(ent))
933
934#define metag_stub_hash_entry(ent) \
935  ((struct elf_metag_stub_hash_entry *)(ent))
936
937#define metag_stub_hash_lookup(table, string, create, copy) \
938  ((struct elf_metag_stub_hash_entry *) \
939   bfd_hash_lookup ((table), (string), (create), (copy)))
940
941#define metag_elf_local_got_tls_type(abfd) \
942  ((char *)(elf_local_got_offsets (abfd) + (elf_tdata (abfd)->symtab_hdr.sh_info)))
943
944/* Assorted hash table functions.  */
945
946/* Initialize an entry in the stub hash table.  */
947
948static struct bfd_hash_entry *
949stub_hash_newfunc (struct bfd_hash_entry *entry,
950		   struct bfd_hash_table *table,
951		   const char *string)
952{
953  /* Allocate the structure if it has not already been allocated by a
954     subclass.  */
955  if (entry == NULL)
956    {
957      entry = bfd_hash_allocate (table,
958				 sizeof (struct elf_metag_stub_hash_entry));
959      if (entry == NULL)
960	return entry;
961    }
962
963  /* Call the allocation method of the superclass.  */
964  entry = bfd_hash_newfunc (entry, table, string);
965  if (entry != NULL)
966    {
967      struct elf_metag_stub_hash_entry *hsh;
968
969      /* Initialize the local fields.  */
970      hsh = (struct elf_metag_stub_hash_entry *) entry;
971      hsh->stub_sec = NULL;
972      hsh->stub_offset = 0;
973      hsh->target_value = 0;
974      hsh->target_section = NULL;
975      hsh->stub_type = metag_stub_long_branch;
976      hsh->hh = NULL;
977      hsh->id_sec = NULL;
978    }
979
980  return entry;
981}
982
983/* Initialize an entry in the link hash table.  */
984
985static struct bfd_hash_entry *
986metag_link_hash_newfunc (struct bfd_hash_entry *entry,
987			 struct bfd_hash_table *table,
988			 const char *string)
989{
990  /* Allocate the structure if it has not already been allocated by a
991     subclass.  */
992  if (entry == NULL)
993    {
994      entry = bfd_hash_allocate (table,
995				 sizeof (struct elf_metag_link_hash_entry));
996      if (entry == NULL)
997	return entry;
998    }
999
1000  /* Call the allocation method of the superclass.  */
1001  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1002  if (entry != NULL)
1003    {
1004      struct elf_metag_link_hash_entry *hh;
1005
1006      /* Initialize the local fields.  */
1007      hh = (struct elf_metag_link_hash_entry *) entry;
1008      hh->hsh_cache = NULL;
1009      hh->dyn_relocs = NULL;
1010      hh->tls_type = GOT_UNKNOWN;
1011    }
1012
1013  return entry;
1014}
1015
1016/* Free the derived linker hash table.  */
1017
1018static void
1019elf_metag_link_hash_table_free (bfd *obfd)
1020{
1021  struct elf_metag_link_hash_table *htab
1022    = (struct elf_metag_link_hash_table *) obfd->link.hash;
1023
1024  bfd_hash_table_free (&htab->bstab);
1025  _bfd_elf_link_hash_table_free (obfd);
1026}
1027
1028/* Create the derived linker hash table.  The Meta ELF port uses the derived
1029   hash table to keep information specific to the Meta ELF linker (without
1030   using static variables).  */
1031
1032static struct bfd_link_hash_table *
1033elf_metag_link_hash_table_create (bfd *abfd)
1034{
1035  struct elf_metag_link_hash_table *htab;
1036  bfd_size_type amt = sizeof (*htab);
1037
1038  htab = bfd_zmalloc (amt);
1039  if (htab == NULL)
1040    return NULL;
1041
1042  if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd,
1043				      metag_link_hash_newfunc,
1044				      sizeof (struct elf_metag_link_hash_entry),
1045				      METAG_ELF_DATA))
1046    {
1047      free (htab);
1048      return NULL;
1049    }
1050
1051  /* Init the stub hash table too.  */
1052  if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
1053			    sizeof (struct elf_metag_stub_hash_entry)))
1054    {
1055      _bfd_elf_link_hash_table_free (abfd);
1056      return NULL;
1057    }
1058  htab->etab.root.hash_table_free = elf_metag_link_hash_table_free;
1059
1060  return &htab->etab.root;
1061}
1062
1063/* Section name for stubs is the associated section name plus this
1064   string.  */
1065#define STUB_SUFFIX ".stub"
1066
1067/* Build a name for an entry in the stub hash table.  */
1068
1069static char *
1070metag_stub_name (const asection *input_section,
1071		 const asection *sym_sec,
1072		 const struct elf_metag_link_hash_entry *hh,
1073		 const Elf_Internal_Rela *rel)
1074{
1075  char *stub_name;
1076  bfd_size_type len;
1077
1078  if (hh)
1079    {
1080      len = 8 + 1 + strlen (hh->eh.root.root.string) + 1 + 8 + 1;
1081      stub_name = bfd_malloc (len);
1082      if (stub_name != NULL)
1083	{
1084	  sprintf (stub_name, "%08x_%s+%x",
1085		   input_section->id & 0xffffffff,
1086		   hh->eh.root.root.string,
1087		   (int) rel->r_addend & 0xffffffff);
1088	}
1089    }
1090  else
1091    {
1092      len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
1093      stub_name = bfd_malloc (len);
1094      if (stub_name != NULL)
1095	{
1096	  sprintf (stub_name, "%08x_%x:%x+%x",
1097		   input_section->id & 0xffffffff,
1098		   sym_sec->id & 0xffffffff,
1099		   (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
1100		   (int) rel->r_addend & 0xffffffff);
1101	}
1102    }
1103  return stub_name;
1104}
1105
1106/* Look up an entry in the stub hash.  Stub entries are cached because
1107   creating the stub name takes a bit of time.  */
1108
1109static struct elf_metag_stub_hash_entry *
1110metag_get_stub_entry (const asection *input_section,
1111		      const asection *sym_sec,
1112		      struct elf_metag_link_hash_entry *hh,
1113		      const Elf_Internal_Rela *rel,
1114		      struct elf_metag_link_hash_table *htab)
1115{
1116  struct elf_metag_stub_hash_entry *hsh;
1117  const asection *id_sec;
1118
1119  /* If this input section is part of a group of sections sharing one
1120     stub section, then use the id of the first section in the group.
1121     Stub names need to include a section id, as there may well be
1122     more than one stub used to reach say, printf, and we need to
1123     distinguish between them.  */
1124  id_sec = htab->stub_group[input_section->id].link_sec;
1125
1126  if (hh != NULL && hh->hsh_cache != NULL
1127      && hh->hsh_cache->hh == hh
1128      && hh->hsh_cache->id_sec == id_sec)
1129    {
1130      hsh = hh->hsh_cache;
1131    }
1132  else
1133    {
1134      char *stub_name;
1135
1136      stub_name = metag_stub_name (id_sec, sym_sec, hh, rel);
1137      if (stub_name == NULL)
1138	return NULL;
1139
1140      hsh = metag_stub_hash_lookup (&htab->bstab,
1141				    stub_name, FALSE, FALSE);
1142
1143      if (hh != NULL)
1144	hh->hsh_cache = hsh;
1145
1146      free (stub_name);
1147    }
1148
1149  return hsh;
1150}
1151
1152/* Add a new stub entry to the stub hash.  Not all fields of the new
1153   stub entry are initialised.  */
1154
1155static struct elf_metag_stub_hash_entry *
1156metag_add_stub (const char *stub_name,
1157		asection *section,
1158		struct elf_metag_link_hash_table *htab)
1159{
1160  asection *link_sec;
1161  asection *stub_sec;
1162  struct elf_metag_stub_hash_entry *hsh;
1163
1164  link_sec = htab->stub_group[section->id].link_sec;
1165  stub_sec = htab->stub_group[section->id].stub_sec;
1166  if (stub_sec == NULL)
1167    {
1168      stub_sec = htab->stub_group[link_sec->id].stub_sec;
1169      if (stub_sec == NULL)
1170	{
1171	  size_t namelen;
1172	  bfd_size_type len;
1173	  char *s_name;
1174
1175	  namelen = strlen (link_sec->name);
1176	  len = namelen + sizeof (STUB_SUFFIX);
1177	  s_name = bfd_alloc (htab->stub_bfd, len);
1178	  if (s_name == NULL)
1179	    return NULL;
1180
1181	  memcpy (s_name, link_sec->name, namelen);
1182	  memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
1183
1184	  stub_sec = (*htab->add_stub_section) (s_name, link_sec);
1185	  if (stub_sec == NULL)
1186	    return NULL;
1187	  htab->stub_group[link_sec->id].stub_sec = stub_sec;
1188	}
1189      htab->stub_group[section->id].stub_sec = stub_sec;
1190    }
1191
1192  /* Enter this entry into the linker stub hash table.  */
1193  hsh = metag_stub_hash_lookup (&htab->bstab, stub_name,
1194				TRUE, FALSE);
1195  if (hsh == NULL)
1196    {
1197      /* xgettext:c-format */
1198      _bfd_error_handler (_("%B: cannot create stub entry %s"),
1199			  section->owner, stub_name);
1200      return NULL;
1201    }
1202
1203  hsh->stub_sec = stub_sec;
1204  hsh->stub_offset = 0;
1205  hsh->id_sec = link_sec;
1206  return hsh;
1207}
1208
1209/* Check a signed integer value can be represented in the given number
1210   of bits.  */
1211
1212static bfd_boolean
1213within_signed_range (int value, unsigned int bits)
1214{
1215  int min_val = -(1 << (bits - 1));
1216  int max_val = (1 << (bits - 1)) - 1;
1217  return (value <= max_val) && (value >= min_val);
1218}
1219
1220/* Perform a relocation as part of a final link.  */
1221
1222static bfd_reloc_status_type
1223metag_final_link_relocate (reloc_howto_type *howto,
1224			   bfd *input_bfd,
1225			   asection *input_section,
1226			   bfd_byte *contents,
1227			   Elf_Internal_Rela *rel,
1228			   bfd_vma relocation,
1229			   struct elf_metag_link_hash_entry *hh,
1230			   struct elf_metag_link_hash_table *htab,
1231			   asection *sym_sec)
1232{
1233  bfd_reloc_status_type r = bfd_reloc_ok;
1234  bfd_byte *hit_data = contents + rel->r_offset;
1235  int opcode, op_shift, op_extended, l1, l2;
1236  bfd_signed_vma srel, addend = rel->r_addend;
1237  struct elf_metag_stub_hash_entry *hsh = NULL;
1238  bfd_vma location;
1239
1240  /* Find out where we are and where we're going.  */
1241  location = (rel->r_offset +
1242	      input_section->output_offset +
1243	      input_section->output_section->vma);
1244
1245  switch (howto->type)
1246    {
1247    case R_METAG_RELBRANCH:
1248    case R_METAG_RELBRANCH_PLT:
1249      /* Make it a pc relative offset.  */
1250      relocation -= location;
1251      break;
1252    case R_METAG_TLS_GD:
1253    case R_METAG_TLS_IE:
1254      relocation -= elf_gp (input_section->output_section->owner);
1255      break;
1256    default:
1257      break;
1258    }
1259
1260  switch (howto->type)
1261    {
1262    case R_METAG_RELBRANCH_PLT:
1263    case R_METAG_RELBRANCH:
1264      opcode = bfd_get_32 (input_bfd, hit_data);
1265
1266      srel = (bfd_signed_vma) relocation;
1267      srel += addend;
1268
1269      /* If the branch is out of reach, then redirect the
1270	 call to the local stub for this function.  */
1271      if (srel > ((1 << (BRANCH_BITS + 1)) - 1) ||
1272	  (srel < - (1 << (BRANCH_BITS + 1))))
1273	{
1274	  if (sym_sec == NULL)
1275	    break;
1276
1277	  hsh = metag_get_stub_entry (input_section, sym_sec,
1278				      hh, rel, htab);
1279	  if (hsh == NULL)
1280	    return bfd_reloc_undefined;
1281
1282	  /* Munge up the value and addend so that we call the stub
1283	     rather than the procedure directly.  */
1284	  srel = (hsh->stub_offset
1285		  + hsh->stub_sec->output_offset
1286		  + hsh->stub_sec->output_section->vma);
1287	  srel -= location;
1288	}
1289
1290      srel = srel >> 2;
1291
1292      if (!within_signed_range (srel, BRANCH_BITS))
1293	{
1294	  if (hh && hh->eh.root.type == bfd_link_hash_undefweak)
1295	    srel = 0;
1296	  else
1297	    return bfd_reloc_overflow;
1298	}
1299
1300      opcode &= ~(0x7ffff << 5);
1301      opcode |= ((srel & 0x7ffff) << 5);
1302
1303      bfd_put_32 (input_bfd, opcode, hit_data);
1304      break;
1305    case R_METAG_GETSETOFF:
1306    case R_METAG_GETSET_GOT:
1307    case R_METAG_GETSET_GOTOFF:
1308      opcode = bfd_get_32 (input_bfd, hit_data);
1309
1310      srel = (bfd_signed_vma) relocation;
1311      srel += addend;
1312
1313      /* Is this a standard or extended GET/SET?  */
1314      if ((opcode & 0xf0000000) == 0xa0000000)
1315	{
1316	  /* Extended GET/SET.  */
1317	  l1 = opcode & 0x2;
1318	  l2 = opcode & 0x4;
1319	  op_extended = 1;
1320	}
1321      else
1322	{
1323	  /* Standard GET/SET.  */
1324	  l1 = opcode & 0x01000000;
1325	  l2 = opcode & 0x04000000;
1326	  op_extended = 0;
1327	}
1328
1329      /* Calculate the width of the GET/SET and how much we need to
1330	 shift the result by.  */
1331      if (l2)
1332	if (l1)
1333	  op_shift = 3;
1334	else
1335	  op_shift = 2;
1336      else
1337	if (l1)
1338	  op_shift = 1;
1339	else
1340	  op_shift = 0;
1341
1342      /* GET/SET offsets are scaled by the width of the transfer.  */
1343      srel = srel >> op_shift;
1344
1345      /* Extended GET/SET has signed 12 bits of offset, standard has
1346	 signed 6 bits.  */
1347      if (op_extended)
1348	{
1349	  if (!within_signed_range (srel, 12))
1350	    {
1351	      if (hh && hh->eh.root.type == bfd_link_hash_undefweak)
1352		srel = 0;
1353	      else
1354		return bfd_reloc_overflow;
1355	    }
1356	  opcode &= ~(0xfff << 7);
1357	  opcode |= ((srel & 0xfff) << 7);
1358	}
1359      else
1360	{
1361	  if (!within_signed_range (srel, 5))
1362	    {
1363	      if (hh && hh->eh.root.type == bfd_link_hash_undefweak)
1364		srel = 0;
1365	      else
1366		return bfd_reloc_overflow;
1367	    }
1368	  opcode &= ~(0x3f << 8);
1369	  opcode |= ((srel & 0x3f) << 8);
1370	}
1371
1372      bfd_put_32 (input_bfd, opcode, hit_data);
1373      break;
1374    case R_METAG_TLS_GD:
1375    case R_METAG_TLS_LDM:
1376      opcode = bfd_get_32 (input_bfd, hit_data);
1377
1378      if ((bfd_signed_vma)relocation < 0)
1379       {
1380	 /* sign extend immediate */
1381	 if ((opcode & 0xf2000001) == 0x02000000)
1382	  {
1383	    /* ADD De.e,Dx.r,#I16 */
1384	    /* set SE bit */
1385	    opcode |= (1 << 1);
1386	  } else
1387	    return bfd_reloc_overflow;
1388       }
1389
1390      bfd_put_32 (input_bfd, opcode, hit_data);
1391
1392      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1393				    contents, rel->r_offset,
1394				    relocation, rel->r_addend);
1395      break;
1396    default:
1397      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1398				    contents, rel->r_offset,
1399				    relocation, rel->r_addend);
1400    }
1401
1402  return r;
1403}
1404
1405/* This is defined because R_METAG_NONE != 0...
1406   See RELOC_AGAINST_DISCARDED_SECTION for details.  */
1407#define METAG_RELOC_AGAINST_DISCARDED_SECTION(info, input_bfd, input_section, \
1408					      rel, relend, howto, contents) \
1409  {									\
1410    _bfd_clear_contents (howto, input_bfd, input_section,		\
1411			 contents + rel->r_offset);			\
1412									\
1413    if (bfd_link_relocatable (info)					\
1414	&& (input_section->flags & SEC_DEBUGGING))			\
1415      {									\
1416	/* Only remove relocations in debug sections since other	\
1417	   sections may require relocations.  */			\
1418	Elf_Internal_Shdr *rel_hdr;					\
1419									\
1420	rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section); \
1421									\
1422	/* Avoid empty output section.  */				\
1423	if (rel_hdr->sh_size > rel_hdr->sh_entsize)			\
1424	  {								\
1425	    rel_hdr->sh_size -= rel_hdr->sh_entsize;			\
1426	    rel_hdr = _bfd_elf_single_rel_hdr (input_section);		\
1427	    rel_hdr->sh_size -= rel_hdr->sh_entsize;			\
1428									\
1429	    memmove (rel, rel + 1, (relend - rel) * sizeof (*rel));	\
1430									\
1431	    input_section->reloc_count--;				\
1432	    relend--;							\
1433	    rel--;							\
1434	    continue;							\
1435	  }								\
1436      }									\
1437									\
1438    rel->r_info = R_METAG_NONE;						\
1439    rel->r_addend = 0;							\
1440    continue;								\
1441  }
1442
1443/* Relocate a META ELF section.
1444
1445The RELOCATE_SECTION function is called by the new ELF backend linker
1446to handle the relocations for a section.
1447
1448The relocs are always passed as Rela structures; if the section
1449actually uses Rel structures, the r_addend field will always be
1450zero.
1451
1452This function is responsible for adjusting the section contents as
1453necessary, and (if using Rela relocs and generating a relocatable
1454output file) adjusting the reloc addend as necessary.
1455
1456This function does not have to worry about setting the reloc
1457address or the reloc symbol index.
1458
1459LOCAL_SYMS is a pointer to the swapped in local symbols.
1460
1461LOCAL_SECTIONS is an array giving the section in the input file
1462corresponding to the st_shndx field of each local symbol.
1463
1464The global hash table entry for the global symbols can be found
1465via elf_sym_hashes (input_bfd).
1466
1467When generating relocatable output, this function must handle
1468STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1469going to be the section symbol corresponding to the output
1470section, which means that the addend must be adjusted
1471accordingly.  */
1472
1473static bfd_boolean
1474elf_metag_relocate_section (bfd *output_bfd,
1475			    struct bfd_link_info *info,
1476			    bfd *input_bfd,
1477			    asection *input_section,
1478			    bfd_byte *contents,
1479			    Elf_Internal_Rela *relocs,
1480			    Elf_Internal_Sym *local_syms,
1481			    asection **local_sections)
1482{
1483  bfd_vma *local_got_offsets;
1484  Elf_Internal_Shdr *symtab_hdr;
1485  struct elf_link_hash_entry **eh_syms;
1486  struct elf_metag_link_hash_table *htab;
1487  Elf_Internal_Rela *rel;
1488  Elf_Internal_Rela *relend;
1489  asection *sreloc;
1490
1491  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1492  eh_syms = elf_sym_hashes (input_bfd);
1493  relend = relocs + input_section->reloc_count;
1494
1495  htab = metag_link_hash_table (info);
1496  local_got_offsets = elf_local_got_offsets (input_bfd);
1497
1498  sreloc = NULL;
1499
1500  for (rel = relocs; rel < relend; rel ++)
1501    {
1502      reloc_howto_type *howto;
1503      unsigned long r_symndx;
1504      Elf_Internal_Sym *sym;
1505      asection *sec;
1506      struct elf_metag_link_hash_entry *hh;
1507      bfd_vma relocation;
1508      bfd_reloc_status_type r;
1509      const char *name;
1510      int r_type;
1511
1512      r_type = ELF32_R_TYPE (rel->r_info);
1513
1514      if (r_type == R_METAG_GNU_VTINHERIT
1515	  || r_type == R_METAG_GNU_VTENTRY
1516	  || r_type == R_METAG_NONE)
1517	continue;
1518
1519      r_symndx = ELF32_R_SYM (rel->r_info);
1520
1521      howto  = elf_metag_howto_table + ELF32_R_TYPE (rel->r_info);
1522      hh     = NULL;
1523      sym    = NULL;
1524      sec    = NULL;
1525
1526      if (r_symndx < symtab_hdr->sh_info)
1527	{
1528	  sym = local_syms + r_symndx;
1529	  sec = local_sections [r_symndx];
1530	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1531
1532	  name = bfd_elf_string_from_elf_section
1533	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
1534	  name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1535	}
1536      else
1537	{
1538	  struct elf_link_hash_entry *eh;
1539	  bfd_boolean unresolved_reloc, warned, ignored;
1540
1541	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1542				   r_symndx, symtab_hdr, eh_syms,
1543				   eh, sec, relocation,
1544				   unresolved_reloc, warned, ignored);
1545
1546	  name = eh->root.root.string;
1547	  hh = (struct elf_metag_link_hash_entry *) eh;
1548	}
1549
1550      if (sec != NULL && discarded_section (sec))
1551	  METAG_RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1552						 rel, relend, howto, contents);
1553
1554      if (bfd_link_relocatable (info))
1555	continue;
1556
1557      switch (r_type)
1558	{
1559	case R_METAG_ADDR32:
1560	case R_METAG_RELBRANCH:
1561	  if ((input_section->flags & SEC_ALLOC) == 0)
1562	    break;
1563
1564	  if ((bfd_link_pic (info)
1565	       && r_symndx != STN_UNDEF
1566	       && (input_section->flags & SEC_ALLOC) != 0
1567	       && (r_type != R_METAG_RELBRANCH
1568		   || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
1569	      || (!bfd_link_pic (info)
1570		  && hh != NULL
1571		  && hh->eh.dynindx != -1
1572		  && !hh->eh.non_got_ref
1573		  && ((hh->eh.def_dynamic
1574		       && !hh->eh.def_regular)
1575		      || hh->eh.root.type == bfd_link_hash_undefweak
1576		      || hh->eh.root.type == bfd_link_hash_undefined)))
1577	    {
1578	      Elf_Internal_Rela outrel;
1579	      bfd_boolean skip, relocate;
1580	      bfd_byte *loc;
1581
1582	      /* When generating a shared object, these relocations
1583		 are copied into the output file to be resolved at run
1584		 time.  */
1585
1586	      sreloc = elf_section_data (input_section)->sreloc;
1587	      BFD_ASSERT (sreloc != NULL);
1588
1589	      skip = FALSE;
1590	      relocate = FALSE;
1591
1592	      outrel.r_offset = _bfd_elf_section_offset (output_bfd,
1593							 info,
1594							 input_section,
1595							 rel->r_offset);
1596	      if (outrel.r_offset == (bfd_vma) -1)
1597		skip = TRUE;
1598	      else if (outrel.r_offset == (bfd_vma) -2)
1599		skip = TRUE, relocate = TRUE;
1600	      outrel.r_offset += (input_section->output_section->vma
1601				  + input_section->output_offset);
1602
1603	      if (skip)
1604		{
1605		  memset (&outrel, 0, sizeof outrel);
1606		  outrel.r_info = ELF32_R_INFO (0, R_METAG_NONE);
1607		}
1608	      else if (r_type == R_METAG_RELBRANCH)
1609		{
1610		  BFD_ASSERT (hh != NULL && hh->eh.dynindx != -1);
1611		  outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
1612		  outrel.r_addend = rel->r_addend;
1613		}
1614	      else
1615		{
1616		  /* h->dynindx may be -1 if this symbol was marked to
1617		     become local.  */
1618		  if (hh == NULL
1619		      || ((info->symbolic || hh->eh.dynindx == -1)
1620			  && hh->eh.def_regular))
1621		    {
1622		      relocate = TRUE;
1623		      outrel.r_info = ELF32_R_INFO (0, R_METAG_RELATIVE);
1624		      outrel.r_addend = relocation + rel->r_addend;
1625		    }
1626		  else
1627		    {
1628		      BFD_ASSERT (hh->eh.dynindx != -1);
1629		      outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
1630		      outrel.r_addend = rel->r_addend;
1631		    }
1632		}
1633
1634	      loc = sreloc->contents;
1635	      loc += sreloc->reloc_count * sizeof(Elf32_External_Rela);
1636	      bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
1637	      ++sreloc->reloc_count;
1638
1639	      /* If this reloc is against an external symbol, we do
1640		 not want to fiddle with the addend.  Otherwise, we
1641		 need to include the symbol value so that it becomes
1642		 an addend for the dynamic reloc.  */
1643	      if (! relocate)
1644		continue;
1645	    }
1646	  break;
1647
1648	case R_METAG_RELBRANCH_PLT:
1649	  /* Relocation is to the entry for this symbol in the
1650	     procedure linkage table.  */
1651
1652	  if (hh == NULL)
1653	    break;
1654
1655	  if (hh->eh.forced_local)
1656	    break;
1657
1658	  if (hh->eh.plt.offset == (bfd_vma) -1 || htab->etab.splt == NULL)
1659	    {
1660	      /* We didn't make a PLT entry for this symbol.  This
1661		 happens when statically linking PIC code, or when
1662		 using -Bsymbolic.  */
1663	      break;
1664	    }
1665
1666	  relocation = (htab->etab.splt->output_section->vma
1667			+ htab->etab.splt->output_offset
1668			+ hh->eh.plt.offset);
1669	  break;
1670	case R_METAG_HI16_GOTPC:
1671	case R_METAG_LO16_GOTPC:
1672	  BFD_ASSERT (htab->etab.sgot != NULL);
1673
1674	  relocation = (htab->etab.sgot->output_section->vma +
1675			htab->etab.sgot->output_offset);
1676	  relocation += GOT_REG_OFFSET;
1677	  relocation -= (input_section->output_section->vma
1678			 + input_section->output_offset
1679			 + rel->r_offset);
1680	  break;
1681	case R_METAG_HI16_GOTOFF:
1682	case R_METAG_LO16_GOTOFF:
1683	case R_METAG_GETSET_GOTOFF:
1684	  BFD_ASSERT (htab->etab.sgot != NULL);
1685
1686	  relocation -= (htab->etab.sgot->output_section->vma +
1687			 htab->etab.sgot->output_offset);
1688	  relocation -= GOT_REG_OFFSET;
1689	  break;
1690	case R_METAG_GETSET_GOT:
1691	  {
1692	    bfd_vma off;
1693	    bfd_boolean do_got = 0;
1694
1695	    /* Relocation is to the entry for this symbol in the
1696	       global offset table.  */
1697	    if (hh != NULL)
1698	      {
1699		bfd_boolean dyn;
1700
1701		off = hh->eh.got.offset;
1702		dyn = htab->etab.dynamic_sections_created;
1703		if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
1704						       bfd_link_pic (info),
1705						       &hh->eh))
1706		  {
1707		    /* If we aren't going to call finish_dynamic_symbol,
1708		       then we need to handle initialisation of the .got
1709		       entry and create needed relocs here.  Since the
1710		       offset must always be a multiple of 4, we use the
1711		       least significant bit to record whether we have
1712		       initialised it already.  */
1713		    if ((off & 1) != 0)
1714		      off &= ~1;
1715		    else
1716		      {
1717			hh->eh.got.offset |= 1;
1718			do_got = 1;
1719		      }
1720		  }
1721	      }
1722	    else
1723	      {
1724		/* Local symbol case.  */
1725		if (local_got_offsets == NULL)
1726		  abort ();
1727
1728		off = local_got_offsets[r_symndx];
1729
1730		/* The offset must always be a multiple of 4.  We use
1731		   the least significant bit to record whether we have
1732		   already generated the necessary reloc.  */
1733		if ((off & 1) != 0)
1734		  off &= ~1;
1735		else
1736		  {
1737		    local_got_offsets[r_symndx] |= 1;
1738		    do_got = 1;
1739		  }
1740	      }
1741
1742	    if (do_got)
1743	      {
1744		if (bfd_link_pic (info))
1745		  {
1746		    /* Output a dynamic relocation for this GOT entry.
1747		       In this case it is relative to the base of the
1748		       object because the symbol index is zero.  */
1749		    Elf_Internal_Rela outrel;
1750		    bfd_byte *loc;
1751		    asection *s = htab->etab.srelgot;
1752
1753		    outrel.r_offset = (off
1754				       + htab->etab.sgot->output_offset
1755				       + htab->etab.sgot->output_section->vma);
1756		    outrel.r_info = ELF32_R_INFO (0, R_METAG_RELATIVE);
1757		    outrel.r_addend = relocation;
1758		    loc = s->contents;
1759		    loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
1760		    bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1761		  }
1762		else
1763		  bfd_put_32 (output_bfd, relocation,
1764			      htab->etab.sgot->contents + off);
1765	      }
1766
1767	    if (off >= (bfd_vma) -2)
1768	      abort ();
1769
1770	    relocation = off - GOT_REG_OFFSET;
1771	  }
1772	  break;
1773	case R_METAG_TLS_GD:
1774	case R_METAG_TLS_IE:
1775	  {
1776	    /* XXXMJF There is room here for optimisations. For example
1777	       converting from GD->IE, etc.  */
1778	    bfd_vma off;
1779	    int indx;
1780	    char tls_type;
1781
1782	    if (htab->etab.sgot == NULL)
1783	      abort();
1784
1785	    indx = 0;
1786	    if (hh != NULL)
1787	      {
1788		bfd_boolean dyn;
1789		dyn = htab->etab.dynamic_sections_created;
1790
1791		if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
1792						     bfd_link_pic (info),
1793						     &hh->eh)
1794		    && (!bfd_link_pic (info)
1795			|| !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
1796		  {
1797		    indx = hh->eh.dynindx;
1798		  }
1799		off = hh->eh.got.offset;
1800		tls_type = hh->tls_type;
1801	      }
1802	    else
1803	      {
1804		/* Local symbol case.  */
1805		if (local_got_offsets == NULL)
1806		  abort ();
1807
1808		off = local_got_offsets[r_symndx];
1809		tls_type = metag_elf_local_got_tls_type (input_bfd) [r_symndx];
1810	      }
1811
1812	    if (tls_type == GOT_UNKNOWN)
1813	      abort ();
1814
1815	    if ((off & 1) != 0)
1816	      off &= ~1;
1817	    else
1818	      {
1819		bfd_boolean need_relocs = FALSE;
1820		Elf_Internal_Rela outrel;
1821		bfd_byte *loc = NULL;
1822		int cur_off = off;
1823
1824		/* The GOT entries have not been initialized yet.  Do it
1825		   now, and emit any relocations.  If both an IE GOT and a
1826		   GD GOT are necessary, we emit the GD first.  */
1827
1828		if ((bfd_link_pic (info) || indx != 0)
1829		    && (hh == NULL
1830			|| ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
1831			|| hh->eh.root.type != bfd_link_hash_undefweak))
1832		  {
1833		    need_relocs = TRUE;
1834		    loc = htab->etab.srelgot->contents;
1835		    /* FIXME (CAO): Should this be reloc_count++ ? */
1836		    loc += htab->etab.srelgot->reloc_count * sizeof (Elf32_External_Rela);
1837		  }
1838
1839		if (tls_type & GOT_TLS_GD)
1840		  {
1841		    if (need_relocs)
1842		      {
1843			outrel.r_offset = (cur_off
1844					   + htab->etab.sgot->output_section->vma
1845					   + htab->etab.sgot->output_offset);
1846			outrel.r_info = ELF32_R_INFO (indx, R_METAG_TLS_DTPMOD);
1847			outrel.r_addend = 0;
1848			bfd_put_32 (output_bfd, 0, htab->etab.sgot->contents + cur_off);
1849
1850			bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1851			htab->etab.srelgot->reloc_count++;
1852			loc += sizeof (Elf32_External_Rela);
1853
1854			if (indx == 0)
1855			  bfd_put_32 (output_bfd, 0,
1856				      htab->etab.sgot->contents + cur_off + 4);
1857			else
1858			  {
1859			    bfd_put_32 (output_bfd, 0,
1860					htab->etab.sgot->contents + cur_off + 4);
1861			    outrel.r_info = ELF32_R_INFO (indx,
1862						      R_METAG_TLS_DTPOFF);
1863			    outrel.r_offset += 4;
1864			    bfd_elf32_swap_reloca_out (output_bfd,
1865						       &outrel, loc);
1866			    htab->etab.srelgot->reloc_count++;
1867			    loc += sizeof (Elf32_External_Rela);
1868			  }
1869		      }
1870		    else
1871		      {
1872			/* We don't support changing the TLS model.  */
1873			/* PR 20675 */
1874			if (bfd_link_pic (info))
1875			  _bfd_error_handler (_("%B(%A): multiple TLS models are not supported"),
1876					      input_bfd, input_section, name);
1877			else
1878			  _bfd_error_handler (_("%B(%A): shared library symbol %s encountered whilst performing a static link"),
1879					      input_bfd, input_section, name);
1880			return FALSE;
1881		      }
1882
1883		    cur_off += 8;
1884		  }
1885
1886		if (tls_type & GOT_TLS_IE)
1887		  {
1888		    if (need_relocs)
1889		      {
1890			outrel.r_offset = (cur_off
1891					   + htab->etab.sgot->output_section->vma
1892					   + htab->etab.sgot->output_offset);
1893			outrel.r_info = ELF32_R_INFO (indx, R_METAG_TLS_TPOFF);
1894
1895			if (indx == 0)
1896			  outrel.r_addend = relocation - dtpoff_base (info);
1897			else
1898			  outrel.r_addend = 0;
1899
1900			bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1901			htab->etab.srelgot->reloc_count++;
1902			loc += sizeof (Elf32_External_Rela);
1903		      }
1904		    else
1905		      bfd_put_32 (output_bfd, tpoff (info, relocation),
1906				  htab->etab.sgot->contents + cur_off);
1907
1908		    cur_off += 4;
1909		  }
1910
1911		  if (hh != NULL)
1912		    hh->eh.got.offset |= 1;
1913		  else
1914		    local_got_offsets[r_symndx] |= 1;
1915	      }
1916
1917	    /* Add the base of the GOT to the relocation value.  */
1918	    relocation = off - GOT_REG_OFFSET;
1919
1920	    break;
1921	  }
1922
1923	case R_METAG_TLS_IENONPIC_HI16:
1924	case R_METAG_TLS_IENONPIC_LO16:
1925	case R_METAG_TLS_LE_HI16:
1926	case R_METAG_TLS_LE_LO16:
1927	  if (bfd_link_pic (info))
1928	    {
1929	      _bfd_error_handler
1930		/* xgettext:c-format */
1931		(_("%B(%A+0x%lx): R_METAG_TLS_LE/IENONPIC relocation not permitted in shared object"),
1932		 input_bfd, input_section,
1933		 (long) rel->r_offset, howto->name);
1934	      return FALSE;
1935	    }
1936	  else
1937	    relocation = tpoff (info, relocation);
1938	  break;
1939	case R_METAG_TLS_LDO_HI16:
1940	case R_METAG_TLS_LDO_LO16:
1941	  if (! bfd_link_pic (info))
1942	    relocation = tpoff (info, relocation);
1943	  else
1944	    relocation -= dtpoff_base (info);
1945	  break;
1946	case R_METAG_TLS_LDM:
1947	  {
1948	    bfd_vma off;
1949
1950	    if (htab->etab.sgot == NULL)
1951	      abort();
1952	    off = htab->tls_ldm_got.offset;
1953	    if (off & 1)
1954	      off &= ~1;
1955	    else
1956	      {
1957		Elf_Internal_Rela outrel;
1958		bfd_byte *loc;
1959
1960		outrel.r_offset = (off
1961				   + htab->etab.sgot->output_section->vma
1962				   + htab->etab.sgot->output_offset);
1963
1964		outrel.r_addend = 0;
1965		outrel.r_info = ELF32_R_INFO (0, R_METAG_TLS_DTPMOD);
1966		loc = htab->etab.srelgot->contents;
1967		loc += htab->etab.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
1968		bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1969		htab->tls_ldm_got.offset |= 1;
1970	      }
1971
1972	    relocation = off - GOT_REG_OFFSET;
1973	    break;
1974	  }
1975	default:
1976	  break;
1977	}
1978
1979      r = metag_final_link_relocate (howto, input_bfd, input_section,
1980				     contents, rel, relocation, hh, htab,
1981				     sec);
1982
1983      if (r != bfd_reloc_ok)
1984	{
1985	  const char * msg = (const char *) NULL;
1986
1987	  switch (r)
1988	    {
1989	    case bfd_reloc_overflow:
1990	      (*info->callbacks->reloc_overflow)
1991		(info, (hh ? &hh->eh.root : NULL), name, howto->name,
1992		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1993	      break;
1994
1995	    case bfd_reloc_undefined:
1996	      (*info->callbacks->undefined_symbol)
1997		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
1998	      break;
1999
2000	    case bfd_reloc_outofrange:
2001	      msg = _("internal error: out of range error");
2002	      break;
2003
2004	    case bfd_reloc_notsupported:
2005	      msg = _("internal error: unsupported relocation error");
2006	      break;
2007
2008	    case bfd_reloc_dangerous:
2009	      msg = _("internal error: dangerous relocation");
2010	      break;
2011
2012	    default:
2013	      msg = _("internal error: unknown error");
2014	      break;
2015	    }
2016
2017	  if (msg)
2018	    (*info->callbacks->warning) (info, msg, name, input_bfd,
2019					 input_section, rel->r_offset);
2020	}
2021    }
2022
2023  return TRUE;
2024}
2025
2026/* Create the .plt and .got sections, and set up our hash table
2027   short-cuts to various dynamic sections.  */
2028
2029static bfd_boolean
2030elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2031{
2032  struct elf_metag_link_hash_table *htab;
2033  struct elf_link_hash_entry *eh;
2034  struct bfd_link_hash_entry *bh;
2035  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2036
2037  /* Don't try to create the .plt and .got twice.  */
2038  htab = metag_link_hash_table (info);
2039  if (htab->etab.splt != NULL)
2040    return TRUE;
2041
2042  /* Call the generic code to do most of the work.  */
2043  if (! _bfd_elf_create_dynamic_sections (abfd, info))
2044    return FALSE;
2045
2046  /* The header goes at the start of the dynamic .got section, which
2047     is placed after the dynamic .got.plt section.  ie. The header is
2048     not necessarily at the start of the output .got section.  */
2049  htab->etab.sgot->size += 12;
2050
2051  /* Define the symbol __GLOBAL_OFFSET_TABLE__ on the header.  */
2052  bh = NULL;
2053  if (!(_bfd_generic_link_add_one_symbol
2054	(info, abfd, "__GLOBAL_OFFSET_TABLE__", BSF_GLOBAL, htab->etab.sgot,
2055	 (bfd_vma) 0, NULL, FALSE, bed->collect, &bh)))
2056    return FALSE;
2057  eh = (struct elf_link_hash_entry *) bh;
2058  eh->def_regular = 1;
2059  eh->type = STT_OBJECT;
2060  eh->other = STV_HIDDEN;
2061
2062  if (! bfd_link_executable (info)
2063      && ! bfd_elf_link_record_dynamic_symbol (info, eh))
2064    return FALSE;
2065
2066  htab->etab.hgot = eh;
2067
2068  return TRUE;
2069}
2070
2071/* Look through the relocs for a section during the first phase, and
2072   calculate needed space in the global offset table, procedure linkage
2073   table, and dynamic reloc sections.  At this point we haven't
2074   necessarily read all the input files.  */
2075
2076static bfd_boolean
2077elf_metag_check_relocs (bfd *abfd,
2078			struct bfd_link_info *info,
2079			asection *sec,
2080			const Elf_Internal_Rela *relocs)
2081{
2082  Elf_Internal_Shdr *symtab_hdr;
2083  struct elf_link_hash_entry **eh_syms;
2084  const Elf_Internal_Rela *rel;
2085  const Elf_Internal_Rela *rel_end;
2086  struct elf_metag_link_hash_table *htab;
2087  asection *sreloc;
2088  bfd *dynobj;
2089  int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
2090
2091  if (bfd_link_relocatable (info))
2092    return TRUE;
2093
2094  htab = metag_link_hash_table (info);
2095  dynobj = htab->etab.dynobj;
2096  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2097  eh_syms = elf_sym_hashes (abfd);
2098  sreloc = NULL;
2099
2100  if (htab == NULL)
2101    return FALSE;
2102
2103  rel_end = relocs + sec->reloc_count;
2104  for (rel = relocs; rel < rel_end; rel++)
2105    {
2106      int r_type;
2107      struct elf_metag_link_hash_entry *hh;
2108      Elf_Internal_Sym *isym;
2109      unsigned long r_symndx;
2110
2111      r_symndx = ELF32_R_SYM (rel->r_info);
2112      r_type = ELF32_R_TYPE (rel->r_info);
2113      if (r_symndx < symtab_hdr->sh_info)
2114	{
2115	  /* A local symbol.  */
2116	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2117					abfd, r_symndx);
2118	  if (isym == NULL)
2119	    return FALSE;
2120
2121	  hh = NULL;
2122	}
2123      else
2124	{
2125	  isym = NULL;
2126
2127	  hh = (struct elf_metag_link_hash_entry *)
2128	    eh_syms[r_symndx - symtab_hdr->sh_info];
2129	  while (hh->eh.root.type == bfd_link_hash_indirect
2130		 || hh->eh.root.type == bfd_link_hash_warning)
2131	    hh = (struct elf_metag_link_hash_entry *) hh->eh.root.u.i.link;
2132
2133	  /* PR15323, ref flags aren't set for references in the same
2134	     object.  */
2135	  hh->eh.root.non_ir_ref = 1;
2136	}
2137
2138      /* Some relocs require a global offset table.  */
2139      if (htab->etab.sgot == NULL)
2140	{
2141	  switch (r_type)
2142	    {
2143	    case R_METAG_TLS_GD:
2144	    case R_METAG_TLS_LDM:
2145	    case R_METAG_TLS_IE:
2146	      if (bfd_link_pic (info))
2147		info->flags |= DF_STATIC_TLS;
2148	      /* Fall through.  */
2149
2150	    case R_METAG_HI16_GOTOFF:
2151	    case R_METAG_LO16_GOTOFF:
2152	    case R_METAG_GETSET_GOTOFF:
2153	    case R_METAG_GETSET_GOT:
2154	    case R_METAG_HI16_GOTPC:
2155	    case R_METAG_LO16_GOTPC:
2156	      if (dynobj == NULL)
2157		htab->etab.dynobj = dynobj = abfd;
2158	      if (!elf_metag_create_dynamic_sections (dynobj, info))
2159		return FALSE;
2160	      break;
2161
2162	    default:
2163	      break;
2164	    }
2165	}
2166
2167      switch (r_type)
2168	{
2169	case R_METAG_TLS_IE:
2170	case R_METAG_TLS_GD:
2171	case R_METAG_GETSET_GOT:
2172	  switch (r_type)
2173	    {
2174	    default:
2175	      tls_type = GOT_NORMAL;
2176	      break;
2177	    case R_METAG_TLS_IE:
2178	      tls_type = GOT_TLS_IE;
2179	      break;
2180	    case R_METAG_TLS_GD:
2181	      tls_type = GOT_TLS_GD;
2182	      break;
2183	    }
2184
2185	  if (hh != NULL)
2186	    {
2187	      hh->eh.got.refcount += 1;
2188	      old_tls_type = hh->tls_type;
2189	    }
2190	  else
2191	    {
2192	      bfd_signed_vma *local_got_refcounts;
2193
2194	      /* This is a global offset table entry for a local
2195		 symbol.  */
2196	      local_got_refcounts = elf_local_got_refcounts (abfd);
2197	      if (local_got_refcounts == NULL)
2198		{
2199		  bfd_size_type size;
2200
2201		  size = symtab_hdr->sh_info;
2202		  size *= sizeof (bfd_signed_vma);
2203		  /* Add in space to store the local GOT TLS types.  */
2204		  size += symtab_hdr->sh_info;
2205		  local_got_refcounts = ((bfd_signed_vma *)
2206					 bfd_zalloc (abfd, size));
2207		  if (local_got_refcounts == NULL)
2208		    return FALSE;
2209		  elf_local_got_refcounts (abfd) = local_got_refcounts;
2210		  memset (metag_elf_local_got_tls_type (abfd),
2211			  GOT_UNKNOWN, symtab_hdr->sh_info);
2212		}
2213	      local_got_refcounts[r_symndx] += 1;
2214	      old_tls_type = metag_elf_local_got_tls_type (abfd) [r_symndx];
2215	    }
2216
2217	  if (old_tls_type != tls_type)
2218	    {
2219	      if (hh != NULL)
2220		{
2221		  hh->tls_type = tls_type;
2222		}
2223	      else
2224		{
2225		  metag_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
2226		}
2227	    }
2228
2229	  break;
2230
2231	case R_METAG_TLS_LDM:
2232	  metag_link_hash_table (info)->tls_ldm_got.refcount += 1;
2233	  break;
2234
2235	case R_METAG_RELBRANCH_PLT:
2236	  /* This symbol requires a procedure linkage table entry.  We
2237	     actually build the entry in adjust_dynamic_symbol,
2238	     because this might be a case of linking PIC code without
2239	     linking in any dynamic objects, in which case we don't
2240	     need to generate a procedure linkage table after all.  */
2241
2242	  /* If this is a local symbol, we resolve it directly without
2243	     creating a procedure linkage table entry.  */
2244	  if (hh == NULL)
2245	    continue;
2246
2247	  if (hh->eh.forced_local)
2248	    break;
2249
2250	  hh->eh.needs_plt = 1;
2251	  hh->eh.plt.refcount += 1;
2252	  break;
2253
2254	case R_METAG_HIADDR16:
2255	case R_METAG_LOADDR16:
2256	  /* Let's help debug shared library creation.  These relocs
2257	     cannot be used in shared libs.  Don't error out for
2258	     sections we don't care about, such as debug sections or
2259	     non-constant sections.  */
2260	  if (bfd_link_pic (info)
2261	      && (sec->flags & SEC_ALLOC) != 0
2262	      && (sec->flags & SEC_READONLY) != 0)
2263	    {
2264	      const char *name;
2265
2266	      if (hh)
2267		name = hh->eh.root.root.string;
2268	      else
2269		name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
2270	      _bfd_error_handler
2271		/* xgettext:c-format */
2272		(_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
2273		 abfd, elf_metag_howto_table[r_type].name, name);
2274	      bfd_set_error (bfd_error_bad_value);
2275	      return FALSE;
2276	    }
2277
2278	  /* Fall through.  */
2279	case R_METAG_ADDR32:
2280	case R_METAG_RELBRANCH:
2281	case R_METAG_GETSETOFF:
2282	  if (hh != NULL && !bfd_link_pic (info))
2283	    {
2284	      hh->eh.non_got_ref = 1;
2285	      hh->eh.plt.refcount += 1;
2286	    }
2287
2288	  /* If we are creating a shared library, and this is a reloc
2289	     against a global symbol, or a non PC relative reloc
2290	     against a local symbol, then we need to copy the reloc
2291	     into the shared library.  However, if we are linking with
2292	     -Bsymbolic, we do not need to copy a reloc against a
2293	     global symbol which is defined in an object we are
2294	     including in the link (i.e., DEF_REGULAR is set).  At
2295	     this point we have not seen all the input files, so it is
2296	     possible that DEF_REGULAR is not set now but will be set
2297	     later (it is never cleared).  We account for that
2298	     possibility below by storing information in the
2299	     dyn_relocs field of the hash table entry. A similar
2300	     situation occurs when creating shared libraries and symbol
2301	     visibility changes render the symbol local.
2302
2303	     If on the other hand, we are creating an executable, we
2304	     may need to keep relocations for symbols satisfied by a
2305	     dynamic library if we manage to avoid copy relocs for the
2306	     symbol.  */
2307	  if ((bfd_link_pic (info)
2308	       && (sec->flags & SEC_ALLOC) != 0
2309	       && (r_type != R_METAG_RELBRANCH
2310		   || (hh != NULL
2311		       && (! info->symbolic
2312			   || hh->eh.root.type == bfd_link_hash_defweak
2313			   || !hh->eh.def_regular))))
2314	      || (!bfd_link_pic (info)
2315		  && (sec->flags & SEC_ALLOC) != 0
2316		  && hh != NULL
2317		  && (hh->eh.root.type == bfd_link_hash_defweak
2318		      || !hh->eh.def_regular)))
2319	    {
2320	      struct elf_metag_dyn_reloc_entry *hdh_p;
2321	      struct elf_metag_dyn_reloc_entry **hdh_head;
2322
2323	      if (dynobj == NULL)
2324		htab->etab.dynobj = dynobj = abfd;
2325
2326	      /* When creating a shared object, we must copy these
2327		 relocs into the output file.  We create a reloc
2328		 section in dynobj and make room for the reloc.  */
2329	      if (sreloc == NULL)
2330		{
2331		  sreloc = _bfd_elf_make_dynamic_reloc_section
2332		    (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
2333
2334		  if (sreloc == NULL)
2335		    {
2336		      bfd_set_error (bfd_error_bad_value);
2337		      return FALSE;
2338		    }
2339
2340		  elf_section_data (sec)->sreloc = sreloc;
2341		}
2342
2343	      /* If this is a global symbol, we count the number of
2344		 relocations we need for this symbol.  */
2345	      if (hh != NULL)
2346		hdh_head = &((struct elf_metag_link_hash_entry *) hh)->dyn_relocs;
2347	      else
2348		{
2349		  /* Track dynamic relocs needed for local syms too.  */
2350		  asection *sr;
2351		  void *vpp;
2352
2353		  sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
2354		  if (sr == NULL)
2355		    sr = sec;
2356
2357		  vpp = &elf_section_data (sr)->local_dynrel;
2358		  hdh_head = (struct elf_metag_dyn_reloc_entry **) vpp;
2359		}
2360
2361	      hdh_p = *hdh_head;
2362	      if (hdh_p == NULL || hdh_p->sec != sec)
2363		{
2364		  hdh_p = ((struct elf_metag_dyn_reloc_entry *)
2365			   bfd_alloc (dynobj, sizeof *hdh_p));
2366		  if (hdh_p == NULL)
2367		    return FALSE;
2368		  hdh_p->hdh_next = *hdh_head;
2369		  *hdh_head = hdh_p;
2370		  hdh_p->sec = sec;
2371		  hdh_p->count = 0;
2372		  hdh_p->relative_count = 0;
2373		}
2374
2375	      hdh_p->count += 1;
2376	      if (ELF32_R_TYPE (rel->r_info) == R_METAG_RELBRANCH)
2377		hdh_p->relative_count += 1;
2378	    }
2379	  break;
2380
2381	  /* This relocation describes the C++ object vtable hierarchy.
2382	     Reconstruct it for later use during GC.  */
2383	case R_METAG_GNU_VTINHERIT:
2384	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh,
2385					    rel->r_offset))
2386	    return FALSE;
2387	  break;
2388
2389	  /* This relocation describes which C++ vtable entries are actually
2390	     used.  Record for later use during GC.  */
2391	case R_METAG_GNU_VTENTRY:
2392	  BFD_ASSERT (hh != NULL);
2393	  if (hh != NULL
2394	      && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rel->r_addend))
2395	    return FALSE;
2396	  break;
2397	}
2398    }
2399
2400  return TRUE;
2401}
2402
2403/* Copy the extra info we tack onto an elf_link_hash_entry.  */
2404
2405static void
2406elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
2407				struct elf_link_hash_entry *eh_dir,
2408				struct elf_link_hash_entry *eh_ind)
2409{
2410  struct elf_metag_link_hash_entry *hh_dir, *hh_ind;
2411
2412  hh_dir = metag_elf_hash_entry (eh_dir);
2413  hh_ind = metag_elf_hash_entry (eh_ind);
2414
2415  if (hh_ind->dyn_relocs != NULL)
2416    {
2417      if (hh_dir->dyn_relocs != NULL)
2418	{
2419	  struct elf_metag_dyn_reloc_entry **hdh_pp;
2420	  struct elf_metag_dyn_reloc_entry *hdh_p;
2421
2422	  if (eh_ind->root.type == bfd_link_hash_indirect)
2423	    abort ();
2424
2425	  /* Add reloc counts against the weak sym to the strong sym
2426	     list.  Merge any entries against the same section.  */
2427	  for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2428	    {
2429	      struct elf_metag_dyn_reloc_entry *hdh_q;
2430
2431	      for (hdh_q = hh_dir->dyn_relocs; hdh_q != NULL;
2432		   hdh_q = hdh_q->hdh_next)
2433		if (hdh_q->sec == hdh_p->sec)
2434		  {
2435		    hdh_q->relative_count += hdh_p->relative_count;
2436		    hdh_q->count += hdh_p->count;
2437		    *hdh_pp = hdh_p->hdh_next;
2438		    break;
2439		  }
2440	      if (hdh_q == NULL)
2441		hdh_pp = &hdh_p->hdh_next;
2442	    }
2443	  *hdh_pp = hh_dir->dyn_relocs;
2444	}
2445
2446      hh_dir->dyn_relocs = hh_ind->dyn_relocs;
2447      hh_ind->dyn_relocs = NULL;
2448    }
2449
2450  if (eh_ind->root.type == bfd_link_hash_indirect
2451      && eh_dir->got.refcount <= 0)
2452    {
2453      hh_dir->tls_type = hh_ind->tls_type;
2454      hh_ind->tls_type = GOT_UNKNOWN;
2455    }
2456
2457  _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
2458}
2459
2460/* Adjust a symbol defined by a dynamic object and referenced by a
2461   regular object.  The current definition is in some section of the
2462   dynamic object, but we're not including those sections.  We have to
2463   change the definition to something the rest of the link can
2464   understand.  */
2465
2466static bfd_boolean
2467elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
2468				 struct elf_link_hash_entry *eh)
2469{
2470  struct elf_metag_link_hash_table *htab;
2471  struct elf_metag_link_hash_entry *hh;
2472  struct elf_metag_dyn_reloc_entry *hdh_p;
2473  asection *s, *srel;
2474
2475  /* If this is a function, put it in the procedure linkage table.  We
2476     will fill in the contents of the procedure linkage table later,
2477     when we know the address of the .got section.  */
2478  if (eh->type == STT_FUNC
2479      || eh->needs_plt)
2480    {
2481      if (eh->plt.refcount <= 0
2482	  || SYMBOL_CALLS_LOCAL (info, eh)
2483	  || (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT
2484	      && eh->root.type == bfd_link_hash_undefweak))
2485	{
2486	  /* This case can occur if we saw a PLT reloc in an input
2487	     file, but the symbol was never referred to by a dynamic
2488	     object.  In such a case, we don't actually need to build
2489	     a procedure linkage table, and we can just do a PCREL
2490	     reloc instead.  */
2491	  eh->plt.offset = (bfd_vma) -1;
2492	  eh->needs_plt = 0;
2493	}
2494
2495      return TRUE;
2496    }
2497  else
2498    eh->plt.offset = (bfd_vma) -1;
2499
2500  /* If this is a weak symbol, and there is a real definition, the
2501     processor independent code will have arranged for us to see the
2502     real definition first, and we can just use the same value.  */
2503  if (eh->u.weakdef != NULL)
2504    {
2505      if (eh->u.weakdef->root.type != bfd_link_hash_defined
2506	  && eh->u.weakdef->root.type != bfd_link_hash_defweak)
2507	abort ();
2508      eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
2509      eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
2510      eh->non_got_ref = eh->u.weakdef->non_got_ref;
2511      return TRUE;
2512    }
2513
2514  /* This is a reference to a symbol defined by a dynamic object which
2515     is not a function.  */
2516
2517  /* If we are creating a shared library, we must presume that the
2518     only references to the symbol are via the global offset table.
2519     For such cases we need not do anything here; the relocations will
2520     be handled correctly by relocate_section.  */
2521  if (bfd_link_pic (info))
2522    return TRUE;
2523
2524  /* If there are no references to this symbol that do not use the
2525     GOT, we don't need to generate a copy reloc.  */
2526  if (!eh->non_got_ref)
2527    return TRUE;
2528
2529  /* If -z nocopyreloc was given, we won't generate them either.  */
2530  if (info->nocopyreloc)
2531    {
2532      eh->non_got_ref = 0;
2533      return TRUE;
2534    }
2535
2536  hh = (struct elf_metag_link_hash_entry *) eh;
2537  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2538    {
2539      s = hdh_p->sec->output_section;
2540      if (s != NULL && (s->flags & SEC_READONLY) != 0)
2541	break;
2542    }
2543
2544  /* If we didn't find any dynamic relocs in read-only sections, then
2545     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2546  if (hdh_p == NULL)
2547    {
2548      eh->non_got_ref = 0;
2549      return TRUE;
2550    }
2551
2552  /* We must allocate the symbol in our .dynbss section, which will
2553     become part of the .bss section of the executable.  There will be
2554     an entry for this symbol in the .dynsym section.  The dynamic
2555     object will contain position independent code, so all references
2556     from the dynamic object to this symbol will go through the global
2557     offset table.  The dynamic linker will use the .dynsym entry to
2558     determine the address it must put in the global offset table, so
2559     both the dynamic object and the regular object will refer to the
2560     same memory location for the variable.  */
2561
2562  htab = metag_link_hash_table (info);
2563
2564  /* We must generate a COPY reloc to tell the dynamic linker to
2565     copy the initial value out of the dynamic object and into the
2566     runtime process image.  */
2567  if ((eh->root.u.def.section->flags & SEC_READONLY) != 0)
2568    {
2569      s = htab->etab.sdynrelro;
2570      srel = htab->etab.sreldynrelro;
2571    }
2572  else
2573    {
2574      s = htab->etab.sdynbss;
2575      srel = htab->etab.srelbss;
2576    }
2577  if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0)
2578    {
2579      srel->size += sizeof (Elf32_External_Rela);
2580      eh->needs_copy = 1;
2581    }
2582
2583  return _bfd_elf_adjust_dynamic_copy (info, eh, s);
2584}
2585
2586/* Allocate space in .plt, .got and associated reloc sections for
2587   global syms.  */
2588
2589static bfd_boolean
2590allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2591{
2592  struct bfd_link_info *info;
2593  struct elf_metag_link_hash_table *htab;
2594  struct elf_metag_link_hash_entry *hh;
2595  struct elf_metag_dyn_reloc_entry *hdh_p;
2596
2597  if (eh->root.type == bfd_link_hash_indirect)
2598    return TRUE;
2599
2600  if (eh->root.type == bfd_link_hash_warning)
2601    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2602
2603  info = inf;
2604  htab = metag_link_hash_table (info);
2605
2606  if (htab->etab.dynamic_sections_created
2607      && eh->plt.refcount > 0)
2608    {
2609      /* Make sure this symbol is output as a dynamic symbol.
2610	 Undefined weak syms won't yet be marked as dynamic.  */
2611      if (eh->dynindx == -1
2612	  && !eh->forced_local)
2613	{
2614	  if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2615	    return FALSE;
2616	}
2617
2618      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh))
2619	{
2620	  asection *s = htab->etab.splt;
2621
2622	  /* If this is the first .plt entry, make room for the special
2623	     first entry.  */
2624	  if (s->size == 0)
2625	    s->size += PLT_ENTRY_SIZE;
2626
2627	  eh->plt.offset = s->size;
2628
2629	  /* If this symbol is not defined in a regular file, and we are
2630	     not generating a shared library, then set the symbol to this
2631	     location in the .plt.  This is required to make function
2632	     pointers compare as equal between the normal executable and
2633	     the shared library.  */
2634	  if (! bfd_link_pic (info)
2635	      && !eh->def_regular)
2636	    {
2637	      eh->root.u.def.section = s;
2638	      eh->root.u.def.value = eh->plt.offset;
2639	    }
2640
2641	  /* Make room for this entry.  */
2642	  s->size += PLT_ENTRY_SIZE;
2643
2644	  /* We also need to make an entry in the .got.plt section, which
2645	     will be placed in the .got section by the linker script.  */
2646	  htab->etab.sgotplt->size += 4;
2647
2648	  /* We also need to make an entry in the .rel.plt section.  */
2649	  htab->etab.srelplt->size += sizeof (Elf32_External_Rela);
2650	}
2651      else
2652	{
2653	  eh->plt.offset = (bfd_vma) -1;
2654	  eh->needs_plt = 0;
2655	}
2656    }
2657  else
2658    {
2659      eh->plt.offset = (bfd_vma) -1;
2660      eh->needs_plt = 0;
2661    }
2662
2663  if (eh->got.refcount > 0)
2664    {
2665      asection *s;
2666      bfd_boolean dyn;
2667      int tls_type = metag_elf_hash_entry (eh)->tls_type;
2668
2669      /* Make sure this symbol is output as a dynamic symbol.
2670	 Undefined weak syms won't yet be marked as dynamic.  */
2671      if (eh->dynindx == -1
2672	  && !eh->forced_local)
2673	{
2674	  if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2675	    return FALSE;
2676	}
2677
2678      s = htab->etab.sgot;
2679
2680      eh->got.offset = s->size;
2681      s->size += 4;
2682      /* R_METAG_TLS_GD needs 2 consecutive GOT slots.  */
2683      if (tls_type == GOT_TLS_GD)
2684	  s->size += 4;
2685      dyn = htab->etab.dynamic_sections_created;
2686      /* R_METAG_TLS_IE needs one dynamic relocation if dynamic,
2687	 R_METAG_TLS_GD needs one if local symbol and two if global.  */
2688      if ((tls_type == GOT_TLS_GD && eh->dynindx == -1)
2689	  || (tls_type == GOT_TLS_IE && dyn))
2690	htab->etab.srelgot->size += sizeof (Elf32_External_Rela);
2691      else if (tls_type == GOT_TLS_GD)
2692	  htab->etab.srelgot->size += 2 * sizeof (Elf32_External_Rela);
2693      else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2694						bfd_link_pic (info),
2695						eh))
2696	  htab->etab.srelgot->size += sizeof (Elf32_External_Rela);
2697    }
2698  else
2699    eh->got.offset = (bfd_vma) -1;
2700
2701  hh = (struct elf_metag_link_hash_entry *) eh;
2702  if (hh->dyn_relocs == NULL)
2703    return TRUE;
2704
2705  /* If this is a -Bsymbolic shared link, then we need to discard all
2706     space allocated for dynamic pc-relative relocs against symbols
2707     defined in a regular object.  For the normal shared case, discard
2708     space for relocs that have become local due to symbol visibility
2709     changes.  */
2710  if (bfd_link_pic (info))
2711    {
2712      if (SYMBOL_CALLS_LOCAL (info, eh))
2713	{
2714	  struct elf_metag_dyn_reloc_entry **hdh_pp;
2715
2716	  for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2717	    {
2718	      hdh_p->count -= hdh_p->relative_count;
2719	      hdh_p->relative_count = 0;
2720	      if (hdh_p->count == 0)
2721		*hdh_pp = hdh_p->hdh_next;
2722	      else
2723		hdh_pp = &hdh_p->hdh_next;
2724	    }
2725	}
2726
2727      /* Also discard relocs on undefined weak syms with non-default
2728	 visibility.  */
2729      if (hh->dyn_relocs != NULL
2730	  && eh->root.type == bfd_link_hash_undefweak)
2731	{
2732	  if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2733	    hh->dyn_relocs = NULL;
2734
2735	  /* Make sure undefined weak symbols are output as a dynamic
2736	     symbol in PIEs.  */
2737	  else if (eh->dynindx == -1
2738		   && !eh->forced_local)
2739	    {
2740	      if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2741		return FALSE;
2742	    }
2743	}
2744    }
2745  else
2746    {
2747      /* For the non-shared case, discard space for relocs against
2748	 symbols which turn out to need copy relocs or are not
2749	 dynamic.  */
2750      if (!eh->non_got_ref
2751	  && ((eh->def_dynamic
2752	       && !eh->def_regular)
2753	      || (htab->etab.dynamic_sections_created
2754		  && (eh->root.type == bfd_link_hash_undefweak
2755		      || eh->root.type == bfd_link_hash_undefined))))
2756	{
2757	  /* Make sure this symbol is output as a dynamic symbol.
2758	     Undefined weak syms won't yet be marked as dynamic.  */
2759	  if (eh->dynindx == -1
2760	      && !eh->forced_local)
2761	    {
2762	      if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2763		return FALSE;
2764	    }
2765
2766	  /* If that succeeded, we know we'll be keeping all the
2767	     relocs.  */
2768	  if (eh->dynindx != -1)
2769	    goto keep;
2770	}
2771
2772      hh->dyn_relocs = NULL;
2773      return TRUE;
2774
2775    keep: ;
2776    }
2777
2778  /* Finally, allocate space.  */
2779  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2780    {
2781      asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2782      sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2783    }
2784
2785  return TRUE;
2786}
2787
2788/* Find any dynamic relocs that apply to read-only sections.  */
2789
2790static bfd_boolean
2791readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2792{
2793  struct elf_metag_link_hash_entry *hh;
2794  struct elf_metag_dyn_reloc_entry *hdh_p;
2795
2796  if (eh->root.type == bfd_link_hash_warning)
2797    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2798
2799  hh = (struct elf_metag_link_hash_entry *) eh;
2800  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2801    {
2802      asection *s = hdh_p->sec->output_section;
2803
2804      if (s != NULL && (s->flags & SEC_READONLY) != 0)
2805	{
2806	  struct bfd_link_info *info = inf;
2807
2808	  info->flags |= DF_TEXTREL;
2809
2810	  /* Not an error, just cut short the traversal.  */
2811	  return FALSE;
2812	}
2813    }
2814  return TRUE;
2815}
2816
2817/* Set the sizes of the dynamic sections.  */
2818
2819static bfd_boolean
2820elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2821				 struct bfd_link_info *info)
2822{
2823  struct elf_metag_link_hash_table *htab;
2824  bfd *dynobj;
2825  bfd *ibfd;
2826  asection *s;
2827  bfd_boolean relocs;
2828
2829  htab = metag_link_hash_table (info);
2830  dynobj = htab->etab.dynobj;
2831  if (dynobj == NULL)
2832    abort ();
2833
2834  if (htab->etab.dynamic_sections_created)
2835    {
2836      /* Set the contents of the .interp section to the interpreter.  */
2837      if (bfd_link_executable (info) && !info->nointerp)
2838	{
2839	  s = bfd_get_linker_section (dynobj, ".interp");
2840	  if (s == NULL)
2841	    abort ();
2842	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2843	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2844	}
2845    }
2846
2847  /* Set up .got offsets for local syms, and space for local dynamic
2848     relocs.  */
2849  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2850    {
2851      bfd_signed_vma *local_got;
2852      bfd_signed_vma *end_local_got;
2853      bfd_size_type locsymcount;
2854      Elf_Internal_Shdr *symtab_hdr;
2855      asection *srel;
2856      char *local_tls_type;
2857
2858      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2859	continue;
2860
2861      for (s = ibfd->sections; s != NULL; s = s->next)
2862	{
2863	  struct elf_metag_dyn_reloc_entry *hdh_p;
2864
2865	  for (hdh_p = ((struct elf_metag_dyn_reloc_entry *)
2866			elf_section_data (s)->local_dynrel);
2867	       hdh_p != NULL;
2868	       hdh_p = hdh_p->hdh_next)
2869	    {
2870	      if (!bfd_is_abs_section (hdh_p->sec)
2871		  && bfd_is_abs_section (hdh_p->sec->output_section))
2872		{
2873		  /* Input section has been discarded, either because
2874		     it is a copy of a linkonce section or due to
2875		     linker script /DISCARD/, so we'll be discarding
2876		     the relocs too.  */
2877		}
2878	      else if (hdh_p->count != 0)
2879		{
2880		  srel = elf_section_data (hdh_p->sec)->sreloc;
2881		  srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2882		  if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2883		    info->flags |= DF_TEXTREL;
2884		}
2885	    }
2886	}
2887
2888      local_got = elf_local_got_refcounts (ibfd);
2889      if (!local_got)
2890	continue;
2891
2892      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2893      locsymcount = symtab_hdr->sh_info;
2894      end_local_got = local_got + locsymcount;
2895      local_tls_type = metag_elf_local_got_tls_type (ibfd);
2896      s = htab->etab.sgot;
2897      srel = htab->etab.srelgot;
2898      for (; local_got < end_local_got; ++local_got)
2899	{
2900	  if (*local_got > 0)
2901	    {
2902	      *local_got = s->size;
2903	      s->size += GOT_ENTRY_SIZE;
2904	      /* R_METAG_TLS_GD relocs need 2 consecutive GOT entries.  */
2905	      if (*local_tls_type == GOT_TLS_GD)
2906		s->size += 4;
2907	      if (bfd_link_pic (info))
2908		srel->size += sizeof (Elf32_External_Rela);
2909	    }
2910	  else
2911	    *local_got = (bfd_vma) -1;
2912	  ++local_tls_type;
2913	}
2914    }
2915
2916  if (htab->tls_ldm_got.refcount > 0)
2917    {
2918      /* Allocate 2 got entries and 1 dynamic reloc for R_METAG_TLS_LDM
2919	 reloc.  */
2920      htab->tls_ldm_got.offset = htab->etab.sgot->size;
2921      htab->etab.sgot->size += 8;
2922      htab->etab.srelgot->size += sizeof (Elf32_External_Rela);
2923    }
2924  else
2925    htab->tls_ldm_got.offset = -1;
2926
2927  /* Allocate global sym .plt and .got entries, and space for global
2928     sym dynamic relocs.  */
2929  elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2930
2931  /* We now have determined the sizes of the various dynamic sections.
2932     Allocate memory for them.  */
2933  relocs = FALSE;
2934  for (s = dynobj->sections; s != NULL; s = s->next)
2935    {
2936      bfd_boolean reloc_section = FALSE;
2937
2938      if ((s->flags & SEC_LINKER_CREATED) == 0)
2939	continue;
2940
2941      if (s == htab->etab.splt
2942	  || s == htab->etab.sgot
2943	  || s == htab->etab.sgotplt
2944	  || s == htab->etab.sdynbss
2945	  || s == htab->etab.sdynrelro)
2946	{
2947	  /* Strip this section if we don't need it; see the
2948	     comment below.  */
2949	}
2950      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2951	{
2952	  if (s->size != 0 && s != htab->etab.srelplt)
2953	    relocs = TRUE;
2954
2955	  /* We use the reloc_count field as a counter if we need
2956	     to copy relocs into the output file.  */
2957	  s->reloc_count = 0;
2958	  reloc_section = TRUE;
2959	}
2960      else
2961	{
2962	  /* It's not one of our sections, so don't allocate space.  */
2963	  continue;
2964	}
2965
2966      if (s->size == 0)
2967	{
2968	  /* If we don't need this section, strip it from the
2969	     output file.  This is mostly to handle .rela.bss and
2970	     .rela.plt.  We must create both sections in
2971	     create_dynamic_sections, because they must be created
2972	     before the linker maps input sections to output
2973	     sections.  The linker does that before
2974	     adjust_dynamic_symbol is called, and it is that
2975	     function which decides whether anything needs to go
2976	     into these sections.  */
2977	  s->flags |= SEC_EXCLUDE;
2978	  continue;
2979	}
2980
2981      if ((s->flags & SEC_HAS_CONTENTS) == 0)
2982	continue;
2983
2984      /* Allocate memory for the section contents.  */
2985      s->contents = bfd_zalloc (dynobj, s->size);
2986      if (s->contents == NULL)
2987	return FALSE;
2988      else if (reloc_section)
2989	{
2990	  unsigned char *contents = s->contents;
2991	  Elf32_External_Rela reloc;
2992
2993	  /* Fill the reloc section with a R_METAG_NONE type reloc.  */
2994	  memset(&reloc, 0, sizeof(Elf32_External_Rela));
2995	  reloc.r_info[0] = R_METAG_NONE;
2996	  for (; contents < (s->contents + s->size);
2997	       contents += sizeof(Elf32_External_Rela))
2998	    {
2999	      memcpy(contents, &reloc, sizeof(Elf32_External_Rela));
3000	    }
3001	}
3002    }
3003
3004  if (htab->etab.dynamic_sections_created)
3005    {
3006      /* Add some entries to the .dynamic section.  We fill in the
3007	 values later, in elf_metag_finish_dynamic_sections, but we
3008	 must add the entries now so that we get the correct size for
3009	 the .dynamic section.  The DT_DEBUG entry is filled in by the
3010	 dynamic linker and used by the debugger.  */
3011#define add_dynamic_entry(TAG, VAL) \
3012  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3013
3014      if (!add_dynamic_entry (DT_PLTGOT, 0))
3015	return FALSE;
3016
3017      if (bfd_link_executable (info))
3018	{
3019	  if (!add_dynamic_entry (DT_DEBUG, 0))
3020	    return FALSE;
3021	}
3022
3023      if (htab->etab.srelplt->size != 0)
3024	{
3025	  if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3026	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3027	      || !add_dynamic_entry (DT_JMPREL, 0))
3028	    return FALSE;
3029	}
3030
3031      if (relocs)
3032	{
3033	  if (!add_dynamic_entry (DT_RELA, 0)
3034	      || !add_dynamic_entry (DT_RELASZ, 0)
3035	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
3036	    return FALSE;
3037
3038	  /* If any dynamic relocs apply to a read-only section,
3039	     then we need a DT_TEXTREL entry.  */
3040	  if ((info->flags & DF_TEXTREL) == 0)
3041	    elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
3042
3043	  if ((info->flags & DF_TEXTREL) != 0)
3044	    {
3045	      if (!add_dynamic_entry (DT_TEXTREL, 0))
3046		return FALSE;
3047	    }
3048	}
3049    }
3050#undef add_dynamic_entry
3051
3052  return TRUE;
3053}
3054
3055/* Finish up dynamic symbol handling.  We set the contents of various
3056   dynamic sections here.  */
3057
3058static bfd_boolean
3059elf_metag_finish_dynamic_symbol (bfd *output_bfd,
3060				 struct bfd_link_info *info,
3061				 struct elf_link_hash_entry *eh,
3062				 Elf_Internal_Sym *sym)
3063{
3064  struct elf_metag_link_hash_table *htab;
3065  Elf_Internal_Rela rel;
3066  bfd_byte *loc;
3067
3068  htab = metag_link_hash_table (info);
3069
3070  if (eh->plt.offset != (bfd_vma) -1)
3071    {
3072      asection *splt;
3073      asection *sgot;
3074      asection *srela;
3075
3076      bfd_vma plt_index;
3077      bfd_vma got_offset;
3078      bfd_vma got_entry;
3079
3080      if (eh->plt.offset & 1)
3081	abort ();
3082
3083      BFD_ASSERT (eh->dynindx != -1);
3084
3085      splt = htab->etab.splt;
3086      sgot = htab->etab.sgotplt;
3087      srela = htab->etab.srelplt;
3088      BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
3089
3090      /* Get the index in the procedure linkage table which
3091	 corresponds to this symbol.  This is the index of this symbol
3092	 in all the symbols for which we are making plt entries.  The
3093	 first entry in the procedure linkage table is reserved.  */
3094      plt_index = eh->plt.offset / PLT_ENTRY_SIZE - 1;
3095
3096      /* Get the offset into the .got.plt table of the entry that
3097	 corresponds to this function.  */
3098      got_offset = plt_index * GOT_ENTRY_SIZE;
3099
3100      BFD_ASSERT (got_offset < (1 << 16));
3101
3102      got_entry = sgot->output_section->vma
3103	+ sgot->output_offset
3104	+ got_offset;
3105
3106      BFD_ASSERT (plt_index < (1 << 16));
3107
3108      /* Fill in the entry in the procedure linkage table.  */
3109      if (! bfd_link_pic (info))
3110	{
3111	  bfd_put_32 (output_bfd,
3112		      (plt_entry[0]
3113		       | (((got_entry >> 16) & 0xffff) << 3)),
3114		      splt->contents + eh->plt.offset);
3115	  bfd_put_32 (output_bfd,
3116		      (plt_entry[1]
3117		       | ((got_entry & 0xffff) << 3)),
3118		      splt->contents + eh->plt.offset + 4);
3119	  bfd_put_32 (output_bfd, plt_entry[2],
3120		      splt->contents + eh->plt.offset + 8);
3121	  bfd_put_32 (output_bfd,
3122		      (plt_entry[3] | (plt_index << 3)),
3123		      splt->contents + eh->plt.offset + 12);
3124	  bfd_put_32 (output_bfd,
3125		      (plt_entry[4]
3126		       | ((((unsigned int) ((- (eh->plt.offset + 16)) >> 2)) & 0x7ffff) << 5)),
3127		      splt->contents + eh->plt.offset + 16);
3128	}
3129      else
3130	{
3131	  bfd_vma addr = got_entry - (splt->output_section->vma +
3132				      splt->output_offset + eh->plt.offset);
3133
3134	  bfd_put_32 (output_bfd,
3135		      plt_pic_entry[0] | (((addr >> 16) & 0xffff) << 3),
3136		      splt->contents + eh->plt.offset);
3137	  bfd_put_32 (output_bfd,
3138		      plt_pic_entry[1] | ((addr & 0xffff) << 3),
3139		      splt->contents + eh->plt.offset + 4);
3140	  bfd_put_32 (output_bfd, plt_pic_entry[2],
3141		      splt->contents + eh->plt.offset + 8);
3142	  bfd_put_32 (output_bfd,
3143		      (plt_pic_entry[3] | (plt_index << 3)),
3144		      splt->contents + eh->plt.offset + 12);
3145	  bfd_put_32 (output_bfd,
3146		      (plt_pic_entry[4]
3147		       + ((((unsigned int) ((- (eh->plt.offset + 16)) >> 2)) & 0x7ffff) << 5)),
3148		      splt->contents + eh->plt.offset + 16);
3149	}
3150
3151      /* Fill in the entry in the global offset table.  */
3152      bfd_put_32 (output_bfd,
3153		  (splt->output_section->vma
3154		   + splt->output_offset
3155		   + eh->plt.offset
3156		   + 12), /* offset within PLT entry */
3157		  sgot->contents + got_offset);
3158
3159      /* Fill in the entry in the .rela.plt section.  */
3160      rel.r_offset = (sgot->output_section->vma
3161		      + sgot->output_offset
3162		      + got_offset);
3163      rel.r_info = ELF32_R_INFO (eh->dynindx, R_METAG_JMP_SLOT);
3164      rel.r_addend = 0;
3165      loc = htab->etab.srelplt->contents;
3166      loc += plt_index * sizeof(Elf32_External_Rela);
3167      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
3168
3169      if (!eh->def_regular)
3170	{
3171	  /* Mark the symbol as undefined, rather than as defined in
3172	     the .plt section.  Leave the value alone.  */
3173	  sym->st_shndx = SHN_UNDEF;
3174	}
3175    }
3176
3177  if (eh->got.offset != (bfd_vma) -1
3178      && (metag_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
3179      && (metag_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
3180    {
3181      /* This symbol has an entry in the global offset table.  Set it
3182	 up.  */
3183
3184      rel.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
3185		      + htab->etab.sgot->output_offset
3186		      + htab->etab.sgot->output_section->vma);
3187
3188      /* If this is a -Bsymbolic link and the symbol is defined
3189	 locally or was forced to be local because of a version file,
3190	 we just want to emit a RELATIVE reloc.  The entry in the
3191	 global offset table will already have been initialized in the
3192	 relocate_section function.  */
3193      if (bfd_link_pic (info)
3194	  && (info->symbolic || eh->dynindx == -1)
3195	  && eh->def_regular)
3196	{
3197	  rel.r_info = ELF32_R_INFO (0, R_METAG_RELATIVE);
3198	  rel.r_addend = (eh->root.u.def.value
3199			  + eh->root.u.def.section->output_offset
3200			  + eh->root.u.def.section->output_section->vma);
3201	}
3202      else
3203	{
3204	  if ((eh->got.offset & 1) != 0)
3205	    abort ();
3206	  bfd_put_32 (output_bfd, 0, htab->etab.sgot->contents + eh->got.offset);
3207	  rel.r_info = ELF32_R_INFO (eh->dynindx, R_METAG_GLOB_DAT);
3208	  rel.r_addend = 0;
3209	}
3210
3211      loc = htab->etab.srelgot->contents;
3212      loc += htab->etab.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
3213      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
3214    }
3215
3216  if (eh->needs_copy)
3217    {
3218      asection *s;
3219
3220      /* This symbol needs a copy reloc.  Set it up.  */
3221
3222      if (! (eh->dynindx != -1
3223	     && (eh->root.type == bfd_link_hash_defined
3224		 || eh->root.type == bfd_link_hash_defweak)))
3225	abort ();
3226
3227      rel.r_offset = (eh->root.u.def.value
3228		      + eh->root.u.def.section->output_offset
3229		      + eh->root.u.def.section->output_section->vma);
3230      rel.r_addend = 0;
3231      rel.r_info = ELF32_R_INFO (eh->dynindx, R_METAG_COPY);
3232      if (eh->root.u.def.section == htab->etab.sdynrelro)
3233	s = htab->etab.sreldynrelro;
3234      else
3235	s = htab->etab.srelbss;
3236      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
3237      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
3238    }
3239
3240  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3241  if (eh->root.root.string[0] == '_'
3242      && (strcmp (eh->root.root.string, "_DYNAMIC") == 0
3243	  || eh == htab->etab.hgot))
3244    {
3245      sym->st_shndx = SHN_ABS;
3246    }
3247
3248  return TRUE;
3249}
3250
3251/* Set the Meta ELF ABI version.  */
3252
3253static void
3254elf_metag_post_process_headers (bfd * abfd, struct bfd_link_info * link_info)
3255{
3256  Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
3257
3258  _bfd_elf_post_process_headers (abfd, link_info);
3259  i_ehdrp = elf_elfheader (abfd);
3260  i_ehdrp->e_ident[EI_ABIVERSION] = METAG_ELF_ABI_VERSION;
3261}
3262
3263/* Used to decide how to sort relocs in an optimal manner for the
3264   dynamic linker, before writing them out.  */
3265
3266static enum elf_reloc_type_class
3267elf_metag_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3268			    const asection *rel_sec ATTRIBUTE_UNUSED,
3269			    const Elf_Internal_Rela *rela)
3270{
3271  switch ((int) ELF32_R_TYPE (rela->r_info))
3272    {
3273    case R_METAG_RELATIVE:
3274      return reloc_class_relative;
3275    case R_METAG_JMP_SLOT:
3276      return reloc_class_plt;
3277    case R_METAG_COPY:
3278      return reloc_class_copy;
3279    default:
3280      return reloc_class_normal;
3281    }
3282}
3283
3284/* Finish up the dynamic sections.  */
3285
3286static bfd_boolean
3287elf_metag_finish_dynamic_sections (bfd *output_bfd,
3288				   struct bfd_link_info *info)
3289{
3290  bfd *dynobj;
3291  struct elf_metag_link_hash_table *htab;
3292  asection *sdyn;
3293
3294  htab = metag_link_hash_table (info);
3295  dynobj = htab->etab.dynobj;
3296
3297  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3298
3299  if (htab->etab.dynamic_sections_created)
3300    {
3301      asection *splt;
3302      Elf32_External_Dyn *dyncon, *dynconend;
3303
3304      if (sdyn == NULL)
3305	abort ();
3306
3307      dyncon = (Elf32_External_Dyn *) sdyn->contents;
3308      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3309      for (; dyncon < dynconend; dyncon++)
3310	{
3311	  Elf_Internal_Dyn dyn;
3312	  asection *s;
3313
3314	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3315
3316	  switch (dyn.d_tag)
3317	    {
3318	    default:
3319	      continue;
3320
3321	    case DT_PLTGOT:
3322	      s = htab->etab.sgot;
3323	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3324	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3325	      break;
3326
3327	    case DT_JMPREL:
3328	      s = htab->etab.srelplt;
3329	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3330	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3331	      break;
3332
3333	    case DT_PLTRELSZ:
3334	      s = htab->etab.srelplt;
3335	      dyn.d_un.d_val = s->size;
3336	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3337	      break;
3338	    }
3339
3340	}
3341
3342      /* Fill in the first entry in the procedure linkage table.  */
3343      splt = htab->etab.splt;
3344      if (splt && splt->size > 0)
3345	{
3346	  unsigned long addr;
3347	  /* addr = .got + 4 */
3348	  addr = (htab->etab.sgot->output_section->vma
3349		  + htab->etab.sgot->output_offset + 4);
3350	  if (bfd_link_pic (info))
3351	    {
3352	      addr -= splt->output_section->vma + splt->output_offset;
3353	      bfd_put_32 (output_bfd,
3354			  plt0_pic_entry[0] | (((addr >> 16) & 0xffff) << 3),
3355			  splt->contents);
3356	      bfd_put_32 (output_bfd,
3357			  plt0_pic_entry[1] | ((addr & 0xffff) << 3),
3358			  splt->contents + 4);
3359	      bfd_put_32 (output_bfd, plt0_pic_entry[2], splt->contents + 8);
3360	      bfd_put_32 (output_bfd, plt0_pic_entry[3], splt->contents + 12);
3361	      bfd_put_32 (output_bfd, plt0_pic_entry[4], splt->contents + 16);
3362	    }
3363	  else
3364	    {
3365	      bfd_put_32 (output_bfd,
3366			  plt0_entry[0] | (((addr >> 16) & 0xffff) << 3),
3367			  splt->contents);
3368	      bfd_put_32 (output_bfd,
3369			  plt0_entry[1] | ((addr & 0xffff) << 3),
3370			  splt->contents + 4);
3371	      bfd_put_32 (output_bfd, plt0_entry[2], splt->contents + 8);
3372	      bfd_put_32 (output_bfd, plt0_entry[3], splt->contents + 12);
3373	      bfd_put_32 (output_bfd, plt0_entry[4], splt->contents + 16);
3374	    }
3375
3376	  elf_section_data (splt->output_section)->this_hdr.sh_entsize =
3377	    PLT_ENTRY_SIZE;
3378	}
3379    }
3380
3381  if (htab->etab.sgot != NULL && htab->etab.sgot->size != 0)
3382    {
3383      /* Fill in the first entry in the global offset table.
3384	 We use it to point to our dynamic section, if we have one.  */
3385      bfd_put_32 (output_bfd,
3386		  sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
3387		  htab->etab.sgot->contents);
3388
3389      /* The second entry is reserved for use by the dynamic linker.  */
3390      memset (htab->etab.sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
3391
3392      /* Set .got entry size.  */
3393      elf_section_data (htab->etab.sgot->output_section)
3394	->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
3395    }
3396
3397  return TRUE;
3398}
3399
3400/* Return the section that should be marked against GC for a given
3401   relocation.  */
3402
3403static asection *
3404elf_metag_gc_mark_hook (asection *sec,
3405			struct bfd_link_info *info,
3406			Elf_Internal_Rela *rela,
3407			struct elf_link_hash_entry *hh,
3408			Elf_Internal_Sym *sym)
3409{
3410  if (hh != NULL)
3411    switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
3412      {
3413      case R_METAG_GNU_VTINHERIT:
3414      case R_METAG_GNU_VTENTRY:
3415	return NULL;
3416      }
3417
3418  return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
3419}
3420
3421/* Update the got and plt entry reference counts for the section being
3422   removed.  */
3423
3424static bfd_boolean
3425elf_metag_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
3426			 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3427			 asection *sec ATTRIBUTE_UNUSED,
3428			 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
3429{
3430  Elf_Internal_Shdr *symtab_hdr;
3431  struct elf_link_hash_entry **eh_syms;
3432  bfd_signed_vma *local_got_refcounts;
3433  bfd_signed_vma *local_plt_refcounts;
3434  const Elf_Internal_Rela *rel, *relend;
3435
3436  if (bfd_link_relocatable (info))
3437    return TRUE;
3438
3439  elf_section_data (sec)->local_dynrel = NULL;
3440
3441  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3442  eh_syms = elf_sym_hashes (abfd);
3443  local_got_refcounts = elf_local_got_refcounts (abfd);
3444  local_plt_refcounts = local_got_refcounts;
3445  if (local_plt_refcounts != NULL)
3446    local_plt_refcounts += symtab_hdr->sh_info;
3447
3448  relend = relocs + sec->reloc_count;
3449  for (rel = relocs; rel < relend; rel++)
3450    {
3451      unsigned long r_symndx;
3452      unsigned int r_type;
3453      struct elf_link_hash_entry *eh = NULL;
3454
3455      r_symndx = ELF32_R_SYM (rel->r_info);
3456      if (r_symndx >= symtab_hdr->sh_info)
3457	{
3458	  struct elf_metag_link_hash_entry *hh;
3459	  struct elf_metag_dyn_reloc_entry **hdh_pp;
3460	  struct elf_metag_dyn_reloc_entry *hdh_p;
3461
3462	  eh = eh_syms[r_symndx - symtab_hdr->sh_info];
3463	  while (eh->root.type == bfd_link_hash_indirect
3464		 || eh->root.type == bfd_link_hash_warning)
3465	    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
3466	  hh = (struct elf_metag_link_hash_entry *) eh;
3467
3468	  for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL;
3469	       hdh_pp = &hdh_p->hdh_next)
3470	    if (hdh_p->sec == sec)
3471	      {
3472		/* Everything must go for SEC.  */
3473		*hdh_pp = hdh_p->hdh_next;
3474		break;
3475	      }
3476	}
3477
3478      r_type = ELF32_R_TYPE (rel->r_info);
3479      switch (r_type)
3480	{
3481	case R_METAG_TLS_LDM:
3482	  if (metag_link_hash_table (info)->tls_ldm_got.refcount > 0)
3483	    metag_link_hash_table (info)->tls_ldm_got.refcount -= 1;
3484	  break;
3485	case R_METAG_TLS_IE:
3486	case R_METAG_TLS_GD:
3487	case R_METAG_GETSET_GOT:
3488	  if (eh != NULL)
3489	    {
3490	      if (eh->got.refcount > 0)
3491		eh->got.refcount -= 1;
3492	    }
3493	  else if (local_got_refcounts != NULL)
3494	    {
3495	      if (local_got_refcounts[r_symndx] > 0)
3496		local_got_refcounts[r_symndx] -= 1;
3497	    }
3498	  break;
3499
3500	case R_METAG_RELBRANCH_PLT:
3501	  if (eh != NULL)
3502	    {
3503	      if (eh->plt.refcount > 0)
3504		eh->plt.refcount -= 1;
3505	    }
3506	  break;
3507
3508	case R_METAG_ADDR32:
3509	case R_METAG_HIADDR16:
3510	case R_METAG_LOADDR16:
3511	case R_METAG_GETSETOFF:
3512	case R_METAG_RELBRANCH:
3513	  if (eh != NULL)
3514	    {
3515	      struct elf_metag_link_hash_entry *hh;
3516	      struct elf_metag_dyn_reloc_entry **hdh_pp;
3517	      struct elf_metag_dyn_reloc_entry *hdh_p;
3518
3519	      if (!bfd_link_pic (info) && eh->plt.refcount > 0)
3520		eh->plt.refcount -= 1;
3521
3522	      hh = (struct elf_metag_link_hash_entry *) eh;
3523
3524	      for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL;
3525		   hdh_pp = &hdh_p->hdh_next)
3526		if (hdh_p->sec == sec)
3527		  {
3528		    if (ELF32_R_TYPE (rel->r_info) == R_METAG_RELBRANCH)
3529		      hdh_p->relative_count -= 1;
3530		    hdh_p->count -= 1;
3531		    if (hdh_p->count == 0)
3532		      *hdh_pp = hdh_p->hdh_next;
3533		    break;
3534		  }
3535	    }
3536	  break;
3537
3538	default:
3539	  break;
3540	}
3541    }
3542
3543  return TRUE;
3544}
3545
3546/* Determine the type of stub needed, if any, for a call.  */
3547
3548static enum elf_metag_stub_type
3549metag_type_of_stub (asection *input_sec,
3550		    const Elf_Internal_Rela *rel,
3551		    struct elf_metag_link_hash_entry *hh,
3552		    bfd_vma destination,
3553		    struct bfd_link_info *info ATTRIBUTE_UNUSED)
3554{
3555  bfd_vma location;
3556  bfd_vma branch_offset;
3557  bfd_vma max_branch_offset;
3558
3559  if (hh != NULL &&
3560      !(hh->eh.root.type == bfd_link_hash_defined
3561	|| hh->eh.root.type == bfd_link_hash_defweak))
3562    return metag_stub_none;
3563
3564  /* Determine where the call point is.  */
3565  location = (input_sec->output_offset
3566	      + input_sec->output_section->vma
3567	      + rel->r_offset);
3568
3569  branch_offset = destination - location;
3570
3571  /* Determine if a long branch stub is needed.  Meta branch offsets
3572     are signed 19 bits 4 byte aligned.  */
3573  max_branch_offset = (1 << (BRANCH_BITS-1)) << 2;
3574
3575  if (branch_offset + max_branch_offset >= 2*max_branch_offset)
3576    {
3577      if (bfd_link_pic (info))
3578	return metag_stub_long_branch_shared;
3579      else
3580	return metag_stub_long_branch;
3581    }
3582
3583  return metag_stub_none;
3584}
3585
3586#define MOVT_A0_3	0x82180005
3587#define JUMP_A0_3	0xac180003
3588
3589#define MOVT_A1LBP	0x83080005
3590#define ADD_A1LBP	0x83080000
3591
3592#define ADDT_A0_3_CPC	0x82980001
3593#define ADD_A0_3_A0_3	0x82180000
3594#define MOV_PC_A0_3	0xa3180ca0
3595
3596static bfd_boolean
3597metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
3598{
3599  struct elf_metag_stub_hash_entry *hsh;
3600  asection *stub_sec;
3601  bfd *stub_bfd;
3602  bfd_byte *loc;
3603  bfd_vma sym_value;
3604  int size;
3605
3606  /* Massage our args to the form they really have.  */
3607  hsh = (struct elf_metag_stub_hash_entry *) gen_entry;
3608
3609  stub_sec = hsh->stub_sec;
3610
3611  /* Make a note of the offset within the stubs for this entry.  */
3612  hsh->stub_offset = stub_sec->size;
3613  loc = stub_sec->contents + hsh->stub_offset;
3614
3615  stub_bfd = stub_sec->owner;
3616
3617  switch (hsh->stub_type)
3618    {
3619    case metag_stub_long_branch_shared:
3620      /* A PIC long branch stub is an ADDT and an ADD instruction used to
3621	 calculate the jump target using A0.3 as a temporary. Then a MOV
3622	 to PC carries out the jump.  */
3623      sym_value = (hsh->target_value
3624		   + hsh->target_section->output_offset
3625		   + hsh->target_section->output_section->vma
3626		   + hsh->addend);
3627
3628      sym_value -= (hsh->stub_offset
3629		    + stub_sec->output_offset
3630		    + stub_sec->output_section->vma);
3631
3632      bfd_put_32 (stub_bfd, ADDT_A0_3_CPC | (((sym_value >> 16) & 0xffff) << 3),
3633		  loc);
3634
3635      bfd_put_32 (stub_bfd, ADD_A0_3_A0_3 | ((sym_value & 0xffff) << 3),
3636		  loc + 4);
3637
3638      bfd_put_32 (stub_bfd, MOV_PC_A0_3, loc + 8);
3639
3640      size = 12;
3641      break;
3642    case metag_stub_long_branch:
3643      /* A standard long branch stub is a MOVT instruction followed by a
3644	 JUMP instruction using the A0.3 register as a temporary. This is
3645	 the same method used by the LDLK linker (patch.c).  */
3646      sym_value = (hsh->target_value
3647		   + hsh->target_section->output_offset
3648		   + hsh->target_section->output_section->vma
3649		   + hsh->addend);
3650
3651      bfd_put_32 (stub_bfd, MOVT_A0_3 | (((sym_value >> 16) & 0xffff) << 3),
3652		  loc);
3653
3654      bfd_put_32 (stub_bfd, JUMP_A0_3 | ((sym_value & 0xffff) << 3), loc + 4);
3655
3656      size = 8;
3657      break;
3658    default:
3659      BFD_FAIL ();
3660      return FALSE;
3661    }
3662
3663  stub_sec->size += size;
3664  return TRUE;
3665}
3666
3667/* As above, but don't actually build the stub.  Just bump offset so
3668   we know stub section sizes.  */
3669
3670static bfd_boolean
3671metag_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
3672{
3673  struct elf_metag_stub_hash_entry *hsh;
3674  int size = 0;
3675
3676  /* Massage our args to the form they really have.  */
3677  hsh = (struct elf_metag_stub_hash_entry *) gen_entry;
3678
3679  if (hsh->stub_type == metag_stub_long_branch)
3680    size = 8;
3681  else if (hsh->stub_type == metag_stub_long_branch_shared)
3682    size = 12;
3683
3684  hsh->stub_sec->size += size;
3685  return TRUE;
3686}
3687
3688/* Set up various things so that we can make a list of input sections
3689   for each output section included in the link.  Returns -1 on error,
3690   0 when no stubs will be needed, and 1 on success.  */
3691
3692int
3693elf_metag_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
3694{
3695  bfd *input_bfd;
3696  unsigned int bfd_count;
3697  unsigned int top_id, top_index;
3698  asection *section;
3699  asection **input_list, **list;
3700  bfd_size_type amt;
3701  struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
3702
3703  /* Count the number of input BFDs and find the top input section id.  */
3704  for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
3705       input_bfd != NULL;
3706       input_bfd = input_bfd->link.next)
3707    {
3708      bfd_count += 1;
3709      for (section = input_bfd->sections;
3710	   section != NULL;
3711	   section = section->next)
3712	{
3713	  if (top_id < section->id)
3714	    top_id = section->id;
3715	}
3716    }
3717
3718  htab->bfd_count = bfd_count;
3719
3720  amt = sizeof (struct map_stub) * (top_id + 1);
3721  htab->stub_group = bfd_zmalloc (amt);
3722  if (htab->stub_group == NULL)
3723    return -1;
3724
3725  /* We can't use output_bfd->section_count here to find the top output
3726     section index as some sections may have been removed, and
3727     strip_excluded_output_sections doesn't renumber the indices.  */
3728  for (section = output_bfd->sections, top_index = 0;
3729       section != NULL;
3730       section = section->next)
3731    {
3732      if (top_index < section->index)
3733	top_index = section->index;
3734    }
3735
3736  htab->top_index = top_index;
3737  amt = sizeof (asection *) * (top_index + 1);
3738  input_list = bfd_malloc (amt);
3739  htab->input_list = input_list;
3740  if (input_list == NULL)
3741    return -1;
3742
3743  /* For sections we aren't interested in, mark their entries with a
3744     value we can check later.  */
3745  list = input_list + top_index;
3746  do
3747    *list = bfd_abs_section_ptr;
3748  while (list-- != input_list);
3749
3750  for (section = output_bfd->sections;
3751       section != NULL;
3752       section = section->next)
3753    {
3754      /* FIXME: This is a bit of hack. Currently our .ctors and .dtors
3755       * have PC relative relocs in them but no code flag set.  */
3756      if (((section->flags & SEC_CODE) != 0) ||
3757	  strcmp(".ctors", section->name) ||
3758	  strcmp(".dtors", section->name))
3759	input_list[section->index] = NULL;
3760    }
3761
3762  return 1;
3763}
3764
3765/* The linker repeatedly calls this function for each input section,
3766   in the order that input sections are linked into output sections.
3767   Build lists of input sections to determine groupings between which
3768   we may insert linker stubs.  */
3769
3770void
3771elf_metag_next_input_section (struct bfd_link_info *info, asection *isec)
3772{
3773  struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
3774
3775  if (isec->output_section->index <= htab->top_index)
3776    {
3777      asection **list = htab->input_list + isec->output_section->index;
3778      if (*list != bfd_abs_section_ptr)
3779	{
3780	  /* Steal the link_sec pointer for our list.  */
3781#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3782	  /* This happens to make the list in reverse order,
3783	     which is what we want.  */
3784	  PREV_SEC (isec) = *list;
3785	  *list = isec;
3786	}
3787    }
3788}
3789
3790/* See whether we can group stub sections together.  Grouping stub
3791   sections may result in fewer stubs.  More importantly, we need to
3792   put all .init* and .fini* stubs at the beginning of the .init or
3793   .fini output sections respectively, because glibc splits the
3794   _init and _fini functions into multiple parts.  Putting a stub in
3795   the middle of a function is not a good idea.  */
3796
3797static void
3798group_sections (struct elf_metag_link_hash_table *htab,
3799		bfd_size_type stub_group_size,
3800		bfd_boolean stubs_always_before_branch)
3801{
3802  asection **list = htab->input_list + htab->top_index;
3803  do
3804    {
3805      asection *tail = *list;
3806      if (tail == bfd_abs_section_ptr)
3807	continue;
3808      while (tail != NULL)
3809	{
3810	  asection *curr;
3811	  asection *prev;
3812	  bfd_size_type total;
3813	  bfd_boolean big_sec;
3814
3815	  curr = tail;
3816	  total = tail->size;
3817	  big_sec = total >= stub_group_size;
3818
3819	  while ((prev = PREV_SEC (curr)) != NULL
3820		 && ((total += curr->output_offset - prev->output_offset)
3821		     < stub_group_size))
3822	    curr = prev;
3823
3824	  /* OK, the size from the start of CURR to the end is less
3825	     than stub_group_size bytes and thus can be handled by one stub
3826	     section.  (or the tail section is itself larger than
3827	     stub_group_size bytes, in which case we may be toast.)
3828	     We should really be keeping track of the total size of
3829	     stubs added here, as stubs contribute to the final output
3830	     section size.  */
3831	  do
3832	    {
3833	      prev = PREV_SEC (tail);
3834	      /* Set up this stub group.  */
3835	      htab->stub_group[tail->id].link_sec = curr;
3836	    }
3837	  while (tail != curr && (tail = prev) != NULL);
3838
3839	  /* But wait, there's more!  Input sections up to stub_group_size
3840	     bytes before the stub section can be handled by it too.
3841	     Don't do this if we have a really large section after the
3842	     stubs, as adding more stubs increases the chance that
3843	     branches may not reach into the stub section.  */
3844	  if (!stubs_always_before_branch && !big_sec)
3845	    {
3846	      total = 0;
3847	      while (prev != NULL
3848		     && ((total += tail->output_offset - prev->output_offset)
3849			 < stub_group_size))
3850		{
3851		  tail = prev;
3852		  prev = PREV_SEC (tail);
3853		  htab->stub_group[tail->id].link_sec = curr;
3854		}
3855	    }
3856	  tail = prev;
3857	}
3858    }
3859  while (list-- != htab->input_list);
3860  free (htab->input_list);
3861#undef PREV_SEC
3862}
3863
3864/* Read in all local syms for all input bfds.
3865   Returns -1 on error, 0 otherwise.  */
3866
3867static int
3868get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
3869		struct bfd_link_info *info)
3870{
3871  unsigned int bfd_indx;
3872  Elf_Internal_Sym *local_syms, **all_local_syms;
3873  int stub_changed = 0;
3874  struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
3875
3876  /* We want to read in symbol extension records only once.  To do this
3877     we need to read in the local symbols in parallel and save them for
3878     later use; so hold pointers to the local symbols in an array.  */
3879  bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
3880  all_local_syms = bfd_zmalloc (amt);
3881  htab->all_local_syms = all_local_syms;
3882  if (all_local_syms == NULL)
3883    return -1;
3884
3885  /* Walk over all the input BFDs, swapping in local symbols.  */
3886  for (bfd_indx = 0;
3887       input_bfd != NULL;
3888       input_bfd = input_bfd->link.next, bfd_indx++)
3889    {
3890      Elf_Internal_Shdr *symtab_hdr;
3891
3892      /* We'll need the symbol table in a second.  */
3893      symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3894      if (symtab_hdr->sh_info == 0)
3895	continue;
3896
3897      /* We need an array of the local symbols attached to the input bfd.  */
3898      local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
3899      if (local_syms == NULL)
3900	{
3901	  local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
3902					     symtab_hdr->sh_info, 0,
3903					     NULL, NULL, NULL);
3904	  /* Cache them for elf_link_input_bfd.  */
3905	  symtab_hdr->contents = (unsigned char *) local_syms;
3906	}
3907      if (local_syms == NULL)
3908	return -1;
3909
3910      all_local_syms[bfd_indx] = local_syms;
3911    }
3912
3913  return stub_changed;
3914}
3915
3916/* Determine and set the size of the stub section for a final link.
3917
3918The basic idea here is to examine all the relocations looking for
3919PC-relative calls to a target that is unreachable with a "CALLR"
3920instruction.  */
3921
3922/* See elf32-hppa.c and elf64-ppc.c.  */
3923
3924bfd_boolean
3925elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
3926		     struct bfd_link_info *info,
3927		     bfd_signed_vma group_size,
3928		     asection * (*add_stub_section) (const char *, asection *),
3929		     void (*layout_sections_again) (void))
3930{
3931  bfd_size_type stub_group_size;
3932  bfd_boolean stubs_always_before_branch;
3933  bfd_boolean stub_changed;
3934  struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
3935
3936  /* Stash our params away.  */
3937  htab->stub_bfd = stub_bfd;
3938  htab->add_stub_section = add_stub_section;
3939  htab->layout_sections_again = layout_sections_again;
3940  stubs_always_before_branch = group_size < 0;
3941  if (group_size < 0)
3942    stub_group_size = -group_size;
3943  else
3944    stub_group_size = group_size;
3945  if (stub_group_size == 1)
3946    {
3947      /* Default values.  */
3948      /* FIXME: not sure what these values should be */
3949      if (stubs_always_before_branch)
3950	{
3951	  stub_group_size = (1 << BRANCH_BITS);
3952	}
3953      else
3954	{
3955	  stub_group_size = (1 << BRANCH_BITS);
3956	}
3957    }
3958
3959  group_sections (htab, stub_group_size, stubs_always_before_branch);
3960
3961  switch (get_local_syms (output_bfd, info->input_bfds, info))
3962    {
3963    default:
3964      if (htab->all_local_syms)
3965	goto error_ret_free_local;
3966      return FALSE;
3967
3968    case 0:
3969      stub_changed = FALSE;
3970      break;
3971
3972    case 1:
3973      stub_changed = TRUE;
3974      break;
3975    }
3976
3977  while (1)
3978    {
3979      bfd *input_bfd;
3980      unsigned int bfd_indx;
3981      asection *stub_sec;
3982
3983      for (input_bfd = info->input_bfds, bfd_indx = 0;
3984	   input_bfd != NULL;
3985	   input_bfd = input_bfd->link.next, bfd_indx++)
3986	{
3987	  Elf_Internal_Shdr *symtab_hdr;
3988	  asection *section;
3989	  Elf_Internal_Sym *local_syms;
3990
3991	  /* We'll need the symbol table in a second.  */
3992	  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3993	  if (symtab_hdr->sh_info == 0)
3994	    continue;
3995
3996	  local_syms = htab->all_local_syms[bfd_indx];
3997
3998	  /* Walk over each section attached to the input bfd.  */
3999	  for (section = input_bfd->sections;
4000	       section != NULL;
4001	       section = section->next)
4002	    {
4003	      Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
4004
4005	      /* If there aren't any relocs, then there's nothing more
4006		 to do.  */
4007	      if ((section->flags & SEC_RELOC) == 0
4008		  || section->reloc_count == 0)
4009		continue;
4010
4011	      /* If this section is a link-once section that will be
4012		 discarded, then don't create any stubs.  */
4013	      if (section->output_section == NULL
4014		  || section->output_section->owner != output_bfd)
4015		continue;
4016
4017	      /* Get the relocs.  */
4018	      internal_relocs
4019		= _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
4020					     info->keep_memory);
4021	      if (internal_relocs == NULL)
4022		goto error_ret_free_local;
4023
4024	      /* Now examine each relocation.  */
4025	      irela = internal_relocs;
4026	      irelaend = irela + section->reloc_count;
4027	      for (; irela < irelaend; irela++)
4028		{
4029		  unsigned int r_type, r_indx;
4030		  enum elf_metag_stub_type stub_type;
4031		  struct elf_metag_stub_hash_entry *hsh;
4032		  asection *sym_sec;
4033		  bfd_vma sym_value;
4034		  bfd_vma destination;
4035		  struct elf_metag_link_hash_entry *hh;
4036		  char *stub_name;
4037		  const asection *id_sec;
4038
4039		  r_type = ELF32_R_TYPE (irela->r_info);
4040		  r_indx = ELF32_R_SYM (irela->r_info);
4041
4042		  if (r_type >= (unsigned int) R_METAG_MAX)
4043		    {
4044		      bfd_set_error (bfd_error_bad_value);
4045		    error_ret_free_internal:
4046		      if (elf_section_data (section)->relocs == NULL)
4047			free (internal_relocs);
4048		      goto error_ret_free_local;
4049		    }
4050
4051		  /* Only look for stubs on CALLR and B instructions.  */
4052		  if (!(r_type == (unsigned int) R_METAG_RELBRANCH ||
4053			r_type == (unsigned int) R_METAG_RELBRANCH_PLT))
4054		    continue;
4055
4056		  /* Now determine the call target, its name, value,
4057		     section.  */
4058		  sym_sec = NULL;
4059		  sym_value = 0;
4060		  destination = 0;
4061		  hh = NULL;
4062		  if (r_indx < symtab_hdr->sh_info)
4063		    {
4064		      /* It's a local symbol.  */
4065		      Elf_Internal_Sym *sym;
4066		      Elf_Internal_Shdr *hdr;
4067		      unsigned int shndx;
4068
4069		      sym = local_syms + r_indx;
4070		      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
4071			sym_value = sym->st_value;
4072		      shndx = sym->st_shndx;
4073		      if (shndx < elf_numsections (input_bfd))
4074			{
4075			  hdr = elf_elfsections (input_bfd)[shndx];
4076			  sym_sec = hdr->bfd_section;
4077			  destination = (sym_value + irela->r_addend
4078					 + sym_sec->output_offset
4079					 + sym_sec->output_section->vma);
4080			}
4081		    }
4082		  else
4083		    {
4084		      /* It's an external symbol.  */
4085		      int e_indx;
4086
4087		      e_indx = r_indx - symtab_hdr->sh_info;
4088		      hh = ((struct elf_metag_link_hash_entry *)
4089			    elf_sym_hashes (input_bfd)[e_indx]);
4090
4091		      while (hh->eh.root.type == bfd_link_hash_indirect
4092			     || hh->eh.root.type == bfd_link_hash_warning)
4093			hh = ((struct elf_metag_link_hash_entry *)
4094			      hh->eh.root.u.i.link);
4095
4096		      if (hh->eh.root.type == bfd_link_hash_defined
4097			  || hh->eh.root.type == bfd_link_hash_defweak)
4098			{
4099			  sym_sec = hh->eh.root.u.def.section;
4100			  sym_value = hh->eh.root.u.def.value;
4101			  if (hh->eh.plt.offset != (bfd_vma) -1
4102			      && hh->eh.dynindx != -1
4103			      && r_type == (unsigned int) R_METAG_RELBRANCH_PLT)
4104			    {
4105			      sym_sec = htab->etab.splt;
4106			      sym_value = hh->eh.plt.offset;
4107			    }
4108
4109			  if (sym_sec->output_section != NULL)
4110			    destination = (sym_value + irela->r_addend
4111					   + sym_sec->output_offset
4112					   + sym_sec->output_section->vma);
4113			  else
4114			    continue;
4115			}
4116		      else if (hh->eh.root.type == bfd_link_hash_undefweak)
4117			{
4118			  if (! bfd_link_pic (info))
4119			    continue;
4120			}
4121		      else if (hh->eh.root.type == bfd_link_hash_undefined)
4122			{
4123			  if (! (info->unresolved_syms_in_objects == RM_IGNORE
4124				 && (ELF_ST_VISIBILITY (hh->eh.other)
4125				     == STV_DEFAULT)))
4126			    continue;
4127			}
4128		      else
4129			{
4130			  bfd_set_error (bfd_error_bad_value);
4131			  goto error_ret_free_internal;
4132			}
4133		    }
4134
4135		  /* Determine what (if any) linker stub is needed.  */
4136		  stub_type = metag_type_of_stub (section, irela, hh,
4137						  destination, info);
4138		  if (stub_type == metag_stub_none)
4139		    continue;
4140
4141		  /* Support for grouping stub sections.  */
4142		  id_sec = htab->stub_group[section->id].link_sec;
4143
4144		  /* Get the name of this stub.  */
4145		  stub_name = metag_stub_name (id_sec, sym_sec, hh, irela);
4146		  if (!stub_name)
4147		    goto error_ret_free_internal;
4148
4149		  hsh = metag_stub_hash_lookup (&htab->bstab,
4150						stub_name,
4151						FALSE, FALSE);
4152		  if (hsh != NULL)
4153		    {
4154		      /* The proper stub has already been created.  */
4155		      free (stub_name);
4156		      continue;
4157		    }
4158
4159		  hsh = metag_add_stub (stub_name, section, htab);
4160		  if (hsh == NULL)
4161		    {
4162		      free (stub_name);
4163		      goto error_ret_free_internal;
4164		    }
4165		  hsh->target_value = sym_value;
4166		  hsh->target_section = sym_sec;
4167		  hsh->stub_type = stub_type;
4168		  hsh->hh = hh;
4169		  hsh->addend = irela->r_addend;
4170		  stub_changed = TRUE;
4171		}
4172
4173	      /* We're done with the internal relocs, free them.  */
4174	      if (elf_section_data (section)->relocs == NULL)
4175		free (internal_relocs);
4176	    }
4177	}
4178
4179      if (!stub_changed)
4180	break;
4181
4182      /* OK, we've added some stubs.  Find out the new size of the
4183	 stub sections.  */
4184      for (stub_sec = htab->stub_bfd->sections;
4185	   stub_sec != NULL;
4186	   stub_sec = stub_sec->next)
4187	stub_sec->size = 0;
4188
4189      bfd_hash_traverse (&htab->bstab, metag_size_one_stub, htab);
4190
4191      /* Ask the linker to do its stuff.  */
4192      (*htab->layout_sections_again) ();
4193      stub_changed = FALSE;
4194    }
4195
4196  free (htab->all_local_syms);
4197  return TRUE;
4198
4199 error_ret_free_local:
4200  free (htab->all_local_syms);
4201  return FALSE;
4202}
4203
4204/* Build all the stubs associated with the current output file.  The
4205   stubs are kept in a hash table attached to the main linker hash
4206   table.  This function is called via metagelf_finish in the linker.  */
4207
4208bfd_boolean
4209elf_metag_build_stubs (struct bfd_link_info *info)
4210{
4211  asection *stub_sec;
4212  struct bfd_hash_table *table;
4213  struct elf_metag_link_hash_table *htab;
4214
4215  htab = metag_link_hash_table (info);
4216
4217  for (stub_sec = htab->stub_bfd->sections;
4218       stub_sec != NULL;
4219       stub_sec = stub_sec->next)
4220    {
4221      bfd_size_type size;
4222
4223      /* Allocate memory to hold the linker stubs.  */
4224      size = stub_sec->size;
4225      stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
4226      if (stub_sec->contents == NULL && size != 0)
4227	return FALSE;
4228      stub_sec->size = 0;
4229    }
4230
4231  /* Build the stubs as directed by the stub hash table.  */
4232  table = &htab->bstab;
4233  bfd_hash_traverse (table, metag_build_one_stub, info);
4234
4235  return TRUE;
4236}
4237
4238/* Return TRUE if SYM represents a local label symbol.  */
4239
4240static bfd_boolean
4241elf_metag_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
4242{
4243  if (name[0] == '$' && name[1] == 'L')
4244    return 1;
4245  return _bfd_elf_is_local_label_name (abfd, name);
4246}
4247
4248/* Return address for Ith PLT stub in section PLT, for relocation REL
4249   or (bfd_vma) -1 if it should not be included.  */
4250
4251static bfd_vma
4252elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
4253		       const arelent *rel ATTRIBUTE_UNUSED)
4254{
4255  return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
4256}
4257
4258#define ELF_ARCH		bfd_arch_metag
4259#define ELF_TARGET_ID		METAG_ELF_DATA
4260#define ELF_MACHINE_CODE	EM_METAG
4261#define ELF_MINPAGESIZE	0x1000
4262#define ELF_MAXPAGESIZE	0x4000
4263#define ELF_COMMONPAGESIZE	0x1000
4264
4265#define TARGET_LITTLE_SYM	metag_elf32_vec
4266#define TARGET_LITTLE_NAME	"elf32-metag"
4267
4268#define elf_symbol_leading_char '_'
4269
4270#define elf_info_to_howto_rel			NULL
4271#define elf_info_to_howto			metag_info_to_howto_rela
4272
4273#define bfd_elf32_bfd_is_local_label_name	elf_metag_is_local_label_name
4274#define bfd_elf32_bfd_link_hash_table_create \
4275	elf_metag_link_hash_table_create
4276#define elf_backend_relocate_section		elf_metag_relocate_section
4277#define elf_backend_gc_mark_hook		elf_metag_gc_mark_hook
4278#define elf_backend_gc_sweep_hook		elf_metag_gc_sweep_hook
4279#define elf_backend_check_relocs		elf_metag_check_relocs
4280#define elf_backend_create_dynamic_sections	elf_metag_create_dynamic_sections
4281#define elf_backend_adjust_dynamic_symbol	elf_metag_adjust_dynamic_symbol
4282#define elf_backend_finish_dynamic_symbol	elf_metag_finish_dynamic_symbol
4283#define elf_backend_finish_dynamic_sections	elf_metag_finish_dynamic_sections
4284#define elf_backend_size_dynamic_sections	elf_metag_size_dynamic_sections
4285#define elf_backend_omit_section_dynsym \
4286  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
4287#define elf_backend_post_process_headers	elf_metag_post_process_headers
4288#define elf_backend_reloc_type_class		elf_metag_reloc_type_class
4289#define elf_backend_copy_indirect_symbol	elf_metag_copy_indirect_symbol
4290#define elf_backend_plt_sym_val		elf_metag_plt_sym_val
4291
4292#define elf_backend_can_gc_sections		1
4293#define elf_backend_can_refcount		1
4294#define elf_backend_rela_normal			1
4295#define elf_backend_want_got_plt		1
4296#define elf_backend_want_got_sym		0
4297#define elf_backend_want_plt_sym		0
4298#define elf_backend_plt_readonly		1
4299#define elf_backend_dtrel_excludes_plt		1
4300#define elf_backend_want_dynrelro		1
4301
4302#define bfd_elf32_bfd_reloc_type_lookup	metag_reloc_type_lookup
4303#define bfd_elf32_bfd_reloc_name_lookup	metag_reloc_name_lookup
4304
4305#include "elf32-target.h"
4306