Coverage Report

Created: 2026-07-25 10:20

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