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