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