OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [elf32-m68k.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.