1 /* 32-bit ELF support for Nios II.
2 Copyright (C) 2012-2014 Free Software Foundation, Inc.
3 Contributed by Nigel Gray (ngray@altera.com).
4 Contributed by Mentor Graphics, Inc.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
23 /* This file handles Altera Nios II ELF targets. */
31 #include "elf/nios2.h"
32 #include "opcode/nios2.h"
33 #include "elf32-nios2.h"
35 /* Use RELA relocations. */
44 /* Forward declarations. */
45 static bfd_reloc_status_type nios2_elf32_ignore_reloc
46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
47 static bfd_reloc_status_type nios2_elf32_hi16_relocate
48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
49 static bfd_reloc_status_type nios2_elf32_lo16_relocate
50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51 static bfd_reloc_status_type nios2_elf32_hiadj16_relocate
52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53 static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate
54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate
56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static bfd_reloc_status_type nios2_elf32_pcrel16_relocate
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
59 static bfd_reloc_status_type nios2_elf32_call26_relocate
60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
61 static bfd_reloc_status_type nios2_elf32_gprel_relocate
62 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
63 static bfd_reloc_status_type nios2_elf32_ujmp_relocate
64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
65 static bfd_reloc_status_type nios2_elf32_cjmp_relocate
66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
67 static bfd_reloc_status_type nios2_elf32_callr_relocate
68 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
71 extern const bfd_target nios2_elf32_le_vec;
72 extern const bfd_target nios2_elf32_be_vec;
74 /* Offset of tp and dtp pointers from start of TLS block. */
75 #define TP_OFFSET 0x7000
76 #define DTP_OFFSET 0x8000
78 /* The relocation table used for SHT_REL sections. */
79 static reloc_howto_type elf_nios2_howto_table_rel[] = {
81 HOWTO (R_NIOS2_NONE, /* type */
83 0, /* size (0 = byte, 1 = short, 2 = long) */
85 FALSE, /* pc_relative */
87 complain_overflow_dont, /* complain_on_overflow */
88 bfd_elf_generic_reloc, /* special_function */
89 "R_NIOS2_NONE", /* name */
90 FALSE, /* partial_inplace */
93 FALSE), /* pcrel_offset */
95 /* 16-bit signed immediate relocation. */
96 HOWTO (R_NIOS2_S16, /* type */
98 2, /* size (0 = byte, 1 = short, 2 = long) */
100 FALSE, /* pc_relative */
102 complain_overflow_signed, /* complain on overflow */
103 bfd_elf_generic_reloc, /* special function */
104 "R_NIOS2_S16", /* name */
105 FALSE, /* partial_inplace */
106 0x003fffc0, /* src_mask */
107 0x003fffc0, /* dest_mask */
108 FALSE), /* pcrel_offset */
110 /* 16-bit unsigned immediate relocation. */
111 HOWTO (R_NIOS2_U16, /* type */
113 2, /* size (0 = byte, 1 = short, 2 = long) */
115 FALSE, /* pc_relative */
117 complain_overflow_unsigned, /* complain on overflow */
118 bfd_elf_generic_reloc, /* special function */
119 "R_NIOS2_U16", /* name */
120 FALSE, /* partial_inplace */
121 0x003fffc0, /* src_mask */
122 0x003fffc0, /* dest_mask */
123 FALSE), /* pcrel_offset */
125 HOWTO (R_NIOS2_PCREL16, /* type */
127 2, /* size (0 = byte, 1 = short, 2 = long) */
129 TRUE, /* pc_relative */
131 complain_overflow_signed, /* complain on overflow */
132 nios2_elf32_pcrel16_relocate, /* special function */
133 "R_NIOS2_PCREL16", /* name */
134 FALSE, /* partial_inplace */
135 0x003fffc0, /* src_mask */
136 0x003fffc0, /* dest_mask */
137 TRUE), /* pcrel_offset */
139 HOWTO (R_NIOS2_CALL26, /* type */
141 2, /* size (0 = byte, 1 = short, 2 = long) */
143 FALSE, /* pc_relative */
145 complain_overflow_dont, /* complain on overflow */
146 nios2_elf32_call26_relocate, /* special function */
147 "R_NIOS2_CALL26", /* name */
148 FALSE, /* partial_inplace */
149 0xffffffc0, /* src_mask */
150 0xffffffc0, /* dst_mask */
151 FALSE), /* pcrel_offset */
159 complain_overflow_bitfield,
160 bfd_elf_generic_reloc,
167 HOWTO (R_NIOS2_CACHE_OPX,
173 complain_overflow_bitfield,
174 bfd_elf_generic_reloc,
187 complain_overflow_bitfield,
188 bfd_elf_generic_reloc,
201 complain_overflow_bitfield,
202 bfd_elf_generic_reloc,
215 complain_overflow_dont,
216 nios2_elf32_hi16_relocate,
229 complain_overflow_dont,
230 nios2_elf32_lo16_relocate,
237 HOWTO (R_NIOS2_HIADJ16,
243 complain_overflow_dont,
244 nios2_elf32_hiadj16_relocate,
251 HOWTO (R_NIOS2_BFD_RELOC_32,
257 complain_overflow_dont,
258 bfd_elf_generic_reloc,
259 "R_NIOS2_BFD_RELOC32",
265 HOWTO (R_NIOS2_BFD_RELOC_16,
271 complain_overflow_bitfield,
272 bfd_elf_generic_reloc,
273 "R_NIOS2_BFD_RELOC16",
279 HOWTO (R_NIOS2_BFD_RELOC_8,
285 complain_overflow_bitfield,
286 bfd_elf_generic_reloc,
287 "R_NIOS2_BFD_RELOC8",
293 HOWTO (R_NIOS2_GPREL,
299 complain_overflow_dont,
300 nios2_elf32_gprel_relocate,
307 HOWTO (R_NIOS2_GNU_VTINHERIT,
313 complain_overflow_dont,
315 "R_NIOS2_GNU_VTINHERIT",
321 HOWTO (R_NIOS2_GNU_VTENTRY,
327 complain_overflow_dont,
328 _bfd_elf_rel_vtable_reloc_fn,
329 "R_NIOS2_GNU_VTENTRY",
341 complain_overflow_dont,
342 nios2_elf32_ujmp_relocate,
355 complain_overflow_dont,
356 nios2_elf32_cjmp_relocate,
363 HOWTO (R_NIOS2_CALLR,
369 complain_overflow_dont,
370 nios2_elf32_callr_relocate,
377 HOWTO (R_NIOS2_ALIGN,
383 complain_overflow_dont,
384 nios2_elf32_ignore_reloc,
392 HOWTO (R_NIOS2_GOT16,
398 complain_overflow_bitfield,
399 bfd_elf_generic_reloc,
406 HOWTO (R_NIOS2_CALL16,
412 complain_overflow_bitfield,
413 bfd_elf_generic_reloc,
420 HOWTO (R_NIOS2_GOTOFF_LO,
426 complain_overflow_dont,
427 bfd_elf_generic_reloc,
434 HOWTO (R_NIOS2_GOTOFF_HA,
440 complain_overflow_dont,
441 bfd_elf_generic_reloc,
448 HOWTO (R_NIOS2_PCREL_LO,
454 complain_overflow_dont,
455 nios2_elf32_pcrel_lo16_relocate,
462 HOWTO (R_NIOS2_PCREL_HA,
466 FALSE, /* This is a PC-relative relocation, but we need to subtract
467 PC ourselves before the HIADJ. */
469 complain_overflow_dont,
470 nios2_elf32_pcrel_hiadj16_relocate,
477 HOWTO (R_NIOS2_TLS_GD16,
483 complain_overflow_bitfield,
484 bfd_elf_generic_reloc,
491 HOWTO (R_NIOS2_TLS_LDM16,
497 complain_overflow_bitfield,
498 bfd_elf_generic_reloc,
505 HOWTO (R_NIOS2_TLS_LDO16,
511 complain_overflow_bitfield,
512 bfd_elf_generic_reloc,
519 HOWTO (R_NIOS2_TLS_IE16,
525 complain_overflow_bitfield,
526 bfd_elf_generic_reloc,
533 HOWTO (R_NIOS2_TLS_LE16,
539 complain_overflow_bitfield,
540 bfd_elf_generic_reloc,
547 HOWTO (R_NIOS2_TLS_DTPMOD,
553 complain_overflow_dont,
554 bfd_elf_generic_reloc,
555 "R_NIOS2_TLS_DTPMOD",
561 HOWTO (R_NIOS2_TLS_DTPREL,
567 complain_overflow_dont,
568 bfd_elf_generic_reloc,
569 "R_NIOS2_TLS_DTPREL",
575 HOWTO (R_NIOS2_TLS_TPREL,
581 complain_overflow_dont,
582 bfd_elf_generic_reloc,
595 complain_overflow_dont,
596 bfd_elf_generic_reloc,
603 HOWTO (R_NIOS2_GLOB_DAT,
609 complain_overflow_dont,
610 bfd_elf_generic_reloc,
617 HOWTO (R_NIOS2_JUMP_SLOT,
623 complain_overflow_dont,
624 bfd_elf_generic_reloc,
631 HOWTO (R_NIOS2_RELATIVE,
637 complain_overflow_dont,
638 bfd_elf_generic_reloc,
645 HOWTO (R_NIOS2_GOTOFF,
651 complain_overflow_dont,
652 bfd_elf_generic_reloc,
659 HOWTO (R_NIOS2_CALL26_NOAT, /* type */
661 2, /* size (0 = byte, 1 = short, 2 = long) */
663 FALSE, /* pc_relative */
665 complain_overflow_dont, /* complain on overflow */
666 nios2_elf32_call26_relocate, /* special function */
667 "R_NIOS2_CALL26_NOAT", /* name */
668 FALSE, /* partial_inplace */
669 0xffffffc0, /* src_mask */
670 0xffffffc0, /* dst_mask */
671 FALSE), /* pcrel_offset */
673 HOWTO (R_NIOS2_GOT_LO,
679 complain_overflow_dont,
680 bfd_elf_generic_reloc,
687 HOWTO (R_NIOS2_GOT_HA,
693 complain_overflow_dont,
694 bfd_elf_generic_reloc,
701 HOWTO (R_NIOS2_CALL_LO,
707 complain_overflow_dont,
708 bfd_elf_generic_reloc,
715 HOWTO (R_NIOS2_CALL_HA,
721 complain_overflow_dont,
722 bfd_elf_generic_reloc,
729 /* Add other relocations here. */
732 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1];
734 /* Return the howto for relocation RTYPE. */
735 static reloc_howto_type *
736 lookup_howto (unsigned int rtype)
738 static int initialized = 0;
740 int howto_tbl_size = (int) (sizeof (elf_nios2_howto_table_rel)
741 / sizeof (elf_nios2_howto_table_rel[0]));
746 memset (elf_code_to_howto_index, 0xff,
747 sizeof (elf_code_to_howto_index));
748 for (i = 0; i < howto_tbl_size; i++)
749 elf_code_to_howto_index[elf_nios2_howto_table_rel[i].type] = i;
752 BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL);
753 i = elf_code_to_howto_index[rtype];
754 if (i >= howto_tbl_size)
756 return elf_nios2_howto_table_rel + i;
759 /* Map for converting BFD reloc types to Nios II reloc types. */
762 bfd_reloc_code_real_type bfd_val;
763 enum elf_nios2_reloc_type elf_val;
766 static const struct elf_reloc_map nios2_reloc_map[] = {
767 {BFD_RELOC_NIOS2_S16, R_NIOS2_S16},
768 {BFD_RELOC_NIOS2_U16, R_NIOS2_U16},
769 {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16},
770 {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26},
771 {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5},
772 {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX},
773 {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6},
774 {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8},
775 {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16},
776 {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16},
777 {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16},
778 {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32},
779 {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16},
780 {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8},
781 {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL},
782 {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT},
783 {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY},
784 {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP},
785 {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP},
786 {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR},
787 {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN},
788 {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16},
789 {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16},
790 {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO},
791 {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA},
792 {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO},
793 {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA},
794 {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16},
795 {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16},
796 {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16},
797 {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16},
798 {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16},
799 {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD},
800 {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL},
801 {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL},
802 {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY},
803 {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT},
804 {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT},
805 {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE},
806 {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF},
807 {BFD_RELOC_NIOS2_CALL26_NOAT, R_NIOS2_CALL26_NOAT},
808 {BFD_RELOC_NIOS2_GOT_LO, R_NIOS2_GOT_LO},
809 {BFD_RELOC_NIOS2_GOT_HA, R_NIOS2_GOT_HA},
810 {BFD_RELOC_NIOS2_CALL_LO, R_NIOS2_CALL_LO},
811 {BFD_RELOC_NIOS2_CALL_HA, R_NIOS2_CALL_HA},
814 enum elf32_nios2_stub_type
816 nios2_stub_call26_before,
817 nios2_stub_call26_after,
821 struct elf32_nios2_stub_hash_entry
823 /* Base hash table entry structure. */
824 struct bfd_hash_entry bh_root;
826 /* The stub section. */
829 /* Offset within stub_sec of the beginning of this stub. */
832 /* Given the symbol's value and its section we can determine its final
833 value when building the stubs (so the stub knows where to jump. */
834 bfd_vma target_value;
835 asection *target_section;
837 enum elf32_nios2_stub_type stub_type;
839 /* The symbol table entry, if any, that this was derived from. */
840 struct elf32_nios2_link_hash_entry *hh;
842 /* And the reloc addend that this was derived from. */
845 /* Where this stub is being called from, or, in the case of combined
846 stub sections, the first input section in the group. */
850 #define nios2_stub_hash_entry(ent) \
851 ((struct elf32_nios2_stub_hash_entry *)(ent))
853 #define nios2_stub_hash_lookup(table, string, create, copy) \
854 ((struct elf32_nios2_stub_hash_entry *) \
855 bfd_hash_lookup ((table), (string), (create), (copy)))
858 /* The Nios II linker needs to keep track of the number of relocs that it
859 decides to copy as dynamic relocs in check_relocs for each symbol.
860 This is so that it can later discard them if they are found to be
861 unnecessary. We store the information in a field extending the
862 regular ELF linker hash table. */
864 struct elf32_nios2_dyn_relocs
866 struct elf32_nios2_dyn_relocs *next;
868 /* The input section of the reloc. */
871 /* Total number of relocs copied for the input section. */
874 /* Number of pc-relative relocs copied for the input section. */
875 bfd_size_type pc_count;
878 /* Nios II ELF linker hash entry. */
880 struct elf32_nios2_link_hash_entry
882 struct elf_link_hash_entry root;
884 /* A pointer to the most recently used stub hash entry against this
886 struct elf32_nios2_stub_hash_entry *hsh_cache;
888 /* Track dynamic relocs copied for this symbol. */
889 struct elf32_nios2_dyn_relocs *dyn_relocs;
891 #define GOT_UNKNOWN 0
895 unsigned char tls_type;
897 /* We need to detect and take special action for symbols which are only
898 referenced with %call() and not with %got(). Such symbols do not need
899 a dynamic GOT reloc in shared objects, only a dynamic PLT reloc. Lazy
900 linking will not work if the dynamic GOT reloc exists.
901 To check for this condition efficiently, we compare got_types_used against
903 (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED.
907 unsigned char got_types_used;
910 #define elf32_nios2_hash_entry(ent) \
911 ((struct elf32_nios2_link_hash_entry *) (ent))
913 /* Get the Nios II elf linker hash table from a link_info structure. */
914 #define elf32_nios2_hash_table(info) \
915 ((struct elf32_nios2_link_hash_table *) ((info)->hash))
917 /* Nios II ELF linker hash table. */
918 struct elf32_nios2_link_hash_table
920 /* The main hash table. */
921 struct elf_link_hash_table root;
923 /* The stub hash table. */
924 struct bfd_hash_table bstab;
926 /* Linker stub bfd. */
929 /* Linker call-backs. */
930 asection * (*add_stub_section) (const char *, asection *, bfd_boolean);
931 void (*layout_sections_again) (void);
933 /* Array to keep track of which stub sections have been created, and
934 information on stub grouping. */
937 /* These are the section to which stubs in the group will be
939 asection *first_sec, *last_sec;
940 /* The stub sections. There might be stubs inserted either before
941 or after the real section.*/
942 asection *first_stub_sec, *last_stub_sec;
945 /* Assorted information used by nios2_elf32_size_stubs. */
946 unsigned int bfd_count;
948 asection **input_list;
949 Elf_Internal_Sym **all_local_syms;
951 /* Short-cuts to get to dynamic linker sections. */
956 /* GOT pointer symbol _gp_got. */
957 struct elf_link_hash_entry *h_gp_got;
960 bfd_signed_vma refcount;
964 /* Small local sym cache. */
965 struct sym_cache sym_cache;
970 struct nios2_elf32_obj_tdata
972 struct elf_obj_tdata root;
974 /* tls_type for each local got entry. */
975 char *local_got_tls_type;
977 /* TRUE if TLS GD relocs have been seen for this object. */
978 bfd_boolean has_tlsgd;
981 #define elf32_nios2_tdata(abfd) \
982 ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any)
984 #define elf32_nios2_local_got_tls_type(abfd) \
985 (elf32_nios2_tdata (abfd)->local_got_tls_type)
987 /* The name of the dynamic interpreter. This is put in the .interp
989 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
991 /* PLT implementation for position-dependent code. */
992 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */
993 0x03c00034, /* movhi r15, %hiadj(plt_got_slot_address) */
994 0x7bc00017, /* ldw r15, %lo(plt_got_slot_address)(r15) */
995 0x7800683a /* jmp r15 */
998 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */
999 0x03800034, /* movhi r14, %hiadj(res_0) */
1000 0x73800004, /* addi r14, r14, %lo(res_0) */
1001 0x7b9fc83a, /* sub r15, r15, r14 */
1002 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1003 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1004 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1005 0x6800683a /* jmp r13 */
1008 /* PLT implementation for position-independent code. */
1009 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */
1010 0x03c00034, /* movhi r15, %hiadj(index * 4) */
1011 0x7bc00004, /* addi r15, r15, %lo(index * 4) */
1012 0x00000006 /* br .PLTresolve */
1015 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */
1016 0x001ce03a, /* nextpc r14 */
1017 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1018 0x6b9b883a, /* add r13, r13, r14 */
1019 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1020 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1021 0x6800683a /* jmp r13 */
1025 static const bfd_vma nios2_call26_stub_entry[] = {
1026 0x00400034, /* orhi at, r0, %hiadj(dest) */
1027 0x08400004, /* addi at, at, %lo(dest) */
1028 0x0800683a /* jmp at */
1031 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC. */
1033 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value)
1035 bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset);
1037 BFD_ASSERT(value <= 0xffff);
1039 bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6),
1040 sec->contents + offset);
1043 /* Install COUNT 32-bit values DATA starting at offset OFFSET into
1046 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset,
1051 bfd_put_32 (sec->owner, *data, sec->contents + offset);
1057 /* The usual way of loading a 32-bit constant into a Nios II register is to
1058 load the high 16 bits in one instruction and then add the low 16 bits with
1059 a signed add. This means that the high halfword needs to be adjusted to
1060 compensate for the sign bit of the low halfword. This function returns the
1061 adjusted high halfword for a given 32-bit constant. */
1063 bfd_vma hiadj (bfd_vma symbol_value)
1065 return ((symbol_value + 0x8000) >> 16) & 0xffff;
1068 /* Implement elf_backend_grok_prstatus:
1069 Support for core dump NOTE sections. */
1071 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1076 switch (note->descsz)
1081 case 212: /* Linux/Nios II */
1083 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1086 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
1095 /* Make a ".reg/999" section. */
1096 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1097 size, note->descpos + offset);
1100 /* Implement elf_backend_grok_psinfo. */
1102 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1104 switch (note->descsz)
1109 case 124: /* Linux/Nios II elf_prpsinfo */
1110 elf_tdata (abfd)->core->program
1111 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1112 elf_tdata (abfd)->core->command
1113 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1116 /* Note that for some reason, a spurious space is tacked
1117 onto the end of the args in some (at least one anyway)
1118 implementations, so strip it off if it exists. */
1121 char *command = elf_tdata (abfd)->core->command;
1122 int n = strlen (command);
1124 if (0 < n && command[n - 1] == ' ')
1125 command[n - 1] = '\0';
1131 /* Assorted hash table functions. */
1133 /* Initialize an entry in the stub hash table. */
1134 static struct bfd_hash_entry *
1135 stub_hash_newfunc (struct bfd_hash_entry *entry,
1136 struct bfd_hash_table *table,
1139 /* Allocate the structure if it has not already been allocated by a
1143 entry = bfd_hash_allocate (table,
1144 sizeof (struct elf32_nios2_stub_hash_entry));
1149 /* Call the allocation method of the superclass. */
1150 entry = bfd_hash_newfunc (entry, table, string);
1153 struct elf32_nios2_stub_hash_entry *hsh;
1155 /* Initialize the local fields. */
1156 hsh = (struct elf32_nios2_stub_hash_entry *) entry;
1157 hsh->stub_sec = NULL;
1158 hsh->stub_offset = 0;
1159 hsh->target_value = 0;
1160 hsh->target_section = NULL;
1161 hsh->stub_type = nios2_stub_none;
1169 /* Create an entry in a Nios II ELF linker hash table. */
1170 static struct bfd_hash_entry *
1171 link_hash_newfunc (struct bfd_hash_entry *entry,
1172 struct bfd_hash_table *table, const char *string)
1174 /* Allocate the structure if it has not already been allocated by a
1178 entry = bfd_hash_allocate (table,
1179 sizeof (struct elf32_nios2_link_hash_entry));
1184 /* Call the allocation method of the superclass. */
1185 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1188 struct elf32_nios2_link_hash_entry *eh;
1190 eh = (struct elf32_nios2_link_hash_entry *) entry;
1191 eh->hsh_cache = NULL;
1192 eh->dyn_relocs = NULL;
1193 eh->tls_type = GOT_UNKNOWN;
1194 eh->got_types_used = 0;
1200 /* Section name for stubs is the associated section name plus this
1202 #define STUB_SUFFIX ".stub"
1204 /* Build a name for an entry in the stub hash table. */
1206 nios2_stub_name (const asection *input_section,
1207 const asection *sym_sec,
1208 const struct elf32_nios2_link_hash_entry *hh,
1209 const Elf_Internal_Rela *rel,
1210 enum elf32_nios2_stub_type stub_type)
1214 char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a';
1218 len = 8 + 1 + 1 + 1+ strlen (hh->root.root.root.string) + 1 + 8 + 1;
1219 stub_name = bfd_malloc (len);
1220 if (stub_name != NULL)
1222 sprintf (stub_name, "%08x_%c_%s+%x",
1223 input_section->id & 0xffffffff,
1225 hh->root.root.root.string,
1226 (int) rel->r_addend & 0xffffffff);
1231 len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1;
1232 stub_name = bfd_malloc (len);
1233 if (stub_name != NULL)
1235 sprintf (stub_name, "%08x_%c_%x:%x+%x",
1236 input_section->id & 0xffffffff,
1238 sym_sec->id & 0xffffffff,
1239 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
1240 (int) rel->r_addend & 0xffffffff);
1246 /* Look up an entry in the stub hash. Stub entries are cached because
1247 creating the stub name takes a bit of time. */
1248 static struct elf32_nios2_stub_hash_entry *
1249 nios2_get_stub_entry (const asection *input_section,
1250 const asection *sym_sec,
1251 struct elf32_nios2_link_hash_entry *hh,
1252 const Elf_Internal_Rela *rel,
1253 struct elf32_nios2_link_hash_table *htab,
1254 enum elf32_nios2_stub_type stub_type)
1256 struct elf32_nios2_stub_hash_entry *hsh;
1257 const asection *id_sec;
1259 /* If this input section is part of a group of sections sharing one
1260 stub section, then use the id of the first/last section in the group,
1261 depending on the stub section placement relative to the group.
1262 Stub names need to include a section id, as there may well be
1263 more than one stub used to reach say, printf, and we need to
1264 distinguish between them. */
1265 if (stub_type == nios2_stub_call26_before)
1266 id_sec = htab->stub_group[input_section->id].first_sec;
1268 id_sec = htab->stub_group[input_section->id].last_sec;
1270 if (hh != NULL && hh->hsh_cache != NULL
1271 && hh->hsh_cache->hh == hh
1272 && hh->hsh_cache->id_sec == id_sec
1273 && hh->hsh_cache->stub_type == stub_type)
1275 hsh = hh->hsh_cache;
1281 stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type);
1282 if (stub_name == NULL)
1285 hsh = nios2_stub_hash_lookup (&htab->bstab,
1286 stub_name, FALSE, FALSE);
1289 hh->hsh_cache = hsh;
1297 /* Add a new stub entry to the stub hash. Not all fields of the new
1298 stub entry are initialised. */
1299 static struct elf32_nios2_stub_hash_entry *
1300 nios2_add_stub (const char *stub_name,
1302 struct elf32_nios2_link_hash_table *htab,
1303 enum elf32_nios2_stub_type stub_type)
1307 asection **secptr, **linkptr;
1308 struct elf32_nios2_stub_hash_entry *hsh;
1311 if (stub_type == nios2_stub_call26_before)
1313 link_sec = htab->stub_group[section->id].first_sec;
1314 secptr = &(htab->stub_group[section->id].first_stub_sec);
1315 linkptr = &(htab->stub_group[link_sec->id].first_stub_sec);
1320 link_sec = htab->stub_group[section->id].last_sec;
1321 secptr = &(htab->stub_group[section->id].last_stub_sec);
1322 linkptr = &(htab->stub_group[link_sec->id].last_stub_sec);
1326 if (stub_sec == NULL)
1328 stub_sec = *linkptr;
1329 if (stub_sec == NULL)
1335 namelen = strlen (link_sec->name);
1336 len = namelen + sizeof (STUB_SUFFIX);
1337 s_name = bfd_alloc (htab->stub_bfd, len);
1341 memcpy (s_name, link_sec->name, namelen);
1342 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
1344 stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp);
1345 if (stub_sec == NULL)
1347 *linkptr = stub_sec;
1352 /* Enter this entry into the linker stub hash table. */
1353 hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name,
1357 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
1363 hsh->stub_sec = stub_sec;
1364 hsh->stub_offset = 0;
1365 hsh->id_sec = link_sec;
1369 /* Set up various things so that we can make a list of input sections
1370 for each output section included in the link. Returns -1 on error,
1371 0 when no stubs will be needed, and 1 on success. */
1373 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
1376 unsigned int bfd_count;
1377 int top_id, top_index;
1379 asection **input_list, **list;
1381 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1383 /* Count the number of input BFDs and find the top input section id. */
1384 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
1386 input_bfd = input_bfd->link_next)
1389 for (section = input_bfd->sections;
1391 section = section->next)
1393 if (top_id < section->id)
1394 top_id = section->id;
1398 htab->bfd_count = bfd_count;
1400 amt = sizeof (struct map_stub) * (top_id + 1);
1401 htab->stub_group = bfd_zmalloc (amt);
1402 if (htab->stub_group == NULL)
1405 /* We can't use output_bfd->section_count here to find the top output
1406 section index as some sections may have been removed, and
1407 strip_excluded_output_sections doesn't renumber the indices. */
1408 for (section = output_bfd->sections, top_index = 0;
1410 section = section->next)
1412 if (top_index < section->index)
1413 top_index = section->index;
1416 htab->top_index = top_index;
1417 amt = sizeof (asection *) * (top_index + 1);
1418 input_list = bfd_malloc (amt);
1419 htab->input_list = input_list;
1420 if (input_list == NULL)
1423 /* For sections we aren't interested in, mark their entries with a
1424 value we can check later. */
1425 list = input_list + top_index;
1427 *list = bfd_abs_section_ptr;
1428 while (list-- != input_list);
1430 for (section = output_bfd->sections;
1432 section = section->next)
1434 /* FIXME: This is a bit of hack. Currently our .ctors and .dtors
1435 * have PC relative relocs in them but no code flag set. */
1436 if (((section->flags & SEC_CODE) != 0) ||
1437 strcmp(".ctors", section->name) ||
1438 strcmp(".dtors", section->name))
1439 input_list[section->index] = NULL;
1445 /* The linker repeatedly calls this function for each input section,
1446 in the order that input sections are linked into output sections.
1447 Build lists of input sections to determine groupings between which
1448 we may insert linker stubs. */
1450 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec)
1452 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1454 if (isec->output_section->index <= htab->top_index)
1456 asection **list = htab->input_list + isec->output_section->index;
1457 if (*list != bfd_abs_section_ptr)
1459 /* Steal the last_sec pointer for our list.
1460 This happens to make the list in reverse order,
1461 which is what we want. */
1462 htab->stub_group[isec->id].last_sec = *list;
1468 /* Segment mask for CALL26 relocation relaxation. */
1469 #define CALL26_SEGMENT(x) ((x) & 0xf0000000)
1471 /* Fudge factor for approximate maximum size of all stubs that might
1472 be inserted by the linker. This does not actually limit the number
1473 of stubs that might be inserted, and only affects strategy for grouping
1474 and placement of stubs. Perhaps this should be computed based on number
1475 of relocations seen, or be specifiable on the command line. */
1476 #define MAX_STUB_SECTION_SIZE 0xffff
1478 /* See whether we can group stub sections together. Grouping stub
1479 sections may result in fewer stubs. More importantly, we need to
1480 put all .init* and .fini* stubs at the end of the .init or
1481 .fini output sections respectively, because glibc splits the
1482 _init and _fini functions into multiple parts. Putting a stub in
1483 the middle of a function is not a good idea.
1484 Rather than computing groups of a maximum fixed size, for Nios II
1485 CALL26 relaxation it makes more sense to compute the groups based on
1486 sections that fit within a 256MB address segment. Also do not allow
1487 a group to span more than one output section, since different output
1488 sections might correspond to different memory banks on a bare-metal
1491 group_sections (struct elf32_nios2_link_hash_table *htab)
1493 asection **list = htab->input_list + htab->top_index;
1496 /* The list is in reverse order so we'll search backwards looking
1497 for the first section that begins in the same memory segment,
1498 marking sections along the way to point at the tail for this
1500 asection *tail = *list;
1501 if (tail == bfd_abs_section_ptr)
1503 while (tail != NULL)
1505 bfd_vma start = tail->output_section->vma + tail->output_offset;
1506 bfd_vma end = start + tail->size;
1507 bfd_vma segment = CALL26_SEGMENT (end);
1510 if (segment != CALL26_SEGMENT (start)
1511 || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE))
1512 /* This section spans more than one memory segment, or is
1513 close enough to the end of the segment that adding stub
1514 sections before it might cause it to move so that it
1515 spans memory segments, or that stubs added at the end of
1516 this group might overflow into the next memory segment.
1517 Put it in a group by itself to localize the effects. */
1519 prev = htab->stub_group[tail->id].last_sec;
1520 htab->stub_group[tail->id].last_sec = tail;
1521 htab->stub_group[tail->id].first_sec = tail;
1524 /* Collect more sections for this group. */
1526 asection *curr, *first;
1527 for (curr = tail; ; curr = prev)
1529 prev = htab->stub_group[curr->id].last_sec;
1531 || tail->output_section != prev->output_section
1532 || (CALL26_SEGMENT (prev->output_section->vma
1533 + prev->output_offset)
1538 for (curr = tail; ; curr = prev)
1540 prev = htab->stub_group[curr->id].last_sec;
1541 htab->stub_group[curr->id].last_sec = tail;
1542 htab->stub_group[curr->id].first_sec = first;
1548 /* Reset tail for the next group. */
1552 while (list-- != htab->input_list);
1553 free (htab->input_list);
1556 /* Determine the type of stub needed, if any, for a call. */
1557 static enum elf32_nios2_stub_type
1558 nios2_type_of_stub (asection *input_sec,
1559 const Elf_Internal_Rela *rel,
1560 struct elf32_nios2_link_hash_entry *hh,
1561 struct elf32_nios2_link_hash_table *htab,
1562 bfd_vma destination,
1563 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1565 bfd_vma location, segment, start, end;
1566 asection *s0, *s1, *s;
1569 !(hh->root.root.type == bfd_link_hash_defined
1570 || hh->root.root.type == bfd_link_hash_defweak))
1571 return nios2_stub_none;
1573 /* Determine where the call point is. */
1574 location = (input_sec->output_section->vma
1575 + input_sec->output_offset + rel->r_offset);
1576 segment = CALL26_SEGMENT (location);
1578 /* Nios II CALL and JMPI instructions can transfer control to addresses
1579 within the same 256MB segment as the PC. */
1580 if (segment == CALL26_SEGMENT (destination))
1581 return nios2_stub_none;
1583 /* Find the start and end addresses of the stub group. Also account for
1584 any already-created stub sections for this group. Note that for stubs
1585 in the end section, only the first instruction of the last stub
1586 (12 bytes long) needs to be within range. */
1587 s0 = htab->stub_group[input_sec->id].first_sec;
1588 s = htab->stub_group[s0->id].first_stub_sec;
1589 if (s != NULL && s->size > 0)
1590 start = s->output_section->vma + s->output_offset;
1592 start = s0->output_section->vma + s0->output_offset;
1594 s1 = htab->stub_group[input_sec->id].last_sec;
1595 s = htab->stub_group[s1->id].last_stub_sec;
1596 if (s != NULL && s->size > 0)
1597 end = s->output_section->vma + s->output_offset + s->size - 8;
1599 end = s1->output_section->vma + s1->output_offset + s1->size;
1601 BFD_ASSERT (start < end);
1602 BFD_ASSERT (start <= location);
1603 BFD_ASSERT (location < end);
1605 /* Put stubs at the end of the group unless that is not a valid
1606 location and the beginning of the group is. It might be that
1607 neither the beginning nor end works if we have an input section
1608 so large that it spans multiple segment boundaries. In that
1609 case, punt; the end result will be a relocation overflow error no
1610 matter what we do here.
1612 Note that adding stubs pushes up the addresses of all subsequent
1613 sections, so that stubs allocated on one pass through the
1614 relaxation loop may not be valid on the next pass. (E.g., we may
1615 allocate a stub at the beginning of the section on one pass and
1616 find that the call site has been bumped into the next memory
1617 segment on the next pass.) The important thing to note is that
1618 we never try to reclaim the space allocated to such unused stubs,
1619 so code size and section addresses can only increase with each
1620 iteration. Accounting for the start and end addresses of the
1621 already-created stub sections ensures that when the algorithm
1622 converges, it converges accurately, with the entire appropriate
1623 stub section accessible from the call site and not just the
1624 address at the start or end of the stub group proper. */
1626 if (segment == CALL26_SEGMENT (end))
1627 return nios2_stub_call26_after;
1628 else if (segment == CALL26_SEGMENT (start))
1629 return nios2_stub_call26_before;
1631 /* Perhaps this should be a dedicated error code. */
1632 return nios2_stub_none;
1636 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
1638 struct elf32_nios2_stub_hash_entry *hsh
1639 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
1640 asection *stub_sec = hsh->stub_sec;
1643 /* Make a note of the offset within the stubs for this entry. */
1644 hsh->stub_offset = stub_sec->size;
1646 switch (hsh->stub_type)
1648 case nios2_stub_call26_before:
1649 case nios2_stub_call26_after:
1650 /* A call26 stub looks like:
1651 orhi at, %hiadj(dest)
1652 addi at, at, %lo(dest)
1654 Note that call/jmpi instructions can't be used in PIC code
1655 so there is no reason for the stub to be PIC, either. */
1656 sym_value = (hsh->target_value
1657 + hsh->target_section->output_offset
1658 + hsh->target_section->output_section->vma
1661 nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry,
1662 hsh->stub_offset, 3);
1663 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset,
1665 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4,
1666 (sym_value & 0xffff));
1667 stub_sec->size += 12;
1677 /* As above, but don't actually build the stub. Just bump offset so
1678 we know stub section sizes. */
1680 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
1682 struct elf32_nios2_stub_hash_entry *hsh
1683 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
1685 switch (hsh->stub_type)
1687 case nios2_stub_call26_before:
1688 case nios2_stub_call26_after:
1689 hsh->stub_sec->size += 12;
1698 /* Read in all local syms for all input bfds.
1699 Returns -1 on error, 0 otherwise. */
1702 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
1703 struct bfd_link_info *info)
1705 unsigned int bfd_indx;
1706 Elf_Internal_Sym *local_syms, **all_local_syms;
1707 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1709 /* We want to read in symbol extension records only once. To do this
1710 we need to read in the local symbols in parallel and save them for
1711 later use; so hold pointers to the local symbols in an array. */
1712 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
1713 all_local_syms = bfd_zmalloc (amt);
1714 htab->all_local_syms = all_local_syms;
1715 if (all_local_syms == NULL)
1718 /* Walk over all the input BFDs, swapping in local symbols. */
1721 input_bfd = input_bfd->link_next, bfd_indx++)
1723 Elf_Internal_Shdr *symtab_hdr;
1725 /* We'll need the symbol table in a second. */
1726 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1727 if (symtab_hdr->sh_info == 0)
1730 /* We need an array of the local symbols attached to the input bfd. */
1731 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
1732 if (local_syms == NULL)
1734 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1735 symtab_hdr->sh_info, 0,
1737 /* Cache them for elf_link_input_bfd. */
1738 symtab_hdr->contents = (unsigned char *) local_syms;
1740 if (local_syms == NULL)
1743 all_local_syms[bfd_indx] = local_syms;
1749 /* Determine and set the size of the stub section for a final link. */
1751 nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd,
1752 struct bfd_link_info *info,
1753 asection *(*add_stub_section) (const char *,
1754 asection *, bfd_boolean),
1755 void (*layout_sections_again) (void))
1757 bfd_boolean stub_changed = FALSE;
1758 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1760 /* Stash our params away. */
1761 htab->stub_bfd = stub_bfd;
1762 htab->add_stub_section = add_stub_section;
1763 htab->layout_sections_again = layout_sections_again;
1765 /* FIXME: We only compute the section groups once. This could cause
1766 problems if adding a large stub section causes following sections,
1767 or parts of them, to move into another segment. However, this seems
1768 to be consistent with the way other back ends handle this.... */
1769 group_sections (htab);
1771 if (get_local_syms (output_bfd, info->input_bfds, info))
1773 if (htab->all_local_syms)
1774 goto error_ret_free_local;
1781 unsigned int bfd_indx;
1784 for (input_bfd = info->input_bfds, bfd_indx = 0;
1786 input_bfd = input_bfd->link_next, bfd_indx++)
1788 Elf_Internal_Shdr *symtab_hdr;
1790 Elf_Internal_Sym *local_syms;
1792 /* We'll need the symbol table in a second. */
1793 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1794 if (symtab_hdr->sh_info == 0)
1797 local_syms = htab->all_local_syms[bfd_indx];
1799 /* Walk over each section attached to the input bfd. */
1800 for (section = input_bfd->sections;
1802 section = section->next)
1804 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1806 /* If there aren't any relocs, then there's nothing more
1808 if ((section->flags & SEC_RELOC) == 0
1809 || section->reloc_count == 0)
1812 /* If this section is a link-once section that will be
1813 discarded, then don't create any stubs. */
1814 if (section->output_section == NULL
1815 || section->output_section->owner != output_bfd)
1818 /* Get the relocs. */
1820 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
1822 if (internal_relocs == NULL)
1823 goto error_ret_free_local;
1825 /* Now examine each relocation. */
1826 irela = internal_relocs;
1827 irelaend = irela + section->reloc_count;
1828 for (; irela < irelaend; irela++)
1830 unsigned int r_type, r_indx;
1831 enum elf32_nios2_stub_type stub_type;
1832 struct elf32_nios2_stub_hash_entry *hsh;
1835 bfd_vma destination;
1836 struct elf32_nios2_link_hash_entry *hh;
1838 const asection *id_sec;
1840 r_type = ELF32_R_TYPE (irela->r_info);
1841 r_indx = ELF32_R_SYM (irela->r_info);
1843 if (r_type >= (unsigned int) R_NIOS2_ILLEGAL)
1845 bfd_set_error (bfd_error_bad_value);
1846 error_ret_free_internal:
1847 if (elf_section_data (section)->relocs == NULL)
1848 free (internal_relocs);
1849 goto error_ret_free_local;
1852 /* Only look for stubs on CALL and JMPI instructions. */
1853 if (r_type != (unsigned int) R_NIOS2_CALL26)
1856 /* Now determine the call target, its name, value,
1862 if (r_indx < symtab_hdr->sh_info)
1864 /* It's a local symbol. */
1865 Elf_Internal_Sym *sym;
1866 Elf_Internal_Shdr *hdr;
1869 sym = local_syms + r_indx;
1870 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
1871 sym_value = sym->st_value;
1872 shndx = sym->st_shndx;
1873 if (shndx < elf_numsections (input_bfd))
1875 hdr = elf_elfsections (input_bfd)[shndx];
1876 sym_sec = hdr->bfd_section;
1877 destination = (sym_value + irela->r_addend
1878 + sym_sec->output_offset
1879 + sym_sec->output_section->vma);
1884 /* It's an external symbol. */
1887 e_indx = r_indx - symtab_hdr->sh_info;
1888 hh = ((struct elf32_nios2_link_hash_entry *)
1889 elf_sym_hashes (input_bfd)[e_indx]);
1891 while (hh->root.root.type == bfd_link_hash_indirect
1892 || hh->root.root.type == bfd_link_hash_warning)
1893 hh = ((struct elf32_nios2_link_hash_entry *)
1894 hh->root.root.u.i.link);
1896 if (hh->root.root.type == bfd_link_hash_defined
1897 || hh->root.root.type == bfd_link_hash_defweak)
1899 sym_sec = hh->root.root.u.def.section;
1900 sym_value = hh->root.root.u.def.value;
1902 if (sym_sec->output_section != NULL)
1903 destination = (sym_value + irela->r_addend
1904 + sym_sec->output_offset
1905 + sym_sec->output_section->vma);
1909 else if (hh->root.root.type == bfd_link_hash_undefweak)
1914 else if (hh->root.root.type == bfd_link_hash_undefined)
1916 if (! (info->unresolved_syms_in_objects == RM_IGNORE
1917 && (ELF_ST_VISIBILITY (hh->root.other)
1923 bfd_set_error (bfd_error_bad_value);
1924 goto error_ret_free_internal;
1928 /* Determine what (if any) linker stub is needed. */
1929 stub_type = nios2_type_of_stub (section, irela, hh, htab,
1931 if (stub_type == nios2_stub_none)
1934 /* Support for grouping stub sections. */
1935 if (stub_type == nios2_stub_call26_before)
1936 id_sec = htab->stub_group[section->id].first_sec;
1938 id_sec = htab->stub_group[section->id].last_sec;
1940 /* Get the name of this stub. */
1941 stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela,
1944 goto error_ret_free_internal;
1946 hsh = nios2_stub_hash_lookup (&htab->bstab,
1951 /* The proper stub has already been created. */
1956 hsh = nios2_add_stub (stub_name, section, htab, stub_type);
1960 goto error_ret_free_internal;
1962 hsh->target_value = sym_value;
1963 hsh->target_section = sym_sec;
1964 hsh->stub_type = stub_type;
1966 hsh->addend = irela->r_addend;
1967 stub_changed = TRUE;
1970 /* We're done with the internal relocs, free them. */
1971 if (elf_section_data (section)->relocs == NULL)
1972 free (internal_relocs);
1979 /* OK, we've added some stubs. Find out the new size of the
1981 for (stub_sec = htab->stub_bfd->sections;
1983 stub_sec = stub_sec->next)
1986 bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab);
1988 /* Ask the linker to do its stuff. */
1989 (*htab->layout_sections_again) ();
1990 stub_changed = FALSE;
1993 free (htab->all_local_syms);
1996 error_ret_free_local:
1997 free (htab->all_local_syms);
2001 /* Build all the stubs associated with the current output file. The
2002 stubs are kept in a hash table attached to the main linker hash
2003 table. This function is called via nios2elf_finish in the linker. */
2005 nios2_elf32_build_stubs (struct bfd_link_info *info)
2008 struct bfd_hash_table *table;
2009 struct elf32_nios2_link_hash_table *htab;
2011 htab = elf32_nios2_hash_table (info);
2013 for (stub_sec = htab->stub_bfd->sections;
2015 stub_sec = stub_sec->next)
2016 /* The stub_bfd may contain non-stub sections if it is also the
2017 dynobj. Any such non-stub sections are created with the
2018 SEC_LINKER_CREATED flag set, while stub sections do not
2019 have that flag. Ignore any non-stub sections here. */
2020 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2024 /* Allocate memory to hold the linker stubs. */
2025 size = stub_sec->size;
2026 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
2027 if (stub_sec->contents == NULL && size != 0)
2032 /* Build the stubs as directed by the stub hash table. */
2033 table = &htab->bstab;
2034 bfd_hash_traverse (table, nios2_build_one_stub, info);
2040 /* Implement bfd_elf32_bfd_reloc_type_lookup:
2041 Given a BFD reloc type, return a howto structure. */
2042 static reloc_howto_type *
2043 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2044 bfd_reloc_code_real_type code)
2048 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2050 if (nios2_reloc_map[i].bfd_val == code)
2051 return &elf_nios2_howto_table_rel[(int) nios2_reloc_map[i].elf_val];
2055 /* Implement bfd_elf32_bfd_reloc_name_lookup:
2056 Given a reloc name, return a howto structure. */
2057 static reloc_howto_type *
2058 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2063 i < (sizeof (elf_nios2_howto_table_rel)
2064 / sizeof (elf_nios2_howto_table_rel[0]));
2066 if (elf_nios2_howto_table_rel[i].name
2067 && strcasecmp (elf_nios2_howto_table_rel[i].name, r_name) == 0)
2068 return &elf_nios2_howto_table_rel[i];
2073 /* Implement elf_info_to_howto:
2074 Given a ELF32 relocation, fill in a arelent structure. */
2076 nios2_elf32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2077 Elf_Internal_Rela *dst)
2079 unsigned int r_type;
2081 r_type = ELF32_R_TYPE (dst->r_info);
2082 BFD_ASSERT (r_type < R_NIOS2_ILLEGAL);
2083 cache_ptr->howto = &elf_nios2_howto_table_rel[r_type];
2086 /* Return the base VMA address which should be subtracted from real addresses
2087 when resolving @dtpoff relocation.
2088 This is PT_TLS segment p_vaddr. */
2090 dtpoff_base (struct bfd_link_info *info)
2092 /* If tls_sec is NULL, we should have signalled an error already. */
2093 if (elf_hash_table (info)->tls_sec == NULL)
2095 return elf_hash_table (info)->tls_sec->vma;
2098 /* Return the relocation value for @tpoff relocation
2099 if STT_TLS virtual address is ADDRESS. */
2101 tpoff (struct bfd_link_info *info, bfd_vma address)
2103 struct elf_link_hash_table *htab = elf_hash_table (info);
2105 /* If tls_sec is NULL, we should have signalled an error already. */
2106 if (htab->tls_sec == NULL)
2108 return address - htab->tls_sec->vma;
2111 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
2112 dangerous relocation. */
2114 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
2117 bfd_boolean gp_found;
2118 struct bfd_hash_entry *h;
2119 struct bfd_link_hash_entry *lh;
2121 /* If we've already figured out what GP will be, just return it. */
2122 *pgp = _bfd_get_gp_value (output_bfd);
2126 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
2127 lh = (struct bfd_link_hash_entry *) h;
2133 case bfd_link_hash_undefined:
2134 case bfd_link_hash_undefweak:
2135 case bfd_link_hash_common:
2138 case bfd_link_hash_defined:
2139 case bfd_link_hash_defweak:
2141 *pgp = lh->u.def.value;
2143 case bfd_link_hash_indirect:
2144 case bfd_link_hash_warning:
2146 /* @@FIXME ignoring warning for now */
2148 case bfd_link_hash_new:
2158 /* Only get the error once. */
2160 _bfd_set_gp_value (output_bfd, *pgp);
2164 _bfd_set_gp_value (output_bfd, *pgp);
2169 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
2170 if it's not available as we don't have a link_info pointer available here
2171 to look it up in the output symbol table. We don't need to adjust the
2172 symbol value for an external symbol if we are producing relocatable
2174 static bfd_reloc_status_type
2175 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2176 char **error_message, bfd_vma *pgp)
2178 if (bfd_is_und_section (symbol->section) && !relocatable)
2181 return bfd_reloc_undefined;
2184 *pgp = _bfd_get_gp_value (output_bfd);
2185 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
2189 /* Make up a value. */
2190 *pgp = symbol->section->output_section->vma + 0x4000;
2191 _bfd_set_gp_value (output_bfd, *pgp);
2196 = (char *) _("global pointer relative relocation when _gp not defined");
2197 return bfd_reloc_dangerous;
2201 return bfd_reloc_ok;
2204 /* Do the relocations that require special handling. */
2205 static bfd_reloc_status_type
2206 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto,
2207 asection *input_section,
2208 bfd_byte *data, bfd_vma offset,
2209 bfd_vma symbol_value, bfd_vma addend)
2211 symbol_value = symbol_value + addend;
2213 symbol_value = (symbol_value >> 16) & 0xffff;
2214 return _bfd_final_link_relocate (howto, abfd, input_section,
2215 data, offset, symbol_value, addend);
2218 static bfd_reloc_status_type
2219 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2220 asection *input_section,
2221 bfd_byte *data, bfd_vma offset,
2222 bfd_vma symbol_value, bfd_vma addend)
2224 symbol_value = symbol_value + addend;
2226 symbol_value = symbol_value & 0xffff;
2227 return _bfd_final_link_relocate (howto, abfd, input_section,
2228 data, offset, symbol_value, addend);
2231 static bfd_reloc_status_type
2232 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2233 asection *input_section,
2234 bfd_byte *data, bfd_vma offset,
2235 bfd_vma symbol_value, bfd_vma addend)
2237 symbol_value = symbol_value + addend;
2239 symbol_value = hiadj(symbol_value);
2240 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2241 symbol_value, addend);
2244 static bfd_reloc_status_type
2245 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2246 asection *input_section,
2247 bfd_byte *data, bfd_vma offset,
2248 bfd_vma symbol_value, bfd_vma addend)
2250 symbol_value = symbol_value + addend;
2252 symbol_value = symbol_value & 0xffff;
2253 return _bfd_final_link_relocate (howto, abfd, input_section,
2254 data, offset, symbol_value, addend);
2257 static bfd_reloc_status_type
2258 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2259 asection *input_section,
2260 bfd_byte *data, bfd_vma offset,
2261 bfd_vma symbol_value, bfd_vma addend)
2263 symbol_value = symbol_value + addend;
2264 symbol_value -= (input_section->output_section->vma
2265 + input_section->output_offset);
2266 symbol_value -= offset;
2268 symbol_value = hiadj(symbol_value);
2269 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2270 symbol_value, addend);
2273 static bfd_reloc_status_type
2274 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
2275 asection *input_section,
2276 bfd_byte *data, bfd_vma offset,
2277 bfd_vma symbol_value, bfd_vma addend)
2279 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction
2280 so we need to subtract 4 before doing a final_link_relocate. */
2281 symbol_value = symbol_value + addend - 4;
2283 return _bfd_final_link_relocate (howto, abfd, input_section,
2284 data, offset, symbol_value, addend);
2287 static bfd_reloc_status_type
2288 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
2289 asection *input_section,
2290 bfd_byte *data, bfd_vma offset,
2291 bfd_vma symbol_value, bfd_vma addend)
2293 /* Check that the relocation is in the same page as the current address. */
2294 if (CALL26_SEGMENT (symbol_value + addend)
2295 != CALL26_SEGMENT (input_section->output_section->vma
2296 + input_section->output_offset
2298 return bfd_reloc_overflow;
2300 return _bfd_final_link_relocate (howto, abfd, input_section,
2301 data, offset, symbol_value, addend);
2304 static bfd_reloc_status_type
2305 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
2306 asection *input_section,
2307 bfd_byte *data, bfd_vma offset,
2308 bfd_vma symbol_value, bfd_vma addend)
2310 /* Because we need the output_bfd, the special handling is done
2311 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */
2312 return _bfd_final_link_relocate (howto, abfd, input_section,
2313 data, offset, symbol_value, addend);
2316 static bfd_reloc_status_type
2317 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
2318 asection *input_section,
2319 bfd_byte *data, bfd_vma offset,
2320 bfd_vma symbol_value, bfd_vma addend)
2322 bfd_vma symbol_lo16, symbol_hi16;
2323 bfd_reloc_status_type r;
2324 symbol_value = symbol_value + addend;
2326 symbol_hi16 = (symbol_value >> 16) & 0xffff;
2327 symbol_lo16 = symbol_value & 0xffff;
2329 r = _bfd_final_link_relocate (howto, abfd, input_section,
2330 data, offset, symbol_hi16, addend);
2332 if (r == bfd_reloc_ok)
2333 return _bfd_final_link_relocate (howto, abfd, input_section,
2334 data, offset + 4, symbol_lo16, addend);
2339 static bfd_reloc_status_type
2340 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
2341 asection *input_section,
2342 bfd_byte *data, bfd_vma offset,
2343 bfd_vma symbol_value, bfd_vma addend)
2345 bfd_vma symbol_lo16, symbol_hi16;
2346 bfd_reloc_status_type r;
2347 symbol_value = symbol_value + addend;
2349 symbol_hi16 = (symbol_value >> 16) & 0xffff;
2350 symbol_lo16 = symbol_value & 0xffff;
2352 r = _bfd_final_link_relocate (howto, abfd, input_section,
2353 data, offset, symbol_hi16, addend);
2355 if (r == bfd_reloc_ok)
2356 return _bfd_final_link_relocate (howto, abfd, input_section,
2357 data, offset + 4, symbol_lo16, addend);
2362 static bfd_reloc_status_type
2363 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
2364 asection *input_section,
2365 bfd_byte *data, bfd_vma offset,
2366 bfd_vma symbol_value, bfd_vma addend)
2368 bfd_vma symbol_lo16, symbol_hi16;
2369 bfd_reloc_status_type r;
2370 symbol_value = symbol_value + addend;
2372 symbol_hi16 = (symbol_value >> 16) & 0xffff;
2373 symbol_lo16 = symbol_value & 0xffff;
2375 r = _bfd_final_link_relocate (howto, abfd, input_section,
2376 data, offset, symbol_hi16, addend);
2378 if (r == bfd_reloc_ok)
2379 return _bfd_final_link_relocate (howto, abfd, input_section,
2380 data, offset + 4, symbol_lo16, addend);
2385 /* HOWTO handlers for relocations that require special handling. */
2387 /* This is for relocations used only when relaxing to ensure
2388 changes in size of section don't screw up .align. */
2389 static bfd_reloc_status_type
2390 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2391 asymbol *symbol ATTRIBUTE_UNUSED,
2392 void *data ATTRIBUTE_UNUSED, asection *input_section,
2394 char **error_message ATTRIBUTE_UNUSED)
2396 if (output_bfd != NULL)
2397 reloc_entry->address += input_section->output_offset;
2398 return bfd_reloc_ok;
2401 static bfd_reloc_status_type
2402 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2403 void *data, asection *input_section,
2405 char **error_message ATTRIBUTE_UNUSED)
2407 /* This part is from bfd_elf_generic_reloc. */
2408 if (output_bfd != NULL
2409 && (symbol->flags & BSF_SECTION_SYM) == 0
2410 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2412 reloc_entry->address += input_section->output_offset;
2413 return bfd_reloc_ok;
2416 if (output_bfd != NULL)
2417 /* FIXME: See bfd_perform_relocation. Is this right? */
2418 return bfd_reloc_continue;
2420 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
2422 data, reloc_entry->address,
2424 + symbol->section->output_section->vma
2425 + symbol->section->output_offset),
2426 reloc_entry->addend);
2429 static bfd_reloc_status_type
2430 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2431 void *data, asection *input_section,
2433 char **error_message ATTRIBUTE_UNUSED)
2435 /* This part is from bfd_elf_generic_reloc. */
2436 if (output_bfd != NULL
2437 && (symbol->flags & BSF_SECTION_SYM) == 0
2438 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2440 reloc_entry->address += input_section->output_offset;
2441 return bfd_reloc_ok;
2444 if (output_bfd != NULL)
2445 /* FIXME: See bfd_perform_relocation. Is this right? */
2446 return bfd_reloc_continue;
2448 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
2450 data, reloc_entry->address,
2452 + symbol->section->output_section->vma
2453 + symbol->section->output_offset),
2454 reloc_entry->addend);
2457 static bfd_reloc_status_type
2458 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2459 void *data, asection *input_section,
2461 char **error_message ATTRIBUTE_UNUSED)
2463 /* This part is from bfd_elf_generic_reloc. */
2464 if (output_bfd != NULL
2465 && (symbol->flags & BSF_SECTION_SYM) == 0
2466 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2468 reloc_entry->address += input_section->output_offset;
2469 return bfd_reloc_ok;
2472 if (output_bfd != NULL)
2473 /* FIXME: See bfd_perform_relocation. Is this right? */
2474 return bfd_reloc_continue;
2476 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
2478 data, reloc_entry->address,
2480 + symbol->section->output_section->vma
2481 + symbol->section->output_offset),
2482 reloc_entry->addend);
2485 static bfd_reloc_status_type
2486 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
2487 asymbol *symbol, void *data,
2488 asection *input_section, bfd *output_bfd,
2489 char **error_message ATTRIBUTE_UNUSED)
2491 /* This part is from bfd_elf_generic_reloc. */
2492 if (output_bfd != NULL
2493 && (symbol->flags & BSF_SECTION_SYM) == 0
2494 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2496 reloc_entry->address += input_section->output_offset;
2497 return bfd_reloc_ok;
2500 if (output_bfd != NULL)
2501 /* FIXME: See bfd_perform_relocation. Is this right? */
2502 return bfd_reloc_continue;
2504 return nios2_elf32_do_pcrel_lo16_relocate (
2505 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2506 (symbol->value + symbol->section->output_section->vma
2507 + symbol->section->output_offset),
2508 reloc_entry->addend);
2511 static bfd_reloc_status_type
2512 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
2513 asymbol *symbol, void *data,
2514 asection *input_section, bfd *output_bfd,
2515 char **error_message ATTRIBUTE_UNUSED)
2517 /* This part is from bfd_elf_generic_reloc. */
2518 if (output_bfd != NULL
2519 && (symbol->flags & BSF_SECTION_SYM) == 0
2520 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2522 reloc_entry->address += input_section->output_offset;
2523 return bfd_reloc_ok;
2526 if (output_bfd != NULL)
2527 /* FIXME: See bfd_perform_relocation. Is this right? */
2528 return bfd_reloc_continue;
2530 return nios2_elf32_do_pcrel_hiadj16_relocate (
2531 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2532 (symbol->value + symbol->section->output_section->vma
2533 + symbol->section->output_offset),
2534 reloc_entry->addend);
2537 static bfd_reloc_status_type
2538 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2539 void *data, asection *input_section,
2541 char **error_message ATTRIBUTE_UNUSED)
2543 /* This part is from bfd_elf_generic_reloc. */
2544 if (output_bfd != NULL
2545 && (symbol->flags & BSF_SECTION_SYM) == 0
2546 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2548 reloc_entry->address += input_section->output_offset;
2549 return bfd_reloc_ok;
2552 if (output_bfd != NULL)
2553 /* FIXME: See bfd_perform_relocation. Is this right? */
2554 return bfd_reloc_continue;
2556 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
2558 data, reloc_entry->address,
2560 + symbol->section->output_section->vma
2561 + symbol->section->output_offset),
2562 reloc_entry->addend);
2565 static bfd_reloc_status_type
2566 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2567 void *data, asection *input_section,
2569 char **error_message ATTRIBUTE_UNUSED)
2571 /* This part is from bfd_elf_generic_reloc. */
2572 if (output_bfd != NULL
2573 && (symbol->flags & BSF_SECTION_SYM) == 0
2574 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2576 reloc_entry->address += input_section->output_offset;
2577 return bfd_reloc_ok;
2580 if (output_bfd != NULL)
2581 /* FIXME: See bfd_perform_relocation. Is this right? */
2582 return bfd_reloc_continue;
2584 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
2586 data, reloc_entry->address,
2588 + symbol->section->output_section->vma
2589 + symbol->section->output_offset),
2590 reloc_entry->addend);
2593 static bfd_reloc_status_type
2594 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2595 void *data, asection *input_section,
2596 bfd *output_bfd, char **msg)
2600 bfd_reloc_status_type r;
2603 /* This part is from bfd_elf_generic_reloc. */
2604 if (output_bfd != NULL
2605 && (symbol->flags & BSF_SECTION_SYM) == 0
2606 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2608 reloc_entry->address += input_section->output_offset;
2609 return bfd_reloc_ok;
2612 if (output_bfd != NULL)
2613 /* FIXME: See bfd_perform_relocation. Is this right? */
2614 return bfd_reloc_continue;
2616 relocation = (symbol->value
2617 + symbol->section->output_section->vma
2618 + symbol->section->output_offset);
2620 /* This assumes we've already cached the _gp symbol. */
2621 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
2622 if (r == bfd_reloc_ok)
2624 relocation = relocation + reloc_entry->addend - gp;
2625 reloc_entry->addend = 0;
2626 if ((signed) relocation < -32768 || (signed) relocation > 32767)
2628 *msg = _("global pointer relative address out of range");
2629 r = bfd_reloc_outofrange;
2632 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
2634 data, reloc_entry->address,
2635 relocation, reloc_entry->addend);
2641 static bfd_reloc_status_type
2642 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2643 void *data, asection *input_section,
2644 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2646 /* This part is from bfd_elf_generic_reloc. */
2647 if (output_bfd != NULL
2648 && (symbol->flags & BSF_SECTION_SYM) == 0
2649 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2651 reloc_entry->address += input_section->output_offset;
2652 return bfd_reloc_ok;
2655 if (output_bfd != NULL)
2656 /* FIXME: See bfd_perform_relocation. Is this right? */
2657 return bfd_reloc_continue;
2659 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
2661 data, reloc_entry->address,
2663 + symbol->section->output_section->vma
2664 + symbol->section->output_offset),
2665 reloc_entry->addend);
2668 static bfd_reloc_status_type
2669 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2670 void *data, asection *input_section,
2671 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2673 /* This part is from bfd_elf_generic_reloc. */
2674 if (output_bfd != NULL
2675 && (symbol->flags & BSF_SECTION_SYM) == 0
2676 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2678 reloc_entry->address += input_section->output_offset;
2679 return bfd_reloc_ok;
2682 if (output_bfd != NULL)
2683 /* FIXME: See bfd_perform_relocation. Is this right? */
2684 return bfd_reloc_continue;
2686 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
2688 data, reloc_entry->address,
2690 + symbol->section->output_section->vma
2691 + symbol->section->output_offset),
2692 reloc_entry->addend);
2695 static bfd_reloc_status_type
2696 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2697 void *data, asection *input_section,
2698 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2700 /* This part is from bfd_elf_generic_reloc. */
2701 if (output_bfd != NULL
2702 && (symbol->flags & BSF_SECTION_SYM) == 0
2703 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2705 reloc_entry->address += input_section->output_offset;
2706 return bfd_reloc_ok;
2709 if (output_bfd != NULL)
2710 /* FIXME: See bfd_perform_relocation. Is this right? */
2711 return bfd_reloc_continue;
2713 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
2715 data, reloc_entry->address,
2717 + symbol->section->output_section->vma
2718 + symbol->section->output_offset),
2719 reloc_entry->addend);
2723 /* Implement elf_backend_relocate_section. */
2725 nios2_elf32_relocate_section (bfd *output_bfd,
2726 struct bfd_link_info *info,
2728 asection *input_section,
2730 Elf_Internal_Rela *relocs,
2731 Elf_Internal_Sym *local_syms,
2732 asection **local_sections)
2734 Elf_Internal_Shdr *symtab_hdr;
2735 struct elf_link_hash_entry **sym_hashes;
2736 Elf_Internal_Rela *rel;
2737 Elf_Internal_Rela *relend;
2738 struct elf32_nios2_link_hash_table *htab;
2741 asection *sreloc = NULL;
2742 bfd_vma *local_got_offsets;
2745 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2746 sym_hashes = elf_sym_hashes (input_bfd);
2747 relend = relocs + input_section->reloc_count;
2749 htab = elf32_nios2_hash_table (info);
2750 sgot = htab->root.sgot;
2751 splt = htab->root.splt;
2752 local_got_offsets = elf_local_got_offsets (input_bfd);
2754 if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
2757 got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
2759 for (rel = relocs; rel < relend; rel++)
2761 reloc_howto_type *howto;
2762 unsigned long r_symndx;
2763 Elf_Internal_Sym *sym;
2765 struct elf_link_hash_entry *h;
2766 struct elf32_nios2_link_hash_entry *eh;
2769 bfd_vma reloc_address;
2770 bfd_reloc_status_type r = bfd_reloc_ok;
2771 const char *name = NULL;
2775 const char* msg = (const char*) NULL;
2776 bfd_boolean unresolved_reloc;
2780 r_type = ELF32_R_TYPE (rel->r_info);
2781 r_symndx = ELF32_R_SYM (rel->r_info);
2783 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
2788 if (r_symndx < symtab_hdr->sh_info)
2790 sym = local_syms + r_symndx;
2791 sec = local_sections[r_symndx];
2792 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2796 bfd_boolean warned, ignored;
2798 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2799 r_symndx, symtab_hdr, sym_hashes,
2801 unresolved_reloc, warned, ignored);
2804 if (sec && discarded_section (sec))
2805 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2806 rel, 1, relend, howto, 0, contents);
2808 /* Nothing more to do unless this is a final link. */
2809 if (info->relocatable)
2812 if (sec && sec->output_section)
2813 reloc_address = (sec->output_section->vma + sec->output_offset
2820 switch (howto->type)
2823 r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
2825 contents, rel->r_offset,
2826 relocation, rel->r_addend);
2829 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
2831 contents, rel->r_offset,
2832 relocation, rel->r_addend);
2834 case R_NIOS2_PCREL_LO:
2835 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
2842 case R_NIOS2_HIADJ16:
2843 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
2844 input_section, contents,
2845 rel->r_offset, relocation,
2848 case R_NIOS2_PCREL_HA:
2849 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
2856 case R_NIOS2_PCREL16:
2857 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
2858 input_section, contents,
2859 rel->r_offset, relocation,
2863 /* Turns an absolute address into a gp-relative address. */
2864 if (!nios2_elf_assign_gp (output_bfd, &gp, info))
2866 format = _("global pointer relative relocation at address "
2867 "0x%08x when _gp not defined\n");
2868 sprintf (msgbuf, format, reloc_address);
2870 r = bfd_reloc_dangerous;
2874 bfd_vma symbol_address = rel->r_addend + relocation;
2875 relocation = relocation + rel->r_addend - gp;
2877 if (((signed) relocation < -32768
2878 || (signed) relocation > 32767)
2880 || h->root.type == bfd_link_hash_defined
2881 || h->root.type == bfd_link_hash_defweak))
2883 format = _("Unable to reach %s (at 0x%08x) from the "
2884 "global pointer (at 0x%08x) because the "
2885 "offset (%d) is out of the allowed range, "
2886 "-32678 to 32767.\n" );
2887 sprintf (msgbuf, format, name, symbol_address, gp,
2888 (signed)relocation);
2890 r = bfd_reloc_outofrange;
2893 r = _bfd_final_link_relocate (howto, input_bfd,
2894 input_section, contents,
2895 rel->r_offset, relocation,
2901 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
2903 contents, rel->r_offset,
2904 relocation, rel->r_addend);
2907 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
2909 contents, rel->r_offset,
2910 relocation, rel->r_addend);
2913 r = nios2_elf32_do_callr_relocate (input_bfd, howto,
2914 input_section, contents,
2915 rel->r_offset, relocation,
2918 case R_NIOS2_CALL26:
2919 case R_NIOS2_CALL26_NOAT:
2920 /* If we have a call to an undefined weak symbol, we just want
2921 to stuff a zero in the bits of the call instruction and
2922 bypass the normal call26 relocation handling, because it'll
2923 diagnose an overflow error if address 0 isn't in the same
2924 256MB segment as the call site. Presumably the call
2925 should be guarded by a null check anyway. */
2926 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
2928 BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
2929 r = _bfd_final_link_relocate (howto, input_bfd,
2930 input_section, contents,
2931 rel->r_offset, relocation,
2935 /* Handle relocations which should use the PLT entry.
2936 NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
2937 which may point to a PLT entry, but we don't need to handle
2938 that here. If we created a PLT entry, all branches in this
2939 object should go to it. */
2940 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
2942 /* If we've created a .plt section, and assigned a PLT entry
2943 to this function, it should not be known to bind locally.
2944 If it were, we would have cleared the PLT entry. */
2945 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2947 relocation = (splt->output_section->vma
2948 + splt->output_offset
2951 unresolved_reloc = FALSE;
2953 /* Detect R_NIOS2_CALL26 relocations that would overflow the
2954 256MB segment. Replace the target with a reference to a
2956 Note that htab->stub_group is null if relaxation has been
2957 disabled by the --no-relax linker command-line option, so
2958 we can use that to skip this processing entirely. */
2959 if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
2961 bfd_vma dest = relocation + rel->r_addend;
2962 enum elf32_nios2_stub_type stub_type;
2964 eh = (struct elf32_nios2_link_hash_entry *)h;
2965 stub_type = nios2_type_of_stub (input_section, rel, eh,
2968 if (stub_type != nios2_stub_none)
2970 struct elf32_nios2_stub_hash_entry *hsh;
2972 hsh = nios2_get_stub_entry (input_section, sec,
2973 eh, rel, htab, stub_type);
2976 r = bfd_reloc_undefined;
2980 dest = (hsh->stub_offset
2981 + hsh->stub_sec->output_offset
2982 + hsh->stub_sec->output_section->vma);
2983 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2993 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2994 input_section, contents,
2995 rel->r_offset, relocation,
3000 /* For symmetry this would be
3001 r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
3002 input_section, contents,
3003 rel->r_offset, relocation,
3005 but do_ignore_reloc would do no more than return
3010 case R_NIOS2_CALL16:
3011 case R_NIOS2_GOT_LO:
3012 case R_NIOS2_GOT_HA:
3013 case R_NIOS2_CALL_LO:
3014 case R_NIOS2_CALL_HA:
3015 /* Relocation is to the entry for this symbol in the
3016 global offset table. */
3019 r = bfd_reloc_notsupported;
3029 eh = (struct elf32_nios2_link_hash_entry *)h;
3030 use_plt = (eh->got_types_used == CALL_USED
3031 && h->plt.offset != (bfd_vma) -1);
3033 off = h->got.offset;
3034 BFD_ASSERT (off != (bfd_vma) -1);
3035 dyn = elf_hash_table (info)->dynamic_sections_created;
3036 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3038 && SYMBOL_REFERENCES_LOCAL (info, h))
3039 || (ELF_ST_VISIBILITY (h->other)
3040 && h->root.type == bfd_link_hash_undefweak))
3042 /* This is actually a static link, or it is a -Bsymbolic
3043 link and the symbol is defined locally. We must
3044 initialize this entry in the global offset table.
3045 Since the offset must always be a multiple of 4, we
3046 use the least significant bit to record whether we
3047 have initialized it already.
3049 When doing a dynamic link, we create a .rela.got
3050 relocation entry to initialize the value. This is
3051 done in the finish_dynamic_symbol routine. */
3056 bfd_put_32 (output_bfd, relocation,
3057 sgot->contents + off);
3062 unresolved_reloc = FALSE;
3066 BFD_ASSERT (local_got_offsets != NULL
3067 && local_got_offsets[r_symndx] != (bfd_vma) -1);
3069 off = local_got_offsets[r_symndx];
3071 /* The offset must always be a multiple of 4. We use the
3072 least significant bit to record whether we have already
3073 generated the necessary reloc. */
3078 bfd_put_32 (output_bfd, relocation,
3079 sgot->contents + off);
3084 Elf_Internal_Rela outrel;
3087 srelgot = htab->root.srelgot;
3088 BFD_ASSERT (srelgot != NULL);
3090 outrel.r_addend = relocation;
3091 outrel.r_offset = (sgot->output_section->vma
3092 + sgot->output_offset
3094 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3095 loc = srelgot->contents;
3096 loc += (srelgot->reloc_count++ *
3097 sizeof (Elf32_External_Rela));
3098 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3101 local_got_offsets[r_symndx] |= 1;
3105 if (use_plt && info->shared)
3107 off = ((h->plt.offset - 24) / 12 + 3) * 4;
3108 relocation = (htab->root.sgotplt->output_offset + off
3112 relocation = sgot->output_offset + off - got_base;
3114 /* This relocation does not use the addend. */
3117 switch (howto->type)
3119 case R_NIOS2_GOT_LO:
3120 case R_NIOS2_CALL_LO:
3121 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3122 input_section, contents,
3123 rel->r_offset, relocation,
3126 case R_NIOS2_GOT_HA:
3127 case R_NIOS2_CALL_HA:
3128 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3129 input_section, contents,
3135 r = _bfd_final_link_relocate (howto, input_bfd,
3136 input_section, contents,
3137 rel->r_offset, relocation,
3143 case R_NIOS2_GOTOFF_LO:
3144 case R_NIOS2_GOTOFF_HA:
3145 case R_NIOS2_GOTOFF:
3146 /* Relocation is relative to the global offset table pointer. */
3148 BFD_ASSERT (sgot != NULL);
3151 r = bfd_reloc_notsupported;
3155 /* Note that sgot->output_offset is not involved in this
3156 calculation. We always want the start of .got. */
3157 relocation -= sgot->output_section->vma;
3159 /* Now we adjust the relocation to be relative to the GOT pointer
3160 (the _gp_got symbol), which possibly contains the 0x8000 bias. */
3161 relocation -= got_base;
3163 switch (howto->type)
3165 case R_NIOS2_GOTOFF_LO:
3166 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3167 input_section, contents,
3168 rel->r_offset, relocation,
3171 case R_NIOS2_GOTOFF_HA:
3172 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3173 input_section, contents,
3179 r = _bfd_final_link_relocate (howto, input_bfd,
3180 input_section, contents,
3181 rel->r_offset, relocation,
3187 case R_NIOS2_TLS_LDO16:
3188 relocation -= dtpoff_base (info) + DTP_OFFSET;
3190 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3191 contents, rel->r_offset,
3192 relocation, rel->r_addend);
3194 case R_NIOS2_TLS_LDM16:
3195 if (htab->root.sgot == NULL)
3198 off = htab->tls_ldm_got.offset;
3204 /* If we don't know the module number, create a relocation
3208 Elf_Internal_Rela outrel;
3211 if (htab->root.srelgot == NULL)
3214 outrel.r_addend = 0;
3215 outrel.r_offset = (htab->root.sgot->output_section->vma
3216 + htab->root.sgot->output_offset
3218 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
3220 loc = htab->root.srelgot->contents;
3221 loc += (htab->root.srelgot->reloc_count++
3222 * sizeof (Elf32_External_Rela));
3223 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3226 bfd_put_32 (output_bfd, 1,
3227 htab->root.sgot->contents + off);
3229 htab->tls_ldm_got.offset |= 1;
3232 relocation = htab->root.sgot->output_offset + off - got_base;
3234 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3235 contents, rel->r_offset,
3236 relocation, rel->r_addend);
3239 case R_NIOS2_TLS_GD16:
3240 case R_NIOS2_TLS_IE16:
3245 if (htab->root.sgot == NULL)
3252 dyn = htab->root.dynamic_sections_created;
3253 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3255 || !SYMBOL_REFERENCES_LOCAL (info, h)))
3257 unresolved_reloc = FALSE;
3260 off = h->got.offset;
3261 tls_type = (((struct elf32_nios2_link_hash_entry *) h)
3266 if (local_got_offsets == NULL)
3268 off = local_got_offsets[r_symndx];
3269 tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
3273 if (tls_type == GOT_UNKNOWN)
3280 bfd_boolean need_relocs = FALSE;
3281 Elf_Internal_Rela outrel;
3282 bfd_byte *loc = NULL;
3285 /* The GOT entries have not been initialized yet. Do it
3286 now, and emit any relocations. If both an IE GOT and a
3287 GD GOT are necessary, we emit the GD first. */
3289 if ((info->shared || indx != 0)
3291 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3292 || h->root.type != bfd_link_hash_undefweak))
3295 if (htab->root.srelgot == NULL)
3297 loc = htab->root.srelgot->contents;
3298 loc += (htab->root.srelgot->reloc_count *
3299 sizeof (Elf32_External_Rela));
3302 if (tls_type & GOT_TLS_GD)
3306 outrel.r_addend = 0;
3307 outrel.r_offset = (htab->root.sgot->output_section->vma
3308 + htab->root.sgot->output_offset
3310 outrel.r_info = ELF32_R_INFO (indx,
3311 R_NIOS2_TLS_DTPMOD);
3313 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3315 htab->root.srelgot->reloc_count++;
3316 loc += sizeof (Elf32_External_Rela);
3319 bfd_put_32 (output_bfd,
3320 (relocation - dtpoff_base (info) -
3322 htab->root.sgot->contents + cur_off + 4);
3325 outrel.r_addend = 0;
3326 outrel.r_info = ELF32_R_INFO (indx,
3327 R_NIOS2_TLS_DTPREL);
3328 outrel.r_offset += 4;
3330 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3332 htab->root.srelgot->reloc_count++;
3333 loc += sizeof (Elf32_External_Rela);
3338 /* If we are not emitting relocations for a
3339 general dynamic reference, then we must be in a
3340 static link or an executable link with the
3341 symbol binding locally. Mark it as belonging
3342 to module 1, the executable. */
3343 bfd_put_32 (output_bfd, 1,
3344 htab->root.sgot->contents + cur_off);
3345 bfd_put_32 (output_bfd, (relocation -
3346 dtpoff_base (info) -
3348 htab->root.sgot->contents + cur_off + 4);
3354 if (tls_type & GOT_TLS_IE)
3359 outrel.r_addend = (relocation -
3360 dtpoff_base (info));
3362 outrel.r_addend = 0;
3363 outrel.r_offset = (htab->root.sgot->output_section->vma
3364 + htab->root.sgot->output_offset
3366 outrel.r_info = ELF32_R_INFO (indx,
3369 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3371 htab->root.srelgot->reloc_count++;
3372 loc += sizeof (Elf32_External_Rela);
3375 bfd_put_32 (output_bfd, (tpoff (info, relocation)
3377 htab->root.sgot->contents + cur_off);
3384 local_got_offsets[r_symndx] |= 1;
3387 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
3389 relocation = htab->root.sgot->output_offset + off - got_base;
3391 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3392 contents, rel->r_offset,
3393 relocation, rel->r_addend);
3397 case R_NIOS2_TLS_LE16:
3398 if (info->shared && !info->pie)
3400 (*_bfd_error_handler)
3401 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
3402 "permitted in shared object"),
3403 input_bfd, input_section,
3404 (long) rel->r_offset, howto->name);
3408 relocation = tpoff (info, relocation) - TP_OFFSET;
3410 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3411 contents, rel->r_offset,
3412 relocation, rel->r_addend);
3415 case R_NIOS2_BFD_RELOC_32:
3417 && (input_section->flags & SEC_ALLOC) != 0
3419 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3420 || h->root.type != bfd_link_hash_undefweak))
3422 Elf_Internal_Rela outrel;
3424 bfd_boolean skip, relocate;
3426 /* When generating a shared object, these relocations
3427 are copied into the output file to be resolved at run
3434 = _bfd_elf_section_offset (output_bfd, info,
3435 input_section, rel->r_offset);
3436 if (outrel.r_offset == (bfd_vma) -1)
3438 else if (outrel.r_offset == (bfd_vma) -2)
3439 skip = TRUE, relocate = TRUE;
3440 outrel.r_offset += (input_section->output_section->vma
3441 + input_section->output_offset);
3444 memset (&outrel, 0, sizeof outrel);
3449 || !h->def_regular))
3451 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3452 outrel.r_addend = rel->r_addend;
3456 /* This symbol is local, or marked to become local. */
3457 outrel.r_addend = relocation + rel->r_addend;
3459 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3462 sreloc = elf_section_data (input_section)->sreloc;
3466 loc = sreloc->contents;
3467 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3468 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3470 /* This reloc will be computed at runtime, so there's no
3471 need to do anything now, except for R_NIOS2_BFD_RELOC_32
3472 relocations that have been turned into
3473 R_NIOS2_RELATIVE. */
3478 r = _bfd_final_link_relocate (howto, input_bfd,
3479 input_section, contents,
3480 rel->r_offset, relocation,
3484 case R_NIOS2_TLS_DTPREL:
3485 relocation -= dtpoff_base (info);
3489 r = _bfd_final_link_relocate (howto, input_bfd,
3490 input_section, contents,
3491 rel->r_offset, relocation,
3497 r = bfd_reloc_notsupported;
3499 if (r != bfd_reloc_ok)
3502 name = h->root.root.string;
3505 name = bfd_elf_string_from_elf_section (input_bfd,
3506 symtab_hdr->sh_link,
3508 if (name == NULL || *name == '\0')
3509 name = bfd_section_name (input_bfd, sec);
3514 case bfd_reloc_overflow:
3515 r = info->callbacks->reloc_overflow (info, NULL, name,
3516 howto->name, (bfd_vma) 0,
3517 input_bfd, input_section,
3521 case bfd_reloc_undefined:
3522 r = info->callbacks->undefined_symbol (info, name, input_bfd,
3524 rel->r_offset, TRUE);
3527 case bfd_reloc_outofrange:
3529 msg = _("relocation out of range");
3532 case bfd_reloc_notsupported:
3534 msg = _("unsupported relocation");
3537 case bfd_reloc_dangerous:
3539 msg = _("dangerous relocation");
3544 msg = _("unknown error");
3550 r = info->callbacks->warning
3551 (info, msg, name, input_bfd, input_section, rel->r_offset);
3559 /* Implement elf-backend_section_flags:
3560 Convert NIOS2 specific section flags to bfd internal section flags. */
3562 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
3564 if (hdr->sh_flags & SHF_NIOS2_GPREL)
3565 *flags |= SEC_SMALL_DATA;
3570 /* Implement elf_backend_fake_sections:
3571 Set the correct type for an NIOS2 ELF section. We do this by the
3572 section name, which is a hack, but ought to work. */
3574 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3575 Elf_Internal_Shdr *hdr, asection *sec)
3577 register const char *name = bfd_get_section_name (abfd, sec);
3579 if ((sec->flags & SEC_SMALL_DATA)
3580 || strcmp (name, ".sdata") == 0
3581 || strcmp (name, ".sbss") == 0
3582 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
3583 hdr->sh_flags |= SHF_NIOS2_GPREL;
3588 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3589 shortcuts to them in our hash table. */
3591 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3593 struct elf32_nios2_link_hash_table *htab;
3594 struct elf_link_hash_entry *h;
3596 htab = elf32_nios2_hash_table (info);
3598 if (! _bfd_elf_create_got_section (dynobj, info))
3601 /* In order for the two loads in .PLTresolve to share the same %hiadj,
3602 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */
3603 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
3606 /* The Nios II ABI specifies that GOT-relative relocations are relative
3607 to the linker-created symbol _gp_got, rather than using
3608 _GLOBAL_OFFSET_TABLE_ directly. In particular, the latter always
3609 points to the base of the GOT while _gp_got may include a bias. */
3610 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
3612 elf32_nios2_hash_table (info)->h_gp_got = h;
3619 /* Implement elf_backend_create_dynamic_sections:
3620 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
3621 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
3624 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3626 struct elf32_nios2_link_hash_table *htab;
3628 htab = elf32_nios2_hash_table (info);
3629 if (!htab->root.sgot && !create_got_section (dynobj, info))
3632 _bfd_elf_create_dynamic_sections (dynobj, info);
3634 /* In order for the two loads in a shared object .PLTresolve to share the
3635 same %hiadj, the start of the PLT (as well as the GOT) must be aligned
3636 to a 16-byte boundary. This is because the addresses for these loads
3637 include the -(.plt+4) PIC correction. */
3638 if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
3641 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
3646 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
3654 /* Implement elf_backend_copy_indirect_symbol:
3655 Copy the extra info we tack onto an elf_link_hash_entry. */
3657 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
3658 struct elf_link_hash_entry *dir,
3659 struct elf_link_hash_entry *ind)
3661 struct elf32_nios2_link_hash_entry *edir, *eind;
3663 edir = (struct elf32_nios2_link_hash_entry *) dir;
3664 eind = (struct elf32_nios2_link_hash_entry *) ind;
3666 if (eind->dyn_relocs != NULL)
3668 if (edir->dyn_relocs != NULL)
3670 struct elf32_nios2_dyn_relocs **pp;
3671 struct elf32_nios2_dyn_relocs *p;
3673 /* Add reloc counts against the indirect sym to the direct sym
3674 list. Merge any entries against the same section. */
3675 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3677 struct elf32_nios2_dyn_relocs *q;
3679 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3680 if (q->sec == p->sec)
3682 q->pc_count += p->pc_count;
3683 q->count += p->count;
3690 *pp = edir->dyn_relocs;
3693 edir->dyn_relocs = eind->dyn_relocs;
3694 eind->dyn_relocs = NULL;
3697 if (ind->root.type == bfd_link_hash_indirect
3698 && dir->got.refcount <= 0)
3700 edir->tls_type = eind->tls_type;
3701 eind->tls_type = GOT_UNKNOWN;
3704 edir->got_types_used |= eind->got_types_used;
3706 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3709 /* Implement elf_backend_check_relocs:
3710 Look through the relocs for a section during the first phase. */
3712 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
3713 asection *sec, const Elf_Internal_Rela *relocs)
3716 Elf_Internal_Shdr *symtab_hdr;
3717 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
3718 const Elf_Internal_Rela *rel;
3719 const Elf_Internal_Rela *rel_end;
3720 struct elf32_nios2_link_hash_table *htab;
3723 asection *sreloc = NULL;
3724 bfd_signed_vma *local_got_refcounts;
3726 if (info->relocatable)
3729 dynobj = elf_hash_table (info)->dynobj;
3730 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3731 sym_hashes = elf_sym_hashes (abfd);
3732 sym_hashes_end = (sym_hashes
3733 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
3734 if (!elf_bad_symtab (abfd))
3735 sym_hashes_end -= symtab_hdr->sh_info;
3736 local_got_refcounts = elf_local_got_refcounts (abfd);
3738 htab = elf32_nios2_hash_table (info);
3739 sgot = htab->root.sgot;
3740 srelgot = htab->root.srelgot;
3742 rel_end = relocs + sec->reloc_count;
3743 for (rel = relocs; rel < rel_end; rel++)
3745 unsigned int r_type;
3746 struct elf_link_hash_entry *h;
3747 unsigned long r_symndx;
3749 r_symndx = ELF32_R_SYM (rel->r_info);
3750 if (r_symndx < symtab_hdr->sh_info)
3754 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3755 while (h->root.type == bfd_link_hash_indirect
3756 || h->root.type == bfd_link_hash_warning)
3757 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3759 /* PR15323, ref flags aren't set for references in the same
3761 h->root.non_ir_ref = 1;
3764 r_type = ELF32_R_TYPE (rel->r_info);
3769 case R_NIOS2_GOT_LO:
3770 case R_NIOS2_GOT_HA:
3771 case R_NIOS2_CALL16:
3772 case R_NIOS2_CALL_LO:
3773 case R_NIOS2_CALL_HA:
3774 case R_NIOS2_TLS_GD16:
3775 case R_NIOS2_TLS_IE16:
3776 /* This symbol requires a global offset table entry. */
3778 int tls_type, old_tls_type;
3784 case R_NIOS2_GOT_LO:
3785 case R_NIOS2_GOT_HA:
3786 case R_NIOS2_CALL16:
3787 case R_NIOS2_CALL_LO:
3788 case R_NIOS2_CALL_HA:
3789 tls_type = GOT_NORMAL;
3791 case R_NIOS2_TLS_GD16:
3792 tls_type = GOT_TLS_GD;
3794 case R_NIOS2_TLS_IE16:
3795 tls_type = GOT_TLS_IE;
3801 /* Create the .got section. */
3802 elf_hash_table (info)->dynobj = dynobj = abfd;
3803 nios2_elf32_create_dynamic_sections (dynobj, info);
3808 sgot = htab->root.sgot;
3809 BFD_ASSERT (sgot != NULL);
3813 && (h != NULL || info->shared))
3815 srelgot = htab->root.srelgot;
3816 BFD_ASSERT (srelgot != NULL);
3821 struct elf32_nios2_link_hash_entry *eh
3822 = (struct elf32_nios2_link_hash_entry *)h;
3824 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
3825 if (r_type == R_NIOS2_CALL16
3826 || r_type == R_NIOS2_CALL_LO
3827 || r_type == R_NIOS2_CALL_HA)
3829 /* Make sure a plt entry is created for this symbol if
3830 it turns out to be a function defined by a dynamic
3835 eh->got_types_used |= CALL_USED;
3838 eh->got_types_used |= GOT_USED;
3842 /* This is a global offset table entry for a local symbol. */
3843 if (local_got_refcounts == NULL)
3847 size = symtab_hdr->sh_info;
3848 size *= (sizeof (bfd_signed_vma) + sizeof (char));
3850 = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
3851 if (local_got_refcounts == NULL)
3853 elf_local_got_refcounts (abfd) = local_got_refcounts;
3854 elf32_nios2_local_got_tls_type (abfd)
3855 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
3857 local_got_refcounts[r_symndx]++;
3858 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
3861 /* We will already have issued an error message if there is a
3862 TLS / non-TLS mismatch, based on the symbol type. We don't
3863 support any linker relaxations. So just combine any TLS
3865 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
3866 && tls_type != GOT_NORMAL)
3867 tls_type |= old_tls_type;
3869 if (old_tls_type != tls_type)
3872 elf32_nios2_hash_entry (h)->tls_type = tls_type;
3874 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
3878 case R_NIOS2_TLS_LDM16:
3879 if (r_type == R_NIOS2_TLS_LDM16)
3880 htab->tls_ldm_got.refcount++;
3882 if (htab->root.sgot == NULL)
3884 if (htab->root.dynobj == NULL)
3885 htab->root.dynobj = abfd;
3886 if (!create_got_section (htab->root.dynobj, info))
3891 /* This relocation describes the C++ object vtable hierarchy.
3892 Reconstruct it for later use during GC. */
3893 case R_NIOS2_GNU_VTINHERIT:
3894 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3898 /* This relocation describes which C++ vtable entries are actually
3899 used. Record for later use during GC. */
3900 case R_NIOS2_GNU_VTENTRY:
3901 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3905 case R_NIOS2_BFD_RELOC_32:
3906 case R_NIOS2_CALL26:
3907 case R_NIOS2_CALL26_NOAT:
3908 case R_NIOS2_HIADJ16:
3913 /* If this reloc is in a read-only section, we might
3914 need a copy reloc. We can't check reliably at this
3915 stage whether the section is read-only, as input
3916 sections have not yet been mapped to output sections.
3917 Tentatively set the flag for now, and correct in
3918 adjust_dynamic_symbol. */
3922 /* Make sure a plt entry is created for this symbol if it
3923 turns out to be a function defined by a dynamic object. */
3926 if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
3930 /* If we are creating a shared library, we need to copy the
3931 reloc into the shared library. */
3933 && (sec->flags & SEC_ALLOC) != 0
3934 && (r_type == R_NIOS2_BFD_RELOC_32
3935 || (h != NULL && ! h->needs_plt
3936 && (! info->symbolic || ! h->def_regular))))
3938 struct elf32_nios2_dyn_relocs *p;
3939 struct elf32_nios2_dyn_relocs **head;
3941 /* When creating a shared object, we must copy these
3942 reloc types into the output file. We create a reloc
3943 section in dynobj and make room for this reloc. */
3946 sreloc = _bfd_elf_make_dynamic_reloc_section
3947 (sec, dynobj, 2, abfd, TRUE);
3952 /* If this is a global symbol, we count the number of
3953 relocations we need for this symbol. */
3955 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
3958 /* Track dynamic relocs needed for local syms too.
3959 We really need local syms available to do this
3964 Elf_Internal_Sym *isym;
3966 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3971 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3975 vpp = &elf_section_data (s)->local_dynrel;
3976 head = (struct elf32_nios2_dyn_relocs **) vpp;
3980 if (p == NULL || p->sec != sec)
3982 bfd_size_type amt = sizeof *p;
3983 p = ((struct elf32_nios2_dyn_relocs *)
3984 bfd_alloc (htab->root.dynobj, amt));
4005 /* Implement elf_backend_gc_mark_hook:
4006 Return the section that should be marked against GC for a given
4009 nios2_elf32_gc_mark_hook (asection *sec,
4010 struct bfd_link_info *info,
4011 Elf_Internal_Rela *rel,
4012 struct elf_link_hash_entry *h,
4013 Elf_Internal_Sym *sym)
4016 switch (ELF32_R_TYPE (rel->r_info))
4018 case R_NIOS2_GNU_VTINHERIT:
4019 case R_NIOS2_GNU_VTENTRY:
4022 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
4025 /* Implement elf_backend_gc_sweep_hook:
4026 Update the got entry reference counts for the section being removed. */
4028 nios2_elf32_gc_sweep_hook (bfd *abfd,
4029 struct bfd_link_info *info,
4031 const Elf_Internal_Rela *relocs)
4033 Elf_Internal_Shdr *symtab_hdr;
4034 struct elf_link_hash_entry **sym_hashes;
4035 bfd_signed_vma *local_got_refcounts;
4036 const Elf_Internal_Rela *rel, *relend;
4039 if (info->relocatable)
4042 elf_section_data (sec)->local_dynrel = NULL;
4044 dynobj = elf_hash_table (info)->dynobj;
4048 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4049 sym_hashes = elf_sym_hashes (abfd);
4050 local_got_refcounts = elf_local_got_refcounts (abfd);
4052 relend = relocs + sec->reloc_count;
4053 for (rel = relocs; rel < relend; rel++)
4055 unsigned long r_symndx;
4056 struct elf_link_hash_entry *h = NULL;
4059 r_symndx = ELF32_R_SYM (rel->r_info);
4060 if (r_symndx >= symtab_hdr->sh_info)
4062 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4063 while (h->root.type == bfd_link_hash_indirect
4064 || h->root.type == bfd_link_hash_warning)
4065 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4068 r_type = ELF32_R_TYPE (rel->r_info);
4072 case R_NIOS2_GOT_LO:
4073 case R_NIOS2_GOT_HA:
4074 case R_NIOS2_CALL16:
4075 case R_NIOS2_CALL_LO:
4076 case R_NIOS2_CALL_HA:
4079 if (h->got.refcount > 0)
4082 else if (local_got_refcounts != NULL)
4084 if (local_got_refcounts[r_symndx] > 0)
4085 --local_got_refcounts[r_symndx];
4089 case R_NIOS2_PCREL_LO:
4090 case R_NIOS2_PCREL_HA:
4091 case R_NIOS2_BFD_RELOC_32:
4092 case R_NIOS2_CALL26:
4093 case R_NIOS2_CALL26_NOAT:
4096 struct elf32_nios2_link_hash_entry *eh;
4097 struct elf32_nios2_dyn_relocs **pp;
4098 struct elf32_nios2_dyn_relocs *p;
4100 eh = (struct elf32_nios2_link_hash_entry *) h;
4102 if (h->plt.refcount > 0)
4105 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
4106 || r_type == R_NIOS2_BFD_RELOC_32)
4108 for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
4129 /* Implement elf_backend_finish_dynamic_symbols:
4130 Finish up dynamic symbol handling. We set the contents of various
4131 dynamic sections here. */
4133 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
4134 struct bfd_link_info *info,
4135 struct elf_link_hash_entry *h,
4136 Elf_Internal_Sym *sym)
4138 struct elf32_nios2_link_hash_table *htab;
4139 struct elf32_nios2_link_hash_entry *eh
4140 = (struct elf32_nios2_link_hash_entry *)h;
4143 htab = elf32_nios2_hash_table (info);
4145 if (h->plt.offset != (bfd_vma) -1)
4152 Elf_Internal_Rela rela;
4154 bfd_vma got_address;
4156 /* This symbol has an entry in the procedure linkage table. Set
4158 BFD_ASSERT (h->dynindx != -1);
4159 splt = htab->root.splt;
4160 sgotplt = htab->root.sgotplt;
4161 srela = htab->root.srelplt;
4162 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
4164 /* Emit the PLT entry. */
4167 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
4169 plt_index = (h->plt.offset - 24) / 12;
4170 got_offset = (plt_index + 3) * 4;
4171 nios2_elf32_install_imm16 (splt, h->plt.offset,
4172 hiadj(plt_index * 4));
4173 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4174 (plt_index * 4) & 0xffff);
4175 nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
4176 0xfff4 - h->plt.offset);
4177 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4180 /* Fill in the entry in the global offset table. There are no
4181 res_n slots for a shared object PLT, instead the .got.plt entries
4182 point to the PLT entries. */
4183 bfd_put_32 (output_bfd,
4184 splt->output_section->vma + splt->output_offset
4185 + h->plt.offset, sgotplt->contents + got_offset);
4189 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
4190 got_offset = (plt_index + 3) * 4;
4192 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
4193 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4195 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
4196 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4197 got_address & 0xffff);
4199 /* Fill in the entry in the global offset table. */
4200 bfd_put_32 (output_bfd,
4201 splt->output_section->vma + splt->output_offset
4202 + plt_index * 4, sgotplt->contents + got_offset);
4205 /* Fill in the entry in the .rela.plt section. */
4206 rela.r_offset = got_address;
4207 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
4209 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
4210 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4212 if (!h->def_regular)
4214 /* Mark the symbol as undefined, rather than as defined in
4215 the .plt section. Leave the value alone. */
4216 sym->st_shndx = SHN_UNDEF;
4217 /* If the symbol is weak, we do need to clear the value.
4218 Otherwise, the PLT entry would provide a definition for
4219 the symbol even if the symbol wasn't defined anywhere,
4220 and so the symbol would never be NULL. */
4221 if (!h->ref_regular_nonweak)
4226 use_plt = (eh->got_types_used == CALL_USED
4227 && h->plt.offset != (bfd_vma) -1);
4229 if (!use_plt && h->got.offset != (bfd_vma) -1
4230 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
4231 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
4235 Elf_Internal_Rela rela;
4239 /* This symbol has an entry in the global offset table. Set it
4241 sgot = htab->root.sgot;
4242 srela = htab->root.srelgot;
4243 BFD_ASSERT (sgot != NULL && srela != NULL);
4245 offset = (h->got.offset & ~(bfd_vma) 1);
4246 rela.r_offset = (sgot->output_section->vma
4247 + sgot->output_offset + offset);
4249 /* If this is a -Bsymbolic link, and the symbol is defined
4250 locally, we just want to emit a RELATIVE reloc. Likewise if
4251 the symbol was forced to be local because of a version file.
4252 The entry in the global offset table will already have been
4253 initialized in the relocate_section function. */
4255 if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
4257 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4258 rela.r_addend = bfd_get_signed_32 (output_bfd,
4259 (sgot->contents + offset));
4260 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
4264 bfd_put_32 (output_bfd, (bfd_vma) 0,
4265 sgot->contents + offset);
4266 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
4270 loc = srela->contents;
4271 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
4272 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4275 if (use_plt && h->got.offset != (bfd_vma) -1)
4277 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
4278 asection *sgot = htab->root.sgot;
4279 asection *splt = htab->root.splt;
4280 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
4282 sgot->contents + offset);
4288 Elf_Internal_Rela rela;
4291 /* This symbol needs a copy reloc. Set it up. */
4292 BFD_ASSERT (h->dynindx != -1
4293 && (h->root.type == bfd_link_hash_defined
4294 || h->root.type == bfd_link_hash_defweak));
4297 BFD_ASSERT (s != NULL);
4299 rela.r_offset = (h->root.u.def.value
4300 + h->root.u.def.section->output_section->vma
4301 + h->root.u.def.section->output_offset);
4302 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
4304 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4305 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4308 /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute. */
4309 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4310 || h == elf_hash_table (info)->hgot
4311 || h == elf32_nios2_hash_table (info)->h_gp_got)
4312 sym->st_shndx = SHN_ABS;
4317 /* Implement elf_backend_finish_dynamic_sections. */
4319 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
4320 struct bfd_link_info *info)
4325 struct elf32_nios2_link_hash_table *htab;
4327 htab = elf32_nios2_hash_table (info);
4328 dynobj = elf_hash_table (info)->dynobj;
4329 sgotplt = htab->root.sgotplt;
4330 BFD_ASSERT (sgotplt != NULL);
4331 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4333 if (elf_hash_table (info)->dynamic_sections_created)
4336 Elf32_External_Dyn *dyncon, *dynconend;
4338 splt = htab->root.splt;
4339 BFD_ASSERT (splt != NULL && sdyn != NULL);
4341 dyncon = (Elf32_External_Dyn *) sdyn->contents;
4342 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4343 for (; dyncon < dynconend; dyncon++)
4345 Elf_Internal_Dyn dyn;
4348 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4356 s = htab->root.sgot;
4357 BFD_ASSERT (s != NULL);
4358 dyn.d_un.d_ptr = s->output_section->vma;
4359 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4363 s = htab->root.srelplt;
4364 BFD_ASSERT (s != NULL);
4365 dyn.d_un.d_ptr = s->output_section->vma;
4366 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4370 s = htab->root.srelplt;
4371 BFD_ASSERT (s != NULL);
4372 dyn.d_un.d_val = s->size;
4373 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4377 /* The procedure linkage table relocs (DT_JMPREL) should
4378 not be included in the overall relocs (DT_RELA).
4379 Therefore, we override the DT_RELASZ entry here to
4380 make it not include the JMPREL relocs. Since the
4381 linker script arranges for .rela.plt to follow all
4382 other relocation sections, we don't have to worry
4383 about changing the DT_RELA entry. */
4384 s = htab->root.srelplt;
4386 dyn.d_un.d_val -= s->size;
4387 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4391 s = htab->root.sgot;
4392 BFD_ASSERT (s != NULL);
4393 dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0;
4394 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4399 /* Fill in the first entry in the procedure linkage table. */
4402 bfd_vma got_address = (sgotplt->output_section->vma
4403 + sgotplt->output_offset);
4406 bfd_vma corrected = got_address - (splt->output_section->vma
4407 + splt->output_offset + 4);
4408 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
4409 nios2_elf32_install_imm16 (splt, 4, hiadj (corrected));
4410 nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4);
4411 nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8);
4415 /* Divide by 4 here, not 3 because we already corrected for the
4417 bfd_vma res_size = (splt->size - 28) / 4;
4418 bfd_vma res_start = (splt->output_section->vma
4419 + splt->output_offset);
4422 for (res_offset = 0; res_offset < res_size; res_offset += 4)
4423 bfd_put_32 (output_bfd,
4424 6 | ((res_size - (res_offset + 4)) << 6),
4425 splt->contents + res_offset);
4427 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
4428 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
4429 nios2_elf32_install_imm16 (splt, res_size + 4,
4430 res_start & 0xffff);
4431 nios2_elf32_install_imm16 (splt, res_size + 12,
4432 hiadj (got_address));
4433 nios2_elf32_install_imm16 (splt, res_size + 16,
4434 (got_address & 0xffff) + 4);
4435 nios2_elf32_install_imm16 (splt, res_size + 20,
4436 (got_address & 0xffff) + 8);
4440 /* Fill in the first three entries in the global offset table. */
4441 if (sgotplt->size > 0)
4444 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
4446 bfd_put_32 (output_bfd,
4447 sdyn->output_section->vma + sdyn->output_offset,
4449 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
4450 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
4453 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
4458 /* Implement elf_backend_adjust_dynamic_symbol:
4459 Adjust a symbol defined by a dynamic object and referenced by a
4460 regular object. The current definition is in some section of the
4461 dynamic object, but we're not including those sections. We have to
4462 change the definition to something the rest of the link can
4465 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
4466 struct elf_link_hash_entry *h)
4468 struct elf32_nios2_link_hash_table *htab;
4473 htab = elf32_nios2_hash_table (info);
4474 dynobj = elf_hash_table (info)->dynobj;
4476 /* Make sure we know what is going on here. */
4477 BFD_ASSERT (dynobj != NULL
4479 || h->u.weakdef != NULL
4482 && !h->def_regular)));
4484 /* If this is a function, put it in the procedure linkage table. We
4485 will fill in the contents of the procedure linkage table later,
4486 when we know the address of the .got section. */
4487 if (h->type == STT_FUNC || h->needs_plt)
4489 if (h->plt.refcount <= 0
4490 || SYMBOL_CALLS_LOCAL (info, h)
4491 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4492 && h->root.type == bfd_link_hash_undefweak))
4494 /* This case can occur if we saw a PLT reloc in an input
4495 file, but the symbol was never referred to by a dynamic
4496 object, or if all references were garbage collected. In
4497 such a case, we don't actually need to build a procedure
4498 linkage table, and we can just do a PCREL reloc instead. */
4499 h->plt.offset = (bfd_vma) -1;
4506 /* Reinitialize the plt offset now that it is not used as a reference
4508 h->plt.offset = (bfd_vma) -1;
4510 /* If this is a weak symbol, and there is a real definition, the
4511 processor independent code will have arranged for us to see the
4512 real definition first, and we can just use the same value. */
4513 if (h->u.weakdef != NULL)
4515 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4516 || h->u.weakdef->root.type == bfd_link_hash_defweak);
4517 h->root.u.def.section = h->u.weakdef->root.u.def.section;
4518 h->root.u.def.value = h->u.weakdef->root.u.def.value;
4522 /* If there are no non-GOT references, we do not need a copy
4524 if (!h->non_got_ref)
4527 /* This is a reference to a symbol defined by a dynamic object which
4529 If we are creating a shared library, we must presume that the
4530 only references to the symbol are via the global offset table.
4531 For such cases we need not do anything here; the relocations will
4532 be handled correctly by relocate_section. */
4538 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4539 h->root.root.string);
4543 /* We must allocate the symbol in our .dynbss section, which will
4544 become part of the .bss section of the executable. There will be
4545 an entry for this symbol in the .dynsym section. The dynamic
4546 object will contain position independent code, so all references
4547 from the dynamic object to this symbol will go through the global
4548 offset table. The dynamic linker will use the .dynsym entry to
4549 determine the address it must put in the global offset table, so
4550 both the dynamic object and the regular object will refer to the
4551 same memory location for the variable. */
4553 BFD_ASSERT (s != NULL);
4555 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
4556 copy the initial value out of the dynamic object and into the
4557 runtime process image. We need to remember the offset into the
4558 .rela.bss section we are going to use. */
4559 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4563 srel = htab->srelbss;
4564 BFD_ASSERT (srel != NULL);
4565 srel->size += sizeof (Elf32_External_Rela);
4569 align2 = bfd_log2 (h->size);
4570 if (align2 > h->root.u.def.section->alignment_power)
4571 align2 = h->root.u.def.section->alignment_power;
4574 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
4575 if (align2 > bfd_get_section_alignment (dynobj, s)
4576 && !bfd_set_section_alignment (dynobj, s, align2))
4579 /* Define the symbol as being at this point in the section. */
4580 h->root.u.def.section = s;
4581 h->root.u.def.value = s->size;
4583 /* Increment the section size to make room for the symbol. */
4589 /* Worker function for nios2_elf32_size_dynamic_sections. */
4591 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4593 struct bfd_link_info *info;
4594 struct elf32_nios2_link_hash_table *htab;
4596 if (h->root.type == bfd_link_hash_indirect)
4599 if (h->root.type == bfd_link_hash_warning)
4600 /* When warning symbols are created, they **replace** the "real"
4601 entry in the hash table, thus we never get to see the real
4602 symbol in a hash traversal. So look at it now. */
4603 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4605 info = (struct bfd_link_info *) inf;
4606 htab = elf32_nios2_hash_table (info);
4608 if (h->plt.offset != (bfd_vma)-1)
4609 h->plt.offset += htab->res_n_size;
4610 if (htab->root.splt == h->root.u.def.section)
4611 h->root.u.def.value += htab->res_n_size;
4616 /* Another worker function for nios2_elf32_size_dynamic_sections.
4617 Allocate space in .plt, .got and associated reloc sections for
4620 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4622 struct bfd_link_info *info;
4623 struct elf32_nios2_link_hash_table *htab;
4624 struct elf32_nios2_link_hash_entry *eh;
4625 struct elf32_nios2_dyn_relocs *p;
4628 if (h->root.type == bfd_link_hash_indirect)
4631 if (h->root.type == bfd_link_hash_warning)
4632 /* When warning symbols are created, they **replace** the "real"
4633 entry in the hash table, thus we never get to see the real
4634 symbol in a hash traversal. So look at it now. */
4635 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4637 info = (struct bfd_link_info *) inf;
4638 htab = elf32_nios2_hash_table (info);
4640 if (htab->root.dynamic_sections_created
4641 && h->plt.refcount > 0)
4643 /* Make sure this symbol is output as a dynamic symbol.
4644 Undefined weak syms won't yet be marked as dynamic. */
4645 if (h->dynindx == -1
4647 && !bfd_elf_link_record_dynamic_symbol (info, h))
4650 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
4652 asection *s = htab->root.splt;
4654 /* Allocate room for the header. */
4663 h->plt.offset = s->size;
4665 /* If this symbol is not defined in a regular file, and we are
4666 not generating a shared library, then set the symbol to this
4667 location in the .plt. This is required to make function
4668 pointers compare as equal between the normal executable and
4669 the shared library. */
4673 h->root.u.def.section = s;
4674 h->root.u.def.value = h->plt.offset;
4677 /* Make room for this entry. */
4680 /* We also need to make an entry in the .rela.plt section. */
4681 htab->root.srelplt->size += sizeof (Elf32_External_Rela);
4683 /* And the .got.plt section. */
4684 htab->root.sgotplt->size += 4;
4688 h->plt.offset = (bfd_vma) -1;
4694 h->plt.offset = (bfd_vma) -1;
4698 eh = (struct elf32_nios2_link_hash_entry *) h;
4699 use_plt = (eh->got_types_used == CALL_USED
4700 && h->plt.offset != (bfd_vma) -1);
4702 if (h->got.refcount > 0)
4706 int tls_type = eh->tls_type;
4709 /* Make sure this symbol is output as a dynamic symbol.
4710 Undefined weak syms won't yet be marked as dynamic. */
4711 if (h->dynindx == -1
4713 && !bfd_elf_link_record_dynamic_symbol (info, h))
4716 s = htab->root.sgot;
4717 h->got.offset = s->size;
4719 if (tls_type == GOT_UNKNOWN)
4722 if (tls_type == GOT_NORMAL)
4723 /* Non-TLS symbols need one GOT slot. */
4727 if (tls_type & GOT_TLS_GD)
4728 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */
4730 if (tls_type & GOT_TLS_IE)
4731 /* R_NIOS2_TLS_IE16 needs one GOT slot. */
4735 dyn = htab->root.dynamic_sections_created;
4738 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4740 || !SYMBOL_REFERENCES_LOCAL (info, h)))
4743 if (tls_type != GOT_NORMAL
4744 && (info->shared || indx != 0)
4745 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4746 || h->root.type != bfd_link_hash_undefweak))
4748 if (tls_type & GOT_TLS_IE)
4749 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4751 if (tls_type & GOT_TLS_GD)
4752 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4754 if ((tls_type & GOT_TLS_GD) && indx != 0)
4755 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4757 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4758 || h->root.type != bfd_link_hash_undefweak)
4761 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
4762 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4765 h->got.offset = (bfd_vma) -1;
4767 if (eh->dyn_relocs == NULL)
4770 /* In the shared -Bsymbolic case, discard space allocated for
4771 dynamic pc-relative relocs against symbols which turn out to be
4772 defined in regular objects. For the normal shared case, discard
4773 space for pc-relative relocs that have become local due to symbol
4774 visibility changes. */
4779 && (h->forced_local || info->symbolic))
4781 struct elf32_nios2_dyn_relocs **pp;
4783 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4785 p->count -= p->pc_count;
4794 /* Also discard relocs on undefined weak syms with non-default
4796 if (eh->dyn_relocs != NULL
4797 && h->root.type == bfd_link_hash_undefweak)
4799 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4800 eh->dyn_relocs = NULL;
4802 /* Make sure undefined weak symbols are output as a dynamic
4804 else if (h->dynindx == -1
4806 && !bfd_elf_link_record_dynamic_symbol (info, h))
4812 /* For the non-shared case, discard space for relocs against
4813 symbols which turn out to need copy relocs or are not
4817 && ((h->def_dynamic && !h->def_regular)
4818 || (htab->root.dynamic_sections_created
4819 && (h->root.type == bfd_link_hash_undefweak
4820 || h->root.type == bfd_link_hash_undefined))))
4822 /* Make sure this symbol is output as a dynamic symbol.
4823 Undefined weak syms won't yet be marked as dynamic. */
4824 if (h->dynindx == -1
4826 && !bfd_elf_link_record_dynamic_symbol (info, h))
4829 /* If that succeeded, we know we'll be keeping all the
4831 if (h->dynindx != -1)
4835 eh->dyn_relocs = NULL;
4840 /* Finally, allocate space. */
4841 for (p = eh->dyn_relocs; p != NULL; p = p->next)
4843 asection *sreloc = elf_section_data (p->sec)->sreloc;
4844 sreloc->size += p->count * sizeof (Elf32_External_Rela);
4850 /* Implement elf_backend_size_dynamic_sections:
4851 Set the sizes of the dynamic sections. */
4853 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4854 struct bfd_link_info *info)
4862 struct elf32_nios2_link_hash_table *htab;
4864 htab = elf32_nios2_hash_table (info);
4865 dynobj = elf_hash_table (info)->dynobj;
4866 BFD_ASSERT (dynobj != NULL);
4868 htab->res_n_size = 0;
4869 if (elf_hash_table (info)->dynamic_sections_created)
4871 /* Set the contents of the .interp section to the interpreter. */
4872 if (info->executable)
4874 s = bfd_get_linker_section (dynobj, ".interp");
4875 BFD_ASSERT (s != NULL);
4876 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4877 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4882 /* We may have created entries in the .rela.got section.
4883 However, if we are not creating the dynamic sections, we will
4884 not actually use these entries. Reset the size of .rela.got,
4885 which will cause it to get stripped from the output file
4887 s = htab->root.srelgot;
4892 /* Set up .got offsets for local syms, and space for local dynamic
4894 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4896 bfd_signed_vma *local_got;
4897 bfd_signed_vma *end_local_got;
4898 char *local_tls_type;
4899 bfd_size_type locsymcount;
4900 Elf_Internal_Shdr *symtab_hdr;
4903 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4906 for (s = ibfd->sections; s != NULL; s = s->next)
4908 struct elf32_nios2_dyn_relocs *p;
4910 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
4912 if (!bfd_is_abs_section (p->sec)
4913 && bfd_is_abs_section (p->sec->output_section))
4915 /* Input section has been discarded, either because
4916 it is a copy of a linkonce section or due to
4917 linker script /DISCARD/, so we'll be discarding
4920 else if (p->count != 0)
4922 srel = elf_section_data (p->sec)->sreloc;
4923 srel->size += p->count * sizeof (Elf32_External_Rela);
4924 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4925 info->flags |= DF_TEXTREL;
4930 local_got = elf_local_got_refcounts (ibfd);
4934 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4935 locsymcount = symtab_hdr->sh_info;
4936 end_local_got = local_got + locsymcount;
4937 local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
4938 s = htab->root.sgot;
4939 srel = htab->root.srelgot;
4940 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
4944 *local_got = s->size;
4945 if (*local_tls_type & GOT_TLS_GD)
4946 /* TLS_GD relocs need an 8-byte structure in the GOT. */
4948 if (*local_tls_type & GOT_TLS_IE)
4950 if (*local_tls_type == GOT_NORMAL)
4953 if (info->shared || *local_tls_type == GOT_TLS_GD)
4954 srel->size += sizeof (Elf32_External_Rela);
4957 *local_got = (bfd_vma) -1;
4961 if (htab->tls_ldm_got.refcount > 0)
4963 /* Allocate two GOT entries and one dynamic relocation (if necessary)
4964 for R_NIOS2_TLS_LDM16 relocations. */
4965 htab->tls_ldm_got.offset = htab->root.sgot->size;
4966 htab->root.sgot->size += 8;
4968 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4971 htab->tls_ldm_got.offset = -1;
4973 /* Allocate global sym .plt and .got entries, and space for global
4974 sym dynamic relocs. */
4975 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
4977 if (elf_hash_table (info)->dynamic_sections_created)
4979 /* If the .got section is more than 0x8000 bytes, we add
4980 0x8000 to the value of _gp_got, so that 16-bit relocations
4981 have a greater chance of working. */
4982 if (htab->root.sgot->size >= 0x8000
4983 && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
4984 elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
4987 /* The check_relocs and adjust_dynamic_symbol entry points have
4988 determined the sizes of the various dynamic sections. Allocate
4993 for (s = dynobj->sections; s != NULL; s = s->next)
4997 if ((s->flags & SEC_LINKER_CREATED) == 0)
5000 /* It's OK to base decisions on the section name, because none
5001 of the dynobj section names depend upon the input files. */
5002 name = bfd_get_section_name (dynobj, s);
5004 if (strcmp (name, ".plt") == 0)
5006 /* Remember whether there is a PLT. */
5009 /* Correct for the number of res_N branches. */
5010 if (plt && !info->shared)
5012 htab->res_n_size = (s->size-28) / 3;
5013 s->size += htab->res_n_size;
5016 else if (CONST_STRNEQ (name, ".rela"))
5022 /* We use the reloc_count field as a counter if we need
5023 to copy relocs into the output file. */
5027 else if (CONST_STRNEQ (name, ".got"))
5029 else if (strcmp (name, ".dynbss") != 0)
5030 /* It's not one of our sections, so don't allocate space. */
5035 /* If we don't need this section, strip it from the
5036 output file. This is mostly to handle .rela.bss and
5037 .rela.plt. We must create both sections in
5038 create_dynamic_sections, because they must be created
5039 before the linker maps input sections to output
5040 sections. The linker does that before
5041 adjust_dynamic_symbol is called, and it is that
5042 function which decides whether anything needs to go
5043 into these sections. */
5044 s->flags |= SEC_EXCLUDE;
5048 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5051 /* Allocate memory for the section contents. */
5052 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
5053 Unused entries should be reclaimed before the section's contents
5054 are written out, but at the moment this does not happen. Thus in
5055 order to prevent writing out garbage, we initialize the section's
5056 contents to zero. */
5057 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5058 if (s->contents == NULL)
5062 /* Adjust dynamic symbols that point to the plt to account for the
5063 now-known number of resN slots. */
5064 if (htab->res_n_size)
5065 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
5067 if (elf_hash_table (info)->dynamic_sections_created)
5069 /* Add some entries to the .dynamic section. We fill in the
5070 values later, in elf_nios2_finish_dynamic_sections, but we
5071 must add the entries now so that we get the correct size for
5072 the .dynamic section. The DT_DEBUG entry is filled in by the
5073 dynamic linker and used by the debugger. */
5074 #define add_dynamic_entry(TAG, VAL) \
5075 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5077 if (!info->shared && !add_dynamic_entry (DT_DEBUG, 0))
5080 if (got && !add_dynamic_entry (DT_PLTGOT, 0))
5084 && (!add_dynamic_entry (DT_PLTRELSZ, 0)
5085 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5086 || !add_dynamic_entry (DT_JMPREL, 0)))
5090 && (!add_dynamic_entry (DT_RELA, 0)
5091 || !add_dynamic_entry (DT_RELASZ, 0)
5092 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
5095 if (!info->shared && !add_dynamic_entry (DT_NIOS2_GP, 0))
5098 if ((info->flags & DF_TEXTREL) != 0
5099 && !add_dynamic_entry (DT_TEXTREL, 0))
5102 #undef add_dynamic_entry
5107 /* Implement bfd_elf32_bfd_link_hash_table_create. */
5108 static struct bfd_link_hash_table *
5109 nios2_elf32_link_hash_table_create (bfd *abfd)
5111 struct elf32_nios2_link_hash_table *ret;
5112 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
5114 ret = bfd_zmalloc (amt);
5118 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
5121 elf32_nios2_link_hash_entry),
5128 /* Init the stub hash table too. */
5129 if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
5130 sizeof (struct elf32_nios2_stub_hash_entry)))
5133 return &ret->root.root;
5136 /* Free the derived linker hash table. */
5138 nios2_elf32_link_hash_table_free (struct bfd_link_hash_table *btab)
5140 struct elf32_nios2_link_hash_table *htab
5141 = (struct elf32_nios2_link_hash_table *) btab;
5143 bfd_hash_table_free (&htab->bstab);
5144 _bfd_elf_link_hash_table_free (btab);
5147 /* Implement elf_backend_reloc_type_class. */
5148 static enum elf_reloc_type_class
5149 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5150 const asection *rel_sec ATTRIBUTE_UNUSED,
5151 const Elf_Internal_Rela *rela)
5153 switch ((int) ELF32_R_TYPE (rela->r_info))
5155 case R_NIOS2_RELATIVE:
5156 return reloc_class_relative;
5157 case R_NIOS2_JUMP_SLOT:
5158 return reloc_class_plt;
5160 return reloc_class_copy;
5162 return reloc_class_normal;
5166 /* Return 1 if target is one of ours. */
5168 is_nios2_elf_target (const struct bfd_target *targ)
5170 return (targ == &nios2_elf32_le_vec
5171 || targ == &nios2_elf32_be_vec);
5174 /* Implement elf_backend_add_symbol_hook.
5175 This hook is called by the linker when adding symbols from an object
5176 file. We use it to put .comm items in .sbss, and not .bss. */
5178 nios2_elf_add_symbol_hook (bfd *abfd,
5179 struct bfd_link_info *info,
5180 Elf_Internal_Sym *sym,
5181 const char **namep ATTRIBUTE_UNUSED,
5182 flagword *flagsp ATTRIBUTE_UNUSED,
5188 if (sym->st_shndx == SHN_COMMON
5189 && !info->relocatable
5190 && sym->st_size <= elf_gp_size (abfd)
5191 && is_nios2_elf_target (info->output_bfd->xvec))
5193 /* Common symbols less than or equal to -G nn bytes are automatically
5195 struct elf32_nios2_link_hash_table *htab;
5197 htab = elf32_nios2_hash_table (info);
5198 if (htab->sbss == NULL)
5200 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
5202 dynobj = elf_hash_table (info)->dynobj;
5206 htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
5208 if (htab->sbss == NULL)
5213 *valp = sym->st_size;
5219 /* Implement elf_backend_can_make_relative_eh_frame:
5220 Decide whether to attempt to turn absptr or lsda encodings in
5221 shared libraries into pcrel within the given input section. */
5223 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
5224 struct bfd_link_info *info
5226 asection *eh_frame_section
5229 /* We can't use PC-relative encodings in the .eh_frame section. */
5233 /* Implement elf_backend_special_sections. */
5234 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
5236 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS,
5237 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5238 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
5239 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5240 { NULL, 0, 0, 0, 0 }
5243 #define ELF_ARCH bfd_arch_nios2
5244 #define ELF_TARGET_ID NIOS2_ELF_DATA
5245 #define ELF_MACHINE_CODE EM_ALTERA_NIOS2
5247 /* The Nios II MMU uses a 4K page size. */
5249 #define ELF_MAXPAGESIZE 0x1000
5251 #define bfd_elf32_bfd_link_hash_table_create \
5252 nios2_elf32_link_hash_table_create
5253 #define bfd_elf32_bfd_link_hash_table_free \
5254 nios2_elf32_link_hash_table_free
5256 /* Relocation table lookup macros. */
5258 #define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup
5259 #define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup
5261 /* JUMP_TABLE_LINK macros. */
5263 /* elf_info_to_howto (using RELA relocations). */
5265 #define elf_info_to_howto nios2_elf32_info_to_howto
5267 /* elf backend functions. */
5269 #define elf_backend_can_gc_sections 1
5270 #define elf_backend_can_refcount 1
5271 #define elf_backend_plt_readonly 1
5272 #define elf_backend_want_got_plt 1
5273 #define elf_backend_rela_normal 1
5275 #define elf_backend_relocate_section nios2_elf32_relocate_section
5276 #define elf_backend_section_flags nios2_elf32_section_flags
5277 #define elf_backend_fake_sections nios2_elf32_fake_sections
5278 #define elf_backend_check_relocs nios2_elf32_check_relocs
5280 #define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook
5281 #define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook
5282 #define elf_backend_create_dynamic_sections \
5283 nios2_elf32_create_dynamic_sections
5284 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
5285 #define elf_backend_finish_dynamic_sections \
5286 nios2_elf32_finish_dynamic_sections
5287 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
5288 #define elf_backend_reloc_type_class nios2_elf32_reloc_type_class
5289 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
5290 #define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook
5291 #define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol
5293 #define elf_backend_grok_prstatus nios2_grok_prstatus
5294 #define elf_backend_grok_psinfo nios2_grok_psinfo
5296 #undef elf_backend_can_make_relative_eh_frame
5297 #define elf_backend_can_make_relative_eh_frame \
5298 nios2_elf32_can_make_relative_eh_frame
5300 #define elf_backend_special_sections elf32_nios2_special_sections
5302 #define TARGET_LITTLE_SYM nios2_elf32_le_vec
5303 #define TARGET_LITTLE_NAME "elf32-littlenios2"
5304 #define TARGET_BIG_SYM nios2_elf32_be_vec
5305 #define TARGET_BIG_NAME "elf32-bignios2"
5307 #define elf_backend_got_header_size 12
5309 #include "elf32-target.h"