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