1999-05-10 DJ Delorie <dj@cygnus.com>
[deliverable/binutils-gdb.git] / bfd / elf32-m68k.c
1 /* Motorola 68k series support for 32-bit ELF
2 Copyright 1993, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "bfd.h"
21 #include "sysdep.h"
22 #include "bfdlink.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/m68k.h"
26
27 static reloc_howto_type *reloc_type_lookup
28 PARAMS ((bfd *, bfd_reloc_code_real_type));
29 static void rtype_to_howto
30 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
31 static struct bfd_hash_entry *elf_m68k_link_hash_newfunc
32 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
33 static struct bfd_link_hash_table *elf_m68k_link_hash_table_create
34 PARAMS ((bfd *));
35 static boolean elf_m68k_check_relocs
36 PARAMS ((bfd *, struct bfd_link_info *, asection *,
37 const Elf_Internal_Rela *));
38 static asection *elf_m68k_gc_mark_hook
39 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
40 struct elf_link_hash_entry *, Elf_Internal_Sym *));
41 static boolean elf_m68k_gc_sweep_hook
42 PARAMS ((bfd *, struct bfd_link_info *, asection *,
43 const Elf_Internal_Rela *));
44 static boolean elf_m68k_adjust_dynamic_symbol
45 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
46 static boolean elf_m68k_adjust_dynindx
47 PARAMS ((struct elf_link_hash_entry *, PTR));
48 static boolean elf_m68k_size_dynamic_sections
49 PARAMS ((bfd *, struct bfd_link_info *));
50 static boolean elf_m68k_relocate_section
51 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
52 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
53 static boolean elf_m68k_finish_dynamic_symbol
54 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
55 Elf_Internal_Sym *));
56 static boolean elf_m68k_finish_dynamic_sections
57 PARAMS ((bfd *, struct bfd_link_info *));
58
59 static boolean elf32_m68k_set_private_flags
60 PARAMS ((bfd *, flagword));
61 static boolean elf32_m68k_copy_private_bfd_data
62 PARAMS ((bfd *, bfd *));
63 static boolean elf32_m68k_merge_private_bfd_data
64 PARAMS ((bfd *, bfd *));
65 static boolean elf32_m68k_print_private_bfd_data
66 PARAMS ((bfd *, PTR));
67
68 static reloc_howto_type howto_table[] = {
69 HOWTO(R_68K_NONE, 0, 0, 0, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_NONE", false, 0, 0x00000000,false),
70 HOWTO(R_68K_32, 0, 2,32, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_32", false, 0, 0xffffffff,false),
71 HOWTO(R_68K_16, 0, 1,16, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_16", false, 0, 0x0000ffff,false),
72 HOWTO(R_68K_8, 0, 0, 8, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_8", false, 0, 0x000000ff,false),
73 HOWTO(R_68K_PC32, 0, 2,32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PC32", false, 0, 0xffffffff,true),
74 HOWTO(R_68K_PC16, 0, 1,16, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PC16", false, 0, 0x0000ffff,true),
75 HOWTO(R_68K_PC8, 0, 0, 8, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PC8", false, 0, 0x000000ff,true),
76 HOWTO(R_68K_GOT32, 0, 2,32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32", false, 0, 0xffffffff,true),
77 HOWTO(R_68K_GOT16, 0, 1,16, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT16", false, 0, 0x0000ffff,true),
78 HOWTO(R_68K_GOT8, 0, 0, 8, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT8", false, 0, 0x000000ff,true),
79 HOWTO(R_68K_GOT32O, 0, 2,32, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32O", false, 0, 0xffffffff,false),
80 HOWTO(R_68K_GOT16O, 0, 1,16, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT16O", false, 0, 0x0000ffff,false),
81 HOWTO(R_68K_GOT8O, 0, 0, 8, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT8O", false, 0, 0x000000ff,false),
82 HOWTO(R_68K_PLT32, 0, 2,32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32", false, 0, 0xffffffff,true),
83 HOWTO(R_68K_PLT16, 0, 1,16, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT16", false, 0, 0x0000ffff,true),
84 HOWTO(R_68K_PLT8, 0, 0, 8, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT8", false, 0, 0x000000ff,true),
85 HOWTO(R_68K_PLT32O, 0, 2,32, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32O", false, 0, 0xffffffff,false),
86 HOWTO(R_68K_PLT16O, 0, 1,16, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT16O", false, 0, 0x0000ffff,false),
87 HOWTO(R_68K_PLT8O, 0, 0, 8, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT8O", false, 0, 0x000000ff,false),
88 HOWTO(R_68K_COPY, 0, 0, 0, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_COPY", false, 0, 0xffffffff,false),
89 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),
90 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),
91 HOWTO(R_68K_RELATIVE, 0, 2,32, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_RELATIVE", false, 0, 0xffffffff,false),
92 /* GNU extension to record C++ vtable hierarchy */
93 HOWTO (R_68K_GNU_VTINHERIT, /* type */
94 0, /* rightshift */
95 2, /* size (0 = byte, 1 = short, 2 = long) */
96 0, /* bitsize */
97 false, /* pc_relative */
98 0, /* bitpos */
99 complain_overflow_dont, /* complain_on_overflow */
100 NULL, /* special_function */
101 "R_68K_GNU_VTINHERIT", /* name */
102 false, /* partial_inplace */
103 0, /* src_mask */
104 0, /* dst_mask */
105 false),
106 /* GNU extension to record C++ vtable member usage */
107 HOWTO (R_68K_GNU_VTENTRY, /* type */
108 0, /* rightshift */
109 2, /* size (0 = byte, 1 = short, 2 = long) */
110 0, /* bitsize */
111 false, /* pc_relative */
112 0, /* bitpos */
113 complain_overflow_dont, /* complain_on_overflow */
114 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
115 "R_68K_GNU_VTENTRY", /* name */
116 false, /* partial_inplace */
117 0, /* src_mask */
118 0, /* dst_mask */
119 false),
120 };
121
122 static void
123 rtype_to_howto (abfd, cache_ptr, dst)
124 bfd *abfd;
125 arelent *cache_ptr;
126 Elf_Internal_Rela *dst;
127 {
128 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_68K_max);
129 cache_ptr->howto = &howto_table[ELF32_R_TYPE(dst->r_info)];
130 }
131
132 #define elf_info_to_howto rtype_to_howto
133
134 static const struct
135 {
136 bfd_reloc_code_real_type bfd_val;
137 int elf_val;
138 } reloc_map[] = {
139 { BFD_RELOC_NONE, R_68K_NONE },
140 { BFD_RELOC_32, R_68K_32 },
141 { BFD_RELOC_16, R_68K_16 },
142 { BFD_RELOC_8, R_68K_8 },
143 { BFD_RELOC_32_PCREL, R_68K_PC32 },
144 { BFD_RELOC_16_PCREL, R_68K_PC16 },
145 { BFD_RELOC_8_PCREL, R_68K_PC8 },
146 { BFD_RELOC_32_GOT_PCREL, R_68K_GOT32 },
147 { BFD_RELOC_16_GOT_PCREL, R_68K_GOT16 },
148 { BFD_RELOC_8_GOT_PCREL, R_68K_GOT8 },
149 { BFD_RELOC_32_GOTOFF, R_68K_GOT32O },
150 { BFD_RELOC_16_GOTOFF, R_68K_GOT16O },
151 { BFD_RELOC_8_GOTOFF, R_68K_GOT8O },
152 { BFD_RELOC_32_PLT_PCREL, R_68K_PLT32 },
153 { BFD_RELOC_16_PLT_PCREL, R_68K_PLT16 },
154 { BFD_RELOC_8_PLT_PCREL, R_68K_PLT8 },
155 { BFD_RELOC_32_PLTOFF, R_68K_PLT32O },
156 { BFD_RELOC_16_PLTOFF, R_68K_PLT16O },
157 { BFD_RELOC_8_PLTOFF, R_68K_PLT8O },
158 { BFD_RELOC_NONE, R_68K_COPY },
159 { BFD_RELOC_68K_GLOB_DAT, R_68K_GLOB_DAT },
160 { BFD_RELOC_68K_JMP_SLOT, R_68K_JMP_SLOT },
161 { BFD_RELOC_68K_RELATIVE, R_68K_RELATIVE },
162 { BFD_RELOC_CTOR, R_68K_32 },
163 { BFD_RELOC_VTABLE_INHERIT, R_68K_GNU_VTINHERIT },
164 { BFD_RELOC_VTABLE_ENTRY, R_68K_GNU_VTENTRY },
165 };
166
167 static reloc_howto_type *
168 reloc_type_lookup (abfd, code)
169 bfd *abfd;
170 bfd_reloc_code_real_type code;
171 {
172 unsigned int i;
173 for (i = 0; i < sizeof (reloc_map) / sizeof (reloc_map[0]); i++)
174 {
175 if (reloc_map[i].bfd_val == code)
176 return &howto_table[reloc_map[i].elf_val];
177 }
178 return 0;
179 }
180
181 #define bfd_elf32_bfd_reloc_type_lookup reloc_type_lookup
182 #define ELF_ARCH bfd_arch_m68k
183 /* end code generated by elf.el */
184
185 #define USE_RELA
186
187 \f
188 /* Functions for the m68k ELF linker. */
189
190 /* The name of the dynamic interpreter. This is put in the .interp
191 section. */
192
193 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
194
195 /* The size in bytes of an entry in the procedure linkage table. */
196
197 #define PLT_ENTRY_SIZE 20
198
199 /* The first entry in a procedure linkage table looks like this. See
200 the SVR4 ABI m68k supplement to see how this works. */
201
202 static const bfd_byte elf_m68k_plt0_entry[PLT_ENTRY_SIZE] =
203 {
204 0x2f, 0x3b, 0x01, 0x70, /* move.l (%pc,addr),-(%sp) */
205 0, 0, 0, 0, /* replaced with offset to .got + 4. */
206 0x4e, 0xfb, 0x01, 0x71, /* jmp ([%pc,addr]) */
207 0, 0, 0, 0, /* replaced with offset to .got + 8. */
208 0, 0, 0, 0 /* pad out to 20 bytes. */
209 };
210
211 /* Subsequent entries in a procedure linkage table look like this. */
212
213 static const bfd_byte elf_m68k_plt_entry[PLT_ENTRY_SIZE] =
214 {
215 0x4e, 0xfb, 0x01, 0x71, /* jmp ([%pc,symbol@GOTPC]) */
216 0, 0, 0, 0, /* replaced with offset to symbol's .got entry. */
217 0x2f, 0x3c, /* move.l #offset,-(%sp) */
218 0, 0, 0, 0, /* replaced with offset into relocation table. */
219 0x60, 0xff, /* bra.l .plt */
220 0, 0, 0, 0 /* replaced with offset to start of .plt. */
221 };
222
223 #define CPU32_FLAG(abfd) (elf_elfheader (abfd)->e_flags & EF_CPU32)
224
225 #define PLT_CPU32_ENTRY_SIZE 24
226 /* Procedure linkage table entries for the cpu32 */
227 static const bfd_byte elf_cpu32_plt0_entry[PLT_CPU32_ENTRY_SIZE] =
228 {
229 0x20, 0x7b, 0x01, 0x70, /* moveal %pc@(0xc), %a0 */
230 0, 0, 0, 0, /* replaced with offset to .got + 4. */
231 0x4e, 0xd0, /* jmp %a0@ */
232 0, 0, 0, 0, /* replace with offset to .got +8. */
233 0, 0, 0, 0, /* pad out to 24 bytes. */
234 0, 0, 0, 0, /* pad out to 24 bytes. */
235 0, 0
236 };
237
238 static const bfd_byte elf_cpu32_plt_entry[PLT_CPU32_ENTRY_SIZE] =
239 {
240 0x20, 0x7b, 0x01, 0x70, /* moveal %pc@(0xc), %a0 */
241 0, 0, 0, 0, /* replaced with offset to symbol's .got entry. */
242 0x4e, 0xd0, /* jmp %a0@ */
243 0x2f, 0x3c, /* move.l #offset,-(%sp) */
244 0, 0, 0, 0, /* replaced with offset into relocation table. */
245 0x60, 0xff, /* bra.l .plt */
246 0, 0, 0, 0, /* replaced with offset to start of .plt. */
247 0, 0
248 };
249
250 /* The m68k linker needs to keep track of the number of relocs that it
251 decides to copy in check_relocs for each symbol. This is so that it
252 can discard PC relative relocs if it doesn't need them when linking
253 with -Bsymbolic. We store the information in a field extending the
254 regular ELF linker hash table. */
255
256 /* This structure keeps track of the number of PC relative relocs we have
257 copied for a given symbol. */
258
259 struct elf_m68k_pcrel_relocs_copied
260 {
261 /* Next section. */
262 struct elf_m68k_pcrel_relocs_copied *next;
263 /* A section in dynobj. */
264 asection *section;
265 /* Number of relocs copied in this section. */
266 bfd_size_type count;
267 };
268
269 /* m68k ELF linker hash entry. */
270
271 struct elf_m68k_link_hash_entry
272 {
273 struct elf_link_hash_entry root;
274
275 /* Number of PC relative relocs copied for this symbol. */
276 struct elf_m68k_pcrel_relocs_copied *pcrel_relocs_copied;
277 };
278
279 /* m68k ELF linker hash table. */
280
281 struct elf_m68k_link_hash_table
282 {
283 struct elf_link_hash_table root;
284 };
285
286 /* Declare this now that the above structures are defined. */
287
288 static boolean elf_m68k_discard_copies
289 PARAMS ((struct elf_m68k_link_hash_entry *, PTR));
290
291 /* Traverse an m68k ELF linker hash table. */
292
293 #define elf_m68k_link_hash_traverse(table, func, info) \
294 (elf_link_hash_traverse \
295 (&(table)->root, \
296 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
297 (info)))
298
299 /* Get the m68k ELF linker hash table from a link_info structure. */
300
301 #define elf_m68k_hash_table(p) \
302 ((struct elf_m68k_link_hash_table *) (p)->hash)
303
304 /* Create an entry in an m68k ELF linker hash table. */
305
306 static struct bfd_hash_entry *
307 elf_m68k_link_hash_newfunc (entry, table, string)
308 struct bfd_hash_entry *entry;
309 struct bfd_hash_table *table;
310 const char *string;
311 {
312 struct elf_m68k_link_hash_entry *ret =
313 (struct elf_m68k_link_hash_entry *) entry;
314
315 /* Allocate the structure if it has not already been allocated by a
316 subclass. */
317 if (ret == (struct elf_m68k_link_hash_entry *) NULL)
318 ret = ((struct elf_m68k_link_hash_entry *)
319 bfd_hash_allocate (table,
320 sizeof (struct elf_m68k_link_hash_entry)));
321 if (ret == (struct elf_m68k_link_hash_entry *) NULL)
322 return (struct bfd_hash_entry *) ret;
323
324 /* Call the allocation method of the superclass. */
325 ret = ((struct elf_m68k_link_hash_entry *)
326 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
327 table, string));
328 if (ret != (struct elf_m68k_link_hash_entry *) NULL)
329 {
330 ret->pcrel_relocs_copied = NULL;
331 }
332
333 return (struct bfd_hash_entry *) ret;
334 }
335
336 /* Create an m68k ELF linker hash table. */
337
338 static struct bfd_link_hash_table *
339 elf_m68k_link_hash_table_create (abfd)
340 bfd *abfd;
341 {
342 struct elf_m68k_link_hash_table *ret;
343
344 ret = ((struct elf_m68k_link_hash_table *)
345 bfd_alloc (abfd, sizeof (struct elf_m68k_link_hash_table)));
346 if (ret == (struct elf_m68k_link_hash_table *) NULL)
347 return NULL;
348
349 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
350 elf_m68k_link_hash_newfunc))
351 {
352 bfd_release (abfd, ret);
353 return NULL;
354 }
355
356 return &ret->root.root;
357 }
358
359 /* Keep m68k-specific flags in the ELF header */
360 static boolean
361 elf32_m68k_set_private_flags (abfd, flags)
362 bfd *abfd;
363 flagword flags;
364 {
365 elf_elfheader (abfd)->e_flags = flags;
366 elf_flags_init (abfd) = true;
367 return true;
368 }
369
370 /* Copy m68k-specific data from one module to another */
371 static boolean
372 elf32_m68k_copy_private_bfd_data (ibfd, obfd)
373 bfd *ibfd;
374 bfd *obfd;
375 {
376 flagword in_flags;
377
378 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
379 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
380 return true;
381
382 in_flags = elf_elfheader (ibfd)->e_flags;
383
384 elf_elfheader (obfd)->e_flags = in_flags;
385 elf_flags_init (obfd) = true;
386
387 return true;
388 }
389
390 /* Merge backend specific data from an object file to the output
391 object file when linking. */
392 static boolean
393 elf32_m68k_merge_private_bfd_data (ibfd, obfd)
394 bfd *ibfd;
395 bfd *obfd;
396 {
397 flagword out_flags;
398 flagword in_flags;
399
400 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
401 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
402 return true;
403
404 in_flags = elf_elfheader (ibfd)->e_flags;
405 out_flags = elf_elfheader (obfd)->e_flags;
406
407 if (!elf_flags_init (obfd))
408 {
409 elf_flags_init (obfd) = true;
410 elf_elfheader (obfd)->e_flags = in_flags;
411 }
412
413 return true;
414 }
415
416 /* Display the flags field */
417 static boolean
418 elf32_m68k_print_private_bfd_data (abfd, ptr)
419 bfd *abfd;
420 PTR ptr;
421 {
422 FILE *file = (FILE *) ptr;
423
424 BFD_ASSERT (abfd != NULL && ptr != NULL);
425
426 /* Print normal ELF private data. */
427 _bfd_elf_print_private_bfd_data (abfd, ptr);
428
429 /* Ignore init flag - it may not be set, despite the flags field containing valid data. */
430
431 /* xgettext:c-format */
432 fprintf (file, _ ("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
433
434 if (elf_elfheader (abfd)->e_flags & EF_CPU32)
435 fprintf (file, _ (" [cpu32]"));
436
437 fputc ('\n', file);
438
439 return true;
440 }
441 /* Look through the relocs for a section during the first phase, and
442 allocate space in the global offset table or procedure linkage
443 table. */
444
445 static boolean
446 elf_m68k_check_relocs (abfd, info, sec, relocs)
447 bfd *abfd;
448 struct bfd_link_info *info;
449 asection *sec;
450 const Elf_Internal_Rela *relocs;
451 {
452 bfd *dynobj;
453 Elf_Internal_Shdr *symtab_hdr;
454 struct elf_link_hash_entry **sym_hashes;
455 bfd_signed_vma *local_got_refcounts;
456 const Elf_Internal_Rela *rel;
457 const Elf_Internal_Rela *rel_end;
458 asection *sgot;
459 asection *srelgot;
460 asection *sreloc;
461
462 if (info->relocateable)
463 return true;
464
465 dynobj = elf_hash_table (info)->dynobj;
466 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
467 sym_hashes = elf_sym_hashes (abfd);
468 local_got_refcounts = elf_local_got_refcounts (abfd);
469
470 sgot = NULL;
471 srelgot = NULL;
472 sreloc = NULL;
473
474 rel_end = relocs + sec->reloc_count;
475 for (rel = relocs; rel < rel_end; rel++)
476 {
477 unsigned long r_symndx;
478 struct elf_link_hash_entry *h;
479
480 r_symndx = ELF32_R_SYM (rel->r_info);
481
482 if (r_symndx < symtab_hdr->sh_info)
483 h = NULL;
484 else
485 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
486
487 switch (ELF32_R_TYPE (rel->r_info))
488 {
489 case R_68K_GOT8:
490 case R_68K_GOT16:
491 case R_68K_GOT32:
492 if (h != NULL
493 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
494 break;
495 /* Fall through. */
496 case R_68K_GOT8O:
497 case R_68K_GOT16O:
498 case R_68K_GOT32O:
499 /* This symbol requires a global offset table entry. */
500
501 if (dynobj == NULL)
502 {
503 /* Create the .got section. */
504 elf_hash_table (info)->dynobj = dynobj = abfd;
505 if (!_bfd_elf_create_got_section (dynobj, info))
506 return false;
507 }
508
509 if (sgot == NULL)
510 {
511 sgot = bfd_get_section_by_name (dynobj, ".got");
512 BFD_ASSERT (sgot != NULL);
513 }
514
515 if (srelgot == NULL
516 && (h != NULL || info->shared))
517 {
518 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
519 if (srelgot == NULL)
520 {
521 srelgot = bfd_make_section (dynobj, ".rela.got");
522 if (srelgot == NULL
523 || !bfd_set_section_flags (dynobj, srelgot,
524 (SEC_ALLOC
525 | SEC_LOAD
526 | SEC_HAS_CONTENTS
527 | SEC_IN_MEMORY
528 | SEC_LINKER_CREATED
529 | SEC_READONLY))
530 || !bfd_set_section_alignment (dynobj, srelgot, 2))
531 return false;
532 }
533 }
534
535 if (h != NULL)
536 {
537 if (h->got.refcount == -1)
538 {
539 h->got.refcount = 1;
540
541 /* Make sure this symbol is output as a dynamic symbol. */
542 if (h->dynindx == -1)
543 {
544 if (!bfd_elf32_link_record_dynamic_symbol (info, h))
545 return false;
546 }
547
548 /* Allocate space in the .got section. */
549 sgot->_raw_size += 4;
550 /* Allocate relocation space. */
551 srelgot->_raw_size += sizeof (Elf32_External_Rela);
552 }
553 else
554 h->got.refcount++;
555 }
556 else
557 {
558 /* This is a global offset table entry for a local symbol. */
559 if (local_got_refcounts == NULL)
560 {
561 size_t size;
562
563 size = symtab_hdr->sh_info * sizeof (bfd_signed_vma);
564 local_got_refcounts = ((bfd_signed_vma *)
565 bfd_alloc (abfd, size));
566 if (local_got_refcounts == NULL)
567 return false;
568 elf_local_got_refcounts (abfd) = local_got_refcounts;
569 memset (local_got_refcounts, -1, size);
570 }
571 if (local_got_refcounts[r_symndx] == -1)
572 {
573 local_got_refcounts[r_symndx] = 1;
574
575 sgot->_raw_size += 4;
576 if (info->shared)
577 {
578 /* If we are generating a shared object, we need to
579 output a R_68K_RELATIVE reloc so that the dynamic
580 linker can adjust this GOT entry. */
581 srelgot->_raw_size += sizeof (Elf32_External_Rela);
582 }
583 }
584 else
585 local_got_refcounts[r_symndx]++;
586 }
587 break;
588
589 case R_68K_PLT8:
590 case R_68K_PLT16:
591 case R_68K_PLT32:
592 /* This symbol requires a procedure linkage table entry. We
593 actually build the entry in adjust_dynamic_symbol,
594 because this might be a case of linking PIC code which is
595 never referenced by a dynamic object, in which case we
596 don't need to generate a procedure linkage table entry
597 after all. */
598
599 /* If this is a local symbol, we resolve it directly without
600 creating a procedure linkage table entry. */
601 if (h == NULL)
602 continue;
603
604 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
605 if (h->plt.refcount == -1)
606 h->plt.refcount = 1;
607 else
608 h->plt.refcount++;
609 break;
610
611 case R_68K_PLT8O:
612 case R_68K_PLT16O:
613 case R_68K_PLT32O:
614 /* This symbol requires a procedure linkage table entry. */
615
616 if (h == NULL)
617 {
618 /* It does not make sense to have this relocation for a
619 local symbol. FIXME: does it? How to handle it if
620 it does make sense? */
621 bfd_set_error (bfd_error_bad_value);
622 return false;
623 }
624
625 /* Make sure this symbol is output as a dynamic symbol. */
626 if (h->dynindx == -1)
627 {
628 if (!bfd_elf32_link_record_dynamic_symbol (info, h))
629 return false;
630 }
631
632 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
633 if (h->plt.refcount == -1)
634 h->plt.refcount = 1;
635 else
636 h->plt.refcount++;
637 break;
638
639 case R_68K_PC8:
640 case R_68K_PC16:
641 case R_68K_PC32:
642 /* If we are creating a shared library and this is not a local
643 symbol, we need to copy the reloc into the shared library.
644 However when linking with -Bsymbolic and this is a global
645 symbol which is defined in an object we are including in the
646 link (i.e., DEF_REGULAR is set), then we can resolve the
647 reloc directly. At this point we have not seen all the input
648 files, so it is possible that DEF_REGULAR is not set now but
649 will be set later (it is never cleared). We account for that
650 possibility below by storing information in the
651 pcrel_relocs_copied field of the hash table entry. */
652 if (!(info->shared
653 && (sec->flags & SEC_ALLOC) != 0
654 && h != NULL
655 && (!info->symbolic
656 || (h->elf_link_hash_flags
657 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
658 {
659 if (h != NULL)
660 {
661 /* Make sure a plt entry is created for this symbol if
662 it turns out to be a function defined by a dynamic
663 object. */
664 if (h->plt.refcount == -1)
665 h->plt.refcount = 1;
666 else
667 h->plt.refcount++;
668 }
669 break;
670 }
671 /* Fall through. */
672 case R_68K_8:
673 case R_68K_16:
674 case R_68K_32:
675 if (h != NULL)
676 {
677 /* Make sure a plt entry is created for this symbol if it
678 turns out to be a function defined by a dynamic object. */
679 if (h->plt.refcount == -1)
680 h->plt.refcount = 1;
681 else
682 h->plt.refcount++;
683 }
684
685 /* If we are creating a shared library, we need to copy the
686 reloc into the shared library. */
687 if (info->shared
688 && (sec->flags & SEC_ALLOC) != 0)
689 {
690 /* When creating a shared object, we must copy these
691 reloc types into the output file. We create a reloc
692 section in dynobj and make room for this reloc. */
693 if (sreloc == NULL)
694 {
695 const char *name;
696
697 name = (bfd_elf_string_from_elf_section
698 (abfd,
699 elf_elfheader (abfd)->e_shstrndx,
700 elf_section_data (sec)->rel_hdr.sh_name));
701 if (name == NULL)
702 return false;
703
704 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
705 && strcmp (bfd_get_section_name (abfd, sec),
706 name + 5) == 0);
707
708 sreloc = bfd_get_section_by_name (dynobj, name);
709 if (sreloc == NULL)
710 {
711 sreloc = bfd_make_section (dynobj, name);
712 if (sreloc == NULL
713 || !bfd_set_section_flags (dynobj, sreloc,
714 (SEC_ALLOC
715 | SEC_LOAD
716 | SEC_HAS_CONTENTS
717 | SEC_IN_MEMORY
718 | SEC_LINKER_CREATED
719 | SEC_READONLY))
720 || !bfd_set_section_alignment (dynobj, sreloc, 2))
721 return false;
722 }
723 }
724
725 sreloc->_raw_size += sizeof (Elf32_External_Rela);
726
727 /* If we are linking with -Bsymbolic, we count the number of
728 PC relative relocations we have entered for this symbol,
729 so that we can discard them again if the symbol is later
730 defined by a regular object. Note that this function is
731 only called if we are using an m68kelf linker hash table,
732 which means that h is really a pointer to an
733 elf_m68k_link_hash_entry. */
734 if ((ELF32_R_TYPE (rel->r_info) == R_68K_PC8
735 || ELF32_R_TYPE (rel->r_info) == R_68K_PC16
736 || ELF32_R_TYPE (rel->r_info) == R_68K_PC32)
737 && info->symbolic)
738 {
739 struct elf_m68k_link_hash_entry *eh;
740 struct elf_m68k_pcrel_relocs_copied *p;
741
742 eh = (struct elf_m68k_link_hash_entry *) h;
743
744 for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
745 if (p->section == sreloc)
746 break;
747
748 if (p == NULL)
749 {
750 p = ((struct elf_m68k_pcrel_relocs_copied *)
751 bfd_alloc (dynobj, sizeof *p));
752 if (p == NULL)
753 return false;
754 p->next = eh->pcrel_relocs_copied;
755 eh->pcrel_relocs_copied = p;
756 p->section = sreloc;
757 p->count = 0;
758 }
759
760 ++p->count;
761 }
762 }
763
764 break;
765
766 /* This relocation describes the C++ object vtable hierarchy.
767 Reconstruct it for later use during GC. */
768 case R_68K_GNU_VTINHERIT:
769 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
770 return false;
771 break;
772
773 /* This relocation describes which C++ vtable entries are actually
774 used. Record for later use during GC. */
775 case R_68K_GNU_VTENTRY:
776 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
777 return false;
778 break;
779
780 default:
781 break;
782 }
783 }
784
785 return true;
786 }
787
788 /* Return the section that should be marked against GC for a given
789 relocation. */
790
791 static asection *
792 elf_m68k_gc_mark_hook (abfd, info, rel, h, sym)
793 bfd *abfd;
794 struct bfd_link_info *info;
795 Elf_Internal_Rela *rel;
796 struct elf_link_hash_entry *h;
797 Elf_Internal_Sym *sym;
798 {
799 if (h != NULL)
800 {
801 switch (ELF32_R_TYPE (rel->r_info))
802 {
803 case R_68K_GNU_VTINHERIT:
804 case R_68K_GNU_VTENTRY:
805 break;
806
807 default:
808 switch (h->root.type)
809 {
810 default:
811 break;
812
813 case bfd_link_hash_defined:
814 case bfd_link_hash_defweak:
815 return h->root.u.def.section;
816
817 case bfd_link_hash_common:
818 return h->root.u.c.p->section;
819 }
820 }
821 }
822 else
823 {
824 if (!(elf_bad_symtab (abfd)
825 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
826 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
827 && sym->st_shndx != SHN_COMMON))
828 {
829 return bfd_section_from_elf_index (abfd, sym->st_shndx);
830 }
831 }
832
833 return NULL;
834 }
835
836 /* Update the got entry reference counts for the section being removed. */
837
838 static boolean
839 elf_m68k_gc_sweep_hook (abfd, info, sec, relocs)
840 bfd *abfd;
841 struct bfd_link_info *info;
842 asection *sec;
843 const Elf_Internal_Rela *relocs;
844 {
845 Elf_Internal_Shdr *symtab_hdr;
846 struct elf_link_hash_entry **sym_hashes;
847 bfd_signed_vma *local_got_refcounts;
848 const Elf_Internal_Rela *rel, *relend;
849 unsigned long r_symndx;
850 struct elf_link_hash_entry *h;
851 bfd *dynobj;
852 asection *sgot;
853 asection *srelgot;
854
855 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
856 sym_hashes = elf_sym_hashes (abfd);
857 local_got_refcounts = elf_local_got_refcounts (abfd);
858
859 dynobj = elf_hash_table (info)->dynobj;
860 if (dynobj)
861 {
862 sgot = bfd_get_section_by_name (dynobj, ".got");
863 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
864 }
865
866 relend = relocs + sec->reloc_count;
867 for (rel = relocs; rel < relend; rel++)
868 {
869 switch (ELF32_R_TYPE (rel->r_info))
870 {
871 case R_68K_GOT8:
872 case R_68K_GOT16:
873 case R_68K_GOT32:
874 case R_68K_GOT8O:
875 case R_68K_GOT16O:
876 case R_68K_GOT32O:
877 r_symndx = ELF32_R_SYM (rel->r_info);
878 if (r_symndx >= symtab_hdr->sh_info)
879 {
880 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
881 if (h->got.refcount > 0)
882 {
883 --h->got.refcount;
884 if (h->got.refcount == 0)
885 {
886 /* We don't need the .got entry any more. */
887 sgot->_raw_size -= 4;
888 srelgot->_raw_size -= sizeof (Elf32_External_Rela);
889 }
890 }
891 }
892 else
893 {
894 if (local_got_refcounts[r_symndx] > 0)
895 {
896 --local_got_refcounts[r_symndx];
897 if (local_got_refcounts[r_symndx] == 0)
898 {
899 /* We don't need the .got entry any more. */
900 sgot->_raw_size -= 4;
901 if (info->shared)
902 srelgot->_raw_size -= sizeof (Elf32_External_Rela);
903 }
904 }
905 }
906 break;
907
908 case R_68K_PLT8:
909 case R_68K_PLT16:
910 case R_68K_PLT32:
911 case R_68K_PLT8O:
912 case R_68K_PLT16O:
913 case R_68K_PLT32O:
914 case R_68K_PC8:
915 case R_68K_PC16:
916 case R_68K_PC32:
917 case R_68K_8:
918 case R_68K_16:
919 case R_68K_32:
920 r_symndx = ELF32_R_SYM (rel->r_info);
921 if (r_symndx >= symtab_hdr->sh_info)
922 {
923 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
924 if (h->plt.refcount > 0)
925 --h->plt.refcount;
926 }
927 break;
928
929 default:
930 break;
931 }
932 }
933
934 return true;
935 }
936
937
938 /* Adjust a symbol defined by a dynamic object and referenced by a
939 regular object. The current definition is in some section of the
940 dynamic object, but we're not including those sections. We have to
941 change the definition to something the rest of the link can
942 understand. */
943
944 static boolean
945 elf_m68k_adjust_dynamic_symbol (info, h)
946 struct bfd_link_info *info;
947 struct elf_link_hash_entry *h;
948 {
949 bfd *dynobj;
950 asection *s;
951 unsigned int power_of_two;
952
953 dynobj = elf_hash_table (info)->dynobj;
954
955 /* Make sure we know what is going on here. */
956 BFD_ASSERT (dynobj != NULL
957 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
958 || h->weakdef != NULL
959 || ((h->elf_link_hash_flags
960 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
961 && (h->elf_link_hash_flags
962 & ELF_LINK_HASH_REF_REGULAR) != 0
963 && (h->elf_link_hash_flags
964 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
965
966 /* If this is a function, put it in the procedure linkage table. We
967 will fill in the contents of the procedure linkage table later,
968 when we know the address of the .got section. */
969 if (h->type == STT_FUNC
970 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
971 {
972 if (! info->shared
973 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
974 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
975 /* We must always create the plt entry if it was referenced
976 by a PLTxxO relocation. In this case we already recorded
977 it as a dynamic symbol. */
978 && h->dynindx == -1)
979 {
980 /* This case can occur if we saw a PLTxx reloc in an input
981 file, but the symbol was never referred to by a dynamic
982 object. In such a case, we don't actually need to build
983 a procedure linkage table, and we can just do a PCxx
984 reloc instead. */
985 BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
986 h->plt.offset = (bfd_vma) -1;
987 return true;
988 }
989
990 /* GC may have rendered this entry unused. */
991 if (h->plt.refcount <= 0)
992 {
993 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
994 h->plt.offset = (bfd_vma) -1;
995 return true;
996 }
997
998 /* Make sure this symbol is output as a dynamic symbol. */
999 if (h->dynindx == -1)
1000 {
1001 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1002 return false;
1003 }
1004
1005 s = bfd_get_section_by_name (dynobj, ".plt");
1006 BFD_ASSERT (s != NULL);
1007
1008 /* If this is the first .plt entry, make room for the special
1009 first entry. */
1010 if (s->_raw_size == 0)
1011 if ( CPU32_FLAG (dynobj))
1012 s->_raw_size += PLT_CPU32_ENTRY_SIZE;
1013 else
1014 s->_raw_size += PLT_ENTRY_SIZE;
1015
1016 /* If this symbol is not defined in a regular file, and we are
1017 not generating a shared library, then set the symbol to this
1018 location in the .plt. This is required to make function
1019 pointers compare as equal between the normal executable and
1020 the shared library. */
1021 if (!info->shared
1022 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1023 {
1024 h->root.u.def.section = s;
1025 h->root.u.def.value = s->_raw_size;
1026 }
1027
1028 h->plt.offset = s->_raw_size;
1029
1030 /* Make room for this entry. */
1031 if (CPU32_FLAG (dynobj))
1032 s->_raw_size += PLT_CPU32_ENTRY_SIZE;
1033 else
1034 s->_raw_size += PLT_ENTRY_SIZE;
1035
1036 /* We also need to make an entry in the .got.plt section, which
1037 will be placed in the .got section by the linker script. */
1038
1039 s = bfd_get_section_by_name (dynobj, ".got.plt");
1040 BFD_ASSERT (s != NULL);
1041 s->_raw_size += 4;
1042
1043 /* We also need to make an entry in the .rela.plt section. */
1044
1045 s = bfd_get_section_by_name (dynobj, ".rela.plt");
1046 BFD_ASSERT (s != NULL);
1047 s->_raw_size += sizeof (Elf32_External_Rela);
1048
1049 return true;
1050 }
1051
1052 /* Reinitialize the plt offset now that it is not used as a reference
1053 count any more. */
1054 h->plt.offset = (bfd_vma) -1;
1055
1056 /* If this is a weak symbol, and there is a real definition, the
1057 processor independent code will have arranged for us to see the
1058 real definition first, and we can just use the same value. */
1059 if (h->weakdef != NULL)
1060 {
1061 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1062 || h->weakdef->root.type == bfd_link_hash_defweak);
1063 h->root.u.def.section = h->weakdef->root.u.def.section;
1064 h->root.u.def.value = h->weakdef->root.u.def.value;
1065 return true;
1066 }
1067
1068 /* This is a reference to a symbol defined by a dynamic object which
1069 is not a function. */
1070
1071 /* If we are creating a shared library, we must presume that the
1072 only references to the symbol are via the global offset table.
1073 For such cases we need not do anything here; the relocations will
1074 be handled correctly by relocate_section. */
1075 if (info->shared)
1076 return true;
1077
1078 /* We must allocate the symbol in our .dynbss section, which will
1079 become part of the .bss section of the executable. There will be
1080 an entry for this symbol in the .dynsym section. The dynamic
1081 object will contain position independent code, so all references
1082 from the dynamic object to this symbol will go through the global
1083 offset table. The dynamic linker will use the .dynsym entry to
1084 determine the address it must put in the global offset table, so
1085 both the dynamic object and the regular object will refer to the
1086 same memory location for the variable. */
1087
1088 s = bfd_get_section_by_name (dynobj, ".dynbss");
1089 BFD_ASSERT (s != NULL);
1090
1091 /* We must generate a R_68K_COPY reloc to tell the dynamic linker to
1092 copy the initial value out of the dynamic object and into the
1093 runtime process image. We need to remember the offset into the
1094 .rela.bss section we are going to use. */
1095 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1096 {
1097 asection *srel;
1098
1099 srel = bfd_get_section_by_name (dynobj, ".rela.bss");
1100 BFD_ASSERT (srel != NULL);
1101 srel->_raw_size += sizeof (Elf32_External_Rela);
1102 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1103 }
1104
1105 /* We need to figure out the alignment required for this symbol. I
1106 have no idea how ELF linkers handle this. */
1107 power_of_two = bfd_log2 (h->size);
1108 if (power_of_two > 3)
1109 power_of_two = 3;
1110
1111 /* Apply the required alignment. */
1112 s->_raw_size = BFD_ALIGN (s->_raw_size,
1113 (bfd_size_type) (1 << power_of_two));
1114 if (power_of_two > bfd_get_section_alignment (dynobj, s))
1115 {
1116 if (!bfd_set_section_alignment (dynobj, s, power_of_two))
1117 return false;
1118 }
1119
1120 /* Define the symbol as being at this point in the section. */
1121 h->root.u.def.section = s;
1122 h->root.u.def.value = s->_raw_size;
1123
1124 /* Increment the section size to make room for the symbol. */
1125 s->_raw_size += h->size;
1126
1127 return true;
1128 }
1129
1130 /* Set the sizes of the dynamic sections. */
1131
1132 static boolean
1133 elf_m68k_size_dynamic_sections (output_bfd, info)
1134 bfd *output_bfd;
1135 struct bfd_link_info *info;
1136 {
1137 bfd *dynobj;
1138 asection *s;
1139 boolean plt;
1140 boolean relocs;
1141 boolean reltext;
1142
1143 dynobj = elf_hash_table (info)->dynobj;
1144 BFD_ASSERT (dynobj != NULL);
1145
1146 if (elf_hash_table (info)->dynamic_sections_created)
1147 {
1148 /* Set the contents of the .interp section to the interpreter. */
1149 if (!info->shared)
1150 {
1151 s = bfd_get_section_by_name (dynobj, ".interp");
1152 BFD_ASSERT (s != NULL);
1153 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1154 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1155 }
1156 }
1157 else
1158 {
1159 /* We may have created entries in the .rela.got section.
1160 However, if we are not creating the dynamic sections, we will
1161 not actually use these entries. Reset the size of .rela.got,
1162 which will cause it to get stripped from the output file
1163 below. */
1164 s = bfd_get_section_by_name (dynobj, ".rela.got");
1165 if (s != NULL)
1166 s->_raw_size = 0;
1167 }
1168
1169 /* If this is a -Bsymbolic shared link, then we need to discard all PC
1170 relative relocs against symbols defined in a regular object. We
1171 allocated space for them in the check_relocs routine, but we will not
1172 fill them in in the relocate_section routine. */
1173 if (info->shared && info->symbolic)
1174 elf_m68k_link_hash_traverse (elf_m68k_hash_table (info),
1175 elf_m68k_discard_copies,
1176 (PTR) NULL);
1177
1178 /* The check_relocs and adjust_dynamic_symbol entry points have
1179 determined the sizes of the various dynamic sections. Allocate
1180 memory for them. */
1181 plt = false;
1182 relocs = false;
1183 reltext = false;
1184 for (s = dynobj->sections; s != NULL; s = s->next)
1185 {
1186 const char *name;
1187 boolean strip;
1188
1189 if ((s->flags & SEC_LINKER_CREATED) == 0)
1190 continue;
1191
1192 /* It's OK to base decisions on the section name, because none
1193 of the dynobj section names depend upon the input files. */
1194 name = bfd_get_section_name (dynobj, s);
1195
1196 strip = false;
1197
1198 if (strcmp (name, ".plt") == 0)
1199 {
1200 if (s->_raw_size == 0)
1201 {
1202 /* Strip this section if we don't need it; see the
1203 comment below. */
1204 strip = true;
1205 }
1206 else
1207 {
1208 /* Remember whether there is a PLT. */
1209 plt = true;
1210 }
1211 }
1212 else if (strncmp (name, ".rela", 5) == 0)
1213 {
1214 if (s->_raw_size == 0)
1215 {
1216 /* If we don't need this section, strip it from the
1217 output file. This is mostly to handle .rela.bss and
1218 .rela.plt. We must create both sections in
1219 create_dynamic_sections, because they must be created
1220 before the linker maps input sections to output
1221 sections. The linker does that before
1222 adjust_dynamic_symbol is called, and it is that
1223 function which decides whether anything needs to go
1224 into these sections. */
1225 strip = true;
1226 }
1227 else
1228 {
1229 asection *target;
1230
1231 /* Remember whether there are any reloc sections other
1232 than .rela.plt. */
1233 if (strcmp (name, ".rela.plt") != 0)
1234 {
1235 const char *outname;
1236
1237 relocs = true;
1238
1239 /* If this relocation section applies to a read only
1240 section, then we probably need a DT_TEXTREL
1241 entry. .rela.plt is actually associated with
1242 .got.plt, which is never readonly. */
1243 outname = bfd_get_section_name (output_bfd,
1244 s->output_section);
1245 target = bfd_get_section_by_name (output_bfd, outname + 5);
1246 if (target != NULL
1247 && (target->flags & SEC_READONLY) != 0
1248 && (target->flags & SEC_ALLOC) != 0)
1249 reltext = true;
1250 }
1251
1252 /* We use the reloc_count field as a counter if we need
1253 to copy relocs into the output file. */
1254 s->reloc_count = 0;
1255 }
1256 }
1257 else if (strncmp (name, ".got", 4) != 0)
1258 {
1259 /* It's not one of our sections, so don't allocate space. */
1260 continue;
1261 }
1262
1263 if (strip)
1264 {
1265 _bfd_strip_section_from_output (s);
1266 continue;
1267 }
1268
1269 /* Allocate memory for the section contents. */
1270 s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1271 if (s->contents == NULL && s->_raw_size != 0)
1272 return false;
1273 }
1274
1275 if (elf_hash_table (info)->dynamic_sections_created)
1276 {
1277 /* Add some entries to the .dynamic section. We fill in the
1278 values later, in elf_m68k_finish_dynamic_sections, but we
1279 must add the entries now so that we get the correct size for
1280 the .dynamic section. The DT_DEBUG entry is filled in by the
1281 dynamic linker and used by the debugger. */
1282 if (!info->shared)
1283 {
1284 if (!bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
1285 return false;
1286 }
1287
1288 if (plt)
1289 {
1290 if (!bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
1291 || !bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1292 || !bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1293 || !bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
1294 return false;
1295 }
1296
1297 if (relocs)
1298 {
1299 if (!bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
1300 || !bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
1301 || !bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
1302 sizeof (Elf32_External_Rela)))
1303 return false;
1304 }
1305
1306 if (reltext)
1307 {
1308 if (!bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
1309 return false;
1310 }
1311 }
1312
1313 /* If we are generating a shared library, we generate a section
1314 symbol for each output section for which we might need to copy
1315 relocs. These are local symbols, which means that they must come
1316 first in the dynamic symbol table. That means we must increment
1317 the dynamic symbol index of every other dynamic symbol. */
1318 if (info->shared)
1319 {
1320 int c;
1321
1322 c = 0;
1323 for (s = output_bfd->sections; s != NULL; s = s->next)
1324 {
1325 if ((s->flags & SEC_LINKER_CREATED) != 0
1326 || (s->flags & SEC_ALLOC) == 0)
1327 continue;
1328
1329 elf_section_data (s)->dynindx = c + 1;
1330
1331 /* These symbols will have no names, so we don't need to
1332 fiddle with dynstr_index. */
1333
1334 ++c;
1335 }
1336
1337 elf_link_hash_traverse (elf_hash_table (info),
1338 elf_m68k_adjust_dynindx,
1339 (PTR) &c);
1340 elf_hash_table (info)->dynsymcount += c;
1341 }
1342
1343 return true;
1344 }
1345
1346 /* Increment the index of a dynamic symbol by a given amount. Called
1347 via elf_link_hash_traverse. */
1348
1349 static boolean
1350 elf_m68k_adjust_dynindx (h, cparg)
1351 struct elf_link_hash_entry *h;
1352 PTR cparg;
1353 {
1354 int *cp = (int *) cparg;
1355
1356 if (h->dynindx != -1)
1357 h->dynindx += *cp;
1358 return true;
1359 }
1360
1361 /* This function is called via elf_m68k_link_hash_traverse if we are
1362 creating a shared object with -Bsymbolic. It discards the space
1363 allocated to copy PC relative relocs against symbols which are defined
1364 in regular objects. We allocated space for them in the check_relocs
1365 routine, but we won't fill them in in the relocate_section routine. */
1366
1367 /*ARGSUSED*/
1368 static boolean
1369 elf_m68k_discard_copies (h, ignore)
1370 struct elf_m68k_link_hash_entry *h;
1371 PTR ignore;
1372 {
1373 struct elf_m68k_pcrel_relocs_copied *s;
1374
1375 /* We only discard relocs for symbols defined in a regular object. */
1376 if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1377 return true;
1378
1379 for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
1380 s->section->_raw_size -= s->count * sizeof (Elf32_External_Rela);
1381
1382 return true;
1383 }
1384
1385 /* Relocate an M68K ELF section. */
1386
1387 static boolean
1388 elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
1389 contents, relocs, local_syms, local_sections)
1390 bfd *output_bfd;
1391 struct bfd_link_info *info;
1392 bfd *input_bfd;
1393 asection *input_section;
1394 bfd_byte *contents;
1395 Elf_Internal_Rela *relocs;
1396 Elf_Internal_Sym *local_syms;
1397 asection **local_sections;
1398 {
1399 bfd *dynobj;
1400 Elf_Internal_Shdr *symtab_hdr;
1401 struct elf_link_hash_entry **sym_hashes;
1402 bfd_vma *local_got_offsets;
1403 asection *sgot;
1404 asection *splt;
1405 asection *sreloc;
1406 Elf_Internal_Rela *rel;
1407 Elf_Internal_Rela *relend;
1408
1409 dynobj = elf_hash_table (info)->dynobj;
1410 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1411 sym_hashes = elf_sym_hashes (input_bfd);
1412 local_got_offsets = elf_local_got_offsets (input_bfd);
1413
1414 sgot = NULL;
1415 splt = NULL;
1416 sreloc = NULL;
1417
1418 rel = relocs;
1419 relend = relocs + input_section->reloc_count;
1420 for (; rel < relend; rel++)
1421 {
1422 int r_type;
1423 reloc_howto_type *howto;
1424 unsigned long r_symndx;
1425 struct elf_link_hash_entry *h;
1426 Elf_Internal_Sym *sym;
1427 asection *sec;
1428 bfd_vma relocation;
1429 bfd_reloc_status_type r;
1430
1431 r_type = ELF32_R_TYPE (rel->r_info);
1432 if (r_type < 0 || r_type >= (int) R_68K_max)
1433 {
1434 bfd_set_error (bfd_error_bad_value);
1435 return false;
1436 }
1437 howto = howto_table + r_type;
1438
1439 r_symndx = ELF32_R_SYM (rel->r_info);
1440
1441 if (info->relocateable)
1442 {
1443 /* This is a relocateable link. We don't have to change
1444 anything, unless the reloc is against a section symbol,
1445 in which case we have to adjust according to where the
1446 section symbol winds up in the output section. */
1447 if (r_symndx < symtab_hdr->sh_info)
1448 {
1449 sym = local_syms + r_symndx;
1450 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1451 {
1452 sec = local_sections[r_symndx];
1453 rel->r_addend += sec->output_offset + sym->st_value;
1454 }
1455 }
1456
1457 continue;
1458 }
1459
1460 /* This is a final link. */
1461 h = NULL;
1462 sym = NULL;
1463 sec = NULL;
1464 if (r_symndx < symtab_hdr->sh_info)
1465 {
1466 sym = local_syms + r_symndx;
1467 sec = local_sections[r_symndx];
1468 relocation = (sec->output_section->vma
1469 + sec->output_offset
1470 + sym->st_value);
1471 }
1472 else
1473 {
1474 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1475 while (h->root.type == bfd_link_hash_indirect
1476 || h->root.type == bfd_link_hash_warning)
1477 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1478 if (h->root.type == bfd_link_hash_defined
1479 || h->root.type == bfd_link_hash_defweak)
1480 {
1481 sec = h->root.u.def.section;
1482 if (((r_type == R_68K_PLT8
1483 || r_type == R_68K_PLT16
1484 || r_type == R_68K_PLT32
1485 || r_type == R_68K_PLT8O
1486 || r_type == R_68K_PLT16O
1487 || r_type == R_68K_PLT32O)
1488 && h->plt.offset != (bfd_vma) -1
1489 && elf_hash_table (info)->dynamic_sections_created)
1490 || ((r_type == R_68K_GOT8O
1491 || r_type == R_68K_GOT16O
1492 || r_type == R_68K_GOT32O
1493 || ((r_type == R_68K_GOT8
1494 || r_type == R_68K_GOT16
1495 || r_type == R_68K_GOT32)
1496 && strcmp (h->root.root.string,
1497 "_GLOBAL_OFFSET_TABLE_") != 0))
1498 && elf_hash_table (info)->dynamic_sections_created
1499 && (! info->shared
1500 || (! info->symbolic && h->dynindx != -1)
1501 || (h->elf_link_hash_flags
1502 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1503 || (info->shared
1504 && ((! info->symbolic && h->dynindx != -1)
1505 || (h->elf_link_hash_flags
1506 & ELF_LINK_HASH_DEF_REGULAR) == 0)
1507 && (input_section->flags & SEC_ALLOC) != 0
1508 && (r_type == R_68K_8
1509 || r_type == R_68K_16
1510 || r_type == R_68K_32
1511 || r_type == R_68K_PC8
1512 || r_type == R_68K_PC16
1513 || r_type == R_68K_PC32)))
1514 {
1515 /* In these cases, we don't need the relocation
1516 value. We check specially because in some
1517 obscure cases sec->output_section will be NULL. */
1518 relocation = 0;
1519 }
1520 else
1521 relocation = (h->root.u.def.value
1522 + sec->output_section->vma
1523 + sec->output_offset);
1524 }
1525 else if (h->root.type == bfd_link_hash_undefweak)
1526 relocation = 0;
1527 else if (info->shared && !info->symbolic && !info->no_undefined)
1528 relocation = 0;
1529 else
1530 {
1531 if (!(info->callbacks->undefined_symbol
1532 (info, h->root.root.string, input_bfd,
1533 input_section, rel->r_offset)))
1534 return false;
1535 relocation = 0;
1536 }
1537 }
1538
1539 switch (r_type)
1540 {
1541 case R_68K_GOT8:
1542 case R_68K_GOT16:
1543 case R_68K_GOT32:
1544 /* Relocation is to the address of the entry for this symbol
1545 in the global offset table. */
1546 if (h != NULL
1547 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1548 break;
1549 /* Fall through. */
1550 case R_68K_GOT8O:
1551 case R_68K_GOT16O:
1552 case R_68K_GOT32O:
1553 /* Relocation is the offset of the entry for this symbol in
1554 the global offset table. */
1555
1556 {
1557 bfd_vma off;
1558
1559 if (sgot == NULL)
1560 {
1561 sgot = bfd_get_section_by_name (dynobj, ".got");
1562 BFD_ASSERT (sgot != NULL);
1563 }
1564
1565 if (h != NULL)
1566 {
1567 off = h->got.offset;
1568 BFD_ASSERT (off != (bfd_vma) -1);
1569
1570 if (!elf_hash_table (info)->dynamic_sections_created
1571 || (info->shared
1572 && (info->symbolic || h->dynindx == -1)
1573 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1574 {
1575 /* This is actually a static link, or it is a
1576 -Bsymbolic link and the symbol is defined
1577 locally, or the symbol was forced to be local
1578 because of a version file.. We must initialize
1579 this entry in the global offset table. Since
1580 the offset must always be a multiple of 4, we
1581 use the least significant bit to record whether
1582 we have initialized it already.
1583
1584 When doing a dynamic link, we create a .rela.got
1585 relocation entry to initialize the value. This
1586 is done in the finish_dynamic_symbol routine. */
1587 if ((off & 1) != 0)
1588 off &= ~1;
1589 else
1590 {
1591 bfd_put_32 (output_bfd, relocation,
1592 sgot->contents + off);
1593 h->got.offset |= 1;
1594 }
1595 }
1596 }
1597 else
1598 {
1599 BFD_ASSERT (local_got_offsets != NULL
1600 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1601
1602 off = local_got_offsets[r_symndx];
1603
1604 /* The offset must always be a multiple of 4. We use
1605 the least significant bit to record whether we have
1606 already generated the necessary reloc. */
1607 if ((off & 1) != 0)
1608 off &= ~1;
1609 else
1610 {
1611 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1612
1613 if (info->shared)
1614 {
1615 asection *srelgot;
1616 Elf_Internal_Rela outrel;
1617
1618 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1619 BFD_ASSERT (srelgot != NULL);
1620
1621 outrel.r_offset = (sgot->output_section->vma
1622 + sgot->output_offset
1623 + off);
1624 outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
1625 outrel.r_addend = relocation;
1626 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1627 (((Elf32_External_Rela *)
1628 srelgot->contents)
1629 + srelgot->reloc_count));
1630 ++srelgot->reloc_count;
1631 }
1632
1633 local_got_offsets[r_symndx] |= 1;
1634 }
1635 }
1636
1637 relocation = sgot->output_offset + off;
1638 if (r_type == R_68K_GOT8O
1639 || r_type == R_68K_GOT16O
1640 || r_type == R_68K_GOT32O)
1641 {
1642 /* This relocation does not use the addend. */
1643 rel->r_addend = 0;
1644 }
1645 else
1646 relocation += sgot->output_section->vma;
1647 }
1648 break;
1649
1650 case R_68K_PLT8:
1651 case R_68K_PLT16:
1652 case R_68K_PLT32:
1653 /* Relocation is to the entry for this symbol in the
1654 procedure linkage table. */
1655
1656 /* Resolve a PLTxx reloc against a local symbol directly,
1657 without using the procedure linkage table. */
1658 if (h == NULL)
1659 break;
1660
1661 if (h->plt.offset == (bfd_vma) -1
1662 || !elf_hash_table (info)->dynamic_sections_created)
1663 {
1664 /* We didn't make a PLT entry for this symbol. This
1665 happens when statically linking PIC code, or when
1666 using -Bsymbolic. */
1667 break;
1668 }
1669
1670 if (splt == NULL)
1671 {
1672 splt = bfd_get_section_by_name (dynobj, ".plt");
1673 BFD_ASSERT (splt != NULL);
1674 }
1675
1676 relocation = (splt->output_section->vma
1677 + splt->output_offset
1678 + h->plt.offset);
1679 break;
1680
1681 case R_68K_PLT8O:
1682 case R_68K_PLT16O:
1683 case R_68K_PLT32O:
1684 /* Relocation is the offset of the entry for this symbol in
1685 the procedure linkage table. */
1686 BFD_ASSERT (h != NULL && h->plt.offset != (bfd_vma) -1);
1687
1688 if (splt == NULL)
1689 {
1690 splt = bfd_get_section_by_name (dynobj, ".plt");
1691 BFD_ASSERT (splt != NULL);
1692 }
1693
1694 relocation = h->plt.offset;
1695
1696 /* This relocation does not use the addend. */
1697 rel->r_addend = 0;
1698
1699 break;
1700
1701 case R_68K_PC8:
1702 case R_68K_PC16:
1703 case R_68K_PC32:
1704 if (h == NULL)
1705 break;
1706 /* Fall through. */
1707 case R_68K_8:
1708 case R_68K_16:
1709 case R_68K_32:
1710 if (info->shared
1711 && (input_section->flags & SEC_ALLOC) != 0
1712 && ((r_type != R_68K_PC8
1713 && r_type != R_68K_PC16
1714 && r_type != R_68K_PC32)
1715 || (!info->symbolic
1716 || (h->elf_link_hash_flags
1717 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
1718 {
1719 Elf_Internal_Rela outrel;
1720 boolean skip, relocate;
1721
1722 /* When generating a shared object, these relocations
1723 are copied into the output file to be resolved at run
1724 time. */
1725
1726 if (sreloc == NULL)
1727 {
1728 const char *name;
1729
1730 name = (bfd_elf_string_from_elf_section
1731 (input_bfd,
1732 elf_elfheader (input_bfd)->e_shstrndx,
1733 elf_section_data (input_section)->rel_hdr.sh_name));
1734 if (name == NULL)
1735 return false;
1736
1737 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1738 && strcmp (bfd_get_section_name (input_bfd,
1739 input_section),
1740 name + 5) == 0);
1741
1742 sreloc = bfd_get_section_by_name (dynobj, name);
1743 BFD_ASSERT (sreloc != NULL);
1744 }
1745
1746 skip = false;
1747
1748 if (elf_section_data (input_section)->stab_info == NULL)
1749 outrel.r_offset = rel->r_offset;
1750 else
1751 {
1752 bfd_vma off;
1753
1754 off = (_bfd_stab_section_offset
1755 (output_bfd, &elf_hash_table (info)->stab_info,
1756 input_section,
1757 &elf_section_data (input_section)->stab_info,
1758 rel->r_offset));
1759 if (off == (bfd_vma) -1)
1760 skip = true;
1761 outrel.r_offset = off;
1762 }
1763
1764 outrel.r_offset += (input_section->output_section->vma
1765 + input_section->output_offset);
1766
1767 if (skip)
1768 {
1769 memset (&outrel, 0, sizeof outrel);
1770 relocate = false;
1771 }
1772 /* h->dynindx may be -1 if the symbol was marked to
1773 become local. */
1774 else if (h != NULL
1775 && ((! info->symbolic && h->dynindx != -1)
1776 || (h->elf_link_hash_flags
1777 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1778 {
1779 BFD_ASSERT (h->dynindx != -1);
1780 relocate = false;
1781 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1782 outrel.r_addend = relocation + rel->r_addend;
1783 }
1784 else
1785 {
1786 if (r_type == R_68K_32)
1787 {
1788 relocate = true;
1789 outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
1790 outrel.r_addend = relocation + rel->r_addend;
1791 }
1792 else
1793 {
1794 long indx;
1795
1796 if (h == NULL)
1797 sec = local_sections[r_symndx];
1798 else
1799 {
1800 BFD_ASSERT (h->root.type == bfd_link_hash_defined
1801 || (h->root.type
1802 == bfd_link_hash_defweak));
1803 sec = h->root.u.def.section;
1804 }
1805 if (sec != NULL && bfd_is_abs_section (sec))
1806 indx = 0;
1807 else if (sec == NULL || sec->owner == NULL)
1808 {
1809 bfd_set_error (bfd_error_bad_value);
1810 return false;
1811 }
1812 else
1813 {
1814 asection *osec;
1815
1816 osec = sec->output_section;
1817 indx = elf_section_data (osec)->dynindx;
1818 BFD_ASSERT (indx > 0);
1819 }
1820
1821 relocate = false;
1822 outrel.r_info = ELF32_R_INFO (indx, r_type);
1823 outrel.r_addend = relocation + rel->r_addend;
1824 }
1825 }
1826
1827 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1828 (((Elf32_External_Rela *)
1829 sreloc->contents)
1830 + sreloc->reloc_count));
1831 ++sreloc->reloc_count;
1832
1833 /* This reloc will be computed at runtime, so there's no
1834 need to do anything now, except for R_68K_32
1835 relocations that have been turned into
1836 R_68K_RELATIVE. */
1837 if (!relocate)
1838 continue;
1839 }
1840
1841 break;
1842
1843 case R_68K_GNU_VTINHERIT:
1844 case R_68K_GNU_VTENTRY:
1845 /* These are no-ops in the end. */
1846 continue;
1847
1848 default:
1849 break;
1850 }
1851
1852 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1853 contents, rel->r_offset,
1854 relocation, rel->r_addend);
1855
1856 if (r != bfd_reloc_ok)
1857 {
1858 switch (r)
1859 {
1860 default:
1861 case bfd_reloc_outofrange:
1862 abort ();
1863 case bfd_reloc_overflow:
1864 {
1865 const char *name;
1866
1867 if (h != NULL)
1868 name = h->root.root.string;
1869 else
1870 {
1871 name = bfd_elf_string_from_elf_section (input_bfd,
1872 symtab_hdr->sh_link,
1873 sym->st_name);
1874 if (name == NULL)
1875 return false;
1876 if (*name == '\0')
1877 name = bfd_section_name (input_bfd, sec);
1878 }
1879 if (!(info->callbacks->reloc_overflow
1880 (info, name, howto->name, (bfd_vma) 0,
1881 input_bfd, input_section, rel->r_offset)))
1882 return false;
1883 }
1884 break;
1885 }
1886 }
1887 }
1888
1889 return true;
1890 }
1891
1892 /* Finish up dynamic symbol handling. We set the contents of various
1893 dynamic sections here. */
1894
1895 static boolean
1896 elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
1897 bfd *output_bfd;
1898 struct bfd_link_info *info;
1899 struct elf_link_hash_entry *h;
1900 Elf_Internal_Sym *sym;
1901 {
1902 bfd *dynobj;
1903 int plt_off1, plt_off2, plt_off3;
1904
1905 dynobj = elf_hash_table (info)->dynobj;
1906
1907 if (h->plt.offset != (bfd_vma) -1)
1908 {
1909 asection *splt;
1910 asection *sgot;
1911 asection *srela;
1912 bfd_vma plt_index;
1913 bfd_vma got_offset;
1914 Elf_Internal_Rela rela;
1915
1916 /* This symbol has an entry in the procedure linkage table. Set
1917 it up. */
1918
1919 BFD_ASSERT (h->dynindx != -1);
1920
1921 splt = bfd_get_section_by_name (dynobj, ".plt");
1922 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1923 srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1924 BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1925
1926 /* Get the index in the procedure linkage table which
1927 corresponds to this symbol. This is the index of this symbol
1928 in all the symbols for which we are making plt entries. The
1929 first entry in the procedure linkage table is reserved. */
1930 if ( CPU32_FLAG (output_bfd))
1931 plt_index = h->plt.offset / PLT_CPU32_ENTRY_SIZE - 1;
1932 else
1933 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1934
1935 /* Get the offset into the .got table of the entry that
1936 corresponds to this function. Each .got entry is 4 bytes.
1937 The first three are reserved. */
1938 got_offset = (plt_index + 3) * 4;
1939
1940 if ( CPU32_FLAG (output_bfd))
1941 {
1942 /* Fill in the entry in the procedure linkage table. */
1943 memcpy (splt->contents + h->plt.offset, elf_cpu32_plt_entry,
1944 PLT_CPU32_ENTRY_SIZE);
1945 plt_off1 = 4;
1946 plt_off2 = 12;
1947 plt_off3 = 18;
1948 }
1949 else
1950 {
1951 /* Fill in the entry in the procedure linkage table. */
1952 memcpy (splt->contents + h->plt.offset, elf_m68k_plt_entry,
1953 PLT_ENTRY_SIZE);
1954 plt_off1 = 4;
1955 plt_off2 = 10;
1956 plt_off3 = 16;
1957 }
1958
1959 /* The offset is relative to the first extension word. */
1960 bfd_put_32 (output_bfd,
1961 (sgot->output_section->vma
1962 + sgot->output_offset
1963 + got_offset
1964 - (splt->output_section->vma
1965 + h->plt.offset + 2)),
1966 splt->contents + h->plt.offset + plt_off1);
1967
1968 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
1969 splt->contents + h->plt.offset + plt_off2);
1970 bfd_put_32 (output_bfd, - (h->plt.offset + plt_off3),
1971 splt->contents + h->plt.offset + plt_off3);
1972
1973 /* Fill in the entry in the global offset table. */
1974 bfd_put_32 (output_bfd,
1975 (splt->output_section->vma
1976 + splt->output_offset
1977 + h->plt.offset
1978 + 8),
1979 sgot->contents + got_offset);
1980
1981 /* Fill in the entry in the .rela.plt section. */
1982 rela.r_offset = (sgot->output_section->vma
1983 + sgot->output_offset
1984 + got_offset);
1985 rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_JMP_SLOT);
1986 rela.r_addend = 0;
1987 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1988 ((Elf32_External_Rela *) srela->contents
1989 + plt_index));
1990
1991 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1992 {
1993 /* Mark the symbol as undefined, rather than as defined in
1994 the .plt section. Leave the value alone. */
1995 sym->st_shndx = SHN_UNDEF;
1996 }
1997 }
1998
1999 if (h->got.offset != (bfd_vma) -1)
2000 {
2001 asection *sgot;
2002 asection *srela;
2003 Elf_Internal_Rela rela;
2004
2005 /* This symbol has an entry in the global offset table. Set it
2006 up. */
2007
2008 sgot = bfd_get_section_by_name (dynobj, ".got");
2009 srela = bfd_get_section_by_name (dynobj, ".rela.got");
2010 BFD_ASSERT (sgot != NULL && srela != NULL);
2011
2012 rela.r_offset = (sgot->output_section->vma
2013 + sgot->output_offset
2014 + (h->got.offset &~ 1));
2015
2016 /* If this is a -Bsymbolic link, and the symbol is defined
2017 locally, we just want to emit a RELATIVE reloc. Likewise if
2018 the symbol was forced to be local because of a version file.
2019 The entry in the global offset table will already have been
2020 initialized in the relocate_section function. */
2021 if (info->shared
2022 && (info->symbolic || h->dynindx == -1)
2023 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2024 {
2025 rela.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
2026 rela.r_addend = bfd_get_signed_32 (output_bfd,
2027 (sgot->contents
2028 + (h->got.offset & ~1)));
2029 }
2030 else
2031 {
2032 bfd_put_32 (output_bfd, (bfd_vma) 0,
2033 sgot->contents + (h->got.offset & ~1));
2034 rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_GLOB_DAT);
2035 rela.r_addend = 0;
2036 }
2037
2038 bfd_elf32_swap_reloca_out (output_bfd, &rela,
2039 ((Elf32_External_Rela *) srela->contents
2040 + srela->reloc_count));
2041 ++srela->reloc_count;
2042 }
2043
2044 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2045 {
2046 asection *s;
2047 Elf_Internal_Rela rela;
2048
2049 /* This symbol needs a copy reloc. Set it up. */
2050
2051 BFD_ASSERT (h->dynindx != -1
2052 && (h->root.type == bfd_link_hash_defined
2053 || h->root.type == bfd_link_hash_defweak));
2054
2055 s = bfd_get_section_by_name (h->root.u.def.section->owner,
2056 ".rela.bss");
2057 BFD_ASSERT (s != NULL);
2058
2059 rela.r_offset = (h->root.u.def.value
2060 + h->root.u.def.section->output_section->vma
2061 + h->root.u.def.section->output_offset);
2062 rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_COPY);
2063 rela.r_addend = 0;
2064 bfd_elf32_swap_reloca_out (output_bfd, &rela,
2065 ((Elf32_External_Rela *) s->contents
2066 + s->reloc_count));
2067 ++s->reloc_count;
2068 }
2069
2070 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2071 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2072 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2073 sym->st_shndx = SHN_ABS;
2074
2075 return true;
2076 }
2077
2078 /* Finish up the dynamic sections. */
2079
2080 static boolean
2081 elf_m68k_finish_dynamic_sections (output_bfd, info)
2082 bfd *output_bfd;
2083 struct bfd_link_info *info;
2084 {
2085 bfd *dynobj;
2086 asection *sgot;
2087 asection *sdyn;
2088 int plt_entry0_size, plt_off1, plt_off2;
2089
2090 dynobj = elf_hash_table (info)->dynobj;
2091
2092 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
2093 BFD_ASSERT (sgot != NULL);
2094 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2095
2096 if (elf_hash_table (info)->dynamic_sections_created)
2097 {
2098 asection *splt;
2099 Elf32_External_Dyn *dyncon, *dynconend;
2100
2101 splt = bfd_get_section_by_name (dynobj, ".plt");
2102 BFD_ASSERT (splt != NULL && sdyn != NULL);
2103
2104 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2105 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2106 for (; dyncon < dynconend; dyncon++)
2107 {
2108 Elf_Internal_Dyn dyn;
2109 const char *name;
2110 asection *s;
2111
2112 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2113
2114 switch (dyn.d_tag)
2115 {
2116 default:
2117 break;
2118
2119 case DT_PLTGOT:
2120 name = ".got";
2121 goto get_vma;
2122 case DT_JMPREL:
2123 name = ".rela.plt";
2124 get_vma:
2125 s = bfd_get_section_by_name (output_bfd, name);
2126 BFD_ASSERT (s != NULL);
2127 dyn.d_un.d_ptr = s->vma;
2128 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2129 break;
2130
2131 case DT_PLTRELSZ:
2132 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2133 BFD_ASSERT (s != NULL);
2134 if (s->_cooked_size != 0)
2135 dyn.d_un.d_val = s->_cooked_size;
2136 else
2137 dyn.d_un.d_val = s->_raw_size;
2138 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2139 break;
2140
2141 case DT_RELASZ:
2142 /* The procedure linkage table relocs (DT_JMPREL) should
2143 not be included in the overall relocs (DT_RELA).
2144 Therefore, we override the DT_RELASZ entry here to
2145 make it not include the JMPREL relocs. Since the
2146 linker script arranges for .rela.plt to follow all
2147 other relocation sections, we don't have to worry
2148 about changing the DT_RELA entry. */
2149 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2150 if (s != NULL)
2151 {
2152 if (s->_cooked_size != 0)
2153 dyn.d_un.d_val -= s->_cooked_size;
2154 else
2155 dyn.d_un.d_val -= s->_raw_size;
2156 }
2157 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2158 break;
2159 }
2160 }
2161
2162 /* Fill in the first entry in the procedure linkage table. */
2163 if (splt->_raw_size > 0)
2164 {
2165 if (!CPU32_FLAG (output_bfd))
2166 {
2167 memcpy (splt->contents, elf_m68k_plt0_entry, PLT_ENTRY_SIZE);
2168 bfd_put_32 (output_bfd,
2169 (sgot->output_section->vma
2170 + sgot->output_offset + 4
2171 - (splt->output_section->vma + 2)),
2172 splt->contents + 4);
2173 bfd_put_32 (output_bfd,
2174 (sgot->output_section->vma
2175 + sgot->output_offset + 8
2176 - (splt->output_section->vma + 10)),
2177 splt->contents + 12);
2178 elf_section_data (splt->output_section)->this_hdr.sh_entsize
2179 = PLT_ENTRY_SIZE;
2180 }
2181 else /* cpu32 */
2182 {
2183 memcpy (splt->contents, elf_cpu32_plt0_entry, PLT_CPU32_ENTRY_SIZE);
2184 bfd_put_32 (output_bfd,
2185 (sgot->output_section->vma
2186 + sgot->output_offset + 4
2187 - (splt->output_section->vma + 2)),
2188 splt->contents + 4);
2189 bfd_put_32 (output_bfd,
2190 (sgot->output_section->vma
2191 + sgot->output_offset + 8
2192 - (splt->output_section->vma + 10)),
2193 splt->contents + 10);
2194 elf_section_data (splt->output_section)->this_hdr.sh_entsize
2195 = PLT_CPU32_ENTRY_SIZE;
2196 }
2197 }
2198 }
2199
2200 /* Fill in the first three entries in the global offset table. */
2201 if (sgot->_raw_size > 0)
2202 {
2203 if (sdyn == NULL)
2204 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2205 else
2206 bfd_put_32 (output_bfd,
2207 sdyn->output_section->vma + sdyn->output_offset,
2208 sgot->contents);
2209 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
2210 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
2211 }
2212
2213 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2214
2215 if (info->shared)
2216 {
2217 asection *sdynsym;
2218 asection *s;
2219 Elf_Internal_Sym sym;
2220 int c;
2221
2222 /* Set up the section symbols for the output sections. */
2223
2224 sdynsym = bfd_get_section_by_name (dynobj, ".dynsym");
2225 BFD_ASSERT (sdynsym != NULL);
2226
2227 sym.st_size = 0;
2228 sym.st_name = 0;
2229 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
2230 sym.st_other = 0;
2231
2232 c = 0;
2233 for (s = output_bfd->sections; s != NULL; s = s->next)
2234 {
2235 int indx;
2236
2237 if (elf_section_data (s)->dynindx == 0)
2238 continue;
2239
2240 sym.st_value = s->vma;
2241
2242 indx = elf_section_data (s)->this_idx;
2243 BFD_ASSERT (indx > 0);
2244 sym.st_shndx = indx;
2245
2246 bfd_elf32_swap_symbol_out (output_bfd, &sym,
2247 (PTR) (((Elf32_External_Sym *)
2248 sdynsym->contents)
2249 + elf_section_data (s)->dynindx));
2250
2251 ++c;
2252 }
2253
2254 /* Set the sh_info field of the output .dynsym section to the
2255 index of the first global symbol. */
2256 elf_section_data (sdynsym->output_section)->this_hdr.sh_info = c + 1;
2257 }
2258
2259 return true;
2260 }
2261
2262 #define TARGET_BIG_SYM bfd_elf32_m68k_vec
2263 #define TARGET_BIG_NAME "elf32-m68k"
2264 #define ELF_MACHINE_CODE EM_68K
2265 #define ELF_MAXPAGESIZE 0x2000
2266 #define elf_backend_create_dynamic_sections \
2267 _bfd_elf_create_dynamic_sections
2268 #define bfd_elf32_bfd_link_hash_table_create \
2269 elf_m68k_link_hash_table_create
2270 #define bfd_elf32_bfd_final_link _bfd_elf32_gc_common_final_link
2271
2272 #define elf_backend_check_relocs elf_m68k_check_relocs
2273 #define elf_backend_adjust_dynamic_symbol \
2274 elf_m68k_adjust_dynamic_symbol
2275 #define elf_backend_size_dynamic_sections \
2276 elf_m68k_size_dynamic_sections
2277 #define elf_backend_relocate_section elf_m68k_relocate_section
2278 #define elf_backend_finish_dynamic_symbol \
2279 elf_m68k_finish_dynamic_symbol
2280 #define elf_backend_finish_dynamic_sections \
2281 elf_m68k_finish_dynamic_sections
2282 #define elf_backend_gc_mark_hook elf_m68k_gc_mark_hook
2283 #define elf_backend_gc_sweep_hook elf_m68k_gc_sweep_hook
2284 #define bfd_elf32_bfd_copy_private_bfd_data \
2285 elf32_m68k_copy_private_bfd_data
2286 #define bfd_elf32_bfd_merge_private_bfd_data \
2287 elf32_m68k_merge_private_bfd_data
2288 #define bfd_elf32_bfd_set_private_flags \
2289 elf32_m68k_set_private_flags
2290 #define bfd_elf32_bfd_print_private_bfd_data \
2291 elf32_m68k_print_private_bfd_data
2292
2293 #define elf_backend_can_gc_sections 1
2294 #define elf_backend_want_got_plt 1
2295 #define elf_backend_plt_readonly 1
2296 #define elf_backend_want_plt_sym 0
2297 #define elf_backend_got_header_size 12
2298
2299 #include "elf32-target.h"
This page took 0.112417 seconds and 4 git commands to generate.