elf32-m68k.c revision 1.1 1 1.1 skrll /* Motorola 68k series support for 32-bit ELF
2 1.1 skrll Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 1.1 skrll 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
4 1.1 skrll
5 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
6 1.1 skrll
7 1.1 skrll This program is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1 skrll the Free Software Foundation; either version 3 of the License, or
10 1.1 skrll (at your option) any later version.
11 1.1 skrll
12 1.1 skrll This program is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public License
18 1.1 skrll along with this program; if not, write to the Free Software
19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 1.1 skrll MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll #include "sysdep.h"
23 1.1 skrll #include "bfd.h"
24 1.1 skrll #include "bfdlink.h"
25 1.1 skrll #include "libbfd.h"
26 1.1 skrll #include "elf-bfd.h"
27 1.1 skrll #include "elf/m68k.h"
28 1.1 skrll #include "opcode/m68k.h"
29 1.1 skrll
30 1.1 skrll static reloc_howto_type *reloc_type_lookup
31 1.1 skrll PARAMS ((bfd *, bfd_reloc_code_real_type));
32 1.1 skrll static void rtype_to_howto
33 1.1 skrll PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
34 1.1 skrll static struct bfd_hash_entry *elf_m68k_link_hash_newfunc
35 1.1 skrll PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
36 1.1 skrll static struct bfd_link_hash_table *elf_m68k_link_hash_table_create
37 1.1 skrll PARAMS ((bfd *));
38 1.1 skrll static bfd_boolean elf_m68k_check_relocs
39 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *, asection *,
40 1.1 skrll const Elf_Internal_Rela *));
41 1.1 skrll static bfd_boolean elf_m68k_adjust_dynamic_symbol
42 1.1 skrll PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
43 1.1 skrll static bfd_boolean elf_m68k_size_dynamic_sections
44 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *));
45 1.1 skrll static bfd_boolean elf_m68k_discard_copies
46 1.1 skrll PARAMS ((struct elf_link_hash_entry *, PTR));
47 1.1 skrll static bfd_boolean elf_m68k_relocate_section
48 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
49 1.1 skrll Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
50 1.1 skrll static bfd_boolean elf_m68k_finish_dynamic_symbol
51 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
52 1.1 skrll Elf_Internal_Sym *));
53 1.1 skrll static bfd_boolean elf_m68k_finish_dynamic_sections
54 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *));
55 1.1 skrll
56 1.1 skrll static bfd_boolean elf32_m68k_set_private_flags
57 1.1 skrll PARAMS ((bfd *, flagword));
58 1.1 skrll static bfd_boolean elf32_m68k_merge_private_bfd_data
59 1.1 skrll PARAMS ((bfd *, bfd *));
60 1.1 skrll static bfd_boolean elf32_m68k_print_private_bfd_data
61 1.1 skrll PARAMS ((bfd *, PTR));
62 1.1 skrll static enum elf_reloc_type_class elf32_m68k_reloc_type_class
63 1.1 skrll PARAMS ((const Elf_Internal_Rela *));
64 1.1 skrll
65 1.1 skrll static reloc_howto_type howto_table[] = {
66 1.1 skrll HOWTO(R_68K_NONE, 0, 0, 0, FALSE,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_NONE", FALSE, 0, 0x00000000,FALSE),
67 1.1 skrll HOWTO(R_68K_32, 0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_32", FALSE, 0, 0xffffffff,FALSE),
68 1.1 skrll HOWTO(R_68K_16, 0, 1,16, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_16", FALSE, 0, 0x0000ffff,FALSE),
69 1.1 skrll HOWTO(R_68K_8, 0, 0, 8, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_8", FALSE, 0, 0x000000ff,FALSE),
70 1.1 skrll HOWTO(R_68K_PC32, 0, 2,32, TRUE, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PC32", FALSE, 0, 0xffffffff,TRUE),
71 1.1 skrll HOWTO(R_68K_PC16, 0, 1,16, TRUE, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PC16", FALSE, 0, 0x0000ffff,TRUE),
72 1.1 skrll HOWTO(R_68K_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PC8", FALSE, 0, 0x000000ff,TRUE),
73 1.1 skrll HOWTO(R_68K_GOT32, 0, 2,32, TRUE, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32", FALSE, 0, 0xffffffff,TRUE),
74 1.1 skrll HOWTO(R_68K_GOT16, 0, 1,16, TRUE, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT16", FALSE, 0, 0x0000ffff,TRUE),
75 1.1 skrll HOWTO(R_68K_GOT8, 0, 0, 8, TRUE, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT8", FALSE, 0, 0x000000ff,TRUE),
76 1.1 skrll HOWTO(R_68K_GOT32O, 0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32O", FALSE, 0, 0xffffffff,FALSE),
77 1.1 skrll HOWTO(R_68K_GOT16O, 0, 1,16, FALSE,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT16O", FALSE, 0, 0x0000ffff,FALSE),
78 1.1 skrll HOWTO(R_68K_GOT8O, 0, 0, 8, FALSE,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT8O", FALSE, 0, 0x000000ff,FALSE),
79 1.1 skrll HOWTO(R_68K_PLT32, 0, 2,32, TRUE, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32", FALSE, 0, 0xffffffff,TRUE),
80 1.1 skrll HOWTO(R_68K_PLT16, 0, 1,16, TRUE, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT16", FALSE, 0, 0x0000ffff,TRUE),
81 1.1 skrll HOWTO(R_68K_PLT8, 0, 0, 8, TRUE, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT8", FALSE, 0, 0x000000ff,TRUE),
82 1.1 skrll HOWTO(R_68K_PLT32O, 0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32O", FALSE, 0, 0xffffffff,FALSE),
83 1.1 skrll HOWTO(R_68K_PLT16O, 0, 1,16, FALSE,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT16O", FALSE, 0, 0x0000ffff,FALSE),
84 1.1 skrll HOWTO(R_68K_PLT8O, 0, 0, 8, FALSE,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT8O", FALSE, 0, 0x000000ff,FALSE),
85 1.1 skrll HOWTO(R_68K_COPY, 0, 0, 0, FALSE,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_COPY", FALSE, 0, 0xffffffff,FALSE),
86 1.1 skrll HOWTO(R_68K_GLOB_DAT, 0, 2,32, FALSE,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_GLOB_DAT", FALSE, 0, 0xffffffff,FALSE),
87 1.1 skrll HOWTO(R_68K_JMP_SLOT, 0, 2,32, FALSE,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_JMP_SLOT", FALSE, 0, 0xffffffff,FALSE),
88 1.1 skrll HOWTO(R_68K_RELATIVE, 0, 2,32, FALSE,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_RELATIVE", FALSE, 0, 0xffffffff,FALSE),
89 1.1 skrll /* GNU extension to record C++ vtable hierarchy. */
90 1.1 skrll HOWTO (R_68K_GNU_VTINHERIT, /* type */
91 1.1 skrll 0, /* rightshift */
92 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
93 1.1 skrll 0, /* bitsize */
94 1.1 skrll FALSE, /* pc_relative */
95 1.1 skrll 0, /* bitpos */
96 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
97 1.1 skrll NULL, /* special_function */
98 1.1 skrll "R_68K_GNU_VTINHERIT", /* name */
99 1.1 skrll FALSE, /* partial_inplace */
100 1.1 skrll 0, /* src_mask */
101 1.1 skrll 0, /* dst_mask */
102 1.1 skrll FALSE),
103 1.1 skrll /* GNU extension to record C++ vtable member usage. */
104 1.1 skrll HOWTO (R_68K_GNU_VTENTRY, /* type */
105 1.1 skrll 0, /* rightshift */
106 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
107 1.1 skrll 0, /* bitsize */
108 1.1 skrll FALSE, /* pc_relative */
109 1.1 skrll 0, /* bitpos */
110 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
111 1.1 skrll _bfd_elf_rel_vtable_reloc_fn, /* special_function */
112 1.1 skrll "R_68K_GNU_VTENTRY", /* name */
113 1.1 skrll FALSE, /* partial_inplace */
114 1.1 skrll 0, /* src_mask */
115 1.1 skrll 0, /* dst_mask */
116 1.1 skrll FALSE),
117 1.1 skrll };
118 1.1 skrll
119 1.1 skrll static void
120 1.1 skrll rtype_to_howto (abfd, cache_ptr, dst)
121 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
122 1.1 skrll arelent *cache_ptr;
123 1.1 skrll Elf_Internal_Rela *dst;
124 1.1 skrll {
125 1.1 skrll BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_68K_max);
126 1.1 skrll cache_ptr->howto = &howto_table[ELF32_R_TYPE(dst->r_info)];
127 1.1 skrll }
128 1.1 skrll
129 1.1 skrll #define elf_info_to_howto rtype_to_howto
130 1.1 skrll
131 1.1 skrll static const struct
132 1.1 skrll {
133 1.1 skrll bfd_reloc_code_real_type bfd_val;
134 1.1 skrll int elf_val;
135 1.1 skrll } reloc_map[] = {
136 1.1 skrll { BFD_RELOC_NONE, R_68K_NONE },
137 1.1 skrll { BFD_RELOC_32, R_68K_32 },
138 1.1 skrll { BFD_RELOC_16, R_68K_16 },
139 1.1 skrll { BFD_RELOC_8, R_68K_8 },
140 1.1 skrll { BFD_RELOC_32_PCREL, R_68K_PC32 },
141 1.1 skrll { BFD_RELOC_16_PCREL, R_68K_PC16 },
142 1.1 skrll { BFD_RELOC_8_PCREL, R_68K_PC8 },
143 1.1 skrll { BFD_RELOC_32_GOT_PCREL, R_68K_GOT32 },
144 1.1 skrll { BFD_RELOC_16_GOT_PCREL, R_68K_GOT16 },
145 1.1 skrll { BFD_RELOC_8_GOT_PCREL, R_68K_GOT8 },
146 1.1 skrll { BFD_RELOC_32_GOTOFF, R_68K_GOT32O },
147 1.1 skrll { BFD_RELOC_16_GOTOFF, R_68K_GOT16O },
148 1.1 skrll { BFD_RELOC_8_GOTOFF, R_68K_GOT8O },
149 1.1 skrll { BFD_RELOC_32_PLT_PCREL, R_68K_PLT32 },
150 1.1 skrll { BFD_RELOC_16_PLT_PCREL, R_68K_PLT16 },
151 1.1 skrll { BFD_RELOC_8_PLT_PCREL, R_68K_PLT8 },
152 1.1 skrll { BFD_RELOC_32_PLTOFF, R_68K_PLT32O },
153 1.1 skrll { BFD_RELOC_16_PLTOFF, R_68K_PLT16O },
154 1.1 skrll { BFD_RELOC_8_PLTOFF, R_68K_PLT8O },
155 1.1 skrll { BFD_RELOC_NONE, R_68K_COPY },
156 1.1 skrll { BFD_RELOC_68K_GLOB_DAT, R_68K_GLOB_DAT },
157 1.1 skrll { BFD_RELOC_68K_JMP_SLOT, R_68K_JMP_SLOT },
158 1.1 skrll { BFD_RELOC_68K_RELATIVE, R_68K_RELATIVE },
159 1.1 skrll { BFD_RELOC_CTOR, R_68K_32 },
160 1.1 skrll { BFD_RELOC_VTABLE_INHERIT, R_68K_GNU_VTINHERIT },
161 1.1 skrll { BFD_RELOC_VTABLE_ENTRY, R_68K_GNU_VTENTRY },
162 1.1 skrll };
163 1.1 skrll
164 1.1 skrll static reloc_howto_type *
165 1.1 skrll reloc_type_lookup (abfd, code)
166 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
167 1.1 skrll bfd_reloc_code_real_type code;
168 1.1 skrll {
169 1.1 skrll unsigned int i;
170 1.1 skrll for (i = 0; i < sizeof (reloc_map) / sizeof (reloc_map[0]); i++)
171 1.1 skrll {
172 1.1 skrll if (reloc_map[i].bfd_val == code)
173 1.1 skrll return &howto_table[reloc_map[i].elf_val];
174 1.1 skrll }
175 1.1 skrll return 0;
176 1.1 skrll }
177 1.1 skrll
178 1.1 skrll static reloc_howto_type *
179 1.1 skrll reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
180 1.1 skrll {
181 1.1 skrll unsigned int i;
182 1.1 skrll
183 1.1 skrll for (i = 0; i < sizeof (howto_table) / sizeof (howto_table[0]); i++)
184 1.1 skrll if (howto_table[i].name != NULL
185 1.1 skrll && strcasecmp (howto_table[i].name, r_name) == 0)
186 1.1 skrll return &howto_table[i];
187 1.1 skrll
188 1.1 skrll return NULL;
189 1.1 skrll }
190 1.1 skrll
191 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup reloc_type_lookup
192 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup reloc_name_lookup
193 1.1 skrll #define ELF_ARCH bfd_arch_m68k
194 1.1 skrll
195 1.1 skrll /* Functions for the m68k ELF linker. */
197 1.1 skrll
198 1.1 skrll /* The name of the dynamic interpreter. This is put in the .interp
199 1.1 skrll section. */
200 1.1 skrll
201 1.1 skrll #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
202 1.1 skrll
203 1.1 skrll /* Describes one of the various PLT styles. */
204 1.1 skrll
205 1.1 skrll struct elf_m68k_plt_info
206 1.1 skrll {
207 1.1 skrll /* The size of each PLT entry. */
208 1.1 skrll bfd_vma size;
209 1.1 skrll
210 1.1 skrll /* The template for the first PLT entry. */
211 1.1 skrll const bfd_byte *plt0_entry;
212 1.1 skrll
213 1.1 skrll /* Offsets of fields in PLT0_ENTRY that require R_68K_PC32 relocations.
214 1.1 skrll The comments by each member indicate the value that the relocation
215 1.1 skrll is against. */
216 1.1 skrll struct {
217 1.1 skrll unsigned int got4; /* .got + 4 */
218 1.1 skrll unsigned int got8; /* .got + 8 */
219 1.1 skrll } plt0_relocs;
220 1.1 skrll
221 1.1 skrll /* The template for a symbol's PLT entry. */
222 1.1 skrll const bfd_byte *symbol_entry;
223 1.1 skrll
224 1.1 skrll /* Offsets of fields in SYMBOL_ENTRY that require R_68K_PC32 relocations.
225 1.1 skrll The comments by each member indicate the value that the relocation
226 1.1 skrll is against. */
227 1.1 skrll struct {
228 1.1 skrll unsigned int got; /* the symbol's .got.plt entry */
229 1.1 skrll unsigned int plt; /* .plt */
230 1.1 skrll } symbol_relocs;
231 1.1 skrll
232 1.1 skrll /* The offset of the resolver stub from the start of SYMBOL_ENTRY.
233 1.1 skrll The stub starts with "move.l #relocoffset,%d0". */
234 1.1 skrll bfd_vma symbol_resolve_entry;
235 1.1 skrll };
236 1.1 skrll
237 1.1 skrll /* The size in bytes of an entry in the procedure linkage table. */
238 1.1 skrll
239 1.1 skrll #define PLT_ENTRY_SIZE 20
240 1.1 skrll
241 1.1 skrll /* The first entry in a procedure linkage table looks like this. See
242 1.1 skrll the SVR4 ABI m68k supplement to see how this works. */
243 1.1 skrll
244 1.1 skrll static const bfd_byte elf_m68k_plt0_entry[PLT_ENTRY_SIZE] =
245 1.1 skrll {
246 1.1 skrll 0x2f, 0x3b, 0x01, 0x70, /* move.l (%pc,addr),-(%sp) */
247 1.1 skrll 0, 0, 0, 2, /* + (.got + 4) - . */
248 1.1 skrll 0x4e, 0xfb, 0x01, 0x71, /* jmp ([%pc,addr]) */
249 1.1 skrll 0, 0, 0, 2, /* + (.got + 8) - . */
250 1.1 skrll 0, 0, 0, 0 /* pad out to 20 bytes. */
251 1.1 skrll };
252 1.1 skrll
253 1.1 skrll /* Subsequent entries in a procedure linkage table look like this. */
254 1.1 skrll
255 1.1 skrll static const bfd_byte elf_m68k_plt_entry[PLT_ENTRY_SIZE] =
256 1.1 skrll {
257 1.1 skrll 0x4e, 0xfb, 0x01, 0x71, /* jmp ([%pc,symbol@GOTPC]) */
258 1.1 skrll 0, 0, 0, 2, /* + (.got.plt entry) - . */
259 1.1 skrll 0x2f, 0x3c, /* move.l #offset,-(%sp) */
260 1.1 skrll 0, 0, 0, 0, /* + reloc index */
261 1.1 skrll 0x60, 0xff, /* bra.l .plt */
262 1.1 skrll 0, 0, 0, 0 /* + .plt - . */
263 1.1 skrll };
264 1.1 skrll
265 1.1 skrll static const struct elf_m68k_plt_info elf_m68k_plt_info = {
266 1.1 skrll PLT_ENTRY_SIZE,
267 1.1 skrll elf_m68k_plt0_entry, { 4, 12 },
268 1.1 skrll elf_m68k_plt_entry, { 4, 16 }, 8
269 1.1 skrll };
270 1.1 skrll
271 1.1 skrll #define ISAB_PLT_ENTRY_SIZE 24
272 1.1 skrll
273 1.1 skrll static const bfd_byte elf_isab_plt0_entry[ISAB_PLT_ENTRY_SIZE] =
274 1.1 skrll {
275 1.1 skrll 0x20, 0x3c, /* move.l #offset,%d0 */
276 1.1 skrll 0, 0, 0, 0, /* + (.got + 4) - . */
277 1.1 skrll 0x2f, 0x3b, 0x08, 0xfa, /* move.l (-6,%pc,%d0:l),-(%sp) */
278 1.1 skrll 0x20, 0x3c, /* move.l #offset,%d0 */
279 1.1 skrll 0, 0, 0, 0, /* + (.got + 8) - . */
280 1.1 skrll 0x20, 0x7b, 0x08, 0xfa, /* move.l (-6,%pc,%d0:l), %a0 */
281 1.1 skrll 0x4e, 0xd0, /* jmp (%a0) */
282 1.1 skrll 0x4e, 0x71 /* nop */
283 1.1 skrll };
284 1.1 skrll
285 1.1 skrll /* Subsequent entries in a procedure linkage table look like this. */
286 1.1 skrll
287 1.1 skrll static const bfd_byte elf_isab_plt_entry[ISAB_PLT_ENTRY_SIZE] =
288 1.1 skrll {
289 1.1 skrll 0x20, 0x3c, /* move.l #offset,%d0 */
290 1.1 skrll 0, 0, 0, 0, /* + (.got.plt entry) - . */
291 1.1 skrll 0x20, 0x7b, 0x08, 0xfa, /* move.l (-6,%pc,%d0:l), %a0 */
292 1.1 skrll 0x4e, 0xd0, /* jmp (%a0) */
293 1.1 skrll 0x2f, 0x3c, /* move.l #offset,-(%sp) */
294 1.1 skrll 0, 0, 0, 0, /* + reloc index */
295 1.1 skrll 0x60, 0xff, /* bra.l .plt */
296 1.1 skrll 0, 0, 0, 0 /* + .plt - . */
297 1.1 skrll };
298 1.1 skrll
299 1.1 skrll static const struct elf_m68k_plt_info elf_isab_plt_info = {
300 1.1 skrll ISAB_PLT_ENTRY_SIZE,
301 1.1 skrll elf_isab_plt0_entry, { 2, 12 },
302 1.1 skrll elf_isab_plt_entry, { 2, 20 }, 12
303 1.1 skrll };
304 1.1 skrll
305 1.1 skrll #define ISAC_PLT_ENTRY_SIZE 24
306 1.1 skrll
307 1.1 skrll static const bfd_byte elf_isac_plt0_entry[ISAC_PLT_ENTRY_SIZE] =
308 1.1 skrll {
309 1.1 skrll 0x20, 0x3c, /* move.l #offset,%d0 */
310 1.1 skrll 0, 0, 0, 0, /* replaced with .got + 4 - . */
311 1.1 skrll 0x2e, 0xbb, 0x08, 0xfa, /* move.l (-6,%pc,%d0:l),(%sp) */
312 1.1 skrll 0x20, 0x3c, /* move.l #offset,%d0 */
313 1.1 skrll 0, 0, 0, 0, /* replaced with .got + 8 - . */
314 1.1 skrll 0x20, 0x7b, 0x08, 0xfa, /* move.l (-6,%pc,%d0:l), %a0 */
315 1.1 skrll 0x4e, 0xd0, /* jmp (%a0) */
316 1.1 skrll 0x4e, 0x71 /* nop */
317 1.1 skrll };
318 1.1 skrll
319 1.1 skrll /* Subsequent entries in a procedure linkage table look like this. */
320 1.1 skrll
321 1.1 skrll static const bfd_byte elf_isac_plt_entry[ISAC_PLT_ENTRY_SIZE] =
322 1.1 skrll {
323 1.1 skrll 0x20, 0x3c, /* move.l #offset,%d0 */
324 1.1 skrll 0, 0, 0, 0, /* replaced with (.got entry) - . */
325 1.1 skrll 0x20, 0x7b, 0x08, 0xfa, /* move.l (-6,%pc,%d0:l), %a0 */
326 1.1 skrll 0x4e, 0xd0, /* jmp (%a0) */
327 1.1 skrll 0x2f, 0x3c, /* move.l #offset,-(%sp) */
328 1.1 skrll 0, 0, 0, 0, /* replaced with offset into relocation table */
329 1.1 skrll 0x61, 0xff, /* bsr.l .plt */
330 1.1 skrll 0, 0, 0, 0 /* replaced with .plt - . */
331 1.1 skrll };
332 1.1 skrll
333 1.1 skrll static const struct elf_m68k_plt_info elf_isac_plt_info = {
334 1.1 skrll ISAC_PLT_ENTRY_SIZE,
335 1.1 skrll elf_isac_plt0_entry, { 2, 12},
336 1.1 skrll elf_isac_plt_entry, { 2, 20 }, 12
337 1.1 skrll };
338 1.1 skrll
339 1.1 skrll #define CPU32_PLT_ENTRY_SIZE 24
340 1.1 skrll /* Procedure linkage table entries for the cpu32 */
341 1.1 skrll static const bfd_byte elf_cpu32_plt0_entry[CPU32_PLT_ENTRY_SIZE] =
342 1.1 skrll {
343 1.1 skrll 0x2f, 0x3b, 0x01, 0x70, /* move.l (%pc,addr),-(%sp) */
344 1.1 skrll 0, 0, 0, 2, /* + (.got + 4) - . */
345 1.1 skrll 0x22, 0x7b, 0x01, 0x70, /* moveal %pc@(0xc), %a1 */
346 1.1 skrll 0, 0, 0, 2, /* + (.got + 8) - . */
347 1.1 skrll 0x4e, 0xd1, /* jmp %a1@ */
348 1.1 skrll 0, 0, 0, 0, /* pad out to 24 bytes. */
349 1.1 skrll 0, 0
350 1.1 skrll };
351 1.1 skrll
352 1.1 skrll static const bfd_byte elf_cpu32_plt_entry[CPU32_PLT_ENTRY_SIZE] =
353 1.1 skrll {
354 1.1 skrll 0x22, 0x7b, 0x01, 0x70, /* moveal %pc@(0xc), %a1 */
355 1.1 skrll 0, 0, 0, 2, /* + (.got.plt entry) - . */
356 1.1 skrll 0x4e, 0xd1, /* jmp %a1@ */
357 1.1 skrll 0x2f, 0x3c, /* move.l #offset,-(%sp) */
358 1.1 skrll 0, 0, 0, 0, /* + reloc index */
359 1.1 skrll 0x60, 0xff, /* bra.l .plt */
360 1.1 skrll 0, 0, 0, 0, /* + .plt - . */
361 1.1 skrll 0, 0
362 1.1 skrll };
363 1.1 skrll
364 1.1 skrll static const struct elf_m68k_plt_info elf_cpu32_plt_info = {
365 1.1 skrll CPU32_PLT_ENTRY_SIZE,
366 1.1 skrll elf_cpu32_plt0_entry, { 4, 12 },
367 1.1 skrll elf_cpu32_plt_entry, { 4, 18 }, 10
368 1.1 skrll };
369 1.1 skrll
370 1.1 skrll /* The m68k linker needs to keep track of the number of relocs that it
371 1.1 skrll decides to copy in check_relocs for each symbol. This is so that it
372 1.1 skrll can discard PC relative relocs if it doesn't need them when linking
373 1.1 skrll with -Bsymbolic. We store the information in a field extending the
374 1.1 skrll regular ELF linker hash table. */
375 1.1 skrll
376 1.1 skrll /* This structure keeps track of the number of PC relative relocs we have
377 1.1 skrll copied for a given symbol. */
378 1.1 skrll
379 1.1 skrll struct elf_m68k_pcrel_relocs_copied
380 1.1 skrll {
381 1.1 skrll /* Next section. */
382 1.1 skrll struct elf_m68k_pcrel_relocs_copied *next;
383 1.1 skrll /* A section in dynobj. */
384 1.1 skrll asection *section;
385 1.1 skrll /* Number of relocs copied in this section. */
386 1.1 skrll bfd_size_type count;
387 1.1 skrll };
388 1.1 skrll
389 1.1 skrll /* Forward declaration. */
390 1.1 skrll struct elf_m68k_got_entry;
391 1.1 skrll
392 1.1 skrll /* m68k ELF linker hash entry. */
393 1.1 skrll
394 1.1 skrll struct elf_m68k_link_hash_entry
395 1.1 skrll {
396 1.1 skrll struct elf_link_hash_entry root;
397 1.1 skrll
398 1.1 skrll /* Number of PC relative relocs copied for this symbol. */
399 1.1 skrll struct elf_m68k_pcrel_relocs_copied *pcrel_relocs_copied;
400 1.1 skrll
401 1.1 skrll /* Key to got_entries. */
402 1.1 skrll unsigned long got_entry_key;
403 1.1 skrll
404 1.1 skrll /* List of GOT entries for this symbol. This list is build during
405 1.1 skrll offset finalization and is used within elf_m68k_finish_dynamic_symbol
406 1.1 skrll to traverse all GOT entries for a particular symbol.
407 1.1 skrll
408 1.1 skrll ??? We could've used root.got.glist field instead, but having
409 1.1 skrll a separate field is cleaner. */
410 1.1 skrll struct elf_m68k_got_entry *glist;
411 1.1 skrll };
412 1.1 skrll
413 1.1 skrll #define elf_m68k_hash_entry(ent) ((struct elf_m68k_link_hash_entry *) (ent))
414 1.1 skrll
415 1.1 skrll /* Key part of GOT entry in hashtable. */
416 1.1 skrll struct elf_m68k_got_entry_key
417 1.1 skrll {
418 1.1 skrll /* BFD in which this symbol was defined. NULL for global symbols. */
419 1.1 skrll const bfd *bfd;
420 1.1 skrll
421 1.1 skrll /* Symbol index. Either local symbol index or h->got_entry_key. */
422 1.1 skrll unsigned long symndx;
423 1.1 skrll };
424 1.1 skrll
425 1.1 skrll /* Entry of the GOT. */
426 1.1 skrll struct elf_m68k_got_entry
427 1.1 skrll {
428 1.1 skrll /* GOT entries are put into a got->entries hashtable. This is the key. */
429 1.1 skrll struct elf_m68k_got_entry_key key_;
430 1.1 skrll
431 1.1 skrll /* GOT entry data. We need s1 before offset finalization and s2 after. */
432 1.1 skrll union
433 1.1 skrll {
434 1.1 skrll struct
435 1.1 skrll {
436 1.1 skrll /* Number of times this entry is referenced. It is used to
437 1.1 skrll filter out unnecessary GOT slots in elf_m68k_gc_sweep_hook. */
438 1.1 skrll bfd_vma refcount;
439 1.1 skrll
440 1.1 skrll /* Type is one of R_68K_GOT8O, R_68K_GOT16O or R_68K_GOT32O. */
441 1.1 skrll int type;
442 1.1 skrll } s1;
443 1.1 skrll
444 1.1 skrll struct
445 1.1 skrll {
446 1.1 skrll /* Offset from the start of .got section. To calculate offset relative
447 1.1 skrll to GOT pointer one should substract got->offset from this value. */
448 1.1 skrll bfd_vma offset;
449 1.1 skrll
450 1.1 skrll /* Pointer to the next GOT entry for this global symbol.
451 1.1 skrll Symbols have at most one entry in one GOT, but might
452 1.1 skrll have entries in more than one GOT.
453 1.1 skrll Root of this list is h->glist.
454 1.1 skrll NULL for local symbols. */
455 1.1 skrll struct elf_m68k_got_entry *next;
456 1.1 skrll } s2;
457 1.1 skrll } u;
458 1.1 skrll };
459 1.1 skrll
460 1.1 skrll /* Data structure representing a single GOT. */
461 1.1 skrll struct elf_m68k_got
462 1.1 skrll {
463 1.1 skrll /* Hashtable of 'struct elf_m68k_got_entry's.
464 1.1 skrll Starting size of this table is the maximum number of
465 1.1 skrll R_68K_GOT8O entries. */
466 1.1 skrll htab_t entries;
467 1.1 skrll
468 1.1 skrll /* Number of R_68K_GOT8O entries in this GOT.
469 1.1 skrll This is used to detect the overflow of number of such entries. */
470 1.1 skrll bfd_vma rel_8o_n_entries;
471 1.1 skrll
472 1.1 skrll /* Cumulative count of R_68K_GOT8O and R_68K_GOT16O entries in this GOT.
473 1.1 skrll This is used to detect the overflow of number of such entries. */
474 1.1 skrll bfd_vma rel_8o_16o_n_entries;
475 1.1 skrll
476 1.1 skrll /* Number of local (entry->key_.h == NULL) entries in this GOT.
477 1.1 skrll This is only used to properly calculate size of .rela.got section;
478 1.1 skrll see elf_m68k_partition_multi_got. */
479 1.1 skrll bfd_vma local_n_entries;
480 1.1 skrll
481 1.1 skrll /* Offset of this GOT relative to beginning of .got section. */
482 1.1 skrll bfd_vma offset;
483 1.1 skrll };
484 1.1 skrll
485 1.1 skrll /* BFD and its GOT. This is an entry in multi_got->bfd2got hashtable. */
486 1.1 skrll struct elf_m68k_bfd2got_entry
487 1.1 skrll {
488 1.1 skrll /* BFD. */
489 1.1 skrll const bfd *bfd;
490 1.1 skrll
491 1.1 skrll /* Assigned GOT. Before partitioning multi-GOT each BFD has its own
492 1.1 skrll GOT structure. After partitioning several BFD's might [and often do]
493 1.1 skrll share a single GOT. */
494 1.1 skrll struct elf_m68k_got *got;
495 1.1 skrll };
496 1.1 skrll
497 1.1 skrll /* The main data structure holding all the pieces. */
498 1.1 skrll struct elf_m68k_multi_got
499 1.1 skrll {
500 1.1 skrll /* Hashtable mapping each BFD to its GOT. If a BFD doesn't have an entry
501 1.1 skrll here, then it doesn't need a GOT (this includes the case of a BFD
502 1.1 skrll having an empty GOT).
503 1.1 skrll
504 1.1 skrll ??? This hashtable can be replaced by an array indexed by bfd->id. */
505 1.1 skrll htab_t bfd2got;
506 1.1 skrll
507 1.1 skrll /* Next symndx to assign a global symbol.
508 1.1 skrll h->got_entry_key is initialized from this counter. */
509 1.1 skrll unsigned long global_symndx;
510 1.1 skrll };
511 1.1 skrll
512 1.1 skrll /* m68k ELF linker hash table. */
513 1.1 skrll
514 1.1 skrll struct elf_m68k_link_hash_table
515 1.1 skrll {
516 1.1 skrll struct elf_link_hash_table root;
517 1.1 skrll
518 1.1 skrll /* Small local sym to section mapping cache. */
519 1.1 skrll struct sym_sec_cache sym_sec;
520 1.1 skrll
521 1.1 skrll /* The PLT format used by this link, or NULL if the format has not
522 1.1 skrll yet been chosen. */
523 1.1 skrll const struct elf_m68k_plt_info *plt_info;
524 1.1 skrll
525 1.1 skrll /* True, if GP is loaded within each function which uses it.
526 1.1 skrll Set to TRUE when GOT negative offsets or multi-GOT is enabled. */
527 1.1 skrll bfd_boolean local_gp_p;
528 1.1 skrll
529 1.1 skrll /* Switch controlling use of negative offsets to double the size of GOTs. */
530 1.1 skrll bfd_boolean use_neg_got_offsets_p;
531 1.1 skrll
532 1.1 skrll /* Switch controlling generation of multiple GOTs. */
533 1.1 skrll bfd_boolean allow_multigot_p;
534 1.1 skrll
535 1.1 skrll /* Multi-GOT data structure. */
536 1.1 skrll struct elf_m68k_multi_got multi_got_;
537 1.1 skrll };
538 1.1 skrll
539 1.1 skrll /* Get the m68k ELF linker hash table from a link_info structure. */
540 1.1 skrll
541 1.1 skrll #define elf_m68k_hash_table(p) \
542 1.1 skrll ((struct elf_m68k_link_hash_table *) (p)->hash)
543 1.1 skrll
544 1.1 skrll /* Shortcut to multi-GOT data. */
545 1.1 skrll #define elf_m68k_multi_got(INFO) (&elf_m68k_hash_table (INFO)->multi_got_)
546 1.1 skrll
547 1.1 skrll /* Create an entry in an m68k ELF linker hash table. */
548 1.1 skrll
549 1.1 skrll static struct bfd_hash_entry *
550 1.1 skrll elf_m68k_link_hash_newfunc (entry, table, string)
551 1.1 skrll struct bfd_hash_entry *entry;
552 1.1 skrll struct bfd_hash_table *table;
553 1.1 skrll const char *string;
554 1.1 skrll {
555 1.1 skrll struct bfd_hash_entry *ret = entry;
556 1.1 skrll
557 1.1 skrll /* Allocate the structure if it has not already been allocated by a
558 1.1 skrll subclass. */
559 1.1 skrll if (ret == NULL)
560 1.1 skrll ret = bfd_hash_allocate (table,
561 1.1 skrll sizeof (struct elf_m68k_link_hash_entry));
562 1.1 skrll if (ret == NULL)
563 1.1 skrll return ret;
564 1.1 skrll
565 1.1 skrll /* Call the allocation method of the superclass. */
566 1.1 skrll ret = _bfd_elf_link_hash_newfunc (ret, table, string);
567 1.1 skrll if (ret != NULL)
568 1.1 skrll {
569 1.1 skrll elf_m68k_hash_entry (ret)->pcrel_relocs_copied = NULL;
570 1.1 skrll elf_m68k_hash_entry (ret)->got_entry_key = 0;
571 1.1 skrll elf_m68k_hash_entry (ret)->glist = NULL;
572 1.1 skrll }
573 1.1 skrll
574 1.1 skrll return ret;
575 1.1 skrll }
576 1.1 skrll
577 1.1 skrll /* Create an m68k ELF linker hash table. */
578 1.1 skrll
579 1.1 skrll static struct bfd_link_hash_table *
580 1.1 skrll elf_m68k_link_hash_table_create (abfd)
581 1.1 skrll bfd *abfd;
582 1.1 skrll {
583 1.1 skrll struct elf_m68k_link_hash_table *ret;
584 1.1 skrll bfd_size_type amt = sizeof (struct elf_m68k_link_hash_table);
585 1.1 skrll
586 1.1 skrll ret = (struct elf_m68k_link_hash_table *) bfd_malloc (amt);
587 1.1 skrll if (ret == (struct elf_m68k_link_hash_table *) NULL)
588 1.1 skrll return NULL;
589 1.1 skrll
590 1.1 skrll if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
591 1.1 skrll elf_m68k_link_hash_newfunc,
592 1.1 skrll sizeof (struct elf_m68k_link_hash_entry)))
593 1.1 skrll {
594 1.1 skrll free (ret);
595 1.1 skrll return NULL;
596 1.1 skrll }
597 1.1 skrll
598 1.1 skrll ret->sym_sec.abfd = NULL;
599 1.1 skrll ret->plt_info = NULL;
600 1.1 skrll ret->local_gp_p = FALSE;
601 1.1 skrll ret->use_neg_got_offsets_p = FALSE;
602 1.1 skrll ret->allow_multigot_p = FALSE;
603 1.1 skrll ret->multi_got_.bfd2got = NULL;
604 1.1 skrll ret->multi_got_.global_symndx = 1;
605 1.1 skrll
606 1.1 skrll return &ret->root.root;
607 1.1 skrll }
608 1.1 skrll
609 1.1 skrll /* Destruct local data. */
610 1.1 skrll
611 1.1 skrll static void
612 1.1 skrll elf_m68k_link_hash_table_free (struct bfd_link_hash_table *_htab)
613 1.1 skrll {
614 1.1 skrll struct elf_m68k_link_hash_table *htab;
615 1.1 skrll
616 1.1 skrll htab = (struct elf_m68k_link_hash_table *) _htab;
617 1.1 skrll
618 1.1 skrll if (htab->multi_got_.bfd2got != NULL)
619 1.1 skrll {
620 1.1 skrll htab_delete (htab->multi_got_.bfd2got);
621 1.1 skrll htab->multi_got_.bfd2got = NULL;
622 1.1 skrll }
623 1.1 skrll }
624 1.1 skrll
625 1.1 skrll /* Set the right machine number. */
626 1.1 skrll
627 1.1 skrll static bfd_boolean
628 1.1 skrll elf32_m68k_object_p (bfd *abfd)
629 1.1 skrll {
630 1.1 skrll unsigned int mach = 0;
631 1.1 skrll unsigned features = 0;
632 1.1 skrll flagword eflags = elf_elfheader (abfd)->e_flags;
633 1.1 skrll
634 1.1 skrll if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
635 1.1 skrll features |= m68000;
636 1.1 skrll else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
637 1.1 skrll features |= cpu32;
638 1.1 skrll else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
639 1.1 skrll features |= fido_a;
640 1.1 skrll else
641 1.1 skrll {
642 1.1 skrll switch (eflags & EF_M68K_CF_ISA_MASK)
643 1.1 skrll {
644 1.1 skrll case EF_M68K_CF_ISA_A_NODIV:
645 1.1 skrll features |= mcfisa_a;
646 1.1 skrll break;
647 1.1 skrll case EF_M68K_CF_ISA_A:
648 1.1 skrll features |= mcfisa_a|mcfhwdiv;
649 1.1 skrll break;
650 1.1 skrll case EF_M68K_CF_ISA_A_PLUS:
651 1.1 skrll features |= mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp;
652 1.1 skrll break;
653 1.1 skrll case EF_M68K_CF_ISA_B_NOUSP:
654 1.1 skrll features |= mcfisa_a|mcfisa_b|mcfhwdiv;
655 1.1 skrll break;
656 1.1 skrll case EF_M68K_CF_ISA_B:
657 1.1 skrll features |= mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp;
658 1.1 skrll break;
659 1.1 skrll case EF_M68K_CF_ISA_C:
660 1.1 skrll features |= mcfisa_a|mcfisa_c|mcfhwdiv|mcfusp;
661 1.1 skrll break;
662 1.1 skrll case EF_M68K_CF_ISA_C_NODIV:
663 1.1 skrll features |= mcfisa_a|mcfisa_c|mcfusp;
664 1.1 skrll break;
665 1.1 skrll }
666 1.1 skrll switch (eflags & EF_M68K_CF_MAC_MASK)
667 1.1 skrll {
668 1.1 skrll case EF_M68K_CF_MAC:
669 1.1 skrll features |= mcfmac;
670 1.1 skrll break;
671 1.1 skrll case EF_M68K_CF_EMAC:
672 1.1 skrll features |= mcfemac;
673 1.1 skrll break;
674 1.1 skrll }
675 1.1 skrll if (eflags & EF_M68K_CF_FLOAT)
676 1.1 skrll features |= cfloat;
677 1.1 skrll }
678 1.1 skrll
679 1.1 skrll mach = bfd_m68k_features_to_mach (features);
680 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_m68k, mach);
681 1.1 skrll
682 1.1 skrll return TRUE;
683 1.1 skrll }
684 1.1 skrll
685 1.1 skrll /* Keep m68k-specific flags in the ELF header. */
686 1.1 skrll static bfd_boolean
687 1.1 skrll elf32_m68k_set_private_flags (abfd, flags)
688 1.1 skrll bfd *abfd;
689 1.1 skrll flagword flags;
690 1.1 skrll {
691 1.1 skrll elf_elfheader (abfd)->e_flags = flags;
692 1.1 skrll elf_flags_init (abfd) = TRUE;
693 1.1 skrll return TRUE;
694 1.1 skrll }
695 1.1 skrll
696 1.1 skrll /* Merge backend specific data from an object file to the output
697 1.1 skrll object file when linking. */
698 1.1 skrll static bfd_boolean
699 1.1 skrll elf32_m68k_merge_private_bfd_data (ibfd, obfd)
700 1.1 skrll bfd *ibfd;
701 1.1 skrll bfd *obfd;
702 1.1 skrll {
703 1.1 skrll flagword out_flags;
704 1.1 skrll flagword in_flags;
705 1.1 skrll flagword out_isa;
706 1.1 skrll flagword in_isa;
707 1.1 skrll const bfd_arch_info_type *arch_info;
708 1.1 skrll
709 1.1 skrll if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
710 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
711 1.1 skrll return FALSE;
712 1.1 skrll
713 1.1 skrll /* Get the merged machine. This checks for incompatibility between
714 1.1 skrll Coldfire & non-Coldfire flags, incompability between different
715 1.1 skrll Coldfire ISAs, and incompability between different MAC types. */
716 1.1 skrll arch_info = bfd_arch_get_compatible (ibfd, obfd, FALSE);
717 1.1 skrll if (!arch_info)
718 1.1 skrll return FALSE;
719 1.1 skrll
720 1.1 skrll bfd_set_arch_mach (obfd, bfd_arch_m68k, arch_info->mach);
721 1.1 skrll
722 1.1 skrll in_flags = elf_elfheader (ibfd)->e_flags;
723 1.1 skrll if (!elf_flags_init (obfd))
724 1.1 skrll {
725 1.1 skrll elf_flags_init (obfd) = TRUE;
726 1.1 skrll out_flags = in_flags;
727 1.1 skrll }
728 1.1 skrll else
729 1.1 skrll {
730 1.1 skrll out_flags = elf_elfheader (obfd)->e_flags;
731 1.1 skrll unsigned int variant_mask;
732 1.1 skrll
733 1.1 skrll if ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
734 1.1 skrll variant_mask = 0;
735 1.1 skrll else if ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
736 1.1 skrll variant_mask = 0;
737 1.1 skrll else if ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
738 1.1 skrll variant_mask = 0;
739 1.1 skrll else
740 1.1 skrll variant_mask = EF_M68K_CF_ISA_MASK;
741 1.1 skrll
742 1.1 skrll in_isa = (in_flags & variant_mask);
743 1.1 skrll out_isa = (out_flags & variant_mask);
744 1.1 skrll if (in_isa > out_isa)
745 1.1 skrll out_flags ^= in_isa ^ out_isa;
746 1.1 skrll if (((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32
747 1.1 skrll && (out_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
748 1.1 skrll || ((in_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO
749 1.1 skrll && (out_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32))
750 1.1 skrll out_flags = EF_M68K_FIDO;
751 1.1 skrll else
752 1.1 skrll out_flags |= in_flags ^ in_isa;
753 1.1 skrll }
754 1.1 skrll elf_elfheader (obfd)->e_flags = out_flags;
755 1.1 skrll
756 1.1 skrll return TRUE;
757 1.1 skrll }
758 1.1 skrll
759 1.1 skrll /* Display the flags field. */
760 1.1 skrll
761 1.1 skrll static bfd_boolean
762 1.1 skrll elf32_m68k_print_private_bfd_data (bfd *abfd, void * ptr)
763 1.1 skrll {
764 1.1 skrll FILE *file = (FILE *) ptr;
765 1.1 skrll flagword eflags = elf_elfheader (abfd)->e_flags;
766 1.1 skrll
767 1.1 skrll BFD_ASSERT (abfd != NULL && ptr != NULL);
768 1.1 skrll
769 1.1 skrll /* Print normal ELF private data. */
770 1.1 skrll _bfd_elf_print_private_bfd_data (abfd, ptr);
771 1.1 skrll
772 1.1 skrll /* Ignore init flag - it may not be set, despite the flags field containing valid data. */
773 1.1 skrll
774 1.1 skrll /* xgettext:c-format */
775 1.1 skrll fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
776 1.1 skrll
777 1.1 skrll if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
778 1.1 skrll fprintf (file, " [m68000]");
779 1.1 skrll else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
780 1.1 skrll fprintf (file, " [cpu32]");
781 1.1 skrll else if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
782 1.1 skrll fprintf (file, " [fido]");
783 1.1 skrll else
784 1.1 skrll {
785 1.1 skrll if ((eflags & EF_M68K_ARCH_MASK) == EF_M68K_CFV4E)
786 1.1 skrll fprintf (file, " [cfv4e]");
787 1.1 skrll
788 1.1 skrll if (eflags & EF_M68K_CF_ISA_MASK)
789 1.1 skrll {
790 1.1 skrll char const *isa = _("unknown");
791 1.1 skrll char const *mac = _("unknown");
792 1.1 skrll char const *additional = "";
793 1.1 skrll
794 1.1 skrll switch (eflags & EF_M68K_CF_ISA_MASK)
795 1.1 skrll {
796 1.1 skrll case EF_M68K_CF_ISA_A_NODIV:
797 1.1 skrll isa = "A";
798 1.1 skrll additional = " [nodiv]";
799 1.1 skrll break;
800 1.1 skrll case EF_M68K_CF_ISA_A:
801 1.1 skrll isa = "A";
802 1.1 skrll break;
803 1.1 skrll case EF_M68K_CF_ISA_A_PLUS:
804 1.1 skrll isa = "A+";
805 1.1 skrll break;
806 1.1 skrll case EF_M68K_CF_ISA_B_NOUSP:
807 1.1 skrll isa = "B";
808 1.1 skrll additional = " [nousp]";
809 1.1 skrll break;
810 1.1 skrll case EF_M68K_CF_ISA_B:
811 1.1 skrll isa = "B";
812 1.1 skrll break;
813 1.1 skrll case EF_M68K_CF_ISA_C:
814 1.1 skrll isa = "C";
815 1.1 skrll break;
816 1.1 skrll case EF_M68K_CF_ISA_C_NODIV:
817 1.1 skrll isa = "C";
818 1.1 skrll additional = " [nodiv]";
819 1.1 skrll break;
820 1.1 skrll }
821 1.1 skrll fprintf (file, " [isa %s]%s", isa, additional);
822 1.1 skrll
823 1.1 skrll if (eflags & EF_M68K_CF_FLOAT)
824 1.1 skrll fprintf (file, " [float]");
825 1.1 skrll
826 1.1 skrll switch (eflags & EF_M68K_CF_MAC_MASK)
827 1.1 skrll {
828 1.1 skrll case 0:
829 1.1 skrll mac = NULL;
830 1.1 skrll break;
831 1.1 skrll case EF_M68K_CF_MAC:
832 1.1 skrll mac = "mac";
833 1.1 skrll break;
834 1.1 skrll case EF_M68K_CF_EMAC:
835 1.1 skrll mac = "emac";
836 1.1 skrll break;
837 1.1 skrll }
838 1.1 skrll if (mac)
839 1.1 skrll fprintf (file, " [%s]", mac);
840 1.1 skrll }
841 1.1 skrll }
842 1.1 skrll
843 1.1 skrll fputc ('\n', file);
844 1.1 skrll
845 1.1 skrll return TRUE;
846 1.1 skrll }
847 1.1 skrll
848 1.1 skrll /* Multi-GOT support implementation design:
849 1.1 skrll
850 1.1 skrll Multi-GOT starts in check_relocs hook. There we scan all
851 1.1 skrll relocations of a BFD and build a local GOT (struct elf_m68k_got)
852 1.1 skrll for it. If a single BFD appears to require too many GOT slots with
853 1.1 skrll R_68K_GOT8O or R_68K_GOT16O relocations, we fail with notification
854 1.1 skrll to user.
855 1.1 skrll After check_relocs has been invoked for each input BFD, we have
856 1.1 skrll constructed a GOT for each input BFD.
857 1.1 skrll
858 1.1 skrll To minimize total number of GOTs required for a particular output BFD
859 1.1 skrll (as some environments support only 1 GOT per output object) we try
860 1.1 skrll to merge some of the GOTs to share an offset space. Ideally [and in most
861 1.1 skrll cases] we end up with a single GOT. In cases when there are too many
862 1.1 skrll restricted relocations (e.g., R_68K_GOT16O relocations) we end up with
863 1.1 skrll several GOTs, assuming the environment can handle them.
864 1.1 skrll
865 1.1 skrll Partitioning is done in elf_m68k_partition_multi_got. We start with
866 1.1 skrll an empty GOT and traverse bfd2got hashtable putting got_entries from
867 1.1 skrll local GOTs to the new 'big' one. We do that by constructing an
868 1.1 skrll intermediate GOT holding all the entries the local GOT has and the big
869 1.1 skrll GOT lacks. Then we check if there is room in the big GOT to accomodate
870 1.1 skrll all the entries from diff. On success we add those entries to the big
871 1.1 skrll GOT; on failure we start the new 'big' GOT and retry the adding of
872 1.1 skrll entries from the local GOT. Note that this retry will always succeed as
873 1.1 skrll each local GOT doesn't overflow the limits. After partitioning we
874 1.1 skrll end up with each bfd assigned one of the big GOTs. GOT entries in the
875 1.1 skrll big GOTs are initialized with GOT offsets. Note that big GOTs are
876 1.1 skrll positioned consequently in program space and represent a single huge GOT
877 1.1 skrll to the outside world.
878 1.1 skrll
879 1.1 skrll After that we get to elf_m68k_relocate_section. There we
880 1.1 skrll adjust relocations of GOT pointer (_GLOBAL_OFFSET_TABLE_) and symbol
881 1.1 skrll relocations to refer to appropriate [assigned to current input_bfd]
882 1.1 skrll big GOT.
883 1.1 skrll
884 1.1 skrll Notes:
885 1.1 skrll
886 1.1 skrll GOT entry type: We have 3 types of GOT entries.
887 1.1 skrll * R_68K_GOT8O type is used in entries for symbols that have
888 1.1 skrll at least one R_68K_GOT8O relocation. We can have at most 0x40
889 1.1 skrll such entries in one GOT.
890 1.1 skrll * R_68K_GOT16O type is used in entries for symbols that have
891 1.1 skrll at least one R_68K_GOT16O relocation and no R_68K_GOT8O relocations.
892 1.1 skrll We can have at most 0x4000 such entries in one GOT.
893 1.1 skrll * R_68K_GOT32O type is used in all other cases. We can have as many
894 1.1 skrll such entries in one GOT as we like.
895 1.1 skrll When counting relocations we have to include the count of the smaller
896 1.1 skrll ranged relocations in the counts of the larger ranged ones in order
897 1.1 skrll to correctly detect overflow.
898 1.1 skrll
899 1.1 skrll Sorting the GOT: In each GOT starting offsets are assigned to
900 1.1 skrll R_68K_GOT8O entries, which are followed by R_68K_GOT16O entries, and
901 1.1 skrll R_68K_GOT32O entries go at the end. See finalize_got_offsets for details.
902 1.1 skrll
903 1.1 skrll Negative GOT offsets: To double usable offset range of GOTs we use
904 1.1 skrll negative offsets. As we assign entries with GOT offsets relative to
905 1.1 skrll start of .got section, the offset values are positive. They become
906 1.1 skrll negative only in relocate_section where got->offset value is
907 1.1 skrll subtracted from them.
908 1.1 skrll
909 1.1 skrll 3 special GOT entries: There are 3 special GOT entries used internally
910 1.1 skrll by loader. These entries happen to be placed to .got.plt section,
911 1.1 skrll so we don't do anything about them in multi-GOT support.
912 1.1 skrll
913 1.1 skrll Memory management: All data except for hashtables
914 1.1 skrll multi_got->bfd2got and got->entries are allocated on
915 1.1 skrll elf_hash_table (info)->dynobj bfd (for this reason we pass 'info'
916 1.1 skrll to most functions), so we don't need to care to free them. At the
917 1.1 skrll moment of allocation hashtables are being linked into main data
918 1.1 skrll structure (multi_got), all pieces of which are reachable from
919 1.1 skrll elf_m68k_multi_got (info). We deallocate them in
920 1.1 skrll elf_m68k_link_hash_table_free. */
921 1.1 skrll
922 1.1 skrll /* Initialize GOT. */
923 1.1 skrll
924 1.1 skrll static void
925 1.1 skrll elf_m68k_init_got (struct elf_m68k_got *got,
926 1.1 skrll htab_t entries,
927 1.1 skrll bfd_vma rel_8o_n_entries,
928 1.1 skrll bfd_vma rel_8o_16o_n_entries,
929 1.1 skrll bfd_vma local_n_entries,
930 1.1 skrll bfd_vma offset)
931 1.1 skrll {
932 1.1 skrll got->entries = entries;
933 1.1 skrll got->rel_8o_n_entries = rel_8o_n_entries;
934 1.1 skrll got->rel_8o_16o_n_entries = rel_8o_16o_n_entries;
935 1.1 skrll got->local_n_entries = local_n_entries;
936 1.1 skrll got->offset = offset;
937 1.1 skrll }
938 1.1 skrll
939 1.1 skrll /* Destruct GOT. */
940 1.1 skrll
941 1.1 skrll static void
942 1.1 skrll elf_m68k_clear_got (struct elf_m68k_got *got)
943 1.1 skrll {
944 1.1 skrll if (got->entries != NULL)
945 1.1 skrll {
946 1.1 skrll htab_delete (got->entries);
947 1.1 skrll got->entries = NULL;
948 1.1 skrll }
949 1.1 skrll }
950 1.1 skrll
951 1.1 skrll /* Create and empty GOT structure. INFO is the context where memory
952 1.1 skrll should be allocated. */
953 1.1 skrll
954 1.1 skrll static struct elf_m68k_got *
955 1.1 skrll elf_m68k_create_empty_got (struct bfd_link_info *info)
956 1.1 skrll {
957 1.1 skrll struct elf_m68k_got *got;
958 1.1 skrll
959 1.1 skrll got = bfd_alloc (elf_hash_table (info)->dynobj, sizeof (*got));
960 1.1 skrll if (got == NULL)
961 1.1 skrll return NULL;
962 1.1 skrll
963 1.1 skrll elf_m68k_init_got (got, NULL, 0, 0, 0, (bfd_vma) -1);
964 1.1 skrll
965 1.1 skrll return got;
966 1.1 skrll }
967 1.1 skrll
968 1.1 skrll /* Initialize KEY. */
969 1.1 skrll
970 1.1 skrll static void
971 1.1 skrll elf_m68k_init_got_entry_key (struct elf_m68k_got_entry_key *key,
972 1.1 skrll struct elf_link_hash_entry *h,
973 1.1 skrll const bfd *abfd, unsigned long symndx)
974 1.1 skrll {
975 1.1 skrll if (h != NULL)
976 1.1 skrll {
977 1.1 skrll key->bfd = NULL;
978 1.1 skrll key->symndx = elf_m68k_hash_entry (h)->got_entry_key;
979 1.1 skrll BFD_ASSERT (key->symndx != 0);
980 1.1 skrll }
981 1.1 skrll else
982 1.1 skrll {
983 1.1 skrll key->bfd = abfd;
984 1.1 skrll key->symndx = symndx;
985 1.1 skrll }
986 1.1 skrll }
987 1.1 skrll
988 1.1 skrll /* Calculate hash of got_entry.
989 1.1 skrll ??? Is it good? */
990 1.1 skrll
991 1.1 skrll static hashval_t
992 1.1 skrll elf_m68k_got_entry_hash (const void *_entry)
993 1.1 skrll {
994 1.1 skrll const struct elf_m68k_got_entry_key *key;
995 1.1 skrll
996 1.1 skrll key = &((const struct elf_m68k_got_entry *) _entry)->key_;
997 1.1 skrll
998 1.1 skrll return key->symndx + (key->bfd != NULL
999 1.1 skrll ? (int) key->bfd->id
1000 1.1 skrll : -1);
1001 1.1 skrll }
1002 1.1 skrll
1003 1.1 skrll /* Check if two got entries are equal. */
1004 1.1 skrll
1005 1.1 skrll static int
1006 1.1 skrll elf_m68k_got_entry_eq (const void *_entry1, const void *_entry2)
1007 1.1 skrll {
1008 1.1 skrll const struct elf_m68k_got_entry_key *key1;
1009 1.1 skrll const struct elf_m68k_got_entry_key *key2;
1010 1.1 skrll
1011 1.1 skrll key1 = &((const struct elf_m68k_got_entry *) _entry1)->key_;
1012 1.1 skrll key2 = &((const struct elf_m68k_got_entry *) _entry2)->key_;
1013 1.1 skrll
1014 1.1 skrll return (key1->bfd == key2->bfd
1015 1.1 skrll && key1->symndx == key2->symndx);
1016 1.1 skrll }
1017 1.1 skrll
1018 1.1 skrll /* Maximal number of R_68K_GOT8O entries in a single GOT. */
1019 1.1 skrll #define ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT(INFO) \
1020 1.1 skrll (elf_m68k_hash_table (INFO)->use_neg_got_offsets_p \
1021 1.1 skrll ? 0x40 \
1022 1.1 skrll : 0x20)
1023 1.1 skrll
1024 1.1 skrll /* Maximal number of R_68K_GOT8O and R_68K_GOT16O entries in a single GOT. */
1025 1.1 skrll #define ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT(INFO) \
1026 1.1 skrll (elf_m68k_hash_table (INFO)->use_neg_got_offsets_p \
1027 1.1 skrll ? 0x4000 \
1028 1.1 skrll : 0x2000)
1029 1.1 skrll
1030 1.1 skrll /* SEARCH - simply search the hashtable, don't insert new entries or fail when
1031 1.1 skrll the entry cannot be found.
1032 1.1 skrll FIND_OR_CREATE - search for an existing entry, but create new if there's
1033 1.1 skrll no such.
1034 1.1 skrll MUST_FIND - search for an existing entry and assert that it exist.
1035 1.1 skrll MUST_CREATE - assert that there's no such entry and create new one. */
1036 1.1 skrll enum elf_m68k_get_entry_howto
1037 1.1 skrll {
1038 1.1 skrll SEARCH,
1039 1.1 skrll FIND_OR_CREATE,
1040 1.1 skrll MUST_FIND,
1041 1.1 skrll MUST_CREATE
1042 1.1 skrll };
1043 1.1 skrll
1044 1.1 skrll /* Get or create (depending on HOWTO) entry with KEY in GOT.
1045 1.1 skrll INFO is context in which memory should be allocated (can be NULL if
1046 1.1 skrll HOWTO is SEARCH or MUST_FIND). */
1047 1.1 skrll
1048 1.1 skrll static struct elf_m68k_got_entry *
1049 1.1 skrll elf_m68k_get_got_entry (struct elf_m68k_got *got,
1050 1.1 skrll const struct elf_m68k_got_entry_key *key,
1051 1.1 skrll enum elf_m68k_get_entry_howto howto,
1052 1.1 skrll struct bfd_link_info *info)
1053 1.1 skrll {
1054 1.1 skrll struct elf_m68k_got_entry entry_;
1055 1.1 skrll struct elf_m68k_got_entry *entry;
1056 1.1 skrll void **ptr;
1057 1.1 skrll
1058 1.1 skrll BFD_ASSERT ((info == NULL) == (howto == SEARCH || howto == MUST_FIND));
1059 1.1 skrll
1060 1.1 skrll if (got->entries == NULL)
1061 1.1 skrll /* This is the first entry in ABFD. Initialize hashtable. */
1062 1.1 skrll {
1063 1.1 skrll if (howto == SEARCH)
1064 1.1 skrll return NULL;
1065 1.1 skrll
1066 1.1 skrll got->entries = htab_try_create (ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT
1067 1.1 skrll (info),
1068 1.1 skrll elf_m68k_got_entry_hash,
1069 1.1 skrll elf_m68k_got_entry_eq, NULL);
1070 1.1 skrll if (got->entries == NULL)
1071 1.1 skrll {
1072 1.1 skrll bfd_set_error (bfd_error_no_memory);
1073 1.1 skrll return NULL;
1074 1.1 skrll }
1075 1.1 skrll }
1076 1.1 skrll
1077 1.1 skrll entry_.key_ = *key;
1078 1.1 skrll ptr = htab_find_slot (got->entries, &entry_, (howto != SEARCH
1079 1.1 skrll ? INSERT : NO_INSERT));
1080 1.1 skrll if (ptr == NULL)
1081 1.1 skrll {
1082 1.1 skrll if (howto == SEARCH)
1083 1.1 skrll /* Entry not found. */
1084 1.1 skrll return NULL;
1085 1.1 skrll
1086 1.1 skrll /* We're out of memory. */
1087 1.1 skrll bfd_set_error (bfd_error_no_memory);
1088 1.1 skrll return NULL;
1089 1.1 skrll }
1090 1.1 skrll
1091 1.1 skrll if (*ptr == NULL)
1092 1.1 skrll /* We didn't find the entry and we're asked to create a new one. */
1093 1.1 skrll {
1094 1.1 skrll BFD_ASSERT (howto != MUST_FIND && howto != SEARCH);
1095 1.1 skrll
1096 1.1 skrll entry = bfd_alloc (elf_hash_table (info)->dynobj, sizeof (*entry));
1097 1.1 skrll if (entry == NULL)
1098 1.1 skrll return NULL;
1099 1.1 skrll
1100 1.1 skrll /* Initialize new entry. */
1101 1.1 skrll entry->key_ = *key;
1102 1.1 skrll
1103 1.1 skrll entry->u.s1.refcount = 0;
1104 1.1 skrll entry->u.s1.type = R_68K_GOT32O;
1105 1.1 skrll
1106 1.1 skrll *ptr = entry;
1107 1.1 skrll }
1108 1.1 skrll else
1109 1.1 skrll /* We found the entry. */
1110 1.1 skrll {
1111 1.1 skrll BFD_ASSERT (howto != MUST_CREATE);
1112 1.1 skrll
1113 1.1 skrll entry = *ptr;
1114 1.1 skrll }
1115 1.1 skrll
1116 1.1 skrll return entry;
1117 1.1 skrll }
1118 1.1 skrll
1119 1.1 skrll /* Update GOT counters when merging entry of WAS type with entry of NEW type.
1120 1.1 skrll Return the value to which ENTRY's type should be set. */
1121 1.1 skrll
1122 1.1 skrll static int
1123 1.1 skrll elf_m68k_update_got_entry_type (struct elf_m68k_got *got, int was, int new)
1124 1.1 skrll {
1125 1.1 skrll if (new == R_68K_GOT8O && was != R_68K_GOT8O)
1126 1.1 skrll /* NEW overrides WAS. */
1127 1.1 skrll {
1128 1.1 skrll ++got->rel_8o_n_entries;
1129 1.1 skrll
1130 1.1 skrll if (was != R_68K_GOT16O)
1131 1.1 skrll /* Update this counter too. */
1132 1.1 skrll ++got->rel_8o_16o_n_entries;
1133 1.1 skrll }
1134 1.1 skrll else if (new == R_68K_GOT16O && was != R_68K_GOT8O && was != R_68K_GOT16O)
1135 1.1 skrll /* NEW overrides WAS. */
1136 1.1 skrll ++got->rel_8o_16o_n_entries;
1137 1.1 skrll else
1138 1.1 skrll /* NEW doesn't override WAS. */
1139 1.1 skrll new = was;
1140 1.1 skrll
1141 1.1 skrll return new;
1142 1.1 skrll }
1143 1.1 skrll
1144 1.1 skrll /* Update GOT counters when removing an entry of type TYPE. */
1145 1.1 skrll
1146 1.1 skrll static void
1147 1.1 skrll elf_m68k_remove_got_entry_type (struct elf_m68k_got *got, int type)
1148 1.1 skrll {
1149 1.1 skrll switch (type)
1150 1.1 skrll {
1151 1.1 skrll case R_68K_GOT8O:
1152 1.1 skrll BFD_ASSERT (got->rel_8o_n_entries > 0);
1153 1.1 skrll
1154 1.1 skrll --got->rel_8o_n_entries;
1155 1.1 skrll /* FALLTHRU */
1156 1.1 skrll
1157 1.1 skrll case R_68K_GOT16O:
1158 1.1 skrll BFD_ASSERT (got->rel_8o_16o_n_entries >= got->rel_8o_n_entries);
1159 1.1 skrll
1160 1.1 skrll --got->rel_8o_16o_n_entries;
1161 1.1 skrll /* FALLTHRU */
1162 1.1 skrll
1163 1.1 skrll case R_68K_GOT32O:
1164 1.1 skrll break;
1165 1.1 skrll
1166 1.1 skrll default:
1167 1.1 skrll BFD_ASSERT (FALSE);
1168 1.1 skrll }
1169 1.1 skrll }
1170 1.1 skrll
1171 1.1 skrll /* Add new or update existing entry to GOT.
1172 1.1 skrll H, ABFD, TYPE and SYMNDX is data for the entry.
1173 1.1 skrll INFO is a context where memory should be allocated. */
1174 1.1 skrll
1175 1.1 skrll static struct elf_m68k_got_entry *
1176 1.1 skrll elf_m68k_add_entry_to_got (struct elf_m68k_got *got,
1177 1.1 skrll struct elf_link_hash_entry *h,
1178 1.1 skrll const bfd *abfd,
1179 1.1 skrll int type, unsigned long symndx,
1180 1.1 skrll struct bfd_link_info *info)
1181 1.1 skrll {
1182 1.1 skrll struct elf_m68k_got_entry_key key_;
1183 1.1 skrll struct elf_m68k_got_entry *entry;
1184 1.1 skrll
1185 1.1 skrll if (h != NULL && elf_m68k_hash_entry (h)->got_entry_key == 0)
1186 1.1 skrll elf_m68k_hash_entry (h)->got_entry_key
1187 1.1 skrll = elf_m68k_multi_got (info)->global_symndx++;
1188 1.1 skrll
1189 1.1 skrll elf_m68k_init_got_entry_key (&key_, h, abfd, symndx);
1190 1.1 skrll
1191 1.1 skrll entry = elf_m68k_get_got_entry (got, &key_, FIND_OR_CREATE, info);
1192 1.1 skrll if (entry == NULL)
1193 1.1 skrll return NULL;
1194 1.1 skrll
1195 1.1 skrll /* Update refcount. */
1196 1.1 skrll ++entry->u.s1.refcount;
1197 1.1 skrll
1198 1.1 skrll if (entry->u.s1.refcount == 1)
1199 1.1 skrll /* We see this entry for the first time. */
1200 1.1 skrll {
1201 1.1 skrll if (entry->key_.bfd != NULL)
1202 1.1 skrll ++got->local_n_entries;
1203 1.1 skrll }
1204 1.1 skrll
1205 1.1 skrll /* Determine entry's type and update got->rel_*_n_entries counters. */
1206 1.1 skrll entry->u.s1.type = elf_m68k_update_got_entry_type (got, entry->u.s1.type,
1207 1.1 skrll type);
1208 1.1 skrll
1209 1.1 skrll if ((got->rel_8o_n_entries
1210 1.1 skrll > ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT (info))
1211 1.1 skrll || (got->rel_8o_16o_n_entries
1212 1.1 skrll > ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT (info)))
1213 1.1 skrll /* This BFD has too many relocation. */
1214 1.1 skrll {
1215 1.1 skrll if (got->rel_8o_n_entries
1216 1.1 skrll > ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT (info))
1217 1.1 skrll (*_bfd_error_handler) (_("%B: GOT overflow: "
1218 1.1 skrll "Number of R_68K_GOT8O relocations > %d"),
1219 1.1 skrll abfd,
1220 1.1 skrll ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT (info));
1221 1.1 skrll else
1222 1.1 skrll (*_bfd_error_handler) (_("%B: GOT overflow: "
1223 1.1 skrll "Number of R_68K_GOT8O and R_68K_GOT16O "
1224 1.1 skrll "relocations > %d"),
1225 1.1 skrll abfd,
1226 1.1 skrll ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT (info));
1227 1.1 skrll
1228 1.1 skrll return NULL;
1229 1.1 skrll }
1230 1.1 skrll
1231 1.1 skrll return entry;
1232 1.1 skrll }
1233 1.1 skrll
1234 1.1 skrll /* Compute the hash value of the bfd in a bfd2got hash entry. */
1235 1.1 skrll
1236 1.1 skrll static hashval_t
1237 1.1 skrll elf_m68k_bfd2got_entry_hash (const void *entry)
1238 1.1 skrll {
1239 1.1 skrll const struct elf_m68k_bfd2got_entry *e;
1240 1.1 skrll
1241 1.1 skrll e = (const struct elf_m68k_bfd2got_entry *) entry;
1242 1.1 skrll
1243 1.1 skrll return e->bfd->id;
1244 1.1 skrll }
1245 1.1 skrll
1246 1.1 skrll /* Check whether two hash entries have the same bfd. */
1247 1.1 skrll
1248 1.1 skrll static int
1249 1.1 skrll elf_m68k_bfd2got_entry_eq (const void *entry1, const void *entry2)
1250 1.1 skrll {
1251 1.1 skrll const struct elf_m68k_bfd2got_entry *e1;
1252 1.1 skrll const struct elf_m68k_bfd2got_entry *e2;
1253 1.1 skrll
1254 1.1 skrll e1 = (const struct elf_m68k_bfd2got_entry *) entry1;
1255 1.1 skrll e2 = (const struct elf_m68k_bfd2got_entry *) entry2;
1256 1.1 skrll
1257 1.1 skrll return e1->bfd == e2->bfd;
1258 1.1 skrll }
1259 1.1 skrll
1260 1.1 skrll /* Destruct a bfd2got entry. */
1261 1.1 skrll
1262 1.1 skrll static void
1263 1.1 skrll elf_m68k_bfd2got_entry_del (void *_entry)
1264 1.1 skrll {
1265 1.1 skrll struct elf_m68k_bfd2got_entry *entry;
1266 1.1 skrll
1267 1.1 skrll entry = (struct elf_m68k_bfd2got_entry *) _entry;
1268 1.1 skrll
1269 1.1 skrll BFD_ASSERT (entry->got != NULL);
1270 1.1 skrll elf_m68k_clear_got (entry->got);
1271 1.1 skrll }
1272 1.1 skrll
1273 1.1 skrll /* Find existing or create new (depending on HOWTO) bfd2got entry in
1274 1.1 skrll MULTI_GOT. ABFD is the bfd we need a GOT for. INFO is a context where
1275 1.1 skrll memory should be allocated. */
1276 1.1 skrll
1277 1.1 skrll static struct elf_m68k_bfd2got_entry *
1278 1.1 skrll elf_m68k_get_bfd2got_entry (struct elf_m68k_multi_got *multi_got,
1279 1.1 skrll const bfd *abfd,
1280 1.1 skrll enum elf_m68k_get_entry_howto howto,
1281 1.1 skrll struct bfd_link_info *info)
1282 1.1 skrll {
1283 1.1 skrll struct elf_m68k_bfd2got_entry entry_;
1284 1.1 skrll void **ptr;
1285 1.1 skrll struct elf_m68k_bfd2got_entry *entry;
1286 1.1 skrll
1287 1.1 skrll BFD_ASSERT ((info == NULL) == (howto == SEARCH || howto == MUST_FIND));
1288 1.1 skrll
1289 1.1 skrll if (multi_got->bfd2got == NULL)
1290 1.1 skrll /* This is the first GOT. Initialize bfd2got. */
1291 1.1 skrll {
1292 1.1 skrll if (howto == SEARCH)
1293 1.1 skrll return NULL;
1294 1.1 skrll
1295 1.1 skrll multi_got->bfd2got = htab_try_create (1, elf_m68k_bfd2got_entry_hash,
1296 1.1 skrll elf_m68k_bfd2got_entry_eq,
1297 1.1 skrll elf_m68k_bfd2got_entry_del);
1298 1.1 skrll if (multi_got->bfd2got == NULL)
1299 1.1 skrll {
1300 1.1 skrll bfd_set_error (bfd_error_no_memory);
1301 1.1 skrll return NULL;
1302 1.1 skrll }
1303 1.1 skrll }
1304 1.1 skrll
1305 1.1 skrll entry_.bfd = abfd;
1306 1.1 skrll ptr = htab_find_slot (multi_got->bfd2got, &entry_, (howto != SEARCH
1307 1.1 skrll ? INSERT : NO_INSERT));
1308 1.1 skrll if (ptr == NULL)
1309 1.1 skrll {
1310 1.1 skrll if (howto == SEARCH)
1311 1.1 skrll /* Entry not found. */
1312 1.1 skrll return NULL;
1313 1.1 skrll
1314 1.1 skrll /* We're out of memory. */
1315 1.1 skrll bfd_set_error (bfd_error_no_memory);
1316 1.1 skrll return NULL;
1317 1.1 skrll }
1318 1.1 skrll
1319 1.1 skrll if (*ptr == NULL)
1320 1.1 skrll /* Entry was not found. Create new one. */
1321 1.1 skrll {
1322 1.1 skrll BFD_ASSERT (howto != MUST_FIND && howto != SEARCH);
1323 1.1 skrll
1324 1.1 skrll entry = ((struct elf_m68k_bfd2got_entry *)
1325 1.1 skrll bfd_alloc (elf_hash_table (info)->dynobj, sizeof (*entry)));
1326 1.1 skrll if (entry == NULL)
1327 1.1 skrll return NULL;
1328 1.1 skrll
1329 1.1 skrll entry->bfd = abfd;
1330 1.1 skrll
1331 1.1 skrll entry->got = elf_m68k_create_empty_got (info);
1332 1.1 skrll if (entry->got == NULL)
1333 1.1 skrll return NULL;
1334 1.1 skrll
1335 1.1 skrll *ptr = entry;
1336 1.1 skrll }
1337 1.1 skrll else
1338 1.1 skrll {
1339 1.1 skrll BFD_ASSERT (howto != MUST_CREATE);
1340 1.1 skrll
1341 1.1 skrll /* Return existing entry. */
1342 1.1 skrll entry = *ptr;
1343 1.1 skrll }
1344 1.1 skrll
1345 1.1 skrll return entry;
1346 1.1 skrll }
1347 1.1 skrll
1348 1.1 skrll struct elf_m68k_can_merge_gots_arg
1349 1.1 skrll {
1350 1.1 skrll /* A current_got that we constructing a DIFF against. */
1351 1.1 skrll struct elf_m68k_got *big;
1352 1.1 skrll
1353 1.1 skrll /* GOT holding entries not present or that should be changed in
1354 1.1 skrll BIG. */
1355 1.1 skrll struct elf_m68k_got *diff;
1356 1.1 skrll
1357 1.1 skrll /* Context where to allocate memory. */
1358 1.1 skrll struct bfd_link_info *info;
1359 1.1 skrll
1360 1.1 skrll /* Error flag. */
1361 1.1 skrll bfd_boolean error_p;
1362 1.1 skrll };
1363 1.1 skrll
1364 1.1 skrll /* Process a single entry from the small GOT to see if it should be added
1365 1.1 skrll or updated in the big GOT. */
1366 1.1 skrll
1367 1.1 skrll static int
1368 1.1 skrll elf_m68k_can_merge_gots_1 (void **_entry_ptr, void *_arg)
1369 1.1 skrll {
1370 1.1 skrll const struct elf_m68k_got_entry *entry1;
1371 1.1 skrll struct elf_m68k_can_merge_gots_arg *arg;
1372 1.1 skrll const struct elf_m68k_got_entry *entry2;
1373 1.1 skrll int type;
1374 1.1 skrll
1375 1.1 skrll entry1 = (const struct elf_m68k_got_entry *) *_entry_ptr;
1376 1.1 skrll arg = (struct elf_m68k_can_merge_gots_arg *) _arg;
1377 1.1 skrll
1378 1.1 skrll entry2 = elf_m68k_get_got_entry (arg->big, &entry1->key_, SEARCH, NULL);
1379 1.1 skrll
1380 1.1 skrll if (entry2 != NULL)
1381 1.1 skrll {
1382 1.1 skrll type = elf_m68k_update_got_entry_type (arg->diff, entry2->u.s1.type,
1383 1.1 skrll entry1->u.s1.type);
1384 1.1 skrll
1385 1.1 skrll if (type == entry2->u.s1.type)
1386 1.1 skrll /* ENTRY1 doesn't update data in ENTRY2. Skip it.
1387 1.1 skrll To skip creation of difference entry we use the type,
1388 1.1 skrll which we won't see in GOT entries for sure. */
1389 1.1 skrll type = R_68K_32;
1390 1.1 skrll }
1391 1.1 skrll else
1392 1.1 skrll {
1393 1.1 skrll BFD_ASSERT (entry1->u.s1.type != R_68K_32);
1394 1.1 skrll
1395 1.1 skrll type = elf_m68k_update_got_entry_type (arg->diff, R_68K_GOT32O,
1396 1.1 skrll entry1->u.s1.type);
1397 1.1 skrll
1398 1.1 skrll /* Update local counter. */
1399 1.1 skrll if (entry1->key_.bfd != NULL)
1400 1.1 skrll ++arg->diff->local_n_entries;
1401 1.1 skrll }
1402 1.1 skrll
1403 1.1 skrll if (type != R_68K_32)
1404 1.1 skrll /* Create an entry in DIFF. */
1405 1.1 skrll {
1406 1.1 skrll struct elf_m68k_got_entry *entry;
1407 1.1 skrll
1408 1.1 skrll entry = elf_m68k_get_got_entry (arg->diff, &entry1->key_, MUST_CREATE,
1409 1.1 skrll arg->info);
1410 1.1 skrll if (entry == NULL)
1411 1.1 skrll {
1412 1.1 skrll arg->error_p = TRUE;
1413 1.1 skrll return 0;
1414 1.1 skrll }
1415 1.1 skrll
1416 1.1 skrll entry->u.s1.type = type;
1417 1.1 skrll }
1418 1.1 skrll
1419 1.1 skrll return 1;
1420 1.1 skrll }
1421 1.1 skrll
1422 1.1 skrll /* Return TRUE if SMALL GOT can be added to BIG GOT without overflowing it.
1423 1.1 skrll Construct DIFF GOT holding the entries which should be added or updated
1424 1.1 skrll in BIG GOT to accumulate information from SMALL.
1425 1.1 skrll INFO is the context where memory should be allocated. */
1426 1.1 skrll
1427 1.1 skrll static bfd_boolean
1428 1.1 skrll elf_m68k_can_merge_gots (struct elf_m68k_got *big,
1429 1.1 skrll const struct elf_m68k_got *small,
1430 1.1 skrll struct bfd_link_info *info,
1431 1.1 skrll struct elf_m68k_got *diff)
1432 1.1 skrll {
1433 1.1 skrll struct elf_m68k_can_merge_gots_arg arg_;
1434 1.1 skrll
1435 1.1 skrll BFD_ASSERT (small->offset == (bfd_vma) -1);
1436 1.1 skrll
1437 1.1 skrll arg_.big = big;
1438 1.1 skrll arg_.diff = diff;
1439 1.1 skrll arg_.info = info;
1440 1.1 skrll arg_.error_p = FALSE;
1441 1.1 skrll htab_traverse_noresize (small->entries, elf_m68k_can_merge_gots_1, &arg_);
1442 1.1 skrll if (arg_.error_p)
1443 1.1 skrll {
1444 1.1 skrll diff->offset = 0;
1445 1.1 skrll return FALSE;
1446 1.1 skrll }
1447 1.1 skrll
1448 1.1 skrll /* Check for overflow. */
1449 1.1 skrll if ((big->rel_8o_n_entries + arg_.diff->rel_8o_n_entries
1450 1.1 skrll > ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT (info))
1451 1.1 skrll || (big->rel_8o_16o_n_entries + arg_.diff->rel_8o_16o_n_entries
1452 1.1 skrll > ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT (info)))
1453 1.1 skrll return FALSE;
1454 1.1 skrll
1455 1.1 skrll return TRUE;
1456 1.1 skrll }
1457 1.1 skrll
1458 1.1 skrll struct elf_m68k_merge_gots_arg
1459 1.1 skrll {
1460 1.1 skrll /* The BIG got. */
1461 1.1 skrll struct elf_m68k_got *big;
1462 1.1 skrll
1463 1.1 skrll /* Context where memory should be allocated. */
1464 1.1 skrll struct bfd_link_info *info;
1465 1.1 skrll
1466 1.1 skrll /* Error flag. */
1467 1.1 skrll bfd_boolean error_p;
1468 1.1 skrll };
1469 1.1 skrll
1470 1.1 skrll /* Process a single entry from DIFF got. Add or update corresponding
1471 1.1 skrll entry in the BIG got. */
1472 1.1 skrll
1473 1.1 skrll static int
1474 1.1 skrll elf_m68k_merge_gots_1 (void **entry_ptr, void *_arg)
1475 1.1 skrll {
1476 1.1 skrll const struct elf_m68k_got_entry *from;
1477 1.1 skrll struct elf_m68k_merge_gots_arg *arg;
1478 1.1 skrll struct elf_m68k_got_entry *to;
1479 1.1 skrll
1480 1.1 skrll from = (const struct elf_m68k_got_entry *) *entry_ptr;
1481 1.1 skrll arg = (struct elf_m68k_merge_gots_arg *) _arg;
1482 1.1 skrll
1483 1.1 skrll to = elf_m68k_get_got_entry (arg->big, &from->key_, FIND_OR_CREATE,
1484 1.1 skrll arg->info);
1485 1.1 skrll if (to == NULL)
1486 1.1 skrll {
1487 1.1 skrll arg->error_p = TRUE;
1488 1.1 skrll return 0;
1489 1.1 skrll }
1490 1.1 skrll
1491 1.1 skrll BFD_ASSERT (to->u.s1.refcount == 0);
1492 1.1 skrll /* All we need to merge is TYPE. */
1493 1.1 skrll to->u.s1.type = from->u.s1.type;
1494 1.1 skrll
1495 1.1 skrll return 1;
1496 1.1 skrll }
1497 1.1 skrll
1498 1.1 skrll /* Merge data from DIFF to BIG. INFO is context where memory should be
1499 1.1 skrll allocated. */
1500 1.1 skrll
1501 1.1 skrll static bfd_boolean
1502 1.1 skrll elf_m68k_merge_gots (struct elf_m68k_got *big,
1503 1.1 skrll struct elf_m68k_got *diff,
1504 1.1 skrll struct bfd_link_info *info)
1505 1.1 skrll {
1506 1.1 skrll if (diff->entries != NULL)
1507 1.1 skrll /* DIFF is not empty. Merge it into BIG GOT. */
1508 1.1 skrll {
1509 1.1 skrll struct elf_m68k_merge_gots_arg arg_;
1510 1.1 skrll
1511 1.1 skrll /* Merge entries. */
1512 1.1 skrll arg_.big = big;
1513 1.1 skrll arg_.info = info;
1514 1.1 skrll arg_.error_p = FALSE;
1515 1.1 skrll htab_traverse_noresize (diff->entries, elf_m68k_merge_gots_1, &arg_);
1516 1.1 skrll if (arg_.error_p)
1517 1.1 skrll return FALSE;
1518 1.1 skrll
1519 1.1 skrll /* Merge counters. */
1520 1.1 skrll big->rel_8o_n_entries += diff->rel_8o_n_entries;
1521 1.1 skrll big->rel_8o_16o_n_entries += diff->rel_8o_16o_n_entries;
1522 1.1 skrll big->local_n_entries += diff->local_n_entries;
1523 1.1 skrll }
1524 1.1 skrll else
1525 1.1 skrll /* DIFF is empty. */
1526 1.1 skrll {
1527 1.1 skrll BFD_ASSERT (diff->rel_8o_n_entries == 0);
1528 1.1 skrll BFD_ASSERT (diff->rel_8o_16o_n_entries == 0);
1529 1.1 skrll BFD_ASSERT (diff->local_n_entries == 0);
1530 1.1 skrll }
1531 1.1 skrll
1532 1.1 skrll BFD_ASSERT (!elf_m68k_hash_table (info)->allow_multigot_p
1533 1.1 skrll || ((big->rel_8o_n_entries
1534 1.1 skrll <= ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT (info))
1535 1.1 skrll && (big->rel_8o_16o_n_entries
1536 1.1 skrll <= ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT (info))));
1537 1.1 skrll
1538 1.1 skrll return TRUE;
1539 1.1 skrll }
1540 1.1 skrll
1541 1.1 skrll struct elf_m68k_finalize_got_offsets_arg
1542 1.1 skrll {
1543 1.1 skrll /* Offset for the next R_68K_GOT8O entry. */
1544 1.1 skrll bfd_vma rel_8o_offset;
1545 1.1 skrll
1546 1.1 skrll /* Offset for the next R_68K_GOT16O entry. */
1547 1.1 skrll bfd_vma rel_16o_offset;
1548 1.1 skrll
1549 1.1 skrll /* Offset for the next R_68K_GOT32O entry. */
1550 1.1 skrll bfd_vma rel_32o_offset;
1551 1.1 skrll
1552 1.1 skrll /* Should we use negative (relative to GP) offsets for GOT entries. */
1553 1.1 skrll bfd_boolean use_neg_got_offsets_p;
1554 1.1 skrll
1555 1.1 skrll /* Offset of this GOT relative to .got section. */
1556 1.1 skrll bfd_vma got_offset;
1557 1.1 skrll
1558 1.1 skrll /* Mapping from global symndx to global symbols.
1559 1.1 skrll This is used to build lists of got entries for global symbols. */
1560 1.1 skrll struct elf_m68k_link_hash_entry **symndx2h;
1561 1.1 skrll };
1562 1.1 skrll
1563 1.1 skrll /* Assign ENTRY an offset. Build list of GOT entries for global symbols
1564 1.1 skrll along the way. */
1565 1.1 skrll
1566 1.1 skrll static int
1567 1.1 skrll elf_m68k_finalize_got_offsets_1 (void **entry_ptr, void *_arg)
1568 1.1 skrll {
1569 1.1 skrll struct elf_m68k_got_entry *entry;
1570 1.1 skrll struct elf_m68k_finalize_got_offsets_arg *arg;
1571 1.1 skrll
1572 1.1 skrll entry = (struct elf_m68k_got_entry *) *entry_ptr;
1573 1.1 skrll arg = (struct elf_m68k_finalize_got_offsets_arg *) _arg;
1574 1.1 skrll
1575 1.1 skrll /* This should be a fresh entry created in elf_m68k_can_merge_gots. */
1576 1.1 skrll BFD_ASSERT (entry->u.s1.refcount == 0);
1577 1.1 skrll
1578 1.1 skrll switch (entry->u.s1.type)
1579 1.1 skrll {
1580 1.1 skrll case R_68K_GOT8O:
1581 1.1 skrll entry->u.s2.offset = arg->rel_8o_offset;
1582 1.1 skrll
1583 1.1 skrll if (arg->use_neg_got_offsets_p)
1584 1.1 skrll {
1585 1.1 skrll if (arg->rel_8o_offset >= arg->got_offset)
1586 1.1 skrll /* We've assigned a positive offset to this entry,
1587 1.1 skrll next entry should get (-abs(offset) - 4). */
1588 1.1 skrll arg->rel_8o_offset = (arg->got_offset
1589 1.1 skrll - (arg->rel_8o_offset - arg->got_offset)
1590 1.1 skrll - 4);
1591 1.1 skrll else
1592 1.1 skrll /* We've assigned a negative offset to this entry,
1593 1.1 skrll next entry should get (+abs(offset) + 0). */
1594 1.1 skrll arg->rel_8o_offset = (arg->got_offset
1595 1.1 skrll + (arg->got_offset - arg->rel_8o_offset));
1596 1.1 skrll }
1597 1.1 skrll else
1598 1.1 skrll /* Next entry will simply get next offset. */
1599 1.1 skrll arg->rel_8o_offset += 4;
1600 1.1 skrll
1601 1.1 skrll break;
1602 1.1 skrll
1603 1.1 skrll case R_68K_GOT16O:
1604 1.1 skrll entry->u.s2.offset = arg->rel_16o_offset;
1605 1.1 skrll
1606 1.1 skrll if (arg->use_neg_got_offsets_p)
1607 1.1 skrll {
1608 1.1 skrll if (arg->rel_16o_offset >= arg->got_offset)
1609 1.1 skrll /* We've assigned a positive offset to this entry,
1610 1.1 skrll next entry should get (-abs(offset) - 4). */
1611 1.1 skrll arg->rel_16o_offset = (arg->got_offset
1612 1.1 skrll - (arg->rel_16o_offset - arg->got_offset)
1613 1.1 skrll - 4);
1614 1.1 skrll else
1615 1.1 skrll /* We've assigned a negative offset to this entry,
1616 1.1 skrll next entry should get (+abs(offset) + 0). */
1617 1.1 skrll arg->rel_16o_offset = (arg->got_offset
1618 1.1 skrll + (arg->got_offset - arg->rel_16o_offset));
1619 1.1 skrll }
1620 1.1 skrll else
1621 1.1 skrll /* Next entry will simply get next offset. */
1622 1.1 skrll arg->rel_16o_offset += 4;
1623 1.1 skrll
1624 1.1 skrll break;
1625 1.1 skrll
1626 1.1 skrll case R_68K_GOT32O:
1627 1.1 skrll entry->u.s2.offset = arg->rel_32o_offset;
1628 1.1 skrll
1629 1.1 skrll if (arg->use_neg_got_offsets_p)
1630 1.1 skrll {
1631 1.1 skrll if (arg->rel_32o_offset >= arg->got_offset)
1632 1.1 skrll /* We've assigned a positive offset to this entry,
1633 1.1 skrll next entry should get (-abs(offset) - 4). */
1634 1.1 skrll arg->rel_32o_offset = (arg->got_offset
1635 1.1 skrll - (arg->rel_32o_offset - arg->got_offset)
1636 1.1 skrll - 4);
1637 1.1 skrll else
1638 1.1 skrll /* We've assigned a negative offset to this entry,
1639 1.1 skrll next entry should get (+abs(offset) + 0). */
1640 1.1 skrll arg->rel_32o_offset = (arg->got_offset
1641 1.1 skrll + (arg->got_offset - arg->rel_32o_offset));
1642 1.1 skrll }
1643 1.1 skrll else
1644 1.1 skrll /* Next entry will simply get next offset. */
1645 1.1 skrll arg->rel_32o_offset += 4;
1646 1.1 skrll
1647 1.1 skrll break;
1648 1.1 skrll
1649 1.1 skrll default:
1650 1.1 skrll BFD_ASSERT (FALSE);
1651 1.1 skrll break;
1652 1.1 skrll }
1653 1.1 skrll
1654 1.1 skrll if (entry->key_.bfd == NULL)
1655 1.1 skrll /* Hook up this entry into the list of got_entries of H. */
1656 1.1 skrll {
1657 1.1 skrll struct elf_m68k_link_hash_entry *h;
1658 1.1 skrll
1659 1.1 skrll BFD_ASSERT (entry->key_.symndx != 0);
1660 1.1 skrll h = arg->symndx2h[entry->key_.symndx];
1661 1.1 skrll BFD_ASSERT (h != NULL);
1662 1.1 skrll
1663 1.1 skrll entry->u.s2.next = h->glist;
1664 1.1 skrll h->glist = entry;
1665 1.1 skrll }
1666 1.1 skrll else
1667 1.1 skrll /* This entry is for local symbol. */
1668 1.1 skrll entry->u.s2.next = NULL;
1669 1.1 skrll
1670 1.1 skrll return 1;
1671 1.1 skrll }
1672 1.1 skrll
1673 1.1 skrll /* Assign offsets within GOT. USE_NEG_GOT_OFFSETS_P indicates if we
1674 1.1 skrll should use negative offsets.
1675 1.1 skrll Build list of GOT entries for global symbols along the way.
1676 1.1 skrll SYMNDX2H is mapping from global symbol indices to actual
1677 1.1 skrll global symbols. */
1678 1.1 skrll
1679 1.1 skrll static void
1680 1.1 skrll elf_m68k_finalize_got_offsets (struct elf_m68k_got *got,
1681 1.1 skrll bfd_boolean use_neg_got_offsets_p,
1682 1.1 skrll struct elf_m68k_link_hash_entry **symndx2h)
1683 1.1 skrll {
1684 1.1 skrll struct elf_m68k_finalize_got_offsets_arg arg_;
1685 1.1 skrll
1686 1.1 skrll BFD_ASSERT (got->offset != (bfd_vma) -1);
1687 1.1 skrll
1688 1.1 skrll /* We set entry offsets relative to the .got section (and not the
1689 1.1 skrll start of a particular GOT), so that we can use them in
1690 1.1 skrll finish_dynamic_symbol without needing to know the GOT they come
1691 1.1 skrll from. */
1692 1.1 skrll
1693 1.1 skrll if (use_neg_got_offsets_p)
1694 1.1 skrll {
1695 1.1 skrll size_t n;
1696 1.1 skrll
1697 1.1 skrll /* Put GOT pointer in the middle of GOT. */
1698 1.1 skrll n = htab_elements (got->entries);
1699 1.1 skrll if ((n & 1) == 0)
1700 1.1 skrll /* Even number of GOT entries. */
1701 1.1 skrll got->offset += 2 * n;
1702 1.1 skrll else
1703 1.1 skrll /* Odd number of GOT entries. */
1704 1.1 skrll got->offset += 2 * (n - 1);
1705 1.1 skrll
1706 1.1 skrll /* R_68K_GOT8O entries shall start at GOT offset. */
1707 1.1 skrll arg_.rel_8o_offset = got->offset;
1708 1.1 skrll
1709 1.1 skrll n = got->rel_8o_n_entries;
1710 1.1 skrll if ((n & 1) == 0)
1711 1.1 skrll /* Even number of R_68K_GOT8O entries.
1712 1.1 skrll The last R_68K_GOT8O entry will be at
1713 1.1 skrll (got->offset - 2 * n). Hence the first R_68K_GOT16O
1714 1.1 skrll entry will be at offset ... */
1715 1.1 skrll arg_.rel_16o_offset = got->offset + 2 * n;
1716 1.1 skrll else
1717 1.1 skrll /* Odd number of R_68K_GOT8O entries.
1718 1.1 skrll The last R_68K_GOT8O entry will be at
1719 1.1 skrll (got->offset + 2 * (n - 1)). Hence the first R_68K_GOT16O
1720 1.1 skrll entry will be at offset ... */
1721 1.1 skrll arg_.rel_16o_offset = got->offset - 2 * (n - 1) - 4;
1722 1.1 skrll
1723 1.1 skrll n = got->rel_8o_16o_n_entries;
1724 1.1 skrll if ((n & 1) == 0)
1725 1.1 skrll /* Even number of R_68K_GOT8O and R_68K_GOT16O entries.
1726 1.1 skrll The last R_68K_GOT8O entry will be at
1727 1.1 skrll (got->offset - 2 * n). Hence the first R_68K_GOT32O
1728 1.1 skrll entry will be at offset ... */
1729 1.1 skrll arg_.rel_32o_offset = got->offset + 2 * n;
1730 1.1 skrll else
1731 1.1 skrll /* Odd number of R_68K_GOT8O and R_68K_GOT16O entries.
1732 1.1 skrll The last R_68K_GOT16O entry will be at
1733 1.1 skrll (got->offset + 2 * (n - 1)). Hence the first R_68K_GOT32O
1734 1.1 skrll entry will be at offset ... */
1735 1.1 skrll arg_.rel_32o_offset = got->offset - 2 * (n - 1) - 4;
1736 1.1 skrll
1737 1.1 skrll arg_.use_neg_got_offsets_p = TRUE;
1738 1.1 skrll
1739 1.1 skrll arg_.got_offset = got->offset;
1740 1.1 skrll }
1741 1.1 skrll else
1742 1.1 skrll {
1743 1.1 skrll arg_.rel_8o_offset = got->offset;
1744 1.1 skrll arg_.rel_16o_offset = 4 * got->rel_8o_n_entries + got->offset;
1745 1.1 skrll arg_.rel_32o_offset = 4 * got->rel_8o_16o_n_entries + got->offset;
1746 1.1 skrll
1747 1.1 skrll arg_.use_neg_got_offsets_p = FALSE;
1748 1.1 skrll
1749 1.1 skrll /* This shouldn't be used. */
1750 1.1 skrll arg_.got_offset = (bfd_vma) -1;
1751 1.1 skrll }
1752 1.1 skrll
1753 1.1 skrll arg_.symndx2h = symndx2h;
1754 1.1 skrll
1755 1.1 skrll htab_traverse (got->entries, elf_m68k_finalize_got_offsets_1, &arg_);
1756 1.1 skrll
1757 1.1 skrll /* Calculate offset ranges we have actually assigned. */
1758 1.1 skrll if (use_neg_got_offsets_p)
1759 1.1 skrll {
1760 1.1 skrll if (arg_.rel_8o_offset == (bfd_vma) -4
1761 1.1 skrll || arg_.rel_8o_offset < got->offset)
1762 1.1 skrll arg_.rel_8o_offset = 2 * (got->offset - arg_.rel_8o_offset) - 4;
1763 1.1 skrll else
1764 1.1 skrll arg_.rel_8o_offset = 2 * (arg_.rel_8o_offset - got->offset);
1765 1.1 skrll
1766 1.1 skrll if (arg_.rel_16o_offset == (bfd_vma) -4
1767 1.1 skrll || arg_.rel_16o_offset < got->offset)
1768 1.1 skrll arg_.rel_16o_offset = 2 * (got->offset - arg_.rel_16o_offset) - 4;
1769 1.1 skrll else
1770 1.1 skrll arg_.rel_16o_offset = 2 * (arg_.rel_16o_offset - got->offset);
1771 1.1 skrll
1772 1.1 skrll if (arg_.rel_32o_offset == (bfd_vma) -4
1773 1.1 skrll || arg_.rel_32o_offset < got->offset)
1774 1.1 skrll arg_.rel_32o_offset = 2 * (got->offset - arg_.rel_32o_offset) - 4;
1775 1.1 skrll else
1776 1.1 skrll arg_.rel_32o_offset = 2 * (arg_.rel_32o_offset - got->offset);
1777 1.1 skrll }
1778 1.1 skrll else
1779 1.1 skrll {
1780 1.1 skrll arg_.rel_8o_offset -= got->offset;
1781 1.1 skrll arg_.rel_16o_offset -= got->offset;
1782 1.1 skrll arg_.rel_32o_offset -= got->offset;
1783 1.1 skrll }
1784 1.1 skrll
1785 1.1 skrll /* These asserts check that we got counting of entries right. */
1786 1.1 skrll BFD_ASSERT (arg_.rel_8o_offset == 4 * got->rel_8o_n_entries);
1787 1.1 skrll BFD_ASSERT (arg_.rel_16o_offset == 4 * got->rel_8o_16o_n_entries);
1788 1.1 skrll BFD_ASSERT (arg_.rel_32o_offset == 4 * htab_elements (got->entries));
1789 1.1 skrll }
1790 1.1 skrll
1791 1.1 skrll struct elf_m68k_partition_multi_got_arg
1792 1.1 skrll {
1793 1.1 skrll /* The GOT we are adding entries to. Aka big got. */
1794 1.1 skrll struct elf_m68k_got *current_got;
1795 1.1 skrll
1796 1.1 skrll /* Offset to assign the next CURRENT_GOT. */
1797 1.1 skrll bfd_vma offset;
1798 1.1 skrll
1799 1.1 skrll /* Context where memory should be allocated. */
1800 1.1 skrll struct bfd_link_info *info;
1801 1.1 skrll
1802 1.1 skrll /* Total number of entries in the .got section.
1803 1.1 skrll This is used to calculate size of the .got and .rela.got sections. */
1804 1.1 skrll bfd_vma n_entries;
1805 1.1 skrll
1806 1.1 skrll /* Total number of local entries in the .got section.
1807 1.1 skrll This is used to calculate size of the .rela.got section. */
1808 1.1 skrll bfd_vma local_n_entries;
1809 1.1 skrll
1810 1.1 skrll /* Error flag. */
1811 1.1 skrll bfd_boolean error_p;
1812 1.1 skrll
1813 1.1 skrll /* Mapping from global symndx to global symbols.
1814 1.1 skrll This is used to build lists of got entries for global symbols. */
1815 1.1 skrll struct elf_m68k_link_hash_entry **symndx2h;
1816 1.1 skrll };
1817 1.1 skrll
1818 1.1 skrll /* Process a single BFD2GOT entry and either merge GOT to CURRENT_GOT
1819 1.1 skrll or start a new CURRENT_GOT. */
1820 1.1 skrll
1821 1.1 skrll static int
1822 1.1 skrll elf_m68k_partition_multi_got_1 (void **_entry, void *_arg)
1823 1.1 skrll {
1824 1.1 skrll struct elf_m68k_bfd2got_entry *entry;
1825 1.1 skrll struct elf_m68k_partition_multi_got_arg *arg;
1826 1.1 skrll struct elf_m68k_got *got;
1827 1.1 skrll struct elf_m68k_got *current_got;
1828 1.1 skrll struct elf_m68k_got diff_;
1829 1.1 skrll struct elf_m68k_got *diff;
1830 1.1 skrll
1831 1.1 skrll entry = (struct elf_m68k_bfd2got_entry *) *_entry;
1832 1.1 skrll arg = (struct elf_m68k_partition_multi_got_arg *) _arg;
1833 1.1 skrll
1834 1.1 skrll got = entry->got;
1835 1.1 skrll BFD_ASSERT (got != NULL);
1836 1.1 skrll BFD_ASSERT (got->offset == (bfd_vma) -1);
1837 1.1 skrll
1838 1.1 skrll diff = NULL;
1839 1.1 skrll
1840 1.1 skrll if (arg->current_got != NULL)
1841 1.1 skrll /* Construct diff. */
1842 1.1 skrll {
1843 1.1 skrll diff = &diff_;
1844 1.1 skrll elf_m68k_init_got (diff, NULL, 0, 0, 0, (bfd_vma) -1);
1845 1.1 skrll
1846 1.1 skrll if (!elf_m68k_can_merge_gots (arg->current_got, got, arg->info, diff))
1847 1.1 skrll {
1848 1.1 skrll if (diff->offset == 0)
1849 1.1 skrll /* Offset set to 0 in the diff_ indicates an error. */
1850 1.1 skrll {
1851 1.1 skrll arg->error_p = TRUE;
1852 1.1 skrll goto final_return;
1853 1.1 skrll }
1854 1.1 skrll
1855 1.1 skrll if (elf_m68k_hash_table (arg->info)->allow_multigot_p)
1856 1.1 skrll {
1857 1.1 skrll elf_m68k_clear_got (diff);
1858 1.1 skrll /* Schedule to finish up CURRENT_GOT and start new one. */
1859 1.1 skrll diff = NULL;
1860 1.1 skrll }
1861 1.1 skrll /* else
1862 1.1 skrll Merge GOTs no matter what. If big GOT overflows,
1863 1.1 skrll we'll fail in relocate_section due to truncated relocations.
1864 1.1 skrll
1865 1.1 skrll ??? May be fail earlier? E.g., in can_merge_gots. */
1866 1.1 skrll }
1867 1.1 skrll }
1868 1.1 skrll else
1869 1.1 skrll /* Diff of got against empty current_got is got itself. */
1870 1.1 skrll {
1871 1.1 skrll /* Create empty CURRENT_GOT to subsequent GOTs to. */
1872 1.1 skrll arg->current_got = elf_m68k_create_empty_got (arg->info);
1873 1.1 skrll if (arg->current_got == NULL)
1874 1.1 skrll {
1875 1.1 skrll arg->error_p = TRUE;
1876 1.1 skrll goto final_return;
1877 1.1 skrll }
1878 1.1 skrll
1879 1.1 skrll arg->current_got->offset = arg->offset;
1880 1.1 skrll
1881 1.1 skrll diff = got;
1882 1.1 skrll }
1883 1.1 skrll
1884 1.1 skrll current_got = arg->current_got;
1885 1.1 skrll
1886 1.1 skrll if (diff != NULL)
1887 1.1 skrll {
1888 1.1 skrll if (!elf_m68k_merge_gots (current_got, diff, arg->info))
1889 1.1 skrll {
1890 1.1 skrll arg->error_p = TRUE;
1891 1.1 skrll goto final_return;
1892 1.1 skrll }
1893 1.1 skrll
1894 1.1 skrll /* Now we can free GOT. */
1895 1.1 skrll elf_m68k_clear_got (got);
1896 1.1 skrll
1897 1.1 skrll entry->got = current_got;
1898 1.1 skrll }
1899 1.1 skrll else
1900 1.1 skrll {
1901 1.1 skrll /* Schedule to start a new current_got. */
1902 1.1 skrll arg->current_got = NULL;
1903 1.1 skrll arg->offset = (current_got->offset
1904 1.1 skrll + 4 * htab_elements (current_got->entries));
1905 1.1 skrll
1906 1.1 skrll /* Finish up current_got. */
1907 1.1 skrll {
1908 1.1 skrll elf_m68k_finalize_got_offsets (current_got,
1909 1.1 skrll elf_m68k_hash_table (arg->info)
1910 1.1 skrll ->use_neg_got_offsets_p,
1911 1.1 skrll arg->symndx2h);
1912 1.1 skrll
1913 1.1 skrll arg->n_entries += htab_elements (current_got->entries);
1914 1.1 skrll arg->local_n_entries += current_got->local_n_entries;
1915 1.1 skrll
1916 1.1 skrll BFD_ASSERT (arg->local_n_entries <= arg->n_entries);
1917 1.1 skrll }
1918 1.1 skrll
1919 1.1 skrll /* Retry. */
1920 1.1 skrll if (!elf_m68k_partition_multi_got_1 (_entry, _arg))
1921 1.1 skrll {
1922 1.1 skrll BFD_ASSERT (arg->error_p);
1923 1.1 skrll goto final_return;
1924 1.1 skrll }
1925 1.1 skrll }
1926 1.1 skrll
1927 1.1 skrll final_return:
1928 1.1 skrll if (diff != NULL)
1929 1.1 skrll elf_m68k_clear_got (diff);
1930 1.1 skrll
1931 1.1 skrll return arg->error_p == FALSE ? 1 : 0;
1932 1.1 skrll }
1933 1.1 skrll
1934 1.1 skrll /* Helper function to build symndx2h mapping. */
1935 1.1 skrll
1936 1.1 skrll static bfd_boolean
1937 1.1 skrll elf_m68k_init_symndx2h_1 (struct elf_link_hash_entry *_h,
1938 1.1 skrll void *_arg)
1939 1.1 skrll {
1940 1.1 skrll struct elf_m68k_link_hash_entry *h;
1941 1.1 skrll
1942 1.1 skrll h = elf_m68k_hash_entry (_h);
1943 1.1 skrll
1944 1.1 skrll if (h->got_entry_key != 0)
1945 1.1 skrll /* H has at least one entry in the GOT. */
1946 1.1 skrll {
1947 1.1 skrll struct elf_m68k_partition_multi_got_arg *arg;
1948 1.1 skrll
1949 1.1 skrll arg = (struct elf_m68k_partition_multi_got_arg *) _arg;
1950 1.1 skrll
1951 1.1 skrll BFD_ASSERT (arg->symndx2h[h->got_entry_key] == NULL);
1952 1.1 skrll arg->symndx2h[h->got_entry_key] = h;
1953 1.1 skrll }
1954 1.1 skrll
1955 1.1 skrll return TRUE;
1956 1.1 skrll }
1957 1.1 skrll
1958 1.1 skrll /* Merge GOTs of some BFDs, assign offsets to GOT entries and build
1959 1.1 skrll lists of GOT entries for global symbols.
1960 1.1 skrll Calculate sizes of .got and .rela.got sections. */
1961 1.1 skrll
1962 1.1 skrll static bfd_boolean
1963 1.1 skrll elf_m68k_partition_multi_got (struct bfd_link_info *info)
1964 1.1 skrll {
1965 1.1 skrll struct elf_m68k_multi_got *multi_got;
1966 1.1 skrll struct elf_m68k_partition_multi_got_arg arg_;
1967 1.1 skrll
1968 1.1 skrll multi_got = elf_m68k_multi_got (info);
1969 1.1 skrll
1970 1.1 skrll arg_.current_got = NULL;
1971 1.1 skrll arg_.offset = 0;
1972 1.1 skrll arg_.info = info;
1973 1.1 skrll arg_.n_entries = 0;
1974 1.1 skrll arg_.local_n_entries = 0;
1975 1.1 skrll arg_.error_p = FALSE;
1976 1.1 skrll
1977 1.1 skrll if (multi_got->bfd2got != NULL)
1978 1.1 skrll {
1979 1.1 skrll /* Initialize symndx2h mapping. */
1980 1.1 skrll {
1981 1.1 skrll arg_.symndx2h = bfd_zmalloc (multi_got->global_symndx
1982 1.1 skrll * sizeof (*arg_.symndx2h));
1983 1.1 skrll if (arg_.symndx2h == NULL)
1984 1.1 skrll return FALSE;
1985 1.1 skrll
1986 1.1 skrll elf_link_hash_traverse (elf_hash_table (info),
1987 1.1 skrll elf_m68k_init_symndx2h_1, &arg_);
1988 1.1 skrll }
1989 1.1 skrll
1990 1.1 skrll /* Partition. */
1991 1.1 skrll htab_traverse (multi_got->bfd2got, elf_m68k_partition_multi_got_1,
1992 1.1 skrll &arg_);
1993 1.1 skrll if (arg_.error_p)
1994 1.1 skrll {
1995 1.1 skrll free (arg_.symndx2h);
1996 1.1 skrll arg_.symndx2h = NULL;
1997 1.1 skrll
1998 1.1 skrll return FALSE;
1999 1.1 skrll }
2000 1.1 skrll
2001 1.1 skrll /* Finish up last current_got. */
2002 1.1 skrll {
2003 1.1 skrll elf_m68k_finalize_got_offsets (arg_.current_got,
2004 1.1 skrll elf_m68k_hash_table (info)
2005 1.1 skrll ->use_neg_got_offsets_p, arg_.symndx2h);
2006 1.1 skrll
2007 1.1 skrll arg_.n_entries += htab_elements (arg_.current_got->entries);
2008 1.1 skrll arg_.local_n_entries += arg_.current_got->local_n_entries;
2009 1.1 skrll
2010 1.1 skrll BFD_ASSERT (arg_.local_n_entries <= arg_.n_entries);
2011 1.1 skrll }
2012 1.1 skrll
2013 1.1 skrll free (arg_.symndx2h);
2014 1.1 skrll }
2015 1.1 skrll
2016 1.1 skrll if (elf_hash_table (info)->dynobj != NULL)
2017 1.1 skrll /* Set sizes of .got and .rela.got sections. */
2018 1.1 skrll {
2019 1.1 skrll asection *s;
2020 1.1 skrll
2021 1.1 skrll s = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ".got");
2022 1.1 skrll if (s != NULL)
2023 1.1 skrll s->size = arg_.n_entries * 4;
2024 1.1 skrll else
2025 1.1 skrll BFD_ASSERT (arg_.n_entries == 0);
2026 1.1 skrll
2027 1.1 skrll /* If we are generating a shared object, we need to
2028 1.1 skrll output a R_68K_RELATIVE reloc so that the dynamic
2029 1.1 skrll linker can adjust this GOT entry. Overwise we
2030 1.1 skrll don't need space in .rela.got for local symbols. */
2031 1.1 skrll if (!info->shared)
2032 1.1 skrll {
2033 1.1 skrll BFD_ASSERT (arg_.local_n_entries <= arg_.n_entries);
2034 1.1 skrll arg_.n_entries -= arg_.local_n_entries;
2035 1.1 skrll }
2036 1.1 skrll
2037 1.1 skrll s = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ".rela.got");
2038 1.1 skrll if (s != NULL)
2039 1.1 skrll s->size = arg_.n_entries * sizeof (Elf32_External_Rela);
2040 1.1 skrll else
2041 1.1 skrll BFD_ASSERT (arg_.n_entries == 0);
2042 1.1 skrll }
2043 1.1 skrll else
2044 1.1 skrll BFD_ASSERT (multi_got->bfd2got == NULL);
2045 1.1 skrll
2046 1.1 skrll return TRUE;
2047 1.1 skrll }
2048 1.1 skrll
2049 1.1 skrll /* Specialized version of elf_m68k_get_got_entry that returns pointer
2050 1.1 skrll to hashtable slot, thus allowing removal of entry via
2051 1.1 skrll elf_m68k_remove_got_entry. */
2052 1.1 skrll
2053 1.1 skrll static struct elf_m68k_got_entry **
2054 1.1 skrll elf_m68k_find_got_entry_ptr (struct elf_m68k_got *got,
2055 1.1 skrll struct elf_m68k_got_entry_key *key)
2056 1.1 skrll {
2057 1.1 skrll void **ptr;
2058 1.1 skrll struct elf_m68k_got_entry entry_;
2059 1.1 skrll struct elf_m68k_got_entry **entry_ptr;
2060 1.1 skrll
2061 1.1 skrll entry_.key_ = *key;
2062 1.1 skrll ptr = htab_find_slot (got->entries, &entry_, NO_INSERT);
2063 1.1 skrll BFD_ASSERT (ptr != NULL);
2064 1.1 skrll
2065 1.1 skrll entry_ptr = (struct elf_m68k_got_entry **) ptr;
2066 1.1 skrll
2067 1.1 skrll return entry_ptr;
2068 1.1 skrll }
2069 1.1 skrll
2070 1.1 skrll /* Remove entry pointed to by ENTRY_PTR from GOT. */
2071 1.1 skrll
2072 1.1 skrll static void
2073 1.1 skrll elf_m68k_remove_got_entry (struct elf_m68k_got *got,
2074 1.1 skrll struct elf_m68k_got_entry **entry_ptr)
2075 1.1 skrll {
2076 1.1 skrll struct elf_m68k_got_entry *entry;
2077 1.1 skrll
2078 1.1 skrll entry = *entry_ptr;
2079 1.1 skrll
2080 1.1 skrll /* Check that offsets have not been finalized yet. */
2081 1.1 skrll BFD_ASSERT (got->offset == (bfd_vma) -1);
2082 1.1 skrll /* Check that this entry is indeed unused. */
2083 1.1 skrll BFD_ASSERT (entry->u.s1.refcount == 0);
2084 1.1 skrll
2085 1.1 skrll elf_m68k_remove_got_entry_type (got, entry->u.s1.type);
2086 1.1 skrll
2087 1.1 skrll if (entry->key_.bfd != NULL)
2088 1.1 skrll --got->local_n_entries;
2089 1.1 skrll
2090 1.1 skrll htab_clear_slot (got->entries, (void **) entry_ptr);
2091 1.1 skrll }
2092 1.1 skrll
2093 1.1 skrll /* Copy any information related to dynamic linking from a pre-existing
2094 1.1 skrll symbol to a newly created symbol. Also called to copy flags and
2095 1.1 skrll other back-end info to a weakdef, in which case the symbol is not
2096 1.1 skrll newly created and plt/got refcounts and dynamic indices should not
2097 1.1 skrll be copied. */
2098 1.1 skrll
2099 1.1 skrll static void
2100 1.1 skrll elf_m68k_copy_indirect_symbol (struct bfd_link_info *info,
2101 1.1 skrll struct elf_link_hash_entry *_dir,
2102 1.1 skrll struct elf_link_hash_entry *_ind)
2103 1.1 skrll {
2104 1.1 skrll struct elf_m68k_link_hash_entry *dir;
2105 1.1 skrll struct elf_m68k_link_hash_entry *ind;
2106 1.1 skrll
2107 1.1 skrll _bfd_elf_link_hash_copy_indirect (info, _dir, _ind);
2108 1.1 skrll
2109 1.1 skrll if (_ind->root.type != bfd_link_hash_indirect)
2110 1.1 skrll return;
2111 1.1 skrll
2112 1.1 skrll dir = elf_m68k_hash_entry (_dir);
2113 1.1 skrll ind = elf_m68k_hash_entry (_ind);
2114 1.1 skrll
2115 1.1 skrll /* We might have a direct symbol already having entries in the GOTs.
2116 1.1 skrll Update its key only in case indirect symbol has GOT entries and
2117 1.1 skrll assert that both indirect and direct symbols don't have GOT entries
2118 1.1 skrll at the same time. */
2119 1.1 skrll if (ind->got_entry_key != 0)
2120 1.1 skrll {
2121 1.1 skrll BFD_ASSERT (dir->got_entry_key == 0);
2122 1.1 skrll /* Assert that GOTs aren't partioned yet. */
2123 1.1 skrll BFD_ASSERT (ind->glist == NULL);
2124 1.1 skrll
2125 1.1 skrll dir->got_entry_key = ind->got_entry_key;
2126 1.1 skrll ind->got_entry_key = 0;
2127 1.1 skrll }
2128 1.1 skrll }
2129 1.1 skrll
2130 1.1 skrll /* Look through the relocs for a section during the first phase, and
2131 1.1 skrll allocate space in the global offset table or procedure linkage
2132 1.1 skrll table. */
2133 1.1 skrll
2134 1.1 skrll static bfd_boolean
2135 1.1 skrll elf_m68k_check_relocs (abfd, info, sec, relocs)
2136 1.1 skrll bfd *abfd;
2137 1.1 skrll struct bfd_link_info *info;
2138 1.1 skrll asection *sec;
2139 1.1 skrll const Elf_Internal_Rela *relocs;
2140 1.1 skrll {
2141 1.1 skrll bfd *dynobj;
2142 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2143 1.1 skrll struct elf_link_hash_entry **sym_hashes;
2144 1.1 skrll const Elf_Internal_Rela *rel;
2145 1.1 skrll const Elf_Internal_Rela *rel_end;
2146 1.1 skrll asection *sgot;
2147 1.1 skrll asection *srelgot;
2148 1.1 skrll asection *sreloc;
2149 1.1 skrll struct elf_m68k_got *got;
2150 1.1 skrll
2151 1.1 skrll if (info->relocatable)
2152 1.1 skrll return TRUE;
2153 1.1 skrll
2154 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2155 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2156 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
2157 1.1 skrll
2158 1.1 skrll sgot = NULL;
2159 1.1 skrll srelgot = NULL;
2160 1.1 skrll sreloc = NULL;
2161 1.1 skrll
2162 1.1 skrll got = NULL;
2163 1.1 skrll
2164 1.1 skrll rel_end = relocs + sec->reloc_count;
2165 1.1 skrll for (rel = relocs; rel < rel_end; rel++)
2166 1.1 skrll {
2167 1.1 skrll unsigned long r_symndx;
2168 1.1 skrll struct elf_link_hash_entry *h;
2169 1.1 skrll
2170 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
2171 1.1 skrll
2172 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
2173 1.1 skrll h = NULL;
2174 1.1 skrll else
2175 1.1 skrll {
2176 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2177 1.1 skrll while (h->root.type == bfd_link_hash_indirect
2178 1.1 skrll || h->root.type == bfd_link_hash_warning)
2179 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
2180 1.1 skrll }
2181 1.1 skrll
2182 1.1 skrll switch (ELF32_R_TYPE (rel->r_info))
2183 1.1 skrll {
2184 1.1 skrll case R_68K_GOT8:
2185 1.1 skrll case R_68K_GOT16:
2186 1.1 skrll case R_68K_GOT32:
2187 1.1 skrll if (h != NULL
2188 1.1 skrll && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2189 1.1 skrll break;
2190 1.1 skrll /* Fall through. */
2191 1.1 skrll case R_68K_GOT8O:
2192 1.1 skrll case R_68K_GOT16O:
2193 1.1 skrll case R_68K_GOT32O:
2194 1.1 skrll /* This symbol requires a global offset table entry. */
2195 1.1 skrll
2196 1.1 skrll if (dynobj == NULL)
2197 1.1 skrll {
2198 1.1 skrll /* Create the .got section. */
2199 1.1 skrll elf_hash_table (info)->dynobj = dynobj = abfd;
2200 1.1 skrll if (!_bfd_elf_create_got_section (dynobj, info))
2201 1.1 skrll return FALSE;
2202 1.1 skrll }
2203 1.1 skrll
2204 1.1 skrll if (sgot == NULL)
2205 1.1 skrll {
2206 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
2207 1.1 skrll BFD_ASSERT (sgot != NULL);
2208 1.1 skrll }
2209 1.1 skrll
2210 1.1 skrll if (srelgot == NULL
2211 1.1 skrll && (h != NULL || info->shared))
2212 1.1 skrll {
2213 1.1 skrll srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2214 1.1 skrll if (srelgot == NULL)
2215 1.1 skrll {
2216 1.1 skrll srelgot = bfd_make_section_with_flags (dynobj,
2217 1.1 skrll ".rela.got",
2218 1.1 skrll (SEC_ALLOC
2219 1.1 skrll | SEC_LOAD
2220 1.1 skrll | SEC_HAS_CONTENTS
2221 1.1 skrll | SEC_IN_MEMORY
2222 1.1 skrll | SEC_LINKER_CREATED
2223 1.1 skrll | SEC_READONLY));
2224 1.1 skrll if (srelgot == NULL
2225 1.1 skrll || !bfd_set_section_alignment (dynobj, srelgot, 2))
2226 1.1 skrll return FALSE;
2227 1.1 skrll }
2228 1.1 skrll }
2229 1.1 skrll
2230 1.1 skrll if (got == NULL)
2231 1.1 skrll {
2232 1.1 skrll struct elf_m68k_bfd2got_entry *bfd2got_entry;
2233 1.1 skrll
2234 1.1 skrll bfd2got_entry
2235 1.1 skrll = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
2236 1.1 skrll abfd, FIND_OR_CREATE, info);
2237 1.1 skrll if (bfd2got_entry == NULL)
2238 1.1 skrll return FALSE;
2239 1.1 skrll
2240 1.1 skrll got = bfd2got_entry->got;
2241 1.1 skrll BFD_ASSERT (got != NULL);
2242 1.1 skrll }
2243 1.1 skrll
2244 1.1 skrll {
2245 1.1 skrll struct elf_m68k_got_entry *got_entry;
2246 1.1 skrll
2247 1.1 skrll /* Add entry to got. */
2248 1.1 skrll got_entry = elf_m68k_add_entry_to_got (got, h, abfd,
2249 1.1 skrll ELF32_R_TYPE (rel->r_info),
2250 1.1 skrll r_symndx, info);
2251 1.1 skrll if (got_entry == NULL)
2252 1.1 skrll return FALSE;
2253 1.1 skrll
2254 1.1 skrll if (got_entry->u.s1.refcount == 1)
2255 1.1 skrll {
2256 1.1 skrll /* Make sure this symbol is output as a dynamic symbol. */
2257 1.1 skrll if (h != NULL
2258 1.1 skrll && h->dynindx == -1
2259 1.1 skrll && !h->forced_local)
2260 1.1 skrll {
2261 1.1 skrll if (!bfd_elf_link_record_dynamic_symbol (info, h))
2262 1.1 skrll return FALSE;
2263 1.1 skrll }
2264 1.1 skrll
2265 1.1 skrll /* Allocate space in the .got section. */
2266 1.1 skrll sgot->size += 4;
2267 1.1 skrll
2268 1.1 skrll /* Allocate relocation space. */
2269 1.1 skrll if (h != NULL
2270 1.1 skrll || info->shared)
2271 1.1 skrll srelgot->size += sizeof (Elf32_External_Rela);
2272 1.1 skrll }
2273 1.1 skrll }
2274 1.1 skrll
2275 1.1 skrll break;
2276 1.1 skrll
2277 1.1 skrll case R_68K_PLT8:
2278 1.1 skrll case R_68K_PLT16:
2279 1.1 skrll case R_68K_PLT32:
2280 1.1 skrll /* This symbol requires a procedure linkage table entry. We
2281 1.1 skrll actually build the entry in adjust_dynamic_symbol,
2282 1.1 skrll because this might be a case of linking PIC code which is
2283 1.1 skrll never referenced by a dynamic object, in which case we
2284 1.1 skrll don't need to generate a procedure linkage table entry
2285 1.1 skrll after all. */
2286 1.1 skrll
2287 1.1 skrll /* If this is a local symbol, we resolve it directly without
2288 1.1 skrll creating a procedure linkage table entry. */
2289 1.1 skrll if (h == NULL)
2290 1.1 skrll continue;
2291 1.1 skrll
2292 1.1 skrll h->needs_plt = 1;
2293 1.1 skrll h->plt.refcount++;
2294 1.1 skrll break;
2295 1.1 skrll
2296 1.1 skrll case R_68K_PLT8O:
2297 1.1 skrll case R_68K_PLT16O:
2298 1.1 skrll case R_68K_PLT32O:
2299 1.1 skrll /* This symbol requires a procedure linkage table entry. */
2300 1.1 skrll
2301 1.1 skrll if (h == NULL)
2302 1.1 skrll {
2303 1.1 skrll /* It does not make sense to have this relocation for a
2304 1.1 skrll local symbol. FIXME: does it? How to handle it if
2305 1.1 skrll it does make sense? */
2306 1.1 skrll bfd_set_error (bfd_error_bad_value);
2307 1.1 skrll return FALSE;
2308 1.1 skrll }
2309 1.1 skrll
2310 1.1 skrll /* Make sure this symbol is output as a dynamic symbol. */
2311 1.1 skrll if (h->dynindx == -1
2312 1.1 skrll && !h->forced_local)
2313 1.1 skrll {
2314 1.1 skrll if (!bfd_elf_link_record_dynamic_symbol (info, h))
2315 1.1 skrll return FALSE;
2316 1.1 skrll }
2317 1.1 skrll
2318 1.1 skrll h->needs_plt = 1;
2319 1.1 skrll h->plt.refcount++;
2320 1.1 skrll break;
2321 1.1 skrll
2322 1.1 skrll case R_68K_PC8:
2323 1.1 skrll case R_68K_PC16:
2324 1.1 skrll case R_68K_PC32:
2325 1.1 skrll /* If we are creating a shared library and this is not a local
2326 1.1 skrll symbol, we need to copy the reloc into the shared library.
2327 1.1 skrll However when linking with -Bsymbolic and this is a global
2328 1.1 skrll symbol which is defined in an object we are including in the
2329 1.1 skrll link (i.e., DEF_REGULAR is set), then we can resolve the
2330 1.1 skrll reloc directly. At this point we have not seen all the input
2331 1.1 skrll files, so it is possible that DEF_REGULAR is not set now but
2332 1.1 skrll will be set later (it is never cleared). We account for that
2333 1.1 skrll possibility below by storing information in the
2334 1.1 skrll pcrel_relocs_copied field of the hash table entry. */
2335 1.1 skrll if (!(info->shared
2336 1.1 skrll && (sec->flags & SEC_ALLOC) != 0
2337 1.1 skrll && h != NULL
2338 1.1 skrll && (!info->symbolic
2339 1.1 skrll || h->root.type == bfd_link_hash_defweak
2340 1.1 skrll || !h->def_regular)))
2341 1.1 skrll {
2342 1.1 skrll if (h != NULL)
2343 1.1 skrll {
2344 1.1 skrll /* Make sure a plt entry is created for this symbol if
2345 1.1 skrll it turns out to be a function defined by a dynamic
2346 1.1 skrll object. */
2347 1.1 skrll h->plt.refcount++;
2348 1.1 skrll }
2349 1.1 skrll break;
2350 1.1 skrll }
2351 1.1 skrll /* Fall through. */
2352 1.1 skrll case R_68K_8:
2353 1.1 skrll case R_68K_16:
2354 1.1 skrll case R_68K_32:
2355 1.1 skrll if (h != NULL)
2356 1.1 skrll {
2357 1.1 skrll /* Make sure a plt entry is created for this symbol if it
2358 1.1 skrll turns out to be a function defined by a dynamic object. */
2359 1.1 skrll h->plt.refcount++;
2360 1.1 skrll }
2361 1.1 skrll
2362 1.1 skrll /* If we are creating a shared library, we need to copy the
2363 1.1 skrll reloc into the shared library. */
2364 1.1 skrll if (info->shared
2365 1.1 skrll && (sec->flags & SEC_ALLOC) != 0)
2366 1.1 skrll {
2367 1.1 skrll /* When creating a shared object, we must copy these
2368 1.1 skrll reloc types into the output file. We create a reloc
2369 1.1 skrll section in dynobj and make room for this reloc. */
2370 1.1 skrll if (sreloc == NULL)
2371 1.1 skrll {
2372 1.1 skrll const char *name;
2373 1.1 skrll
2374 1.1 skrll name = (bfd_elf_string_from_elf_section
2375 1.1 skrll (abfd,
2376 1.1 skrll elf_elfheader (abfd)->e_shstrndx,
2377 1.1 skrll elf_section_data (sec)->rel_hdr.sh_name));
2378 1.1 skrll if (name == NULL)
2379 1.1 skrll return FALSE;
2380 1.1 skrll
2381 1.1 skrll BFD_ASSERT (CONST_STRNEQ (name, ".rela")
2382 1.1 skrll && strcmp (bfd_get_section_name (abfd, sec),
2383 1.1 skrll name + 5) == 0);
2384 1.1 skrll
2385 1.1 skrll sreloc = bfd_get_section_by_name (dynobj, name);
2386 1.1 skrll if (sreloc == NULL)
2387 1.1 skrll {
2388 1.1 skrll sreloc = bfd_make_section_with_flags (dynobj,
2389 1.1 skrll name,
2390 1.1 skrll (SEC_ALLOC
2391 1.1 skrll | SEC_LOAD
2392 1.1 skrll | SEC_HAS_CONTENTS
2393 1.1 skrll | SEC_IN_MEMORY
2394 1.1 skrll | SEC_LINKER_CREATED
2395 1.1 skrll | SEC_READONLY));
2396 1.1 skrll if (sreloc == NULL
2397 1.1 skrll || !bfd_set_section_alignment (dynobj, sreloc, 2))
2398 1.1 skrll return FALSE;
2399 1.1 skrll }
2400 1.1 skrll elf_section_data (sec)->sreloc = sreloc;
2401 1.1 skrll }
2402 1.1 skrll
2403 1.1 skrll if (sec->flags & SEC_READONLY
2404 1.1 skrll /* Don't set DF_TEXTREL yet for PC relative
2405 1.1 skrll relocations, they might be discarded later. */
2406 1.1 skrll && !(ELF32_R_TYPE (rel->r_info) == R_68K_PC8
2407 1.1 skrll || ELF32_R_TYPE (rel->r_info) == R_68K_PC16
2408 1.1 skrll || ELF32_R_TYPE (rel->r_info) == R_68K_PC32))
2409 1.1 skrll info->flags |= DF_TEXTREL;
2410 1.1 skrll
2411 1.1 skrll sreloc->size += sizeof (Elf32_External_Rela);
2412 1.1 skrll
2413 1.1 skrll /* We count the number of PC relative relocations we have
2414 1.1 skrll entered for this symbol, so that we can discard them
2415 1.1 skrll again if, in the -Bsymbolic case, the symbol is later
2416 1.1 skrll defined by a regular object, or, in the normal shared
2417 1.1 skrll case, the symbol is forced to be local. Note that this
2418 1.1 skrll function is only called if we are using an m68kelf linker
2419 1.1 skrll hash table, which means that h is really a pointer to an
2420 1.1 skrll elf_m68k_link_hash_entry. */
2421 1.1 skrll if (ELF32_R_TYPE (rel->r_info) == R_68K_PC8
2422 1.1 skrll || ELF32_R_TYPE (rel->r_info) == R_68K_PC16
2423 1.1 skrll || ELF32_R_TYPE (rel->r_info) == R_68K_PC32)
2424 1.1 skrll {
2425 1.1 skrll struct elf_m68k_pcrel_relocs_copied *p;
2426 1.1 skrll struct elf_m68k_pcrel_relocs_copied **head;
2427 1.1 skrll
2428 1.1 skrll if (h != NULL)
2429 1.1 skrll {
2430 1.1 skrll struct elf_m68k_link_hash_entry *eh
2431 1.1 skrll = elf_m68k_hash_entry (h);
2432 1.1 skrll head = &eh->pcrel_relocs_copied;
2433 1.1 skrll }
2434 1.1 skrll else
2435 1.1 skrll {
2436 1.1 skrll asection *s;
2437 1.1 skrll void *vpp;
2438 1.1 skrll
2439 1.1 skrll s = (bfd_section_from_r_symndx
2440 1.1 skrll (abfd, &elf_m68k_hash_table (info)->sym_sec,
2441 1.1 skrll sec, r_symndx));
2442 1.1 skrll if (s == NULL)
2443 1.1 skrll return FALSE;
2444 1.1 skrll
2445 1.1 skrll vpp = &elf_section_data (s)->local_dynrel;
2446 1.1 skrll head = (struct elf_m68k_pcrel_relocs_copied **) vpp;
2447 1.1 skrll }
2448 1.1 skrll
2449 1.1 skrll for (p = *head; p != NULL; p = p->next)
2450 1.1 skrll if (p->section == sreloc)
2451 1.1 skrll break;
2452 1.1 skrll
2453 1.1 skrll if (p == NULL)
2454 1.1 skrll {
2455 1.1 skrll p = ((struct elf_m68k_pcrel_relocs_copied *)
2456 1.1 skrll bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
2457 1.1 skrll if (p == NULL)
2458 1.1 skrll return FALSE;
2459 1.1 skrll p->next = *head;
2460 1.1 skrll *head = p;
2461 1.1 skrll p->section = sreloc;
2462 1.1 skrll p->count = 0;
2463 1.1 skrll }
2464 1.1 skrll
2465 1.1 skrll ++p->count;
2466 1.1 skrll }
2467 1.1 skrll }
2468 1.1 skrll
2469 1.1 skrll break;
2470 1.1 skrll
2471 1.1 skrll /* This relocation describes the C++ object vtable hierarchy.
2472 1.1 skrll Reconstruct it for later use during GC. */
2473 1.1 skrll case R_68K_GNU_VTINHERIT:
2474 1.1 skrll if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2475 1.1 skrll return FALSE;
2476 1.1 skrll break;
2477 1.1 skrll
2478 1.1 skrll /* This relocation describes which C++ vtable entries are actually
2479 1.1 skrll used. Record for later use during GC. */
2480 1.1 skrll case R_68K_GNU_VTENTRY:
2481 1.1 skrll BFD_ASSERT (h != NULL);
2482 1.1 skrll if (h != NULL
2483 1.1 skrll && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2484 1.1 skrll return FALSE;
2485 1.1 skrll break;
2486 1.1 skrll
2487 1.1 skrll default:
2488 1.1 skrll break;
2489 1.1 skrll }
2490 1.1 skrll }
2491 1.1 skrll
2492 1.1 skrll return TRUE;
2493 1.1 skrll }
2494 1.1 skrll
2495 1.1 skrll /* Return the section that should be marked against GC for a given
2496 1.1 skrll relocation. */
2497 1.1 skrll
2498 1.1 skrll static asection *
2499 1.1 skrll elf_m68k_gc_mark_hook (asection *sec,
2500 1.1 skrll struct bfd_link_info *info,
2501 1.1 skrll Elf_Internal_Rela *rel,
2502 1.1 skrll struct elf_link_hash_entry *h,
2503 1.1 skrll Elf_Internal_Sym *sym)
2504 1.1 skrll {
2505 1.1 skrll if (h != NULL)
2506 1.1 skrll switch (ELF32_R_TYPE (rel->r_info))
2507 1.1 skrll {
2508 1.1 skrll case R_68K_GNU_VTINHERIT:
2509 1.1 skrll case R_68K_GNU_VTENTRY:
2510 1.1 skrll return NULL;
2511 1.1 skrll }
2512 1.1 skrll
2513 1.1 skrll return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2514 1.1 skrll }
2515 1.1 skrll
2516 1.1 skrll /* Update the got entry reference counts for the section being removed. */
2517 1.1 skrll
2518 1.1 skrll static bfd_boolean
2519 1.1 skrll elf_m68k_gc_sweep_hook (bfd *abfd,
2520 1.1 skrll struct bfd_link_info *info,
2521 1.1 skrll asection *sec,
2522 1.1 skrll const Elf_Internal_Rela *relocs)
2523 1.1 skrll {
2524 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2525 1.1 skrll struct elf_link_hash_entry **sym_hashes;
2526 1.1 skrll const Elf_Internal_Rela *rel, *relend;
2527 1.1 skrll bfd *dynobj;
2528 1.1 skrll asection *sgot;
2529 1.1 skrll asection *srelgot;
2530 1.1 skrll struct elf_m68k_got *got;
2531 1.1 skrll
2532 1.1 skrll if (info->relocatable)
2533 1.1 skrll return TRUE;
2534 1.1 skrll
2535 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2536 1.1 skrll if (dynobj == NULL)
2537 1.1 skrll return TRUE;
2538 1.1 skrll
2539 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2540 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
2541 1.1 skrll
2542 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
2543 1.1 skrll srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2544 1.1 skrll got = NULL;
2545 1.1 skrll
2546 1.1 skrll relend = relocs + sec->reloc_count;
2547 1.1 skrll for (rel = relocs; rel < relend; rel++)
2548 1.1 skrll {
2549 1.1 skrll unsigned long r_symndx;
2550 1.1 skrll struct elf_link_hash_entry *h = NULL;
2551 1.1 skrll
2552 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
2553 1.1 skrll if (r_symndx >= symtab_hdr->sh_info)
2554 1.1 skrll {
2555 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2556 1.1 skrll while (h->root.type == bfd_link_hash_indirect
2557 1.1 skrll || h->root.type == bfd_link_hash_warning)
2558 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
2559 1.1 skrll }
2560 1.1 skrll
2561 1.1 skrll switch (ELF32_R_TYPE (rel->r_info))
2562 1.1 skrll {
2563 1.1 skrll case R_68K_GOT8:
2564 1.1 skrll case R_68K_GOT16:
2565 1.1 skrll case R_68K_GOT32:
2566 1.1 skrll if (h != NULL
2567 1.1 skrll && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2568 1.1 skrll break;
2569 1.1 skrll
2570 1.1 skrll /* FALLTHRU */
2571 1.1 skrll case R_68K_GOT8O:
2572 1.1 skrll case R_68K_GOT16O:
2573 1.1 skrll case R_68K_GOT32O:
2574 1.1 skrll if (got == NULL)
2575 1.1 skrll {
2576 1.1 skrll got = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
2577 1.1 skrll abfd, MUST_FIND, NULL)->got;
2578 1.1 skrll BFD_ASSERT (got != NULL);
2579 1.1 skrll }
2580 1.1 skrll
2581 1.1 skrll {
2582 1.1 skrll struct elf_m68k_got_entry_key key_;
2583 1.1 skrll struct elf_m68k_got_entry **got_entry_ptr;
2584 1.1 skrll struct elf_m68k_got_entry *got_entry;
2585 1.1 skrll
2586 1.1 skrll elf_m68k_init_got_entry_key (&key_, h, abfd, r_symndx);
2587 1.1 skrll got_entry_ptr = elf_m68k_find_got_entry_ptr (got, &key_);
2588 1.1 skrll
2589 1.1 skrll got_entry = *got_entry_ptr;
2590 1.1 skrll
2591 1.1 skrll if (got_entry->u.s1.refcount > 0)
2592 1.1 skrll {
2593 1.1 skrll --got_entry->u.s1.refcount;
2594 1.1 skrll
2595 1.1 skrll if (got_entry->u.s1.refcount == 0)
2596 1.1 skrll /* We don't need the .got entry any more. */
2597 1.1 skrll elf_m68k_remove_got_entry (got, got_entry_ptr);
2598 1.1 skrll }
2599 1.1 skrll }
2600 1.1 skrll break;
2601 1.1 skrll
2602 1.1 skrll case R_68K_PLT8:
2603 1.1 skrll case R_68K_PLT16:
2604 1.1 skrll case R_68K_PLT32:
2605 1.1 skrll case R_68K_PLT8O:
2606 1.1 skrll case R_68K_PLT16O:
2607 1.1 skrll case R_68K_PLT32O:
2608 1.1 skrll case R_68K_PC8:
2609 1.1 skrll case R_68K_PC16:
2610 1.1 skrll case R_68K_PC32:
2611 1.1 skrll case R_68K_8:
2612 1.1 skrll case R_68K_16:
2613 1.1 skrll case R_68K_32:
2614 1.1 skrll if (h != NULL)
2615 1.1 skrll {
2616 1.1 skrll if (h->plt.refcount > 0)
2617 1.1 skrll --h->plt.refcount;
2618 1.1 skrll }
2619 1.1 skrll break;
2620 1.1 skrll
2621 1.1 skrll default:
2622 1.1 skrll break;
2623 1.1 skrll }
2624 1.1 skrll }
2625 1.1 skrll
2626 1.1 skrll return TRUE;
2627 1.1 skrll }
2628 1.1 skrll
2629 1.1 skrll /* Return the type of PLT associated with OUTPUT_BFD. */
2631 1.1 skrll
2632 1.1 skrll static const struct elf_m68k_plt_info *
2633 1.1 skrll elf_m68k_get_plt_info (bfd *output_bfd)
2634 1.1 skrll {
2635 1.1 skrll unsigned int features;
2636 1.1 skrll
2637 1.1 skrll features = bfd_m68k_mach_to_features (bfd_get_mach (output_bfd));
2638 1.1 skrll if (features & cpu32)
2639 1.1 skrll return &elf_cpu32_plt_info;
2640 1.1 skrll if (features & mcfisa_b)
2641 1.1 skrll return &elf_isab_plt_info;
2642 1.1 skrll if (features & mcfisa_c)
2643 1.1 skrll return &elf_isac_plt_info;
2644 1.1 skrll return &elf_m68k_plt_info;
2645 1.1 skrll }
2646 1.1 skrll
2647 1.1 skrll /* This function is called after all the input files have been read,
2648 1.1 skrll and the input sections have been assigned to output sections.
2649 1.1 skrll It's a convenient place to determine the PLT style. */
2650 1.1 skrll
2651 1.1 skrll static bfd_boolean
2652 1.1 skrll elf_m68k_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
2653 1.1 skrll {
2654 1.1 skrll /* Bind input BFDs to GOTs and calculate sizes of .got and .rela.got
2655 1.1 skrll sections. */
2656 1.1 skrll if (!elf_m68k_partition_multi_got (info))
2657 1.1 skrll return FALSE;
2658 1.1 skrll
2659 1.1 skrll elf_m68k_hash_table (info)->plt_info = elf_m68k_get_plt_info (output_bfd);
2660 1.1 skrll return TRUE;
2661 1.1 skrll }
2662 1.1 skrll
2663 1.1 skrll /* Adjust a symbol defined by a dynamic object and referenced by a
2664 1.1 skrll regular object. The current definition is in some section of the
2665 1.1 skrll dynamic object, but we're not including those sections. We have to
2666 1.1 skrll change the definition to something the rest of the link can
2667 1.1 skrll understand. */
2668 1.1 skrll
2669 1.1 skrll static bfd_boolean
2670 1.1 skrll elf_m68k_adjust_dynamic_symbol (info, h)
2671 1.1 skrll struct bfd_link_info *info;
2672 1.1 skrll struct elf_link_hash_entry *h;
2673 1.1 skrll {
2674 1.1 skrll struct elf_m68k_link_hash_table *htab;
2675 1.1 skrll bfd *dynobj;
2676 1.1 skrll asection *s;
2677 1.1 skrll
2678 1.1 skrll htab = elf_m68k_hash_table (info);
2679 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2680 1.1 skrll
2681 1.1 skrll /* Make sure we know what is going on here. */
2682 1.1 skrll BFD_ASSERT (dynobj != NULL
2683 1.1 skrll && (h->needs_plt
2684 1.1 skrll || h->u.weakdef != NULL
2685 1.1 skrll || (h->def_dynamic
2686 1.1 skrll && h->ref_regular
2687 1.1 skrll && !h->def_regular)));
2688 1.1 skrll
2689 1.1 skrll /* If this is a function, put it in the procedure linkage table. We
2690 1.1 skrll will fill in the contents of the procedure linkage table later,
2691 1.1 skrll when we know the address of the .got section. */
2692 1.1 skrll if (h->type == STT_FUNC
2693 1.1 skrll || h->needs_plt)
2694 1.1 skrll {
2695 1.1 skrll if ((h->plt.refcount <= 0
2696 1.1 skrll || SYMBOL_CALLS_LOCAL (info, h)
2697 1.1 skrll || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2698 1.1 skrll && h->root.type == bfd_link_hash_undefweak))
2699 1.1 skrll /* We must always create the plt entry if it was referenced
2700 1.1 skrll by a PLTxxO relocation. In this case we already recorded
2701 1.1 skrll it as a dynamic symbol. */
2702 1.1 skrll && h->dynindx == -1)
2703 1.1 skrll {
2704 1.1 skrll /* This case can occur if we saw a PLTxx reloc in an input
2705 1.1 skrll file, but the symbol was never referred to by a dynamic
2706 1.1 skrll object, or if all references were garbage collected. In
2707 1.1 skrll such a case, we don't actually need to build a procedure
2708 1.1 skrll linkage table, and we can just do a PCxx reloc instead. */
2709 1.1 skrll h->plt.offset = (bfd_vma) -1;
2710 1.1 skrll h->needs_plt = 0;
2711 1.1 skrll return TRUE;
2712 1.1 skrll }
2713 1.1 skrll
2714 1.1 skrll /* Make sure this symbol is output as a dynamic symbol. */
2715 1.1 skrll if (h->dynindx == -1
2716 1.1 skrll && !h->forced_local)
2717 1.1 skrll {
2718 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h))
2719 1.1 skrll return FALSE;
2720 1.1 skrll }
2721 1.1 skrll
2722 1.1 skrll s = bfd_get_section_by_name (dynobj, ".plt");
2723 1.1 skrll BFD_ASSERT (s != NULL);
2724 1.1 skrll
2725 1.1 skrll /* If this is the first .plt entry, make room for the special
2726 1.1 skrll first entry. */
2727 1.1 skrll if (s->size == 0)
2728 1.1 skrll s->size = htab->plt_info->size;
2729 1.1 skrll
2730 1.1 skrll /* If this symbol is not defined in a regular file, and we are
2731 1.1 skrll not generating a shared library, then set the symbol to this
2732 1.1 skrll location in the .plt. This is required to make function
2733 1.1 skrll pointers compare as equal between the normal executable and
2734 1.1 skrll the shared library. */
2735 1.1 skrll if (!info->shared
2736 1.1 skrll && !h->def_regular)
2737 1.1 skrll {
2738 1.1 skrll h->root.u.def.section = s;
2739 1.1 skrll h->root.u.def.value = s->size;
2740 1.1 skrll }
2741 1.1 skrll
2742 1.1 skrll h->plt.offset = s->size;
2743 1.1 skrll
2744 1.1 skrll /* Make room for this entry. */
2745 1.1 skrll s->size += htab->plt_info->size;
2746 1.1 skrll
2747 1.1 skrll /* We also need to make an entry in the .got.plt section, which
2748 1.1 skrll will be placed in the .got section by the linker script. */
2749 1.1 skrll s = bfd_get_section_by_name (dynobj, ".got.plt");
2750 1.1 skrll BFD_ASSERT (s != NULL);
2751 1.1 skrll s->size += 4;
2752 1.1 skrll
2753 1.1 skrll /* We also need to make an entry in the .rela.plt section. */
2754 1.1 skrll s = bfd_get_section_by_name (dynobj, ".rela.plt");
2755 1.1 skrll BFD_ASSERT (s != NULL);
2756 1.1 skrll s->size += sizeof (Elf32_External_Rela);
2757 1.1 skrll
2758 1.1 skrll return TRUE;
2759 1.1 skrll }
2760 1.1 skrll
2761 1.1 skrll /* Reinitialize the plt offset now that it is not used as a reference
2762 1.1 skrll count any more. */
2763 1.1 skrll h->plt.offset = (bfd_vma) -1;
2764 1.1 skrll
2765 1.1 skrll /* If this is a weak symbol, and there is a real definition, the
2766 1.1 skrll processor independent code will have arranged for us to see the
2767 1.1 skrll real definition first, and we can just use the same value. */
2768 1.1 skrll if (h->u.weakdef != NULL)
2769 1.1 skrll {
2770 1.1 skrll BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2771 1.1 skrll || h->u.weakdef->root.type == bfd_link_hash_defweak);
2772 1.1 skrll h->root.u.def.section = h->u.weakdef->root.u.def.section;
2773 1.1 skrll h->root.u.def.value = h->u.weakdef->root.u.def.value;
2774 1.1 skrll return TRUE;
2775 1.1 skrll }
2776 1.1 skrll
2777 1.1 skrll /* This is a reference to a symbol defined by a dynamic object which
2778 1.1 skrll is not a function. */
2779 1.1 skrll
2780 1.1 skrll /* If we are creating a shared library, we must presume that the
2781 1.1 skrll only references to the symbol are via the global offset table.
2782 1.1 skrll For such cases we need not do anything here; the relocations will
2783 1.1 skrll be handled correctly by relocate_section. */
2784 1.1 skrll if (info->shared)
2785 1.1 skrll return TRUE;
2786 1.1 skrll
2787 1.1 skrll if (h->size == 0)
2788 1.1 skrll {
2789 1.1 skrll (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
2790 1.1 skrll h->root.root.string);
2791 1.1 skrll return TRUE;
2792 1.1 skrll }
2793 1.1 skrll
2794 1.1 skrll /* We must allocate the symbol in our .dynbss section, which will
2795 1.1 skrll become part of the .bss section of the executable. There will be
2796 1.1 skrll an entry for this symbol in the .dynsym section. The dynamic
2797 1.1 skrll object will contain position independent code, so all references
2798 1.1 skrll from the dynamic object to this symbol will go through the global
2799 1.1 skrll offset table. The dynamic linker will use the .dynsym entry to
2800 1.1 skrll determine the address it must put in the global offset table, so
2801 1.1 skrll both the dynamic object and the regular object will refer to the
2802 1.1 skrll same memory location for the variable. */
2803 1.1 skrll
2804 1.1 skrll s = bfd_get_section_by_name (dynobj, ".dynbss");
2805 1.1 skrll BFD_ASSERT (s != NULL);
2806 1.1 skrll
2807 1.1 skrll /* We must generate a R_68K_COPY reloc to tell the dynamic linker to
2808 1.1 skrll copy the initial value out of the dynamic object and into the
2809 1.1 skrll runtime process image. We need to remember the offset into the
2810 1.1 skrll .rela.bss section we are going to use. */
2811 1.1 skrll if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2812 1.1 skrll {
2813 1.1 skrll asection *srel;
2814 1.1 skrll
2815 1.1 skrll srel = bfd_get_section_by_name (dynobj, ".rela.bss");
2816 1.1 skrll BFD_ASSERT (srel != NULL);
2817 1.1 skrll srel->size += sizeof (Elf32_External_Rela);
2818 1.1 skrll h->needs_copy = 1;
2819 1.1 skrll }
2820 1.1 skrll
2821 1.1 skrll return _bfd_elf_adjust_dynamic_copy (h, s);
2822 1.1 skrll }
2823 1.1 skrll
2824 1.1 skrll /* Set the sizes of the dynamic sections. */
2825 1.1 skrll
2826 1.1 skrll static bfd_boolean
2827 1.1 skrll elf_m68k_size_dynamic_sections (output_bfd, info)
2828 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2829 1.1 skrll struct bfd_link_info *info;
2830 1.1 skrll {
2831 1.1 skrll bfd *dynobj;
2832 1.1 skrll asection *s;
2833 1.1 skrll bfd_boolean plt;
2834 1.1 skrll bfd_boolean relocs;
2835 1.1 skrll
2836 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
2837 1.1 skrll BFD_ASSERT (dynobj != NULL);
2838 1.1 skrll
2839 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created)
2840 1.1 skrll {
2841 1.1 skrll /* Set the contents of the .interp section to the interpreter. */
2842 1.1 skrll if (info->executable)
2843 1.1 skrll {
2844 1.1 skrll s = bfd_get_section_by_name (dynobj, ".interp");
2845 1.1 skrll BFD_ASSERT (s != NULL);
2846 1.1 skrll s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2847 1.1 skrll s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2848 1.1 skrll }
2849 1.1 skrll }
2850 1.1 skrll else
2851 1.1 skrll {
2852 1.1 skrll /* We may have created entries in the .rela.got section.
2853 1.1 skrll However, if we are not creating the dynamic sections, we will
2854 1.1 skrll not actually use these entries. Reset the size of .rela.got,
2855 1.1 skrll which will cause it to get stripped from the output file
2856 1.1 skrll below. */
2857 1.1 skrll s = bfd_get_section_by_name (dynobj, ".rela.got");
2858 1.1 skrll if (s != NULL)
2859 1.1 skrll s->size = 0;
2860 1.1 skrll }
2861 1.1 skrll
2862 1.1 skrll /* If this is a -Bsymbolic shared link, then we need to discard all
2863 1.1 skrll PC relative relocs against symbols defined in a regular object.
2864 1.1 skrll For the normal shared case we discard the PC relative relocs
2865 1.1 skrll against symbols that have become local due to visibility changes.
2866 1.1 skrll We allocated space for them in the check_relocs routine, but we
2867 1.1 skrll will not fill them in in the relocate_section routine. */
2868 1.1 skrll if (info->shared)
2869 1.1 skrll elf_link_hash_traverse (elf_hash_table (info),
2870 1.1 skrll elf_m68k_discard_copies,
2871 1.1 skrll (PTR) info);
2872 1.1 skrll
2873 1.1 skrll /* The check_relocs and adjust_dynamic_symbol entry points have
2874 1.1 skrll determined the sizes of the various dynamic sections. Allocate
2875 1.1 skrll memory for them. */
2876 1.1 skrll plt = FALSE;
2877 1.1 skrll relocs = FALSE;
2878 1.1 skrll for (s = dynobj->sections; s != NULL; s = s->next)
2879 1.1 skrll {
2880 1.1 skrll const char *name;
2881 1.1 skrll
2882 1.1 skrll if ((s->flags & SEC_LINKER_CREATED) == 0)
2883 1.1 skrll continue;
2884 1.1 skrll
2885 1.1 skrll /* It's OK to base decisions on the section name, because none
2886 1.1 skrll of the dynobj section names depend upon the input files. */
2887 1.1 skrll name = bfd_get_section_name (dynobj, s);
2888 1.1 skrll
2889 1.1 skrll if (strcmp (name, ".plt") == 0)
2890 1.1 skrll {
2891 1.1 skrll /* Remember whether there is a PLT. */
2892 1.1 skrll plt = s->size != 0;
2893 1.1 skrll }
2894 1.1 skrll else if (CONST_STRNEQ (name, ".rela"))
2895 1.1 skrll {
2896 1.1 skrll if (s->size != 0)
2897 1.1 skrll {
2898 1.1 skrll relocs = TRUE;
2899 1.1 skrll
2900 1.1 skrll /* We use the reloc_count field as a counter if we need
2901 1.1 skrll to copy relocs into the output file. */
2902 1.1 skrll s->reloc_count = 0;
2903 1.1 skrll }
2904 1.1 skrll }
2905 1.1 skrll else if (! CONST_STRNEQ (name, ".got")
2906 1.1 skrll && strcmp (name, ".dynbss") != 0)
2907 1.1 skrll {
2908 1.1 skrll /* It's not one of our sections, so don't allocate space. */
2909 1.1 skrll continue;
2910 1.1 skrll }
2911 1.1 skrll
2912 1.1 skrll if (s->size == 0)
2913 1.1 skrll {
2914 1.1 skrll /* If we don't need this section, strip it from the
2915 1.1 skrll output file. This is mostly to handle .rela.bss and
2916 1.1 skrll .rela.plt. We must create both sections in
2917 1.1 skrll create_dynamic_sections, because they must be created
2918 1.1 skrll before the linker maps input sections to output
2919 1.1 skrll sections. The linker does that before
2920 1.1 skrll adjust_dynamic_symbol is called, and it is that
2921 1.1 skrll function which decides whether anything needs to go
2922 1.1 skrll into these sections. */
2923 1.1 skrll s->flags |= SEC_EXCLUDE;
2924 1.1 skrll continue;
2925 1.1 skrll }
2926 1.1 skrll
2927 1.1 skrll if ((s->flags & SEC_HAS_CONTENTS) == 0)
2928 1.1 skrll continue;
2929 1.1 skrll
2930 1.1 skrll /* Allocate memory for the section contents. */
2931 1.1 skrll /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
2932 1.1 skrll Unused entries should be reclaimed before the section's contents
2933 1.1 skrll are written out, but at the moment this does not happen. Thus in
2934 1.1 skrll order to prevent writing out garbage, we initialise the section's
2935 1.1 skrll contents to zero. */
2936 1.1 skrll s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2937 1.1 skrll if (s->contents == NULL)
2938 1.1 skrll return FALSE;
2939 1.1 skrll }
2940 1.1 skrll
2941 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created)
2942 1.1 skrll {
2943 1.1 skrll /* Add some entries to the .dynamic section. We fill in the
2944 1.1 skrll values later, in elf_m68k_finish_dynamic_sections, but we
2945 1.1 skrll must add the entries now so that we get the correct size for
2946 1.1 skrll the .dynamic section. The DT_DEBUG entry is filled in by the
2947 1.1 skrll dynamic linker and used by the debugger. */
2948 1.1 skrll #define add_dynamic_entry(TAG, VAL) \
2949 1.1 skrll _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2950 1.1 skrll
2951 1.1 skrll if (!info->shared)
2952 1.1 skrll {
2953 1.1 skrll if (!add_dynamic_entry (DT_DEBUG, 0))
2954 1.1 skrll return FALSE;
2955 1.1 skrll }
2956 1.1 skrll
2957 1.1 skrll if (plt)
2958 1.1 skrll {
2959 1.1 skrll if (!add_dynamic_entry (DT_PLTGOT, 0)
2960 1.1 skrll || !add_dynamic_entry (DT_PLTRELSZ, 0)
2961 1.1 skrll || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2962 1.1 skrll || !add_dynamic_entry (DT_JMPREL, 0))
2963 1.1 skrll return FALSE;
2964 1.1 skrll }
2965 1.1 skrll
2966 1.1 skrll if (relocs)
2967 1.1 skrll {
2968 1.1 skrll if (!add_dynamic_entry (DT_RELA, 0)
2969 1.1 skrll || !add_dynamic_entry (DT_RELASZ, 0)
2970 1.1 skrll || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2971 1.1 skrll return FALSE;
2972 1.1 skrll }
2973 1.1 skrll
2974 1.1 skrll if ((info->flags & DF_TEXTREL) != 0)
2975 1.1 skrll {
2976 1.1 skrll if (!add_dynamic_entry (DT_TEXTREL, 0))
2977 1.1 skrll return FALSE;
2978 1.1 skrll }
2979 1.1 skrll }
2980 1.1 skrll #undef add_dynamic_entry
2981 1.1 skrll
2982 1.1 skrll return TRUE;
2983 1.1 skrll }
2984 1.1 skrll
2985 1.1 skrll /* This function is called via elf_link_hash_traverse if we are
2986 1.1 skrll creating a shared object. In the -Bsymbolic case it discards the
2987 1.1 skrll space allocated to copy PC relative relocs against symbols which
2988 1.1 skrll are defined in regular objects. For the normal shared case, it
2989 1.1 skrll discards space for pc-relative relocs that have become local due to
2990 1.1 skrll symbol visibility changes. We allocated space for them in the
2991 1.1 skrll check_relocs routine, but we won't fill them in in the
2992 1.1 skrll relocate_section routine.
2993 1.1 skrll
2994 1.1 skrll We also check whether any of the remaining relocations apply
2995 1.1 skrll against a readonly section, and set the DF_TEXTREL flag in this
2996 1.1 skrll case. */
2997 1.1 skrll
2998 1.1 skrll static bfd_boolean
2999 1.1 skrll elf_m68k_discard_copies (h, inf)
3000 1.1 skrll struct elf_link_hash_entry *h;
3001 1.1 skrll PTR inf;
3002 1.1 skrll {
3003 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) inf;
3004 1.1 skrll struct elf_m68k_pcrel_relocs_copied *s;
3005 1.1 skrll
3006 1.1 skrll if (h->root.type == bfd_link_hash_warning)
3007 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
3008 1.1 skrll
3009 1.1 skrll if (!h->def_regular
3010 1.1 skrll || (!info->symbolic
3011 1.1 skrll && !h->forced_local))
3012 1.1 skrll {
3013 1.1 skrll if ((info->flags & DF_TEXTREL) == 0)
3014 1.1 skrll {
3015 1.1 skrll /* Look for relocations against read-only sections. */
3016 1.1 skrll for (s = elf_m68k_hash_entry (h)->pcrel_relocs_copied;
3017 1.1 skrll s != NULL;
3018 1.1 skrll s = s->next)
3019 1.1 skrll if ((s->section->flags & SEC_READONLY) != 0)
3020 1.1 skrll {
3021 1.1 skrll info->flags |= DF_TEXTREL;
3022 1.1 skrll break;
3023 1.1 skrll }
3024 1.1 skrll }
3025 1.1 skrll
3026 1.1 skrll return TRUE;
3027 1.1 skrll }
3028 1.1 skrll
3029 1.1 skrll for (s = elf_m68k_hash_entry (h)->pcrel_relocs_copied;
3030 1.1 skrll s != NULL;
3031 1.1 skrll s = s->next)
3032 1.1 skrll s->section->size -= s->count * sizeof (Elf32_External_Rela);
3033 1.1 skrll
3034 1.1 skrll return TRUE;
3035 1.1 skrll }
3036 1.1 skrll
3037 1.1 skrll /* Relocate an M68K ELF section. */
3038 1.1 skrll
3039 1.1 skrll static bfd_boolean
3040 1.1 skrll elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
3041 1.1 skrll contents, relocs, local_syms, local_sections)
3042 1.1 skrll bfd *output_bfd;
3043 1.1 skrll struct bfd_link_info *info;
3044 1.1 skrll bfd *input_bfd;
3045 1.1 skrll asection *input_section;
3046 1.1 skrll bfd_byte *contents;
3047 1.1 skrll Elf_Internal_Rela *relocs;
3048 1.1 skrll Elf_Internal_Sym *local_syms;
3049 1.1 skrll asection **local_sections;
3050 1.1 skrll {
3051 1.1 skrll bfd *dynobj;
3052 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
3053 1.1 skrll struct elf_link_hash_entry **sym_hashes;
3054 1.1 skrll asection *sgot;
3055 1.1 skrll asection *splt;
3056 1.1 skrll asection *sreloc;
3057 1.1 skrll struct elf_m68k_got *got;
3058 1.1 skrll Elf_Internal_Rela *rel;
3059 1.1 skrll Elf_Internal_Rela *relend;
3060 1.1 skrll
3061 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
3062 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3063 1.1 skrll sym_hashes = elf_sym_hashes (input_bfd);
3064 1.1 skrll
3065 1.1 skrll sgot = NULL;
3066 1.1 skrll splt = NULL;
3067 1.1 skrll sreloc = NULL;
3068 1.1 skrll
3069 1.1 skrll got = NULL;
3070 1.1 skrll
3071 1.1 skrll rel = relocs;
3072 1.1 skrll relend = relocs + input_section->reloc_count;
3073 1.1 skrll for (; rel < relend; rel++)
3074 1.1 skrll {
3075 1.1 skrll int r_type;
3076 1.1 skrll reloc_howto_type *howto;
3077 1.1 skrll unsigned long r_symndx;
3078 1.1 skrll struct elf_link_hash_entry *h;
3079 1.1 skrll Elf_Internal_Sym *sym;
3080 1.1 skrll asection *sec;
3081 1.1 skrll bfd_vma relocation;
3082 1.1 skrll bfd_boolean unresolved_reloc;
3083 1.1 skrll bfd_reloc_status_type r;
3084 1.1 skrll
3085 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
3086 1.1 skrll if (r_type < 0 || r_type >= (int) R_68K_max)
3087 1.1 skrll {
3088 1.1 skrll bfd_set_error (bfd_error_bad_value);
3089 1.1 skrll return FALSE;
3090 1.1 skrll }
3091 1.1 skrll howto = howto_table + r_type;
3092 1.1 skrll
3093 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
3094 1.1 skrll
3095 1.1 skrll h = NULL;
3096 1.1 skrll sym = NULL;
3097 1.1 skrll sec = NULL;
3098 1.1 skrll unresolved_reloc = FALSE;
3099 1.1 skrll
3100 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
3101 1.1 skrll {
3102 1.1 skrll sym = local_syms + r_symndx;
3103 1.1 skrll sec = local_sections[r_symndx];
3104 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3105 1.1 skrll }
3106 1.1 skrll else
3107 1.1 skrll {
3108 1.1 skrll bfd_boolean warned;
3109 1.1 skrll
3110 1.1 skrll RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3111 1.1 skrll r_symndx, symtab_hdr, sym_hashes,
3112 1.1 skrll h, sec, relocation,
3113 1.1 skrll unresolved_reloc, warned);
3114 1.1 skrll }
3115 1.1 skrll
3116 1.1 skrll if (sec != NULL && elf_discarded_section (sec))
3117 1.1 skrll {
3118 1.1 skrll /* For relocs against symbols from removed linkonce sections,
3119 1.1 skrll or sections discarded by a linker script, we just want the
3120 1.1 skrll section contents zeroed. Avoid any special processing. */
3121 1.1 skrll _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
3122 1.1 skrll rel->r_info = 0;
3123 1.1 skrll rel->r_addend = 0;
3124 1.1 skrll continue;
3125 1.1 skrll }
3126 1.1 skrll
3127 1.1 skrll if (info->relocatable)
3128 1.1 skrll continue;
3129 1.1 skrll
3130 1.1 skrll switch (r_type)
3131 1.1 skrll {
3132 1.1 skrll case R_68K_GOT8:
3133 1.1 skrll case R_68K_GOT16:
3134 1.1 skrll case R_68K_GOT32:
3135 1.1 skrll /* Relocation is to the address of the entry for this symbol
3136 1.1 skrll in the global offset table. */
3137 1.1 skrll if (h != NULL
3138 1.1 skrll && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3139 1.1 skrll {
3140 1.1 skrll if (elf_m68k_hash_table (info)->local_gp_p)
3141 1.1 skrll {
3142 1.1 skrll bfd_vma sgot_output_offset;
3143 1.1 skrll bfd_vma got_offset;
3144 1.1 skrll
3145 1.1 skrll if (sgot == NULL)
3146 1.1 skrll {
3147 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
3148 1.1 skrll
3149 1.1 skrll if (sgot != NULL)
3150 1.1 skrll sgot_output_offset = sgot->output_offset;
3151 1.1 skrll else
3152 1.1 skrll /* In this case we have a reference to
3153 1.1 skrll _GLOBAL_OFFSET_TABLE_, but the GOT itself is
3154 1.1 skrll empty.
3155 1.1 skrll ??? Issue a warning? */
3156 1.1 skrll sgot_output_offset = 0;
3157 1.1 skrll }
3158 1.1 skrll else
3159 1.1 skrll sgot_output_offset = sgot->output_offset;
3160 1.1 skrll
3161 1.1 skrll if (got == NULL)
3162 1.1 skrll {
3163 1.1 skrll struct elf_m68k_bfd2got_entry *bfd2got_entry;
3164 1.1 skrll
3165 1.1 skrll bfd2got_entry
3166 1.1 skrll = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
3167 1.1 skrll input_bfd, SEARCH, NULL);
3168 1.1 skrll
3169 1.1 skrll if (bfd2got_entry != NULL)
3170 1.1 skrll {
3171 1.1 skrll got = bfd2got_entry->got;
3172 1.1 skrll BFD_ASSERT (got != NULL);
3173 1.1 skrll
3174 1.1 skrll got_offset = got->offset;
3175 1.1 skrll }
3176 1.1 skrll else
3177 1.1 skrll /* In this case we have a reference to
3178 1.1 skrll _GLOBAL_OFFSET_TABLE_, but no other references
3179 1.1 skrll accessing any GOT entries.
3180 1.1 skrll ??? Issue a warning? */
3181 1.1 skrll got_offset = 0;
3182 1.1 skrll }
3183 1.1 skrll else
3184 1.1 skrll got_offset = got->offset;
3185 1.1 skrll
3186 1.1 skrll /* Adjust GOT pointer to point to the GOT
3187 1.1 skrll assigned to input_bfd. */
3188 1.1 skrll rel->r_addend += sgot_output_offset + got_offset;
3189 1.1 skrll }
3190 1.1 skrll else
3191 1.1 skrll BFD_ASSERT (got == NULL || got->offset == 0);
3192 1.1 skrll
3193 1.1 skrll break;
3194 1.1 skrll }
3195 1.1 skrll /* Fall through. */
3196 1.1 skrll case R_68K_GOT8O:
3197 1.1 skrll case R_68K_GOT16O:
3198 1.1 skrll case R_68K_GOT32O:
3199 1.1 skrll /* Relocation is the offset of the entry for this symbol in
3200 1.1 skrll the global offset table. */
3201 1.1 skrll
3202 1.1 skrll {
3203 1.1 skrll struct elf_m68k_got_entry_key key_;
3204 1.1 skrll bfd_vma *off_ptr;
3205 1.1 skrll bfd_vma off;
3206 1.1 skrll
3207 1.1 skrll if (sgot == NULL)
3208 1.1 skrll {
3209 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
3210 1.1 skrll BFD_ASSERT (sgot != NULL);
3211 1.1 skrll }
3212 1.1 skrll
3213 1.1 skrll if (got == NULL)
3214 1.1 skrll {
3215 1.1 skrll got = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
3216 1.1 skrll input_bfd, MUST_FIND,
3217 1.1 skrll NULL)->got;
3218 1.1 skrll BFD_ASSERT (got != NULL);
3219 1.1 skrll }
3220 1.1 skrll
3221 1.1 skrll /* Get GOT offset for this symbol. */
3222 1.1 skrll elf_m68k_init_got_entry_key (&key_, h, input_bfd, r_symndx);
3223 1.1 skrll off_ptr = &elf_m68k_get_got_entry (got, &key_, MUST_FIND,
3224 1.1 skrll NULL)->u.s2.offset;
3225 1.1 skrll off = *off_ptr;
3226 1.1 skrll
3227 1.1 skrll if (h != NULL)
3228 1.1 skrll {
3229 1.1 skrll bfd_boolean dyn;
3230 1.1 skrll
3231 1.1 skrll dyn = elf_hash_table (info)->dynamic_sections_created;
3232 1.1 skrll if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3233 1.1 skrll || (info->shared
3234 1.1 skrll && (info->symbolic
3235 1.1 skrll || h->dynindx == -1
3236 1.1 skrll || h->forced_local)
3237 1.1 skrll && h->def_regular))
3238 1.1 skrll {
3239 1.1 skrll /* This is actually a static link, or it is a
3240 1.1 skrll -Bsymbolic link and the symbol is defined
3241 1.1 skrll locally, or the symbol was forced to be local
3242 1.1 skrll because of a version file.. We must initialize
3243 1.1 skrll this entry in the global offset table. Since
3244 1.1 skrll the offset must always be a multiple of 4, we
3245 1.1 skrll use the least significant bit to record whether
3246 1.1 skrll we have initialized it already.
3247 1.1 skrll
3248 1.1 skrll When doing a dynamic link, we create a .rela.got
3249 1.1 skrll relocation entry to initialize the value. This
3250 1.1 skrll is done in the finish_dynamic_symbol routine. */
3251 1.1 skrll if ((off & 1) != 0)
3252 1.1 skrll off &= ~1;
3253 1.1 skrll else
3254 1.1 skrll {
3255 1.1 skrll bfd_put_32 (output_bfd, relocation,
3256 1.1 skrll sgot->contents + off);
3257 1.1 skrll *off_ptr |= 1;
3258 1.1 skrll }
3259 1.1 skrll }
3260 1.1 skrll else
3261 1.1 skrll unresolved_reloc = FALSE;
3262 1.1 skrll }
3263 1.1 skrll else
3264 1.1 skrll {
3265 1.1 skrll /* The offset must always be a multiple of 4. We use
3266 1.1 skrll the least significant bit to record whether we have
3267 1.1 skrll already generated the necessary reloc. */
3268 1.1 skrll if ((off & 1) != 0)
3269 1.1 skrll off &= ~1;
3270 1.1 skrll else
3271 1.1 skrll {
3272 1.1 skrll bfd_put_32 (output_bfd, relocation, sgot->contents + off);
3273 1.1 skrll
3274 1.1 skrll if (info->shared)
3275 1.1 skrll {
3276 1.1 skrll asection *s;
3277 1.1 skrll Elf_Internal_Rela outrel;
3278 1.1 skrll bfd_byte *loc;
3279 1.1 skrll
3280 1.1 skrll s = bfd_get_section_by_name (dynobj, ".rela.got");
3281 1.1 skrll BFD_ASSERT (s != NULL);
3282 1.1 skrll
3283 1.1 skrll outrel.r_offset = (sgot->output_section->vma
3284 1.1 skrll + sgot->output_offset
3285 1.1 skrll + off);
3286 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
3287 1.1 skrll outrel.r_addend = relocation;
3288 1.1 skrll loc = s->contents;
3289 1.1 skrll loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3290 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3291 1.1 skrll }
3292 1.1 skrll
3293 1.1 skrll *off_ptr |= 1;
3294 1.1 skrll }
3295 1.1 skrll }
3296 1.1 skrll
3297 1.1 skrll if (r_type == R_68K_GOT8O
3298 1.1 skrll || r_type == R_68K_GOT16O
3299 1.1 skrll || r_type == R_68K_GOT32O)
3300 1.1 skrll {
3301 1.1 skrll /* GOT pointer is adjusted to point to the start/middle
3302 1.1 skrll of local GOT. Adjust the offset accordingly. */
3303 1.1 skrll BFD_ASSERT (elf_m68k_hash_table (info)->use_neg_got_offsets_p
3304 1.1 skrll || off >= got->offset);
3305 1.1 skrll
3306 1.1 skrll if (elf_m68k_hash_table (info)->local_gp_p)
3307 1.1 skrll relocation = off - got->offset;
3308 1.1 skrll else
3309 1.1 skrll {
3310 1.1 skrll BFD_ASSERT (got->offset == 0);
3311 1.1 skrll relocation = sgot->output_offset + off;
3312 1.1 skrll }
3313 1.1 skrll
3314 1.1 skrll /* This relocation does not use the addend. */
3315 1.1 skrll BFD_ASSERT (rel->r_addend == 0);
3316 1.1 skrll rel->r_addend = 0;
3317 1.1 skrll }
3318 1.1 skrll else
3319 1.1 skrll relocation = (sgot->output_section->vma + sgot->output_offset
3320 1.1 skrll + off);
3321 1.1 skrll }
3322 1.1 skrll break;
3323 1.1 skrll
3324 1.1 skrll case R_68K_PLT8:
3325 1.1 skrll case R_68K_PLT16:
3326 1.1 skrll case R_68K_PLT32:
3327 1.1 skrll /* Relocation is to the entry for this symbol in the
3328 1.1 skrll procedure linkage table. */
3329 1.1 skrll
3330 1.1 skrll /* Resolve a PLTxx reloc against a local symbol directly,
3331 1.1 skrll without using the procedure linkage table. */
3332 1.1 skrll if (h == NULL)
3333 1.1 skrll break;
3334 1.1 skrll
3335 1.1 skrll if (h->plt.offset == (bfd_vma) -1
3336 1.1 skrll || !elf_hash_table (info)->dynamic_sections_created)
3337 1.1 skrll {
3338 1.1 skrll /* We didn't make a PLT entry for this symbol. This
3339 1.1 skrll happens when statically linking PIC code, or when
3340 1.1 skrll using -Bsymbolic. */
3341 1.1 skrll break;
3342 1.1 skrll }
3343 1.1 skrll
3344 1.1 skrll if (splt == NULL)
3345 1.1 skrll {
3346 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
3347 1.1 skrll BFD_ASSERT (splt != NULL);
3348 1.1 skrll }
3349 1.1 skrll
3350 1.1 skrll relocation = (splt->output_section->vma
3351 1.1 skrll + splt->output_offset
3352 1.1 skrll + h->plt.offset);
3353 1.1 skrll unresolved_reloc = FALSE;
3354 1.1 skrll break;
3355 1.1 skrll
3356 1.1 skrll case R_68K_PLT8O:
3357 1.1 skrll case R_68K_PLT16O:
3358 1.1 skrll case R_68K_PLT32O:
3359 1.1 skrll /* Relocation is the offset of the entry for this symbol in
3360 1.1 skrll the procedure linkage table. */
3361 1.1 skrll BFD_ASSERT (h != NULL && h->plt.offset != (bfd_vma) -1);
3362 1.1 skrll
3363 1.1 skrll if (splt == NULL)
3364 1.1 skrll {
3365 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
3366 1.1 skrll BFD_ASSERT (splt != NULL);
3367 1.1 skrll }
3368 1.1 skrll
3369 1.1 skrll relocation = h->plt.offset;
3370 1.1 skrll unresolved_reloc = FALSE;
3371 1.1 skrll
3372 1.1 skrll /* This relocation does not use the addend. */
3373 1.1 skrll rel->r_addend = 0;
3374 1.1 skrll
3375 1.1 skrll break;
3376 1.1 skrll
3377 1.1 skrll case R_68K_PC8:
3378 1.1 skrll case R_68K_PC16:
3379 1.1 skrll case R_68K_PC32:
3380 1.1 skrll if (h == NULL
3381 1.1 skrll || (info->shared
3382 1.1 skrll && h->forced_local))
3383 1.1 skrll break;
3384 1.1 skrll /* Fall through. */
3385 1.1 skrll case R_68K_8:
3386 1.1 skrll case R_68K_16:
3387 1.1 skrll case R_68K_32:
3388 1.1 skrll if (info->shared
3389 1.1 skrll && r_symndx != 0
3390 1.1 skrll && (input_section->flags & SEC_ALLOC) != 0
3391 1.1 skrll && (h == NULL
3392 1.1 skrll || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3393 1.1 skrll || h->root.type != bfd_link_hash_undefweak)
3394 1.1 skrll && ((r_type != R_68K_PC8
3395 1.1 skrll && r_type != R_68K_PC16
3396 1.1 skrll && r_type != R_68K_PC32)
3397 1.1 skrll || (h != NULL
3398 1.1 skrll && h->dynindx != -1
3399 1.1 skrll && (!info->symbolic
3400 1.1 skrll || !h->def_regular))))
3401 1.1 skrll {
3402 1.1 skrll Elf_Internal_Rela outrel;
3403 1.1 skrll bfd_byte *loc;
3404 1.1 skrll bfd_boolean skip, relocate;
3405 1.1 skrll
3406 1.1 skrll /* When generating a shared object, these relocations
3407 1.1 skrll are copied into the output file to be resolved at run
3408 1.1 skrll time. */
3409 1.1 skrll
3410 1.1 skrll skip = FALSE;
3411 1.1 skrll relocate = FALSE;
3412 1.1 skrll
3413 1.1 skrll outrel.r_offset =
3414 1.1 skrll _bfd_elf_section_offset (output_bfd, info, input_section,
3415 1.1 skrll rel->r_offset);
3416 1.1 skrll if (outrel.r_offset == (bfd_vma) -1)
3417 1.1 skrll skip = TRUE;
3418 1.1 skrll else if (outrel.r_offset == (bfd_vma) -2)
3419 1.1 skrll skip = TRUE, relocate = TRUE;
3420 1.1 skrll outrel.r_offset += (input_section->output_section->vma
3421 1.1 skrll + input_section->output_offset);
3422 1.1 skrll
3423 1.1 skrll if (skip)
3424 1.1 skrll memset (&outrel, 0, sizeof outrel);
3425 1.1 skrll else if (h != NULL
3426 1.1 skrll && h->dynindx != -1
3427 1.1 skrll && (r_type == R_68K_PC8
3428 1.1 skrll || r_type == R_68K_PC16
3429 1.1 skrll || r_type == R_68K_PC32
3430 1.1 skrll || !info->shared
3431 1.1 skrll || !info->symbolic
3432 1.1 skrll || !h->def_regular))
3433 1.1 skrll {
3434 1.1 skrll outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3435 1.1 skrll outrel.r_addend = rel->r_addend;
3436 1.1 skrll }
3437 1.1 skrll else
3438 1.1 skrll {
3439 1.1 skrll /* This symbol is local, or marked to become local. */
3440 1.1 skrll outrel.r_addend = relocation + rel->r_addend;
3441 1.1 skrll
3442 1.1 skrll if (r_type == R_68K_32)
3443 1.1 skrll {
3444 1.1 skrll relocate = TRUE;
3445 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
3446 1.1 skrll }
3447 1.1 skrll else
3448 1.1 skrll {
3449 1.1 skrll long indx;
3450 1.1 skrll
3451 1.1 skrll if (bfd_is_abs_section (sec))
3452 1.1 skrll indx = 0;
3453 1.1 skrll else if (sec == NULL || sec->owner == NULL)
3454 1.1 skrll {
3455 1.1 skrll bfd_set_error (bfd_error_bad_value);
3456 1.1 skrll return FALSE;
3457 1.1 skrll }
3458 1.1 skrll else
3459 1.1 skrll {
3460 1.1 skrll asection *osec;
3461 1.1 skrll
3462 1.1 skrll /* We are turning this relocation into one
3463 1.1 skrll against a section symbol. It would be
3464 1.1 skrll proper to subtract the symbol's value,
3465 1.1 skrll osec->vma, from the emitted reloc addend,
3466 1.1 skrll but ld.so expects buggy relocs. */
3467 1.1 skrll osec = sec->output_section;
3468 1.1 skrll indx = elf_section_data (osec)->dynindx;
3469 1.1 skrll if (indx == 0)
3470 1.1 skrll {
3471 1.1 skrll struct elf_link_hash_table *htab;
3472 1.1 skrll htab = elf_hash_table (info);
3473 1.1 skrll osec = htab->text_index_section;
3474 1.1 skrll indx = elf_section_data (osec)->dynindx;
3475 1.1 skrll }
3476 1.1 skrll BFD_ASSERT (indx != 0);
3477 1.1 skrll }
3478 1.1 skrll
3479 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, r_type);
3480 1.1 skrll }
3481 1.1 skrll }
3482 1.1 skrll
3483 1.1 skrll sreloc = elf_section_data (input_section)->sreloc;
3484 1.1 skrll if (sreloc == NULL)
3485 1.1 skrll abort ();
3486 1.1 skrll
3487 1.1 skrll loc = sreloc->contents;
3488 1.1 skrll loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3489 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3490 1.1 skrll
3491 1.1 skrll /* This reloc will be computed at runtime, so there's no
3492 1.1 skrll need to do anything now, except for R_68K_32
3493 1.1 skrll relocations that have been turned into
3494 1.1 skrll R_68K_RELATIVE. */
3495 1.1 skrll if (!relocate)
3496 1.1 skrll continue;
3497 1.1 skrll }
3498 1.1 skrll
3499 1.1 skrll break;
3500 1.1 skrll
3501 1.1 skrll case R_68K_GNU_VTINHERIT:
3502 1.1 skrll case R_68K_GNU_VTENTRY:
3503 1.1 skrll /* These are no-ops in the end. */
3504 1.1 skrll continue;
3505 1.1 skrll
3506 1.1 skrll default:
3507 1.1 skrll break;
3508 1.1 skrll }
3509 1.1 skrll
3510 1.1 skrll /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3511 1.1 skrll because such sections are not SEC_ALLOC and thus ld.so will
3512 1.1 skrll not process them. */
3513 1.1 skrll if (unresolved_reloc
3514 1.1 skrll && !((input_section->flags & SEC_DEBUGGING) != 0
3515 1.1 skrll && h->def_dynamic))
3516 1.1 skrll {
3517 1.1 skrll (*_bfd_error_handler)
3518 1.1 skrll (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3519 1.1 skrll input_bfd,
3520 1.1 skrll input_section,
3521 1.1 skrll (long) rel->r_offset,
3522 1.1 skrll howto->name,
3523 1.1 skrll h->root.root.string);
3524 1.1 skrll return FALSE;
3525 1.1 skrll }
3526 1.1 skrll
3527 1.1 skrll r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3528 1.1 skrll contents, rel->r_offset,
3529 1.1 skrll relocation, rel->r_addend);
3530 1.1 skrll
3531 1.1 skrll if (r != bfd_reloc_ok)
3532 1.1 skrll {
3533 1.1 skrll const char *name;
3534 1.1 skrll
3535 1.1 skrll if (h != NULL)
3536 1.1 skrll name = h->root.root.string;
3537 1.1 skrll else
3538 1.1 skrll {
3539 1.1 skrll name = bfd_elf_string_from_elf_section (input_bfd,
3540 1.1 skrll symtab_hdr->sh_link,
3541 1.1 skrll sym->st_name);
3542 1.1 skrll if (name == NULL)
3543 1.1 skrll return FALSE;
3544 1.1 skrll if (*name == '\0')
3545 1.1 skrll name = bfd_section_name (input_bfd, sec);
3546 1.1 skrll }
3547 1.1 skrll
3548 1.1 skrll if (r == bfd_reloc_overflow)
3549 1.1 skrll {
3550 1.1 skrll if (!(info->callbacks->reloc_overflow
3551 1.1 skrll (info, (h ? &h->root : NULL), name, howto->name,
3552 1.1 skrll (bfd_vma) 0, input_bfd, input_section,
3553 1.1 skrll rel->r_offset)))
3554 1.1 skrll return FALSE;
3555 1.1 skrll }
3556 1.1 skrll else
3557 1.1 skrll {
3558 1.1 skrll (*_bfd_error_handler)
3559 1.1 skrll (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3560 1.1 skrll input_bfd, input_section,
3561 1.1 skrll (long) rel->r_offset, name, (int) r);
3562 1.1 skrll return FALSE;
3563 1.1 skrll }
3564 1.1 skrll }
3565 1.1 skrll }
3566 1.1 skrll
3567 1.1 skrll return TRUE;
3568 1.1 skrll }
3569 1.1 skrll
3570 1.1 skrll /* Install an M_68K_PC32 relocation against VALUE at offset OFFSET
3571 1.1 skrll into section SEC. */
3572 1.1 skrll
3573 1.1 skrll static void
3574 1.1 skrll elf_m68k_install_pc32 (asection *sec, bfd_vma offset, bfd_vma value)
3575 1.1 skrll {
3576 1.1 skrll /* Make VALUE PC-relative. */
3577 1.1 skrll value -= sec->output_section->vma + offset;
3578 1.1 skrll
3579 1.1 skrll /* Apply any in-place addend. */
3580 1.1 skrll value += bfd_get_32 (sec->owner, sec->contents + offset);
3581 1.1 skrll
3582 1.1 skrll bfd_put_32 (sec->owner, value, sec->contents + offset);
3583 1.1 skrll }
3584 1.1 skrll
3585 1.1 skrll /* Finish up dynamic symbol handling. We set the contents of various
3586 1.1 skrll dynamic sections here. */
3587 1.1 skrll
3588 1.1 skrll static bfd_boolean
3589 1.1 skrll elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
3590 1.1 skrll bfd *output_bfd;
3591 1.1 skrll struct bfd_link_info *info;
3592 1.1 skrll struct elf_link_hash_entry *h;
3593 1.1 skrll Elf_Internal_Sym *sym;
3594 1.1 skrll {
3595 1.1 skrll bfd *dynobj;
3596 1.1 skrll
3597 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
3598 1.1 skrll
3599 1.1 skrll if (h->plt.offset != (bfd_vma) -1)
3600 1.1 skrll {
3601 1.1 skrll const struct elf_m68k_plt_info *plt_info;
3602 1.1 skrll asection *splt;
3603 1.1 skrll asection *sgot;
3604 1.1 skrll asection *srela;
3605 1.1 skrll bfd_vma plt_index;
3606 1.1 skrll bfd_vma got_offset;
3607 1.1 skrll Elf_Internal_Rela rela;
3608 1.1 skrll bfd_byte *loc;
3609 1.1 skrll
3610 1.1 skrll /* This symbol has an entry in the procedure linkage table. Set
3611 1.1 skrll it up. */
3612 1.1 skrll
3613 1.1 skrll BFD_ASSERT (h->dynindx != -1);
3614 1.1 skrll
3615 1.1 skrll plt_info = elf_m68k_hash_table (info)->plt_info;
3616 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
3617 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3618 1.1 skrll srela = bfd_get_section_by_name (dynobj, ".rela.plt");
3619 1.1 skrll BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
3620 1.1 skrll
3621 1.1 skrll /* Get the index in the procedure linkage table which
3622 1.1 skrll corresponds to this symbol. This is the index of this symbol
3623 1.1 skrll in all the symbols for which we are making plt entries. The
3624 1.1 skrll first entry in the procedure linkage table is reserved. */
3625 1.1 skrll plt_index = (h->plt.offset / plt_info->size) - 1;
3626 1.1 skrll
3627 1.1 skrll /* Get the offset into the .got table of the entry that
3628 1.1 skrll corresponds to this function. Each .got entry is 4 bytes.
3629 1.1 skrll The first three are reserved. */
3630 1.1 skrll got_offset = (plt_index + 3) * 4;
3631 1.1 skrll
3632 1.1 skrll memcpy (splt->contents + h->plt.offset,
3633 1.1 skrll plt_info->symbol_entry,
3634 1.1 skrll plt_info->size);
3635 1.1 skrll
3636 1.1 skrll elf_m68k_install_pc32 (splt, h->plt.offset + plt_info->symbol_relocs.got,
3637 1.1 skrll (sgot->output_section->vma
3638 1.1 skrll + sgot->output_offset
3639 1.1 skrll + got_offset));
3640 1.1 skrll
3641 1.1 skrll bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
3642 1.1 skrll splt->contents
3643 1.1 skrll + h->plt.offset
3644 1.1 skrll + plt_info->symbol_resolve_entry + 2);
3645 1.1 skrll
3646 1.1 skrll elf_m68k_install_pc32 (splt, h->plt.offset + plt_info->symbol_relocs.plt,
3647 1.1 skrll splt->output_section->vma);
3648 1.1 skrll
3649 1.1 skrll /* Fill in the entry in the global offset table. */
3650 1.1 skrll bfd_put_32 (output_bfd,
3651 1.1 skrll (splt->output_section->vma
3652 1.1 skrll + splt->output_offset
3653 1.1 skrll + h->plt.offset
3654 1.1 skrll + plt_info->symbol_resolve_entry),
3655 1.1 skrll sgot->contents + got_offset);
3656 1.1 skrll
3657 1.1 skrll /* Fill in the entry in the .rela.plt section. */
3658 1.1 skrll rela.r_offset = (sgot->output_section->vma
3659 1.1 skrll + sgot->output_offset
3660 1.1 skrll + got_offset);
3661 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_JMP_SLOT);
3662 1.1 skrll rela.r_addend = 0;
3663 1.1 skrll loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
3664 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3665 1.1 skrll
3666 1.1 skrll if (!h->def_regular)
3667 1.1 skrll {
3668 1.1 skrll /* Mark the symbol as undefined, rather than as defined in
3669 1.1 skrll the .plt section. Leave the value alone. */
3670 1.1 skrll sym->st_shndx = SHN_UNDEF;
3671 1.1 skrll }
3672 1.1 skrll }
3673 1.1 skrll
3674 1.1 skrll if (elf_m68k_hash_entry (h)->glist != NULL)
3675 1.1 skrll {
3676 1.1 skrll asection *sgot;
3677 1.1 skrll asection *srela;
3678 1.1 skrll struct elf_m68k_got_entry *got_entry;
3679 1.1 skrll
3680 1.1 skrll /* This symbol has an entry in the global offset table. Set it
3681 1.1 skrll up. */
3682 1.1 skrll
3683 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got");
3684 1.1 skrll srela = bfd_get_section_by_name (dynobj, ".rela.got");
3685 1.1 skrll BFD_ASSERT (sgot != NULL && srela != NULL);
3686 1.1 skrll
3687 1.1 skrll got_entry = elf_m68k_hash_entry (h)->glist;
3688 1.1 skrll
3689 1.1 skrll while (got_entry != NULL)
3690 1.1 skrll {
3691 1.1 skrll Elf_Internal_Rela rela;
3692 1.1 skrll bfd_byte *loc;
3693 1.1 skrll
3694 1.1 skrll rela.r_offset = (sgot->output_section->vma
3695 1.1 skrll + sgot->output_offset
3696 1.1 skrll + (got_entry->u.s2.offset &~ (bfd_vma) 1));
3697 1.1 skrll
3698 1.1 skrll /* If this is a -Bsymbolic link, and the symbol is defined
3699 1.1 skrll locally, we just want to emit a RELATIVE reloc. Likewise if
3700 1.1 skrll the symbol was forced to be local because of a version file.
3701 1.1 skrll The entry in the global offset table will already have been
3702 1.1 skrll initialized in the relocate_section function. */
3703 1.1 skrll if (info->shared
3704 1.1 skrll && (info->symbolic
3705 1.1 skrll || h->dynindx == -1
3706 1.1 skrll || h->forced_local)
3707 1.1 skrll && h->def_regular)
3708 1.1 skrll {
3709 1.1 skrll rela.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
3710 1.1 skrll rela.r_addend = bfd_get_signed_32 (output_bfd,
3711 1.1 skrll (sgot->contents
3712 1.1 skrll + (got_entry->u.s2.offset
3713 1.1 skrll &~ (bfd_vma) 1)));
3714 1.1 skrll }
3715 1.1 skrll else
3716 1.1 skrll {
3717 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0,
3718 1.1 skrll sgot->contents + (got_entry->u.s2.offset
3719 1.1 skrll &~ (bfd_vma) 1));
3720 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_GLOB_DAT);
3721 1.1 skrll rela.r_addend = 0;
3722 1.1 skrll }
3723 1.1 skrll
3724 1.1 skrll loc = srela->contents;
3725 1.1 skrll loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
3726 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3727 1.1 skrll
3728 1.1 skrll got_entry = got_entry->u.s2.next;
3729 1.1 skrll }
3730 1.1 skrll }
3731 1.1 skrll
3732 1.1 skrll if (h->needs_copy)
3733 1.1 skrll {
3734 1.1 skrll asection *s;
3735 1.1 skrll Elf_Internal_Rela rela;
3736 1.1 skrll bfd_byte *loc;
3737 1.1 skrll
3738 1.1 skrll /* This symbol needs a copy reloc. Set it up. */
3739 1.1 skrll
3740 1.1 skrll BFD_ASSERT (h->dynindx != -1
3741 1.1 skrll && (h->root.type == bfd_link_hash_defined
3742 1.1 skrll || h->root.type == bfd_link_hash_defweak));
3743 1.1 skrll
3744 1.1 skrll s = bfd_get_section_by_name (h->root.u.def.section->owner,
3745 1.1 skrll ".rela.bss");
3746 1.1 skrll BFD_ASSERT (s != NULL);
3747 1.1 skrll
3748 1.1 skrll rela.r_offset = (h->root.u.def.value
3749 1.1 skrll + h->root.u.def.section->output_section->vma
3750 1.1 skrll + h->root.u.def.section->output_offset);
3751 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_COPY);
3752 1.1 skrll rela.r_addend = 0;
3753 1.1 skrll loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
3754 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3755 1.1 skrll }
3756 1.1 skrll
3757 1.1 skrll /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
3758 1.1 skrll if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3759 1.1 skrll || h == elf_hash_table (info)->hgot)
3760 1.1 skrll sym->st_shndx = SHN_ABS;
3761 1.1 skrll
3762 1.1 skrll return TRUE;
3763 1.1 skrll }
3764 1.1 skrll
3765 1.1 skrll /* Finish up the dynamic sections. */
3766 1.1 skrll
3767 1.1 skrll static bfd_boolean
3768 1.1 skrll elf_m68k_finish_dynamic_sections (output_bfd, info)
3769 1.1 skrll bfd *output_bfd;
3770 1.1 skrll struct bfd_link_info *info;
3771 1.1 skrll {
3772 1.1 skrll bfd *dynobj;
3773 1.1 skrll asection *sgot;
3774 1.1 skrll asection *sdyn;
3775 1.1 skrll
3776 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
3777 1.1 skrll
3778 1.1 skrll sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3779 1.1 skrll BFD_ASSERT (sgot != NULL);
3780 1.1 skrll sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3781 1.1 skrll
3782 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created)
3783 1.1 skrll {
3784 1.1 skrll asection *splt;
3785 1.1 skrll Elf32_External_Dyn *dyncon, *dynconend;
3786 1.1 skrll
3787 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
3788 1.1 skrll BFD_ASSERT (splt != NULL && sdyn != NULL);
3789 1.1 skrll
3790 1.1 skrll dyncon = (Elf32_External_Dyn *) sdyn->contents;
3791 1.1 skrll dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3792 1.1 skrll for (; dyncon < dynconend; dyncon++)
3793 1.1 skrll {
3794 1.1 skrll Elf_Internal_Dyn dyn;
3795 1.1 skrll const char *name;
3796 1.1 skrll asection *s;
3797 1.1 skrll
3798 1.1 skrll bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3799 1.1 skrll
3800 1.1 skrll switch (dyn.d_tag)
3801 1.1 skrll {
3802 1.1 skrll default:
3803 1.1 skrll break;
3804 1.1 skrll
3805 1.1 skrll case DT_PLTGOT:
3806 1.1 skrll name = ".got";
3807 1.1 skrll goto get_vma;
3808 1.1 skrll case DT_JMPREL:
3809 1.1 skrll name = ".rela.plt";
3810 1.1 skrll get_vma:
3811 1.1 skrll s = bfd_get_section_by_name (output_bfd, name);
3812 1.1 skrll BFD_ASSERT (s != NULL);
3813 1.1 skrll dyn.d_un.d_ptr = s->vma;
3814 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3815 1.1 skrll break;
3816 1.1 skrll
3817 1.1 skrll case DT_PLTRELSZ:
3818 1.1 skrll s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3819 1.1 skrll BFD_ASSERT (s != NULL);
3820 1.1 skrll dyn.d_un.d_val = s->size;
3821 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3822 1.1 skrll break;
3823 1.1 skrll
3824 1.1 skrll case DT_RELASZ:
3825 1.1 skrll /* The procedure linkage table relocs (DT_JMPREL) should
3826 1.1 skrll not be included in the overall relocs (DT_RELA).
3827 1.1 skrll Therefore, we override the DT_RELASZ entry here to
3828 1.1 skrll make it not include the JMPREL relocs. Since the
3829 1.1 skrll linker script arranges for .rela.plt to follow all
3830 1.1 skrll other relocation sections, we don't have to worry
3831 1.1 skrll about changing the DT_RELA entry. */
3832 1.1 skrll s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3833 1.1 skrll if (s != NULL)
3834 1.1 skrll dyn.d_un.d_val -= s->size;
3835 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3836 1.1 skrll break;
3837 1.1 skrll }
3838 1.1 skrll }
3839 1.1 skrll
3840 1.1 skrll /* Fill in the first entry in the procedure linkage table. */
3841 1.1 skrll if (splt->size > 0)
3842 1.1 skrll {
3843 1.1 skrll const struct elf_m68k_plt_info *plt_info;
3844 1.1 skrll
3845 1.1 skrll plt_info = elf_m68k_hash_table (info)->plt_info;
3846 1.1 skrll memcpy (splt->contents, plt_info->plt0_entry, plt_info->size);
3847 1.1 skrll
3848 1.1 skrll elf_m68k_install_pc32 (splt, plt_info->plt0_relocs.got4,
3849 1.1 skrll (sgot->output_section->vma
3850 1.1 skrll + sgot->output_offset
3851 1.1 skrll + 4));
3852 1.1 skrll
3853 1.1 skrll elf_m68k_install_pc32 (splt, plt_info->plt0_relocs.got8,
3854 1.1 skrll (sgot->output_section->vma
3855 1.1 skrll + sgot->output_offset
3856 1.1 skrll + 8));
3857 1.1 skrll
3858 1.1 skrll elf_section_data (splt->output_section)->this_hdr.sh_entsize
3859 1.1 skrll = plt_info->size;
3860 1.1 skrll }
3861 1.1 skrll }
3862 1.1 skrll
3863 1.1 skrll /* Fill in the first three entries in the global offset table. */
3864 1.1 skrll if (sgot->size > 0)
3865 1.1 skrll {
3866 1.1 skrll if (sdyn == NULL)
3867 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
3868 1.1 skrll else
3869 1.1 skrll bfd_put_32 (output_bfd,
3870 1.1 skrll sdyn->output_section->vma + sdyn->output_offset,
3871 1.1 skrll sgot->contents);
3872 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
3873 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
3874 1.1 skrll }
3875 1.1 skrll
3876 1.1 skrll elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
3877 1.1 skrll
3878 1.1 skrll return TRUE;
3879 1.1 skrll }
3880 1.1 skrll
3881 1.1 skrll /* Given a .data section and a .emreloc in-memory section, store
3882 1.1 skrll relocation information into the .emreloc section which can be
3883 1.1 skrll used at runtime to relocate the section. This is called by the
3884 1.1 skrll linker when the --embedded-relocs switch is used. This is called
3885 1.1 skrll after the add_symbols entry point has been called for all the
3886 1.1 skrll objects, and before the final_link entry point is called. */
3887 1.1 skrll
3888 1.1 skrll bfd_boolean
3889 1.1 skrll bfd_m68k_elf32_create_embedded_relocs (abfd, info, datasec, relsec, errmsg)
3890 1.1 skrll bfd *abfd;
3891 1.1 skrll struct bfd_link_info *info;
3892 1.1 skrll asection *datasec;
3893 1.1 skrll asection *relsec;
3894 1.1 skrll char **errmsg;
3895 1.1 skrll {
3896 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
3897 1.1 skrll Elf_Internal_Sym *isymbuf = NULL;
3898 1.1 skrll Elf_Internal_Rela *internal_relocs = NULL;
3899 1.1 skrll Elf_Internal_Rela *irel, *irelend;
3900 1.1 skrll bfd_byte *p;
3901 1.1 skrll bfd_size_type amt;
3902 1.1 skrll
3903 1.1 skrll BFD_ASSERT (! info->relocatable);
3904 1.1 skrll
3905 1.1 skrll *errmsg = NULL;
3906 1.1 skrll
3907 1.1 skrll if (datasec->reloc_count == 0)
3908 1.1 skrll return TRUE;
3909 1.1 skrll
3910 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3911 1.1 skrll
3912 1.1 skrll /* Get a copy of the native relocations. */
3913 1.1 skrll internal_relocs = (_bfd_elf_link_read_relocs
3914 1.1 skrll (abfd, datasec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
3915 1.1 skrll info->keep_memory));
3916 1.1 skrll if (internal_relocs == NULL)
3917 1.1 skrll goto error_return;
3918 1.1 skrll
3919 1.1 skrll amt = (bfd_size_type) datasec->reloc_count * 12;
3920 1.1 skrll relsec->contents = (bfd_byte *) bfd_alloc (abfd, amt);
3921 1.1 skrll if (relsec->contents == NULL)
3922 1.1 skrll goto error_return;
3923 1.1 skrll
3924 1.1 skrll p = relsec->contents;
3925 1.1 skrll
3926 1.1 skrll irelend = internal_relocs + datasec->reloc_count;
3927 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++, p += 12)
3928 1.1 skrll {
3929 1.1 skrll asection *targetsec;
3930 1.1 skrll
3931 1.1 skrll /* We are going to write a four byte longword into the runtime
3932 1.1 skrll reloc section. The longword will be the address in the data
3933 1.1 skrll section which must be relocated. It is followed by the name
3934 1.1 skrll of the target section NUL-padded or truncated to 8
3935 1.1 skrll characters. */
3936 1.1 skrll
3937 1.1 skrll /* We can only relocate absolute longword relocs at run time. */
3938 1.1 skrll if (ELF32_R_TYPE (irel->r_info) != (int) R_68K_32)
3939 1.1 skrll {
3940 1.1 skrll *errmsg = _("unsupported reloc type");
3941 1.1 skrll bfd_set_error (bfd_error_bad_value);
3942 1.1 skrll goto error_return;
3943 1.1 skrll }
3944 1.1 skrll
3945 1.1 skrll /* Get the target section referred to by the reloc. */
3946 1.1 skrll if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
3947 1.1 skrll {
3948 1.1 skrll /* A local symbol. */
3949 1.1 skrll Elf_Internal_Sym *isym;
3950 1.1 skrll
3951 1.1 skrll /* Read this BFD's local symbols if we haven't done so already. */
3952 1.1 skrll if (isymbuf == NULL)
3953 1.1 skrll {
3954 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3955 1.1 skrll if (isymbuf == NULL)
3956 1.1 skrll isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3957 1.1 skrll symtab_hdr->sh_info, 0,
3958 1.1 skrll NULL, NULL, NULL);
3959 1.1 skrll if (isymbuf == NULL)
3960 1.1 skrll goto error_return;
3961 1.1 skrll }
3962 1.1 skrll
3963 1.1 skrll isym = isymbuf + ELF32_R_SYM (irel->r_info);
3964 1.1 skrll targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3965 1.1 skrll }
3966 1.1 skrll else
3967 1.1 skrll {
3968 1.1 skrll unsigned long indx;
3969 1.1 skrll struct elf_link_hash_entry *h;
3970 1.1 skrll
3971 1.1 skrll /* An external symbol. */
3972 1.1 skrll indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
3973 1.1 skrll h = elf_sym_hashes (abfd)[indx];
3974 1.1 skrll BFD_ASSERT (h != NULL);
3975 1.1 skrll if (h->root.type == bfd_link_hash_defined
3976 1.1 skrll || h->root.type == bfd_link_hash_defweak)
3977 1.1 skrll targetsec = h->root.u.def.section;
3978 1.1 skrll else
3979 1.1 skrll targetsec = NULL;
3980 1.1 skrll }
3981 1.1 skrll
3982 1.1 skrll bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
3983 1.1 skrll memset (p + 4, 0, 8);
3984 1.1 skrll if (targetsec != NULL)
3985 1.1 skrll strncpy ((char *) p + 4, targetsec->output_section->name, 8);
3986 1.1 skrll }
3987 1.1 skrll
3988 1.1 skrll if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
3989 1.1 skrll free (isymbuf);
3990 1.1 skrll if (internal_relocs != NULL
3991 1.1 skrll && elf_section_data (datasec)->relocs != internal_relocs)
3992 1.1 skrll free (internal_relocs);
3993 1.1 skrll return TRUE;
3994 1.1 skrll
3995 1.1 skrll error_return:
3996 1.1 skrll if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
3997 1.1 skrll free (isymbuf);
3998 1.1 skrll if (internal_relocs != NULL
3999 1.1 skrll && elf_section_data (datasec)->relocs != internal_relocs)
4000 1.1 skrll free (internal_relocs);
4001 1.1 skrll return FALSE;
4002 1.1 skrll }
4003 1.1 skrll
4004 1.1 skrll /* Set target options. */
4005 1.1 skrll
4006 1.1 skrll void
4007 1.1 skrll bfd_elf_m68k_set_target_options (struct bfd_link_info *info, int got_handling)
4008 1.1 skrll {
4009 1.1 skrll struct elf_m68k_link_hash_table *htab;
4010 1.1 skrll
4011 1.1 skrll htab = elf_m68k_hash_table (info);
4012 1.1 skrll
4013 1.1 skrll switch (got_handling)
4014 1.1 skrll {
4015 1.1 skrll case 0:
4016 1.1 skrll /* --got=single. */
4017 1.1 skrll htab->local_gp_p = FALSE;
4018 1.1 skrll htab->use_neg_got_offsets_p = FALSE;
4019 1.1 skrll htab->allow_multigot_p = FALSE;
4020 1.1 skrll break;
4021 1.1 skrll
4022 1.1 skrll case 1:
4023 1.1 skrll /* --got=negative. */
4024 1.1 skrll htab->local_gp_p = TRUE;
4025 1.1 skrll htab->use_neg_got_offsets_p = TRUE;
4026 1.1 skrll htab->allow_multigot_p = FALSE;
4027 1.1 skrll break;
4028 1.1 skrll
4029 1.1 skrll case 2:
4030 1.1 skrll /* --got=multigot. */
4031 1.1 skrll htab->local_gp_p = TRUE;
4032 1.1 skrll htab->use_neg_got_offsets_p = TRUE;
4033 1.1 skrll htab->allow_multigot_p = TRUE;
4034 1.1 skrll break;
4035 1.1 skrll
4036 1.1 skrll default:
4037 1.1 skrll BFD_ASSERT (FALSE);
4038 1.1 skrll }
4039 1.1 skrll }
4040 1.1 skrll
4041 1.1 skrll static enum elf_reloc_type_class
4042 1.1 skrll elf32_m68k_reloc_type_class (rela)
4043 1.1 skrll const Elf_Internal_Rela *rela;
4044 1.1 skrll {
4045 1.1 skrll switch ((int) ELF32_R_TYPE (rela->r_info))
4046 1.1 skrll {
4047 1.1 skrll case R_68K_RELATIVE:
4048 1.1 skrll return reloc_class_relative;
4049 1.1 skrll case R_68K_JMP_SLOT:
4050 1.1 skrll return reloc_class_plt;
4051 1.1 skrll case R_68K_COPY:
4052 1.1 skrll return reloc_class_copy;
4053 1.1 skrll default:
4054 1.1 skrll return reloc_class_normal;
4055 1.1 skrll }
4056 1.1 skrll }
4057 1.1 skrll
4058 1.1 skrll /* Return address for Ith PLT stub in section PLT, for relocation REL
4059 1.1 skrll or (bfd_vma) -1 if it should not be included. */
4060 1.1 skrll
4061 1.1 skrll static bfd_vma
4062 1.1 skrll elf_m68k_plt_sym_val (bfd_vma i, const asection *plt,
4063 1.1 skrll const arelent *rel ATTRIBUTE_UNUSED)
4064 1.1 skrll {
4065 1.1 skrll return plt->vma + (i + 1) * elf_m68k_get_plt_info (plt->owner)->size;
4066 1.1 skrll }
4067 1.1 skrll
4068 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_m68k_vec
4069 1.1 skrll #define TARGET_BIG_NAME "elf32-m68k"
4070 1.1 skrll #define ELF_MACHINE_CODE EM_68K
4071 1.1 skrll #define ELF_MAXPAGESIZE 0x2000
4072 1.1 skrll #define elf_backend_create_dynamic_sections \
4073 1.1 skrll _bfd_elf_create_dynamic_sections
4074 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create \
4075 1.1 skrll elf_m68k_link_hash_table_create
4076 1.1 skrll /* ??? Should it be this macro or bfd_elfNN_bfd_link_hash_table_create? */
4077 1.1 skrll #define bfd_elf32_bfd_link_hash_table_free \
4078 1.1 skrll elf_m68k_link_hash_table_free
4079 1.1 skrll #define bfd_elf32_bfd_final_link bfd_elf_final_link
4080 1.1 skrll
4081 1.1 skrll #define elf_backend_check_relocs elf_m68k_check_relocs
4082 1.1 skrll #define elf_backend_always_size_sections \
4083 1.1 skrll elf_m68k_always_size_sections
4084 1.1 skrll #define elf_backend_adjust_dynamic_symbol \
4085 1.1 skrll elf_m68k_adjust_dynamic_symbol
4086 1.1 skrll #define elf_backend_size_dynamic_sections \
4087 1.1 skrll elf_m68k_size_dynamic_sections
4088 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4089 1.1 skrll #define elf_backend_relocate_section elf_m68k_relocate_section
4090 1.1 skrll #define elf_backend_finish_dynamic_symbol \
4091 1.1 skrll elf_m68k_finish_dynamic_symbol
4092 1.1 skrll #define elf_backend_finish_dynamic_sections \
4093 1.1 skrll elf_m68k_finish_dynamic_sections
4094 1.1 skrll #define elf_backend_gc_mark_hook elf_m68k_gc_mark_hook
4095 1.1 skrll #define elf_backend_gc_sweep_hook elf_m68k_gc_sweep_hook
4096 1.1 skrll #define elf_backend_copy_indirect_symbol elf_m68k_copy_indirect_symbol
4097 1.1 skrll #define bfd_elf32_bfd_merge_private_bfd_data \
4098 1.1 skrll elf32_m68k_merge_private_bfd_data
4099 1.1 skrll #define bfd_elf32_bfd_set_private_flags \
4100 1.1 skrll elf32_m68k_set_private_flags
4101 1.1 skrll #define bfd_elf32_bfd_print_private_bfd_data \
4102 1.1 skrll elf32_m68k_print_private_bfd_data
4103 1.1 skrll #define elf_backend_reloc_type_class elf32_m68k_reloc_type_class
4104 1.1 skrll #define elf_backend_plt_sym_val elf_m68k_plt_sym_val
4105 1.1 skrll #define elf_backend_object_p elf32_m68k_object_p
4106 1.1 skrll
4107 1.1 skrll #define elf_backend_can_gc_sections 1
4108 1.1 skrll #define elf_backend_can_refcount 1
4109 1.1 skrll #define elf_backend_want_got_plt 1
4110 1.1 skrll #define elf_backend_plt_readonly 1
4111 1.1 skrll #define elf_backend_want_plt_sym 0
4112 1.1 skrll #define elf_backend_got_header_size 12
4113 1.1 skrll #define elf_backend_rela_normal 1
4114
4115 #include "elf32-target.h"
4116