1/* Lattice Mico32-specific support for 32-bit ELF
2   Copyright (C) 2008-2017 Free Software Foundation, Inc.
3   Contributed by Jon Beniston <jon@beniston.com>
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 "elf/lm32.h"
27
28#define DEFAULT_STACK_SIZE 0x20000
29
30#define PLT_ENTRY_SIZE 20
31
32#define PLT0_ENTRY_WORD0  0
33#define PLT0_ENTRY_WORD1  0
34#define PLT0_ENTRY_WORD2  0
35#define PLT0_ENTRY_WORD3  0
36#define PLT0_ENTRY_WORD4  0
37
38#define PLT0_PIC_ENTRY_WORD0  0
39#define PLT0_PIC_ENTRY_WORD1  0
40#define PLT0_PIC_ENTRY_WORD2  0
41#define PLT0_PIC_ENTRY_WORD3  0
42#define PLT0_PIC_ENTRY_WORD4  0
43
44#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
45
46extern const bfd_target lm32_elf32_fdpic_vec;
47
48#define IS_FDPIC(bfd) ((bfd)->xvec == &lm32_elf32_fdpic_vec)
49
50static bfd_reloc_status_type lm32_elf_gprel_reloc
51  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52
53/* The linker needs to keep track of the number of relocs that it
54   decides to copy as dynamic relocs in check_relocs for each symbol.
55   This is so that it can later discard them if they are found to be
56   unnecessary.  We store the information in a field extending the
57   regular ELF linker hash table.  */
58
59struct elf_lm32_dyn_relocs
60{
61  struct elf_lm32_dyn_relocs *next;
62
63  /* The input section of the reloc.  */
64  asection *sec;
65
66  /* Total number of relocs copied for the input section.  */
67  bfd_size_type count;
68
69  /* Number of pc-relative relocs copied for the input section.  */
70  bfd_size_type pc_count;
71};
72
73/* lm32 ELF linker hash entry.  */
74
75struct elf_lm32_link_hash_entry
76{
77  struct elf_link_hash_entry root;
78
79  /* Track dynamic relocs copied for this symbol.  */
80  struct elf_lm32_dyn_relocs *dyn_relocs;
81};
82
83/* lm32 ELF linker hash table.  */
84
85struct elf_lm32_link_hash_table
86{
87  struct elf_link_hash_table root;
88
89  /* Short-cuts to get to dynamic linker sections.  */
90  asection *sfixup32;
91  asection *sdynbss;
92  asection *srelbss;
93
94  int relocs32;
95};
96
97/* Get the lm32 ELF linker hash table from a link_info structure.  */
98
99#define lm32_elf_hash_table(p) \
100  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
101  == LM32_ELF_DATA ? ((struct elf_lm32_link_hash_table *) ((p)->hash)) : NULL)
102
103#define lm32fdpic_got_section(info) \
104  (lm32_elf_hash_table (info)->root.sgot)
105#define lm32fdpic_gotrel_section(info) \
106  (lm32_elf_hash_table (info)->root.srelgot)
107#define lm32fdpic_fixup32_section(info) \
108  (lm32_elf_hash_table (info)->sfixup32)
109
110struct weak_symbol_list
111{
112  const char *name;
113  struct weak_symbol_list *next;
114};
115
116/* Create an entry in an lm32 ELF linker hash table.  */
117
118static struct bfd_hash_entry *
119lm32_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
120			    struct bfd_hash_table *table,
121			    const char *string)
122{
123  struct elf_lm32_link_hash_entry *ret =
124    (struct elf_lm32_link_hash_entry *) entry;
125
126  /* Allocate the structure if it has not already been allocated by a
127     subclass.  */
128  if (ret == NULL)
129    ret = bfd_hash_allocate (table,
130			     sizeof (struct elf_lm32_link_hash_entry));
131  if (ret == NULL)
132    return NULL;
133
134  /* Call the allocation method of the superclass.  */
135  ret = ((struct elf_lm32_link_hash_entry *)
136         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
137                                     table, string));
138  if (ret != NULL)
139    {
140      struct elf_lm32_link_hash_entry *eh;
141
142      eh = (struct elf_lm32_link_hash_entry *) ret;
143      eh->dyn_relocs = NULL;
144    }
145
146  return (struct bfd_hash_entry *) ret;
147}
148
149/* Create an lm32 ELF linker hash table.  */
150
151static struct bfd_link_hash_table *
152lm32_elf_link_hash_table_create (bfd *abfd)
153{
154  struct elf_lm32_link_hash_table *ret;
155  bfd_size_type amt = sizeof (struct elf_lm32_link_hash_table);
156
157  ret = bfd_zmalloc (amt);
158  if (ret == NULL)
159    return NULL;
160
161  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
162				      lm32_elf_link_hash_newfunc,
163				      sizeof (struct elf_lm32_link_hash_entry),
164				      LM32_ELF_DATA))
165    {
166      free (ret);
167      return NULL;
168    }
169
170  return &ret->root.root;
171}
172
173/* Add a fixup to the ROFIXUP section.  */
174
175static bfd_vma
176_lm32fdpic_add_rofixup (bfd *output_bfd, asection *rofixup, bfd_vma relocation)
177{
178  bfd_vma fixup_offset;
179
180  if (rofixup->flags & SEC_EXCLUDE)
181    return -1;
182
183  fixup_offset = rofixup->reloc_count * 4;
184  if (rofixup->contents)
185    {
186      BFD_ASSERT (fixup_offset < rofixup->size);
187      if (fixup_offset < rofixup->size)
188      bfd_put_32 (output_bfd, relocation, rofixup->contents + fixup_offset);
189    }
190  rofixup->reloc_count++;
191
192  return fixup_offset;
193}
194
195/* Create .rofixup sections in DYNOBJ, and set up
196   shortcuts to them in our hash table.  */
197
198static bfd_boolean
199create_rofixup_section (bfd *dynobj, struct bfd_link_info *info)
200{
201  struct elf_lm32_link_hash_table *htab;
202  htab = lm32_elf_hash_table (info);
203
204  if (htab == NULL)
205    return FALSE;
206
207  /* Fixup section for R_LM32_32 relocs.  */
208  lm32fdpic_fixup32_section (info)
209    = bfd_make_section_anyway_with_flags (dynobj,
210					  ".rofixup",
211					  (SEC_ALLOC
212					   | SEC_LOAD
213					   | SEC_HAS_CONTENTS
214					   | SEC_IN_MEMORY
215					   | SEC_LINKER_CREATED
216					   | SEC_READONLY));
217  if (lm32fdpic_fixup32_section (info) == NULL
218      || ! bfd_set_section_alignment (dynobj,
219				      lm32fdpic_fixup32_section (info), 2))
220    return FALSE;
221
222  return TRUE;
223}
224
225static reloc_howto_type lm32_elf_howto_table [] =
226{
227  /* This reloc does nothing.  */
228  HOWTO (R_LM32_NONE,               /* type */
229         0,                         /* rightshift */
230         3,                         /* size (0 = byte, 1 = short, 2 = long) */
231         0,                         /* bitsize */
232         FALSE,                     /* pc_relative */
233         0,                         /* bitpos */
234         complain_overflow_dont,    /* complain_on_overflow */
235         bfd_elf_generic_reloc,     /* special_function */
236         "R_LM32_NONE",             /* name */
237         FALSE,                     /* partial_inplace */
238         0,                         /* src_mask */
239         0,                         /* dst_mask */
240         FALSE),                    /* pcrel_offset */
241
242  /* An 8 bit absolute relocation.  */
243  HOWTO (R_LM32_8,                  /* type */
244         0,                         /* rightshift */
245         0,                         /* size (0 = byte, 1 = short, 2 = long) */
246         8,                         /* bitsize */
247         FALSE,                     /* pc_relative */
248         0,                         /* bitpos */
249         complain_overflow_bitfield,/* complain_on_overflow */
250         bfd_elf_generic_reloc,     /* special_function */
251         "R_LM32_8",                /* name */
252         FALSE,                     /* partial_inplace */
253         0,                         /* src_mask */
254         0xff,                      /* dst_mask */
255         FALSE),                    /* pcrel_offset */
256
257  /* A 16 bit absolute relocation.  */
258  HOWTO (R_LM32_16,                 /* type */
259         0,                         /* rightshift */
260         1,                         /* size (0 = byte, 1 = short, 2 = long) */
261         16,                        /* bitsize */
262         FALSE,                     /* pc_relative */
263         0,                         /* bitpos */
264         complain_overflow_bitfield,/* complain_on_overflow */
265         bfd_elf_generic_reloc,     /* special_function */
266         "R_LM32_16",               /* name */
267         FALSE,                     /* partial_inplace */
268         0,                         /* src_mask */
269         0xffff,                    /* dst_mask */
270         FALSE),                    /* pcrel_offset */
271
272  /* A 32 bit absolute relocation.  */
273  HOWTO (R_LM32_32,                 /* type */
274         0,                         /* rightshift */
275         2,                         /* size (0 = byte, 1 = short, 2 = long) */
276         32,                        /* bitsize */
277         FALSE,                     /* pc_relative */
278         0,                         /* bitpos */
279         complain_overflow_bitfield,/* complain_on_overflow */
280         bfd_elf_generic_reloc,     /* special_function */
281         "R_LM32_32",               /* name */
282         FALSE,                     /* partial_inplace */
283         0,                         /* src_mask */
284         0xffffffff,                /* dst_mask */
285         FALSE),                    /* pcrel_offset */
286
287  HOWTO (R_LM32_HI16,               /* type */
288         16,                        /* rightshift */
289         2,                         /* size (0 = byte, 1 = short, 2 = long) */
290         16,                        /* bitsize */
291         FALSE,                     /* pc_relative */
292         0,                         /* bitpos */
293         complain_overflow_bitfield,/* complain_on_overflow */
294         bfd_elf_generic_reloc,     /* special_function */
295         "R_LM32_HI16",             /* name */
296         FALSE,                     /* partial_inplace */
297         0,                         /* src_mask */
298         0xffff,                    /* dst_mask */
299         FALSE),                    /* pcrel_offset */
300
301  HOWTO (R_LM32_LO16,               /* type */
302         0,                         /* rightshift */
303         2,                         /* size (0 = byte, 1 = short, 2 = long) */
304         16,                        /* bitsize */
305         FALSE,                     /* pc_relative */
306         0,                         /* bitpos */
307         complain_overflow_dont,    /* complain_on_overflow */
308         bfd_elf_generic_reloc,     /* special_function */
309         "R_LM32_LO16",             /* name */
310         FALSE,                     /* partial_inplace */
311         0,                         /* src_mask */
312         0xffff,                    /* dst_mask */
313         FALSE),                    /* pcrel_offset */
314
315  HOWTO (R_LM32_GPREL16,            /* type */
316         0,                         /* rightshift */
317         2,                         /* size (0 = byte, 1 = short, 2 = long) */
318         16,                        /* bitsize */
319         FALSE,                     /* pc_relative */
320         0,                         /* bitpos */
321         complain_overflow_dont,    /* complain_on_overflow */
322         lm32_elf_gprel_reloc,      /* special_function */
323         "R_LM32_GPREL16",          /* name */
324         FALSE,                     /* partial_inplace */
325         0,                         /* src_mask */
326         0xffff,                    /* dst_mask */
327         FALSE),                    /* pcrel_offset */
328
329  HOWTO (R_LM32_CALL,               /* type */
330         2,                         /* rightshift */
331         2,                         /* size (0 = byte, 1 = short, 2 = long) */
332         26,                        /* bitsize */
333         TRUE,                      /* pc_relative */
334         0,                         /* bitpos */
335         complain_overflow_signed,  /* complain_on_overflow */
336         bfd_elf_generic_reloc,     /* special_function */
337         "R_LM32_CALL",             /* name */
338         FALSE,                     /* partial_inplace */
339         0,                         /* src_mask */
340         0x3ffffff,                 /* dst_mask */
341         TRUE),                     /* pcrel_offset */
342
343  HOWTO (R_LM32_BRANCH,             /* type */
344         2,                         /* rightshift */
345         2,                         /* size (0 = byte, 1 = short, 2 = long) */
346         16,                        /* bitsize */
347         TRUE,                      /* pc_relative */
348         0,                         /* bitpos */
349         complain_overflow_signed,  /* complain_on_overflow */
350         bfd_elf_generic_reloc,     /* special_function */
351         "R_LM32_BRANCH",           /* name */
352         FALSE,                     /* partial_inplace */
353         0,                         /* src_mask */
354         0xffff,                    /* dst_mask */
355         TRUE),                     /* pcrel_offset */
356
357  /* GNU extension to record C++ vtable hierarchy.  */
358  HOWTO (R_LM32_GNU_VTINHERIT,      /* type */
359         0,                         /* rightshift */
360         2,                         /* size (0 = byte, 1 = short, 2 = long) */
361         0,                         /* bitsize */
362         FALSE,                     /* pc_relative */
363         0,                         /* bitpos */
364         complain_overflow_dont,    /* complain_on_overflow */
365         NULL,                      /* special_function */
366         "R_LM32_GNU_VTINHERIT",    /* name */
367         FALSE,                     /* partial_inplace */
368         0,                         /* src_mask */
369         0,                         /* dst_mask */
370         FALSE),                    /* pcrel_offset */
371
372  /* GNU extension to record C++ vtable member usage.  */
373  HOWTO (R_LM32_GNU_VTENTRY,        /* type */
374         0,                         /* rightshift */
375         2,                         /* size (0 = byte, 1 = short, 2 = long) */
376         0,                         /* bitsize */
377         FALSE,                     /* pc_relative */
378         0,                         /* bitpos */
379         complain_overflow_dont,    /* complain_on_overflow */
380         _bfd_elf_rel_vtable_reloc_fn,/* special_function */
381         "R_LM32_GNU_VTENTRY",      /* name */
382         FALSE,                     /* partial_inplace */
383         0,                         /* src_mask */
384         0,                         /* dst_mask */
385         FALSE),                    /* pcrel_offset */
386
387  HOWTO (R_LM32_16_GOT,             /* type */
388         0,                         /* rightshift */
389         2,                         /* size (0 = byte, 1 = short, 2 = long) */
390         16,                        /* bitsize */
391         FALSE,                     /* pc_relative */
392         0,                         /* bitpos */
393         complain_overflow_signed,  /* complain_on_overflow */
394         bfd_elf_generic_reloc,     /* special_function */
395         "R_LM32_16_GOT",           /* name */
396         FALSE,                     /* partial_inplace */
397         0,                         /* src_mask */
398         0xffff,                    /* dst_mask */
399         FALSE),                    /* pcrel_offset */
400
401  HOWTO (R_LM32_GOTOFF_HI16,        /* type */
402         16,                        /* rightshift */
403         2,                         /* size (0 = byte, 1 = short, 2 = long) */
404         16,                        /* bitsize */
405         FALSE,                     /* pc_relative */
406         0,                         /* bitpos */
407         complain_overflow_dont,    /* complain_on_overflow */
408         bfd_elf_generic_reloc,     /* special_function */
409         "R_LM32_GOTOFF_HI16",      /* name */
410         FALSE,                     /* partial_inplace */
411         0xffff,                    /* src_mask */
412         0xffff,                    /* dst_mask */
413         FALSE),                    /* pcrel_offset */
414
415  HOWTO (R_LM32_GOTOFF_LO16,        /* type */
416         0,                         /* rightshift */
417         2,                         /* size (0 = byte, 1 = short, 2 = long) */
418         16,                        /* bitsize */
419         FALSE,                     /* pc_relative */
420         0,                         /* bitpos */
421         complain_overflow_dont,    /* complain_on_overflow */
422         bfd_elf_generic_reloc,     /* special_function */
423         "R_LM32_GOTOFF_LO16",      /* name */
424         FALSE,                     /* partial_inplace */
425         0xffff,                    /* src_mask */
426         0xffff,                    /* dst_mask */
427         FALSE),                    /* pcrel_offset */
428
429  HOWTO (R_LM32_COPY,		/* type */
430	 0,			/* rightshift */
431	 2,			/* size (0 = byte, 1 = short, 2 = long) */
432	 32,			/* bitsize */
433	 FALSE,			/* pc_relative */
434	 0,			/* bitpos */
435	 complain_overflow_bitfield, /* complain_on_overflow */
436	 bfd_elf_generic_reloc, /* special_function */
437	 "R_LM32_COPY",		/* name */
438	 FALSE,			/* partial_inplace */
439	 0xffffffff,		/* src_mask */
440	 0xffffffff,		/* dst_mask */
441	 FALSE),		/* pcrel_offset */
442
443  HOWTO (R_LM32_GLOB_DAT,	/* type */
444	 0,			/* rightshift */
445	 2,			/* size (0 = byte, 1 = short, 2 = long) */
446	 32,			/* bitsize */
447	 FALSE,			/* pc_relative */
448	 0,			/* bitpos */
449	 complain_overflow_bitfield, /* complain_on_overflow */
450	 bfd_elf_generic_reloc, /* special_function */
451	 "R_LM32_GLOB_DAT",	/* name */
452	 FALSE,			/* partial_inplace */
453	 0xffffffff,		/* src_mask */
454	 0xffffffff,		/* dst_mask */
455	 FALSE),		/* pcrel_offset */
456
457  HOWTO (R_LM32_JMP_SLOT,	/* type */
458	 0,			/* rightshift */
459	 2,			/* size (0 = byte, 1 = short, 2 = long) */
460	 32,			/* bitsize */
461	 FALSE,			/* pc_relative */
462	 0,			/* bitpos */
463	 complain_overflow_bitfield, /* complain_on_overflow */
464	 bfd_elf_generic_reloc, /* special_function */
465	 "R_LM32_JMP_SLOT",	/* name */
466	 FALSE,			/* partial_inplace */
467	 0xffffffff,		/* src_mask */
468	 0xffffffff,		/* dst_mask */
469	 FALSE),		/* pcrel_offset */
470
471  HOWTO (R_LM32_RELATIVE,	/* type */
472	 0,			/* rightshift */
473	 2,			/* size (0 = byte, 1 = short, 2 = long) */
474	 32,			/* bitsize */
475	 FALSE,			/* pc_relative */
476	 0,			/* bitpos */
477	 complain_overflow_bitfield, /* complain_on_overflow */
478	 bfd_elf_generic_reloc, /* special_function */
479	 "R_LM32_RELATIVE",	/* name */
480	 FALSE,			/* partial_inplace */
481	 0xffffffff,		/* src_mask */
482	 0xffffffff,		/* dst_mask */
483	 FALSE),		/* pcrel_offset */
484
485};
486
487/* Map BFD reloc types to lm32 ELF reloc types. */
488
489struct lm32_reloc_map
490{
491    bfd_reloc_code_real_type bfd_reloc_val;
492    unsigned char elf_reloc_val;
493};
494
495static const struct lm32_reloc_map lm32_reloc_map[] =
496{
497  { BFD_RELOC_NONE,             R_LM32_NONE },
498  { BFD_RELOC_8,                R_LM32_8 },
499  { BFD_RELOC_16,               R_LM32_16 },
500  { BFD_RELOC_32,               R_LM32_32 },
501  { BFD_RELOC_HI16,             R_LM32_HI16 },
502  { BFD_RELOC_LO16,             R_LM32_LO16 },
503  { BFD_RELOC_GPREL16,          R_LM32_GPREL16 },
504  { BFD_RELOC_LM32_CALL,        R_LM32_CALL },
505  { BFD_RELOC_LM32_BRANCH,      R_LM32_BRANCH },
506  { BFD_RELOC_VTABLE_INHERIT,   R_LM32_GNU_VTINHERIT },
507  { BFD_RELOC_VTABLE_ENTRY,     R_LM32_GNU_VTENTRY },
508  { BFD_RELOC_LM32_16_GOT,      R_LM32_16_GOT },
509  { BFD_RELOC_LM32_GOTOFF_HI16, R_LM32_GOTOFF_HI16 },
510  { BFD_RELOC_LM32_GOTOFF_LO16, R_LM32_GOTOFF_LO16 },
511  { BFD_RELOC_LM32_COPY,        R_LM32_COPY },
512  { BFD_RELOC_LM32_GLOB_DAT,    R_LM32_GLOB_DAT },
513  { BFD_RELOC_LM32_JMP_SLOT,    R_LM32_JMP_SLOT },
514  { BFD_RELOC_LM32_RELATIVE,    R_LM32_RELATIVE },
515};
516
517static reloc_howto_type *
518lm32_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
519                        bfd_reloc_code_real_type code)
520{
521  unsigned int i;
522
523  for (i = 0; i < sizeof (lm32_reloc_map) / sizeof (lm32_reloc_map[0]); i++)
524    if (lm32_reloc_map[i].bfd_reloc_val == code)
525      return &lm32_elf_howto_table[lm32_reloc_map[i].elf_reloc_val];
526  return NULL;
527}
528
529static reloc_howto_type *
530lm32_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
531			const char *r_name)
532{
533  unsigned int i;
534
535  for (i = 0;
536       i < sizeof (lm32_elf_howto_table) / sizeof (lm32_elf_howto_table[0]);
537       i++)
538    if (lm32_elf_howto_table[i].name != NULL
539	&& strcasecmp (lm32_elf_howto_table[i].name, r_name) == 0)
540      return &lm32_elf_howto_table[i];
541
542  return NULL;
543}
544
545
546/* Set the howto pointer for an Lattice Mico32 ELF reloc.  */
547
548static void
549lm32_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
550                         arelent *cache_ptr,
551                         Elf_Internal_Rela *dst)
552{
553  unsigned int r_type;
554
555  r_type = ELF32_R_TYPE (dst->r_info);
556  if (r_type >= (unsigned int) R_LM32_max)
557    {
558      /* xgettext:c-format */
559      _bfd_error_handler (_("%B: invalid LM32 reloc number: %d"), abfd, r_type);
560      r_type = 0;
561    }
562  cache_ptr->howto = &lm32_elf_howto_table[r_type];
563}
564
565/* Set the right machine number for an Lattice Mico32 ELF file. */
566
567static bfd_boolean
568lm32_elf_object_p (bfd *abfd)
569{
570  return bfd_default_set_arch_mach (abfd, bfd_arch_lm32, bfd_mach_lm32);
571}
572
573/* Set machine type flags just before file is written out. */
574
575static void
576lm32_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
577{
578  elf_elfheader (abfd)->e_machine = EM_LATTICEMICO32;
579  elf_elfheader (abfd)->e_flags &=~ EF_LM32_MACH;
580  switch (bfd_get_mach (abfd))
581    {
582      case bfd_mach_lm32:
583        elf_elfheader (abfd)->e_flags |= E_LM32_MACH;
584        break;
585      default:
586        abort ();
587    }
588}
589
590/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
591   dangerous relocation.  */
592
593static bfd_boolean
594lm32_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
595{
596  unsigned int count;
597  asymbol **sym;
598  unsigned int i;
599
600  /* If we've already figured out what GP will be, just return it. */
601  *pgp = _bfd_get_gp_value (output_bfd);
602  if (*pgp)
603    return TRUE;
604
605  count = bfd_get_symcount (output_bfd);
606  sym = bfd_get_outsymbols (output_bfd);
607
608  /* The linker script will have created a symbol named `_gp' with the
609     appropriate value.  */
610  if (sym == NULL)
611    i = count;
612  else
613    {
614      for (i = 0; i < count; i++, sym++)
615	{
616	  const char *name;
617
618	  name = bfd_asymbol_name (*sym);
619	  if (*name == '_' && strcmp (name, "_gp") == 0)
620	    {
621	      *pgp = bfd_asymbol_value (*sym);
622	      _bfd_set_gp_value (output_bfd, *pgp);
623	      break;
624	    }
625	}
626    }
627
628  if (i >= count)
629    {
630      /* Only get the error once.  */
631      *pgp = 4;
632      _bfd_set_gp_value (output_bfd, *pgp);
633      return FALSE;
634    }
635
636  return TRUE;
637}
638
639/* We have to figure out the gp value, so that we can adjust the
640   symbol value correctly.  We look up the symbol _gp in the output
641   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
642   target data.  We don't need to adjust the symbol value for an
643   external symbol if we are producing relocatable output.  */
644
645static bfd_reloc_status_type
646lm32_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
647                    char **error_message, bfd_vma *pgp)
648{
649  if (bfd_is_und_section (symbol->section) && !relocatable)
650    {
651      *pgp = 0;
652      return bfd_reloc_undefined;
653    }
654
655  *pgp = _bfd_get_gp_value (output_bfd);
656  if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
657    {
658      if (relocatable)
659	{
660	  /* Make up a value.  */
661	  *pgp = symbol->section->output_section->vma + 0x4000;
662	  _bfd_set_gp_value (output_bfd, *pgp);
663	}
664      else if (!lm32_elf_assign_gp (output_bfd, pgp))
665	{
666	  *error_message =
667	    (char *)
668	    _("global pointer relative relocation when _gp not defined");
669	  return bfd_reloc_dangerous;
670	}
671    }
672
673  return bfd_reloc_ok;
674}
675
676static bfd_reloc_status_type
677lm32_elf_do_gprel_relocate (bfd *abfd,
678			    reloc_howto_type *howto,
679			    asection *input_section ATTRIBUTE_UNUSED,
680			    bfd_byte *data,
681			    bfd_vma offset,
682			    bfd_vma symbol_value,
683			    bfd_vma addend)
684{
685  return _bfd_final_link_relocate (howto, abfd, input_section,
686				   data, offset, symbol_value, addend);
687}
688
689static bfd_reloc_status_type
690lm32_elf_gprel_reloc (bfd *abfd,
691		      arelent *reloc_entry,
692		      asymbol *symbol,
693		      void *data,
694		      asection *input_section,
695		      bfd *output_bfd,
696		      char **msg)
697{
698  bfd_vma relocation;
699  bfd_vma gp;
700  bfd_reloc_status_type r;
701
702  if (output_bfd != (bfd *) NULL
703      && (symbol->flags & BSF_SECTION_SYM) == 0
704      && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
705    {
706      reloc_entry->address += input_section->output_offset;
707      return bfd_reloc_ok;
708    }
709
710  if (output_bfd != NULL)
711    return bfd_reloc_ok;
712
713  relocation = symbol->value
714    + symbol->section->output_section->vma + symbol->section->output_offset;
715
716  if ((r =
717       lm32_elf_final_gp (abfd, symbol, FALSE, msg, &gp)) == bfd_reloc_ok)
718    {
719      relocation = relocation + reloc_entry->addend - gp;
720      reloc_entry->addend = 0;
721      if ((signed) relocation < -32768 || (signed) relocation > 32767)
722	{
723	  *msg = _("global pointer relative address out of range");
724	  r = bfd_reloc_outofrange;
725	}
726      else
727	{
728	  r = lm32_elf_do_gprel_relocate (abfd, reloc_entry->howto,
729					     input_section,
730					     data, reloc_entry->address,
731					     relocation, reloc_entry->addend);
732	}
733    }
734
735  return r;
736}
737
738/* Find the segment number in which OSEC, and output section, is
739   located.  */
740
741static unsigned
742_lm32fdpic_osec_to_segment (bfd *output_bfd, asection *osec)
743{
744  struct elf_segment_map *m;
745  Elf_Internal_Phdr *p;
746
747  /* Find the segment that contains the output_section.  */
748  for (m = elf_seg_map (output_bfd), p = elf_tdata (output_bfd)->phdr;
749       m != NULL;
750       m = m->next, p++)
751    {
752      int i;
753
754      for (i = m->count - 1; i >= 0; i--)
755	if (m->sections[i] == osec)
756	  break;
757
758      if (i >= 0)
759	break;
760    }
761
762  return p - elf_tdata (output_bfd)->phdr;
763}
764
765/* Determine if an output section is read-only.  */
766
767inline static bfd_boolean
768_lm32fdpic_osec_readonly_p (bfd *output_bfd, asection *osec)
769{
770  unsigned seg = _lm32fdpic_osec_to_segment (output_bfd, osec);
771
772  return ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W);
773}
774
775/* Relocate a section */
776
777static bfd_boolean
778lm32_elf_relocate_section (bfd *output_bfd,
779                           struct bfd_link_info *info,
780                           bfd *input_bfd,
781                           asection *input_section,
782                           bfd_byte *contents,
783                           Elf_Internal_Rela *relocs,
784                           Elf_Internal_Sym *local_syms,
785                           asection **local_sections)
786{
787  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
788  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
789  Elf_Internal_Rela *rel, *relend;
790  struct elf_lm32_link_hash_table *htab = lm32_elf_hash_table (info);
791  bfd_vma *local_got_offsets;
792  asection *sgot;
793
794  if (htab == NULL)
795    return FALSE;
796
797  local_got_offsets = elf_local_got_offsets (input_bfd);
798
799  sgot = htab->root.sgot;
800
801  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
802  sym_hashes = elf_sym_hashes (input_bfd);
803
804  rel = relocs;
805  relend = relocs + input_section->reloc_count;
806  for (; rel < relend; rel++)
807    {
808      reloc_howto_type *howto;
809      unsigned int r_type;
810      unsigned long r_symndx;
811      Elf_Internal_Sym *sym;
812      asection *sec;
813      struct elf_link_hash_entry *h;
814      bfd_vma relocation;
815      bfd_vma gp;
816      bfd_reloc_status_type r;
817      const char *name = NULL;
818
819      r_symndx = ELF32_R_SYM (rel->r_info);
820      r_type = ELF32_R_TYPE (rel->r_info);
821
822      if (r_type == R_LM32_GNU_VTENTRY
823          || r_type == R_LM32_GNU_VTINHERIT )
824        continue;
825
826      h = NULL;
827      sym = NULL;
828      sec = NULL;
829
830      howto = lm32_elf_howto_table + r_type;
831
832      if (r_symndx < symtab_hdr->sh_info)
833        {
834          /* It's a local symbol.  */
835          sym = local_syms + r_symndx;
836          sec = local_sections[r_symndx];
837          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
838          name = bfd_elf_string_from_elf_section
839	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
840	  name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
841        }
842      else
843        {
844          /* It's a global symbol.  */
845          bfd_boolean unresolved_reloc;
846	  bfd_boolean warned, ignored;
847
848	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
849				   r_symndx, symtab_hdr, sym_hashes,
850				   h, sec, relocation,
851				   unresolved_reloc, warned, ignored);
852	  name = h->root.root.string;
853        }
854
855      if (sec != NULL && discarded_section (sec))
856	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
857					 rel, 1, relend, howto, 0, contents);
858
859      if (bfd_link_relocatable (info))
860        {
861	  /* This is a relocatable link.  We don't have to change
862	     anything, unless the reloc is against a section symbol,
863	     in which case we have to adjust according to where the
864	     section symbol winds up in the output section.  */
865	  if (sym == NULL || ELF_ST_TYPE (sym->st_info) != STT_SECTION)
866	    continue;
867
868	  /* If partial_inplace, we need to store any additional addend
869	     back in the section.  */
870	  if (! howto->partial_inplace)
871	    continue;
872
873          /* Shouldn't reach here.  */
874	  abort ();
875	  r = bfd_reloc_ok;
876        }
877      else
878        {
879          switch (howto->type)
880            {
881            case R_LM32_GPREL16:
882              if (!lm32_elf_assign_gp (output_bfd, &gp))
883                r = bfd_reloc_dangerous;
884              else
885                {
886                  relocation = relocation + rel->r_addend - gp;
887                  rel->r_addend = 0;
888                  if ((signed)relocation < -32768 || (signed)relocation > 32767)
889                    r = bfd_reloc_outofrange;
890                  else
891                    {
892                      r = _bfd_final_link_relocate (howto, input_bfd,
893                				  input_section, contents,
894               				  rel->r_offset, relocation,
895               				  rel->r_addend);
896                   }
897                }
898              break;
899            case R_LM32_16_GOT:
900              /* Relocation is to the entry for this symbol in the global
901                 offset table.  */
902              BFD_ASSERT (sgot != NULL);
903              if (h != NULL)
904                {
905                  bfd_boolean dyn;
906                  bfd_vma off;
907
908                  off = h->got.offset;
909                  BFD_ASSERT (off != (bfd_vma) -1);
910
911                  dyn = htab->root.dynamic_sections_created;
912                  if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
913							 bfd_link_pic (info),
914							 h)
915                      || (bfd_link_pic (info)
916                          && (info->symbolic
917                              || h->dynindx == -1
918                              || h->forced_local)
919                          && h->def_regular))
920                    {
921                      /* This is actually a static link, or it is a
922                         -Bsymbolic link and the symbol is defined
923                         locally, or the symbol was forced to be local
924                         because of a version file.  We must initialize
925                         this entry in the global offset table.  Since the
926                         offset must always be a multiple of 4, we use the
927                         least significant bit to record whether we have
928                         initialized it already.
929
930                         When doing a dynamic link, we create a .rela.got
931                         relocation entry to initialize the value.  This
932                         is done in the finish_dynamic_symbol routine.  */
933                      if ((off & 1) != 0)
934                        off &= ~1;
935                      else
936                        {
937                          /* Write entry in GOT */
938                          bfd_put_32 (output_bfd, relocation,
939                                      sgot->contents + off);
940                          /* Create entry in .rofixup pointing to GOT entry.  */
941                           if (IS_FDPIC (output_bfd) && h->root.type != bfd_link_hash_undefweak)
942                             {
943	                       _lm32fdpic_add_rofixup (output_bfd,
944			                               lm32fdpic_fixup32_section
945				                        (info),
946				                       sgot->output_section->vma
947                                                        + sgot->output_offset
948                                                        + off);
949                             }
950                          /* Mark GOT entry as having been written.  */
951                          h->got.offset |= 1;
952                        }
953                    }
954
955                  relocation = sgot->output_offset + off;
956                }
957              else
958                {
959                  bfd_vma off;
960                  bfd_byte *loc;
961
962                  BFD_ASSERT (local_got_offsets != NULL
963                              && local_got_offsets[r_symndx] != (bfd_vma) -1);
964
965                  /* Get offset into GOT table.  */
966                  off = local_got_offsets[r_symndx];
967
968                  /* The offset must always be a multiple of 4.  We use
969                     the least significant bit to record whether we have
970                     already processed this entry.  */
971                  if ((off & 1) != 0)
972                    off &= ~1;
973                  else
974                    {
975                      /* Write entry in GOT.  */
976                      bfd_put_32 (output_bfd, relocation, sgot->contents + off);
977                      /* Create entry in .rofixup pointing to GOT entry.  */
978                      if (IS_FDPIC (output_bfd))
979                        {
980	                  _lm32fdpic_add_rofixup (output_bfd,
981				                  lm32fdpic_fixup32_section
982				                   (info),
983				                  sgot->output_section->vma
984                                                   + sgot->output_offset
985                                                   + off);
986                        }
987
988                      if (bfd_link_pic (info))
989                        {
990                          asection *srelgot;
991                          Elf_Internal_Rela outrel;
992
993                          /* We need to generate a R_LM32_RELATIVE reloc
994                             for the dynamic linker.  */
995                          srelgot = htab->root.srelgot;
996                          BFD_ASSERT (srelgot != NULL);
997
998                          outrel.r_offset = (sgot->output_section->vma
999                                             + sgot->output_offset
1000                                             + off);
1001                          outrel.r_info = ELF32_R_INFO (0, R_LM32_RELATIVE);
1002                          outrel.r_addend = relocation;
1003                          loc = srelgot->contents;
1004                          loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
1005                          bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
1006                          ++srelgot->reloc_count;
1007                        }
1008
1009                      local_got_offsets[r_symndx] |= 1;
1010                    }
1011
1012
1013                  relocation = sgot->output_offset + off;
1014                }
1015
1016              /* Addend should be zero.  */
1017              if (rel->r_addend != 0)
1018		_bfd_error_handler (_("internal error: addend should be zero for R_LM32_16_GOT"));
1019
1020              r = _bfd_final_link_relocate (howto,
1021                                            input_bfd,
1022                                            input_section,
1023                                            contents,
1024                                            rel->r_offset,
1025                                            relocation,
1026                                            rel->r_addend);
1027              break;
1028
1029            case R_LM32_GOTOFF_LO16:
1030            case R_LM32_GOTOFF_HI16:
1031              /* Relocation is offset from GOT.  */
1032	      BFD_ASSERT (sgot != NULL);
1033	      relocation -= sgot->output_section->vma;
1034	      /* Account for sign-extension.  */
1035              if ((r_type == R_LM32_GOTOFF_HI16)
1036                  && ((relocation + rel->r_addend) & 0x8000))
1037                rel->r_addend += 0x10000;
1038              r = _bfd_final_link_relocate (howto,
1039                                            input_bfd,
1040                                            input_section,
1041                                            contents,
1042                                            rel->r_offset,
1043                                            relocation,
1044                                            rel->r_addend);
1045              break;
1046
1047            case R_LM32_32:
1048              if (IS_FDPIC (output_bfd))
1049                {
1050                  if ((!h) || (h && h->root.type != bfd_link_hash_undefweak))
1051                    {
1052                      /* Only create .rofixup entries for relocs in loadable sections.  */
1053                      if ((bfd_get_section_flags (output_bfd, input_section->output_section)
1054                          & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
1055
1056                        {
1057                          /* Check address to be modified is writable.  */
1058                          if (_lm32fdpic_osec_readonly_p (output_bfd,
1059                                                          input_section
1060                                                           ->output_section))
1061                            {
1062                              info->callbacks->warning
1063                                (info,
1064                                 _("cannot emit dynamic relocations in read-only section"),
1065                                 name, input_bfd, input_section, rel->r_offset);
1066                               return FALSE;
1067                            }
1068                          /* Create entry in .rofixup section.  */
1069                          _lm32fdpic_add_rofixup (output_bfd,
1070                                                  lm32fdpic_fixup32_section (info),
1071                                                  input_section->output_section->vma
1072                                                   + input_section->output_offset
1073                                                   + rel->r_offset);
1074                        }
1075                    }
1076                }
1077              /* Fall through.  */
1078
1079            default:
1080              r = _bfd_final_link_relocate (howto,
1081                                            input_bfd,
1082                                            input_section,
1083                                            contents,
1084                                            rel->r_offset,
1085                                            relocation,
1086                                            rel->r_addend);
1087              break;
1088            }
1089        }
1090
1091      if (r != bfd_reloc_ok)
1092        {
1093          const char *msg = NULL;
1094          arelent bfd_reloc;
1095
1096          lm32_info_to_howto_rela (input_bfd, &bfd_reloc, rel);
1097          howto = bfd_reloc.howto;
1098
1099          if (h != NULL)
1100            name = h->root.root.string;
1101          else
1102            {
1103              name = (bfd_elf_string_from_elf_section
1104                      (input_bfd, symtab_hdr->sh_link, sym->st_name));
1105              if (name == NULL || *name == '\0')
1106                name = bfd_section_name (input_bfd, sec);
1107            }
1108
1109          switch (r)
1110            {
1111	    case bfd_reloc_overflow:
1112	      if ((h != NULL)
1113                 && (h->root.type == bfd_link_hash_undefweak))
1114	        break;
1115	      (*info->callbacks->reloc_overflow)
1116		(info, (h ? &h->root : NULL), name, howto->name,
1117		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1118	      break;
1119
1120            case bfd_reloc_undefined:
1121	      (*info->callbacks->undefined_symbol)
1122		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
1123              break;
1124
1125            case bfd_reloc_outofrange:
1126              msg = _("internal error: out of range error");
1127              goto common_error;
1128
1129            case bfd_reloc_notsupported:
1130              msg = _("internal error: unsupported relocation error");
1131              goto common_error;
1132
1133            case bfd_reloc_dangerous:
1134              msg = _("internal error: dangerous error");
1135              goto common_error;
1136
1137            default:
1138              msg = _("internal error: unknown error");
1139              /* fall through */
1140
1141            common_error:
1142	      (*info->callbacks->warning) (info, msg, name, input_bfd,
1143					   input_section, rel->r_offset);
1144              break;
1145            }
1146        }
1147    }
1148
1149  return TRUE;
1150}
1151
1152static asection *
1153lm32_elf_gc_mark_hook (asection *sec,
1154                       struct bfd_link_info *info,
1155                       Elf_Internal_Rela *rel,
1156                       struct elf_link_hash_entry *h,
1157                       Elf_Internal_Sym *sym)
1158{
1159  if (h != NULL)
1160    switch (ELF32_R_TYPE (rel->r_info))
1161      {
1162      case R_LM32_GNU_VTINHERIT:
1163      case R_LM32_GNU_VTENTRY:
1164	return NULL;
1165      }
1166
1167  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1168}
1169
1170static bfd_boolean
1171lm32_elf_gc_sweep_hook (bfd *abfd,
1172                        struct bfd_link_info *info ATTRIBUTE_UNUSED,
1173                        asection *sec,
1174                        const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
1175{
1176  /* Update the got entry reference counts for the section being removed.  */
1177  Elf_Internal_Shdr *symtab_hdr;
1178  struct elf_link_hash_entry **sym_hashes;
1179  bfd_signed_vma *local_got_refcounts;
1180  const Elf_Internal_Rela *rel, *relend;
1181
1182  elf_section_data (sec)->local_dynrel = NULL;
1183
1184  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1185  sym_hashes = elf_sym_hashes (abfd);
1186  local_got_refcounts = elf_local_got_refcounts (abfd);
1187
1188  relend = relocs + sec->reloc_count;
1189  for (rel = relocs; rel < relend; rel++)
1190    {
1191      unsigned long r_symndx;
1192      struct elf_link_hash_entry *h = NULL;
1193
1194      r_symndx = ELF32_R_SYM (rel->r_info);
1195      if (r_symndx >= symtab_hdr->sh_info)
1196	{
1197	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1198	  while (h->root.type == bfd_link_hash_indirect
1199		 || h->root.type == bfd_link_hash_warning)
1200	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1201	}
1202
1203      switch (ELF32_R_TYPE (rel->r_info))
1204	{
1205	case R_LM32_16_GOT:
1206	  if (h != NULL)
1207	    {
1208	      if (h->got.refcount > 0)
1209		h->got.refcount--;
1210	    }
1211	  else
1212	    {
1213	      if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
1214		local_got_refcounts[r_symndx]--;
1215	    }
1216	  break;
1217
1218	default:
1219	  break;
1220	}
1221    }
1222  return TRUE;
1223}
1224
1225/* Look through the relocs for a section during the first phase.  */
1226
1227static bfd_boolean
1228lm32_elf_check_relocs (bfd *abfd,
1229                       struct bfd_link_info *info,
1230                       asection *sec,
1231                       const Elf_Internal_Rela *relocs)
1232{
1233  Elf_Internal_Shdr *symtab_hdr;
1234  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
1235  const Elf_Internal_Rela *rel;
1236  const Elf_Internal_Rela *rel_end;
1237  struct elf_lm32_link_hash_table *htab;
1238  bfd *dynobj;
1239
1240  if (bfd_link_relocatable (info))
1241    return TRUE;
1242
1243  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1244  sym_hashes = elf_sym_hashes (abfd);
1245  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
1246  if (!elf_bad_symtab (abfd))
1247    sym_hashes_end -= symtab_hdr->sh_info;
1248
1249  htab = lm32_elf_hash_table (info);
1250  if (htab == NULL)
1251    return FALSE;
1252
1253  dynobj = htab->root.dynobj;
1254
1255  rel_end = relocs + sec->reloc_count;
1256  for (rel = relocs; rel < rel_end; rel++)
1257    {
1258      int r_type;
1259      struct elf_link_hash_entry *h;
1260      unsigned long r_symndx;
1261
1262      r_symndx = ELF32_R_SYM (rel->r_info);
1263      r_type = ELF32_R_TYPE (rel->r_info);
1264      if (r_symndx < symtab_hdr->sh_info)
1265        h = NULL;
1266      else
1267	{
1268	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1269	  while (h->root.type == bfd_link_hash_indirect
1270		 || h->root.type == bfd_link_hash_warning)
1271	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1272
1273	  /* PR15323, ref flags aren't set for references in the same
1274	     object.  */
1275	  h->root.non_ir_ref = 1;
1276	}
1277
1278      /* Some relocs require a global offset table.  */
1279      if (htab->root.sgot == NULL)
1280        {
1281          switch (r_type)
1282            {
1283            case R_LM32_16_GOT:
1284            case R_LM32_GOTOFF_HI16:
1285            case R_LM32_GOTOFF_LO16:
1286              if (dynobj == NULL)
1287                htab->root.dynobj = dynobj = abfd;
1288              if (!_bfd_elf_create_got_section (dynobj, info))
1289                return FALSE;
1290              break;
1291            }
1292        }
1293
1294      /* Some relocs require a rofixup table. */
1295      if (IS_FDPIC (abfd))
1296        {
1297          switch (r_type)
1298            {
1299            case R_LM32_32:
1300              /* FDPIC requires a GOT if there is a .rofixup section
1301                 (Normal ELF doesn't). */
1302              if (dynobj == NULL)
1303                htab->root.dynobj = dynobj = abfd;
1304              if (!_bfd_elf_create_got_section (dynobj, info))
1305                return FALSE;
1306              /* Create .rofixup section */
1307              if (htab->sfixup32 == NULL)
1308                {
1309                  if (! create_rofixup_section (dynobj, info))
1310                    return FALSE;
1311                }
1312              break;
1313            case R_LM32_16_GOT:
1314            case R_LM32_GOTOFF_HI16:
1315            case R_LM32_GOTOFF_LO16:
1316              /* Create .rofixup section.  */
1317              if (htab->sfixup32 == NULL)
1318                {
1319		  if (dynobj == NULL)
1320		    htab->root.dynobj = dynobj = abfd;
1321                  if (! create_rofixup_section (dynobj, info))
1322                    return FALSE;
1323                }
1324              break;
1325            }
1326        }
1327
1328      switch (r_type)
1329	{
1330	case R_LM32_16_GOT:
1331          if (h != NULL)
1332            h->got.refcount += 1;
1333          else
1334            {
1335              bfd_signed_vma *local_got_refcounts;
1336
1337              /* This is a global offset table entry for a local symbol.  */
1338              local_got_refcounts = elf_local_got_refcounts (abfd);
1339              if (local_got_refcounts == NULL)
1340                {
1341                  bfd_size_type size;
1342
1343                  size = symtab_hdr->sh_info;
1344                  size *= sizeof (bfd_signed_vma);
1345                  local_got_refcounts = bfd_zalloc (abfd, size);
1346                  if (local_got_refcounts == NULL)
1347                    return FALSE;
1348                  elf_local_got_refcounts (abfd) = local_got_refcounts;
1349                }
1350              local_got_refcounts[r_symndx] += 1;
1351            }
1352          break;
1353
1354        /* This relocation describes the C++ object vtable hierarchy.
1355           Reconstruct it for later use during GC.  */
1356        case R_LM32_GNU_VTINHERIT:
1357          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1358            return FALSE;
1359          break;
1360
1361        /* This relocation describes which C++ vtable entries are actually
1362           used.  Record for later use during GC.  */
1363        case R_LM32_GNU_VTENTRY:
1364          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1365            return FALSE;
1366          break;
1367
1368        }
1369    }
1370
1371  return TRUE;
1372}
1373
1374/* Finish up the dynamic sections.  */
1375
1376static bfd_boolean
1377lm32_elf_finish_dynamic_sections (bfd *output_bfd,
1378				  struct bfd_link_info *info)
1379{
1380  struct elf_lm32_link_hash_table *htab;
1381  bfd *dynobj;
1382  asection *sdyn;
1383  asection *sgot;
1384
1385  htab = lm32_elf_hash_table (info);
1386  if (htab == NULL)
1387    return FALSE;
1388
1389  dynobj = htab->root.dynobj;
1390
1391  sgot = htab->root.sgotplt;
1392  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
1393
1394  if (htab->root.dynamic_sections_created)
1395    {
1396      asection *splt;
1397      Elf32_External_Dyn *dyncon, *dynconend;
1398
1399      BFD_ASSERT (sgot != NULL && sdyn != NULL);
1400
1401      dyncon = (Elf32_External_Dyn *) sdyn->contents;
1402      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
1403
1404      for (; dyncon < dynconend; dyncon++)
1405        {
1406          Elf_Internal_Dyn dyn;
1407          asection *s;
1408
1409          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1410
1411          switch (dyn.d_tag)
1412            {
1413            default:
1414              break;
1415
1416            case DT_PLTGOT:
1417              s = htab->root.sgotplt;
1418              goto get_vma;
1419            case DT_JMPREL:
1420              s = htab->root.srelplt;
1421            get_vma:
1422              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
1423              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1424              break;
1425
1426            case DT_PLTRELSZ:
1427              s = htab->root.srelplt;
1428	      dyn.d_un.d_val = s->size;
1429              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1430              break;
1431            }
1432        }
1433
1434      /* Fill in the first entry in the procedure linkage table.  */
1435      splt = htab->root.splt;
1436      if (splt && splt->size > 0)
1437        {
1438          if (bfd_link_pic (info))
1439            {
1440              bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD0, splt->contents);
1441              bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD1, splt->contents + 4);
1442              bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD2, splt->contents + 8);
1443              bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD3, splt->contents + 12);
1444              bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD4, splt->contents + 16);
1445            }
1446          else
1447            {
1448              unsigned long addr;
1449              /* addr = .got + 4 */
1450              addr = sgot->output_section->vma + sgot->output_offset + 4;
1451              bfd_put_32 (output_bfd,
1452			  PLT0_ENTRY_WORD0 | ((addr >> 16) & 0xffff),
1453			  splt->contents);
1454              bfd_put_32 (output_bfd,
1455			  PLT0_ENTRY_WORD1 | (addr & 0xffff),
1456			  splt->contents + 4);
1457              bfd_put_32 (output_bfd, PLT0_ENTRY_WORD2, splt->contents + 8);
1458              bfd_put_32 (output_bfd, PLT0_ENTRY_WORD3, splt->contents + 12);
1459              bfd_put_32 (output_bfd, PLT0_ENTRY_WORD4, splt->contents + 16);
1460            }
1461
1462          elf_section_data (splt->output_section)->this_hdr.sh_entsize =
1463            PLT_ENTRY_SIZE;
1464        }
1465    }
1466
1467  /* Fill in the first three entries in the global offset table.  */
1468  if (sgot && sgot->size > 0)
1469    {
1470      if (sdyn == NULL)
1471        bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1472      else
1473        bfd_put_32 (output_bfd,
1474                    sdyn->output_section->vma + sdyn->output_offset,
1475                    sgot->contents);
1476      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
1477      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
1478
1479      /* FIXME:  This can be null if create_dynamic_sections wasn't called. */
1480      if (elf_section_data (sgot->output_section) != NULL)
1481        elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1482    }
1483
1484  if (lm32fdpic_fixup32_section (info))
1485    {
1486      struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot;
1487      bfd_vma got_value = hgot->root.u.def.value
1488            + hgot->root.u.def.section->output_section->vma
1489            + hgot->root.u.def.section->output_offset;
1490      struct bfd_link_hash_entry *hend;
1491
1492      /* Last entry is pointer to GOT.  */
1493      _lm32fdpic_add_rofixup (output_bfd, lm32fdpic_fixup32_section (info), got_value);
1494
1495      /* Check we wrote enough entries.  */
1496      if (lm32fdpic_fixup32_section (info)->size
1497              != (lm32fdpic_fixup32_section (info)->reloc_count * 4))
1498        {
1499	  _bfd_error_handler
1500            ("LINKER BUG: .rofixup section size mismatch: size/4 %d != relocs %d",
1501            lm32fdpic_fixup32_section (info)->size/4,
1502            lm32fdpic_fixup32_section (info)->reloc_count);
1503          return FALSE;
1504        }
1505
1506      hend = bfd_link_hash_lookup (info->hash, "__ROFIXUP_END__",
1507              FALSE, FALSE, TRUE);
1508      if (hend
1509          && (hend->type == bfd_link_hash_defined
1510              || hend->type == bfd_link_hash_defweak))
1511        {
1512          bfd_vma value =
1513            lm32fdpic_fixup32_section (info)->output_section->vma
1514            + lm32fdpic_fixup32_section (info)->output_offset
1515            + lm32fdpic_fixup32_section (info)->size
1516            - hend->u.def.section->output_section->vma
1517            - hend->u.def.section->output_offset;
1518          BFD_ASSERT (hend->u.def.value == value);
1519          if (hend->u.def.value != value)
1520            {
1521	      _bfd_error_handler
1522                ("LINKER BUG: .rofixup section hend->u.def.value != value: %ld != %ld", hend->u.def.value, value);
1523              return FALSE;
1524            }
1525        }
1526    }
1527
1528  return TRUE;
1529}
1530
1531/* Finish up dynamic symbol handling.  We set the contents of various
1532   dynamic sections here.  */
1533
1534static bfd_boolean
1535lm32_elf_finish_dynamic_symbol (bfd *output_bfd,
1536				struct bfd_link_info *info,
1537				struct elf_link_hash_entry *h,
1538				Elf_Internal_Sym *sym)
1539{
1540  struct elf_lm32_link_hash_table *htab;
1541  bfd_byte *loc;
1542
1543  htab = lm32_elf_hash_table (info);
1544  if (htab == NULL)
1545    return FALSE;
1546
1547  if (h->plt.offset != (bfd_vma) -1)
1548    {
1549      asection *splt;
1550      asection *sgot;
1551      asection *srela;
1552
1553      bfd_vma plt_index;
1554      bfd_vma got_offset;
1555      Elf_Internal_Rela rela;
1556
1557      /* This symbol has an entry in the procedure linkage table.  Set
1558         it up.  */
1559      BFD_ASSERT (h->dynindx != -1);
1560
1561      splt = htab->root.splt;
1562      sgot = htab->root.sgotplt;
1563      srela = htab->root.srelplt;
1564      BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1565
1566      /* Get the index in the procedure linkage table which
1567         corresponds to this symbol.  This is the index of this symbol
1568         in all the symbols for which we are making plt entries.  The
1569         first entry in the procedure linkage table is reserved.  */
1570      plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1571
1572      /* Get the offset into the .got table of the entry that
1573        corresponds to this function.  Each .got entry is 4 bytes.
1574        The first three are reserved.  */
1575      got_offset = (plt_index + 3) * 4;
1576
1577      /* Fill in the entry in the procedure linkage table.  */
1578      if (! bfd_link_pic (info))
1579        {
1580          /* TODO */
1581        }
1582      else
1583        {
1584          /* TODO */
1585        }
1586
1587      /* Fill in the entry in the global offset table.  */
1588      bfd_put_32 (output_bfd,
1589                  (splt->output_section->vma
1590                   + splt->output_offset
1591                   + h->plt.offset
1592                   + 12), /* same offset */
1593                  sgot->contents + got_offset);
1594
1595      /* Fill in the entry in the .rela.plt section.  */
1596      rela.r_offset = (sgot->output_section->vma
1597                       + sgot->output_offset
1598                       + got_offset);
1599      rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_JMP_SLOT);
1600      rela.r_addend = 0;
1601      loc = srela->contents;
1602      loc += plt_index * sizeof (Elf32_External_Rela);
1603      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1604
1605      if (!h->def_regular)
1606        {
1607          /* Mark the symbol as undefined, rather than as defined in
1608             the .plt section.  Leave the value alone.  */
1609          sym->st_shndx = SHN_UNDEF;
1610        }
1611
1612    }
1613
1614  if (h->got.offset != (bfd_vma) -1)
1615    {
1616      asection *sgot;
1617      asection *srela;
1618      Elf_Internal_Rela rela;
1619
1620      /* This symbol has an entry in the global offset table.  Set it
1621         up.  */
1622      sgot = htab->root.sgot;
1623      srela = htab->root.srelgot;
1624      BFD_ASSERT (sgot != NULL && srela != NULL);
1625
1626      rela.r_offset = (sgot->output_section->vma
1627                       + sgot->output_offset
1628                       + (h->got.offset &~ 1));
1629
1630      /* If this is a -Bsymbolic link, and the symbol is defined
1631         locally, we just want to emit a RELATIVE reloc.  Likewise if
1632         the symbol was forced to be local because of a version file.
1633         The entry in the global offset table will already have been
1634         initialized in the relocate_section function.  */
1635      if (bfd_link_pic (info)
1636          && (info->symbolic
1637	      || h->dynindx == -1
1638	      || h->forced_local)
1639          && h->def_regular)
1640        {
1641          rela.r_info = ELF32_R_INFO (0, R_LM32_RELATIVE);
1642          rela.r_addend = (h->root.u.def.value
1643                           + h->root.u.def.section->output_section->vma
1644                           + h->root.u.def.section->output_offset);
1645        }
1646      else
1647        {
1648	  BFD_ASSERT ((h->got.offset & 1) == 0);
1649          bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
1650          rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_GLOB_DAT);
1651          rela.r_addend = 0;
1652        }
1653
1654      loc = srela->contents;
1655      loc += srela->reloc_count * sizeof (Elf32_External_Rela);
1656      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1657      ++srela->reloc_count;
1658    }
1659
1660  if (h->needs_copy)
1661    {
1662      asection *s;
1663      Elf_Internal_Rela rela;
1664
1665      /* This symbols needs a copy reloc.  Set it up.  */
1666      BFD_ASSERT (h->dynindx != -1
1667                  && (h->root.type == bfd_link_hash_defined
1668                      || h->root.type == bfd_link_hash_defweak));
1669
1670      s = bfd_get_linker_section (htab->root.dynobj, ".rela.bss");
1671      BFD_ASSERT (s != NULL);
1672
1673      rela.r_offset = (h->root.u.def.value
1674                       + h->root.u.def.section->output_section->vma
1675                       + h->root.u.def.section->output_offset);
1676      rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_COPY);
1677      rela.r_addend = 0;
1678      loc = s->contents;
1679      loc += s->reloc_count * sizeof (Elf32_External_Rela);
1680      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1681      ++s->reloc_count;
1682    }
1683
1684  /* Mark some specially defined symbols as absolute.  */
1685  if (h == htab->root.hdynamic || h == htab->root.hgot)
1686    sym->st_shndx = SHN_ABS;
1687
1688  return TRUE;
1689}
1690
1691static enum elf_reloc_type_class
1692lm32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
1693			   const asection *rel_sec ATTRIBUTE_UNUSED,
1694			   const Elf_Internal_Rela *rela)
1695{
1696  switch ((int) ELF32_R_TYPE (rela->r_info))
1697    {
1698    case R_LM32_RELATIVE:  return reloc_class_relative;
1699    case R_LM32_JMP_SLOT:  return reloc_class_plt;
1700    case R_LM32_COPY:      return reloc_class_copy;
1701    default:      	   return reloc_class_normal;
1702    }
1703}
1704
1705/* Adjust a symbol defined by a dynamic object and referenced by a
1706   regular object.  The current definition is in some section of the
1707   dynamic object, but we're not including those sections.  We have to
1708   change the definition to something the rest of the link can
1709   understand.  */
1710
1711static bfd_boolean
1712lm32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1713				struct elf_link_hash_entry *h)
1714{
1715  struct elf_lm32_link_hash_table *htab;
1716  struct elf_lm32_link_hash_entry *eh;
1717  struct elf_lm32_dyn_relocs *p;
1718  bfd *dynobj;
1719  asection *s;
1720
1721  dynobj = elf_hash_table (info)->dynobj;
1722
1723  /* Make sure we know what is going on here.  */
1724  BFD_ASSERT (dynobj != NULL
1725              && (h->needs_plt
1726                  || h->u.weakdef != NULL
1727                  || (h->def_dynamic
1728                      && h->ref_regular
1729                      && !h->def_regular)));
1730
1731  /* If this is a function, put it in the procedure linkage table.  We
1732     will fill in the contents of the procedure linkage table later,
1733     when we know the address of the .got section.  */
1734  if (h->type == STT_FUNC
1735      || h->needs_plt)
1736    {
1737      if (! bfd_link_pic (info)
1738          && !h->def_dynamic
1739          && !h->ref_dynamic
1740	  && h->root.type != bfd_link_hash_undefweak
1741	  && h->root.type != bfd_link_hash_undefined)
1742        {
1743          /* This case can occur if we saw a PLT reloc in an input
1744             file, but the symbol was never referred to by a dynamic
1745             object.  In such a case, we don't actually need to build
1746             a procedure linkage table, and we can just do a PCREL
1747             reloc instead.  */
1748          h->plt.offset = (bfd_vma) -1;
1749          h->needs_plt = 0;
1750        }
1751
1752      return TRUE;
1753    }
1754  else
1755    h->plt.offset = (bfd_vma) -1;
1756
1757  /* If this is a weak symbol, and there is a real definition, the
1758     processor independent code will have arranged for us to see the
1759     real definition first, and we can just use the same value.  */
1760  if (h->u.weakdef != NULL)
1761    {
1762      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1763                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
1764      h->root.u.def.section = h->u.weakdef->root.u.def.section;
1765      h->root.u.def.value = h->u.weakdef->root.u.def.value;
1766      return TRUE;
1767    }
1768
1769  /* This is a reference to a symbol defined by a dynamic object which
1770     is not a function.  */
1771
1772  /* If we are creating a shared library, we must presume that the
1773     only references to the symbol are via the global offset table.
1774     For such cases we need not do anything here; the relocations will
1775     be handled correctly by relocate_section.  */
1776  if (bfd_link_pic (info))
1777    return TRUE;
1778
1779  /* If there are no references to this symbol that do not use the
1780     GOT, we don't need to generate a copy reloc.  */
1781  if (!h->non_got_ref)
1782    return TRUE;
1783
1784  /* If -z nocopyreloc was given, we won't generate them either.  */
1785  if (info->nocopyreloc)
1786    {
1787      h->non_got_ref = 0;
1788      return TRUE;
1789    }
1790
1791  eh = (struct elf_lm32_link_hash_entry *) h;
1792  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1793    {
1794      s = p->sec->output_section;
1795      if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
1796        break;
1797    }
1798
1799  /* If we didn't find any dynamic relocs in sections which needs the
1800     copy reloc, then we'll be keeping the dynamic relocs and avoiding
1801     the copy reloc.  */
1802  if (p == NULL)
1803    {
1804      h->non_got_ref = 0;
1805      return TRUE;
1806    }
1807
1808  /* We must allocate the symbol in our .dynbss section, which will
1809     become part of the .bss section of the executable.  There will be
1810     an entry for this symbol in the .dynsym section.  The dynamic
1811     object will contain position independent code, so all references
1812     from the dynamic object to this symbol will go through the global
1813     offset table.  The dynamic linker will use the .dynsym entry to
1814     determine the address it must put in the global offset table, so
1815     both the dynamic object and the regular object will refer to the
1816     same memory location for the variable.  */
1817
1818  htab = lm32_elf_hash_table (info);
1819  if (htab == NULL)
1820    return FALSE;
1821
1822  s = htab->sdynbss;
1823  BFD_ASSERT (s != NULL);
1824
1825  /* We must generate a R_LM32_COPY reloc to tell the dynamic linker
1826     to copy the initial value out of the dynamic object and into the
1827     runtime process image.  We need to remember the offset into the
1828     .rela.bss section we are going to use.  */
1829  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
1830    {
1831      asection *srel;
1832
1833      srel = htab->srelbss;
1834      BFD_ASSERT (srel != NULL);
1835      srel->size += sizeof (Elf32_External_Rela);
1836      h->needs_copy = 1;
1837    }
1838
1839  return _bfd_elf_adjust_dynamic_copy (info, h, s);
1840}
1841
1842/* Allocate space in .plt, .got and associated reloc sections for
1843   dynamic relocs.  */
1844
1845static bfd_boolean
1846allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1847{
1848  struct bfd_link_info *info;
1849  struct elf_lm32_link_hash_table *htab;
1850  struct elf_lm32_link_hash_entry *eh;
1851  struct elf_lm32_dyn_relocs *p;
1852
1853  if (h->root.type == bfd_link_hash_indirect)
1854    return TRUE;
1855
1856  info = (struct bfd_link_info *) inf;
1857  htab = lm32_elf_hash_table (info);
1858  if (htab == NULL)
1859    return FALSE;
1860
1861  eh = (struct elf_lm32_link_hash_entry *) h;
1862
1863  if (htab->root.dynamic_sections_created
1864      && h->plt.refcount > 0)
1865    {
1866      /* Make sure this symbol is output as a dynamic symbol.
1867         Undefined weak syms won't yet be marked as dynamic.  */
1868      if (h->dynindx == -1
1869          && !h->forced_local)
1870        {
1871          if (! bfd_elf_link_record_dynamic_symbol (info, h))
1872            return FALSE;
1873        }
1874
1875      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
1876        {
1877          asection *s = htab->root.splt;
1878
1879          /* If this is the first .plt entry, make room for the special
1880             first entry.  */
1881          if (s->size == 0)
1882            s->size += PLT_ENTRY_SIZE;
1883
1884          h->plt.offset = s->size;
1885
1886          /* If this symbol is not defined in a regular file, and we are
1887             not generating a shared library, then set the symbol to this
1888             location in the .plt.  This is required to make function
1889             pointers compare as equal between the normal executable and
1890             the shared library.  */
1891          if (! bfd_link_pic (info)
1892              && !h->def_regular)
1893            {
1894              h->root.u.def.section = s;
1895              h->root.u.def.value = h->plt.offset;
1896            }
1897
1898          /* Make room for this entry.  */
1899          s->size += PLT_ENTRY_SIZE;
1900
1901          /* We also need to make an entry in the .got.plt section, which
1902             will be placed in the .got section by the linker script.  */
1903          htab->root.sgotplt->size += 4;
1904
1905          /* We also need to make an entry in the .rel.plt section.  */
1906          htab->root.srelplt->size += sizeof (Elf32_External_Rela);
1907        }
1908      else
1909        {
1910          h->plt.offset = (bfd_vma) -1;
1911          h->needs_plt = 0;
1912        }
1913    }
1914  else
1915    {
1916      h->plt.offset = (bfd_vma) -1;
1917      h->needs_plt = 0;
1918    }
1919
1920  if (h->got.refcount > 0)
1921    {
1922      asection *s;
1923      bfd_boolean dyn;
1924
1925      /* Make sure this symbol is output as a dynamic symbol.
1926         Undefined weak syms won't yet be marked as dynamic.  */
1927      if (h->dynindx == -1
1928          && !h->forced_local)
1929        {
1930          if (! bfd_elf_link_record_dynamic_symbol (info, h))
1931            return FALSE;
1932        }
1933
1934      s = htab->root.sgot;
1935
1936      h->got.offset = s->size;
1937      s->size += 4;
1938      dyn = htab->root.dynamic_sections_created;
1939      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
1940        htab->root.srelgot->size += sizeof (Elf32_External_Rela);
1941    }
1942  else
1943    h->got.offset = (bfd_vma) -1;
1944
1945  if (eh->dyn_relocs == NULL)
1946    return TRUE;
1947
1948  /* In the shared -Bsymbolic case, discard space allocated for
1949     dynamic pc-relative relocs against symbols which turn out to be
1950     defined in regular objects.  For the normal shared case, discard
1951     space for pc-relative relocs that have become local due to symbol
1952     visibility changes.  */
1953
1954  if (bfd_link_pic (info))
1955    {
1956      if (h->def_regular
1957          && (h->forced_local
1958              || info->symbolic))
1959        {
1960          struct elf_lm32_dyn_relocs **pp;
1961
1962          for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
1963            {
1964              p->count -= p->pc_count;
1965              p->pc_count = 0;
1966              if (p->count == 0)
1967                *pp = p->next;
1968              else
1969                pp = &p->next;
1970            }
1971        }
1972
1973      /* Also discard relocs on undefined weak syms with non-default
1974	 visibility.  */
1975      if (eh->dyn_relocs != NULL
1976	  && h->root.type == bfd_link_hash_undefweak)
1977	{
1978	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1979	    eh->dyn_relocs = NULL;
1980
1981	  /* Make sure undefined weak symbols are output as a dynamic
1982	     symbol in PIEs.  */
1983	  else if (h->dynindx == -1
1984		   && !h->forced_local)
1985	    {
1986	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
1987		return FALSE;
1988	    }
1989	}
1990    }
1991  else
1992    {
1993      /* For the non-shared case, discard space for relocs against
1994         symbols which turn out to need copy relocs or are not
1995         dynamic.  */
1996
1997      if (!h->non_got_ref
1998          && ((h->def_dynamic
1999               && !h->def_regular)
2000              || (htab->root.dynamic_sections_created
2001                  && (h->root.type == bfd_link_hash_undefweak
2002                      || h->root.type == bfd_link_hash_undefined))))
2003        {
2004          /* Make sure this symbol is output as a dynamic symbol.
2005             Undefined weak syms won't yet be marked as dynamic.  */
2006          if (h->dynindx == -1
2007              && !h->forced_local)
2008            {
2009              if (! bfd_elf_link_record_dynamic_symbol (info, h))
2010                return FALSE;
2011            }
2012
2013          /* If that succeeded, we know we'll be keeping all the
2014             relocs.  */
2015          if (h->dynindx != -1)
2016            goto keep;
2017        }
2018
2019      eh->dyn_relocs = NULL;
2020
2021    keep: ;
2022    }
2023
2024  /* Finally, allocate space.  */
2025  for (p = eh->dyn_relocs; p != NULL; p = p->next)
2026    {
2027      asection *sreloc = elf_section_data (p->sec)->sreloc;
2028      sreloc->size += p->count * sizeof (Elf32_External_Rela);
2029    }
2030
2031  return TRUE;
2032}
2033
2034/* Find any dynamic relocs that apply to read-only sections.  */
2035
2036static bfd_boolean
2037readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2038{
2039  struct elf_lm32_link_hash_entry *eh;
2040  struct elf_lm32_dyn_relocs *p;
2041
2042  eh = (struct elf_lm32_link_hash_entry *) h;
2043  for (p = eh->dyn_relocs; p != NULL; p = p->next)
2044    {
2045      asection *s = p->sec->output_section;
2046
2047      if (s != NULL && (s->flags & SEC_READONLY) != 0)
2048        {
2049          struct bfd_link_info *info = (struct bfd_link_info *) inf;
2050
2051          info->flags |= DF_TEXTREL;
2052
2053          /* Not an error, just cut short the traversal.  */
2054          return FALSE;
2055        }
2056    }
2057  return TRUE;
2058}
2059
2060/* Set the sizes of the dynamic sections.  */
2061
2062static bfd_boolean
2063lm32_elf_size_dynamic_sections (bfd *output_bfd,
2064                                struct bfd_link_info *info)
2065{
2066  struct elf_lm32_link_hash_table *htab;
2067  bfd *dynobj;
2068  asection *s;
2069  bfd_boolean relocs;
2070  bfd *ibfd;
2071
2072  htab = lm32_elf_hash_table (info);
2073  if (htab == NULL)
2074    return FALSE;
2075
2076  dynobj = htab->root.dynobj;
2077  BFD_ASSERT (dynobj != NULL);
2078
2079  if (htab->root.dynamic_sections_created)
2080    {
2081      /* Set the contents of the .interp section to the interpreter.  */
2082      if (bfd_link_executable (info) && !info->nointerp)
2083	{
2084	  s = bfd_get_linker_section (dynobj, ".interp");
2085	  BFD_ASSERT (s != NULL);
2086	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2087	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2088	}
2089    }
2090
2091  /* Set up .got offsets for local syms, and space for local dynamic
2092     relocs.  */
2093  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2094    {
2095      bfd_signed_vma *local_got;
2096      bfd_signed_vma *end_local_got;
2097      bfd_size_type locsymcount;
2098      Elf_Internal_Shdr *symtab_hdr;
2099      asection *srel;
2100
2101      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2102        continue;
2103
2104      for (s = ibfd->sections; s != NULL; s = s->next)
2105        {
2106          struct elf_lm32_dyn_relocs *p;
2107
2108          for (p = ((struct elf_lm32_dyn_relocs *)
2109                    elf_section_data (s)->local_dynrel);
2110               p != NULL;
2111               p = p->next)
2112            {
2113              if (! bfd_is_abs_section (p->sec)
2114                  && bfd_is_abs_section (p->sec->output_section))
2115                {
2116                  /* Input section has been discarded, either because
2117                     it is a copy of a linkonce section or due to
2118                     linker script /DISCARD/, so we'll be discarding
2119                     the relocs too.  */
2120                }
2121              else if (p->count != 0)
2122                {
2123                  srel = elf_section_data (p->sec)->sreloc;
2124                  srel->size += p->count * sizeof (Elf32_External_Rela);
2125                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2126                    info->flags |= DF_TEXTREL;
2127                }
2128            }
2129        }
2130
2131      local_got = elf_local_got_refcounts (ibfd);
2132      if (!local_got)
2133        continue;
2134
2135      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2136      locsymcount = symtab_hdr->sh_info;
2137      end_local_got = local_got + locsymcount;
2138      s = htab->root.sgot;
2139      srel = htab->root.srelgot;
2140      for (; local_got < end_local_got; ++local_got)
2141        {
2142          if (*local_got > 0)
2143            {
2144              *local_got = s->size;
2145              s->size += 4;
2146              if (bfd_link_pic (info))
2147                srel->size += sizeof (Elf32_External_Rela);
2148            }
2149          else
2150            *local_got = (bfd_vma) -1;
2151        }
2152    }
2153
2154  /* Allocate global sym .plt and .got entries, and space for global
2155     sym dynamic relocs.  */
2156  elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
2157
2158  /* We now have determined the sizes of the various dynamic sections.
2159     Allocate memory for them.  */
2160  relocs = FALSE;
2161  for (s = dynobj->sections; s != NULL; s = s->next)
2162    {
2163      if ((s->flags & SEC_LINKER_CREATED) == 0)
2164        continue;
2165
2166      if (s == htab->root.splt
2167          || s == htab->root.sgot
2168          || s == htab->root.sgotplt
2169	  || s == htab->sdynbss)
2170        {
2171          /* Strip this section if we don't need it; see the
2172             comment below.  */
2173        }
2174      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2175        {
2176          if (s->size != 0 && s != htab->root.srelplt)
2177            relocs = TRUE;
2178
2179          /* We use the reloc_count field as a counter if we need
2180             to copy relocs into the output file.  */
2181          s->reloc_count = 0;
2182        }
2183      else
2184	/* It's not one of our sections, so don't allocate space.  */
2185	continue;
2186
2187      if (s->size == 0)
2188        {
2189          /* If we don't need this section, strip it from the
2190             output file.  This is mostly to handle .rela.bss and
2191             .rela.plt.  We must create both sections in
2192             create_dynamic_sections, because they must be created
2193             before the linker maps input sections to output
2194             sections.  The linker does that before
2195             adjust_dynamic_symbol is called, and it is that
2196             function which decides whether anything needs to go
2197             into these sections.  */
2198          s->flags |= SEC_EXCLUDE;
2199          continue;
2200        }
2201
2202      if ((s->flags & SEC_HAS_CONTENTS) == 0)
2203	continue;
2204
2205      /* Allocate memory for the section contents.  We use bfd_zalloc
2206         here in case unused entries are not reclaimed before the
2207         section's contents are written out.  This should not happen,
2208         but this way if it does, we get a R_LM32_NONE reloc instead
2209         of garbage.  */
2210      s->contents = bfd_zalloc (dynobj, s->size);
2211      if (s->contents == NULL)
2212        return FALSE;
2213    }
2214
2215  if (htab->root.dynamic_sections_created)
2216    {
2217      /* Add some entries to the .dynamic section.  We fill in the
2218	 values later, in lm32_elf_finish_dynamic_sections, but we
2219	 must add the entries now so that we get the correct size for
2220	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2221	 dynamic linker and used by the debugger.  */
2222#define add_dynamic_entry(TAG, VAL) \
2223  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2224
2225     if (bfd_link_executable (info))
2226	{
2227	  if (! add_dynamic_entry (DT_DEBUG, 0))
2228	    return FALSE;
2229	}
2230
2231      if (htab->root.splt->size != 0)
2232        {
2233          if (! add_dynamic_entry (DT_PLTGOT, 0)
2234              || ! add_dynamic_entry (DT_PLTRELSZ, 0)
2235              || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
2236              || ! add_dynamic_entry (DT_JMPREL, 0))
2237            return FALSE;
2238        }
2239
2240      if (relocs)
2241        {
2242          if (! add_dynamic_entry (DT_RELA, 0)
2243              || ! add_dynamic_entry (DT_RELASZ, 0)
2244              || ! add_dynamic_entry (DT_RELAENT,
2245                                      sizeof (Elf32_External_Rela)))
2246            return FALSE;
2247
2248          /* If any dynamic relocs apply to a read-only section,
2249             then we need a DT_TEXTREL entry.  */
2250          if ((info->flags & DF_TEXTREL) == 0)
2251            elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
2252                                    info);
2253
2254          if ((info->flags & DF_TEXTREL) != 0)
2255            {
2256              if (! add_dynamic_entry (DT_TEXTREL, 0))
2257                return FALSE;
2258            }
2259        }
2260    }
2261#undef add_dynamic_entry
2262
2263  /* Allocate .rofixup section.  */
2264  if (IS_FDPIC (output_bfd))
2265    {
2266      struct weak_symbol_list *list_start = NULL, *list_end = NULL;
2267      int rgot_weak_count = 0;
2268      int r32_count = 0;
2269      int rgot_count = 0;
2270      /* Look for deleted sections.  */
2271      for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2272        {
2273          for (s = ibfd->sections; s != NULL; s = s->next)
2274            {
2275              if (s->reloc_count)
2276                {
2277                  /* Count relocs that need .rofixup entires.  */
2278                  Elf_Internal_Rela *internal_relocs, *end;
2279                  internal_relocs = elf_section_data (s)->relocs;
2280                  if (internal_relocs == NULL)
2281                    internal_relocs = (_bfd_elf_link_read_relocs (ibfd, s, NULL, NULL, FALSE));
2282                  if (internal_relocs != NULL)
2283                    {
2284                      end = internal_relocs + s->reloc_count;
2285                      while (internal_relocs < end)
2286                        {
2287                          Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2288                          struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
2289                          unsigned long r_symndx;
2290                          struct elf_link_hash_entry *h;
2291
2292                          symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2293                          sym_hashes = elf_sym_hashes (ibfd);
2294                          r_symndx = ELF32_R_SYM (internal_relocs->r_info);
2295                          h = NULL;
2296                          if (r_symndx < symtab_hdr->sh_info)
2297                            {
2298                            }
2299                          else
2300                            {
2301                              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2302                              while (h->root.type == bfd_link_hash_indirect
2303                                     || h->root.type == bfd_link_hash_warning)
2304                                h = (struct elf_link_hash_entry *) h->root.u.i.link;
2305                              }
2306
2307                          /* Don't generate entries for weak symbols.  */
2308                          if (!h || (h && h->root.type != bfd_link_hash_undefweak))
2309                            {
2310                              if (!discarded_section (s) && !((bfd_get_section_flags (ibfd, s) & SEC_ALLOC) == 0))
2311                                {
2312                                  switch (ELF32_R_TYPE (internal_relocs->r_info))
2313                                    {
2314                                    case R_LM32_32:
2315                                      r32_count++;
2316                                      break;
2317                                    case R_LM32_16_GOT:
2318                                      rgot_count++;
2319                                      break;
2320                                    }
2321                                }
2322                            }
2323                          else
2324                            {
2325                              struct weak_symbol_list *current, *new_entry;
2326                              /* Is this symbol already in the list?  */
2327                              for (current = list_start; current; current = current->next)
2328                                {
2329                                  if (!strcmp (current->name, h->root.root.string))
2330                                    break;
2331                                }
2332                              if (!current && !discarded_section (s) && (bfd_get_section_flags (ibfd, s) & SEC_ALLOC))
2333                                {
2334                                  /* Will this have an entry in the GOT.  */
2335                                  if (ELF32_R_TYPE (internal_relocs->r_info) == R_LM32_16_GOT)
2336                                    {
2337                                      /* Create a new entry.  */
2338                                      new_entry = malloc (sizeof (struct weak_symbol_list));
2339                                      if (!new_entry)
2340                                        return FALSE;
2341                                      new_entry->name = h->root.root.string;
2342                                      new_entry->next = NULL;
2343                                      /* Add to list */
2344                                      if (list_start == NULL)
2345                                        {
2346                                          list_start = new_entry;
2347                                          list_end = new_entry;
2348                                        }
2349                                      else
2350                                        {
2351                                          list_end->next = new_entry;
2352                                          list_end = new_entry;
2353                                        }
2354                                      /* Increase count of undefined weak symbols in the got.  */
2355                                      rgot_weak_count++;
2356                                    }
2357                                }
2358                            }
2359                          internal_relocs++;
2360                        }
2361                    }
2362                  else
2363                    return FALSE;
2364                }
2365            }
2366        }
2367      /* Free list.  */
2368      while (list_start)
2369        {
2370          list_end = list_start->next;
2371          free (list_start);
2372          list_start = list_end;
2373        }
2374
2375      /* Size sections.  */
2376      lm32fdpic_fixup32_section (info)->size
2377	= (r32_count + (htab->root.sgot->size / 4) - rgot_weak_count + 1) * 4;
2378      if (lm32fdpic_fixup32_section (info)->size == 0)
2379        lm32fdpic_fixup32_section (info)->flags |= SEC_EXCLUDE;
2380      else
2381        {
2382          lm32fdpic_fixup32_section (info)->contents =
2383    	     bfd_zalloc (dynobj, lm32fdpic_fixup32_section (info)->size);
2384          if (lm32fdpic_fixup32_section (info)->contents == NULL)
2385    	    return FALSE;
2386        }
2387    }
2388
2389  return TRUE;
2390}
2391
2392/* Create dynamic sections when linking against a dynamic object.  */
2393
2394static bfd_boolean
2395lm32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2396{
2397  struct elf_lm32_link_hash_table *htab;
2398  flagword flags, pltflags;
2399  asection *s;
2400  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2401  int ptralign = 2; /* 32bit */
2402
2403  htab = lm32_elf_hash_table (info);
2404  if (htab == NULL)
2405    return FALSE;
2406
2407  /* Make sure we have a GOT - For the case where we have a dynamic object
2408     but none of the relocs in check_relocs */
2409  if (!_bfd_elf_create_got_section (abfd, info))
2410    return FALSE;
2411  if (IS_FDPIC (abfd) && (htab->sfixup32 == NULL))
2412    {
2413      if (! create_rofixup_section (abfd, info))
2414        return FALSE;
2415    }
2416
2417  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2418     .rel[a].bss sections.  */
2419  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2420           | SEC_LINKER_CREATED);
2421
2422  pltflags = flags;
2423  pltflags |= SEC_CODE;
2424  if (bed->plt_not_loaded)
2425    pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
2426  if (bed->plt_readonly)
2427    pltflags |= SEC_READONLY;
2428
2429  s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
2430  htab->root.splt = s;
2431  if (s == NULL
2432      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
2433    return FALSE;
2434
2435  if (bed->want_plt_sym)
2436    {
2437      /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2438         .plt section.  */
2439      struct bfd_link_hash_entry *bh = NULL;
2440      struct elf_link_hash_entry *h;
2441
2442      if (! (_bfd_generic_link_add_one_symbol
2443             (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
2444              (bfd_vma) 0, NULL, FALSE,
2445              get_elf_backend_data (abfd)->collect, &bh)))
2446        return FALSE;
2447      h = (struct elf_link_hash_entry *) bh;
2448      h->def_regular = 1;
2449      h->type = STT_OBJECT;
2450      htab->root.hplt = h;
2451
2452      if (bfd_link_pic (info)
2453          && ! bfd_elf_link_record_dynamic_symbol (info, h))
2454        return FALSE;
2455    }
2456
2457  s = bfd_make_section_anyway_with_flags (abfd,
2458					  bed->default_use_rela_p
2459					  ? ".rela.plt" : ".rel.plt",
2460					  flags | SEC_READONLY);
2461  htab->root.srelplt = s;
2462  if (s == NULL
2463      || ! bfd_set_section_alignment (abfd, s, ptralign))
2464    return FALSE;
2465
2466  if (htab->root.sgot == NULL
2467      && !_bfd_elf_create_got_section (abfd, info))
2468    return FALSE;
2469
2470  if (bed->want_dynbss)
2471    {
2472      /* The .dynbss section is a place to put symbols which are defined
2473         by dynamic objects, are referenced by regular objects, and are
2474         not functions.  We must allocate space for them in the process
2475         image and use a R_*_COPY reloc to tell the dynamic linker to
2476         initialize them at run time.  The linker script puts the .dynbss
2477         section into the .bss section of the final image.  */
2478      s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
2479					      SEC_ALLOC | SEC_LINKER_CREATED);
2480      htab->sdynbss = s;
2481      if (s == NULL)
2482        return FALSE;
2483      /* The .rel[a].bss section holds copy relocs.  This section is not
2484         normally needed.  We need to create it here, though, so that the
2485         linker will map it to an output section.  We can't just create it
2486         only if we need it, because we will not know whether we need it
2487         until we have seen all the input files, and the first time the
2488         main linker code calls BFD after examining all the input files
2489         (size_dynamic_sections) the input sections have already been
2490         mapped to the output sections.  If the section turns out not to
2491         be needed, we can discard it later.  We will never need this
2492         section when generating a shared object, since they do not use
2493         copy relocs.  */
2494      if (! bfd_link_pic (info))
2495        {
2496          s = bfd_make_section_anyway_with_flags (abfd,
2497						  (bed->default_use_rela_p
2498						   ? ".rela.bss" : ".rel.bss"),
2499						  flags | SEC_READONLY);
2500          htab->srelbss = s;
2501          if (s == NULL
2502              || ! bfd_set_section_alignment (abfd, s, ptralign))
2503            return FALSE;
2504        }
2505    }
2506
2507  return TRUE;
2508}
2509
2510/* Copy the extra info we tack onto an elf_link_hash_entry.  */
2511
2512static void
2513lm32_elf_copy_indirect_symbol (struct bfd_link_info *info,
2514                               struct elf_link_hash_entry *dir,
2515                               struct elf_link_hash_entry *ind)
2516{
2517  struct elf_lm32_link_hash_entry * edir;
2518  struct elf_lm32_link_hash_entry * eind;
2519
2520  edir = (struct elf_lm32_link_hash_entry *) dir;
2521  eind = (struct elf_lm32_link_hash_entry *) ind;
2522
2523  if (eind->dyn_relocs != NULL)
2524    {
2525      if (edir->dyn_relocs != NULL)
2526        {
2527          struct elf_lm32_dyn_relocs **pp;
2528          struct elf_lm32_dyn_relocs *p;
2529
2530          /* Add reloc counts against the indirect sym to the direct sym
2531             list.  Merge any entries against the same section.  */
2532          for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
2533            {
2534              struct elf_lm32_dyn_relocs *q;
2535
2536              for (q = edir->dyn_relocs; q != NULL; q = q->next)
2537                if (q->sec == p->sec)
2538                  {
2539                    q->pc_count += p->pc_count;
2540                    q->count += p->count;
2541                    *pp = p->next;
2542                    break;
2543                  }
2544              if (q == NULL)
2545                pp = &p->next;
2546            }
2547          *pp = edir->dyn_relocs;
2548        }
2549
2550      edir->dyn_relocs = eind->dyn_relocs;
2551      eind->dyn_relocs = NULL;
2552    }
2553
2554  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2555}
2556
2557static bfd_boolean
2558lm32_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
2559{
2560  if (!bfd_link_relocatable (info))
2561    {
2562      if (!bfd_elf_stack_segment_size (output_bfd, info,
2563				       "__stacksize", DEFAULT_STACK_SIZE))
2564	return FALSE;
2565
2566      asection *sec = bfd_get_section_by_name (output_bfd, ".stack");
2567      if (sec)
2568	sec->size = info->stacksize >= 0 ? info->stacksize : 0;
2569    }
2570
2571  return TRUE;
2572}
2573
2574static bfd_boolean
2575lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
2576{
2577  unsigned i;
2578
2579  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2580      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2581    return TRUE;
2582
2583  if (! _bfd_elf_copy_private_bfd_data (ibfd, obfd))
2584    return FALSE;
2585
2586  if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr
2587      || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
2588    return TRUE;
2589
2590  /* Copy the stack size.  */
2591  for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
2592    if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
2593      {
2594	Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
2595
2596	for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
2597	  if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
2598	    {
2599	      memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
2600
2601	      /* Rewrite the phdrs, since we're only called after they were first written.  */
2602	      if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
2603			    ->s->sizeof_ehdr, SEEK_SET) != 0
2604		  || get_elf_backend_data (obfd)->s->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
2605				     elf_elfheader (obfd)->e_phnum) != 0)
2606		return FALSE;
2607	      break;
2608	    }
2609
2610	break;
2611      }
2612
2613  return TRUE;
2614}
2615
2616
2617#define ELF_ARCH                bfd_arch_lm32
2618#define ELF_TARGET_ID		LM32_ELF_DATA
2619#define ELF_MACHINE_CODE        EM_LATTICEMICO32
2620#define ELF_MAXPAGESIZE         0x1000
2621
2622#define TARGET_BIG_SYM          lm32_elf32_vec
2623#define TARGET_BIG_NAME         "elf32-lm32"
2624
2625#define bfd_elf32_bfd_reloc_type_lookup         lm32_reloc_type_lookup
2626#define bfd_elf32_bfd_reloc_name_lookup         lm32_reloc_name_lookup
2627#define elf_info_to_howto                       lm32_info_to_howto_rela
2628#define elf_info_to_howto_rel                   0
2629#define elf_backend_rela_normal                 1
2630#define elf_backend_object_p                    lm32_elf_object_p
2631#define elf_backend_final_write_processing      lm32_elf_final_write_processing
2632#define elf_backend_stack_align			8
2633#define elf_backend_can_gc_sections             1
2634#define elf_backend_can_refcount                1
2635#define elf_backend_gc_mark_hook                lm32_elf_gc_mark_hook
2636#define elf_backend_gc_sweep_hook               lm32_elf_gc_sweep_hook
2637#define elf_backend_plt_readonly                1
2638#define elf_backend_want_got_plt                1
2639#define elf_backend_want_plt_sym                0
2640#define elf_backend_got_header_size             12
2641#define elf_backend_dtrel_excludes_plt		1
2642#define bfd_elf32_bfd_link_hash_table_create    lm32_elf_link_hash_table_create
2643#define elf_backend_check_relocs                lm32_elf_check_relocs
2644#define elf_backend_reloc_type_class            lm32_elf_reloc_type_class
2645#define elf_backend_copy_indirect_symbol        lm32_elf_copy_indirect_symbol
2646#define elf_backend_size_dynamic_sections       lm32_elf_size_dynamic_sections
2647#define elf_backend_omit_section_dynsym         ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
2648#define elf_backend_create_dynamic_sections     lm32_elf_create_dynamic_sections
2649#define elf_backend_finish_dynamic_sections     lm32_elf_finish_dynamic_sections
2650#define elf_backend_adjust_dynamic_symbol       lm32_elf_adjust_dynamic_symbol
2651#define elf_backend_finish_dynamic_symbol       lm32_elf_finish_dynamic_symbol
2652#define elf_backend_relocate_section            lm32_elf_relocate_section
2653
2654#include "elf32-target.h"
2655
2656#undef  ELF_MAXPAGESIZE
2657#define ELF_MAXPAGESIZE		0x4000
2658
2659
2660#undef  TARGET_BIG_SYM
2661#define TARGET_BIG_SYM          lm32_elf32_fdpic_vec
2662#undef  TARGET_BIG_NAME
2663#define TARGET_BIG_NAME		"elf32-lm32fdpic"
2664#undef	elf32_bed
2665#define	elf32_bed		elf32_lm32fdpic_bed
2666
2667#undef  elf_backend_always_size_sections
2668#define elf_backend_always_size_sections        lm32_elf_always_size_sections
2669#undef  bfd_elf32_bfd_copy_private_bfd_data
2670#define bfd_elf32_bfd_copy_private_bfd_data     lm32_elf_fdpic_copy_private_bfd_data
2671
2672#include "elf32-target.h"
2673