OSDN Git Service

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