~terry.guo/+junk/xbinutils

« back to all changes in this revision

Viewing changes to src/binutils/bfd/elf-m10300.c

  • Committer: Terry Guo
  • Date: 2012-09-05 06:50:40 UTC
  • Revision ID: terry.guo@arm.com-20120905065040-430c6mhm9b11a6r6
Tags: upstream-1.0
ImportĀ upstreamĀ versionĀ 1.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Matsushita 10300 specific support for 32-bit ELF
 
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
 
3
   2006, 2007, 2008, 2009, 2010, 2011 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 3 of the License, or
 
10
   (at your option) any later version.
 
11
 
 
12
   This program is distributed in the hope that it will be useful,
 
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
   GNU General Public License for more details.
 
16
 
 
17
   You should have received a copy of the GNU General Public License
 
18
   along with this program; if not, write to the Free Software
 
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
 
20
   MA 02110-1301, USA.  */
 
21
 
 
22
#include "sysdep.h"
 
23
#include "bfd.h"
 
24
#include "libbfd.h"
 
25
#include "elf-bfd.h"
 
26
#include "elf/mn10300.h"
 
27
#include "libiberty.h"
 
28
 
 
29
/* The mn10300 linker needs to keep track of the number of relocs that
 
30
   it decides to copy in check_relocs for each symbol.  This is so
 
31
   that it can discard PC relative relocs if it doesn't need them when
 
32
   linking with -Bsymbolic.  We store the information in a field
 
33
   extending the regular ELF linker hash table.  */
 
34
 
 
35
struct elf32_mn10300_link_hash_entry
 
36
{
 
37
  /* The basic elf link hash table entry.  */
 
38
  struct elf_link_hash_entry root;
 
39
 
 
40
  /* For function symbols, the number of times this function is
 
41
     called directly (ie by name).  */
 
42
  unsigned int direct_calls;
 
43
 
 
44
  /* For function symbols, the size of this function's stack
 
45
     (if <= 255 bytes).  We stuff this into "call" instructions
 
46
     to this target when it's valid and profitable to do so.
 
47
 
 
48
     This does not include stack allocated by movm!  */
 
49
  unsigned char stack_size;
 
50
 
 
51
  /* For function symbols, arguments (if any) for movm instruction
 
52
     in the prologue.  We stuff this value into "call" instructions
 
53
     to the target when it's valid and profitable to do so.  */
 
54
  unsigned char movm_args;
 
55
 
 
56
  /* For function symbols, the amount of stack space that would be allocated
 
57
     by the movm instruction.  This is redundant with movm_args, but we
 
58
     add it to the hash table to avoid computing it over and over.  */
 
59
  unsigned char movm_stack_size;
 
60
 
 
61
/* When set, convert all "call" instructions to this target into "calls"
 
62
   instructions.  */
 
63
#define MN10300_CONVERT_CALL_TO_CALLS 0x1
 
64
 
 
65
/* Used to mark functions which have had redundant parts of their
 
66
   prologue deleted.  */
 
67
#define MN10300_DELETED_PROLOGUE_BYTES 0x2
 
68
  unsigned char flags;
 
69
 
 
70
  /* Calculated value.  */
 
71
  bfd_vma value;
 
72
};
 
73
 
 
74
/* We derive a hash table from the main elf linker hash table so
 
75
   we can store state variables and a secondary hash table without
 
76
   resorting to global variables.  */
 
77
struct elf32_mn10300_link_hash_table
 
78
{
 
79
  /* The main hash table.  */
 
80
  struct elf_link_hash_table root;
 
81
 
 
82
  /* A hash table for static functions.  We could derive a new hash table
 
83
     instead of using the full elf32_mn10300_link_hash_table if we wanted
 
84
     to save some memory.  */
 
85
  struct elf32_mn10300_link_hash_table *static_hash_table;
 
86
 
 
87
  /* Random linker state flags.  */
 
88
#define MN10300_HASH_ENTRIES_INITIALIZED 0x1
 
89
  char flags;
 
90
};
 
91
 
 
92
#ifndef streq
 
93
#define streq(a, b) (strcmp ((a),(b)) == 0)
 
94
#endif
 
95
 
 
96
/* For MN10300 linker hash table.  */
 
97
 
 
98
/* Get the MN10300 ELF linker hash table from a link_info structure.  */
 
99
 
 
100
#define elf32_mn10300_hash_table(p) \
 
101
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
 
102
  == MN10300_ELF_DATA ? ((struct elf32_mn10300_link_hash_table *) ((p)->hash)) : NULL)
 
103
 
 
104
#define elf32_mn10300_link_hash_traverse(table, func, info)             \
 
105
  (elf_link_hash_traverse                                               \
 
106
   (&(table)->root,                                                     \
 
107
    (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),    \
 
108
    (info)))
 
109
 
 
110
static reloc_howto_type elf_mn10300_howto_table[] =
 
111
{
 
112
  /* Dummy relocation.  Does nothing.  */
 
113
  HOWTO (R_MN10300_NONE,
 
114
         0,
 
115
         2,
 
116
         16,
 
117
         FALSE,
 
118
         0,
 
119
         complain_overflow_bitfield,
 
120
         bfd_elf_generic_reloc,
 
121
         "R_MN10300_NONE",
 
122
         FALSE,
 
123
         0,
 
124
         0,
 
125
         FALSE),
 
126
  /* Standard 32 bit reloc.  */
 
127
  HOWTO (R_MN10300_32,
 
128
         0,
 
129
         2,
 
130
         32,
 
131
         FALSE,
 
132
         0,
 
133
         complain_overflow_bitfield,
 
134
         bfd_elf_generic_reloc,
 
135
         "R_MN10300_32",
 
136
         FALSE,
 
137
         0xffffffff,
 
138
         0xffffffff,
 
139
         FALSE),
 
140
  /* Standard 16 bit reloc.  */
 
141
  HOWTO (R_MN10300_16,
 
142
         0,
 
143
         1,
 
144
         16,
 
145
         FALSE,
 
146
         0,
 
147
         complain_overflow_bitfield,
 
148
         bfd_elf_generic_reloc,
 
149
         "R_MN10300_16",
 
150
         FALSE,
 
151
         0xffff,
 
152
         0xffff,
 
153
         FALSE),
 
154
  /* Standard 8 bit reloc.  */
 
155
  HOWTO (R_MN10300_8,
 
156
         0,
 
157
         0,
 
158
         8,
 
159
         FALSE,
 
160
         0,
 
161
         complain_overflow_bitfield,
 
162
         bfd_elf_generic_reloc,
 
163
         "R_MN10300_8",
 
164
         FALSE,
 
165
         0xff,
 
166
         0xff,
 
167
         FALSE),
 
168
  /* Standard 32bit pc-relative reloc.  */
 
169
  HOWTO (R_MN10300_PCREL32,
 
170
         0,
 
171
         2,
 
172
         32,
 
173
         TRUE,
 
174
         0,
 
175
         complain_overflow_bitfield,
 
176
         bfd_elf_generic_reloc,
 
177
         "R_MN10300_PCREL32",
 
178
         FALSE,
 
179
         0xffffffff,
 
180
         0xffffffff,
 
181
         TRUE),
 
182
  /* Standard 16bit pc-relative reloc.  */
 
183
  HOWTO (R_MN10300_PCREL16,
 
184
         0,
 
185
         1,
 
186
         16,
 
187
         TRUE,
 
188
         0,
 
189
         complain_overflow_bitfield,
 
190
         bfd_elf_generic_reloc,
 
191
         "R_MN10300_PCREL16",
 
192
         FALSE,
 
193
         0xffff,
 
194
         0xffff,
 
195
         TRUE),
 
196
  /* Standard 8 pc-relative reloc.  */
 
197
  HOWTO (R_MN10300_PCREL8,
 
198
         0,
 
199
         0,
 
200
         8,
 
201
         TRUE,
 
202
         0,
 
203
         complain_overflow_bitfield,
 
204
         bfd_elf_generic_reloc,
 
205
         "R_MN10300_PCREL8",
 
206
         FALSE,
 
207
         0xff,
 
208
         0xff,
 
209
         TRUE),
 
210
 
 
211
  /* GNU extension to record C++ vtable hierarchy.  */
 
212
  HOWTO (R_MN10300_GNU_VTINHERIT, /* type */
 
213
         0,                     /* rightshift */
 
214
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
 
215
         0,                     /* bitsize */
 
216
         FALSE,                 /* pc_relative */
 
217
         0,                     /* bitpos */
 
218
         complain_overflow_dont, /* complain_on_overflow */
 
219
         NULL,                  /* special_function */
 
220
         "R_MN10300_GNU_VTINHERIT", /* name */
 
221
         FALSE,                 /* partial_inplace */
 
222
         0,                     /* src_mask */
 
223
         0,                     /* dst_mask */
 
224
         FALSE),                /* pcrel_offset */
 
225
 
 
226
  /* GNU extension to record C++ vtable member usage */
 
227
  HOWTO (R_MN10300_GNU_VTENTRY, /* type */
 
228
         0,                     /* rightshift */
 
229
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
 
230
         0,                     /* bitsize */
 
231
         FALSE,                 /* pc_relative */
 
232
         0,                     /* bitpos */
 
233
         complain_overflow_dont, /* complain_on_overflow */
 
234
         NULL,                  /* special_function */
 
235
         "R_MN10300_GNU_VTENTRY", /* name */
 
236
         FALSE,                 /* partial_inplace */
 
237
         0,                     /* src_mask */
 
238
         0,                     /* dst_mask */
 
239
         FALSE),                /* pcrel_offset */
 
240
 
 
241
  /* Standard 24 bit reloc.  */
 
242
  HOWTO (R_MN10300_24,
 
243
         0,
 
244
         2,
 
245
         24,
 
246
         FALSE,
 
247
         0,
 
248
         complain_overflow_bitfield,
 
249
         bfd_elf_generic_reloc,
 
250
         "R_MN10300_24",
 
251
         FALSE,
 
252
         0xffffff,
 
253
         0xffffff,
 
254
         FALSE),
 
255
  HOWTO (R_MN10300_GOTPC32,     /* type */
 
256
         0,                     /* rightshift */
 
257
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
258
         32,                    /* bitsize */
 
259
         TRUE,                  /* pc_relative */
 
260
         0,                     /* bitpos */
 
261
         complain_overflow_bitfield, /* complain_on_overflow */
 
262
         bfd_elf_generic_reloc, /* */
 
263
         "R_MN10300_GOTPC32",   /* name */
 
264
         FALSE,                 /* partial_inplace */
 
265
         0xffffffff,            /* src_mask */
 
266
         0xffffffff,            /* dst_mask */
 
267
         TRUE),                 /* pcrel_offset */
 
268
 
 
269
  HOWTO (R_MN10300_GOTPC16,     /* type */
 
270
         0,                     /* rightshift */
 
271
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
 
272
         16,                    /* bitsize */
 
273
         TRUE,                  /* pc_relative */
 
274
         0,                     /* bitpos */
 
275
         complain_overflow_bitfield, /* complain_on_overflow */
 
276
         bfd_elf_generic_reloc, /* */
 
277
         "R_MN10300_GOTPC16",   /* name */
 
278
         FALSE,                 /* partial_inplace */
 
279
         0xffff,                /* src_mask */
 
280
         0xffff,                /* dst_mask */
 
281
         TRUE),                 /* pcrel_offset */
 
282
 
 
283
  HOWTO (R_MN10300_GOTOFF32,    /* type */
 
284
         0,                     /* rightshift */
 
285
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
286
         32,                    /* bitsize */
 
287
         FALSE,                 /* pc_relative */
 
288
         0,                     /* bitpos */
 
289
         complain_overflow_bitfield, /* complain_on_overflow */
 
290
         bfd_elf_generic_reloc, /* */
 
291
         "R_MN10300_GOTOFF32",  /* name */
 
292
         FALSE,                 /* partial_inplace */
 
293
         0xffffffff,            /* src_mask */
 
294
         0xffffffff,            /* dst_mask */
 
295
         FALSE),                /* pcrel_offset */
 
296
 
 
297
  HOWTO (R_MN10300_GOTOFF24,    /* type */
 
298
         0,                     /* rightshift */
 
299
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
300
         24,                    /* bitsize */
 
301
         FALSE,                 /* pc_relative */
 
302
         0,                     /* bitpos */
 
303
         complain_overflow_bitfield, /* complain_on_overflow */
 
304
         bfd_elf_generic_reloc, /* */
 
305
         "R_MN10300_GOTOFF24",  /* name */
 
306
         FALSE,                 /* partial_inplace */
 
307
         0xffffff,              /* src_mask */
 
308
         0xffffff,              /* dst_mask */
 
309
         FALSE),                /* pcrel_offset */
 
310
 
 
311
  HOWTO (R_MN10300_GOTOFF16,    /* type */
 
312
         0,                     /* rightshift */
 
313
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
 
314
         16,                    /* bitsize */
 
315
         FALSE,                 /* pc_relative */
 
316
         0,                     /* bitpos */
 
317
         complain_overflow_bitfield, /* complain_on_overflow */
 
318
         bfd_elf_generic_reloc, /* */
 
319
         "R_MN10300_GOTOFF16",  /* name */
 
320
         FALSE,                 /* partial_inplace */
 
321
         0xffff,                /* src_mask */
 
322
         0xffff,                /* dst_mask */
 
323
         FALSE),                /* pcrel_offset */
 
324
 
 
325
  HOWTO (R_MN10300_PLT32,       /* type */
 
326
         0,                     /* rightshift */
 
327
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
328
         32,                    /* bitsize */
 
329
         TRUE,                  /* pc_relative */
 
330
         0,                     /* bitpos */
 
331
         complain_overflow_bitfield, /* complain_on_overflow */
 
332
         bfd_elf_generic_reloc, /* */
 
333
         "R_MN10300_PLT32",     /* name */
 
334
         FALSE,                 /* partial_inplace */
 
335
         0xffffffff,            /* src_mask */
 
336
         0xffffffff,            /* dst_mask */
 
337
         TRUE),                 /* pcrel_offset */
 
338
 
 
339
  HOWTO (R_MN10300_PLT16,       /* type */
 
340
         0,                     /* rightshift */
 
341
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
 
342
         16,                    /* bitsize */
 
343
         TRUE,                  /* pc_relative */
 
344
         0,                     /* bitpos */
 
345
         complain_overflow_bitfield, /* complain_on_overflow */
 
346
         bfd_elf_generic_reloc, /* */
 
347
         "R_MN10300_PLT16",     /* name */
 
348
         FALSE,                 /* partial_inplace */
 
349
         0xffff,                /* src_mask */
 
350
         0xffff,                /* dst_mask */
 
351
         TRUE),                 /* pcrel_offset */
 
352
 
 
353
  HOWTO (R_MN10300_GOT32,       /* type */
 
354
         0,                     /* rightshift */
 
355
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
356
         32,                    /* bitsize */
 
357
         FALSE,                 /* pc_relative */
 
358
         0,                     /* bitpos */
 
359
         complain_overflow_bitfield, /* complain_on_overflow */
 
360
         bfd_elf_generic_reloc, /* */
 
361
         "R_MN10300_GOT32",     /* name */
 
362
         FALSE,                 /* partial_inplace */
 
363
         0xffffffff,            /* src_mask */
 
364
         0xffffffff,            /* dst_mask */
 
365
         FALSE),                /* pcrel_offset */
 
366
 
 
367
  HOWTO (R_MN10300_GOT24,       /* type */
 
368
         0,                     /* rightshift */
 
369
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
370
         24,                    /* bitsize */
 
371
         FALSE,                 /* pc_relative */
 
372
         0,                     /* bitpos */
 
373
         complain_overflow_bitfield, /* complain_on_overflow */
 
374
         bfd_elf_generic_reloc, /* */
 
375
         "R_MN10300_GOT24",     /* name */
 
376
         FALSE,                 /* partial_inplace */
 
377
         0xffffffff,            /* src_mask */
 
378
         0xffffffff,            /* dst_mask */
 
379
         FALSE),                /* pcrel_offset */
 
380
 
 
381
  HOWTO (R_MN10300_GOT16,       /* type */
 
382
         0,                     /* rightshift */
 
383
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
 
384
         16,                    /* bitsize */
 
385
         FALSE,                 /* pc_relative */
 
386
         0,                     /* bitpos */
 
387
         complain_overflow_bitfield, /* complain_on_overflow */
 
388
         bfd_elf_generic_reloc, /* */
 
389
         "R_MN10300_GOT16",     /* name */
 
390
         FALSE,                 /* partial_inplace */
 
391
         0xffffffff,            /* src_mask */
 
392
         0xffffffff,            /* dst_mask */
 
393
         FALSE),                /* pcrel_offset */
 
394
 
 
395
  HOWTO (R_MN10300_COPY,        /* type */
 
396
         0,                     /* rightshift */
 
397
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
398
         32,                    /* bitsize */
 
399
         FALSE,                 /* pc_relative */
 
400
         0,                     /* bitpos */
 
401
         complain_overflow_bitfield, /* complain_on_overflow */
 
402
         bfd_elf_generic_reloc, /* */
 
403
         "R_MN10300_COPY",              /* name */
 
404
         FALSE,                 /* partial_inplace */
 
405
         0xffffffff,            /* src_mask */
 
406
         0xffffffff,            /* dst_mask */
 
407
         FALSE),                /* pcrel_offset */
 
408
 
 
409
  HOWTO (R_MN10300_GLOB_DAT,    /* type */
 
410
         0,                     /* rightshift */
 
411
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
412
         32,                    /* bitsize */
 
413
         FALSE,                 /* pc_relative */
 
414
         0,                     /* bitpos */
 
415
         complain_overflow_bitfield, /* complain_on_overflow */
 
416
         bfd_elf_generic_reloc, /* */
 
417
         "R_MN10300_GLOB_DAT",  /* name */
 
418
         FALSE,                 /* partial_inplace */
 
419
         0xffffffff,            /* src_mask */
 
420
         0xffffffff,            /* dst_mask */
 
421
         FALSE),                /* pcrel_offset */
 
422
 
 
423
  HOWTO (R_MN10300_JMP_SLOT,    /* type */
 
424
         0,                     /* rightshift */
 
425
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
426
         32,                    /* bitsize */
 
427
         FALSE,                 /* pc_relative */
 
428
         0,                     /* bitpos */
 
429
         complain_overflow_bitfield, /* complain_on_overflow */
 
430
         bfd_elf_generic_reloc, /* */
 
431
         "R_MN10300_JMP_SLOT",  /* name */
 
432
         FALSE,                 /* partial_inplace */
 
433
         0xffffffff,            /* src_mask */
 
434
         0xffffffff,            /* dst_mask */
 
435
         FALSE),                /* pcrel_offset */
 
436
 
 
437
  HOWTO (R_MN10300_RELATIVE,    /* type */
 
438
         0,                     /* rightshift */
 
439
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
440
         32,                    /* bitsize */
 
441
         FALSE,                 /* pc_relative */
 
442
         0,                     /* bitpos */
 
443
         complain_overflow_bitfield, /* complain_on_overflow */
 
444
         bfd_elf_generic_reloc, /* */
 
445
         "R_MN10300_RELATIVE",  /* name */
 
446
         FALSE,                 /* partial_inplace */
 
447
         0xffffffff,            /* src_mask */
 
448
         0xffffffff,            /* dst_mask */
 
449
         FALSE),                /* pcrel_offset */
 
450
 
 
451
  EMPTY_HOWTO (24),
 
452
  EMPTY_HOWTO (25),
 
453
  EMPTY_HOWTO (26),
 
454
  EMPTY_HOWTO (27),
 
455
  EMPTY_HOWTO (28),
 
456
  EMPTY_HOWTO (29),
 
457
  EMPTY_HOWTO (30),
 
458
  EMPTY_HOWTO (31),
 
459
  EMPTY_HOWTO (32),
 
460
  
 
461
  HOWTO (R_MN10300_SYM_DIFF,    /* type */
 
462
         0,                     /* rightshift */
 
463
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
 
464
         32,                    /* bitsize */
 
465
         FALSE,                 /* pc_relative */
 
466
         0,                     /* bitpos */
 
467
         complain_overflow_dont,/* complain_on_overflow */
 
468
         NULL,                  /* special handler.  */
 
469
         "R_MN10300_SYM_DIFF",  /* name */
 
470
         FALSE,                 /* partial_inplace */
 
471
         0xffffffff,            /* src_mask */
 
472
         0xffffffff,            /* dst_mask */
 
473
         FALSE),                /* pcrel_offset */
 
474
 
 
475
  HOWTO (R_MN10300_ALIGN,       /* type */
 
476
         0,                     /* rightshift */
 
477
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
 
478
         32,                    /* bitsize */
 
479
         FALSE,                 /* pc_relative */
 
480
         0,                     /* bitpos */
 
481
         complain_overflow_dont,/* complain_on_overflow */
 
482
         NULL,                  /* special handler.  */
 
483
         "R_MN10300_ALIGN",     /* name */
 
484
         FALSE,                 /* partial_inplace */
 
485
         0,                     /* src_mask */
 
486
         0,                     /* dst_mask */
 
487
         FALSE)                 /* pcrel_offset */
 
488
};
 
489
 
 
490
struct mn10300_reloc_map
 
491
{
 
492
  bfd_reloc_code_real_type bfd_reloc_val;
 
493
  unsigned char elf_reloc_val;
 
494
};
 
495
 
 
496
static const struct mn10300_reloc_map mn10300_reloc_map[] =
 
497
{
 
498
  { BFD_RELOC_NONE, R_MN10300_NONE, },
 
499
  { BFD_RELOC_32, R_MN10300_32, },
 
500
  { BFD_RELOC_16, R_MN10300_16, },
 
501
  { BFD_RELOC_8, R_MN10300_8, },
 
502
  { BFD_RELOC_32_PCREL, R_MN10300_PCREL32, },
 
503
  { BFD_RELOC_16_PCREL, R_MN10300_PCREL16, },
 
504
  { BFD_RELOC_8_PCREL, R_MN10300_PCREL8, },
 
505
  { BFD_RELOC_24, R_MN10300_24, },
 
506
  { BFD_RELOC_VTABLE_INHERIT, R_MN10300_GNU_VTINHERIT },
 
507
  { BFD_RELOC_VTABLE_ENTRY, R_MN10300_GNU_VTENTRY },
 
508
  { BFD_RELOC_32_GOT_PCREL, R_MN10300_GOTPC32 },
 
509
  { BFD_RELOC_16_GOT_PCREL, R_MN10300_GOTPC16 },
 
510
  { BFD_RELOC_32_GOTOFF, R_MN10300_GOTOFF32 },
 
511
  { BFD_RELOC_MN10300_GOTOFF24, R_MN10300_GOTOFF24 },
 
512
  { BFD_RELOC_16_GOTOFF, R_MN10300_GOTOFF16 },
 
513
  { BFD_RELOC_32_PLT_PCREL, R_MN10300_PLT32 },
 
514
  { BFD_RELOC_16_PLT_PCREL, R_MN10300_PLT16 },
 
515
  { BFD_RELOC_MN10300_GOT32, R_MN10300_GOT32 },
 
516
  { BFD_RELOC_MN10300_GOT24, R_MN10300_GOT24 },
 
517
  { BFD_RELOC_MN10300_GOT16, R_MN10300_GOT16 },
 
518
  { BFD_RELOC_MN10300_COPY, R_MN10300_COPY },
 
519
  { BFD_RELOC_MN10300_GLOB_DAT, R_MN10300_GLOB_DAT },
 
520
  { BFD_RELOC_MN10300_JMP_SLOT, R_MN10300_JMP_SLOT },
 
521
  { BFD_RELOC_MN10300_RELATIVE, R_MN10300_RELATIVE },
 
522
  { BFD_RELOC_MN10300_SYM_DIFF, R_MN10300_SYM_DIFF },
 
523
  { BFD_RELOC_MN10300_ALIGN, R_MN10300_ALIGN }
 
524
};
 
525
 
 
526
/* Create the GOT section.  */
 
527
 
 
528
static bfd_boolean
 
529
_bfd_mn10300_elf_create_got_section (bfd * abfd,
 
530
                                     struct bfd_link_info * info)
 
531
{
 
532
  flagword   flags;
 
533
  flagword   pltflags;
 
534
  asection * s;
 
535
  struct elf_link_hash_entry * h;
 
536
  const struct elf_backend_data * bed = get_elf_backend_data (abfd);
 
537
  int ptralign;
 
538
 
 
539
  /* This function may be called more than once.  */
 
540
  if (bfd_get_section_by_name (abfd, ".got") != NULL)
 
541
    return TRUE;
 
542
 
 
543
  switch (bed->s->arch_size)
 
544
    {
 
545
    case 32:
 
546
      ptralign = 2;
 
547
      break;
 
548
 
 
549
    case 64:
 
550
      ptralign = 3;
 
551
      break;
 
552
 
 
553
    default:
 
554
      bfd_set_error (bfd_error_bad_value);
 
555
      return FALSE;
 
556
    }
 
557
 
 
558
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
 
559
           | SEC_LINKER_CREATED);
 
560
 
 
561
  pltflags = flags;
 
562
  pltflags |= SEC_CODE;
 
563
  if (bed->plt_not_loaded)
 
564
    pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
 
565
  if (bed->plt_readonly)
 
566
    pltflags |= SEC_READONLY;
 
567
 
 
568
  s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
 
569
  if (s == NULL
 
570
      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
 
571
    return FALSE;
 
572
 
 
573
  /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
 
574
     .plt section.  */
 
575
  if (bed->want_plt_sym)
 
576
    {
 
577
      h = _bfd_elf_define_linkage_sym (abfd, info, s,
 
578
                                       "_PROCEDURE_LINKAGE_TABLE_");
 
579
      elf_hash_table (info)->hplt = h;
 
580
      if (h == NULL)
 
581
        return FALSE;
 
582
    }
 
583
 
 
584
  s = bfd_make_section_with_flags (abfd, ".got", flags);
 
585
  if (s == NULL
 
586
      || ! bfd_set_section_alignment (abfd, s, ptralign))
 
587
    return FALSE;
 
588
 
 
589
  if (bed->want_got_plt)
 
590
    {
 
591
      s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
 
592
      if (s == NULL
 
593
          || ! bfd_set_section_alignment (abfd, s, ptralign))
 
594
        return FALSE;
 
595
    }
 
596
 
 
597
  /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
 
598
     (or .got.plt) section.  We don't do this in the linker script
 
599
     because we don't want to define the symbol if we are not creating
 
600
     a global offset table.  */
 
601
  h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
 
602
  elf_hash_table (info)->hgot = h;
 
603
  if (h == NULL)
 
604
    return FALSE;
 
605
 
 
606
  /* The first bit of the global offset table is the header.  */
 
607
  s->size += bed->got_header_size;
 
608
 
 
609
  return TRUE;
 
610
}
 
611
 
 
612
static reloc_howto_type *
 
613
bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
614
                                 bfd_reloc_code_real_type code)
 
615
{
 
616
  unsigned int i;
 
617
 
 
618
  for (i = ARRAY_SIZE (mn10300_reloc_map); i--;)
 
619
    if (mn10300_reloc_map[i].bfd_reloc_val == code)
 
620
      return &elf_mn10300_howto_table[mn10300_reloc_map[i].elf_reloc_val];
 
621
 
 
622
  return NULL;
 
623
}
 
624
 
 
625
static reloc_howto_type *
 
626
bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
627
                                 const char *r_name)
 
628
{
 
629
  unsigned int i;
 
630
 
 
631
  for (i = ARRAY_SIZE (elf_mn10300_howto_table); i--;)
 
632
    if (elf_mn10300_howto_table[i].name != NULL
 
633
        && strcasecmp (elf_mn10300_howto_table[i].name, r_name) == 0)
 
634
      return elf_mn10300_howto_table + i;
 
635
 
 
636
  return NULL;
 
637
}
 
638
 
 
639
/* Set the howto pointer for an MN10300 ELF reloc.  */
 
640
 
 
641
static void
 
642
mn10300_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
 
643
                       arelent *cache_ptr,
 
644
                       Elf_Internal_Rela *dst)
 
645
{
 
646
  unsigned int r_type;
 
647
 
 
648
  r_type = ELF32_R_TYPE (dst->r_info);
 
649
  BFD_ASSERT (r_type < (unsigned int) R_MN10300_MAX);
 
650
  cache_ptr->howto = elf_mn10300_howto_table + r_type;
 
651
}
 
652
 
 
653
/* Look through the relocs for a section during the first phase.
 
654
   Since we don't do .gots or .plts, we just need to consider the
 
655
   virtual table relocs for gc.  */
 
656
 
 
657
static bfd_boolean
 
658
mn10300_elf_check_relocs (bfd *abfd,
 
659
                          struct bfd_link_info *info,
 
660
                          asection *sec,
 
661
                          const Elf_Internal_Rela *relocs)
 
662
{
 
663
  bfd_boolean sym_diff_reloc_seen;
 
664
  Elf_Internal_Shdr *symtab_hdr;
 
665
  Elf_Internal_Sym * isymbuf = NULL;
 
666
  struct elf_link_hash_entry **sym_hashes;
 
667
  const Elf_Internal_Rela *rel;
 
668
  const Elf_Internal_Rela *rel_end;
 
669
  bfd *      dynobj;
 
670
  bfd_vma *  local_got_offsets;
 
671
  asection * sgot;
 
672
  asection * srelgot;
 
673
  asection * sreloc;
 
674
  bfd_boolean result = FALSE;
 
675
 
 
676
  sgot    = NULL;
 
677
  srelgot = NULL;
 
678
  sreloc  = NULL;
 
679
 
 
680
  if (info->relocatable)
 
681
    return TRUE;
 
682
 
 
683
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
 
684
  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
 
685
  sym_hashes = elf_sym_hashes (abfd);
 
686
 
 
687
  dynobj = elf_hash_table (info)->dynobj;
 
688
  local_got_offsets = elf_local_got_offsets (abfd);
 
689
  rel_end = relocs + sec->reloc_count;
 
690
  sym_diff_reloc_seen = FALSE;
 
691
 
 
692
  for (rel = relocs; rel < rel_end; rel++)
 
693
    {
 
694
      struct elf_link_hash_entry *h;
 
695
      unsigned long r_symndx;
 
696
      unsigned int r_type;
 
697
 
 
698
      r_symndx = ELF32_R_SYM (rel->r_info);
 
699
      if (r_symndx < symtab_hdr->sh_info)
 
700
        h = NULL;
 
701
      else
 
702
        {
 
703
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
 
704
          while (h->root.type == bfd_link_hash_indirect
 
705
                 || h->root.type == bfd_link_hash_warning)
 
706
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
 
707
        }
 
708
 
 
709
      r_type = ELF32_R_TYPE (rel->r_info);
 
710
 
 
711
      /* Some relocs require a global offset table.  */
 
712
      if (dynobj == NULL)
 
713
        {
 
714
          switch (r_type)
 
715
            {
 
716
            case R_MN10300_GOT32:
 
717
            case R_MN10300_GOT24:
 
718
            case R_MN10300_GOT16:
 
719
            case R_MN10300_GOTOFF32:
 
720
            case R_MN10300_GOTOFF24:
 
721
            case R_MN10300_GOTOFF16:
 
722
            case R_MN10300_GOTPC32:
 
723
            case R_MN10300_GOTPC16:
 
724
              elf_hash_table (info)->dynobj = dynobj = abfd;
 
725
              if (! _bfd_mn10300_elf_create_got_section (dynobj, info))
 
726
                goto fail;
 
727
              break;
 
728
 
 
729
            default:
 
730
              break;
 
731
            }
 
732
        }
 
733
 
 
734
      switch (r_type)
 
735
        {
 
736
        /* This relocation describes the C++ object vtable hierarchy.
 
737
           Reconstruct it for later use during GC.  */
 
738
        case R_MN10300_GNU_VTINHERIT:
 
739
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
 
740
            goto fail;
 
741
          break;
 
742
 
 
743
        /* This relocation describes which C++ vtable entries are actually
 
744
           used.  Record for later use during GC.  */
 
745
        case R_MN10300_GNU_VTENTRY:
 
746
          BFD_ASSERT (h != NULL);
 
747
          if (h != NULL
 
748
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
 
749
            goto fail;
 
750
          break;
 
751
 
 
752
        case R_MN10300_GOT32:
 
753
        case R_MN10300_GOT24:
 
754
        case R_MN10300_GOT16:
 
755
          /* This symbol requires a global offset table entry.  */
 
756
 
 
757
          if (sgot == NULL)
 
758
            {
 
759
              sgot = bfd_get_section_by_name (dynobj, ".got");
 
760
              BFD_ASSERT (sgot != NULL);
 
761
            }
 
762
 
 
763
          if (srelgot == NULL
 
764
              && (h != NULL || info->shared))
 
765
            {
 
766
              srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
 
767
              if (srelgot == NULL)
 
768
                {
 
769
                  srelgot = bfd_make_section_with_flags (dynobj,
 
770
                                                         ".rela.got",
 
771
                                                         (SEC_ALLOC
 
772
                                                          | SEC_LOAD
 
773
                                                          | SEC_HAS_CONTENTS
 
774
                                                          | SEC_IN_MEMORY
 
775
                                                          | SEC_LINKER_CREATED
 
776
                                                          | SEC_READONLY));
 
777
                  if (srelgot == NULL
 
778
                      || ! bfd_set_section_alignment (dynobj, srelgot, 2))
 
779
                    goto fail;
 
780
                }
 
781
            }
 
782
 
 
783
          if (h != NULL)
 
784
            {
 
785
              if (h->got.offset != (bfd_vma) -1)
 
786
                /* We have already allocated space in the .got.  */
 
787
                break;
 
788
 
 
789
              h->got.offset = sgot->size;
 
790
 
 
791
              /* Make sure this symbol is output as a dynamic symbol.  */
 
792
              if (h->dynindx == -1)
 
793
                {
 
794
                  if (! bfd_elf_link_record_dynamic_symbol (info, h))
 
795
                    goto fail;
 
796
                }
 
797
 
 
798
              srelgot->size += sizeof (Elf32_External_Rela);
 
799
            }
 
800
          else
 
801
            {
 
802
              /* This is a global offset table entry for a local
 
803
                 symbol.  */
 
804
              if (local_got_offsets == NULL)
 
805
                {
 
806
                  size_t       size;
 
807
                  unsigned int i;
 
808
 
 
809
                  size = symtab_hdr->sh_info * sizeof (bfd_vma);
 
810
                  local_got_offsets = bfd_alloc (abfd, size);
 
811
 
 
812
                  if (local_got_offsets == NULL)
 
813
                    goto fail;
 
814
 
 
815
                  elf_local_got_offsets (abfd) = local_got_offsets;
 
816
 
 
817
                  for (i = 0; i < symtab_hdr->sh_info; i++)
 
818
                    local_got_offsets[i] = (bfd_vma) -1;
 
819
                }
 
820
 
 
821
              if (local_got_offsets[r_symndx] != (bfd_vma) -1)
 
822
                /* We have already allocated space in the .got.  */
 
823
                break;
 
824
 
 
825
              local_got_offsets[r_symndx] = sgot->size;
 
826
 
 
827
              if (info->shared)
 
828
                /* If we are generating a shared object, we need to
 
829
                   output a R_MN10300_RELATIVE reloc so that the dynamic
 
830
                   linker can adjust this GOT entry.  */
 
831
                srelgot->size += sizeof (Elf32_External_Rela);
 
832
            }
 
833
 
 
834
          sgot->size += 4;
 
835
          break;
 
836
 
 
837
        case R_MN10300_PLT32:
 
838
        case R_MN10300_PLT16:
 
839
          /* This symbol requires a procedure linkage table entry.  We
 
840
             actually build the entry in adjust_dynamic_symbol,
 
841
             because this might be a case of linking PIC code which is
 
842
             never referenced by a dynamic object, in which case we
 
843
             don't need to generate a procedure linkage table entry
 
844
             after all.  */
 
845
 
 
846
          /* If this is a local symbol, we resolve it directly without
 
847
             creating a procedure linkage table entry.  */
 
848
          if (h == NULL)
 
849
            continue;
 
850
 
 
851
          if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
 
852
              || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
 
853
            break;
 
854
 
 
855
          h->needs_plt = 1;
 
856
          break;
 
857
 
 
858
        case R_MN10300_24:
 
859
        case R_MN10300_16:
 
860
        case R_MN10300_8:
 
861
        case R_MN10300_PCREL32:
 
862
        case R_MN10300_PCREL16:
 
863
        case R_MN10300_PCREL8:
 
864
          if (h != NULL)
 
865
            h->non_got_ref = 1;
 
866
          break;
 
867
 
 
868
        case R_MN10300_SYM_DIFF:
 
869
          sym_diff_reloc_seen = TRUE;
 
870
          break;
 
871
 
 
872
        case R_MN10300_32:
 
873
          if (h != NULL)
 
874
            h->non_got_ref = 1;
 
875
 
 
876
          /* If we are creating a shared library, then we
 
877
             need to copy the reloc into the shared library.  */
 
878
          if (info->shared
 
879
              && (sec->flags & SEC_ALLOC) != 0
 
880
              /* Do not generate a dynamic reloc for a
 
881
                 reloc associated with a SYM_DIFF operation.  */
 
882
              && ! sym_diff_reloc_seen)
 
883
            {
 
884
              asection * sym_section = NULL;
 
885
 
 
886
              /* Find the section containing the
 
887
                 symbol involved in the relocation.  */
 
888
              if (h == NULL)
 
889
                {
 
890
                  Elf_Internal_Sym * isym;
 
891
 
 
892
                  if (isymbuf == NULL)
 
893
                    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
 
894
                                                    symtab_hdr->sh_info, 0,
 
895
                                                    NULL, NULL, NULL);
 
896
                  if (isymbuf)
 
897
                    {
 
898
                      isym = isymbuf + r_symndx;
 
899
                      /* All we care about is whether this local symbol is absolute.  */
 
900
                      if (isym->st_shndx == SHN_ABS)
 
901
                        sym_section = bfd_abs_section_ptr;
 
902
                    }
 
903
                }
 
904
              else
 
905
                {
 
906
                  if (h->root.type == bfd_link_hash_defined
 
907
                      || h->root.type == bfd_link_hash_defweak)
 
908
                    sym_section = h->root.u.def.section;
 
909
                }
 
910
 
 
911
              /* If the symbol is absolute then the relocation can
 
912
                 be resolved during linking and there is no need for
 
913
                 a dynamic reloc.  */
 
914
              if (sym_section != bfd_abs_section_ptr)
 
915
                {
 
916
                  /* When creating a shared object, we must copy these
 
917
                     reloc types into the output file.  We create a reloc
 
918
                     section in dynobj and make room for this reloc.  */
 
919
                  if (sreloc == NULL)
 
920
                    {
 
921
                      sreloc = _bfd_elf_make_dynamic_reloc_section
 
922
                        (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
 
923
                      if (sreloc == NULL)
 
924
                        goto fail;
 
925
                    }
 
926
 
 
927
                  sreloc->size += sizeof (Elf32_External_Rela);
 
928
                }
 
929
            }
 
930
 
 
931
          break;
 
932
        }
 
933
 
 
934
      if (ELF32_R_TYPE (rel->r_info) != R_MN10300_SYM_DIFF)
 
935
        sym_diff_reloc_seen = FALSE;
 
936
    }
 
937
 
 
938
  result = TRUE;
 
939
 fail:
 
940
  if (isymbuf != NULL)
 
941
    free (isymbuf);
 
942
 
 
943
  return result;
 
944
}
 
945
 
 
946
/* Return the section that should be marked against GC for a given
 
947
   relocation.  */
 
948
 
 
949
static asection *
 
950
mn10300_elf_gc_mark_hook (asection *sec,
 
951
                          struct bfd_link_info *info,
 
952
                          Elf_Internal_Rela *rel,
 
953
                          struct elf_link_hash_entry *h,
 
954
                          Elf_Internal_Sym *sym)
 
955
{
 
956
  if (h != NULL)
 
957
    switch (ELF32_R_TYPE (rel->r_info))
 
958
      {
 
959
      case R_MN10300_GNU_VTINHERIT:
 
960
      case R_MN10300_GNU_VTENTRY:
 
961
        return NULL;
 
962
      }
 
963
 
 
964
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 
965
}
 
966
 
 
967
/* Perform a relocation as part of a final link.  */
 
968
 
 
969
static bfd_reloc_status_type
 
970
mn10300_elf_final_link_relocate (reloc_howto_type *howto,
 
971
                                 bfd *input_bfd,
 
972
                                 bfd *output_bfd ATTRIBUTE_UNUSED,
 
973
                                 asection *input_section,
 
974
                                 bfd_byte *contents,
 
975
                                 bfd_vma offset,
 
976
                                 bfd_vma value,
 
977
                                 bfd_vma addend,
 
978
                                 struct elf_link_hash_entry * h,
 
979
                                 unsigned long symndx,
 
980
                                 struct bfd_link_info *info,
 
981
                                 asection *sym_sec ATTRIBUTE_UNUSED,
 
982
                                 int is_local ATTRIBUTE_UNUSED)
 
983
{
 
984
  static asection *  sym_diff_section;
 
985
  static bfd_vma     sym_diff_value;
 
986
  bfd_boolean is_sym_diff_reloc;
 
987
  unsigned long r_type = howto->type;
 
988
  bfd_byte * hit_data = contents + offset;
 
989
  bfd *      dynobj;
 
990
  asection * sgot;
 
991
  asection * splt;
 
992
  asection * sreloc;
 
993
 
 
994
  dynobj = elf_hash_table (info)->dynobj;
 
995
  sgot   = NULL;
 
996
  splt   = NULL;
 
997
  sreloc = NULL;
 
998
 
 
999
  switch (r_type)
 
1000
    {
 
1001
    case R_MN10300_24:
 
1002
    case R_MN10300_16:
 
1003
    case R_MN10300_8:
 
1004
    case R_MN10300_PCREL8:
 
1005
    case R_MN10300_PCREL16:
 
1006
    case R_MN10300_PCREL32:
 
1007
    case R_MN10300_GOTOFF32:
 
1008
    case R_MN10300_GOTOFF24:
 
1009
    case R_MN10300_GOTOFF16:
 
1010
      if (info->shared
 
1011
          && (input_section->flags & SEC_ALLOC) != 0
 
1012
          && h != NULL
 
1013
          && ! SYMBOL_REFERENCES_LOCAL (info, h))
 
1014
        return bfd_reloc_dangerous;
 
1015
    }
 
1016
 
 
1017
  is_sym_diff_reloc = FALSE;
 
1018
  if (sym_diff_section != NULL)
 
1019
    {
 
1020
      BFD_ASSERT (sym_diff_section == input_section);
 
1021
 
 
1022
      switch (r_type)
 
1023
        {
 
1024
        case R_MN10300_32:
 
1025
        case R_MN10300_24:
 
1026
        case R_MN10300_16:
 
1027
        case R_MN10300_8:
 
1028
          value -= sym_diff_value;
 
1029
          /* If we are computing a 32-bit value for the location lists
 
1030
             and the result is 0 then we add one to the value.  A zero
 
1031
             value can result because of linker relaxation deleteing
 
1032
             prologue instructions and using a value of 1 (for the begin
 
1033
             and end offsets in the location list entry) results in a
 
1034
             nul entry which does not prevent the following entries from
 
1035
             being parsed.  */
 
1036
          if (r_type == R_MN10300_32
 
1037
              && value == 0
 
1038
              && strcmp (input_section->name, ".debug_loc") == 0)
 
1039
            value = 1;
 
1040
          sym_diff_section = NULL;
 
1041
          is_sym_diff_reloc = TRUE;
 
1042
          break;
 
1043
 
 
1044
        default:
 
1045
          sym_diff_section = NULL;
 
1046
          break;
 
1047
        }
 
1048
    }
 
1049
 
 
1050
  switch (r_type)
 
1051
    {
 
1052
    case R_MN10300_SYM_DIFF:
 
1053
      BFD_ASSERT (addend == 0);
 
1054
      /* Cache the input section and value.
 
1055
         The offset is unreliable, since relaxation may
 
1056
         have reduced the following reloc's offset.  */
 
1057
      sym_diff_section = input_section;
 
1058
      sym_diff_value = value;
 
1059
      return bfd_reloc_ok;
 
1060
 
 
1061
    case R_MN10300_ALIGN:
 
1062
    case R_MN10300_NONE:
 
1063
      return bfd_reloc_ok;
 
1064
 
 
1065
    case R_MN10300_32:
 
1066
      if (info->shared
 
1067
          /* Do not generate relocs when an R_MN10300_32 has been used
 
1068
             with an R_MN10300_SYM_DIFF to compute a difference of two
 
1069
             symbols.  */
 
1070
          && is_sym_diff_reloc == FALSE
 
1071
          /* Also, do not generate a reloc when the symbol associated
 
1072
             with the R_MN10300_32 reloc is absolute - there is no
 
1073
             need for a run time computation in this case.  */
 
1074
          && sym_sec != bfd_abs_section_ptr
 
1075
          /* If the section is not going to be allocated at load time
 
1076
             then there is no need to generate relocs for it.  */
 
1077
          && (input_section->flags & SEC_ALLOC) != 0)
 
1078
        {
 
1079
          Elf_Internal_Rela outrel;
 
1080
          bfd_boolean skip, relocate;
 
1081
 
 
1082
          /* When generating a shared object, these relocations are
 
1083
             copied into the output file to be resolved at run
 
1084
             time.  */
 
1085
          if (sreloc == NULL)
 
1086
            {
 
1087
              sreloc = _bfd_elf_get_dynamic_reloc_section
 
1088
                (input_bfd, input_section, /*rela?*/ TRUE);
 
1089
              if (sreloc == NULL)
 
1090
                return FALSE;
 
1091
            }
 
1092
 
 
1093
          skip = FALSE;
 
1094
 
 
1095
          outrel.r_offset = _bfd_elf_section_offset (input_bfd, info,
 
1096
                                                     input_section, offset);
 
1097
          if (outrel.r_offset == (bfd_vma) -1)
 
1098
            skip = TRUE;
 
1099
 
 
1100
          outrel.r_offset += (input_section->output_section->vma
 
1101
                              + input_section->output_offset);
 
1102
 
 
1103
          if (skip)
 
1104
            {
 
1105
              memset (&outrel, 0, sizeof outrel);
 
1106
              relocate = FALSE;
 
1107
            }
 
1108
          else
 
1109
            {
 
1110
              /* h->dynindx may be -1 if this symbol was marked to
 
1111
                 become local.  */
 
1112
              if (h == NULL
 
1113
                  || SYMBOL_REFERENCES_LOCAL (info, h))
 
1114
                {
 
1115
                  relocate = TRUE;
 
1116
                  outrel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
 
1117
                  outrel.r_addend = value + addend;
 
1118
                }
 
1119
              else
 
1120
                {
 
1121
                  BFD_ASSERT (h->dynindx != -1);
 
1122
                  relocate = FALSE;
 
1123
                  outrel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_32);
 
1124
                  outrel.r_addend = value + addend;
 
1125
                }
 
1126
            }
 
1127
 
 
1128
          bfd_elf32_swap_reloca_out (output_bfd, &outrel,
 
1129
                                     (bfd_byte *) (((Elf32_External_Rela *) sreloc->contents)
 
1130
                                                   + sreloc->reloc_count));
 
1131
          ++sreloc->reloc_count;
 
1132
 
 
1133
          /* If this reloc is against an external symbol, we do
 
1134
             not want to fiddle with the addend.  Otherwise, we
 
1135
             need to include the symbol value so that it becomes
 
1136
             an addend for the dynamic reloc.  */
 
1137
          if (! relocate)
 
1138
            return bfd_reloc_ok;
 
1139
        }
 
1140
      value += addend;
 
1141
      bfd_put_32 (input_bfd, value, hit_data);
 
1142
      return bfd_reloc_ok;
 
1143
 
 
1144
    case R_MN10300_24:
 
1145
      value += addend;
 
1146
 
 
1147
      if ((long) value > 0x7fffff || (long) value < -0x800000)
 
1148
        return bfd_reloc_overflow;
 
1149
 
 
1150
      bfd_put_8 (input_bfd, value & 0xff, hit_data);
 
1151
      bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
 
1152
      bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
 
1153
      return bfd_reloc_ok;
 
1154
 
 
1155
    case R_MN10300_16:
 
1156
      value += addend;
 
1157
 
 
1158
      if ((long) value > 0x7fff || (long) value < -0x8000)
 
1159
        return bfd_reloc_overflow;
 
1160
 
 
1161
      bfd_put_16 (input_bfd, value, hit_data);
 
1162
      return bfd_reloc_ok;
 
1163
 
 
1164
    case R_MN10300_8:
 
1165
      value += addend;
 
1166
 
 
1167
      if ((long) value > 0x7f || (long) value < -0x80)
 
1168
        return bfd_reloc_overflow;
 
1169
 
 
1170
      bfd_put_8 (input_bfd, value, hit_data);
 
1171
      return bfd_reloc_ok;
 
1172
 
 
1173
    case R_MN10300_PCREL8:
 
1174
      value -= (input_section->output_section->vma
 
1175
                + input_section->output_offset);
 
1176
      value -= offset;
 
1177
      value += addend;
 
1178
 
 
1179
      if ((long) value > 0x7f || (long) value < -0x80)
 
1180
        return bfd_reloc_overflow;
 
1181
 
 
1182
      bfd_put_8 (input_bfd, value, hit_data);
 
1183
      return bfd_reloc_ok;
 
1184
 
 
1185
    case R_MN10300_PCREL16:
 
1186
      value -= (input_section->output_section->vma
 
1187
                + input_section->output_offset);
 
1188
      value -= offset;
 
1189
      value += addend;
 
1190
 
 
1191
      if ((long) value > 0x7fff || (long) value < -0x8000)
 
1192
        return bfd_reloc_overflow;
 
1193
 
 
1194
      bfd_put_16 (input_bfd, value, hit_data);
 
1195
      return bfd_reloc_ok;
 
1196
 
 
1197
    case R_MN10300_PCREL32:
 
1198
      value -= (input_section->output_section->vma
 
1199
                + input_section->output_offset);
 
1200
      value -= offset;
 
1201
      value += addend;
 
1202
 
 
1203
      bfd_put_32 (input_bfd, value, hit_data);
 
1204
      return bfd_reloc_ok;
 
1205
 
 
1206
    case R_MN10300_GNU_VTINHERIT:
 
1207
    case R_MN10300_GNU_VTENTRY:
 
1208
      return bfd_reloc_ok;
 
1209
 
 
1210
    case R_MN10300_GOTPC32:
 
1211
      /* Use global offset table as symbol value.  */
 
1212
      value = bfd_get_section_by_name (dynobj,
 
1213
                                       ".got")->output_section->vma;
 
1214
      value -= (input_section->output_section->vma
 
1215
                + input_section->output_offset);
 
1216
      value -= offset;
 
1217
      value += addend;
 
1218
 
 
1219
      bfd_put_32 (input_bfd, value, hit_data);
 
1220
      return bfd_reloc_ok;
 
1221
 
 
1222
    case R_MN10300_GOTPC16:
 
1223
      /* Use global offset table as symbol value.  */
 
1224
      value = bfd_get_section_by_name (dynobj,
 
1225
                                       ".got")->output_section->vma;
 
1226
      value -= (input_section->output_section->vma
 
1227
                + input_section->output_offset);
 
1228
      value -= offset;
 
1229
      value += addend;
 
1230
 
 
1231
      if ((long) value > 0x7fff || (long) value < -0x8000)
 
1232
        return bfd_reloc_overflow;
 
1233
 
 
1234
      bfd_put_16 (input_bfd, value, hit_data);
 
1235
      return bfd_reloc_ok;
 
1236
 
 
1237
    case R_MN10300_GOTOFF32:
 
1238
      value -= bfd_get_section_by_name (dynobj,
 
1239
                                        ".got")->output_section->vma;
 
1240
      value += addend;
 
1241
 
 
1242
      bfd_put_32 (input_bfd, value, hit_data);
 
1243
      return bfd_reloc_ok;
 
1244
 
 
1245
    case R_MN10300_GOTOFF24:
 
1246
      value -= bfd_get_section_by_name (dynobj,
 
1247
                                        ".got")->output_section->vma;
 
1248
      value += addend;
 
1249
 
 
1250
      if ((long) value > 0x7fffff || (long) value < -0x800000)
 
1251
        return bfd_reloc_overflow;
 
1252
 
 
1253
      bfd_put_8 (input_bfd, value, hit_data);
 
1254
      bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
 
1255
      bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
 
1256
      return bfd_reloc_ok;
 
1257
 
 
1258
    case R_MN10300_GOTOFF16:
 
1259
      value -= bfd_get_section_by_name (dynobj,
 
1260
                                        ".got")->output_section->vma;
 
1261
      value += addend;
 
1262
 
 
1263
      if ((long) value > 0x7fff || (long) value < -0x8000)
 
1264
        return bfd_reloc_overflow;
 
1265
 
 
1266
      bfd_put_16 (input_bfd, value, hit_data);
 
1267
      return bfd_reloc_ok;
 
1268
 
 
1269
    case R_MN10300_PLT32:
 
1270
      if (h != NULL
 
1271
          && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
 
1272
          && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
 
1273
          && h->plt.offset != (bfd_vma) -1)
 
1274
        {
 
1275
          splt = bfd_get_section_by_name (dynobj, ".plt");
 
1276
 
 
1277
          value = (splt->output_section->vma
 
1278
                   + splt->output_offset
 
1279
                   + h->plt.offset) - value;
 
1280
        }
 
1281
 
 
1282
      value -= (input_section->output_section->vma
 
1283
                + input_section->output_offset);
 
1284
      value -= offset;
 
1285
      value += addend;
 
1286
 
 
1287
      bfd_put_32 (input_bfd, value, hit_data);
 
1288
      return bfd_reloc_ok;
 
1289
 
 
1290
    case R_MN10300_PLT16:
 
1291
      if (h != NULL
 
1292
          && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
 
1293
          && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
 
1294
          && h->plt.offset != (bfd_vma) -1)
 
1295
        {
 
1296
          splt = bfd_get_section_by_name (dynobj, ".plt");
 
1297
 
 
1298
          value = (splt->output_section->vma
 
1299
                   + splt->output_offset
 
1300
                   + h->plt.offset) - value;
 
1301
        }
 
1302
 
 
1303
      value -= (input_section->output_section->vma
 
1304
                + input_section->output_offset);
 
1305
      value -= offset;
 
1306
      value += addend;
 
1307
 
 
1308
      if ((long) value > 0x7fff || (long) value < -0x8000)
 
1309
        return bfd_reloc_overflow;
 
1310
 
 
1311
      bfd_put_16 (input_bfd, value, hit_data);
 
1312
      return bfd_reloc_ok;
 
1313
 
 
1314
    case R_MN10300_GOT32:
 
1315
    case R_MN10300_GOT24:
 
1316
    case R_MN10300_GOT16:
 
1317
      {
 
1318
        sgot = bfd_get_section_by_name (dynobj, ".got");
 
1319
 
 
1320
          if (h != NULL)
 
1321
            {
 
1322
              bfd_vma off;
 
1323
 
 
1324
              off = h->got.offset;
 
1325
              BFD_ASSERT (off != (bfd_vma) -1);
 
1326
 
 
1327
              if (! elf_hash_table (info)->dynamic_sections_created
 
1328
                  || SYMBOL_REFERENCES_LOCAL (info, h))
 
1329
                /* This is actually a static link, or it is a
 
1330
                   -Bsymbolic link and the symbol is defined
 
1331
                   locally, or the symbol was forced to be local
 
1332
                   because of a version file.  We must initialize
 
1333
                   this entry in the global offset table.
 
1334
 
 
1335
                   When doing a dynamic link, we create a .rela.got
 
1336
                   relocation entry to initialize the value.  This
 
1337
                   is done in the finish_dynamic_symbol routine.  */
 
1338
                bfd_put_32 (output_bfd, value,
 
1339
                            sgot->contents + off);
 
1340
 
 
1341
              value = sgot->output_offset + off;
 
1342
            }
 
1343
          else
 
1344
            {
 
1345
              bfd_vma off;
 
1346
 
 
1347
              off = elf_local_got_offsets (input_bfd)[symndx];
 
1348
 
 
1349
              bfd_put_32 (output_bfd, value, sgot->contents + off);
 
1350
 
 
1351
              if (info->shared)
 
1352
                {
 
1353
                  asection * srelgot;
 
1354
                  Elf_Internal_Rela outrel;
 
1355
 
 
1356
                  srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
 
1357
                  BFD_ASSERT (srelgot != NULL);
 
1358
 
 
1359
                  outrel.r_offset = (sgot->output_section->vma
 
1360
                                     + sgot->output_offset
 
1361
                                     + off);
 
1362
                  outrel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
 
1363
                  outrel.r_addend = value;
 
1364
                  bfd_elf32_swap_reloca_out (output_bfd, &outrel,
 
1365
                                             (bfd_byte *) (((Elf32_External_Rela *)
 
1366
                                                            srelgot->contents)
 
1367
                                                           + srelgot->reloc_count));
 
1368
                  ++ srelgot->reloc_count;
 
1369
                }
 
1370
 
 
1371
              value = sgot->output_offset + off;
 
1372
            }
 
1373
      }
 
1374
 
 
1375
      value += addend;
 
1376
 
 
1377
      if (r_type == R_MN10300_GOT32)
 
1378
        {
 
1379
          bfd_put_32 (input_bfd, value, hit_data);
 
1380
          return bfd_reloc_ok;
 
1381
        }
 
1382
      else if (r_type == R_MN10300_GOT24)
 
1383
        {
 
1384
          if ((long) value > 0x7fffff || (long) value < -0x800000)
 
1385
            return bfd_reloc_overflow;
 
1386
 
 
1387
          bfd_put_8 (input_bfd, value & 0xff, hit_data);
 
1388
          bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
 
1389
          bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
 
1390
          return bfd_reloc_ok;
 
1391
        }
 
1392
      else if (r_type == R_MN10300_GOT16)
 
1393
        {
 
1394
          if ((long) value > 0x7fff || (long) value < -0x8000)
 
1395
            return bfd_reloc_overflow;
 
1396
 
 
1397
          bfd_put_16 (input_bfd, value, hit_data);
 
1398
          return bfd_reloc_ok;
 
1399
        }
 
1400
      /* Fall through.  */
 
1401
 
 
1402
    default:
 
1403
      return bfd_reloc_notsupported;
 
1404
    }
 
1405
}
 
1406
 
 
1407
/* Relocate an MN10300 ELF section.  */
 
1408
 
 
1409
static bfd_boolean
 
1410
mn10300_elf_relocate_section (bfd *output_bfd,
 
1411
                              struct bfd_link_info *info,
 
1412
                              bfd *input_bfd,
 
1413
                              asection *input_section,
 
1414
                              bfd_byte *contents,
 
1415
                              Elf_Internal_Rela *relocs,
 
1416
                              Elf_Internal_Sym *local_syms,
 
1417
                              asection **local_sections)
 
1418
{
 
1419
  Elf_Internal_Shdr *symtab_hdr;
 
1420
  struct elf_link_hash_entry **sym_hashes;
 
1421
  Elf_Internal_Rela *rel, *relend;
 
1422
 
 
1423
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
 
1424
  sym_hashes = elf_sym_hashes (input_bfd);
 
1425
 
 
1426
  rel = relocs;
 
1427
  relend = relocs + input_section->reloc_count;
 
1428
  for (; rel < relend; rel++)
 
1429
    {
 
1430
      int r_type;
 
1431
      reloc_howto_type *howto;
 
1432
      unsigned long r_symndx;
 
1433
      Elf_Internal_Sym *sym;
 
1434
      asection *sec;
 
1435
      struct elf32_mn10300_link_hash_entry *h;
 
1436
      bfd_vma relocation;
 
1437
      bfd_reloc_status_type r;
 
1438
 
 
1439
      r_symndx = ELF32_R_SYM (rel->r_info);
 
1440
      r_type = ELF32_R_TYPE (rel->r_info);
 
1441
      howto = elf_mn10300_howto_table + r_type;
 
1442
 
 
1443
      /* Just skip the vtable gc relocs.  */
 
1444
      if (r_type == R_MN10300_GNU_VTINHERIT
 
1445
          || r_type == R_MN10300_GNU_VTENTRY)
 
1446
        continue;
 
1447
 
 
1448
      h = NULL;
 
1449
      sym = NULL;
 
1450
      sec = NULL;
 
1451
      if (r_symndx < symtab_hdr->sh_info)
 
1452
        {
 
1453
          sym = local_syms + r_symndx;
 
1454
          sec = local_sections[r_symndx];
 
1455
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
 
1456
        }
 
1457
      else
 
1458
        {
 
1459
          bfd_boolean unresolved_reloc;
 
1460
          bfd_boolean warned;
 
1461
          struct elf_link_hash_entry *hh;
 
1462
 
 
1463
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
 
1464
                                   r_symndx, symtab_hdr, sym_hashes,
 
1465
                                   hh, sec, relocation,
 
1466
                                   unresolved_reloc, warned);
 
1467
 
 
1468
          h = (struct elf32_mn10300_link_hash_entry *) hh;
 
1469
 
 
1470
          if ((h->root.root.type == bfd_link_hash_defined
 
1471
              || h->root.root.type == bfd_link_hash_defweak)
 
1472
              && (   r_type == R_MN10300_GOTPC32
 
1473
                  || r_type == R_MN10300_GOTPC16
 
1474
                  || ((   r_type == R_MN10300_PLT32
 
1475
                       || r_type == R_MN10300_PLT16)
 
1476
                      && ELF_ST_VISIBILITY (h->root.other) != STV_INTERNAL
 
1477
                      && ELF_ST_VISIBILITY (h->root.other) != STV_HIDDEN
 
1478
                      && h->root.plt.offset != (bfd_vma) -1)
 
1479
                  || ((   r_type == R_MN10300_GOT32
 
1480
                       || r_type == R_MN10300_GOT24
 
1481
                       || r_type == R_MN10300_GOT16)
 
1482
                      && elf_hash_table (info)->dynamic_sections_created
 
1483
                      && !SYMBOL_REFERENCES_LOCAL (info, hh))
 
1484
                  || (r_type == R_MN10300_32
 
1485
                      /* _32 relocs in executables force _COPY relocs,
 
1486
                         such that the address of the symbol ends up
 
1487
                         being local.  */
 
1488
                      && !info->executable
 
1489
                      && !SYMBOL_REFERENCES_LOCAL (info, hh)
 
1490
                      && ((input_section->flags & SEC_ALLOC) != 0
 
1491
                          /* DWARF will emit R_MN10300_32 relocations
 
1492
                             in its sections against symbols defined
 
1493
                             externally in shared libraries.  We can't
 
1494
                             do anything with them here.  */
 
1495
                          || ((input_section->flags & SEC_DEBUGGING) != 0
 
1496
                              && h->root.def_dynamic)))))
 
1497
            /* In these cases, we don't need the relocation
 
1498
               value.  We check specially because in some
 
1499
               obscure cases sec->output_section will be NULL.  */
 
1500
            relocation = 0;
 
1501
 
 
1502
          else if (!info->relocatable && unresolved_reloc)
 
1503
            (*_bfd_error_handler)
 
1504
              (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 
1505
               input_bfd,
 
1506
               input_section,
 
1507
               (long) rel->r_offset,
 
1508
               howto->name,
 
1509
               h->root.root.root.string);
 
1510
        }
 
1511
 
 
1512
      if (sec != NULL && discarded_section (sec))
 
1513
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
 
1514
                                         rel, relend, howto, contents);
 
1515
 
 
1516
      if (info->relocatable)
 
1517
        continue;
 
1518
 
 
1519
      r = mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
 
1520
                                           input_section,
 
1521
                                           contents, rel->r_offset,
 
1522
                                           relocation, rel->r_addend,
 
1523
                                           (struct elf_link_hash_entry *) h,
 
1524
                                           r_symndx,
 
1525
                                           info, sec, h == NULL);
 
1526
 
 
1527
      if (r != bfd_reloc_ok)
 
1528
        {
 
1529
          const char *name;
 
1530
          const char *msg = NULL;
 
1531
 
 
1532
          if (h != NULL)
 
1533
            name = h->root.root.root.string;
 
1534
          else
 
1535
            {
 
1536
              name = (bfd_elf_string_from_elf_section
 
1537
                      (input_bfd, symtab_hdr->sh_link, sym->st_name));
 
1538
              if (name == NULL || *name == '\0')
 
1539
                name = bfd_section_name (input_bfd, sec);
 
1540
            }
 
1541
 
 
1542
          switch (r)
 
1543
            {
 
1544
            case bfd_reloc_overflow:
 
1545
              if (! ((*info->callbacks->reloc_overflow)
 
1546
                     (info, (h ? &h->root.root : NULL), name,
 
1547
                      howto->name, (bfd_vma) 0, input_bfd,
 
1548
                      input_section, rel->r_offset)))
 
1549
                return FALSE;
 
1550
              break;
 
1551
 
 
1552
            case bfd_reloc_undefined:
 
1553
              if (! ((*info->callbacks->undefined_symbol)
 
1554
                     (info, name, input_bfd, input_section,
 
1555
                      rel->r_offset, TRUE)))
 
1556
                return FALSE;
 
1557
              break;
 
1558
 
 
1559
            case bfd_reloc_outofrange:
 
1560
              msg = _("internal error: out of range error");
 
1561
              goto common_error;
 
1562
 
 
1563
            case bfd_reloc_notsupported:
 
1564
              msg = _("internal error: unsupported relocation error");
 
1565
              goto common_error;
 
1566
 
 
1567
            case bfd_reloc_dangerous:
 
1568
              if (r_type == R_MN10300_PCREL32)
 
1569
                msg = _("error: inappropriate relocation type for shared"
 
1570
                        " library (did you forget -fpic?)");
 
1571
              else
 
1572
                msg = _("internal error: suspicious relocation type used"
 
1573
                        " in shared library");
 
1574
              goto common_error;
 
1575
 
 
1576
            default:
 
1577
              msg = _("internal error: unknown error");
 
1578
              /* Fall through.  */
 
1579
 
 
1580
            common_error:
 
1581
              if (!((*info->callbacks->warning)
 
1582
                    (info, msg, name, input_bfd, input_section,
 
1583
                     rel->r_offset)))
 
1584
                return FALSE;
 
1585
              break;
 
1586
            }
 
1587
        }
 
1588
    }
 
1589
 
 
1590
  return TRUE;
 
1591
}
 
1592
 
 
1593
/* Finish initializing one hash table entry.  */
 
1594
 
 
1595
static bfd_boolean
 
1596
elf32_mn10300_finish_hash_table_entry (struct bfd_hash_entry *gen_entry,
 
1597
                                       void * in_args)
 
1598
{
 
1599
  struct elf32_mn10300_link_hash_entry *entry;
 
1600
  struct bfd_link_info *link_info = (struct bfd_link_info *) in_args;
 
1601
  unsigned int byte_count = 0;
 
1602
 
 
1603
  entry = (struct elf32_mn10300_link_hash_entry *) gen_entry;
 
1604
 
 
1605
  /* If we already know we want to convert "call" to "calls" for calls
 
1606
     to this symbol, then return now.  */
 
1607
  if (entry->flags == MN10300_CONVERT_CALL_TO_CALLS)
 
1608
    return TRUE;
 
1609
 
 
1610
  /* If there are no named calls to this symbol, or there's nothing we
 
1611
     can move from the function itself into the "call" instruction,
 
1612
     then note that all "call" instructions should be converted into
 
1613
     "calls" instructions and return.  If a symbol is available for
 
1614
     dynamic symbol resolution (overridable or overriding), avoid
 
1615
     custom calling conventions.  */
 
1616
  if (entry->direct_calls == 0
 
1617
      || (entry->stack_size == 0 && entry->movm_args == 0)
 
1618
      || (elf_hash_table (link_info)->dynamic_sections_created
 
1619
          && ELF_ST_VISIBILITY (entry->root.other) != STV_INTERNAL
 
1620
          && ELF_ST_VISIBILITY (entry->root.other) != STV_HIDDEN))
 
1621
    {
 
1622
      /* Make a note that we should convert "call" instructions to "calls"
 
1623
         instructions for calls to this symbol.  */
 
1624
      entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
 
1625
      return TRUE;
 
1626
    }
 
1627
 
 
1628
  /* We may be able to move some instructions from the function itself into
 
1629
     the "call" instruction.  Count how many bytes we might be able to
 
1630
     eliminate in the function itself.  */
 
1631
 
 
1632
  /* A movm instruction is two bytes.  */
 
1633
  if (entry->movm_args)
 
1634
    byte_count += 2;
 
1635
 
 
1636
  /* Count the insn to allocate stack space too.  */
 
1637
  if (entry->stack_size > 0)
 
1638
    {
 
1639
      if (entry->stack_size <= 128)
 
1640
        byte_count += 3;
 
1641
      else
 
1642
        byte_count += 4;
 
1643
    }
 
1644
 
 
1645
  /* If using "call" will result in larger code, then turn all
 
1646
     the associated "call" instructions into "calls" instructions.  */
 
1647
  if (byte_count < entry->direct_calls)
 
1648
    entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
 
1649
 
 
1650
  /* This routine never fails.  */
 
1651
  return TRUE;
 
1652
}
 
1653
 
 
1654
/* Used to count hash table entries.  */
 
1655
 
 
1656
static bfd_boolean
 
1657
elf32_mn10300_count_hash_table_entries (struct bfd_hash_entry *gen_entry ATTRIBUTE_UNUSED,
 
1658
                                        void * in_args)
 
1659
{
 
1660
  int *count = (int *) in_args;
 
1661
 
 
1662
  (*count) ++;
 
1663
  return TRUE;
 
1664
}
 
1665
 
 
1666
/* Used to enumerate hash table entries into a linear array.  */
 
1667
 
 
1668
static bfd_boolean
 
1669
elf32_mn10300_list_hash_table_entries (struct bfd_hash_entry *gen_entry,
 
1670
                                       void * in_args)
 
1671
{
 
1672
  struct bfd_hash_entry ***ptr = (struct bfd_hash_entry ***) in_args;
 
1673
 
 
1674
  **ptr = gen_entry;
 
1675
  (*ptr) ++;
 
1676
  return TRUE;
 
1677
}
 
1678
 
 
1679
/* Used to sort the array created by the above.  */
 
1680
 
 
1681
static int
 
1682
sort_by_value (const void *va, const void *vb)
 
1683
{
 
1684
  struct elf32_mn10300_link_hash_entry *a
 
1685
    = *(struct elf32_mn10300_link_hash_entry **) va;
 
1686
  struct elf32_mn10300_link_hash_entry *b
 
1687
    = *(struct elf32_mn10300_link_hash_entry **) vb;
 
1688
 
 
1689
  return a->value - b->value;
 
1690
}
 
1691
 
 
1692
/* Compute the stack size and movm arguments for the function
 
1693
   referred to by HASH at address ADDR in section with
 
1694
   contents CONTENTS, store the information in the hash table.  */
 
1695
 
 
1696
static void
 
1697
compute_function_info (bfd *abfd,
 
1698
                       struct elf32_mn10300_link_hash_entry *hash,
 
1699
                       bfd_vma addr,
 
1700
                       unsigned char *contents)
 
1701
{
 
1702
  unsigned char byte1, byte2;
 
1703
  /* We only care about a very small subset of the possible prologue
 
1704
     sequences here.  Basically we look for:
 
1705
 
 
1706
     movm [d2,d3,a2,a3],sp (optional)
 
1707
     add <size>,sp (optional, and only for sizes which fit in an unsigned
 
1708
                    8 bit number)
 
1709
 
 
1710
     If we find anything else, we quit.  */
 
1711
 
 
1712
  /* Look for movm [regs],sp.  */
 
1713
  byte1 = bfd_get_8 (abfd, contents + addr);
 
1714
  byte2 = bfd_get_8 (abfd, contents + addr + 1);
 
1715
 
 
1716
  if (byte1 == 0xcf)
 
1717
    {
 
1718
      hash->movm_args = byte2;
 
1719
      addr += 2;
 
1720
      byte1 = bfd_get_8 (abfd, contents + addr);
 
1721
      byte2 = bfd_get_8 (abfd, contents + addr + 1);
 
1722
    }
 
1723
 
 
1724
  /* Now figure out how much stack space will be allocated by the movm
 
1725
     instruction.  We need this kept separate from the function's normal
 
1726
     stack space.  */
 
1727
  if (hash->movm_args)
 
1728
    {
 
1729
      /* Space for d2.  */
 
1730
      if (hash->movm_args & 0x80)
 
1731
        hash->movm_stack_size += 4;
 
1732
 
 
1733
      /* Space for d3.  */
 
1734
      if (hash->movm_args & 0x40)
 
1735
        hash->movm_stack_size += 4;
 
1736
 
 
1737
      /* Space for a2.  */
 
1738
      if (hash->movm_args & 0x20)
 
1739
        hash->movm_stack_size += 4;
 
1740
 
 
1741
      /* Space for a3.  */
 
1742
      if (hash->movm_args & 0x10)
 
1743
        hash->movm_stack_size += 4;
 
1744
 
 
1745
      /* "other" space.  d0, d1, a0, a1, mdr, lir, lar, 4 byte pad.  */
 
1746
      if (hash->movm_args & 0x08)
 
1747
        hash->movm_stack_size += 8 * 4;
 
1748
 
 
1749
      if (bfd_get_mach (abfd) == bfd_mach_am33
 
1750
          || bfd_get_mach (abfd) == bfd_mach_am33_2)
 
1751
        {
 
1752
          /* "exother" space.  e0, e1, mdrq, mcrh, mcrl, mcvf */
 
1753
          if (hash->movm_args & 0x1)
 
1754
            hash->movm_stack_size += 6 * 4;
 
1755
 
 
1756
          /* exreg1 space.  e4, e5, e6, e7 */
 
1757
          if (hash->movm_args & 0x2)
 
1758
            hash->movm_stack_size += 4 * 4;
 
1759
 
 
1760
          /* exreg0 space.  e2, e3  */
 
1761
          if (hash->movm_args & 0x4)
 
1762
            hash->movm_stack_size += 2 * 4;
 
1763
        }
 
1764
    }
 
1765
 
 
1766
  /* Now look for the two stack adjustment variants.  */
 
1767
  if (byte1 == 0xf8 && byte2 == 0xfe)
 
1768
    {
 
1769
      int temp = bfd_get_8 (abfd, contents + addr + 2);
 
1770
      temp = ((temp & 0xff) ^ (~0x7f)) + 0x80;
 
1771
 
 
1772
      hash->stack_size = -temp;
 
1773
    }
 
1774
  else if (byte1 == 0xfa && byte2 == 0xfe)
 
1775
    {
 
1776
      int temp = bfd_get_16 (abfd, contents + addr + 2);
 
1777
      temp = ((temp & 0xffff) ^ (~0x7fff)) + 0x8000;
 
1778
      temp = -temp;
 
1779
 
 
1780
      if (temp < 255)
 
1781
        hash->stack_size = temp;
 
1782
    }
 
1783
 
 
1784
  /* If the total stack to be allocated by the call instruction is more
 
1785
     than 255 bytes, then we can't remove the stack adjustment by using
 
1786
     "call" (we might still be able to remove the "movm" instruction.  */
 
1787
  if (hash->stack_size + hash->movm_stack_size > 255)
 
1788
    hash->stack_size = 0;
 
1789
}
 
1790
 
 
1791
/* Delete some bytes from a section while relaxing.  */
 
1792
 
 
1793
static bfd_boolean
 
1794
mn10300_elf_relax_delete_bytes (bfd *abfd,
 
1795
                                asection *sec,
 
1796
                                bfd_vma addr,
 
1797
                                int count)
 
1798
{
 
1799
  Elf_Internal_Shdr *symtab_hdr;
 
1800
  unsigned int sec_shndx;
 
1801
  bfd_byte *contents;
 
1802
  Elf_Internal_Rela *irel, *irelend;
 
1803
  Elf_Internal_Rela *irelalign;
 
1804
  bfd_vma toaddr;
 
1805
  Elf_Internal_Sym *isym, *isymend;
 
1806
  struct elf_link_hash_entry **sym_hashes;
 
1807
  struct elf_link_hash_entry **end_hashes;
 
1808
  unsigned int symcount;
 
1809
 
 
1810
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
 
1811
 
 
1812
  contents = elf_section_data (sec)->this_hdr.contents;
 
1813
 
 
1814
  irelalign = NULL;
 
1815
  toaddr = sec->size;
 
1816
 
 
1817
  irel = elf_section_data (sec)->relocs;
 
1818
  irelend = irel + sec->reloc_count;
 
1819
 
 
1820
  if (sec->reloc_count > 0)
 
1821
    {
 
1822
      /* If there is an align reloc at the end of the section ignore it.
 
1823
         GAS creates these relocs for reasons of its own, and they just
 
1824
         serve to keep the section artifically inflated.  */
 
1825
      if (ELF32_R_TYPE ((irelend - 1)->r_info) == (int) R_MN10300_ALIGN)
 
1826
        --irelend;
 
1827
      
 
1828
      /* The deletion must stop at the next ALIGN reloc for an aligment
 
1829
         power larger than, or not a multiple of, the number of bytes we
 
1830
         are deleting.  */
 
1831
      for (; irel < irelend; irel++)
 
1832
        {
 
1833
          int alignment = 1 << irel->r_addend;
 
1834
 
 
1835
          if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
 
1836
              && irel->r_offset > addr
 
1837
              && irel->r_offset < toaddr
 
1838
              && (count < alignment
 
1839
                  || alignment % count != 0))
 
1840
            {
 
1841
              irelalign = irel;
 
1842
              toaddr = irel->r_offset;
 
1843
              break;
 
1844
            }
 
1845
        }
 
1846
    }
 
1847
 
 
1848
  /* Actually delete the bytes.  */
 
1849
  memmove (contents + addr, contents + addr + count,
 
1850
           (size_t) (toaddr - addr - count));
 
1851
 
 
1852
  /* Adjust the section's size if we are shrinking it, or else
 
1853
     pad the bytes between the end of the shrunken region and
 
1854
     the start of the next region with NOP codes.  */
 
1855
  if (irelalign == NULL)
 
1856
    {
 
1857
      sec->size -= count;
 
1858
      /* Include symbols at the end of the section, but
 
1859
         not at the end of a sub-region of the section.  */
 
1860
      toaddr ++;
 
1861
    }
 
1862
  else
 
1863
    {
 
1864
      int i;
 
1865
 
 
1866
#define NOP_OPCODE 0xcb
 
1867
 
 
1868
      for (i = 0; i < count; i ++)
 
1869
        bfd_put_8 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i);
 
1870
    }
 
1871
 
 
1872
  /* Adjust all the relocs.  */
 
1873
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
 
1874
    {
 
1875
      /* Get the new reloc address.  */
 
1876
      if ((irel->r_offset > addr
 
1877
           && irel->r_offset < toaddr)
 
1878
          || (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
 
1879
              && irel->r_offset == toaddr))
 
1880
        irel->r_offset -= count;
 
1881
    }
 
1882
 
 
1883
  /* Adjust the local symbols in the section, reducing their value
 
1884
     by the number of bytes deleted.  Note - symbols within the deleted
 
1885
     region are moved to the address of the start of the region, which
 
1886
     actually means that they will address the byte beyond the end of
 
1887
     the region once the deletion has been completed.  */
 
1888
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
 
1889
  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
 
1890
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
 
1891
    {
 
1892
      if (isym->st_shndx == sec_shndx
 
1893
          && isym->st_value > addr
 
1894
          && isym->st_value < toaddr)
 
1895
        {
 
1896
          if (isym->st_value < addr + count)
 
1897
            isym->st_value = addr;
 
1898
          else
 
1899
            isym->st_value -= count;
 
1900
        }
 
1901
      /* Adjust the function symbol's size as well.  */
 
1902
      else if (isym->st_shndx == sec_shndx
 
1903
               && ELF_ST_TYPE (isym->st_info) == STT_FUNC
 
1904
               && isym->st_value + isym->st_size > addr
 
1905
               && isym->st_value + isym->st_size < toaddr)
 
1906
        isym->st_size -= count;
 
1907
    }
 
1908
 
 
1909
  /* Now adjust the global symbols defined in this section.  */
 
1910
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
 
1911
              - symtab_hdr->sh_info);
 
1912
  sym_hashes = elf_sym_hashes (abfd);
 
1913
  end_hashes = sym_hashes + symcount;
 
1914
  for (; sym_hashes < end_hashes; sym_hashes++)
 
1915
    {
 
1916
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
 
1917
 
 
1918
      if ((sym_hash->root.type == bfd_link_hash_defined
 
1919
           || sym_hash->root.type == bfd_link_hash_defweak)
 
1920
          && sym_hash->root.u.def.section == sec
 
1921
          && sym_hash->root.u.def.value > addr
 
1922
          && sym_hash->root.u.def.value < toaddr)
 
1923
        {
 
1924
          if (sym_hash->root.u.def.value < addr + count)
 
1925
            sym_hash->root.u.def.value = addr;
 
1926
          else
 
1927
            sym_hash->root.u.def.value -= count;
 
1928
        }
 
1929
      /* Adjust the function symbol's size as well.  */
 
1930
      else if (sym_hash->root.type == bfd_link_hash_defined
 
1931
               && sym_hash->root.u.def.section == sec
 
1932
               && sym_hash->type == STT_FUNC
 
1933
               && sym_hash->root.u.def.value + sym_hash->size > addr
 
1934
               && sym_hash->root.u.def.value + sym_hash->size < toaddr)
 
1935
        sym_hash->size -= count;
 
1936
    }
 
1937
 
 
1938
  /* See if we can move the ALIGN reloc forward.
 
1939
     We have adjusted r_offset for it already.  */
 
1940
  if (irelalign != NULL)
 
1941
    {
 
1942
      bfd_vma alignto, alignaddr;
 
1943
 
 
1944
      if ((int) irelalign->r_addend > 0)
 
1945
        {
 
1946
          /* This is the old address.  */
 
1947
          alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
 
1948
          /* This is where the align points to now.  */
 
1949
          alignaddr = BFD_ALIGN (irelalign->r_offset,
 
1950
                                 1 << irelalign->r_addend);
 
1951
          if (alignaddr < alignto)
 
1952
            /* Tail recursion.  */
 
1953
            return mn10300_elf_relax_delete_bytes (abfd, sec, alignaddr,
 
1954
                                                   (int) (alignto - alignaddr));
 
1955
        }
 
1956
    }
 
1957
 
 
1958
  return TRUE;
 
1959
}
 
1960
 
 
1961
/* Return TRUE if a symbol exists at the given address, else return
 
1962
   FALSE.  */
 
1963
 
 
1964
static bfd_boolean
 
1965
mn10300_elf_symbol_address_p (bfd *abfd,
 
1966
                              asection *sec,
 
1967
                              Elf_Internal_Sym *isym,
 
1968
                              bfd_vma addr)
 
1969
{
 
1970
  Elf_Internal_Shdr *symtab_hdr;
 
1971
  unsigned int sec_shndx;
 
1972
  Elf_Internal_Sym *isymend;
 
1973
  struct elf_link_hash_entry **sym_hashes;
 
1974
  struct elf_link_hash_entry **end_hashes;
 
1975
  unsigned int symcount;
 
1976
 
 
1977
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
 
1978
 
 
1979
  /* Examine all the symbols.  */
 
1980
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
 
1981
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
 
1982
    if (isym->st_shndx == sec_shndx
 
1983
        && isym->st_value == addr)
 
1984
      return TRUE;
 
1985
 
 
1986
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
 
1987
              - symtab_hdr->sh_info);
 
1988
  sym_hashes = elf_sym_hashes (abfd);
 
1989
  end_hashes = sym_hashes + symcount;
 
1990
  for (; sym_hashes < end_hashes; sym_hashes++)
 
1991
    {
 
1992
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
 
1993
 
 
1994
      if ((sym_hash->root.type == bfd_link_hash_defined
 
1995
           || sym_hash->root.type == bfd_link_hash_defweak)
 
1996
          && sym_hash->root.u.def.section == sec
 
1997
          && sym_hash->root.u.def.value == addr)
 
1998
        return TRUE;
 
1999
    }
 
2000
 
 
2001
  return FALSE;
 
2002
}
 
2003
 
 
2004
/* This function handles relaxing for the mn10300.
 
2005
 
 
2006
   There are quite a few relaxing opportunities available on the mn10300:
 
2007
 
 
2008
        * calls:32 -> calls:16                                     2 bytes
 
2009
        * call:32  -> call:16                                      2 bytes
 
2010
 
 
2011
        * call:32 -> calls:32                                      1 byte
 
2012
        * call:16 -> calls:16                                      1 byte
 
2013
                * These are done anytime using "calls" would result
 
2014
                in smaller code, or when necessary to preserve the
 
2015
                meaning of the program.
 
2016
 
 
2017
        * call:32                                                  varies
 
2018
        * call:16
 
2019
                * In some circumstances we can move instructions
 
2020
                from a function prologue into a "call" instruction.
 
2021
                This is only done if the resulting code is no larger
 
2022
                than the original code.
 
2023
 
 
2024
        * jmp:32 -> jmp:16                                         2 bytes
 
2025
        * jmp:16 -> bra:8                                          1 byte
 
2026
 
 
2027
                * If the previous instruction is a conditional branch
 
2028
                around the jump/bra, we may be able to reverse its condition
 
2029
                and change its target to the jump's target.  The jump/bra
 
2030
                can then be deleted.                               2 bytes
 
2031
 
 
2032
        * mov abs32 -> mov abs16                                   1 or 2 bytes
 
2033
 
 
2034
        * Most instructions which accept imm32 can relax to imm16  1 or 2 bytes
 
2035
        - Most instructions which accept imm16 can relax to imm8   1 or 2 bytes
 
2036
 
 
2037
        * Most instructions which accept d32 can relax to d16      1 or 2 bytes
 
2038
        - Most instructions which accept d16 can relax to d8       1 or 2 bytes
 
2039
 
 
2040
        We don't handle imm16->imm8 or d16->d8 as they're very rare
 
2041
        and somewhat more difficult to support.  */
 
2042
 
 
2043
static bfd_boolean
 
2044
mn10300_elf_relax_section (bfd *abfd,
 
2045
                           asection *sec,
 
2046
                           struct bfd_link_info *link_info,
 
2047
                           bfd_boolean *again)
 
2048
{
 
2049
  Elf_Internal_Shdr *symtab_hdr;
 
2050
  Elf_Internal_Rela *internal_relocs = NULL;
 
2051
  Elf_Internal_Rela *irel, *irelend;
 
2052
  bfd_byte *contents = NULL;
 
2053
  Elf_Internal_Sym *isymbuf = NULL;
 
2054
  struct elf32_mn10300_link_hash_table *hash_table;
 
2055
  asection *section = sec;
 
2056
  bfd_vma align_gap_adjustment;
 
2057
 
 
2058
  if (link_info->relocatable)
 
2059
    (*link_info->callbacks->einfo)
 
2060
      (_("%P%F: --relax and -r may not be used together\n"));
 
2061
 
 
2062
  /* Assume nothing changes.  */
 
2063
  *again = FALSE;
 
2064
 
 
2065
  /* We need a pointer to the mn10300 specific hash table.  */
 
2066
  hash_table = elf32_mn10300_hash_table (link_info);
 
2067
  if (hash_table == NULL)
 
2068
    return FALSE;
 
2069
 
 
2070
  /* Initialize fields in each hash table entry the first time through.  */
 
2071
  if ((hash_table->flags & MN10300_HASH_ENTRIES_INITIALIZED) == 0)
 
2072
    {
 
2073
      bfd *input_bfd;
 
2074
 
 
2075
      /* Iterate over all the input bfds.  */
 
2076
      for (input_bfd = link_info->input_bfds;
 
2077
           input_bfd != NULL;
 
2078
           input_bfd = input_bfd->link_next)
 
2079
        {
 
2080
          /* We're going to need all the symbols for each bfd.  */
 
2081
          symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
 
2082
          if (symtab_hdr->sh_info != 0)
 
2083
            {
 
2084
              isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
 
2085
              if (isymbuf == NULL)
 
2086
                isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
 
2087
                                                symtab_hdr->sh_info, 0,
 
2088
                                                NULL, NULL, NULL);
 
2089
              if (isymbuf == NULL)
 
2090
                goto error_return;
 
2091
            }
 
2092
 
 
2093
          /* Iterate over each section in this bfd.  */
 
2094
          for (section = input_bfd->sections;
 
2095
               section != NULL;
 
2096
               section = section->next)
 
2097
            {
 
2098
              struct elf32_mn10300_link_hash_entry *hash;
 
2099
              asection *sym_sec = NULL;
 
2100
              const char *sym_name;
 
2101
              char *new_name;
 
2102
 
 
2103
              /* If there's nothing to do in this section, skip it.  */
 
2104
              if (! ((section->flags & SEC_RELOC) != 0
 
2105
                     && section->reloc_count != 0))
 
2106
                continue;
 
2107
              if ((section->flags & SEC_ALLOC) == 0)
 
2108
                continue;
 
2109
 
 
2110
              /* Get cached copy of section contents if it exists.  */
 
2111
              if (elf_section_data (section)->this_hdr.contents != NULL)
 
2112
                contents = elf_section_data (section)->this_hdr.contents;
 
2113
              else if (section->size != 0)
 
2114
                {
 
2115
                  /* Go get them off disk.  */
 
2116
                  if (!bfd_malloc_and_get_section (input_bfd, section,
 
2117
                                                   &contents))
 
2118
                    goto error_return;
 
2119
                }
 
2120
              else
 
2121
                contents = NULL;
 
2122
 
 
2123
              /* If there aren't any relocs, then there's nothing to do.  */
 
2124
              if ((section->flags & SEC_RELOC) != 0
 
2125
                  && section->reloc_count != 0)
 
2126
                {
 
2127
                  /* Get a copy of the native relocations.  */
 
2128
                  internal_relocs = _bfd_elf_link_read_relocs (input_bfd, section,
 
2129
                                                               NULL, NULL,
 
2130
                                                               link_info->keep_memory);
 
2131
                  if (internal_relocs == NULL)
 
2132
                    goto error_return;
 
2133
 
 
2134
                  /* Now examine each relocation.  */
 
2135
                  irel = internal_relocs;
 
2136
                  irelend = irel + section->reloc_count;
 
2137
                  for (; irel < irelend; irel++)
 
2138
                    {
 
2139
                      long r_type;
 
2140
                      unsigned long r_index;
 
2141
                      unsigned char code;
 
2142
 
 
2143
                      r_type = ELF32_R_TYPE (irel->r_info);
 
2144
                      r_index = ELF32_R_SYM (irel->r_info);
 
2145
 
 
2146
                      if (r_type < 0 || r_type >= (int) R_MN10300_MAX)
 
2147
                        goto error_return;
 
2148
 
 
2149
                      /* We need the name and hash table entry of the target
 
2150
                         symbol!  */
 
2151
                      hash = NULL;
 
2152
                      sym_sec = NULL;
 
2153
 
 
2154
                      if (r_index < symtab_hdr->sh_info)
 
2155
                        {
 
2156
                          /* A local symbol.  */
 
2157
                          Elf_Internal_Sym *isym;
 
2158
                          struct elf_link_hash_table *elftab;
 
2159
                          bfd_size_type amt;
 
2160
 
 
2161
                          isym = isymbuf + r_index;
 
2162
                          if (isym->st_shndx == SHN_UNDEF)
 
2163
                            sym_sec = bfd_und_section_ptr;
 
2164
                          else if (isym->st_shndx == SHN_ABS)
 
2165
                            sym_sec = bfd_abs_section_ptr;
 
2166
                          else if (isym->st_shndx == SHN_COMMON)
 
2167
                            sym_sec = bfd_com_section_ptr;
 
2168
                          else
 
2169
                            sym_sec
 
2170
                              = bfd_section_from_elf_index (input_bfd,
 
2171
                                                            isym->st_shndx);
 
2172
 
 
2173
                          sym_name
 
2174
                            = bfd_elf_string_from_elf_section (input_bfd,
 
2175
                                                               (symtab_hdr
 
2176
                                                                ->sh_link),
 
2177
                                                               isym->st_name);
 
2178
 
 
2179
                          /* If it isn't a function, then we don't care
 
2180
                             about it.  */
 
2181
                          if (ELF_ST_TYPE (isym->st_info) != STT_FUNC)
 
2182
                            continue;
 
2183
 
 
2184
                          /* Tack on an ID so we can uniquely identify this
 
2185
                             local symbol in the global hash table.  */
 
2186
                          amt = strlen (sym_name) + 10;
 
2187
                          new_name = bfd_malloc (amt);
 
2188
                          if (new_name == NULL)
 
2189
                            goto error_return;
 
2190
 
 
2191
                          sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
 
2192
                          sym_name = new_name;
 
2193
 
 
2194
                          elftab = &hash_table->static_hash_table->root;
 
2195
                          hash = ((struct elf32_mn10300_link_hash_entry *)
 
2196
                                  elf_link_hash_lookup (elftab, sym_name,
 
2197
                                                        TRUE, TRUE, FALSE));
 
2198
                          free (new_name);
 
2199
                        }
 
2200
                      else
 
2201
                        {
 
2202
                          r_index -= symtab_hdr->sh_info;
 
2203
                          hash = (struct elf32_mn10300_link_hash_entry *)
 
2204
                                   elf_sym_hashes (input_bfd)[r_index];
 
2205
                        }
 
2206
 
 
2207
                      sym_name = hash->root.root.root.string;
 
2208
                      if ((section->flags & SEC_CODE) != 0)
 
2209
                        {
 
2210
                          /* If this is not a "call" instruction, then we
 
2211
                             should convert "call" instructions to "calls"
 
2212
                             instructions.  */
 
2213
                          code = bfd_get_8 (input_bfd,
 
2214
                                            contents + irel->r_offset - 1);
 
2215
                          if (code != 0xdd && code != 0xcd)
 
2216
                            hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
 
2217
                        }
 
2218
 
 
2219
                      /* If this is a jump/call, then bump the
 
2220
                         direct_calls counter.  Else force "call" to
 
2221
                         "calls" conversions.  */
 
2222
                      if (r_type == R_MN10300_PCREL32
 
2223
                          || r_type == R_MN10300_PLT32
 
2224
                          || r_type == R_MN10300_PLT16
 
2225
                          || r_type == R_MN10300_PCREL16)
 
2226
                        hash->direct_calls++;
 
2227
                      else
 
2228
                        hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
 
2229
                    }
 
2230
                }
 
2231
 
 
2232
              /* Now look at the actual contents to get the stack size,
 
2233
                 and a list of what registers were saved in the prologue
 
2234
                 (ie movm_args).  */
 
2235
              if ((section->flags & SEC_CODE) != 0)
 
2236
                {
 
2237
                  Elf_Internal_Sym *isym, *isymend;
 
2238
                  unsigned int sec_shndx;
 
2239
                  struct elf_link_hash_entry **hashes;
 
2240
                  struct elf_link_hash_entry **end_hashes;
 
2241
                  unsigned int symcount;
 
2242
 
 
2243
                  sec_shndx = _bfd_elf_section_from_bfd_section (input_bfd,
 
2244
                                                                 section);
 
2245
 
 
2246
                  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
 
2247
                              - symtab_hdr->sh_info);
 
2248
                  hashes = elf_sym_hashes (input_bfd);
 
2249
                  end_hashes = hashes + symcount;
 
2250
 
 
2251
                  /* Look at each function defined in this section and
 
2252
                     update info for that function.  */
 
2253
                  isymend = isymbuf + symtab_hdr->sh_info;
 
2254
                  for (isym = isymbuf; isym < isymend; isym++)
 
2255
                    {
 
2256
                      if (isym->st_shndx == sec_shndx
 
2257
                          && ELF_ST_TYPE (isym->st_info) == STT_FUNC)
 
2258
                        {
 
2259
                          struct elf_link_hash_table *elftab;
 
2260
                          bfd_size_type amt;
 
2261
                          struct elf_link_hash_entry **lhashes = hashes;
 
2262
 
 
2263
                          /* Skip a local symbol if it aliases a
 
2264
                             global one.  */
 
2265
                          for (; lhashes < end_hashes; lhashes++)
 
2266
                            {
 
2267
                              hash = (struct elf32_mn10300_link_hash_entry *) *lhashes;
 
2268
                              if ((hash->root.root.type == bfd_link_hash_defined
 
2269
                                   || hash->root.root.type == bfd_link_hash_defweak)
 
2270
                                  && hash->root.root.u.def.section == section
 
2271
                                  && hash->root.type == STT_FUNC
 
2272
                                  && hash->root.root.u.def.value == isym->st_value)
 
2273
                                break;
 
2274
                            }
 
2275
                          if (lhashes != end_hashes)
 
2276
                            continue;
 
2277
 
 
2278
                          if (isym->st_shndx == SHN_UNDEF)
 
2279
                            sym_sec = bfd_und_section_ptr;
 
2280
                          else if (isym->st_shndx == SHN_ABS)
 
2281
                            sym_sec = bfd_abs_section_ptr;
 
2282
                          else if (isym->st_shndx == SHN_COMMON)
 
2283
                            sym_sec = bfd_com_section_ptr;
 
2284
                          else
 
2285
                            sym_sec
 
2286
                              = bfd_section_from_elf_index (input_bfd,
 
2287
                                                            isym->st_shndx);
 
2288
 
 
2289
                          sym_name = (bfd_elf_string_from_elf_section
 
2290
                                      (input_bfd, symtab_hdr->sh_link,
 
2291
                                       isym->st_name));
 
2292
 
 
2293
                          /* Tack on an ID so we can uniquely identify this
 
2294
                             local symbol in the global hash table.  */
 
2295
                          amt = strlen (sym_name) + 10;
 
2296
                          new_name = bfd_malloc (amt);
 
2297
                          if (new_name == NULL)
 
2298
                            goto error_return;
 
2299
 
 
2300
                          sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
 
2301
                          sym_name = new_name;
 
2302
 
 
2303
                          elftab = &hash_table->static_hash_table->root;
 
2304
                          hash = ((struct elf32_mn10300_link_hash_entry *)
 
2305
                                  elf_link_hash_lookup (elftab, sym_name,
 
2306
                                                        TRUE, TRUE, FALSE));
 
2307
                          free (new_name);
 
2308
                          compute_function_info (input_bfd, hash,
 
2309
                                                 isym->st_value, contents);
 
2310
                          hash->value = isym->st_value;
 
2311
                        }
 
2312
                    }
 
2313
 
 
2314
                  for (; hashes < end_hashes; hashes++)
 
2315
                    {
 
2316
                      hash = (struct elf32_mn10300_link_hash_entry *) *hashes;
 
2317
                      if ((hash->root.root.type == bfd_link_hash_defined
 
2318
                           || hash->root.root.type == bfd_link_hash_defweak)
 
2319
                          && hash->root.root.u.def.section == section
 
2320
                          && hash->root.type == STT_FUNC)
 
2321
                        compute_function_info (input_bfd, hash,
 
2322
                                               (hash)->root.root.u.def.value,
 
2323
                                               contents);
 
2324
                    }
 
2325
                }
 
2326
 
 
2327
              /* Cache or free any memory we allocated for the relocs.  */
 
2328
              if (internal_relocs != NULL
 
2329
                  && elf_section_data (section)->relocs != internal_relocs)
 
2330
                free (internal_relocs);
 
2331
              internal_relocs = NULL;
 
2332
 
 
2333
              /* Cache or free any memory we allocated for the contents.  */
 
2334
              if (contents != NULL
 
2335
                  && elf_section_data (section)->this_hdr.contents != contents)
 
2336
                {
 
2337
                  if (! link_info->keep_memory)
 
2338
                    free (contents);
 
2339
                  else
 
2340
                    {
 
2341
                      /* Cache the section contents for elf_link_input_bfd.  */
 
2342
                      elf_section_data (section)->this_hdr.contents = contents;
 
2343
                    }
 
2344
                }
 
2345
              contents = NULL;
 
2346
            }
 
2347
 
 
2348
          /* Cache or free any memory we allocated for the symbols.  */
 
2349
          if (isymbuf != NULL
 
2350
              && symtab_hdr->contents != (unsigned char *) isymbuf)
 
2351
            {
 
2352
              if (! link_info->keep_memory)
 
2353
                free (isymbuf);
 
2354
              else
 
2355
                {
 
2356
                  /* Cache the symbols for elf_link_input_bfd.  */
 
2357
                  symtab_hdr->contents = (unsigned char *) isymbuf;
 
2358
                }
 
2359
            }
 
2360
          isymbuf = NULL;
 
2361
        }
 
2362
 
 
2363
      /* Now iterate on each symbol in the hash table and perform
 
2364
         the final initialization steps on each.  */
 
2365
      elf32_mn10300_link_hash_traverse (hash_table,
 
2366
                                        elf32_mn10300_finish_hash_table_entry,
 
2367
                                        link_info);
 
2368
      elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
 
2369
                                        elf32_mn10300_finish_hash_table_entry,
 
2370
                                        link_info);
 
2371
 
 
2372
      {
 
2373
        /* This section of code collects all our local symbols, sorts
 
2374
           them by value, and looks for multiple symbols referring to
 
2375
           the same address.  For those symbols, the flags are merged.
 
2376
           At this point, the only flag that can be set is
 
2377
           MN10300_CONVERT_CALL_TO_CALLS, so we simply OR the flags
 
2378
           together.  */
 
2379
        int static_count = 0, i;
 
2380
        struct elf32_mn10300_link_hash_entry **entries;
 
2381
        struct elf32_mn10300_link_hash_entry **ptr;
 
2382
 
 
2383
        elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
 
2384
                                          elf32_mn10300_count_hash_table_entries,
 
2385
                                          &static_count);
 
2386
 
 
2387
        entries = bfd_malloc (static_count * sizeof (* ptr));
 
2388
 
 
2389
        ptr = entries;
 
2390
        elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
 
2391
                                          elf32_mn10300_list_hash_table_entries,
 
2392
                                          & ptr);
 
2393
 
 
2394
        qsort (entries, static_count, sizeof (entries[0]), sort_by_value);
 
2395
 
 
2396
        for (i = 0; i < static_count - 1; i++)
 
2397
          if (entries[i]->value && entries[i]->value == entries[i+1]->value)
 
2398
            {
 
2399
              int v = entries[i]->flags;
 
2400
              int j;
 
2401
 
 
2402
              for (j = i + 1; j < static_count && entries[j]->value == entries[i]->value; j++)
 
2403
                v |= entries[j]->flags;
 
2404
 
 
2405
              for (j = i; j < static_count && entries[j]->value == entries[i]->value; j++)
 
2406
                entries[j]->flags = v;
 
2407
 
 
2408
              i = j - 1;
 
2409
            }
 
2410
      }
 
2411
 
 
2412
      /* All entries in the hash table are fully initialized.  */
 
2413
      hash_table->flags |= MN10300_HASH_ENTRIES_INITIALIZED;
 
2414
 
 
2415
      /* Now that everything has been initialized, go through each
 
2416
         code section and delete any prologue insns which will be
 
2417
         redundant because their operations will be performed by
 
2418
         a "call" instruction.  */
 
2419
      for (input_bfd = link_info->input_bfds;
 
2420
           input_bfd != NULL;
 
2421
           input_bfd = input_bfd->link_next)
 
2422
        {
 
2423
          /* We're going to need all the local symbols for each bfd.  */
 
2424
          symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
 
2425
          if (symtab_hdr->sh_info != 0)
 
2426
            {
 
2427
              isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
 
2428
              if (isymbuf == NULL)
 
2429
                isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
 
2430
                                                symtab_hdr->sh_info, 0,
 
2431
                                                NULL, NULL, NULL);
 
2432
              if (isymbuf == NULL)
 
2433
                goto error_return;
 
2434
            }
 
2435
 
 
2436
          /* Walk over each section in this bfd.  */
 
2437
          for (section = input_bfd->sections;
 
2438
               section != NULL;
 
2439
               section = section->next)
 
2440
            {
 
2441
              unsigned int sec_shndx;
 
2442
              Elf_Internal_Sym *isym, *isymend;
 
2443
              struct elf_link_hash_entry **hashes;
 
2444
              struct elf_link_hash_entry **end_hashes;
 
2445
              unsigned int symcount;
 
2446
 
 
2447
              /* Skip non-code sections and empty sections.  */
 
2448
              if ((section->flags & SEC_CODE) == 0 || section->size == 0)
 
2449
                continue;
 
2450
 
 
2451
              if (section->reloc_count != 0)
 
2452
                {
 
2453
                  /* Get a copy of the native relocations.  */
 
2454
                  internal_relocs = _bfd_elf_link_read_relocs (input_bfd, section,
 
2455
                                                               NULL, NULL,
 
2456
                                                               link_info->keep_memory);
 
2457
                  if (internal_relocs == NULL)
 
2458
                    goto error_return;
 
2459
                }
 
2460
 
 
2461
              /* Get cached copy of section contents if it exists.  */
 
2462
              if (elf_section_data (section)->this_hdr.contents != NULL)
 
2463
                contents = elf_section_data (section)->this_hdr.contents;
 
2464
              else
 
2465
                {
 
2466
                  /* Go get them off disk.  */
 
2467
                  if (!bfd_malloc_and_get_section (input_bfd, section,
 
2468
                                                   &contents))
 
2469
                    goto error_return;
 
2470
                }
 
2471
 
 
2472
              sec_shndx = _bfd_elf_section_from_bfd_section (input_bfd,
 
2473
                                                             section);
 
2474
 
 
2475
              /* Now look for any function in this section which needs
 
2476
                 insns deleted from its prologue.  */
 
2477
              isymend = isymbuf + symtab_hdr->sh_info;
 
2478
              for (isym = isymbuf; isym < isymend; isym++)
 
2479
                {
 
2480
                  struct elf32_mn10300_link_hash_entry *sym_hash;
 
2481
                  asection *sym_sec = NULL;
 
2482
                  const char *sym_name;
 
2483
                  char *new_name;
 
2484
                  struct elf_link_hash_table *elftab;
 
2485
                  bfd_size_type amt;
 
2486
 
 
2487
                  if (isym->st_shndx != sec_shndx)
 
2488
                    continue;
 
2489
 
 
2490
                  if (isym->st_shndx == SHN_UNDEF)
 
2491
                    sym_sec = bfd_und_section_ptr;
 
2492
                  else if (isym->st_shndx == SHN_ABS)
 
2493
                    sym_sec = bfd_abs_section_ptr;
 
2494
                  else if (isym->st_shndx == SHN_COMMON)
 
2495
                    sym_sec = bfd_com_section_ptr;
 
2496
                  else
 
2497
                    sym_sec
 
2498
                      = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
 
2499
 
 
2500
                  sym_name
 
2501
                    = bfd_elf_string_from_elf_section (input_bfd,
 
2502
                                                       symtab_hdr->sh_link,
 
2503
                                                       isym->st_name);
 
2504
 
 
2505
                  /* Tack on an ID so we can uniquely identify this
 
2506
                     local symbol in the global hash table.  */
 
2507
                  amt = strlen (sym_name) + 10;
 
2508
                  new_name = bfd_malloc (amt);
 
2509
                  if (new_name == NULL)
 
2510
                    goto error_return;
 
2511
                  sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
 
2512
                  sym_name = new_name;
 
2513
 
 
2514
                  elftab = & hash_table->static_hash_table->root;
 
2515
                  sym_hash = (struct elf32_mn10300_link_hash_entry *)
 
2516
                    elf_link_hash_lookup (elftab, sym_name,
 
2517
                                          FALSE, FALSE, FALSE);
 
2518
 
 
2519
                  free (new_name);
 
2520
                  if (sym_hash == NULL)
 
2521
                    continue;
 
2522
 
 
2523
                  if (! (sym_hash->flags & MN10300_CONVERT_CALL_TO_CALLS)
 
2524
                      && ! (sym_hash->flags & MN10300_DELETED_PROLOGUE_BYTES))
 
2525
                    {
 
2526
                      int bytes = 0;
 
2527
 
 
2528
                      /* Note that we've changed things.  */
 
2529
                      elf_section_data (section)->relocs = internal_relocs;
 
2530
                      elf_section_data (section)->this_hdr.contents = contents;
 
2531
                      symtab_hdr->contents = (unsigned char *) isymbuf;
 
2532
 
 
2533
                      /* Count how many bytes we're going to delete.  */
 
2534
                      if (sym_hash->movm_args)
 
2535
                        bytes += 2;
 
2536
 
 
2537
                      if (sym_hash->stack_size > 0)
 
2538
                        {
 
2539
                          if (sym_hash->stack_size <= 128)
 
2540
                            bytes += 3;
 
2541
                          else
 
2542
                            bytes += 4;
 
2543
                        }
 
2544
 
 
2545
                      /* Note that we've deleted prologue bytes for this
 
2546
                         function.  */
 
2547
                      sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
 
2548
 
 
2549
                      /* Actually delete the bytes.  */
 
2550
                      if (!mn10300_elf_relax_delete_bytes (input_bfd,
 
2551
                                                           section,
 
2552
                                                           isym->st_value,
 
2553
                                                           bytes))
 
2554
                        goto error_return;
 
2555
 
 
2556
                      /* Something changed.  Not strictly necessary, but
 
2557
                         may lead to more relaxing opportunities.  */
 
2558
                      *again = TRUE;
 
2559
                    }
 
2560
                }
 
2561
 
 
2562
              /* Look for any global functions in this section which
 
2563
                 need insns deleted from their prologues.  */
 
2564
              symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
 
2565
                          - symtab_hdr->sh_info);
 
2566
              hashes = elf_sym_hashes (input_bfd);
 
2567
              end_hashes = hashes + symcount;
 
2568
              for (; hashes < end_hashes; hashes++)
 
2569
                {
 
2570
                  struct elf32_mn10300_link_hash_entry *sym_hash;
 
2571
 
 
2572
                  sym_hash = (struct elf32_mn10300_link_hash_entry *) *hashes;
 
2573
                  if ((sym_hash->root.root.type == bfd_link_hash_defined
 
2574
                       || sym_hash->root.root.type == bfd_link_hash_defweak)
 
2575
                      && sym_hash->root.root.u.def.section == section
 
2576
                      && ! (sym_hash->flags & MN10300_CONVERT_CALL_TO_CALLS)
 
2577
                      && ! (sym_hash->flags & MN10300_DELETED_PROLOGUE_BYTES))
 
2578
                    {
 
2579
                      int bytes = 0;
 
2580
                      bfd_vma symval;
 
2581
 
 
2582
                      /* Note that we've changed things.  */
 
2583
                      elf_section_data (section)->relocs = internal_relocs;
 
2584
                      elf_section_data (section)->this_hdr.contents = contents;
 
2585
                      symtab_hdr->contents = (unsigned char *) isymbuf;
 
2586
 
 
2587
                      /* Count how many bytes we're going to delete.  */
 
2588
                      if (sym_hash->movm_args)
 
2589
                        bytes += 2;
 
2590
 
 
2591
                      if (sym_hash->stack_size > 0)
 
2592
                        {
 
2593
                          if (sym_hash->stack_size <= 128)
 
2594
                            bytes += 3;
 
2595
                          else
 
2596
                            bytes += 4;
 
2597
                        }
 
2598
 
 
2599
                      /* Note that we've deleted prologue bytes for this
 
2600
                         function.  */
 
2601
                      sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
 
2602
 
 
2603
                      /* Actually delete the bytes.  */
 
2604
                      symval = sym_hash->root.root.u.def.value;
 
2605
                      if (!mn10300_elf_relax_delete_bytes (input_bfd,
 
2606
                                                           section,
 
2607
                                                           symval,
 
2608
                                                           bytes))
 
2609
                        goto error_return;
 
2610
 
 
2611
                      /* Something changed.  Not strictly necessary, but
 
2612
                         may lead to more relaxing opportunities.  */
 
2613
                      *again = TRUE;
 
2614
                    }
 
2615
                }
 
2616
 
 
2617
              /* Cache or free any memory we allocated for the relocs.  */
 
2618
              if (internal_relocs != NULL
 
2619
                  && elf_section_data (section)->relocs != internal_relocs)
 
2620
                free (internal_relocs);
 
2621
              internal_relocs = NULL;
 
2622
 
 
2623
              /* Cache or free any memory we allocated for the contents.  */
 
2624
              if (contents != NULL
 
2625
                  && elf_section_data (section)->this_hdr.contents != contents)
 
2626
                {
 
2627
                  if (! link_info->keep_memory)
 
2628
                    free (contents);
 
2629
                  else
 
2630
                    /* Cache the section contents for elf_link_input_bfd.  */
 
2631
                    elf_section_data (section)->this_hdr.contents = contents;
 
2632
                }
 
2633
              contents = NULL;
 
2634
            }
 
2635
 
 
2636
          /* Cache or free any memory we allocated for the symbols.  */
 
2637
          if (isymbuf != NULL
 
2638
              && symtab_hdr->contents != (unsigned char *) isymbuf)
 
2639
            {
 
2640
              if (! link_info->keep_memory)
 
2641
                free (isymbuf);
 
2642
              else
 
2643
                /* Cache the symbols for elf_link_input_bfd.  */
 
2644
                symtab_hdr->contents = (unsigned char *) isymbuf;
 
2645
            }
 
2646
          isymbuf = NULL;
 
2647
        }
 
2648
    }
 
2649
 
 
2650
  /* (Re)initialize for the basic instruction shortening/relaxing pass.  */
 
2651
  contents = NULL;
 
2652
  internal_relocs = NULL;
 
2653
  isymbuf = NULL;
 
2654
  /* For error_return.  */
 
2655
  section = sec;
 
2656
 
 
2657
  /* We don't have to do anything for a relocatable link, if
 
2658
     this section does not have relocs, or if this is not a
 
2659
     code section.  */
 
2660
  if (link_info->relocatable
 
2661
      || (sec->flags & SEC_RELOC) == 0
 
2662
      || sec->reloc_count == 0
 
2663
      || (sec->flags & SEC_CODE) == 0)
 
2664
    return TRUE;
 
2665
 
 
2666
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
 
2667
 
 
2668
  /* Get a copy of the native relocations.  */
 
2669
  internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
 
2670
                                               link_info->keep_memory);
 
2671
  if (internal_relocs == NULL)
 
2672
    goto error_return;
 
2673
 
 
2674
  /* Scan for worst case alignment gap changes.  Note that this logic
 
2675
     is not ideal; what we should do is run this scan for every
 
2676
     opcode/address range and adjust accordingly, but that's
 
2677
     expensive.  Worst case is that for an alignment of N bytes, we
 
2678
     move by 2*N-N-1 bytes, assuming we have aligns of 1, 2, 4, 8, etc
 
2679
     all before it.  Plus, this still doesn't cover cross-section
 
2680
     jumps with section alignment.  */
 
2681
  irelend = internal_relocs + sec->reloc_count;
 
2682
  align_gap_adjustment = 0;
 
2683
  for (irel = internal_relocs; irel < irelend; irel++)
 
2684
    {
 
2685
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN)
 
2686
        {
 
2687
          bfd_vma adj = 1 << irel->r_addend;
 
2688
          bfd_vma aend = irel->r_offset;
 
2689
 
 
2690
          aend = BFD_ALIGN (aend, 1 << irel->r_addend);
 
2691
          adj = 2 * adj - adj - 1;
 
2692
 
 
2693
          /* Record the biggest adjustmnet.  Skip any alignment at the
 
2694
             end of our section.  */
 
2695
          if (align_gap_adjustment < adj
 
2696
              && aend < sec->output_section->vma + sec->output_offset + sec->size)
 
2697
            align_gap_adjustment = adj;
 
2698
        }
 
2699
    }
 
2700
 
 
2701
  /* Walk through them looking for relaxing opportunities.  */
 
2702
  irelend = internal_relocs + sec->reloc_count;
 
2703
  for (irel = internal_relocs; irel < irelend; irel++)
 
2704
    {
 
2705
      bfd_vma symval;
 
2706
      bfd_signed_vma jump_offset;
 
2707
      asection *sym_sec = NULL;
 
2708
      struct elf32_mn10300_link_hash_entry *h = NULL;
 
2709
 
 
2710
      /* If this isn't something that can be relaxed, then ignore
 
2711
         this reloc.  */
 
2712
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_NONE
 
2713
          || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_8
 
2714
          || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_MAX)
 
2715
        continue;
 
2716
 
 
2717
      /* Get the section contents if we haven't done so already.  */
 
2718
      if (contents == NULL)
 
2719
        {
 
2720
          /* Get cached copy if it exists.  */
 
2721
          if (elf_section_data (sec)->this_hdr.contents != NULL)
 
2722
            contents = elf_section_data (sec)->this_hdr.contents;
 
2723
          else
 
2724
            {
 
2725
              /* Go get them off disk.  */
 
2726
              if (!bfd_malloc_and_get_section (abfd, sec, &contents))
 
2727
                goto error_return;
 
2728
            }
 
2729
        }
 
2730
 
 
2731
      /* Read this BFD's symbols if we haven't done so already.  */
 
2732
      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
 
2733
        {
 
2734
          isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
 
2735
          if (isymbuf == NULL)
 
2736
            isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
 
2737
                                            symtab_hdr->sh_info, 0,
 
2738
                                            NULL, NULL, NULL);
 
2739
          if (isymbuf == NULL)
 
2740
            goto error_return;
 
2741
        }
 
2742
 
 
2743
      /* Get the value of the symbol referred to by the reloc.  */
 
2744
      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
 
2745
        {
 
2746
          Elf_Internal_Sym *isym;
 
2747
          const char *sym_name;
 
2748
          char *new_name;
 
2749
 
 
2750
          /* A local symbol.  */
 
2751
          isym = isymbuf + ELF32_R_SYM (irel->r_info);
 
2752
          if (isym->st_shndx == SHN_UNDEF)
 
2753
            sym_sec = bfd_und_section_ptr;
 
2754
          else if (isym->st_shndx == SHN_ABS)
 
2755
            sym_sec = bfd_abs_section_ptr;
 
2756
          else if (isym->st_shndx == SHN_COMMON)
 
2757
            sym_sec = bfd_com_section_ptr;
 
2758
          else
 
2759
            sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
 
2760
 
 
2761
          sym_name = bfd_elf_string_from_elf_section (abfd,
 
2762
                                                      symtab_hdr->sh_link,
 
2763
                                                      isym->st_name);
 
2764
 
 
2765
          if ((sym_sec->flags & SEC_MERGE)
 
2766
              && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
 
2767
            {
 
2768
              symval = isym->st_value;
 
2769
 
 
2770
              /* GAS may reduce relocations against symbols in SEC_MERGE
 
2771
                 sections to a relocation against the section symbol when
 
2772
                 the original addend was zero.  When the reloc is against
 
2773
                 a section symbol we should include the addend in the
 
2774
                 offset passed to _bfd_merged_section_offset, since the
 
2775
                 location of interest is the original symbol.  On the
 
2776
                 other hand, an access to "sym+addend" where "sym" is not
 
2777
                 a section symbol should not include the addend;  Such an
 
2778
                 access is presumed to be an offset from "sym";  The
 
2779
                 location of interest is just "sym".  */
 
2780
              if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
 
2781
                symval += irel->r_addend;
 
2782
 
 
2783
              symval = _bfd_merged_section_offset (abfd, & sym_sec,
 
2784
                                                   elf_section_data (sym_sec)->sec_info,
 
2785
                                                   symval);
 
2786
 
 
2787
              if (ELF_ST_TYPE (isym->st_info) != STT_SECTION)
 
2788
                symval += irel->r_addend;
 
2789
 
 
2790
              symval += sym_sec->output_section->vma
 
2791
                + sym_sec->output_offset - irel->r_addend;
 
2792
            }
 
2793
          else
 
2794
            symval = (isym->st_value
 
2795
                      + sym_sec->output_section->vma
 
2796
                      + sym_sec->output_offset);
 
2797
 
 
2798
          /* Tack on an ID so we can uniquely identify this
 
2799
             local symbol in the global hash table.  */
 
2800
          new_name = bfd_malloc ((bfd_size_type) strlen (sym_name) + 10);
 
2801
          if (new_name == NULL)
 
2802
            goto error_return;
 
2803
          sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
 
2804
          sym_name = new_name;
 
2805
 
 
2806
          h = (struct elf32_mn10300_link_hash_entry *)
 
2807
                elf_link_hash_lookup (&hash_table->static_hash_table->root,
 
2808
                                      sym_name, FALSE, FALSE, FALSE);
 
2809
          free (new_name);
 
2810
        }
 
2811
      else
 
2812
        {
 
2813
          unsigned long indx;
 
2814
 
 
2815
          /* An external symbol.  */
 
2816
          indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
 
2817
          h = (struct elf32_mn10300_link_hash_entry *)
 
2818
                (elf_sym_hashes (abfd)[indx]);
 
2819
          BFD_ASSERT (h != NULL);
 
2820
          if (h->root.root.type != bfd_link_hash_defined
 
2821
              && h->root.root.type != bfd_link_hash_defweak)
 
2822
            /* This appears to be a reference to an undefined
 
2823
               symbol.  Just ignore it--it will be caught by the
 
2824
               regular reloc processing.  */
 
2825
            continue;
 
2826
 
 
2827
          /* Check for a reference to a discarded symbol and ignore it.  */
 
2828
          if (h->root.root.u.def.section->output_section == NULL)
 
2829
            continue;
 
2830
 
 
2831
          sym_sec = h->root.root.u.def.section->output_section;
 
2832
 
 
2833
          symval = (h->root.root.u.def.value
 
2834
                    + h->root.root.u.def.section->output_section->vma
 
2835
                    + h->root.root.u.def.section->output_offset);
 
2836
        }
 
2837
 
 
2838
      /* For simplicity of coding, we are going to modify the section
 
2839
         contents, the section relocs, and the BFD symbol table.  We
 
2840
         must tell the rest of the code not to free up this
 
2841
         information.  It would be possible to instead create a table
 
2842
         of changes which have to be made, as is done in coff-mips.c;
 
2843
         that would be more work, but would require less memory when
 
2844
         the linker is run.  */
 
2845
 
 
2846
      /* Try to turn a 32bit pc-relative branch/call into a 16bit pc-relative
 
2847
         branch/call, also deal with "call" -> "calls" conversions and
 
2848
         insertion of prologue data into "call" instructions.  */
 
2849
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL32
 
2850
          || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PLT32)
 
2851
        {
 
2852
          bfd_vma value = symval;
 
2853
 
 
2854
          if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PLT32
 
2855
              && h != NULL
 
2856
              && ELF_ST_VISIBILITY (h->root.other) != STV_INTERNAL
 
2857
              && ELF_ST_VISIBILITY (h->root.other) != STV_HIDDEN
 
2858
              && h->root.plt.offset != (bfd_vma) -1)
 
2859
            {
 
2860
              asection * splt;
 
2861
 
 
2862
              splt = bfd_get_section_by_name (elf_hash_table (link_info)
 
2863
                                              ->dynobj, ".plt");
 
2864
 
 
2865
              value = ((splt->output_section->vma
 
2866
                        + splt->output_offset
 
2867
                        + h->root.plt.offset)
 
2868
                       - (sec->output_section->vma
 
2869
                          + sec->output_offset
 
2870
                          + irel->r_offset));
 
2871
            }
 
2872
 
 
2873
          /* If we've got a "call" instruction that needs to be turned
 
2874
             into a "calls" instruction, do so now.  It saves a byte.  */
 
2875
          if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
 
2876
            {
 
2877
              unsigned char code;
 
2878
 
 
2879
              /* Get the opcode.  */
 
2880
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
2881
 
 
2882
              /* Make sure we're working with a "call" instruction!  */
 
2883
              if (code == 0xdd)
 
2884
                {
 
2885
                  /* Note that we've changed the relocs, section contents,
 
2886
                     etc.  */
 
2887
                  elf_section_data (sec)->relocs = internal_relocs;
 
2888
                  elf_section_data (sec)->this_hdr.contents = contents;
 
2889
                  symtab_hdr->contents = (unsigned char *) isymbuf;
 
2890
 
 
2891
                  /* Fix the opcode.  */
 
2892
                  bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 1);
 
2893
                  bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
 
2894
 
 
2895
                  /* Fix irel->r_offset and irel->r_addend.  */
 
2896
                  irel->r_offset += 1;
 
2897
                  irel->r_addend += 1;
 
2898
 
 
2899
                  /* Delete one byte of data.  */
 
2900
                  if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
2901
                                                       irel->r_offset + 3, 1))
 
2902
                    goto error_return;
 
2903
 
 
2904
                  /* That will change things, so, we should relax again.
 
2905
                     Note that this is not required, and it may be slow.  */
 
2906
                  *again = TRUE;
 
2907
                }
 
2908
            }
 
2909
          else if (h)
 
2910
            {
 
2911
              /* We've got a "call" instruction which needs some data
 
2912
                 from target function filled in.  */
 
2913
              unsigned char code;
 
2914
 
 
2915
              /* Get the opcode.  */
 
2916
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
2917
 
 
2918
              /* Insert data from the target function into the "call"
 
2919
                 instruction if needed.  */
 
2920
              if (code == 0xdd)
 
2921
                {
 
2922
                  bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 4);
 
2923
                  bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
 
2924
                             contents + irel->r_offset + 5);
 
2925
                }
 
2926
            }
 
2927
 
 
2928
          /* Deal with pc-relative gunk.  */
 
2929
          value -= (sec->output_section->vma + sec->output_offset);
 
2930
          value -= irel->r_offset;
 
2931
          value += irel->r_addend;
 
2932
 
 
2933
          /* See if the value will fit in 16 bits, note the high value is
 
2934
             0x7fff + 2 as the target will be two bytes closer if we are
 
2935
             able to relax, if it's in the same section.  */
 
2936
          if (sec->output_section == sym_sec->output_section)
 
2937
            jump_offset = 0x8001;
 
2938
          else
 
2939
            jump_offset = 0x7fff;
 
2940
 
 
2941
          /* Account for jumps across alignment boundaries using
 
2942
             align_gap_adjustment.  */
 
2943
          if ((bfd_signed_vma) value < jump_offset - (bfd_signed_vma) align_gap_adjustment
 
2944
              && ((bfd_signed_vma) value > -0x8000 + (bfd_signed_vma) align_gap_adjustment))
 
2945
            {
 
2946
              unsigned char code;
 
2947
 
 
2948
              /* Get the opcode.  */
 
2949
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
2950
 
 
2951
              if (code != 0xdc && code != 0xdd && code != 0xff)
 
2952
                continue;
 
2953
 
 
2954
              /* Note that we've changed the relocs, section contents, etc.  */
 
2955
              elf_section_data (sec)->relocs = internal_relocs;
 
2956
              elf_section_data (sec)->this_hdr.contents = contents;
 
2957
              symtab_hdr->contents = (unsigned char *) isymbuf;
 
2958
 
 
2959
              /* Fix the opcode.  */
 
2960
              if (code == 0xdc)
 
2961
                bfd_put_8 (abfd, 0xcc, contents + irel->r_offset - 1);
 
2962
              else if (code == 0xdd)
 
2963
                bfd_put_8 (abfd, 0xcd, contents + irel->r_offset - 1);
 
2964
              else if (code == 0xff)
 
2965
                bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
 
2966
 
 
2967
              /* Fix the relocation's type.  */
 
2968
              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
2969
                                           (ELF32_R_TYPE (irel->r_info)
 
2970
                                            == (int) R_MN10300_PLT32)
 
2971
                                           ? R_MN10300_PLT16 :
 
2972
                                           R_MN10300_PCREL16);
 
2973
 
 
2974
              /* Delete two bytes of data.  */
 
2975
              if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
2976
                                                   irel->r_offset + 1, 2))
 
2977
                goto error_return;
 
2978
 
 
2979
              /* That will change things, so, we should relax again.
 
2980
                 Note that this is not required, and it may be slow.  */
 
2981
              *again = TRUE;
 
2982
            }
 
2983
        }
 
2984
 
 
2985
      /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
 
2986
         branch.  */
 
2987
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL16)
 
2988
        {
 
2989
          bfd_vma value = symval;
 
2990
 
 
2991
          /* If we've got a "call" instruction that needs to be turned
 
2992
             into a "calls" instruction, do so now.  It saves a byte.  */
 
2993
          if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
 
2994
            {
 
2995
              unsigned char code;
 
2996
 
 
2997
              /* Get the opcode.  */
 
2998
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
2999
 
 
3000
              /* Make sure we're working with a "call" instruction!  */
 
3001
              if (code == 0xcd)
 
3002
                {
 
3003
                  /* Note that we've changed the relocs, section contents,
 
3004
                     etc.  */
 
3005
                  elf_section_data (sec)->relocs = internal_relocs;
 
3006
                  elf_section_data (sec)->this_hdr.contents = contents;
 
3007
                  symtab_hdr->contents = (unsigned char *) isymbuf;
 
3008
 
 
3009
                  /* Fix the opcode.  */
 
3010
                  bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 1);
 
3011
                  bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
 
3012
 
 
3013
                  /* Fix irel->r_offset and irel->r_addend.  */
 
3014
                  irel->r_offset += 1;
 
3015
                  irel->r_addend += 1;
 
3016
 
 
3017
                  /* Delete one byte of data.  */
 
3018
                  if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3019
                                                       irel->r_offset + 1, 1))
 
3020
                    goto error_return;
 
3021
 
 
3022
                  /* That will change things, so, we should relax again.
 
3023
                     Note that this is not required, and it may be slow.  */
 
3024
                  *again = TRUE;
 
3025
                }
 
3026
            }
 
3027
          else if (h)
 
3028
            {
 
3029
              unsigned char code;
 
3030
 
 
3031
              /* Get the opcode.  */
 
3032
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
3033
 
 
3034
              /* Insert data from the target function into the "call"
 
3035
                 instruction if needed.  */
 
3036
              if (code == 0xcd)
 
3037
                {
 
3038
                  bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 2);
 
3039
                  bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
 
3040
                             contents + irel->r_offset + 3);
 
3041
                }
 
3042
            }
 
3043
 
 
3044
          /* Deal with pc-relative gunk.  */
 
3045
          value -= (sec->output_section->vma + sec->output_offset);
 
3046
          value -= irel->r_offset;
 
3047
          value += irel->r_addend;
 
3048
 
 
3049
          /* See if the value will fit in 8 bits, note the high value is
 
3050
             0x7f + 1 as the target will be one bytes closer if we are
 
3051
             able to relax.  */
 
3052
          if ((long) value < 0x80 && (long) value > -0x80)
 
3053
            {
 
3054
              unsigned char code;
 
3055
 
 
3056
              /* Get the opcode.  */
 
3057
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
3058
 
 
3059
              if (code != 0xcc)
 
3060
                continue;
 
3061
 
 
3062
              /* Note that we've changed the relocs, section contents, etc.  */
 
3063
              elf_section_data (sec)->relocs = internal_relocs;
 
3064
              elf_section_data (sec)->this_hdr.contents = contents;
 
3065
              symtab_hdr->contents = (unsigned char *) isymbuf;
 
3066
 
 
3067
              /* Fix the opcode.  */
 
3068
              bfd_put_8 (abfd, 0xca, contents + irel->r_offset - 1);
 
3069
 
 
3070
              /* Fix the relocation's type.  */
 
3071
              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3072
                                           R_MN10300_PCREL8);
 
3073
 
 
3074
              /* Delete one byte of data.  */
 
3075
              if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3076
                                                   irel->r_offset + 1, 1))
 
3077
                goto error_return;
 
3078
 
 
3079
              /* That will change things, so, we should relax again.
 
3080
                 Note that this is not required, and it may be slow.  */
 
3081
              *again = TRUE;
 
3082
            }
 
3083
        }
 
3084
 
 
3085
      /* Try to eliminate an unconditional 8 bit pc-relative branch
 
3086
         which immediately follows a conditional 8 bit pc-relative
 
3087
         branch around the unconditional branch.
 
3088
 
 
3089
            original:           new:
 
3090
            bCC lab1            bCC' lab2
 
3091
            bra lab2
 
3092
           lab1:               lab1:
 
3093
 
 
3094
         This happens when the bCC can't reach lab2 at assembly time,
 
3095
         but due to other relaxations it can reach at link time.  */
 
3096
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL8)
 
3097
        {
 
3098
          Elf_Internal_Rela *nrel;
 
3099
          bfd_vma value = symval;
 
3100
          unsigned char code;
 
3101
 
 
3102
          /* Deal with pc-relative gunk.  */
 
3103
          value -= (sec->output_section->vma + sec->output_offset);
 
3104
          value -= irel->r_offset;
 
3105
          value += irel->r_addend;
 
3106
 
 
3107
          /* Do nothing if this reloc is the last byte in the section.  */
 
3108
          if (irel->r_offset == sec->size)
 
3109
            continue;
 
3110
 
 
3111
          /* See if the next instruction is an unconditional pc-relative
 
3112
             branch, more often than not this test will fail, so we
 
3113
             test it first to speed things up.  */
 
3114
          code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
 
3115
          if (code != 0xca)
 
3116
            continue;
 
3117
 
 
3118
          /* Also make sure the next relocation applies to the next
 
3119
             instruction and that it's a pc-relative 8 bit branch.  */
 
3120
          nrel = irel + 1;
 
3121
          if (nrel == irelend
 
3122
              || irel->r_offset + 2 != nrel->r_offset
 
3123
              || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10300_PCREL8)
 
3124
            continue;
 
3125
 
 
3126
          /* Make sure our destination immediately follows the
 
3127
             unconditional branch.  */
 
3128
          if (symval != (sec->output_section->vma + sec->output_offset
 
3129
                         + irel->r_offset + 3))
 
3130
            continue;
 
3131
 
 
3132
          /* Now make sure we are a conditional branch.  This may not
 
3133
             be necessary, but why take the chance.
 
3134
 
 
3135
             Note these checks assume that R_MN10300_PCREL8 relocs
 
3136
             only occur on bCC and bCCx insns.  If they occured
 
3137
             elsewhere, we'd need to know the start of this insn
 
3138
             for this check to be accurate.  */
 
3139
          code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
3140
          if (code != 0xc0 && code != 0xc1 && code != 0xc2
 
3141
              && code != 0xc3 && code != 0xc4 && code != 0xc5
 
3142
              && code != 0xc6 && code != 0xc7 && code != 0xc8
 
3143
              && code != 0xc9 && code != 0xe8 && code != 0xe9
 
3144
              && code != 0xea && code != 0xeb)
 
3145
            continue;
 
3146
 
 
3147
          /* We also have to be sure there is no symbol/label
 
3148
             at the unconditional branch.  */
 
3149
          if (mn10300_elf_symbol_address_p (abfd, sec, isymbuf,
 
3150
                                            irel->r_offset + 1))
 
3151
            continue;
 
3152
 
 
3153
          /* Note that we've changed the relocs, section contents, etc.  */
 
3154
          elf_section_data (sec)->relocs = internal_relocs;
 
3155
          elf_section_data (sec)->this_hdr.contents = contents;
 
3156
          symtab_hdr->contents = (unsigned char *) isymbuf;
 
3157
 
 
3158
          /* Reverse the condition of the first branch.  */
 
3159
          switch (code)
 
3160
            {
 
3161
            case 0xc8:
 
3162
              code = 0xc9;
 
3163
              break;
 
3164
            case 0xc9:
 
3165
              code = 0xc8;
 
3166
              break;
 
3167
            case 0xc0:
 
3168
              code = 0xc2;
 
3169
              break;
 
3170
            case 0xc2:
 
3171
              code = 0xc0;
 
3172
              break;
 
3173
            case 0xc3:
 
3174
              code = 0xc1;
 
3175
              break;
 
3176
            case 0xc1:
 
3177
              code = 0xc3;
 
3178
              break;
 
3179
            case 0xc4:
 
3180
              code = 0xc6;
 
3181
              break;
 
3182
            case 0xc6:
 
3183
              code = 0xc4;
 
3184
              break;
 
3185
            case 0xc7:
 
3186
              code = 0xc5;
 
3187
              break;
 
3188
            case 0xc5:
 
3189
              code = 0xc7;
 
3190
              break;
 
3191
            case 0xe8:
 
3192
              code = 0xe9;
 
3193
              break;
 
3194
            case 0x9d:
 
3195
              code = 0xe8;
 
3196
              break;
 
3197
            case 0xea:
 
3198
              code = 0xeb;
 
3199
              break;
 
3200
            case 0xeb:
 
3201
              code = 0xea;
 
3202
              break;
 
3203
            }
 
3204
          bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
 
3205
 
 
3206
          /* Set the reloc type and symbol for the first branch
 
3207
             from the second branch.  */
 
3208
          irel->r_info = nrel->r_info;
 
3209
 
 
3210
          /* Make the reloc for the second branch a null reloc.  */
 
3211
          nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
 
3212
                                       R_MN10300_NONE);
 
3213
 
 
3214
          /* Delete two bytes of data.  */
 
3215
          if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3216
                                               irel->r_offset + 1, 2))
 
3217
            goto error_return;
 
3218
 
 
3219
          /* That will change things, so, we should relax again.
 
3220
             Note that this is not required, and it may be slow.  */
 
3221
          *again = TRUE;
 
3222
        }
 
3223
 
 
3224
      /* Try to turn a 24 immediate, displacement or absolute address
 
3225
         into a 8 immediate, displacement or absolute address.  */
 
3226
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_24)
 
3227
        {
 
3228
          bfd_vma value = symval;
 
3229
          value += irel->r_addend;
 
3230
 
 
3231
          /* See if the value will fit in 8 bits.  */
 
3232
          if ((long) value < 0x7f && (long) value > -0x80)
 
3233
            {
 
3234
              unsigned char code;
 
3235
 
 
3236
              /* AM33 insns which have 24 operands are 6 bytes long and
 
3237
                 will have 0xfd as the first byte.  */
 
3238
 
 
3239
              /* Get the first opcode.  */
 
3240
              code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
 
3241
 
 
3242
              if (code == 0xfd)
 
3243
                {
 
3244
                  /* Get the second opcode.  */
 
3245
                  code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
 
3246
 
 
3247
                  /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
 
3248
                     equivalent instructions exists.  */
 
3249
                  if (code != 0x6b && code != 0x7b
 
3250
                      && code != 0x8b && code != 0x9b
 
3251
                      && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
 
3252
                          || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
 
3253
                          || (code & 0x0f) == 0x0e))
 
3254
                    {
 
3255
                      /* Not safe if the high bit is on as relaxing may
 
3256
                         move the value out of high mem and thus not fit
 
3257
                         in a signed 8bit value.  This is currently over
 
3258
                         conservative.  */
 
3259
                      if ((value & 0x80) == 0)
 
3260
                        {
 
3261
                          /* Note that we've changed the relocation contents,
 
3262
                             etc.  */
 
3263
                          elf_section_data (sec)->relocs = internal_relocs;
 
3264
                          elf_section_data (sec)->this_hdr.contents = contents;
 
3265
                          symtab_hdr->contents = (unsigned char *) isymbuf;
 
3266
 
 
3267
                          /* Fix the opcode.  */
 
3268
                          bfd_put_8 (abfd, 0xfb, contents + irel->r_offset - 3);
 
3269
                          bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
 
3270
 
 
3271
                          /* Fix the relocation's type.  */
 
3272
                          irel->r_info =
 
3273
                            ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3274
                                          R_MN10300_8);
 
3275
 
 
3276
                          /* Delete two bytes of data.  */
 
3277
                          if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3278
                                                               irel->r_offset + 1, 2))
 
3279
                            goto error_return;
 
3280
 
 
3281
                          /* That will change things, so, we should relax
 
3282
                             again.  Note that this is not required, and it
 
3283
                             may be slow.  */
 
3284
                          *again = TRUE;
 
3285
                          break;
 
3286
                        }
 
3287
                    }
 
3288
                }
 
3289
            }
 
3290
        }
 
3291
 
 
3292
      /* Try to turn a 32bit immediate, displacement or absolute address
 
3293
         into a 16bit immediate, displacement or absolute address.  */
 
3294
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_32
 
3295
          || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOT32
 
3296
          || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTOFF32)
 
3297
        {
 
3298
          bfd_vma value = symval;
 
3299
 
 
3300
          if (ELF32_R_TYPE (irel->r_info) != (int) R_MN10300_32)
 
3301
            {
 
3302
              asection * sgot;
 
3303
 
 
3304
              sgot = bfd_get_section_by_name (elf_hash_table (link_info)
 
3305
                                              ->dynobj, ".got");
 
3306
 
 
3307
              if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOT32)
 
3308
                {
 
3309
                  value = sgot->output_offset;
 
3310
 
 
3311
                  if (h)
 
3312
                    value += h->root.got.offset;
 
3313
                  else
 
3314
                    value += (elf_local_got_offsets
 
3315
                              (abfd)[ELF32_R_SYM (irel->r_info)]);
 
3316
                }
 
3317
              else if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTOFF32)
 
3318
                value -= sgot->output_section->vma;
 
3319
              else if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTPC32)
 
3320
                value = (sgot->output_section->vma
 
3321
                         - (sec->output_section->vma
 
3322
                            + sec->output_offset
 
3323
                            + irel->r_offset));
 
3324
              else
 
3325
                abort ();
 
3326
            }
 
3327
 
 
3328
          value += irel->r_addend;
 
3329
 
 
3330
          /* See if the value will fit in 24 bits.
 
3331
             We allow any 16bit match here.  We prune those we can't
 
3332
             handle below.  */
 
3333
          if ((long) value < 0x7fffff && (long) value > -0x800000)
 
3334
            {
 
3335
              unsigned char code;
 
3336
 
 
3337
              /* AM33 insns which have 32bit operands are 7 bytes long and
 
3338
                 will have 0xfe as the first byte.  */
 
3339
 
 
3340
              /* Get the first opcode.  */
 
3341
              code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
 
3342
 
 
3343
              if (code == 0xfe)
 
3344
                {
 
3345
                  /* Get the second opcode.  */
 
3346
                  code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
 
3347
 
 
3348
                  /* All the am33 32 -> 24 relaxing possibilities.  */
 
3349
                  /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
 
3350
                     equivalent instructions exists.  */
 
3351
                  if (code != 0x6b && code != 0x7b
 
3352
                      && code != 0x8b && code != 0x9b
 
3353
                      && (ELF32_R_TYPE (irel->r_info)
 
3354
                          != (int) R_MN10300_GOTPC32)
 
3355
                      && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
 
3356
                          || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
 
3357
                          || (code & 0x0f) == 0x0e))
 
3358
                    {
 
3359
                      /* Not safe if the high bit is on as relaxing may
 
3360
                         move the value out of high mem and thus not fit
 
3361
                         in a signed 16bit value.  This is currently over
 
3362
                         conservative.  */
 
3363
                      if ((value & 0x8000) == 0)
 
3364
                        {
 
3365
                          /* Note that we've changed the relocation contents,
 
3366
                             etc.  */
 
3367
                          elf_section_data (sec)->relocs = internal_relocs;
 
3368
                          elf_section_data (sec)->this_hdr.contents = contents;
 
3369
                          symtab_hdr->contents = (unsigned char *) isymbuf;
 
3370
 
 
3371
                          /* Fix the opcode.  */
 
3372
                          bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 3);
 
3373
                          bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
 
3374
 
 
3375
                          /* Fix the relocation's type.  */
 
3376
                          irel->r_info =
 
3377
                            ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3378
                                          (ELF32_R_TYPE (irel->r_info)
 
3379
                                           == (int) R_MN10300_GOTOFF32)
 
3380
                                          ? R_MN10300_GOTOFF24
 
3381
                                          : (ELF32_R_TYPE (irel->r_info)
 
3382
                                             == (int) R_MN10300_GOT32)
 
3383
                                          ? R_MN10300_GOT24 :
 
3384
                                          R_MN10300_24);
 
3385
 
 
3386
                          /* Delete one byte of data.  */
 
3387
                          if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3388
                                                               irel->r_offset + 3, 1))
 
3389
                            goto error_return;
 
3390
 
 
3391
                          /* That will change things, so, we should relax
 
3392
                             again.  Note that this is not required, and it
 
3393
                             may be slow.  */
 
3394
                          *again = TRUE;
 
3395
                          break;
 
3396
                        }
 
3397
                    }
 
3398
                }
 
3399
            }
 
3400
 
 
3401
          /* See if the value will fit in 16 bits.
 
3402
             We allow any 16bit match here.  We prune those we can't
 
3403
             handle below.  */
 
3404
          if ((long) value < 0x7fff && (long) value > -0x8000)
 
3405
            {
 
3406
              unsigned char code;
 
3407
 
 
3408
              /* Most insns which have 32bit operands are 6 bytes long;
 
3409
                 exceptions are pcrel insns and bit insns.
 
3410
 
 
3411
                 We handle pcrel insns above.  We don't bother trying
 
3412
                 to handle the bit insns here.
 
3413
 
 
3414
                 The first byte of the remaining insns will be 0xfc.  */
 
3415
 
 
3416
              /* Get the first opcode.  */
 
3417
              code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
 
3418
 
 
3419
              if (code != 0xfc)
 
3420
                continue;
 
3421
 
 
3422
              /* Get the second opcode.  */
 
3423
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
3424
 
 
3425
              if ((code & 0xf0) < 0x80)
 
3426
                switch (code & 0xf0)
 
3427
                  {
 
3428
                  /* mov (d32,am),dn   -> mov (d32,am),dn
 
3429
                     mov dm,(d32,am)   -> mov dn,(d32,am)
 
3430
                     mov (d32,am),an   -> mov (d32,am),an
 
3431
                     mov dm,(d32,am)   -> mov dn,(d32,am)
 
3432
                     movbu (d32,am),dn -> movbu (d32,am),dn
 
3433
                     movbu dm,(d32,am) -> movbu dn,(d32,am)
 
3434
                     movhu (d32,am),dn -> movhu (d32,am),dn
 
3435
                     movhu dm,(d32,am) -> movhu dn,(d32,am) */
 
3436
                  case 0x00:
 
3437
                  case 0x10:
 
3438
                  case 0x20:
 
3439
                  case 0x30:
 
3440
                  case 0x40:
 
3441
                  case 0x50:
 
3442
                  case 0x60:
 
3443
                  case 0x70:
 
3444
                    /* Not safe if the high bit is on as relaxing may
 
3445
                       move the value out of high mem and thus not fit
 
3446
                       in a signed 16bit value.  */
 
3447
                    if (code == 0xcc
 
3448
                        && (value & 0x8000))
 
3449
                      continue;
 
3450
 
 
3451
                    /* Note that we've changed the relocation contents, etc.  */
 
3452
                    elf_section_data (sec)->relocs = internal_relocs;
 
3453
                    elf_section_data (sec)->this_hdr.contents = contents;
 
3454
                    symtab_hdr->contents = (unsigned char *) isymbuf;
 
3455
 
 
3456
                    /* Fix the opcode.  */
 
3457
                    bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
 
3458
                    bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
 
3459
 
 
3460
                    /* Fix the relocation's type.  */
 
3461
                    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3462
                                                 (ELF32_R_TYPE (irel->r_info)
 
3463
                                                  == (int) R_MN10300_GOTOFF32)
 
3464
                                                 ? R_MN10300_GOTOFF16
 
3465
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3466
                                                    == (int) R_MN10300_GOT32)
 
3467
                                                 ? R_MN10300_GOT16
 
3468
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3469
                                                    == (int) R_MN10300_GOTPC32)
 
3470
                                                 ? R_MN10300_GOTPC16 :
 
3471
                                                 R_MN10300_16);
 
3472
 
 
3473
                    /* Delete two bytes of data.  */
 
3474
                    if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3475
                                                         irel->r_offset + 2, 2))
 
3476
                      goto error_return;
 
3477
 
 
3478
                    /* That will change things, so, we should relax again.
 
3479
                       Note that this is not required, and it may be slow.  */
 
3480
                    *again = TRUE;
 
3481
                    break;
 
3482
                  }
 
3483
              else if ((code & 0xf0) == 0x80
 
3484
                       || (code & 0xf0) == 0x90)
 
3485
                switch (code & 0xf3)
 
3486
                  {
 
3487
                  /* mov dn,(abs32)   -> mov dn,(abs16)
 
3488
                     movbu dn,(abs32) -> movbu dn,(abs16)
 
3489
                     movhu dn,(abs32) -> movhu dn,(abs16)  */
 
3490
                  case 0x81:
 
3491
                  case 0x82:
 
3492
                  case 0x83:
 
3493
                    /* Note that we've changed the relocation contents, etc.  */
 
3494
                    elf_section_data (sec)->relocs = internal_relocs;
 
3495
                    elf_section_data (sec)->this_hdr.contents = contents;
 
3496
                    symtab_hdr->contents = (unsigned char *) isymbuf;
 
3497
 
 
3498
                    if ((code & 0xf3) == 0x81)
 
3499
                      code = 0x01 + (code & 0x0c);
 
3500
                    else if ((code & 0xf3) == 0x82)
 
3501
                      code = 0x02 + (code & 0x0c);
 
3502
                    else if ((code & 0xf3) == 0x83)
 
3503
                      code = 0x03 + (code & 0x0c);
 
3504
                    else
 
3505
                      abort ();
 
3506
 
 
3507
                    /* Fix the opcode.  */
 
3508
                    bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
 
3509
 
 
3510
                    /* Fix the relocation's type.  */
 
3511
                    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3512
                                                 (ELF32_R_TYPE (irel->r_info)
 
3513
                                                  == (int) R_MN10300_GOTOFF32)
 
3514
                                                 ? R_MN10300_GOTOFF16
 
3515
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3516
                                                    == (int) R_MN10300_GOT32)
 
3517
                                                 ? R_MN10300_GOT16
 
3518
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3519
                                                    == (int) R_MN10300_GOTPC32)
 
3520
                                                 ? R_MN10300_GOTPC16 :
 
3521
                                                 R_MN10300_16);
 
3522
 
 
3523
                    /* The opcode got shorter too, so we have to fix the
 
3524
                       addend and offset too!  */
 
3525
                    irel->r_offset -= 1;
 
3526
 
 
3527
                    /* Delete three bytes of data.  */
 
3528
                    if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3529
                                                         irel->r_offset + 1, 3))
 
3530
                      goto error_return;
 
3531
 
 
3532
                    /* That will change things, so, we should relax again.
 
3533
                       Note that this is not required, and it may be slow.  */
 
3534
                    *again = TRUE;
 
3535
                    break;
 
3536
 
 
3537
                  /* mov am,(abs32)    -> mov am,(abs16)
 
3538
                     mov am,(d32,sp)   -> mov am,(d16,sp)
 
3539
                     mov dm,(d32,sp)   -> mov dm,(d32,sp)
 
3540
                     movbu dm,(d32,sp) -> movbu dm,(d32,sp)
 
3541
                     movhu dm,(d32,sp) -> movhu dm,(d32,sp) */
 
3542
                  case 0x80:
 
3543
                  case 0x90:
 
3544
                  case 0x91:
 
3545
                  case 0x92:
 
3546
                  case 0x93:
 
3547
                    /* sp-based offsets are zero-extended.  */
 
3548
                    if (code >= 0x90 && code <= 0x93
 
3549
                        && (long) value < 0)
 
3550
                      continue;
 
3551
 
 
3552
                    /* Note that we've changed the relocation contents, etc.  */
 
3553
                    elf_section_data (sec)->relocs = internal_relocs;
 
3554
                    elf_section_data (sec)->this_hdr.contents = contents;
 
3555
                    symtab_hdr->contents = (unsigned char *) isymbuf;
 
3556
 
 
3557
                    /* Fix the opcode.  */
 
3558
                    bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
 
3559
                    bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
 
3560
 
 
3561
                    /* Fix the relocation's type.  */
 
3562
                    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3563
                                                 (ELF32_R_TYPE (irel->r_info)
 
3564
                                                  == (int) R_MN10300_GOTOFF32)
 
3565
                                                 ? R_MN10300_GOTOFF16
 
3566
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3567
                                                    == (int) R_MN10300_GOT32)
 
3568
                                                 ? R_MN10300_GOT16
 
3569
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3570
                                                    == (int) R_MN10300_GOTPC32)
 
3571
                                                 ? R_MN10300_GOTPC16 :
 
3572
                                                 R_MN10300_16);
 
3573
 
 
3574
                    /* Delete two bytes of data.  */
 
3575
                    if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3576
                                                         irel->r_offset + 2, 2))
 
3577
                      goto error_return;
 
3578
 
 
3579
                    /* That will change things, so, we should relax again.
 
3580
                       Note that this is not required, and it may be slow.  */
 
3581
                    *again = TRUE;
 
3582
                    break;
 
3583
                  }
 
3584
              else if ((code & 0xf0) < 0xf0)
 
3585
                switch (code & 0xfc)
 
3586
                  {
 
3587
                  /* mov imm32,dn     -> mov imm16,dn
 
3588
                     mov imm32,an     -> mov imm16,an
 
3589
                     mov (abs32),dn   -> mov (abs16),dn
 
3590
                     movbu (abs32),dn -> movbu (abs16),dn
 
3591
                     movhu (abs32),dn -> movhu (abs16),dn  */
 
3592
                  case 0xcc:
 
3593
                  case 0xdc:
 
3594
                  case 0xa4:
 
3595
                  case 0xa8:
 
3596
                  case 0xac:
 
3597
                    /* Not safe if the high bit is on as relaxing may
 
3598
                       move the value out of high mem and thus not fit
 
3599
                       in a signed 16bit value.  */
 
3600
                    if (code == 0xcc
 
3601
                        && (value & 0x8000))
 
3602
                      continue;
 
3603
 
 
3604
                    /* mov imm16, an zero-extends the immediate.  */
 
3605
                    if (code == 0xdc
 
3606
                        && (long) value < 0)
 
3607
                      continue;
 
3608
 
 
3609
                    /* Note that we've changed the relocation contents, etc.  */
 
3610
                    elf_section_data (sec)->relocs = internal_relocs;
 
3611
                    elf_section_data (sec)->this_hdr.contents = contents;
 
3612
                    symtab_hdr->contents = (unsigned char *) isymbuf;
 
3613
 
 
3614
                    if ((code & 0xfc) == 0xcc)
 
3615
                      code = 0x2c + (code & 0x03);
 
3616
                    else if ((code & 0xfc) == 0xdc)
 
3617
                      code = 0x24 + (code & 0x03);
 
3618
                    else if ((code & 0xfc) == 0xa4)
 
3619
                      code = 0x30 + (code & 0x03);
 
3620
                    else if ((code & 0xfc) == 0xa8)
 
3621
                      code = 0x34 + (code & 0x03);
 
3622
                    else if ((code & 0xfc) == 0xac)
 
3623
                      code = 0x38 + (code & 0x03);
 
3624
                    else
 
3625
                      abort ();
 
3626
 
 
3627
                    /* Fix the opcode.  */
 
3628
                    bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
 
3629
 
 
3630
                    /* Fix the relocation's type.  */
 
3631
                    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3632
                                                 (ELF32_R_TYPE (irel->r_info)
 
3633
                                                  == (int) R_MN10300_GOTOFF32)
 
3634
                                                 ? R_MN10300_GOTOFF16
 
3635
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3636
                                                    == (int) R_MN10300_GOT32)
 
3637
                                                 ? R_MN10300_GOT16
 
3638
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3639
                                                    == (int) R_MN10300_GOTPC32)
 
3640
                                                 ? R_MN10300_GOTPC16 :
 
3641
                                                 R_MN10300_16);
 
3642
 
 
3643
                    /* The opcode got shorter too, so we have to fix the
 
3644
                       addend and offset too!  */
 
3645
                    irel->r_offset -= 1;
 
3646
 
 
3647
                    /* Delete three bytes of data.  */
 
3648
                    if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3649
                                                         irel->r_offset + 1, 3))
 
3650
                      goto error_return;
 
3651
 
 
3652
                    /* That will change things, so, we should relax again.
 
3653
                       Note that this is not required, and it may be slow.  */
 
3654
                    *again = TRUE;
 
3655
                    break;
 
3656
 
 
3657
                  /* mov (abs32),an    -> mov (abs16),an
 
3658
                     mov (d32,sp),an   -> mov (d16,sp),an
 
3659
                     mov (d32,sp),dn   -> mov (d16,sp),dn
 
3660
                     movbu (d32,sp),dn -> movbu (d16,sp),dn
 
3661
                     movhu (d32,sp),dn -> movhu (d16,sp),dn
 
3662
                     add imm32,dn      -> add imm16,dn
 
3663
                     cmp imm32,dn      -> cmp imm16,dn
 
3664
                     add imm32,an      -> add imm16,an
 
3665
                     cmp imm32,an      -> cmp imm16,an
 
3666
                     and imm32,dn      -> and imm16,dn
 
3667
                     or imm32,dn       -> or imm16,dn
 
3668
                     xor imm32,dn      -> xor imm16,dn
 
3669
                     btst imm32,dn     -> btst imm16,dn */
 
3670
 
 
3671
                  case 0xa0:
 
3672
                  case 0xb0:
 
3673
                  case 0xb1:
 
3674
                  case 0xb2:
 
3675
                  case 0xb3:
 
3676
                  case 0xc0:
 
3677
                  case 0xc8:
 
3678
 
 
3679
                  case 0xd0:
 
3680
                  case 0xd8:
 
3681
                  case 0xe0:
 
3682
                  case 0xe1:
 
3683
                  case 0xe2:
 
3684
                  case 0xe3:
 
3685
                    /* cmp imm16, an zero-extends the immediate.  */
 
3686
                    if (code == 0xdc
 
3687
                        && (long) value < 0)
 
3688
                      continue;
 
3689
 
 
3690
                    /* So do sp-based offsets.  */
 
3691
                    if (code >= 0xb0 && code <= 0xb3
 
3692
                        && (long) value < 0)
 
3693
                      continue;
 
3694
 
 
3695
                    /* Note that we've changed the relocation contents, etc.  */
 
3696
                    elf_section_data (sec)->relocs = internal_relocs;
 
3697
                    elf_section_data (sec)->this_hdr.contents = contents;
 
3698
                    symtab_hdr->contents = (unsigned char *) isymbuf;
 
3699
 
 
3700
                    /* Fix the opcode.  */
 
3701
                    bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
 
3702
                    bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
 
3703
 
 
3704
                    /* Fix the relocation's type.  */
 
3705
                    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3706
                                                 (ELF32_R_TYPE (irel->r_info)
 
3707
                                                  == (int) R_MN10300_GOTOFF32)
 
3708
                                                 ? R_MN10300_GOTOFF16
 
3709
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3710
                                                    == (int) R_MN10300_GOT32)
 
3711
                                                 ? R_MN10300_GOT16
 
3712
                                                 : (ELF32_R_TYPE (irel->r_info)
 
3713
                                                    == (int) R_MN10300_GOTPC32)
 
3714
                                                 ? R_MN10300_GOTPC16 :
 
3715
                                                 R_MN10300_16);
 
3716
 
 
3717
                    /* Delete two bytes of data.  */
 
3718
                    if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3719
                                                         irel->r_offset + 2, 2))
 
3720
                      goto error_return;
 
3721
 
 
3722
                    /* That will change things, so, we should relax again.
 
3723
                       Note that this is not required, and it may be slow.  */
 
3724
                    *again = TRUE;
 
3725
                    break;
 
3726
                  }
 
3727
              else if (code == 0xfe)
 
3728
                {
 
3729
                  /* add imm32,sp -> add imm16,sp  */
 
3730
 
 
3731
                  /* Note that we've changed the relocation contents, etc.  */
 
3732
                  elf_section_data (sec)->relocs = internal_relocs;
 
3733
                  elf_section_data (sec)->this_hdr.contents = contents;
 
3734
                  symtab_hdr->contents = (unsigned char *) isymbuf;
 
3735
 
 
3736
                  /* Fix the opcode.  */
 
3737
                  bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
 
3738
                  bfd_put_8 (abfd, 0xfe, contents + irel->r_offset - 1);
 
3739
 
 
3740
                  /* Fix the relocation's type.  */
 
3741
                  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
 
3742
                                               (ELF32_R_TYPE (irel->r_info)
 
3743
                                                == (int) R_MN10300_GOT32)
 
3744
                                               ? R_MN10300_GOT16
 
3745
                                               : (ELF32_R_TYPE (irel->r_info)
 
3746
                                                  == (int) R_MN10300_GOTOFF32)
 
3747
                                               ? R_MN10300_GOTOFF16
 
3748
                                               : (ELF32_R_TYPE (irel->r_info)
 
3749
                                                  == (int) R_MN10300_GOTPC32)
 
3750
                                               ? R_MN10300_GOTPC16 :
 
3751
                                               R_MN10300_16);
 
3752
 
 
3753
                  /* Delete two bytes of data.  */
 
3754
                  if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
3755
                                                       irel->r_offset + 2, 2))
 
3756
                    goto error_return;
 
3757
 
 
3758
                  /* That will change things, so, we should relax again.
 
3759
                     Note that this is not required, and it may be slow.  */
 
3760
                  *again = TRUE;
 
3761
                  break;
 
3762
                }
 
3763
            }
 
3764
        }
 
3765
    }
 
3766
 
 
3767
  if (isymbuf != NULL
 
3768
      && symtab_hdr->contents != (unsigned char *) isymbuf)
 
3769
    {
 
3770
      if (! link_info->keep_memory)
 
3771
        free (isymbuf);
 
3772
      else
 
3773
        {
 
3774
          /* Cache the symbols for elf_link_input_bfd.  */
 
3775
          symtab_hdr->contents = (unsigned char *) isymbuf;
 
3776
        }
 
3777
    }
 
3778
 
 
3779
  if (contents != NULL
 
3780
      && elf_section_data (sec)->this_hdr.contents != contents)
 
3781
    {
 
3782
      if (! link_info->keep_memory)
 
3783
        free (contents);
 
3784
      else
 
3785
        {
 
3786
          /* Cache the section contents for elf_link_input_bfd.  */
 
3787
          elf_section_data (sec)->this_hdr.contents = contents;
 
3788
        }
 
3789
    }
 
3790
 
 
3791
  if (internal_relocs != NULL
 
3792
      && elf_section_data (sec)->relocs != internal_relocs)
 
3793
    free (internal_relocs);
 
3794
 
 
3795
  return TRUE;
 
3796
 
 
3797
 error_return:
 
3798
  if (isymbuf != NULL
 
3799
      && symtab_hdr->contents != (unsigned char *) isymbuf)
 
3800
    free (isymbuf);
 
3801
  if (contents != NULL
 
3802
      && elf_section_data (section)->this_hdr.contents != contents)
 
3803
    free (contents);
 
3804
  if (internal_relocs != NULL
 
3805
      && elf_section_data (section)->relocs != internal_relocs)
 
3806
    free (internal_relocs);
 
3807
 
 
3808
  return FALSE;
 
3809
}
 
3810
 
 
3811
/* This is a version of bfd_generic_get_relocated_section_contents
 
3812
   which uses mn10300_elf_relocate_section.  */
 
3813
 
 
3814
static bfd_byte *
 
3815
mn10300_elf_get_relocated_section_contents (bfd *output_bfd,
 
3816
                                            struct bfd_link_info *link_info,
 
3817
                                            struct bfd_link_order *link_order,
 
3818
                                            bfd_byte *data,
 
3819
                                            bfd_boolean relocatable,
 
3820
                                            asymbol **symbols)
 
3821
{
 
3822
  Elf_Internal_Shdr *symtab_hdr;
 
3823
  asection *input_section = link_order->u.indirect.section;
 
3824
  bfd *input_bfd = input_section->owner;
 
3825
  asection **sections = NULL;
 
3826
  Elf_Internal_Rela *internal_relocs = NULL;
 
3827
  Elf_Internal_Sym *isymbuf = NULL;
 
3828
 
 
3829
  /* We only need to handle the case of relaxing, or of having a
 
3830
     particular set of section contents, specially.  */
 
3831
  if (relocatable
 
3832
      || elf_section_data (input_section)->this_hdr.contents == NULL)
 
3833
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
 
3834
                                                       link_order, data,
 
3835
                                                       relocatable,
 
3836
                                                       symbols);
 
3837
 
 
3838
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
 
3839
 
 
3840
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
 
3841
          (size_t) input_section->size);
 
3842
 
 
3843
  if ((input_section->flags & SEC_RELOC) != 0
 
3844
      && input_section->reloc_count > 0)
 
3845
    {
 
3846
      asection **secpp;
 
3847
      Elf_Internal_Sym *isym, *isymend;
 
3848
      bfd_size_type amt;
 
3849
 
 
3850
      internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
 
3851
                                                   NULL, NULL, FALSE);
 
3852
      if (internal_relocs == NULL)
 
3853
        goto error_return;
 
3854
 
 
3855
      if (symtab_hdr->sh_info != 0)
 
3856
        {
 
3857
          isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
 
3858
          if (isymbuf == NULL)
 
3859
            isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
 
3860
                                            symtab_hdr->sh_info, 0,
 
3861
                                            NULL, NULL, NULL);
 
3862
          if (isymbuf == NULL)
 
3863
            goto error_return;
 
3864
        }
 
3865
 
 
3866
      amt = symtab_hdr->sh_info;
 
3867
      amt *= sizeof (asection *);
 
3868
      sections = bfd_malloc (amt);
 
3869
      if (sections == NULL && amt != 0)
 
3870
        goto error_return;
 
3871
 
 
3872
      isymend = isymbuf + symtab_hdr->sh_info;
 
3873
      for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
 
3874
        {
 
3875
          asection *isec;
 
3876
 
 
3877
          if (isym->st_shndx == SHN_UNDEF)
 
3878
            isec = bfd_und_section_ptr;
 
3879
          else if (isym->st_shndx == SHN_ABS)
 
3880
            isec = bfd_abs_section_ptr;
 
3881
          else if (isym->st_shndx == SHN_COMMON)
 
3882
            isec = bfd_com_section_ptr;
 
3883
          else
 
3884
            isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
 
3885
 
 
3886
          *secpp = isec;
 
3887
        }
 
3888
 
 
3889
      if (! mn10300_elf_relocate_section (output_bfd, link_info, input_bfd,
 
3890
                                          input_section, data, internal_relocs,
 
3891
                                          isymbuf, sections))
 
3892
        goto error_return;
 
3893
 
 
3894
      if (sections != NULL)
 
3895
        free (sections);
 
3896
      if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
 
3897
        free (isymbuf);
 
3898
      if (internal_relocs != elf_section_data (input_section)->relocs)
 
3899
        free (internal_relocs);
 
3900
    }
 
3901
 
 
3902
  return data;
 
3903
 
 
3904
 error_return:
 
3905
  if (sections != NULL)
 
3906
    free (sections);
 
3907
  if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
 
3908
    free (isymbuf);
 
3909
  if (internal_relocs != NULL
 
3910
      && internal_relocs != elf_section_data (input_section)->relocs)
 
3911
    free (internal_relocs);
 
3912
  return NULL;
 
3913
}
 
3914
 
 
3915
/* Assorted hash table functions.  */
 
3916
 
 
3917
/* Initialize an entry in the link hash table.  */
 
3918
 
 
3919
/* Create an entry in an MN10300 ELF linker hash table.  */
 
3920
 
 
3921
static struct bfd_hash_entry *
 
3922
elf32_mn10300_link_hash_newfunc (struct bfd_hash_entry *entry,
 
3923
                                 struct bfd_hash_table *table,
 
3924
                                 const char *string)
 
3925
{
 
3926
  struct elf32_mn10300_link_hash_entry *ret =
 
3927
    (struct elf32_mn10300_link_hash_entry *) entry;
 
3928
 
 
3929
  /* Allocate the structure if it has not already been allocated by a
 
3930
     subclass.  */
 
3931
  if (ret == NULL)
 
3932
    ret = (struct elf32_mn10300_link_hash_entry *)
 
3933
           bfd_hash_allocate (table, sizeof (* ret));
 
3934
  if (ret == NULL)
 
3935
    return (struct bfd_hash_entry *) ret;
 
3936
 
 
3937
  /* Call the allocation method of the superclass.  */
 
3938
  ret = (struct elf32_mn10300_link_hash_entry *)
 
3939
         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
 
3940
                                     table, string);
 
3941
  if (ret != NULL)
 
3942
    {
 
3943
      ret->direct_calls = 0;
 
3944
      ret->stack_size = 0;
 
3945
      ret->movm_args = 0;
 
3946
      ret->movm_stack_size = 0;
 
3947
      ret->flags = 0;
 
3948
      ret->value = 0;
 
3949
    }
 
3950
 
 
3951
  return (struct bfd_hash_entry *) ret;
 
3952
}
 
3953
 
 
3954
/* Create an mn10300 ELF linker hash table.  */
 
3955
 
 
3956
static struct bfd_link_hash_table *
 
3957
elf32_mn10300_link_hash_table_create (bfd *abfd)
 
3958
{
 
3959
  struct elf32_mn10300_link_hash_table *ret;
 
3960
  bfd_size_type amt = sizeof (* ret);
 
3961
 
 
3962
  ret = bfd_malloc (amt);
 
3963
  if (ret == NULL)
 
3964
    return NULL;
 
3965
 
 
3966
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
 
3967
                                      elf32_mn10300_link_hash_newfunc,
 
3968
                                      sizeof (struct elf32_mn10300_link_hash_entry),
 
3969
                                      MN10300_ELF_DATA))
 
3970
    {
 
3971
      free (ret);
 
3972
      return NULL;
 
3973
    }
 
3974
 
 
3975
  ret->flags = 0;
 
3976
  amt = sizeof (struct elf_link_hash_table);
 
3977
  ret->static_hash_table = bfd_malloc (amt);
 
3978
  if (ret->static_hash_table == NULL)
 
3979
    {
 
3980
      free (ret);
 
3981
      return NULL;
 
3982
    }
 
3983
 
 
3984
  if (!_bfd_elf_link_hash_table_init (&ret->static_hash_table->root, abfd,
 
3985
                                      elf32_mn10300_link_hash_newfunc,
 
3986
                                      sizeof (struct elf32_mn10300_link_hash_entry),
 
3987
                                      MN10300_ELF_DATA))
 
3988
    {
 
3989
      free (ret->static_hash_table);
 
3990
      free (ret);
 
3991
      return NULL;
 
3992
    }
 
3993
  return & ret->root.root;
 
3994
}
 
3995
 
 
3996
/* Free an mn10300 ELF linker hash table.  */
 
3997
 
 
3998
static void
 
3999
elf32_mn10300_link_hash_table_free (struct bfd_link_hash_table *hash)
 
4000
{
 
4001
  struct elf32_mn10300_link_hash_table *ret
 
4002
    = (struct elf32_mn10300_link_hash_table *) hash;
 
4003
 
 
4004
  _bfd_generic_link_hash_table_free
 
4005
    ((struct bfd_link_hash_table *) ret->static_hash_table);
 
4006
  _bfd_generic_link_hash_table_free
 
4007
    ((struct bfd_link_hash_table *) ret);
 
4008
}
 
4009
 
 
4010
static unsigned long
 
4011
elf_mn10300_mach (flagword flags)
 
4012
{
 
4013
  switch (flags & EF_MN10300_MACH)
 
4014
    {
 
4015
    case E_MN10300_MACH_MN10300:
 
4016
    default:
 
4017
      return bfd_mach_mn10300;
 
4018
 
 
4019
    case E_MN10300_MACH_AM33:
 
4020
      return bfd_mach_am33;
 
4021
 
 
4022
    case E_MN10300_MACH_AM33_2:
 
4023
      return bfd_mach_am33_2;
 
4024
    }
 
4025
}
 
4026
 
 
4027
/* The final processing done just before writing out a MN10300 ELF object
 
4028
   file.  This gets the MN10300 architecture right based on the machine
 
4029
   number.  */
 
4030
 
 
4031
static void
 
4032
_bfd_mn10300_elf_final_write_processing (bfd *abfd,
 
4033
                                         bfd_boolean linker ATTRIBUTE_UNUSED)
 
4034
{
 
4035
  unsigned long val;
 
4036
 
 
4037
  switch (bfd_get_mach (abfd))
 
4038
    {
 
4039
    default:
 
4040
    case bfd_mach_mn10300:
 
4041
      val = E_MN10300_MACH_MN10300;
 
4042
      break;
 
4043
 
 
4044
    case bfd_mach_am33:
 
4045
      val = E_MN10300_MACH_AM33;
 
4046
      break;
 
4047
 
 
4048
    case bfd_mach_am33_2:
 
4049
      val = E_MN10300_MACH_AM33_2;
 
4050
      break;
 
4051
    }
 
4052
 
 
4053
  elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH);
 
4054
  elf_elfheader (abfd)->e_flags |= val;
 
4055
}
 
4056
 
 
4057
static bfd_boolean
 
4058
_bfd_mn10300_elf_object_p (bfd *abfd)
 
4059
{
 
4060
  bfd_default_set_arch_mach (abfd, bfd_arch_mn10300,
 
4061
                             elf_mn10300_mach (elf_elfheader (abfd)->e_flags));
 
4062
  return TRUE;
 
4063
}
 
4064
 
 
4065
/* Merge backend specific data from an object file to the output
 
4066
   object file when linking.  */
 
4067
 
 
4068
static bfd_boolean
 
4069
_bfd_mn10300_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
 
4070
{
 
4071
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
 
4072
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
 
4073
    return TRUE;
 
4074
 
 
4075
  if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
 
4076
      && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
 
4077
    {
 
4078
      if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
 
4079
                               bfd_get_mach (ibfd)))
 
4080
        return FALSE;
 
4081
    }
 
4082
 
 
4083
  return TRUE;
 
4084
}
 
4085
 
 
4086
#define PLT0_ENTRY_SIZE     15
 
4087
#define PLT_ENTRY_SIZE      20
 
4088
#define PIC_PLT_ENTRY_SIZE  24
 
4089
 
 
4090
static const bfd_byte elf_mn10300_plt0_entry[PLT0_ENTRY_SIZE] =
 
4091
{
 
4092
  0xfc, 0xa0, 0, 0, 0, 0,       /* mov  (.got+8),a0 */
 
4093
  0xfe, 0xe, 0x10, 0, 0, 0, 0,  /* mov  (.got+4),r1 */
 
4094
  0xf0, 0xf4,                   /* jmp  (a0) */
 
4095
};
 
4096
 
 
4097
static const bfd_byte elf_mn10300_plt_entry[PLT_ENTRY_SIZE] =
 
4098
{
 
4099
  0xfc, 0xa0, 0, 0, 0, 0,       /* mov  (nameN@GOT + .got),a0 */
 
4100
  0xf0, 0xf4,                   /* jmp  (a0) */
 
4101
  0xfe, 8, 0, 0, 0, 0, 0,       /* mov  reloc-table-address,r0 */
 
4102
  0xdc, 0, 0, 0, 0,             /* jmp  .plt0 */
 
4103
};
 
4104
 
 
4105
static const bfd_byte elf_mn10300_pic_plt_entry[PIC_PLT_ENTRY_SIZE] =
 
4106
{
 
4107
  0xfc, 0x22, 0, 0, 0, 0,       /* mov  (nameN@GOT,a2),a0 */
 
4108
  0xf0, 0xf4,                   /* jmp  (a0) */
 
4109
  0xfe, 8, 0, 0, 0, 0, 0,       /* mov  reloc-table-address,r0 */
 
4110
  0xf8, 0x22, 8,                /* mov  (8,a2),a0 */
 
4111
  0xfb, 0xa, 0x1a, 4,           /* mov  (4,a2),r1 */
 
4112
  0xf0, 0xf4,                   /* jmp  (a0) */
 
4113
};
 
4114
 
 
4115
/* Return size of the first PLT entry.  */
 
4116
#define elf_mn10300_sizeof_plt0(info) \
 
4117
  (info->shared ? PIC_PLT_ENTRY_SIZE : PLT0_ENTRY_SIZE)
 
4118
 
 
4119
/* Return size of a PLT entry.  */
 
4120
#define elf_mn10300_sizeof_plt(info) \
 
4121
  (info->shared ? PIC_PLT_ENTRY_SIZE : PLT_ENTRY_SIZE)
 
4122
 
 
4123
/* Return offset of the PLT0 address in an absolute PLT entry.  */
 
4124
#define elf_mn10300_plt_plt0_offset(info) 16
 
4125
 
 
4126
/* Return offset of the linker in PLT0 entry.  */
 
4127
#define elf_mn10300_plt0_linker_offset(info) 2
 
4128
 
 
4129
/* Return offset of the GOT id in PLT0 entry.  */
 
4130
#define elf_mn10300_plt0_gotid_offset(info) 9
 
4131
 
 
4132
/* Return offset of the temporary in PLT entry.  */
 
4133
#define elf_mn10300_plt_temp_offset(info) 8
 
4134
 
 
4135
/* Return offset of the symbol in PLT entry.  */
 
4136
#define elf_mn10300_plt_symbol_offset(info) 2
 
4137
 
 
4138
/* Return offset of the relocation in PLT entry.  */
 
4139
#define elf_mn10300_plt_reloc_offset(info) 11
 
4140
 
 
4141
/* The name of the dynamic interpreter.  This is put in the .interp
 
4142
   section.  */
 
4143
 
 
4144
#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
 
4145
 
 
4146
/* Create dynamic sections when linking against a dynamic object.  */
 
4147
 
 
4148
static bfd_boolean
 
4149
_bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 
4150
{
 
4151
  flagword   flags;
 
4152
  asection * s;
 
4153
  const struct elf_backend_data * bed = get_elf_backend_data (abfd);
 
4154
  int ptralign = 0;
 
4155
 
 
4156
  switch (bed->s->arch_size)
 
4157
    {
 
4158
    case 32:
 
4159
      ptralign = 2;
 
4160
      break;
 
4161
 
 
4162
    case 64:
 
4163
      ptralign = 3;
 
4164
      break;
 
4165
 
 
4166
    default:
 
4167
      bfd_set_error (bfd_error_bad_value);
 
4168
      return FALSE;
 
4169
    }
 
4170
 
 
4171
  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
 
4172
     .rel[a].bss sections.  */
 
4173
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
 
4174
           | SEC_LINKER_CREATED);
 
4175
 
 
4176
  s = bfd_make_section_with_flags (abfd,
 
4177
                                   (bed->default_use_rela_p
 
4178
                                    ? ".rela.plt" : ".rel.plt"),
 
4179
                                   flags | SEC_READONLY);
 
4180
  if (s == NULL
 
4181
      || ! bfd_set_section_alignment (abfd, s, ptralign))
 
4182
    return FALSE;
 
4183
 
 
4184
  if (! _bfd_mn10300_elf_create_got_section (abfd, info))
 
4185
    return FALSE;
 
4186
 
 
4187
  {
 
4188
    const char * secname;
 
4189
    char *       relname;
 
4190
    flagword     secflags;
 
4191
    asection *   sec;
 
4192
 
 
4193
    for (sec = abfd->sections; sec; sec = sec->next)
 
4194
      {
 
4195
        secflags = bfd_get_section_flags (abfd, sec);
 
4196
        if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
 
4197
            || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
 
4198
          continue;
 
4199
 
 
4200
        secname = bfd_get_section_name (abfd, sec);
 
4201
        relname = bfd_malloc (strlen (secname) + 6);
 
4202
        strcpy (relname, ".rela");
 
4203
        strcat (relname, secname);
 
4204
 
 
4205
        s = bfd_make_section_with_flags (abfd, relname,
 
4206
                                         flags | SEC_READONLY);
 
4207
        if (s == NULL
 
4208
            || ! bfd_set_section_alignment (abfd, s, ptralign))
 
4209
          return FALSE;
 
4210
      }
 
4211
  }
 
4212
 
 
4213
  if (bed->want_dynbss)
 
4214
    {
 
4215
      /* The .dynbss section is a place to put symbols which are defined
 
4216
         by dynamic objects, are referenced by regular objects, and are
 
4217
         not functions.  We must allocate space for them in the process
 
4218
         image and use a R_*_COPY reloc to tell the dynamic linker to
 
4219
         initialize them at run time.  The linker script puts the .dynbss
 
4220
         section into the .bss section of the final image.  */
 
4221
      s = bfd_make_section_with_flags (abfd, ".dynbss",
 
4222
                                       SEC_ALLOC | SEC_LINKER_CREATED);
 
4223
      if (s == NULL)
 
4224
        return FALSE;
 
4225
 
 
4226
      /* The .rel[a].bss section holds copy relocs.  This section is not
 
4227
         normally needed.  We need to create it here, though, so that the
 
4228
         linker will map it to an output section.  We can't just create it
 
4229
         only if we need it, because we will not know whether we need it
 
4230
         until we have seen all the input files, and the first time the
 
4231
         main linker code calls BFD after examining all the input files
 
4232
         (size_dynamic_sections) the input sections have already been
 
4233
         mapped to the output sections.  If the section turns out not to
 
4234
         be needed, we can discard it later.  We will never need this
 
4235
         section when generating a shared object, since they do not use
 
4236
         copy relocs.  */
 
4237
      if (! info->shared)
 
4238
        {
 
4239
          s = bfd_make_section_with_flags (abfd,
 
4240
                                           (bed->default_use_rela_p
 
4241
                                            ? ".rela.bss" : ".rel.bss"),
 
4242
                                           flags | SEC_READONLY);
 
4243
          if (s == NULL
 
4244
              || ! bfd_set_section_alignment (abfd, s, ptralign))
 
4245
            return FALSE;
 
4246
        }
 
4247
    }
 
4248
 
 
4249
  return TRUE;
 
4250
}
 
4251
 
 
4252
/* Adjust a symbol defined by a dynamic object and referenced by a
 
4253
   regular object.  The current definition is in some section of the
 
4254
   dynamic object, but we're not including those sections.  We have to
 
4255
   change the definition to something the rest of the link can
 
4256
   understand.  */
 
4257
 
 
4258
static bfd_boolean
 
4259
_bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
 
4260
                                        struct elf_link_hash_entry * h)
 
4261
{
 
4262
  bfd * dynobj;
 
4263
  asection * s;
 
4264
 
 
4265
  dynobj = elf_hash_table (info)->dynobj;
 
4266
 
 
4267
  /* Make sure we know what is going on here.  */
 
4268
  BFD_ASSERT (dynobj != NULL
 
4269
              && (h->needs_plt
 
4270
                  || h->u.weakdef != NULL
 
4271
                  || (h->def_dynamic
 
4272
                      && h->ref_regular
 
4273
                      && !h->def_regular)));
 
4274
 
 
4275
  /* If this is a function, put it in the procedure linkage table.  We
 
4276
     will fill in the contents of the procedure linkage table later,
 
4277
     when we know the address of the .got section.  */
 
4278
  if (h->type == STT_FUNC
 
4279
      || h->needs_plt)
 
4280
    {
 
4281
      if (! info->shared
 
4282
          && !h->def_dynamic
 
4283
          && !h->ref_dynamic)
 
4284
        {
 
4285
          /* This case can occur if we saw a PLT reloc in an input
 
4286
             file, but the symbol was never referred to by a dynamic
 
4287
             object.  In such a case, we don't actually need to build
 
4288
             a procedure linkage table, and we can just do a REL32
 
4289
             reloc instead.  */
 
4290
          BFD_ASSERT (h->needs_plt);
 
4291
          return TRUE;
 
4292
        }
 
4293
 
 
4294
      /* Make sure this symbol is output as a dynamic symbol.  */
 
4295
      if (h->dynindx == -1)
 
4296
        {
 
4297
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
 
4298
            return FALSE;
 
4299
        }
 
4300
 
 
4301
      s = bfd_get_section_by_name (dynobj, ".plt");
 
4302
      BFD_ASSERT (s != NULL);
 
4303
 
 
4304
      /* If this is the first .plt entry, make room for the special
 
4305
         first entry.  */
 
4306
      if (s->size == 0)
 
4307
        s->size += elf_mn10300_sizeof_plt0 (info);
 
4308
 
 
4309
      /* If this symbol is not defined in a regular file, and we are
 
4310
         not generating a shared library, then set the symbol to this
 
4311
         location in the .plt.  This is required to make function
 
4312
         pointers compare as equal between the normal executable and
 
4313
         the shared library.  */
 
4314
      if (! info->shared
 
4315
          && !h->def_regular)
 
4316
        {
 
4317
          h->root.u.def.section = s;
 
4318
          h->root.u.def.value = s->size;
 
4319
        }
 
4320
 
 
4321
      h->plt.offset = s->size;
 
4322
 
 
4323
      /* Make room for this entry.  */
 
4324
      s->size += elf_mn10300_sizeof_plt (info);
 
4325
 
 
4326
      /* We also need to make an entry in the .got.plt section, which
 
4327
         will be placed in the .got section by the linker script.  */
 
4328
      s = bfd_get_section_by_name (dynobj, ".got.plt");
 
4329
      BFD_ASSERT (s != NULL);
 
4330
      s->size += 4;
 
4331
 
 
4332
      /* We also need to make an entry in the .rela.plt section.  */
 
4333
      s = bfd_get_section_by_name (dynobj, ".rela.plt");
 
4334
      BFD_ASSERT (s != NULL);
 
4335
      s->size += sizeof (Elf32_External_Rela);
 
4336
 
 
4337
      return TRUE;
 
4338
    }
 
4339
 
 
4340
  /* If this is a weak symbol, and there is a real definition, the
 
4341
     processor independent code will have arranged for us to see the
 
4342
     real definition first, and we can just use the same value.  */
 
4343
  if (h->u.weakdef != NULL)
 
4344
    {
 
4345
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
 
4346
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
 
4347
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
 
4348
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
 
4349
      return TRUE;
 
4350
    }
 
4351
 
 
4352
  /* This is a reference to a symbol defined by a dynamic object which
 
4353
     is not a function.  */
 
4354
 
 
4355
  /* If we are creating a shared library, we must presume that the
 
4356
     only references to the symbol are via the global offset table.
 
4357
     For such cases we need not do anything here; the relocations will
 
4358
     be handled correctly by relocate_section.  */
 
4359
  if (info->shared)
 
4360
    return TRUE;
 
4361
 
 
4362
  /* If there are no references to this symbol that do not use the
 
4363
     GOT, we don't need to generate a copy reloc.  */
 
4364
  if (!h->non_got_ref)
 
4365
    return TRUE;
 
4366
 
 
4367
  if (h->size == 0)
 
4368
    {
 
4369
      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
 
4370
                             h->root.root.string);
 
4371
      return TRUE;
 
4372
    }
 
4373
 
 
4374
  /* We must allocate the symbol in our .dynbss section, which will
 
4375
     become part of the .bss section of the executable.  There will be
 
4376
     an entry for this symbol in the .dynsym section.  The dynamic
 
4377
     object will contain position independent code, so all references
 
4378
     from the dynamic object to this symbol will go through the global
 
4379
     offset table.  The dynamic linker will use the .dynsym entry to
 
4380
     determine the address it must put in the global offset table, so
 
4381
     both the dynamic object and the regular object will refer to the
 
4382
     same memory location for the variable.  */
 
4383
 
 
4384
  s = bfd_get_section_by_name (dynobj, ".dynbss");
 
4385
  BFD_ASSERT (s != NULL);
 
4386
 
 
4387
  /* We must generate a R_MN10300_COPY reloc to tell the dynamic linker to
 
4388
     copy the initial value out of the dynamic object and into the
 
4389
     runtime process image.  We need to remember the offset into the
 
4390
     .rela.bss section we are going to use.  */
 
4391
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
 
4392
    {
 
4393
      asection * srel;
 
4394
 
 
4395
      srel = bfd_get_section_by_name (dynobj, ".rela.bss");
 
4396
      BFD_ASSERT (srel != NULL);
 
4397
      srel->size += sizeof (Elf32_External_Rela);
 
4398
      h->needs_copy = 1;
 
4399
    }
 
4400
 
 
4401
  return _bfd_elf_adjust_dynamic_copy (h, s);
 
4402
}
 
4403
 
 
4404
/* Set the sizes of the dynamic sections.  */
 
4405
 
 
4406
static bfd_boolean
 
4407
_bfd_mn10300_elf_size_dynamic_sections (bfd * output_bfd,
 
4408
                                        struct bfd_link_info * info)
 
4409
{
 
4410
  bfd * dynobj;
 
4411
  asection * s;
 
4412
  bfd_boolean plt;
 
4413
  bfd_boolean relocs;
 
4414
  bfd_boolean reltext;
 
4415
 
 
4416
  dynobj = elf_hash_table (info)->dynobj;
 
4417
  BFD_ASSERT (dynobj != NULL);
 
4418
 
 
4419
  if (elf_hash_table (info)->dynamic_sections_created)
 
4420
    {
 
4421
      /* Set the contents of the .interp section to the interpreter.  */
 
4422
      if (info->executable)
 
4423
        {
 
4424
          s = bfd_get_section_by_name (dynobj, ".interp");
 
4425
          BFD_ASSERT (s != NULL);
 
4426
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
 
4427
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
 
4428
        }
 
4429
    }
 
4430
  else
 
4431
    {
 
4432
      /* We may have created entries in the .rela.got section.
 
4433
         However, if we are not creating the dynamic sections, we will
 
4434
         not actually use these entries.  Reset the size of .rela.got,
 
4435
         which will cause it to get stripped from the output file
 
4436
         below.  */
 
4437
      s = bfd_get_section_by_name (dynobj, ".rela.got");
 
4438
      if (s != NULL)
 
4439
        s->size = 0;
 
4440
    }
 
4441
 
 
4442
  /* The check_relocs and adjust_dynamic_symbol entry points have
 
4443
     determined the sizes of the various dynamic sections.  Allocate
 
4444
     memory for them.  */
 
4445
  plt = FALSE;
 
4446
  relocs = FALSE;
 
4447
  reltext = FALSE;
 
4448
  for (s = dynobj->sections; s != NULL; s = s->next)
 
4449
    {
 
4450
      const char * name;
 
4451
 
 
4452
      if ((s->flags & SEC_LINKER_CREATED) == 0)
 
4453
        continue;
 
4454
 
 
4455
      /* It's OK to base decisions on the section name, because none
 
4456
         of the dynobj section names depend upon the input files.  */
 
4457
      name = bfd_get_section_name (dynobj, s);
 
4458
 
 
4459
      if (streq (name, ".plt"))
 
4460
        {
 
4461
          /* Remember whether there is a PLT.  */
 
4462
          plt = s->size != 0;
 
4463
        }
 
4464
      else if (CONST_STRNEQ (name, ".rela"))
 
4465
        {
 
4466
          if (s->size != 0)
 
4467
            {
 
4468
              asection * target;
 
4469
 
 
4470
              /* Remember whether there are any reloc sections other
 
4471
                 than .rela.plt.  */
 
4472
              if (! streq (name, ".rela.plt"))
 
4473
                {
 
4474
                  const char * outname;
 
4475
 
 
4476
                  relocs = TRUE;
 
4477
 
 
4478
                  /* If this relocation section applies to a read only
 
4479
                     section, then we probably need a DT_TEXTREL
 
4480
                     entry.  The entries in the .rela.plt section
 
4481
                     really apply to the .got section, which we
 
4482
                     created ourselves and so know is not readonly.  */
 
4483
                  outname = bfd_get_section_name (output_bfd,
 
4484
                                                  s->output_section);
 
4485
                  target = bfd_get_section_by_name (output_bfd, outname + 5);
 
4486
                  if (target != NULL
 
4487
                      && (target->flags & SEC_READONLY) != 0
 
4488
                      && (target->flags & SEC_ALLOC) != 0)
 
4489
                    reltext = TRUE;
 
4490
                }
 
4491
 
 
4492
              /* We use the reloc_count field as a counter if we need
 
4493
                 to copy relocs into the output file.  */
 
4494
              s->reloc_count = 0;
 
4495
            }
 
4496
        }
 
4497
      else if (! CONST_STRNEQ (name, ".got")
 
4498
               && ! streq (name, ".dynbss"))
 
4499
        /* It's not one of our sections, so don't allocate space.  */
 
4500
        continue;
 
4501
 
 
4502
      if (s->size == 0)
 
4503
        {
 
4504
          /* If we don't need this section, strip it from the
 
4505
             output file.  This is mostly to handle .rela.bss and
 
4506
             .rela.plt.  We must create both sections in
 
4507
             create_dynamic_sections, because they must be created
 
4508
             before the linker maps input sections to output
 
4509
             sections.  The linker does that before
 
4510
             adjust_dynamic_symbol is called, and it is that
 
4511
             function which decides whether anything needs to go
 
4512
             into these sections.  */
 
4513
          s->flags |= SEC_EXCLUDE;
 
4514
          continue;
 
4515
        }
 
4516
 
 
4517
        if ((s->flags & SEC_HAS_CONTENTS) == 0)
 
4518
          continue;
 
4519
 
 
4520
      /* Allocate memory for the section contents.  We use bfd_zalloc
 
4521
         here in case unused entries are not reclaimed before the
 
4522
         section's contents are written out.  This should not happen,
 
4523
         but this way if it does, we get a R_MN10300_NONE reloc
 
4524
         instead of garbage.  */
 
4525
      s->contents = bfd_zalloc (dynobj, s->size);
 
4526
      if (s->contents == NULL)
 
4527
        return FALSE;
 
4528
    }
 
4529
 
 
4530
  if (elf_hash_table (info)->dynamic_sections_created)
 
4531
    {
 
4532
      /* Add some entries to the .dynamic section.  We fill in the
 
4533
         values later, in _bfd_mn10300_elf_finish_dynamic_sections,
 
4534
         but we must add the entries now so that we get the correct
 
4535
         size for the .dynamic section.  The DT_DEBUG entry is filled
 
4536
         in by the dynamic linker and used by the debugger.  */
 
4537
      if (! info->shared)
 
4538
        {
 
4539
          if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0))
 
4540
            return FALSE;
 
4541
        }
 
4542
 
 
4543
      if (plt)
 
4544
        {
 
4545
          if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)
 
4546
              || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
 
4547
              || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
 
4548
              || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
 
4549
            return FALSE;
 
4550
        }
 
4551
 
 
4552
      if (relocs)
 
4553
        {
 
4554
          if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
 
4555
              || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
 
4556
              || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
 
4557
                                              sizeof (Elf32_External_Rela)))
 
4558
            return FALSE;
 
4559
        }
 
4560
 
 
4561
      if (reltext)
 
4562
        {
 
4563
          if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0))
 
4564
            return FALSE;
 
4565
        }
 
4566
    }
 
4567
 
 
4568
  return TRUE;
 
4569
}
 
4570
 
 
4571
/* Finish up dynamic symbol handling.  We set the contents of various
 
4572
   dynamic sections here.  */
 
4573
 
 
4574
static bfd_boolean
 
4575
_bfd_mn10300_elf_finish_dynamic_symbol (bfd * output_bfd,
 
4576
                                        struct bfd_link_info * info,
 
4577
                                        struct elf_link_hash_entry * h,
 
4578
                                        Elf_Internal_Sym * sym)
 
4579
{
 
4580
  bfd * dynobj;
 
4581
 
 
4582
  dynobj = elf_hash_table (info)->dynobj;
 
4583
 
 
4584
  if (h->plt.offset != (bfd_vma) -1)
 
4585
    {
 
4586
      asection *        splt;
 
4587
      asection *        sgot;
 
4588
      asection *        srel;
 
4589
      bfd_vma           plt_index;
 
4590
      bfd_vma           got_offset;
 
4591
      Elf_Internal_Rela rel;
 
4592
 
 
4593
      /* This symbol has an entry in the procedure linkage table.  Set
 
4594
         it up.  */
 
4595
 
 
4596
      BFD_ASSERT (h->dynindx != -1);
 
4597
 
 
4598
      splt = bfd_get_section_by_name (dynobj, ".plt");
 
4599
      sgot = bfd_get_section_by_name (dynobj, ".got.plt");
 
4600
      srel = bfd_get_section_by_name (dynobj, ".rela.plt");
 
4601
      BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
 
4602
 
 
4603
      /* Get the index in the procedure linkage table which
 
4604
         corresponds to this symbol.  This is the index of this symbol
 
4605
         in all the symbols for which we are making plt entries.  The
 
4606
         first entry in the procedure linkage table is reserved.  */
 
4607
      plt_index = ((h->plt.offset - elf_mn10300_sizeof_plt0 (info))
 
4608
                   / elf_mn10300_sizeof_plt (info));
 
4609
 
 
4610
      /* Get the offset into the .got table of the entry that
 
4611
         corresponds to this function.  Each .got entry is 4 bytes.
 
4612
         The first three are reserved.  */
 
4613
      got_offset = (plt_index + 3) * 4;
 
4614
 
 
4615
      /* Fill in the entry in the procedure linkage table.  */
 
4616
      if (! info->shared)
 
4617
        {
 
4618
          memcpy (splt->contents + h->plt.offset, elf_mn10300_plt_entry,
 
4619
                  elf_mn10300_sizeof_plt (info));
 
4620
          bfd_put_32 (output_bfd,
 
4621
                      (sgot->output_section->vma
 
4622
                       + sgot->output_offset
 
4623
                       + got_offset),
 
4624
                      (splt->contents + h->plt.offset
 
4625
                       + elf_mn10300_plt_symbol_offset (info)));
 
4626
 
 
4627
          bfd_put_32 (output_bfd,
 
4628
                      (1 - h->plt.offset - elf_mn10300_plt_plt0_offset (info)),
 
4629
                      (splt->contents + h->plt.offset
 
4630
                       + elf_mn10300_plt_plt0_offset (info)));
 
4631
        }
 
4632
      else
 
4633
        {
 
4634
          memcpy (splt->contents + h->plt.offset, elf_mn10300_pic_plt_entry,
 
4635
                  elf_mn10300_sizeof_plt (info));
 
4636
 
 
4637
          bfd_put_32 (output_bfd, got_offset,
 
4638
                      (splt->contents + h->plt.offset
 
4639
                       + elf_mn10300_plt_symbol_offset (info)));
 
4640
        }
 
4641
 
 
4642
      bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
 
4643
                  (splt->contents + h->plt.offset
 
4644
                   + elf_mn10300_plt_reloc_offset (info)));
 
4645
 
 
4646
      /* Fill in the entry in the global offset table.  */
 
4647
      bfd_put_32 (output_bfd,
 
4648
                  (splt->output_section->vma
 
4649
                   + splt->output_offset
 
4650
                   + h->plt.offset
 
4651
                   + elf_mn10300_plt_temp_offset (info)),
 
4652
                  sgot->contents + got_offset);
 
4653
 
 
4654
      /* Fill in the entry in the .rela.plt section.  */
 
4655
      rel.r_offset = (sgot->output_section->vma
 
4656
                      + sgot->output_offset
 
4657
                      + got_offset);
 
4658
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_JMP_SLOT);
 
4659
      rel.r_addend = 0;
 
4660
      bfd_elf32_swap_reloca_out (output_bfd, &rel,
 
4661
                                 (bfd_byte *) ((Elf32_External_Rela *) srel->contents
 
4662
                                               + plt_index));
 
4663
 
 
4664
      if (!h->def_regular)
 
4665
        /* Mark the symbol as undefined, rather than as defined in
 
4666
           the .plt section.  Leave the value alone.  */
 
4667
        sym->st_shndx = SHN_UNDEF;
 
4668
    }
 
4669
 
 
4670
  if (h->got.offset != (bfd_vma) -1)
 
4671
    {
 
4672
      asection *        sgot;
 
4673
      asection *        srel;
 
4674
      Elf_Internal_Rela rel;
 
4675
 
 
4676
      /* This symbol has an entry in the global offset table.  Set it up.  */
 
4677
      sgot = bfd_get_section_by_name (dynobj, ".got");
 
4678
      srel = bfd_get_section_by_name (dynobj, ".rela.got");
 
4679
      BFD_ASSERT (sgot != NULL && srel != NULL);
 
4680
 
 
4681
      rel.r_offset = (sgot->output_section->vma
 
4682
                      + sgot->output_offset
 
4683
                      + (h->got.offset & ~1));
 
4684
 
 
4685
      /* If this is a -Bsymbolic link, and the symbol is defined
 
4686
         locally, we just want to emit a RELATIVE reloc.  Likewise if
 
4687
         the symbol was forced to be local because of a version file.
 
4688
         The entry in the global offset table will already have been
 
4689
         initialized in the relocate_section function.  */
 
4690
      if (info->shared
 
4691
          && (info->symbolic || h->dynindx == -1)
 
4692
          && h->def_regular)
 
4693
        {
 
4694
          rel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
 
4695
          rel.r_addend = (h->root.u.def.value
 
4696
                          + h->root.u.def.section->output_section->vma
 
4697
                          + h->root.u.def.section->output_offset);
 
4698
        }
 
4699
      else
 
4700
        {
 
4701
          bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
 
4702
          rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_GLOB_DAT);
 
4703
          rel.r_addend = 0;
 
4704
        }
 
4705
 
 
4706
      bfd_elf32_swap_reloca_out (output_bfd, &rel,
 
4707
                                 (bfd_byte *) ((Elf32_External_Rela *) srel->contents
 
4708
                                               + srel->reloc_count));
 
4709
      ++ srel->reloc_count;
 
4710
    }
 
4711
 
 
4712
  if (h->needs_copy)
 
4713
    {
 
4714
      asection *        s;
 
4715
      Elf_Internal_Rela rel;
 
4716
 
 
4717
      /* This symbol needs a copy reloc.  Set it up.  */
 
4718
      BFD_ASSERT (h->dynindx != -1
 
4719
                  && (h->root.type == bfd_link_hash_defined
 
4720
                      || h->root.type == bfd_link_hash_defweak));
 
4721
 
 
4722
      s = bfd_get_section_by_name (h->root.u.def.section->owner,
 
4723
                                   ".rela.bss");
 
4724
      BFD_ASSERT (s != NULL);
 
4725
 
 
4726
      rel.r_offset = (h->root.u.def.value
 
4727
                      + h->root.u.def.section->output_section->vma
 
4728
                      + h->root.u.def.section->output_offset);
 
4729
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_COPY);
 
4730
      rel.r_addend = 0;
 
4731
      bfd_elf32_swap_reloca_out (output_bfd, & rel,
 
4732
                                 (bfd_byte *) ((Elf32_External_Rela *) s->contents
 
4733
                                               + s->reloc_count));
 
4734
      ++ s->reloc_count;
 
4735
    }
 
4736
 
 
4737
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
 
4738
  if (streq (h->root.root.string, "_DYNAMIC")
 
4739
      || h == elf_hash_table (info)->hgot)
 
4740
    sym->st_shndx = SHN_ABS;
 
4741
 
 
4742
  return TRUE;
 
4743
}
 
4744
 
 
4745
/* Finish up the dynamic sections.  */
 
4746
 
 
4747
static bfd_boolean
 
4748
_bfd_mn10300_elf_finish_dynamic_sections (bfd * output_bfd,
 
4749
                                          struct bfd_link_info * info)
 
4750
{
 
4751
  bfd *      dynobj;
 
4752
  asection * sgot;
 
4753
  asection * sdyn;
 
4754
 
 
4755
  dynobj = elf_hash_table (info)->dynobj;
 
4756
 
 
4757
  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
 
4758
  BFD_ASSERT (sgot != NULL);
 
4759
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
 
4760
 
 
4761
  if (elf_hash_table (info)->dynamic_sections_created)
 
4762
    {
 
4763
      asection *           splt;
 
4764
      Elf32_External_Dyn * dyncon;
 
4765
      Elf32_External_Dyn * dynconend;
 
4766
 
 
4767
      BFD_ASSERT (sdyn != NULL);
 
4768
 
 
4769
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
 
4770
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
 
4771
 
 
4772
      for (; dyncon < dynconend; dyncon++)
 
4773
        {
 
4774
          Elf_Internal_Dyn dyn;
 
4775
          const char * name;
 
4776
          asection * s;
 
4777
 
 
4778
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
 
4779
 
 
4780
          switch (dyn.d_tag)
 
4781
            {
 
4782
            default:
 
4783
              break;
 
4784
 
 
4785
            case DT_PLTGOT:
 
4786
              name = ".got";
 
4787
              goto get_vma;
 
4788
 
 
4789
            case DT_JMPREL:
 
4790
              name = ".rela.plt";
 
4791
            get_vma:
 
4792
              s = bfd_get_section_by_name (output_bfd, name);
 
4793
              BFD_ASSERT (s != NULL);
 
4794
              dyn.d_un.d_ptr = s->vma;
 
4795
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
 
4796
              break;
 
4797
 
 
4798
            case DT_PLTRELSZ:
 
4799
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
 
4800
              BFD_ASSERT (s != NULL);
 
4801
              dyn.d_un.d_val = s->size;
 
4802
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
 
4803
              break;
 
4804
 
 
4805
            case DT_RELASZ:
 
4806
              /* My reading of the SVR4 ABI indicates that the
 
4807
                 procedure linkage table relocs (DT_JMPREL) should be
 
4808
                 included in the overall relocs (DT_RELA).  This is
 
4809
                 what Solaris does.  However, UnixWare can not handle
 
4810
                 that case.  Therefore, we override the DT_RELASZ entry
 
4811
                 here to make it not include the JMPREL relocs.  Since
 
4812
                 the linker script arranges for .rela.plt to follow all
 
4813
                 other relocation sections, we don't have to worry
 
4814
                 about changing the DT_RELA entry.  */
 
4815
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
 
4816
              if (s != NULL)
 
4817
                dyn.d_un.d_val -= s->size;
 
4818
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
 
4819
              break;
 
4820
            }
 
4821
        }
 
4822
 
 
4823
      /* Fill in the first entry in the procedure linkage table.  */
 
4824
      splt = bfd_get_section_by_name (dynobj, ".plt");
 
4825
      if (splt && splt->size > 0)
 
4826
        {
 
4827
          if (info->shared)
 
4828
            {
 
4829
              memcpy (splt->contents, elf_mn10300_pic_plt_entry,
 
4830
                      elf_mn10300_sizeof_plt (info));
 
4831
            }
 
4832
          else
 
4833
            {
 
4834
              memcpy (splt->contents, elf_mn10300_plt0_entry, PLT0_ENTRY_SIZE);
 
4835
              bfd_put_32 (output_bfd,
 
4836
                          sgot->output_section->vma + sgot->output_offset + 4,
 
4837
                          splt->contents + elf_mn10300_plt0_gotid_offset (info));
 
4838
              bfd_put_32 (output_bfd,
 
4839
                          sgot->output_section->vma + sgot->output_offset + 8,
 
4840
                          splt->contents + elf_mn10300_plt0_linker_offset (info));
 
4841
            }
 
4842
 
 
4843
          /* UnixWare sets the entsize of .plt to 4, although that doesn't
 
4844
             really seem like the right value.  */
 
4845
          elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
 
4846
        }
 
4847
    }
 
4848
 
 
4849
  /* Fill in the first three entries in the global offset table.  */
 
4850
  if (sgot->size > 0)
 
4851
    {
 
4852
      if (sdyn == NULL)
 
4853
        bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
 
4854
      else
 
4855
        bfd_put_32 (output_bfd,
 
4856
                    sdyn->output_section->vma + sdyn->output_offset,
 
4857
                    sgot->contents);
 
4858
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
 
4859
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
 
4860
    }
 
4861
 
 
4862
  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
 
4863
 
 
4864
  return TRUE;
 
4865
}
 
4866
 
 
4867
/* Classify relocation types, such that combreloc can sort them
 
4868
   properly.  */
 
4869
 
 
4870
static enum elf_reloc_type_class
 
4871
_bfd_mn10300_elf_reloc_type_class (const Elf_Internal_Rela *rela)
 
4872
{
 
4873
  switch ((int) ELF32_R_TYPE (rela->r_info))
 
4874
    {
 
4875
    case R_MN10300_RELATIVE:    return reloc_class_relative;
 
4876
    case R_MN10300_JMP_SLOT:    return reloc_class_plt;
 
4877
    case R_MN10300_COPY:        return reloc_class_copy;
 
4878
    default:                    return reloc_class_normal;
 
4879
    }
 
4880
}
 
4881
 
 
4882
/* Allocate space for an MN10300 extension to the bfd elf data structure.  */
 
4883
 
 
4884
static bfd_boolean
 
4885
mn10300_elf_mkobject (bfd *abfd)
 
4886
{
 
4887
  /* We do not actually need any extra room in the bfd elf data structure.
 
4888
     But we do need the object_id of the structure to be set to
 
4889
     MN10300_ELF_DATA so that elflink.c:elf_link_add_object_symols() will call
 
4890
     our mn10300_elf_check_relocs function which will then allocate space in
 
4891
     the .got section for any GOT based relocs.  */
 
4892
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
 
4893
                                  MN10300_ELF_DATA);
 
4894
}
 
4895
 
 
4896
#define bfd_elf32_mkobject      mn10300_elf_mkobject
 
4897
 
 
4898
#ifndef ELF_ARCH
 
4899
#define TARGET_LITTLE_SYM       bfd_elf32_mn10300_vec
 
4900
#define TARGET_LITTLE_NAME      "elf32-mn10300"
 
4901
#define ELF_ARCH                bfd_arch_mn10300
 
4902
#define ELF_TARGET_ID           MN10300_ELF_DATA
 
4903
#define ELF_MACHINE_CODE        EM_MN10300
 
4904
#define ELF_MACHINE_ALT1        EM_CYGNUS_MN10300
 
4905
#define ELF_MAXPAGESIZE         0x1000
 
4906
#endif
 
4907
 
 
4908
#define elf_info_to_howto               mn10300_info_to_howto
 
4909
#define elf_info_to_howto_rel           0
 
4910
#define elf_backend_can_gc_sections     1
 
4911
#define elf_backend_rela_normal         1
 
4912
#define elf_backend_check_relocs        mn10300_elf_check_relocs
 
4913
#define elf_backend_gc_mark_hook        mn10300_elf_gc_mark_hook
 
4914
#define elf_backend_relocate_section    mn10300_elf_relocate_section
 
4915
#define bfd_elf32_bfd_relax_section     mn10300_elf_relax_section
 
4916
#define bfd_elf32_bfd_get_relocated_section_contents \
 
4917
                                mn10300_elf_get_relocated_section_contents
 
4918
#define bfd_elf32_bfd_link_hash_table_create \
 
4919
                                elf32_mn10300_link_hash_table_create
 
4920
#define bfd_elf32_bfd_link_hash_table_free \
 
4921
                                elf32_mn10300_link_hash_table_free
 
4922
 
 
4923
#ifndef elf_symbol_leading_char
 
4924
#define elf_symbol_leading_char '_'
 
4925
#endif
 
4926
 
 
4927
/* So we can set bits in e_flags.  */
 
4928
#define elf_backend_final_write_processing \
 
4929
                                        _bfd_mn10300_elf_final_write_processing
 
4930
#define elf_backend_object_p            _bfd_mn10300_elf_object_p
 
4931
 
 
4932
#define bfd_elf32_bfd_merge_private_bfd_data \
 
4933
                                        _bfd_mn10300_elf_merge_private_bfd_data
 
4934
 
 
4935
#define elf_backend_can_gc_sections     1
 
4936
#define elf_backend_create_dynamic_sections \
 
4937
  _bfd_mn10300_elf_create_dynamic_sections
 
4938
#define elf_backend_adjust_dynamic_symbol \
 
4939
  _bfd_mn10300_elf_adjust_dynamic_symbol
 
4940
#define elf_backend_size_dynamic_sections \
 
4941
  _bfd_mn10300_elf_size_dynamic_sections
 
4942
#define elf_backend_omit_section_dynsym \
 
4943
  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
 
4944
#define elf_backend_finish_dynamic_symbol \
 
4945
  _bfd_mn10300_elf_finish_dynamic_symbol
 
4946
#define elf_backend_finish_dynamic_sections \
 
4947
  _bfd_mn10300_elf_finish_dynamic_sections
 
4948
 
 
4949
#define elf_backend_reloc_type_class \
 
4950
  _bfd_mn10300_elf_reloc_type_class
 
4951
 
 
4952
#define elf_backend_want_got_plt        1
 
4953
#define elf_backend_plt_readonly        1
 
4954
#define elf_backend_want_plt_sym        0
 
4955
#define elf_backend_got_header_size     12
 
4956
 
 
4957
#include "elf32-target.h"