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