bfd_error_handler bfd_vma and bfd_size_type args
[external/binutils.git] / bfd / elf32-lm32.c
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
46 extern const bfd_target lm32_elf32_fdpic_vec;
47
48 #define IS_FDPIC(bfd) ((bfd)->xvec == &lm32_elf32_fdpic_vec)
49
50 static 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
59 struct 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
75 struct 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
85 struct 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
110 struct 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
118 static struct bfd_hash_entry *
119 lm32_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
151 static struct bfd_link_hash_table *
152 lm32_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
175 static 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
198 static bfd_boolean
199 create_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
225 static 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
489 struct lm32_reloc_map
490 {
491     bfd_reloc_code_real_type bfd_reloc_val;
492     unsigned char elf_reloc_val;
493 };
494
495 static 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
517 static reloc_howto_type *
518 lm32_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
529 static reloc_howto_type *
530 lm32_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
548 static void
549 lm32_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
567 static bfd_boolean
568 lm32_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
575 static void
576 lm32_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
593 static bfd_boolean
594 lm32_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
645 static bfd_reloc_status_type
646 lm32_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
676 static bfd_reloc_status_type
677 lm32_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
689 static bfd_reloc_status_type
690 lm32_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
741 static 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
767 inline 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
777 static bfd_boolean
778 lm32_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
1152 static asection *
1153 lm32_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
1170 static bfd_boolean
1171 lm32_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
1227 static bfd_boolean
1228 lm32_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_regular = 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
1376 static bfd_boolean
1377 lm32_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 %Ld != 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
1534 static bfd_boolean
1535 lm32_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
1691 static enum elf_reloc_type_class
1692 lm32_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
1711 static bfd_boolean
1712 lm32_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
1845 static bfd_boolean
1846 allocate_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
2036 static bfd_boolean
2037 readonly_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
2062 static bfd_boolean
2063 lm32_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
2394 static bfd_boolean
2395 lm32_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
2512 static void
2513 lm32_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
2557 static bfd_boolean
2558 lm32_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
2574 static bfd_boolean
2575 lm32_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"