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