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