Coverage Report

Created: 2026-05-11 07:54

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
19
{
807
19
  unsigned int r_type;
808
809
19
  r_type = ELF32_R_TYPE (dst->r_info);
810
19
  if (r_type >= R_MN10300_MAX)
811
4
    {
812
      /* xgettext:c-format */
813
4
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
814
4
        abfd, r_type);
815
4
      bfd_set_error (bfd_error_bad_value);
816
4
      return false;
817
4
    }
818
15
  cache_ptr->howto = elf_mn10300_howto_table + r_type;
819
15
  return true;
820
19
}
Unexecuted instantiation: elf-m10300.c:mn10300_info_to_howto
elf32-am33lin.c:mn10300_info_to_howto
Line
Count
Source
806
19
{
807
19
  unsigned int r_type;
808
809
19
  r_type = ELF32_R_TYPE (dst->r_info);
810
19
  if (r_type >= R_MN10300_MAX)
811
4
    {
812
      /* xgettext:c-format */
813
4
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
814
4
        abfd, r_type);
815
4
      bfd_set_error (bfd_error_bad_value);
816
4
      return false;
817
4
    }
818
15
  cache_ptr->howto = elf_mn10300_howto_table + r_type;
819
  return true;
820
19
}
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 (bfd *output_bfd,
1963
            struct bfd_link_info *info,
1964
            bfd *input_bfd,
1965
            asection *input_section,
1966
            bfd_byte *contents,
1967
            Elf_Internal_Rela *relocs,
1968
            Elf_Internal_Sym *local_syms,
1969
            asection **local_sections)
1970
0
{
1971
0
  Elf_Internal_Shdr *symtab_hdr;
1972
0
  struct elf_link_hash_entry **sym_hashes;
1973
0
  Elf_Internal_Rela *rel, *relend;
1974
0
  Elf_Internal_Rela * trel;
1975
1976
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
1977
0
  sym_hashes = elf_sym_hashes (input_bfd);
1978
1979
0
  rel = relocs;
1980
0
  relend = relocs + input_section->reloc_count;
1981
0
  for (; rel < relend; rel++)
1982
0
    {
1983
0
      int r_type;
1984
0
      reloc_howto_type *howto;
1985
0
      unsigned long r_symndx;
1986
0
      Elf_Internal_Sym *sym;
1987
0
      asection *sec;
1988
0
      struct elf32_mn10300_link_hash_entry *h;
1989
0
      bfd_vma relocation;
1990
0
      bfd_reloc_status_type r;
1991
0
      int tls_r_type;
1992
0
      bool unresolved_reloc = false;
1993
0
      bool warned, ignored;
1994
0
      struct elf_link_hash_entry * hh;
1995
1996
0
      relocation = 0;
1997
0
      r_symndx = ELF32_R_SYM (rel->r_info);
1998
0
      r_type = ELF32_R_TYPE (rel->r_info);
1999
0
      howto = elf_mn10300_howto_table + r_type;
2000
2001
      /* Just skip the vtable gc relocs.  */
2002
0
      if (r_type == R_MN10300_GNU_VTINHERIT
2003
0
    || r_type == R_MN10300_GNU_VTENTRY)
2004
0
  continue;
2005
2006
0
      h = NULL;
2007
0
      sym = NULL;
2008
0
      sec = NULL;
2009
0
      if (r_symndx < symtab_hdr->sh_info)
2010
0
  hh = NULL;
2011
0
      else
2012
0
  {
2013
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2014
0
           r_symndx, symtab_hdr, sym_hashes,
2015
0
           hh, sec, relocation,
2016
0
           unresolved_reloc, warned, ignored);
2017
0
  }
2018
0
      h = elf_mn10300_hash_entry (hh);
2019
2020
0
      tls_r_type = elf_mn10300_tls_transition (info, r_type, hh, input_section, 0);
2021
0
      if (tls_r_type != r_type)
2022
0
  {
2023
0
    bool had_plt;
2024
2025
0
    had_plt = mn10300_do_tls_transition (input_bfd, r_type, tls_r_type,
2026
0
                 contents, rel->r_offset);
2027
0
    r_type = tls_r_type;
2028
0
    howto = elf_mn10300_howto_table + r_type;
2029
2030
0
    if (had_plt)
2031
0
      for (trel = rel+1; trel < relend; trel++)
2032
0
        if ((ELF32_R_TYPE (trel->r_info) == R_MN10300_PLT32
2033
0
       || ELF32_R_TYPE (trel->r_info) == R_MN10300_PCREL32)
2034
0
      && rel->r_offset + had_plt == trel->r_offset)
2035
0
    trel->r_info = ELF32_R_INFO (0, R_MN10300_NONE);
2036
0
  }
2037
2038
0
      if (r_symndx < symtab_hdr->sh_info)
2039
0
  {
2040
0
    sym = local_syms + r_symndx;
2041
0
    sec = local_sections[r_symndx];
2042
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, 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 (output_bfd, info, input_section,
2084
0
                 rel->r_offset) != (bfd_vma) -1)
2085
2086
0
      _bfd_error_handler
2087
        /* xgettext:c-format */
2088
0
        (_("%pB(%pA+%#" PRIx64 "): "
2089
0
     "unresolvable %s relocation against symbol `%s'"),
2090
0
         input_bfd,
2091
0
         input_section,
2092
0
         (uint64_t) rel->r_offset,
2093
0
         howto->name,
2094
0
         h->root.root.root.string);
2095
0
  }
2096
2097
0
      if (sec != NULL && discarded_section (sec))
2098
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2099
0
           rel, 1, relend, R_MN10300_NONE,
2100
0
           howto, 0, contents);
2101
2102
0
      if (bfd_link_relocatable (info))
2103
0
  continue;
2104
2105
0
      r = mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
2106
0
             input_section,
2107
0
             contents, rel->r_offset,
2108
0
             relocation, rel->r_addend,
2109
0
             (struct elf_link_hash_entry *) h,
2110
0
             r_symndx,
2111
0
             info, sec, h == NULL);
2112
2113
0
      if (r != bfd_reloc_ok)
2114
0
  {
2115
0
    const char *name;
2116
0
    const char *msg = NULL;
2117
2118
0
    if (h != NULL)
2119
0
      name = h->root.root.root.string;
2120
0
    else
2121
0
      {
2122
0
        name = (bfd_elf_string_from_elf_section
2123
0
          (input_bfd, symtab_hdr->sh_link, sym->st_name));
2124
0
        if (name == NULL || *name == '\0')
2125
0
    name = bfd_section_name (sec);
2126
0
      }
2127
2128
0
    switch (r)
2129
0
      {
2130
0
      case bfd_reloc_overflow:
2131
0
        (*info->callbacks->reloc_overflow)
2132
0
    (info, (h ? &h->root.root : NULL), name, howto->name,
2133
0
     (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2134
0
        break;
2135
2136
0
      case bfd_reloc_undefined:
2137
0
        (*info->callbacks->undefined_symbol)
2138
0
    (info, name, input_bfd, input_section, rel->r_offset, true);
2139
0
        break;
2140
2141
0
      case bfd_reloc_outofrange:
2142
0
        msg = _("internal error: out of range error");
2143
0
        goto common_error;
2144
2145
0
      case bfd_reloc_notsupported:
2146
0
        msg = _("internal error: unsupported relocation error");
2147
0
        goto common_error;
2148
2149
0
      case bfd_reloc_dangerous:
2150
0
        if (r_type == R_MN10300_PCREL32)
2151
0
    msg = _("error: inappropriate relocation type for shared"
2152
0
      " library (did you forget -fpic?)");
2153
0
        else if (r_type == R_MN10300_GOT32)
2154
    /* xgettext:c-format */
2155
0
    msg = _("%pB: taking the address of protected function"
2156
0
      " '%s' cannot be done when making a shared library");
2157
0
        else
2158
0
    msg = _("internal error: suspicious relocation type used"
2159
0
      " in shared library");
2160
0
        goto common_error;
2161
2162
0
      default:
2163
0
        msg = _("internal error: unknown error");
2164
        /* Fall through.  */
2165
2166
0
      common_error:
2167
0
        _bfd_error_handler (msg, input_bfd, name);
2168
0
        bfd_set_error (bfd_error_bad_value);
2169
0
        return false;
2170
0
      }
2171
0
  }
2172
0
    }
2173
2174
0
  return true;
2175
0
}
Unexecuted instantiation: elf-m10300.c:mn10300_elf_relocate_section
Unexecuted instantiation: elf32-am33lin.c:mn10300_elf_relocate_section
2176
2177
/* Finish initializing one hash table entry.  */
2178
2179
static bool
2180
elf32_mn10300_finish_hash_table_entry (struct bfd_hash_entry *gen_entry,
2181
               void * in_args)
2182
0
{
2183
0
  struct elf32_mn10300_link_hash_entry *entry;
2184
0
  struct bfd_link_info *link_info = (struct bfd_link_info *) in_args;
2185
0
  unsigned int byte_count = 0;
2186
2187
0
  entry = (struct elf32_mn10300_link_hash_entry *) gen_entry;
2188
2189
  /* If we already know we want to convert "call" to "calls" for calls
2190
     to this symbol, then return now.  */
2191
0
  if (entry->flags == MN10300_CONVERT_CALL_TO_CALLS)
2192
0
    return true;
2193
2194
  /* If there are no named calls to this symbol, or there's nothing we
2195
     can move from the function itself into the "call" instruction,
2196
     then note that all "call" instructions should be converted into
2197
     "calls" instructions and return.  If a symbol is available for
2198
     dynamic symbol resolution (overridable or overriding), avoid
2199
     custom calling conventions.  */
2200
0
  if (entry->direct_calls == 0
2201
0
      || (entry->stack_size == 0 && entry->movm_args == 0)
2202
0
      || (elf_hash_table (link_info)->dynamic_sections_created
2203
0
    && ELF_ST_VISIBILITY (entry->root.other) != STV_INTERNAL
2204
0
    && ELF_ST_VISIBILITY (entry->root.other) != STV_HIDDEN))
2205
0
    {
2206
      /* Make a note that we should convert "call" instructions to "calls"
2207
   instructions for calls to this symbol.  */
2208
0
      entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
2209
0
      return true;
2210
0
    }
2211
2212
  /* We may be able to move some instructions from the function itself into
2213
     the "call" instruction.  Count how many bytes we might be able to
2214
     eliminate in the function itself.  */
2215
2216
  /* A movm instruction is two bytes.  */
2217
0
  if (entry->movm_args)
2218
0
    byte_count += 2;
2219
2220
  /* Count the insn to allocate stack space too.  */
2221
0
  if (entry->stack_size > 0)
2222
0
    {
2223
0
      if (entry->stack_size <= 128)
2224
0
  byte_count += 3;
2225
0
      else
2226
0
  byte_count += 4;
2227
0
    }
2228
2229
  /* If using "call" will result in larger code, then turn all
2230
     the associated "call" instructions into "calls" instructions.  */
2231
0
  if (byte_count < entry->direct_calls)
2232
0
    entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
2233
2234
  /* This routine never fails.  */
2235
0
  return true;
2236
0
}
Unexecuted instantiation: elf-m10300.c:elf32_mn10300_finish_hash_table_entry
Unexecuted instantiation: elf32-am33lin.c:elf32_mn10300_finish_hash_table_entry
2237
2238
/* Used to count hash table entries.  */
2239
2240
static bool
2241
elf32_mn10300_count_hash_table_entries (struct bfd_hash_entry *gen_entry ATTRIBUTE_UNUSED,
2242
          void * in_args)
2243
0
{
2244
0
  int *count = (int *) in_args;
2245
2246
0
  (*count) ++;
2247
0
  return true;
2248
0
}
Unexecuted instantiation: elf-m10300.c:elf32_mn10300_count_hash_table_entries
Unexecuted instantiation: elf32-am33lin.c:elf32_mn10300_count_hash_table_entries
2249
2250
/* Used to enumerate hash table entries into a linear array.  */
2251
2252
static bool
2253
elf32_mn10300_list_hash_table_entries (struct bfd_hash_entry *gen_entry,
2254
               void * in_args)
2255
0
{
2256
0
  struct bfd_hash_entry ***ptr = (struct bfd_hash_entry ***) in_args;
2257
2258
0
  **ptr = gen_entry;
2259
0
  (*ptr) ++;
2260
0
  return true;
2261
0
}
Unexecuted instantiation: elf-m10300.c:elf32_mn10300_list_hash_table_entries
Unexecuted instantiation: elf32-am33lin.c:elf32_mn10300_list_hash_table_entries
2262
2263
/* Used to sort the array created by the above.  */
2264
2265
static int
2266
sort_by_value (const void *va, const void *vb)
2267
0
{
2268
0
  struct elf32_mn10300_link_hash_entry *a
2269
0
    = *(struct elf32_mn10300_link_hash_entry **) va;
2270
0
  struct elf32_mn10300_link_hash_entry *b
2271
0
    = *(struct elf32_mn10300_link_hash_entry **) vb;
2272
2273
0
  return a->value - b->value;
2274
0
}
Unexecuted instantiation: elf-m10300.c:sort_by_value
Unexecuted instantiation: elf32-am33lin.c:sort_by_value
2275
2276
/* Compute the stack size and movm arguments for the function
2277
   referred to by HASH at address ADDR in section with
2278
   contents CONTENTS, store the information in the hash table.  */
2279
2280
static void
2281
compute_function_info (bfd *abfd,
2282
           struct elf32_mn10300_link_hash_entry *hash,
2283
           bfd_vma addr,
2284
           unsigned char *contents)
2285
0
{
2286
0
  unsigned char byte1, byte2;
2287
  /* We only care about a very small subset of the possible prologue
2288
     sequences here.  Basically we look for:
2289
2290
     movm [d2,d3,a2,a3],sp (optional)
2291
     add <size>,sp (optional, and only for sizes which fit in an unsigned
2292
        8 bit number)
2293
2294
     If we find anything else, we quit.  */
2295
2296
  /* Look for movm [regs],sp.  */
2297
0
  byte1 = bfd_get_8 (abfd, contents + addr);
2298
0
  byte2 = bfd_get_8 (abfd, contents + addr + 1);
2299
2300
0
  if (byte1 == 0xcf)
2301
0
    {
2302
0
      hash->movm_args = byte2;
2303
0
      addr += 2;
2304
0
      byte1 = bfd_get_8 (abfd, contents + addr);
2305
0
      byte2 = bfd_get_8 (abfd, contents + addr + 1);
2306
0
    }
2307
2308
  /* Now figure out how much stack space will be allocated by the movm
2309
     instruction.  We need this kept separate from the function's normal
2310
     stack space.  */
2311
0
  if (hash->movm_args)
2312
0
    {
2313
      /* Space for d2.  */
2314
0
      if (hash->movm_args & 0x80)
2315
0
  hash->movm_stack_size += 4;
2316
2317
      /* Space for d3.  */
2318
0
      if (hash->movm_args & 0x40)
2319
0
  hash->movm_stack_size += 4;
2320
2321
      /* Space for a2.  */
2322
0
      if (hash->movm_args & 0x20)
2323
0
  hash->movm_stack_size += 4;
2324
2325
      /* Space for a3.  */
2326
0
      if (hash->movm_args & 0x10)
2327
0
  hash->movm_stack_size += 4;
2328
2329
      /* "other" space.  d0, d1, a0, a1, mdr, lir, lar, 4 byte pad.  */
2330
0
      if (hash->movm_args & 0x08)
2331
0
  hash->movm_stack_size += 8 * 4;
2332
2333
0
      if (bfd_get_mach (abfd) == bfd_mach_am33
2334
0
    || bfd_get_mach (abfd) == bfd_mach_am33_2)
2335
0
  {
2336
    /* "exother" space.  e0, e1, mdrq, mcrh, mcrl, mcvf */
2337
0
    if (hash->movm_args & 0x1)
2338
0
      hash->movm_stack_size += 6 * 4;
2339
2340
    /* exreg1 space.  e4, e5, e6, e7 */
2341
0
    if (hash->movm_args & 0x2)
2342
0
      hash->movm_stack_size += 4 * 4;
2343
2344
    /* exreg0 space.  e2, e3  */
2345
0
    if (hash->movm_args & 0x4)
2346
0
      hash->movm_stack_size += 2 * 4;
2347
0
  }
2348
0
    }
2349
2350
  /* Now look for the two stack adjustment variants.  */
2351
0
  if (byte1 == 0xf8 && byte2 == 0xfe)
2352
0
    {
2353
0
      int temp = bfd_get_8 (abfd, contents + addr + 2);
2354
0
      temp = ((temp & 0xff) ^ (~0x7f)) + 0x80;
2355
2356
0
      hash->stack_size = -temp;
2357
0
    }
2358
0
  else if (byte1 == 0xfa && byte2 == 0xfe)
2359
0
    {
2360
0
      int temp = bfd_get_16 (abfd, contents + addr + 2);
2361
0
      temp = ((temp & 0xffff) ^ (~0x7fff)) + 0x8000;
2362
0
      temp = -temp;
2363
2364
0
      if (temp < 255)
2365
0
  hash->stack_size = temp;
2366
0
    }
2367
2368
  /* If the total stack to be allocated by the call instruction is more
2369
     than 255 bytes, then we can't remove the stack adjustment by using
2370
     "call" (we might still be able to remove the "movm" instruction.  */
2371
0
  if (hash->stack_size + hash->movm_stack_size > 255)
2372
0
    hash->stack_size = 0;
2373
0
}
Unexecuted instantiation: elf-m10300.c:compute_function_info
Unexecuted instantiation: elf32-am33lin.c:compute_function_info
2374
2375
/* Delete some bytes from a section while relaxing.  */
2376
2377
static bool
2378
mn10300_elf_relax_delete_bytes (bfd *abfd,
2379
        asection *sec,
2380
        bfd_vma addr,
2381
        int count)
2382
0
{
2383
0
  Elf_Internal_Shdr *symtab_hdr;
2384
0
  unsigned int sec_shndx;
2385
0
  bfd_byte *contents;
2386
0
  Elf_Internal_Rela *irel, *irelend;
2387
0
  Elf_Internal_Rela *irelalign;
2388
0
  bfd_vma toaddr;
2389
0
  Elf_Internal_Sym *isym, *isymend;
2390
0
  struct elf_link_hash_entry **sym_hashes;
2391
0
  struct elf_link_hash_entry **end_hashes;
2392
0
  unsigned int symcount;
2393
2394
0
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2395
2396
0
  contents = elf_section_data (sec)->this_hdr.contents;
2397
2398
0
  irelalign = NULL;
2399
0
  toaddr = sec->size;
2400
2401
0
  irel = elf_section_data (sec)->relocs;
2402
0
  irelend = irel + sec->reloc_count;
2403
2404
0
  if (sec->reloc_count > 0)
2405
0
    {
2406
      /* If there is an align reloc at the end of the section ignore it.
2407
   GAS creates these relocs for reasons of its own, and they just
2408
   serve to keep the section artifically inflated.  */
2409
0
      if (ELF32_R_TYPE ((irelend - 1)->r_info) == (int) R_MN10300_ALIGN)
2410
0
  --irelend;
2411
2412
      /* The deletion must stop at the next ALIGN reloc for an alignment
2413
   power larger than, or not a multiple of, the number of bytes we
2414
   are deleting.  */
2415
0
      for (; irel < irelend; irel++)
2416
0
  {
2417
0
    if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
2418
0
        && irel->r_offset > addr
2419
0
        && irel->r_offset < toaddr)
2420
0
      {
2421
0
        int alignment = 1 << irel->r_addend;
2422
2423
0
        if (count < alignment
2424
0
      || alignment % count != 0)
2425
0
    {
2426
0
      irelalign = irel;
2427
0
      toaddr = irel->r_offset;
2428
0
      break;
2429
0
    }
2430
0
      }
2431
0
  }
2432
0
    }
2433
2434
  /* Actually delete the bytes.  */
2435
0
  memmove (contents + addr, contents + addr + count,
2436
0
     (size_t) (toaddr - addr - count));
2437
2438
  /* Adjust the section's size if we are shrinking it, or else
2439
     pad the bytes between the end of the shrunken region and
2440
     the start of the next region with NOP codes.  */
2441
0
  if (irelalign == NULL)
2442
0
    {
2443
0
      sec->size -= count;
2444
      /* Include symbols at the end of the section, but
2445
   not at the end of a sub-region of the section.  */
2446
0
      toaddr ++;
2447
0
    }
2448
0
  else
2449
0
    {
2450
0
      int i;
2451
2452
0
#define NOP_OPCODE 0xcb
2453
2454
0
      for (i = 0; i < count; i ++)
2455
0
  bfd_put_8 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i);
2456
0
    }
2457
2458
  /* Adjust all the relocs.  */
2459
0
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
2460
0
    {
2461
      /* Get the new reloc address.  */
2462
0
      if ((irel->r_offset > addr
2463
0
     && irel->r_offset < toaddr)
2464
0
    || (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
2465
0
        && irel->r_offset == toaddr))
2466
0
  irel->r_offset -= count;
2467
0
    }
2468
2469
  /* Adjust the local symbols in the section, reducing their value
2470
     by the number of bytes deleted.  Note - symbols within the deleted
2471
     region are moved to the address of the start of the region, which
2472
     actually means that they will address the byte beyond the end of
2473
     the region once the deletion has been completed.  */
2474
0
  symtab_hdr = &elf_symtab_hdr (abfd);
2475
0
  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
2476
0
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
2477
0
    {
2478
0
      if (isym->st_shndx == sec_shndx
2479
0
    && isym->st_value > addr
2480
0
    && isym->st_value < toaddr)
2481
0
  {
2482
0
    if (isym->st_value < addr + count)
2483
0
      isym->st_value = addr;
2484
0
    else
2485
0
      isym->st_value -= count;
2486
0
  }
2487
      /* Adjust the function symbol's size as well.  */
2488
0
      else if (isym->st_shndx == sec_shndx
2489
0
         && ELF_ST_TYPE (isym->st_info) == STT_FUNC
2490
0
         && isym->st_value + isym->st_size > addr
2491
0
         && isym->st_value + isym->st_size < toaddr)
2492
0
  isym->st_size -= count;
2493
0
    }
2494
2495
  /* Now adjust the global symbols defined in this section.  */
2496
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2497
0
        - symtab_hdr->sh_info);
2498
0
  sym_hashes = elf_sym_hashes (abfd);
2499
0
  end_hashes = sym_hashes + symcount;
2500
0
  for (; sym_hashes < end_hashes; sym_hashes++)
2501
0
    {
2502
0
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
2503
2504
0
      if ((sym_hash->root.type == bfd_link_hash_defined
2505
0
     || sym_hash->root.type == bfd_link_hash_defweak)
2506
0
    && sym_hash->root.u.def.section == sec
2507
0
    && sym_hash->root.u.def.value > addr
2508
0
    && sym_hash->root.u.def.value < toaddr)
2509
0
  {
2510
0
    if (sym_hash->root.u.def.value < addr + count)
2511
0
      sym_hash->root.u.def.value = addr;
2512
0
    else
2513
0
      sym_hash->root.u.def.value -= count;
2514
0
  }
2515
      /* Adjust the function symbol's size as well.  */
2516
0
      else if (sym_hash->root.type == bfd_link_hash_defined
2517
0
         && sym_hash->root.u.def.section == sec
2518
0
         && sym_hash->type == STT_FUNC
2519
0
         && sym_hash->root.u.def.value + sym_hash->size > addr
2520
0
         && sym_hash->root.u.def.value + sym_hash->size < toaddr)
2521
0
  sym_hash->size -= count;
2522
0
    }
2523
2524
  /* See if we can move the ALIGN reloc forward.
2525
     We have adjusted r_offset for it already.  */
2526
0
  if (irelalign != NULL)
2527
0
    {
2528
0
      bfd_vma alignto, alignaddr;
2529
2530
0
      if ((int) irelalign->r_addend > 0)
2531
0
  {
2532
    /* This is the old address.  */
2533
0
    alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
2534
    /* This is where the align points to now.  */
2535
0
    alignaddr = BFD_ALIGN (irelalign->r_offset,
2536
0
         1 << irelalign->r_addend);
2537
0
    if (alignaddr < alignto)
2538
      /* Tail recursion.  */
2539
0
      return mn10300_elf_relax_delete_bytes (abfd, sec, alignaddr,
2540
0
               (int) (alignto - alignaddr));
2541
0
  }
2542
0
    }
2543
2544
0
  return true;
2545
0
}
Unexecuted instantiation: elf-m10300.c:mn10300_elf_relax_delete_bytes
Unexecuted instantiation: elf32-am33lin.c:mn10300_elf_relax_delete_bytes
2546
2547
/* Return TRUE if a symbol exists at the given address, else return
2548
   FALSE.  */
2549
2550
static bool
2551
mn10300_elf_symbol_address_p (bfd *abfd,
2552
            asection *sec,
2553
            Elf_Internal_Sym *isym,
2554
            bfd_vma addr)
2555
0
{
2556
0
  Elf_Internal_Shdr *symtab_hdr;
2557
0
  unsigned int sec_shndx;
2558
0
  Elf_Internal_Sym *isymend;
2559
0
  struct elf_link_hash_entry **sym_hashes;
2560
0
  struct elf_link_hash_entry **end_hashes;
2561
0
  unsigned int symcount;
2562
2563
0
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2564
2565
  /* Examine all the symbols.  */
2566
0
  symtab_hdr = &elf_symtab_hdr (abfd);
2567
0
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
2568
0
    if (isym->st_shndx == sec_shndx
2569
0
  && isym->st_value == addr)
2570
0
      return true;
2571
2572
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2573
0
        - symtab_hdr->sh_info);
2574
0
  sym_hashes = elf_sym_hashes (abfd);
2575
0
  end_hashes = sym_hashes + symcount;
2576
0
  for (; sym_hashes < end_hashes; sym_hashes++)
2577
0
    {
2578
0
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
2579
2580
0
      if ((sym_hash->root.type == bfd_link_hash_defined
2581
0
     || sym_hash->root.type == bfd_link_hash_defweak)
2582
0
    && sym_hash->root.u.def.section == sec
2583
0
    && sym_hash->root.u.def.value == addr)
2584
0
  return true;
2585
0
    }
2586
2587
0
  return false;
2588
0
}
Unexecuted instantiation: elf-m10300.c:mn10300_elf_symbol_address_p
Unexecuted instantiation: elf32-am33lin.c:mn10300_elf_symbol_address_p
2589
2590
/* This function handles relaxing for the mn10300.
2591
2592
   There are quite a few relaxing opportunities available on the mn10300:
2593
2594
  * calls:32 -> calls:16             2 bytes
2595
  * call:32  -> call:16            2 bytes
2596
2597
  * call:32 -> calls:32            1 byte
2598
  * call:16 -> calls:16            1 byte
2599
    * These are done anytime using "calls" would result
2600
    in smaller code, or when necessary to preserve the
2601
    meaning of the program.
2602
2603
  * call:32              varies
2604
  * call:16
2605
    * In some circumstances we can move instructions
2606
    from a function prologue into a "call" instruction.
2607
    This is only done if the resulting code is no larger
2608
    than the original code.
2609
2610
  * jmp:32 -> jmp:16             2 bytes
2611
  * jmp:16 -> bra:8            1 byte
2612
2613
    * If the previous instruction is a conditional branch
2614
    around the jump/bra, we may be able to reverse its condition
2615
    and change its target to the jump's target.  The jump/bra
2616
    can then be deleted.           2 bytes
2617
2618
  * mov abs32 -> mov abs16           1 or 2 bytes
2619
2620
  * Most instructions which accept imm32 can relax to imm16  1 or 2 bytes
2621
  - Most instructions which accept imm16 can relax to imm8   1 or 2 bytes
2622
2623
  * Most instructions which accept d32 can relax to d16    1 or 2 bytes
2624
  - Most instructions which accept d16 can relax to d8     1 or 2 bytes
2625
2626
  We don't handle imm16->imm8 or d16->d8 as they're very rare
2627
  and somewhat more difficult to support.  */
2628
2629
static bool
2630
mn10300_elf_relax_section (bfd *abfd,
2631
         asection *sec,
2632
         struct bfd_link_info *link_info,
2633
         bool *again)
2634
0
{
2635
0
  Elf_Internal_Shdr *symtab_hdr;
2636
0
  Elf_Internal_Rela *internal_relocs = NULL;
2637
0
  Elf_Internal_Rela *irel, *irelend;
2638
0
  bfd_byte *contents = NULL;
2639
0
  Elf_Internal_Sym *isymbuf = NULL;
2640
0
  struct elf32_mn10300_link_hash_table *hash_table;
2641
0
  asection *section = sec;
2642
0
  bfd_vma align_gap_adjustment;
2643
2644
0
  if (bfd_link_relocatable (link_info))
2645
0
    link_info->callbacks->fatal
2646
0
      (_("%P: --relax and -r may not be used together\n"));
2647
2648
  /* Assume nothing changes.  */
2649
0
  *again = false;
2650
2651
  /* We need a pointer to the mn10300 specific hash table.  */
2652
0
  hash_table = elf32_mn10300_hash_table (link_info);
2653
0
  if (hash_table == NULL)
2654
0
    return false;
2655
2656
  /* Initialize fields in each hash table entry the first time through.  */
2657
0
  if ((hash_table->flags & MN10300_HASH_ENTRIES_INITIALIZED) == 0)
2658
0
    {
2659
0
      bfd *input_bfd;
2660
2661
      /* Iterate over all the input bfds.  */
2662
0
      for (input_bfd = link_info->input_bfds;
2663
0
     input_bfd != NULL;
2664
0
     input_bfd = input_bfd->link.next)
2665
0
  {
2666
    /* We're going to need all the symbols for each bfd.  */
2667
0
    symtab_hdr = &elf_symtab_hdr (input_bfd);
2668
0
    if (symtab_hdr->sh_info != 0)
2669
0
      {
2670
0
        isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2671
0
        if (isymbuf == NULL)
2672
0
    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2673
0
            symtab_hdr->sh_info, 0,
2674
0
            NULL, NULL, NULL);
2675
0
        if (isymbuf == NULL)
2676
0
    goto error_return;
2677
0
      }
2678
2679
    /* Iterate over each section in this bfd.  */
2680
0
    for (section = input_bfd->sections;
2681
0
         section != NULL;
2682
0
         section = section->next)
2683
0
      {
2684
0
        struct elf32_mn10300_link_hash_entry *hash;
2685
0
        asection *sym_sec = NULL;
2686
0
        const char *sym_name;
2687
0
        char *new_name;
2688
2689
        /* If there's nothing to do in this section, skip it.  */
2690
0
        if (! ((section->flags & SEC_RELOC) != 0
2691
0
         && section->reloc_count != 0))
2692
0
    continue;
2693
0
        if ((section->flags & SEC_ALLOC) == 0
2694
0
      || (section->flags & SEC_HAS_CONTENTS) == 0)
2695
0
    continue;
2696
2697
        /* Get cached copy of section contents if it exists.  */
2698
0
        if (elf_section_data (section)->this_hdr.contents != NULL)
2699
0
    contents = elf_section_data (section)->this_hdr.contents;
2700
0
        else if (section->size != 0)
2701
0
    {
2702
      /* Go get them off disk.  */
2703
0
      if (!bfd_malloc_and_get_section (input_bfd, section,
2704
0
               &contents))
2705
0
        goto error_return;
2706
0
    }
2707
0
        else
2708
0
    contents = NULL;
2709
2710
        /* If there aren't any relocs, then there's nothing to do.  */
2711
0
        if ((section->flags & SEC_RELOC) != 0
2712
0
      && section->reloc_count != 0)
2713
0
    {
2714
      /* Get a copy of the native relocations.  */
2715
0
      internal_relocs = _bfd_elf_link_read_relocs (input_bfd, section,
2716
0
                     NULL, NULL,
2717
0
                     link_info->keep_memory);
2718
0
      if (internal_relocs == NULL)
2719
0
        goto error_return;
2720
2721
      /* Now examine each relocation.  */
2722
0
      irel = internal_relocs;
2723
0
      irelend = irel + section->reloc_count;
2724
0
      for (; irel < irelend; irel++)
2725
0
        {
2726
0
          long r_type;
2727
0
          unsigned long r_index;
2728
0
          unsigned char code;
2729
2730
0
          r_type = ELF32_R_TYPE (irel->r_info);
2731
0
          r_index = ELF32_R_SYM (irel->r_info);
2732
2733
0
          if (r_type < 0 || r_type >= (int) R_MN10300_MAX)
2734
0
      goto error_return;
2735
2736
          /* We need the name and hash table entry of the target
2737
       symbol!  */
2738
0
          hash = NULL;
2739
0
          sym_sec = NULL;
2740
2741
0
          if (r_index < symtab_hdr->sh_info)
2742
0
      {
2743
        /* A local symbol.  */
2744
0
        Elf_Internal_Sym *isym;
2745
0
        struct elf_link_hash_table *elftab;
2746
0
        size_t amt;
2747
2748
0
        isym = isymbuf + r_index;
2749
0
        if (isym->st_shndx == SHN_UNDEF)
2750
0
          sym_sec = bfd_und_section_ptr;
2751
0
        else if (isym->st_shndx == SHN_ABS)
2752
0
          sym_sec = bfd_abs_section_ptr;
2753
0
        else if (isym->st_shndx == SHN_COMMON)
2754
0
          sym_sec = bfd_com_section_ptr;
2755
0
        else
2756
0
          sym_sec
2757
0
            = bfd_section_from_elf_index (input_bfd,
2758
0
                  isym->st_shndx);
2759
2760
0
        sym_name
2761
0
          = bfd_elf_string_from_elf_section (input_bfd,
2762
0
                     (symtab_hdr
2763
0
                ->sh_link),
2764
0
                     isym->st_name);
2765
2766
        /* If it isn't a function, then we don't care
2767
           about it.  */
2768
0
        if (ELF_ST_TYPE (isym->st_info) != STT_FUNC)
2769
0
          continue;
2770
2771
        /* Tack on an ID so we can uniquely identify this
2772
           local symbol in the global hash table.  */
2773
0
        amt = strlen (sym_name) + 10;
2774
0
        new_name = bfd_malloc (amt);
2775
0
        if (new_name == NULL)
2776
0
          goto error_return;
2777
2778
0
        sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
2779
0
        sym_name = new_name;
2780
2781
0
        elftab = &hash_table->static_hash_table->root;
2782
0
        hash = ((struct elf32_mn10300_link_hash_entry *)
2783
0
          elf_link_hash_lookup (elftab, sym_name,
2784
0
              true, true, false));
2785
0
        free (new_name);
2786
0
      }
2787
0
          else
2788
0
      {
2789
0
        r_index -= symtab_hdr->sh_info;
2790
0
        hash = (struct elf32_mn10300_link_hash_entry *)
2791
0
           elf_sym_hashes (input_bfd)[r_index];
2792
0
      }
2793
2794
0
          sym_name = hash->root.root.root.string;
2795
0
          if ((section->flags & SEC_CODE) != 0)
2796
0
      {
2797
        /* If this is not a "call" instruction, then we
2798
           should convert "call" instructions to "calls"
2799
           instructions.  */
2800
0
        code = bfd_get_8 (input_bfd,
2801
0
              contents + irel->r_offset - 1);
2802
0
        if (code != 0xdd && code != 0xcd)
2803
0
          hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
2804
0
      }
2805
2806
          /* If this is a jump/call, then bump the
2807
       direct_calls counter.  Else force "call" to
2808
       "calls" conversions.  */
2809
0
          if (r_type == R_MN10300_PCREL32
2810
0
        || r_type == R_MN10300_PLT32
2811
0
        || r_type == R_MN10300_PLT16
2812
0
        || r_type == R_MN10300_PCREL16)
2813
0
      hash->direct_calls++;
2814
0
          else
2815
0
      hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
2816
0
        }
2817
0
    }
2818
2819
        /* Now look at the actual contents to get the stack size,
2820
     and a list of what registers were saved in the prologue
2821
     (ie movm_args).  */
2822
0
        if ((section->flags & SEC_CODE) != 0)
2823
0
    {
2824
0
      Elf_Internal_Sym *isym, *isymend;
2825
0
      unsigned int sec_shndx;
2826
0
      struct elf_link_hash_entry **hashes;
2827
0
      struct elf_link_hash_entry **end_hashes;
2828
0
      unsigned int symcount;
2829
2830
0
      sec_shndx = _bfd_elf_section_from_bfd_section (input_bfd,
2831
0
                 section);
2832
2833
0
      symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2834
0
            - symtab_hdr->sh_info);
2835
0
      hashes = elf_sym_hashes (input_bfd);
2836
0
      end_hashes = hashes + symcount;
2837
2838
      /* Look at each function defined in this section and
2839
         update info for that function.  */
2840
0
      isymend = isymbuf + symtab_hdr->sh_info;
2841
0
      for (isym = isymbuf; isym < isymend; isym++)
2842
0
        {
2843
0
          if (isym->st_shndx == sec_shndx
2844
0
        && ELF_ST_TYPE (isym->st_info) == STT_FUNC)
2845
0
      {
2846
0
        struct elf_link_hash_table *elftab;
2847
0
        size_t amt;
2848
0
        struct elf_link_hash_entry **lhashes = hashes;
2849
2850
        /* Skip a local symbol if it aliases a
2851
           global one.  */
2852
0
        for (; lhashes < end_hashes; lhashes++)
2853
0
          {
2854
0
            hash = (struct elf32_mn10300_link_hash_entry *) *lhashes;
2855
0
            if ((hash->root.root.type == bfd_link_hash_defined
2856
0
           || hash->root.root.type == bfd_link_hash_defweak)
2857
0
          && hash->root.root.u.def.section == section
2858
0
          && hash->root.type == STT_FUNC
2859
0
          && hash->root.root.u.def.value == isym->st_value)
2860
0
        break;
2861
0
          }
2862
0
        if (lhashes != end_hashes)
2863
0
          continue;
2864
2865
0
        if (isym->st_shndx == SHN_UNDEF)
2866
0
          sym_sec = bfd_und_section_ptr;
2867
0
        else if (isym->st_shndx == SHN_ABS)
2868
0
          sym_sec = bfd_abs_section_ptr;
2869
0
        else if (isym->st_shndx == SHN_COMMON)
2870
0
          sym_sec = bfd_com_section_ptr;
2871
0
        else
2872
0
          sym_sec
2873
0
            = bfd_section_from_elf_index (input_bfd,
2874
0
                  isym->st_shndx);
2875
2876
0
        sym_name = (bfd_elf_string_from_elf_section
2877
0
              (input_bfd, symtab_hdr->sh_link,
2878
0
               isym->st_name));
2879
2880
        /* Tack on an ID so we can uniquely identify this
2881
           local symbol in the global hash table.  */
2882
0
        amt = strlen (sym_name) + 10;
2883
0
        new_name = bfd_malloc (amt);
2884
0
        if (new_name == NULL)
2885
0
          goto error_return;
2886
2887
0
        sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
2888
0
        sym_name = new_name;
2889
2890
0
        elftab = &hash_table->static_hash_table->root;
2891
0
        hash = ((struct elf32_mn10300_link_hash_entry *)
2892
0
          elf_link_hash_lookup (elftab, sym_name,
2893
0
              true, true, false));
2894
0
        free (new_name);
2895
0
        compute_function_info (input_bfd, hash,
2896
0
             isym->st_value, contents);
2897
0
        hash->value = isym->st_value;
2898
0
      }
2899
0
        }
2900
2901
0
      for (; hashes < end_hashes; hashes++)
2902
0
        {
2903
0
          hash = (struct elf32_mn10300_link_hash_entry *) *hashes;
2904
0
          if ((hash->root.root.type == bfd_link_hash_defined
2905
0
         || hash->root.root.type == bfd_link_hash_defweak)
2906
0
        && hash->root.root.u.def.section == section
2907
0
        && hash->root.type == STT_FUNC)
2908
0
      compute_function_info (input_bfd, hash,
2909
0
                 (hash)->root.root.u.def.value,
2910
0
                 contents);
2911
0
        }
2912
0
    }
2913
2914
        /* Cache or free any memory we allocated for the relocs.  */
2915
0
        if (elf_section_data (section)->relocs != internal_relocs)
2916
0
    free (internal_relocs);
2917
0
        internal_relocs = NULL;
2918
2919
        /* Cache or free any memory we allocated for the contents.  */
2920
0
        if (contents != NULL
2921
0
      && elf_section_data (section)->this_hdr.contents != contents)
2922
0
    {
2923
0
      if (! link_info->keep_memory)
2924
0
        free (contents);
2925
0
      else
2926
0
        {
2927
          /* Cache the section contents for elf_link_input_bfd.  */
2928
0
          elf_section_data (section)->this_hdr.contents = contents;
2929
0
        }
2930
0
    }
2931
0
        contents = NULL;
2932
0
      }
2933
2934
    /* Cache or free any memory we allocated for the symbols.  */
2935
0
    if (isymbuf != NULL
2936
0
        && symtab_hdr->contents != (unsigned char *) isymbuf)
2937
0
      {
2938
0
        if (! link_info->keep_memory)
2939
0
    free (isymbuf);
2940
0
        else
2941
0
    {
2942
      /* Cache the symbols for elf_link_input_bfd.  */
2943
0
      symtab_hdr->contents = (unsigned char *) isymbuf;
2944
0
    }
2945
0
      }
2946
0
    isymbuf = NULL;
2947
0
  }
2948
2949
      /* Now iterate on each symbol in the hash table and perform
2950
   the final initialization steps on each.  */
2951
0
      elf32_mn10300_link_hash_traverse (hash_table,
2952
0
          elf32_mn10300_finish_hash_table_entry,
2953
0
          link_info);
2954
0
      elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
2955
0
          elf32_mn10300_finish_hash_table_entry,
2956
0
          link_info);
2957
2958
0
      {
2959
  /* This section of code collects all our local symbols, sorts
2960
     them by value, and looks for multiple symbols referring to
2961
     the same address.  For those symbols, the flags are merged.
2962
     At this point, the only flag that can be set is
2963
     MN10300_CONVERT_CALL_TO_CALLS, so we simply OR the flags
2964
     together.  */
2965
0
  int static_count = 0, i;
2966
0
  struct elf32_mn10300_link_hash_entry **entries;
2967
0
  struct elf32_mn10300_link_hash_entry **ptr;
2968
2969
0
  elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
2970
0
            elf32_mn10300_count_hash_table_entries,
2971
0
            &static_count);
2972
2973
0
  entries = bfd_malloc (static_count * sizeof (* ptr));
2974
2975
0
  ptr = entries;
2976
0
  elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
2977
0
            elf32_mn10300_list_hash_table_entries,
2978
0
            & ptr);
2979
2980
0
  qsort (entries, static_count, sizeof (entries[0]), sort_by_value);
2981
2982
0
  for (i = 0; i < static_count - 1; i++)
2983
0
    if (entries[i]->value && entries[i]->value == entries[i+1]->value)
2984
0
      {
2985
0
        int v = entries[i]->flags;
2986
0
        int j;
2987
2988
0
        for (j = i + 1; j < static_count && entries[j]->value == entries[i]->value; j++)
2989
0
    v |= entries[j]->flags;
2990
2991
0
        for (j = i; j < static_count && entries[j]->value == entries[i]->value; j++)
2992
0
    entries[j]->flags = v;
2993
2994
0
        i = j - 1;
2995
0
      }
2996
0
      }
2997
2998
      /* All entries in the hash table are fully initialized.  */
2999
0
      hash_table->flags |= MN10300_HASH_ENTRIES_INITIALIZED;
3000
3001
      /* Now that everything has been initialized, go through each
3002
   code section and delete any prologue insns which will be
3003
   redundant because their operations will be performed by
3004
   a "call" instruction.  */
3005
0
      for (input_bfd = link_info->input_bfds;
3006
0
     input_bfd != NULL;
3007
0
     input_bfd = input_bfd->link.next)
3008
0
  {
3009
    /* We're going to need all the local symbols for each bfd.  */
3010
0
    symtab_hdr = &elf_symtab_hdr (input_bfd);
3011
0
    if (symtab_hdr->sh_info != 0)
3012
0
      {
3013
0
        isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3014
0
        if (isymbuf == NULL)
3015
0
    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
3016
0
            symtab_hdr->sh_info, 0,
3017
0
            NULL, NULL, NULL);
3018
0
        if (isymbuf == NULL)
3019
0
    goto error_return;
3020
0
      }
3021
3022
    /* Walk over each section in this bfd.  */
3023
0
    for (section = input_bfd->sections;
3024
0
         section != NULL;
3025
0
         section = section->next)
3026
0
      {
3027
0
        unsigned int sec_shndx;
3028
0
        Elf_Internal_Sym *isym, *isymend;
3029
0
        struct elf_link_hash_entry **hashes;
3030
0
        struct elf_link_hash_entry **end_hashes;
3031
0
        unsigned int symcount;
3032
3033
        /* Skip non-code sections and empty sections.  */
3034
0
        if ((section->flags & SEC_CODE) == 0
3035
0
      || (section->flags & SEC_HAS_CONTENTS) == 0
3036
0
      || section->size == 0)
3037
0
    continue;
3038
3039
0
        if (section->reloc_count != 0)
3040
0
    {
3041
      /* Get a copy of the native relocations.  */
3042
0
      internal_relocs = _bfd_elf_link_read_relocs (input_bfd, section,
3043
0
                     NULL, NULL,
3044
0
                     link_info->keep_memory);
3045
0
      if (internal_relocs == NULL)
3046
0
        goto error_return;
3047
0
    }
3048
3049
        /* Get cached copy of section contents if it exists.  */
3050
0
        if (elf_section_data (section)->this_hdr.contents != NULL)
3051
0
    contents = elf_section_data (section)->this_hdr.contents;
3052
0
        else
3053
0
    {
3054
      /* Go get them off disk.  */
3055
0
      if (!bfd_malloc_and_get_section (input_bfd, section,
3056
0
               &contents))
3057
0
        goto error_return;
3058
0
    }
3059
3060
0
        sec_shndx = _bfd_elf_section_from_bfd_section (input_bfd,
3061
0
                   section);
3062
3063
        /* Now look for any function in this section which needs
3064
     insns deleted from its prologue.  */
3065
0
        isymend = isymbuf + symtab_hdr->sh_info;
3066
0
        for (isym = isymbuf; isym < isymend; isym++)
3067
0
    {
3068
0
      struct elf32_mn10300_link_hash_entry *sym_hash;
3069
0
      asection *sym_sec = NULL;
3070
0
      const char *sym_name;
3071
0
      char *new_name;
3072
0
      struct elf_link_hash_table *elftab;
3073
0
      size_t amt;
3074
3075
0
      if (isym->st_shndx != sec_shndx)
3076
0
        continue;
3077
3078
0
      if (isym->st_shndx == SHN_UNDEF)
3079
0
        sym_sec = bfd_und_section_ptr;
3080
0
      else if (isym->st_shndx == SHN_ABS)
3081
0
        sym_sec = bfd_abs_section_ptr;
3082
0
      else if (isym->st_shndx == SHN_COMMON)
3083
0
        sym_sec = bfd_com_section_ptr;
3084
0
      else
3085
0
        sym_sec
3086
0
          = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
3087
3088
0
      sym_name
3089
0
        = bfd_elf_string_from_elf_section (input_bfd,
3090
0
                   symtab_hdr->sh_link,
3091
0
                   isym->st_name);
3092
3093
      /* Tack on an ID so we can uniquely identify this
3094
         local symbol in the global hash table.  */
3095
0
      amt = strlen (sym_name) + 10;
3096
0
      new_name = bfd_malloc (amt);
3097
0
      if (new_name == NULL)
3098
0
        goto error_return;
3099
0
      sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
3100
0
      sym_name = new_name;
3101
3102
0
      elftab = & hash_table->static_hash_table->root;
3103
0
      sym_hash = (struct elf32_mn10300_link_hash_entry *)
3104
0
        elf_link_hash_lookup (elftab, sym_name,
3105
0
            false, false, false);
3106
3107
0
      free (new_name);
3108
0
      if (sym_hash == NULL)
3109
0
        continue;
3110
3111
0
      if (! (sym_hash->flags & MN10300_CONVERT_CALL_TO_CALLS)
3112
0
          && ! (sym_hash->flags & MN10300_DELETED_PROLOGUE_BYTES))
3113
0
        {
3114
0
          int bytes = 0;
3115
3116
          /* Note that we've changed things.  */
3117
0
          elf_section_data (section)->relocs = internal_relocs;
3118
0
          elf_section_data (section)->this_hdr.contents = contents;
3119
0
          symtab_hdr->contents = (unsigned char *) isymbuf;
3120
3121
          /* Count how many bytes we're going to delete.  */
3122
0
          if (sym_hash->movm_args)
3123
0
      bytes += 2;
3124
3125
0
          if (sym_hash->stack_size > 0)
3126
0
      {
3127
0
        if (sym_hash->stack_size <= 128)
3128
0
          bytes += 3;
3129
0
        else
3130
0
          bytes += 4;
3131
0
      }
3132
3133
          /* Note that we've deleted prologue bytes for this
3134
       function.  */
3135
0
          sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
3136
3137
          /* Actually delete the bytes.  */
3138
0
          if (!mn10300_elf_relax_delete_bytes (input_bfd,
3139
0
                 section,
3140
0
                 isym->st_value,
3141
0
                 bytes))
3142
0
      goto error_return;
3143
3144
          /* Something changed.  Not strictly necessary, but
3145
       may lead to more relaxing opportunities.  */
3146
0
          *again = true;
3147
0
        }
3148
0
    }
3149
3150
        /* Look for any global functions in this section which
3151
     need insns deleted from their prologues.  */
3152
0
        symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
3153
0
        - symtab_hdr->sh_info);
3154
0
        hashes = elf_sym_hashes (input_bfd);
3155
0
        end_hashes = hashes + symcount;
3156
0
        for (; hashes < end_hashes; hashes++)
3157
0
    {
3158
0
      struct elf32_mn10300_link_hash_entry *sym_hash;
3159
3160
0
      sym_hash = (struct elf32_mn10300_link_hash_entry *) *hashes;
3161
0
      if ((sym_hash->root.root.type == bfd_link_hash_defined
3162
0
           || sym_hash->root.root.type == bfd_link_hash_defweak)
3163
0
          && sym_hash->root.root.u.def.section == section
3164
0
          && ! (sym_hash->flags & MN10300_CONVERT_CALL_TO_CALLS)
3165
0
          && ! (sym_hash->flags & MN10300_DELETED_PROLOGUE_BYTES))
3166
0
        {
3167
0
          int bytes = 0;
3168
0
          bfd_vma symval;
3169
0
          struct elf_link_hash_entry **hh;
3170
3171
          /* Note that we've changed things.  */
3172
0
          elf_section_data (section)->relocs = internal_relocs;
3173
0
          elf_section_data (section)->this_hdr.contents = contents;
3174
0
          symtab_hdr->contents = (unsigned char *) isymbuf;
3175
3176
          /* Count how many bytes we're going to delete.  */
3177
0
          if (sym_hash->movm_args)
3178
0
      bytes += 2;
3179
3180
0
          if (sym_hash->stack_size > 0)
3181
0
      {
3182
0
        if (sym_hash->stack_size <= 128)
3183
0
          bytes += 3;
3184
0
        else
3185
0
          bytes += 4;
3186
0
      }
3187
3188
          /* Note that we've deleted prologue bytes for this
3189
       function.  */
3190
0
          sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
3191
3192
          /* Actually delete the bytes.  */
3193
0
          symval = sym_hash->root.root.u.def.value;
3194
0
          if (!mn10300_elf_relax_delete_bytes (input_bfd,
3195
0
                 section,
3196
0
                 symval,
3197
0
                 bytes))
3198
0
      goto error_return;
3199
3200
          /* There may be other C++ functions symbols with the same
3201
       address.  If so then mark these as having had their
3202
       prologue bytes deleted as well.  */
3203
0
          for (hh = elf_sym_hashes (input_bfd); hh < end_hashes; hh++)
3204
0
      {
3205
0
        struct elf32_mn10300_link_hash_entry *h;
3206
3207
0
        h = (struct elf32_mn10300_link_hash_entry *) * hh;
3208
3209
0
        if (h != sym_hash
3210
0
            && (h->root.root.type == bfd_link_hash_defined
3211
0
          || h->root.root.type == bfd_link_hash_defweak)
3212
0
            && h->root.root.u.def.section == section
3213
0
            && ! (h->flags & MN10300_CONVERT_CALL_TO_CALLS)
3214
0
            && h->root.root.u.def.value == symval
3215
0
            && h->root.type == STT_FUNC)
3216
0
          h->flags |= MN10300_DELETED_PROLOGUE_BYTES;
3217
0
      }
3218
3219
          /* Something changed.  Not strictly necessary, but
3220
       may lead to more relaxing opportunities.  */
3221
0
          *again = true;
3222
0
        }
3223
0
    }
3224
3225
        /* Cache or free any memory we allocated for the relocs.  */
3226
0
        if (elf_section_data (section)->relocs != internal_relocs)
3227
0
    free (internal_relocs);
3228
0
        internal_relocs = NULL;
3229
3230
        /* Cache or free any memory we allocated for the contents.  */
3231
0
        if (contents != NULL
3232
0
      && elf_section_data (section)->this_hdr.contents != contents)
3233
0
    {
3234
0
      if (! link_info->keep_memory)
3235
0
        free (contents);
3236
0
      else
3237
        /* Cache the section contents for elf_link_input_bfd.  */
3238
0
        elf_section_data (section)->this_hdr.contents = contents;
3239
0
    }
3240
0
        contents = NULL;
3241
0
      }
3242
3243
    /* Cache or free any memory we allocated for the symbols.  */
3244
0
    if (isymbuf != NULL
3245
0
        && symtab_hdr->contents != (unsigned char *) isymbuf)
3246
0
      {
3247
0
        if (! link_info->keep_memory)
3248
0
    free (isymbuf);
3249
0
        else
3250
    /* Cache the symbols for elf_link_input_bfd.  */
3251
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
3252
0
      }
3253
0
    isymbuf = NULL;
3254
0
  }
3255
0
    }
3256
3257
  /* (Re)initialize for the basic instruction shortening/relaxing pass.  */
3258
0
  contents = NULL;
3259
0
  internal_relocs = NULL;
3260
0
  isymbuf = NULL;
3261
  /* For error_return.  */
3262
0
  section = sec;
3263
3264
  /* We don't have to do anything for a relocatable link, if
3265
     this section does not have relocs, or if this is not a
3266
     code section.  */
3267
0
  if (bfd_link_relocatable (link_info)
3268
0
      || (sec->flags & SEC_RELOC) == 0
3269
0
      || sec->reloc_count == 0
3270
0
      || (sec->flags & SEC_CODE) == 0)
3271
0
    return true;
3272
3273
0
  symtab_hdr = &elf_symtab_hdr (abfd);
3274
3275
  /* Get a copy of the native relocations.  */
3276
0
  internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3277
0
                 link_info->keep_memory);
3278
0
  if (internal_relocs == NULL)
3279
0
    goto error_return;
3280
3281
  /* Scan for worst case alignment gap changes.  Note that this logic
3282
     is not ideal; what we should do is run this scan for every
3283
     opcode/address range and adjust accordingly, but that's
3284
     expensive.  Worst case is that for an alignment of N bytes, we
3285
     move by 2*N-N-1 bytes, assuming we have aligns of 1, 2, 4, 8, etc
3286
     all before it.  Plus, this still doesn't cover cross-section
3287
     jumps with section alignment.  */
3288
0
  irelend = internal_relocs + sec->reloc_count;
3289
0
  align_gap_adjustment = 0;
3290
0
  for (irel = internal_relocs; irel < irelend; irel++)
3291
0
    {
3292
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN)
3293
0
  {
3294
0
    bfd_vma adj = 1 << irel->r_addend;
3295
0
    bfd_vma aend = irel->r_offset;
3296
3297
0
    aend = BFD_ALIGN (aend, 1 << irel->r_addend);
3298
0
    adj = 2 * adj - adj - 1;
3299
3300
    /* Record the biggest adjustmnet.  Skip any alignment at the
3301
       end of our section.  */
3302
0
    if (align_gap_adjustment < adj
3303
0
        && aend < sec->output_section->vma + sec->output_offset + sec->size)
3304
0
      align_gap_adjustment = adj;
3305
0
  }
3306
0
    }
3307
3308
  /* Walk through them looking for relaxing opportunities.  */
3309
0
  irelend = internal_relocs + sec->reloc_count;
3310
0
  for (irel = internal_relocs; irel < irelend; irel++)
3311
0
    {
3312
0
      bfd_vma symval;
3313
0
      bfd_signed_vma jump_offset;
3314
0
      asection *sym_sec = NULL;
3315
0
      struct elf32_mn10300_link_hash_entry *h = NULL;
3316
3317
      /* If this isn't something that can be relaxed, then ignore
3318
   this reloc.  */
3319
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_NONE
3320
0
    || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_8
3321
0
    || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_MAX)
3322
0
  continue;
3323
3324
      /* Get the section contents if we haven't done so already.  */
3325
0
      if (contents == NULL)
3326
0
  {
3327
    /* Get cached copy if it exists.  */
3328
0
    if (elf_section_data (sec)->this_hdr.contents != NULL)
3329
0
      contents = elf_section_data (sec)->this_hdr.contents;
3330
0
    else
3331
0
      {
3332
        /* Go get them off disk.  */
3333
0
        if (!bfd_malloc_and_get_section (abfd, sec, &contents))
3334
0
    goto error_return;
3335
0
      }
3336
0
  }
3337
3338
      /* Read this BFD's symbols if we haven't done so already.  */
3339
0
      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
3340
0
  {
3341
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3342
0
    if (isymbuf == NULL)
3343
0
      isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3344
0
              symtab_hdr->sh_info, 0,
3345
0
              NULL, NULL, NULL);
3346
0
    if (isymbuf == NULL)
3347
0
      goto error_return;
3348
0
  }
3349
3350
      /* Get the value of the symbol referred to by the reloc.  */
3351
0
      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
3352
0
  {
3353
0
    Elf_Internal_Sym *isym;
3354
0
    const char *sym_name;
3355
0
    char *new_name;
3356
3357
    /* A local symbol.  */
3358
0
    isym = isymbuf + ELF32_R_SYM (irel->r_info);
3359
0
    if (isym->st_shndx == SHN_UNDEF)
3360
0
      sym_sec = bfd_und_section_ptr;
3361
0
    else if (isym->st_shndx == SHN_ABS)
3362
0
      sym_sec = bfd_abs_section_ptr;
3363
0
    else if (isym->st_shndx == SHN_COMMON)
3364
0
      sym_sec = bfd_com_section_ptr;
3365
0
    else
3366
0
      sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3367
3368
0
    sym_name = bfd_elf_string_from_elf_section (abfd,
3369
0
                  symtab_hdr->sh_link,
3370
0
                  isym->st_name);
3371
3372
0
    if ((sym_sec->flags & SEC_MERGE)
3373
0
        && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
3374
0
      {
3375
0
        symval = isym->st_value;
3376
3377
        /* GAS may reduce relocations against symbols in SEC_MERGE
3378
     sections to a relocation against the section symbol when
3379
     the original addend was zero.  When the reloc is against
3380
     a section symbol we should include the addend in the
3381
     offset passed to _bfd_merged_section_offset, since the
3382
     location of interest is the original symbol.  On the
3383
     other hand, an access to "sym+addend" where "sym" is not
3384
     a section symbol should not include the addend;  Such an
3385
     access is presumed to be an offset from "sym";  The
3386
     location of interest is just "sym".  */
3387
0
        if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
3388
0
    symval += irel->r_addend;
3389
3390
0
        symval = _bfd_merged_section_offset (abfd, & sym_sec,
3391
0
               symval);
3392
3393
0
        if (ELF_ST_TYPE (isym->st_info) != STT_SECTION)
3394
0
    symval += irel->r_addend;
3395
3396
0
        symval += sym_sec->output_section->vma
3397
0
    + sym_sec->output_offset - irel->r_addend;
3398
0
      }
3399
0
    else
3400
0
      symval = (isym->st_value
3401
0
          + sym_sec->output_section->vma
3402
0
          + sym_sec->output_offset);
3403
3404
    /* Tack on an ID so we can uniquely identify this
3405
       local symbol in the global hash table.  */
3406
0
    new_name = bfd_malloc ((bfd_size_type) strlen (sym_name) + 10);
3407
0
    if (new_name == NULL)
3408
0
      goto error_return;
3409
0
    sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
3410
0
    sym_name = new_name;
3411
3412
0
    h = (struct elf32_mn10300_link_hash_entry *)
3413
0
    elf_link_hash_lookup (&hash_table->static_hash_table->root,
3414
0
              sym_name, false, false, false);
3415
0
    free (new_name);
3416
0
  }
3417
0
      else
3418
0
  {
3419
0
    unsigned long indx;
3420
3421
    /* An external symbol.  */
3422
0
    indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
3423
0
    h = (struct elf32_mn10300_link_hash_entry *)
3424
0
    (elf_sym_hashes (abfd)[indx]);
3425
0
    BFD_ASSERT (h != NULL);
3426
0
    if (h->root.root.type != bfd_link_hash_defined
3427
0
        && h->root.root.type != bfd_link_hash_defweak)
3428
      /* This appears to be a reference to an undefined
3429
         symbol.  Just ignore it--it will be caught by the
3430
         regular reloc processing.  */
3431
0
      continue;
3432
3433
    /* Check for a reference to a discarded symbol and ignore it.  */
3434
0
    if (h->root.root.u.def.section->output_section == NULL)
3435
0
      continue;
3436
3437
0
    sym_sec = h->root.root.u.def.section->output_section;
3438
3439
0
    symval = (h->root.root.u.def.value
3440
0
        + h->root.root.u.def.section->output_section->vma
3441
0
        + h->root.root.u.def.section->output_offset);
3442
0
  }
3443
3444
      /* For simplicity of coding, we are going to modify the section
3445
   contents, the section relocs, and the BFD symbol table.  We
3446
   must tell the rest of the code not to free up this
3447
   information.  It would be possible to instead create a table
3448
   of changes which have to be made, as is done in coff-mips.c;
3449
   that would be more work, but would require less memory when
3450
   the linker is run.  */
3451
3452
      /* Try to turn a 32bit pc-relative branch/call into a 16bit pc-relative
3453
   branch/call, also deal with "call" -> "calls" conversions and
3454
   insertion of prologue data into "call" instructions.  */
3455
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL32
3456
0
    || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PLT32)
3457
0
  {
3458
0
    bfd_vma value = symval;
3459
3460
0
    if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PLT32
3461
0
        && h != NULL
3462
0
        && ELF_ST_VISIBILITY (h->root.other) != STV_INTERNAL
3463
0
        && ELF_ST_VISIBILITY (h->root.other) != STV_HIDDEN
3464
0
        && h->root.plt.offset != (bfd_vma) -1)
3465
0
      {
3466
0
        asection * splt;
3467
3468
0
        splt = hash_table->root.splt;
3469
0
        value = ((splt->output_section->vma
3470
0
      + splt->output_offset
3471
0
      + h->root.plt.offset)
3472
0
           - (sec->output_section->vma
3473
0
        + sec->output_offset
3474
0
        + irel->r_offset));
3475
0
      }
3476
3477
    /* If we've got a "call" instruction that needs to be turned
3478
       into a "calls" instruction, do so now.  It saves a byte.  */
3479
0
    if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
3480
0
      {
3481
0
        unsigned char code;
3482
3483
        /* Get the opcode.  */
3484
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3485
3486
        /* Make sure we're working with a "call" instruction!  */
3487
0
        if (code == 0xdd)
3488
0
    {
3489
      /* Note that we've changed the relocs, section contents,
3490
         etc.  */
3491
0
      elf_section_data (sec)->relocs = internal_relocs;
3492
0
      elf_section_data (sec)->this_hdr.contents = contents;
3493
0
      symtab_hdr->contents = (unsigned char *) isymbuf;
3494
3495
      /* Fix the opcode.  */
3496
0
      bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 1);
3497
0
      bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
3498
3499
      /* Fix irel->r_offset and irel->r_addend.  */
3500
0
      irel->r_offset += 1;
3501
0
      irel->r_addend += 1;
3502
3503
      /* Delete one byte of data.  */
3504
0
      if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3505
0
                   irel->r_offset + 3, 1))
3506
0
        goto error_return;
3507
3508
      /* That will change things, so, we should relax again.
3509
         Note that this is not required, and it may be slow.  */
3510
0
      *again = true;
3511
0
    }
3512
0
      }
3513
0
    else if (h)
3514
0
      {
3515
        /* We've got a "call" instruction which needs some data
3516
     from target function filled in.  */
3517
0
        unsigned char code;
3518
3519
        /* Get the opcode.  */
3520
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3521
3522
        /* Insert data from the target function into the "call"
3523
     instruction if needed.  */
3524
0
        if (code == 0xdd)
3525
0
    {
3526
0
      bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 4);
3527
0
      bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
3528
0
           contents + irel->r_offset + 5);
3529
0
    }
3530
0
      }
3531
3532
    /* Deal with pc-relative gunk.  */
3533
0
    value -= (sec->output_section->vma + sec->output_offset);
3534
0
    value -= irel->r_offset;
3535
0
    value += irel->r_addend;
3536
3537
    /* See if the value will fit in 16 bits, note the high value is
3538
       0x7fff + 2 as the target will be two bytes closer if we are
3539
       able to relax, if it's in the same section.  */
3540
0
    if (sec->output_section == sym_sec->output_section)
3541
0
      jump_offset = 0x8001;
3542
0
    else
3543
0
      jump_offset = 0x7fff;
3544
3545
    /* Account for jumps across alignment boundaries using
3546
       align_gap_adjustment.  */
3547
0
    if ((bfd_signed_vma) value < jump_offset - (bfd_signed_vma) align_gap_adjustment
3548
0
        && ((bfd_signed_vma) value > -0x8000 + (bfd_signed_vma) align_gap_adjustment))
3549
0
      {
3550
0
        unsigned char code;
3551
3552
        /* Get the opcode.  */
3553
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3554
3555
0
        if (code != 0xdc && code != 0xdd && code != 0xff)
3556
0
    continue;
3557
3558
        /* Note that we've changed the relocs, section contents, etc.  */
3559
0
        elf_section_data (sec)->relocs = internal_relocs;
3560
0
        elf_section_data (sec)->this_hdr.contents = contents;
3561
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
3562
3563
        /* Fix the opcode.  */
3564
0
        if (code == 0xdc)
3565
0
    bfd_put_8 (abfd, 0xcc, contents + irel->r_offset - 1);
3566
0
        else if (code == 0xdd)
3567
0
    bfd_put_8 (abfd, 0xcd, contents + irel->r_offset - 1);
3568
0
        else if (code == 0xff)
3569
0
    bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
3570
3571
        /* Fix the relocation's type.  */
3572
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3573
0
             (ELF32_R_TYPE (irel->r_info)
3574
0
              == (int) R_MN10300_PLT32)
3575
0
             ? R_MN10300_PLT16 :
3576
0
             R_MN10300_PCREL16);
3577
3578
        /* Delete two bytes of data.  */
3579
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3580
0
               irel->r_offset + 1, 2))
3581
0
    goto error_return;
3582
3583
        /* That will change things, so, we should relax again.
3584
     Note that this is not required, and it may be slow.  */
3585
0
        *again = true;
3586
0
      }
3587
0
  }
3588
3589
      /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
3590
   branch.  */
3591
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL16)
3592
0
  {
3593
0
    bfd_vma value = symval;
3594
3595
    /* If we've got a "call" instruction that needs to be turned
3596
       into a "calls" instruction, do so now.  It saves a byte.  */
3597
0
    if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
3598
0
      {
3599
0
        unsigned char code;
3600
3601
        /* Get the opcode.  */
3602
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3603
3604
        /* Make sure we're working with a "call" instruction!  */
3605
0
        if (code == 0xcd)
3606
0
    {
3607
      /* Note that we've changed the relocs, section contents,
3608
         etc.  */
3609
0
      elf_section_data (sec)->relocs = internal_relocs;
3610
0
      elf_section_data (sec)->this_hdr.contents = contents;
3611
0
      symtab_hdr->contents = (unsigned char *) isymbuf;
3612
3613
      /* Fix the opcode.  */
3614
0
      bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 1);
3615
0
      bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
3616
3617
      /* Fix irel->r_offset and irel->r_addend.  */
3618
0
      irel->r_offset += 1;
3619
0
      irel->r_addend += 1;
3620
3621
      /* Delete one byte of data.  */
3622
0
      if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3623
0
                   irel->r_offset + 1, 1))
3624
0
        goto error_return;
3625
3626
      /* That will change things, so, we should relax again.
3627
         Note that this is not required, and it may be slow.  */
3628
0
      *again = true;
3629
0
    }
3630
0
      }
3631
0
    else if (h)
3632
0
      {
3633
0
        unsigned char code;
3634
3635
        /* Get the opcode.  */
3636
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3637
3638
        /* Insert data from the target function into the "call"
3639
     instruction if needed.  */
3640
0
        if (code == 0xcd)
3641
0
    {
3642
0
      bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 2);
3643
0
      bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
3644
0
           contents + irel->r_offset + 3);
3645
0
    }
3646
0
      }
3647
3648
    /* Deal with pc-relative gunk.  */
3649
0
    value -= (sec->output_section->vma + sec->output_offset);
3650
0
    value -= irel->r_offset;
3651
0
    value += irel->r_addend;
3652
3653
    /* See if the value will fit in 8 bits, note the high value is
3654
       0x7f + 1 as the target will be one bytes closer if we are
3655
       able to relax.  */
3656
0
    if ((long) value < 0x80 && (long) value > -0x80)
3657
0
      {
3658
0
        unsigned char code;
3659
3660
        /* Get the opcode.  */
3661
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3662
3663
0
        if (code != 0xcc)
3664
0
    continue;
3665
3666
        /* Note that we've changed the relocs, section contents, etc.  */
3667
0
        elf_section_data (sec)->relocs = internal_relocs;
3668
0
        elf_section_data (sec)->this_hdr.contents = contents;
3669
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
3670
3671
        /* Fix the opcode.  */
3672
0
        bfd_put_8 (abfd, 0xca, contents + irel->r_offset - 1);
3673
3674
        /* Fix the relocation's type.  */
3675
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3676
0
             R_MN10300_PCREL8);
3677
3678
        /* Delete one byte of data.  */
3679
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3680
0
               irel->r_offset + 1, 1))
3681
0
    goto error_return;
3682
3683
        /* That will change things, so, we should relax again.
3684
     Note that this is not required, and it may be slow.  */
3685
0
        *again = true;
3686
0
      }
3687
0
  }
3688
3689
      /* Try to eliminate an unconditional 8 bit pc-relative branch
3690
   which immediately follows a conditional 8 bit pc-relative
3691
   branch around the unconditional branch.
3692
3693
      original:   new:
3694
      bCC lab1    bCC' lab2
3695
      bra lab2
3696
     lab1:         lab1:
3697
3698
   This happens when the bCC can't reach lab2 at assembly time,
3699
   but due to other relaxations it can reach at link time.  */
3700
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL8)
3701
0
  {
3702
0
    Elf_Internal_Rela *nrel;
3703
0
    unsigned char code;
3704
3705
    /* Do nothing if this reloc is the last byte in the section.  */
3706
0
    if (irel->r_offset == sec->size)
3707
0
      continue;
3708
3709
    /* See if the next instruction is an unconditional pc-relative
3710
       branch, more often than not this test will fail, so we
3711
       test it first to speed things up.  */
3712
0
    code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
3713
0
    if (code != 0xca)
3714
0
      continue;
3715
3716
    /* Also make sure the next relocation applies to the next
3717
       instruction and that it's a pc-relative 8 bit branch.  */
3718
0
    nrel = irel + 1;
3719
0
    if (nrel == irelend
3720
0
        || irel->r_offset + 2 != nrel->r_offset
3721
0
        || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10300_PCREL8)
3722
0
      continue;
3723
3724
    /* Make sure our destination immediately follows the
3725
       unconditional branch.  */
3726
0
    if (symval != (sec->output_section->vma + sec->output_offset
3727
0
       + irel->r_offset + 3))
3728
0
      continue;
3729
3730
    /* Now make sure we are a conditional branch.  This may not
3731
       be necessary, but why take the chance.
3732
3733
       Note these checks assume that R_MN10300_PCREL8 relocs
3734
       only occur on bCC and bCCx insns.  If they occured
3735
       elsewhere, we'd need to know the start of this insn
3736
       for this check to be accurate.  */
3737
0
    code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3738
0
    if (code != 0xc0 && code != 0xc1 && code != 0xc2
3739
0
        && code != 0xc3 && code != 0xc4 && code != 0xc5
3740
0
        && code != 0xc6 && code != 0xc7 && code != 0xc8
3741
0
        && code != 0xc9 && code != 0xe8 && code != 0xe9
3742
0
        && code != 0xea && code != 0xeb)
3743
0
      continue;
3744
3745
    /* We also have to be sure there is no symbol/label
3746
       at the unconditional branch.  */
3747
0
    if (mn10300_elf_symbol_address_p (abfd, sec, isymbuf,
3748
0
              irel->r_offset + 1))
3749
0
      continue;
3750
3751
    /* Note that we've changed the relocs, section contents, etc.  */
3752
0
    elf_section_data (sec)->relocs = internal_relocs;
3753
0
    elf_section_data (sec)->this_hdr.contents = contents;
3754
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
3755
3756
    /* Reverse the condition of the first branch.  */
3757
0
    switch (code)
3758
0
      {
3759
0
      case 0xc8:
3760
0
        code = 0xc9;
3761
0
        break;
3762
0
      case 0xc9:
3763
0
        code = 0xc8;
3764
0
        break;
3765
0
      case 0xc0:
3766
0
        code = 0xc2;
3767
0
        break;
3768
0
      case 0xc2:
3769
0
        code = 0xc0;
3770
0
        break;
3771
0
      case 0xc3:
3772
0
        code = 0xc1;
3773
0
        break;
3774
0
      case 0xc1:
3775
0
        code = 0xc3;
3776
0
        break;
3777
0
      case 0xc4:
3778
0
        code = 0xc6;
3779
0
        break;
3780
0
      case 0xc6:
3781
0
        code = 0xc4;
3782
0
        break;
3783
0
      case 0xc7:
3784
0
        code = 0xc5;
3785
0
        break;
3786
0
      case 0xc5:
3787
0
        code = 0xc7;
3788
0
        break;
3789
0
      case 0xe8:
3790
0
        code = 0xe9;
3791
0
        break;
3792
0
      case 0x9d:
3793
0
        code = 0xe8;
3794
0
        break;
3795
0
      case 0xea:
3796
0
        code = 0xeb;
3797
0
        break;
3798
0
      case 0xeb:
3799
0
        code = 0xea;
3800
0
        break;
3801
0
      }
3802
0
    bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
3803
3804
    /* Set the reloc type and symbol for the first branch
3805
       from the second branch.  */
3806
0
    irel->r_info = nrel->r_info;
3807
3808
    /* Make the reloc for the second branch a null reloc.  */
3809
0
    nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
3810
0
               R_MN10300_NONE);
3811
3812
    /* Delete two bytes of data.  */
3813
0
    if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3814
0
                 irel->r_offset + 1, 2))
3815
0
      goto error_return;
3816
3817
    /* That will change things, so, we should relax again.
3818
       Note that this is not required, and it may be slow.  */
3819
0
    *again = true;
3820
0
  }
3821
3822
      /* Try to turn a 24 immediate, displacement or absolute address
3823
   into a 8 immediate, displacement or absolute address.  */
3824
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_24)
3825
0
  {
3826
0
    bfd_vma value = symval;
3827
0
    value += irel->r_addend;
3828
3829
    /* See if the value will fit in 8 bits.  */
3830
0
    if ((long) value < 0x7f && (long) value > -0x80)
3831
0
      {
3832
0
        unsigned char code;
3833
3834
        /* AM33 insns which have 24 operands are 6 bytes long and
3835
     will have 0xfd as the first byte.  */
3836
3837
        /* Get the first opcode.  */
3838
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
3839
3840
0
        if (code == 0xfd)
3841
0
    {
3842
      /* Get the second opcode.  */
3843
0
      code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
3844
3845
      /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
3846
         equivalent instructions exists.  */
3847
0
      if (code != 0x6b && code != 0x7b
3848
0
          && code != 0x8b && code != 0x9b
3849
0
          && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
3850
0
        || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
3851
0
        || (code & 0x0f) == 0x0e))
3852
0
        {
3853
          /* Not safe if the high bit is on as relaxing may
3854
       move the value out of high mem and thus not fit
3855
       in a signed 8bit value.  This is currently over
3856
       conservative.  */
3857
0
          if ((value & 0x80) == 0)
3858
0
      {
3859
        /* Note that we've changed the relocation contents,
3860
           etc.  */
3861
0
        elf_section_data (sec)->relocs = internal_relocs;
3862
0
        elf_section_data (sec)->this_hdr.contents = contents;
3863
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
3864
3865
        /* Fix the opcode.  */
3866
0
        bfd_put_8 (abfd, 0xfb, contents + irel->r_offset - 3);
3867
0
        bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
3868
3869
        /* Fix the relocation's type.  */
3870
0
        irel->r_info =
3871
0
          ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3872
0
            R_MN10300_8);
3873
3874
        /* Delete two bytes of data.  */
3875
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3876
0
                     irel->r_offset + 1, 2))
3877
0
          goto error_return;
3878
3879
        /* That will change things, so, we should relax
3880
           again.  Note that this is not required, and it
3881
           may be slow.  */
3882
0
        *again = true;
3883
0
        break;
3884
0
      }
3885
0
        }
3886
0
    }
3887
0
      }
3888
0
  }
3889
3890
      /* Try to turn a 32bit immediate, displacement or absolute address
3891
   into a 16bit immediate, displacement or absolute address.  */
3892
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_32
3893
0
    || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOT32
3894
0
    || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTOFF32)
3895
0
  {
3896
0
    bfd_vma value = symval;
3897
3898
0
    if (ELF32_R_TYPE (irel->r_info) != (int) R_MN10300_32)
3899
0
      {
3900
0
        asection * sgot;
3901
3902
0
        sgot = hash_table->root.sgot;
3903
0
        if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOT32)
3904
0
    {
3905
0
      value = sgot->output_offset;
3906
3907
0
      if (h)
3908
0
        value += h->root.got.offset;
3909
0
      else
3910
0
        value += (elf_local_got_offsets
3911
0
            (abfd)[ELF32_R_SYM (irel->r_info)]);
3912
0
    }
3913
0
        else if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTOFF32)
3914
0
    value -= sgot->output_section->vma;
3915
0
        else if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTPC32)
3916
0
    value = (sgot->output_section->vma
3917
0
       - (sec->output_section->vma
3918
0
          + sec->output_offset
3919
0
          + irel->r_offset));
3920
0
        else
3921
0
    abort ();
3922
0
      }
3923
3924
0
    value += irel->r_addend;
3925
3926
    /* See if the value will fit in 24 bits.
3927
       We allow any 16bit match here.  We prune those we can't
3928
       handle below.  */
3929
0
    if (value + 0x800000 < 0x1000000 && irel->r_offset >= 3)
3930
0
      {
3931
0
        unsigned char code;
3932
3933
        /* AM33 insns which have 32bit operands are 7 bytes long and
3934
     will have 0xfe as the first byte.  */
3935
3936
        /* Get the first opcode.  */
3937
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
3938
3939
0
        if (code == 0xfe)
3940
0
    {
3941
      /* Get the second opcode.  */
3942
0
      code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
3943
3944
      /* All the am33 32 -> 24 relaxing possibilities.  */
3945
      /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
3946
         equivalent instructions exists.  */
3947
0
      if (code != 0x6b && code != 0x7b
3948
0
          && code != 0x8b && code != 0x9b
3949
0
          && (ELF32_R_TYPE (irel->r_info)
3950
0
        != (int) R_MN10300_GOTPC32)
3951
0
          && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
3952
0
        || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
3953
0
        || (code & 0x0f) == 0x0e))
3954
0
        {
3955
          /* Not safe if the high bit is on as relaxing may
3956
       move the value out of high mem and thus not fit
3957
       in a signed 16bit value.  This is currently over
3958
       conservative.  */
3959
0
          if ((value & 0x8000) == 0)
3960
0
      {
3961
        /* Note that we've changed the relocation contents,
3962
           etc.  */
3963
0
        elf_section_data (sec)->relocs = internal_relocs;
3964
0
        elf_section_data (sec)->this_hdr.contents = contents;
3965
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
3966
3967
        /* Fix the opcode.  */
3968
0
        bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 3);
3969
0
        bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
3970
3971
        /* Fix the relocation's type.  */
3972
0
        irel->r_info =
3973
0
          ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3974
0
            (ELF32_R_TYPE (irel->r_info)
3975
0
             == (int) R_MN10300_GOTOFF32)
3976
0
            ? R_MN10300_GOTOFF24
3977
0
            : (ELF32_R_TYPE (irel->r_info)
3978
0
               == (int) R_MN10300_GOT32)
3979
0
            ? R_MN10300_GOT24 :
3980
0
            R_MN10300_24);
3981
3982
        /* Delete one byte of data.  */
3983
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3984
0
                     irel->r_offset + 3, 1))
3985
0
          goto error_return;
3986
3987
        /* That will change things, so, we should relax
3988
           again.  Note that this is not required, and it
3989
           may be slow.  */
3990
0
        *again = true;
3991
0
        break;
3992
0
      }
3993
0
        }
3994
0
    }
3995
0
      }
3996
3997
    /* See if the value will fit in 16 bits.
3998
       We allow any 16bit match here.  We prune those we can't
3999
       handle below.  */
4000
0
    if (value + 0x8000 < 0x10000 && irel->r_offset >= 2)
4001
0
      {
4002
0
        unsigned char code;
4003
4004
        /* Most insns which have 32bit operands are 6 bytes long;
4005
     exceptions are pcrel insns and bit insns.
4006
4007
     We handle pcrel insns above.  We don't bother trying
4008
     to handle the bit insns here.
4009
4010
     The first byte of the remaining insns will be 0xfc.  */
4011
4012
        /* Get the first opcode.  */
4013
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
4014
4015
0
        if (code != 0xfc)
4016
0
    continue;
4017
4018
        /* Get the second opcode.  */
4019
0
        code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
4020
4021
0
        if ((code & 0xf0) < 0x80)
4022
0
    switch (code & 0xf0)
4023
0
      {
4024
      /* mov (d32,am),dn   -> mov (d32,am),dn
4025
         mov dm,(d32,am)   -> mov dn,(d32,am)
4026
         mov (d32,am),an   -> mov (d32,am),an
4027
         mov dm,(d32,am)   -> mov dn,(d32,am)
4028
         movbu (d32,am),dn -> movbu (d32,am),dn
4029
         movbu dm,(d32,am) -> movbu dn,(d32,am)
4030
         movhu (d32,am),dn -> movhu (d32,am),dn
4031
         movhu dm,(d32,am) -> movhu dn,(d32,am) */
4032
0
      case 0x00:
4033
0
      case 0x10:
4034
0
      case 0x20:
4035
0
      case 0x30:
4036
0
      case 0x40:
4037
0
      case 0x50:
4038
0
      case 0x60:
4039
0
      case 0x70:
4040
        /* Not safe if the high bit is on as relaxing may
4041
           move the value out of high mem and thus not fit
4042
           in a signed 16bit value.  */
4043
0
        if (code == 0xcc
4044
0
      && (value & 0x8000))
4045
0
          continue;
4046
4047
        /* Note that we've changed the relocation contents, etc.  */
4048
0
        elf_section_data (sec)->relocs = internal_relocs;
4049
0
        elf_section_data (sec)->this_hdr.contents = contents;
4050
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
4051
4052
        /* Fix the opcode.  */
4053
0
        bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
4054
0
        bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
4055
4056
        /* Fix the relocation's type.  */
4057
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4058
0
             (ELF32_R_TYPE (irel->r_info)
4059
0
              == (int) R_MN10300_GOTOFF32)
4060
0
             ? R_MN10300_GOTOFF16
4061
0
             : (ELF32_R_TYPE (irel->r_info)
4062
0
                == (int) R_MN10300_GOT32)
4063
0
             ? R_MN10300_GOT16
4064
0
             : (ELF32_R_TYPE (irel->r_info)
4065
0
                == (int) R_MN10300_GOTPC32)
4066
0
             ? R_MN10300_GOTPC16 :
4067
0
             R_MN10300_16);
4068
4069
        /* Delete two bytes of data.  */
4070
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
4071
0
               irel->r_offset + 2, 2))
4072
0
          goto error_return;
4073
4074
        /* That will change things, so, we should relax again.
4075
           Note that this is not required, and it may be slow.  */
4076
0
        *again = true;
4077
0
        break;
4078
0
      }
4079
0
        else if ((code & 0xf0) == 0x80
4080
0
           || (code & 0xf0) == 0x90)
4081
0
    switch (code & 0xf3)
4082
0
      {
4083
      /* mov dn,(abs32)   -> mov dn,(abs16)
4084
         movbu dn,(abs32) -> movbu dn,(abs16)
4085
         movhu dn,(abs32) -> movhu dn,(abs16)  */
4086
0
      case 0x81:
4087
0
      case 0x82:
4088
0
      case 0x83:
4089
        /* Note that we've changed the relocation contents, etc.  */
4090
0
        elf_section_data (sec)->relocs = internal_relocs;
4091
0
        elf_section_data (sec)->this_hdr.contents = contents;
4092
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
4093
4094
0
        if ((code & 0xf3) == 0x81)
4095
0
          code = 0x01 + (code & 0x0c);
4096
0
        else if ((code & 0xf3) == 0x82)
4097
0
          code = 0x02 + (code & 0x0c);
4098
0
        else if ((code & 0xf3) == 0x83)
4099
0
          code = 0x03 + (code & 0x0c);
4100
0
        else
4101
0
          abort ();
4102
4103
        /* Fix the opcode.  */
4104
0
        bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
4105
4106
        /* Fix the relocation's type.  */
4107
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4108
0
             (ELF32_R_TYPE (irel->r_info)
4109
0
              == (int) R_MN10300_GOTOFF32)
4110
0
             ? R_MN10300_GOTOFF16
4111
0
             : (ELF32_R_TYPE (irel->r_info)
4112
0
                == (int) R_MN10300_GOT32)
4113
0
             ? R_MN10300_GOT16
4114
0
             : (ELF32_R_TYPE (irel->r_info)
4115
0
                == (int) R_MN10300_GOTPC32)
4116
0
             ? R_MN10300_GOTPC16 :
4117
0
             R_MN10300_16);
4118
4119
        /* The opcode got shorter too, so we have to fix the
4120
           addend and offset too!  */
4121
0
        irel->r_offset -= 1;
4122
4123
        /* Delete three bytes of data.  */
4124
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
4125
0
               irel->r_offset + 1, 3))
4126
0
          goto error_return;
4127
4128
        /* That will change things, so, we should relax again.
4129
           Note that this is not required, and it may be slow.  */
4130
0
        *again = true;
4131
0
        break;
4132
4133
      /* mov am,(abs32)    -> mov am,(abs16)
4134
         mov am,(d32,sp)   -> mov am,(d16,sp)
4135
         mov dm,(d32,sp)   -> mov dm,(d32,sp)
4136
         movbu dm,(d32,sp) -> movbu dm,(d32,sp)
4137
         movhu dm,(d32,sp) -> movhu dm,(d32,sp) */
4138
0
      case 0x80:
4139
0
      case 0x90:
4140
0
      case 0x91:
4141
0
      case 0x92:
4142
0
      case 0x93:
4143
        /* sp-based offsets are zero-extended.  */
4144
0
        if (code >= 0x90 && code <= 0x93
4145
0
      && (long) value < 0)
4146
0
          continue;
4147
4148
        /* Note that we've changed the relocation contents, etc.  */
4149
0
        elf_section_data (sec)->relocs = internal_relocs;
4150
0
        elf_section_data (sec)->this_hdr.contents = contents;
4151
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
4152
4153
        /* Fix the opcode.  */
4154
0
        bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
4155
0
        bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
4156
4157
        /* Fix the relocation's type.  */
4158
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4159
0
             (ELF32_R_TYPE (irel->r_info)
4160
0
              == (int) R_MN10300_GOTOFF32)
4161
0
             ? R_MN10300_GOTOFF16
4162
0
             : (ELF32_R_TYPE (irel->r_info)
4163
0
                == (int) R_MN10300_GOT32)
4164
0
             ? R_MN10300_GOT16
4165
0
             : (ELF32_R_TYPE (irel->r_info)
4166
0
                == (int) R_MN10300_GOTPC32)
4167
0
             ? R_MN10300_GOTPC16 :
4168
0
             R_MN10300_16);
4169
4170
        /* Delete two bytes of data.  */
4171
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
4172
0
               irel->r_offset + 2, 2))
4173
0
          goto error_return;
4174
4175
        /* That will change things, so, we should relax again.
4176
           Note that this is not required, and it may be slow.  */
4177
0
        *again = true;
4178
0
        break;
4179
0
      }
4180
0
        else if ((code & 0xf0) < 0xf0)
4181
0
    switch (code & 0xfc)
4182
0
      {
4183
      /* mov imm32,dn     -> mov imm16,dn
4184
         mov imm32,an     -> mov imm16,an
4185
         mov (abs32),dn   -> mov (abs16),dn
4186
         movbu (abs32),dn -> movbu (abs16),dn
4187
         movhu (abs32),dn -> movhu (abs16),dn  */
4188
0
      case 0xcc:
4189
0
      case 0xdc:
4190
0
      case 0xa4:
4191
0
      case 0xa8:
4192
0
      case 0xac:
4193
        /* Not safe if the high bit is on as relaxing may
4194
           move the value out of high mem and thus not fit
4195
           in a signed 16bit value.  */
4196
0
        if (code == 0xcc
4197
0
      && (value & 0x8000))
4198
0
          continue;
4199
4200
        /* "mov imm16, an" zero-extends the immediate.  */
4201
0
        if ((code & 0xfc) == 0xdc
4202
0
      && (long) value < 0)
4203
0
          continue;
4204
4205
        /* Note that we've changed the relocation contents, etc.  */
4206
0
        elf_section_data (sec)->relocs = internal_relocs;
4207
0
        elf_section_data (sec)->this_hdr.contents = contents;
4208
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
4209
4210
0
        if ((code & 0xfc) == 0xcc)
4211
0
          code = 0x2c + (code & 0x03);
4212
0
        else if ((code & 0xfc) == 0xdc)
4213
0
          code = 0x24 + (code & 0x03);
4214
0
        else if ((code & 0xfc) == 0xa4)
4215
0
          code = 0x30 + (code & 0x03);
4216
0
        else if ((code & 0xfc) == 0xa8)
4217
0
          code = 0x34 + (code & 0x03);
4218
0
        else if ((code & 0xfc) == 0xac)
4219
0
          code = 0x38 + (code & 0x03);
4220
0
        else
4221
0
          abort ();
4222
4223
        /* Fix the opcode.  */
4224
0
        bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
4225
4226
        /* Fix the relocation's type.  */
4227
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4228
0
             (ELF32_R_TYPE (irel->r_info)
4229
0
              == (int) R_MN10300_GOTOFF32)
4230
0
             ? R_MN10300_GOTOFF16
4231
0
             : (ELF32_R_TYPE (irel->r_info)
4232
0
                == (int) R_MN10300_GOT32)
4233
0
             ? R_MN10300_GOT16
4234
0
             : (ELF32_R_TYPE (irel->r_info)
4235
0
                == (int) R_MN10300_GOTPC32)
4236
0
             ? R_MN10300_GOTPC16 :
4237
0
             R_MN10300_16);
4238
4239
        /* The opcode got shorter too, so we have to fix the
4240
           addend and offset too!  */
4241
0
        irel->r_offset -= 1;
4242
4243
        /* Delete three bytes of data.  */
4244
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
4245
0
               irel->r_offset + 1, 3))
4246
0
          goto error_return;
4247
4248
        /* That will change things, so, we should relax again.
4249
           Note that this is not required, and it may be slow.  */
4250
0
        *again = true;
4251
0
        break;
4252
4253
      /* mov (abs32),an    -> mov (abs16),an
4254
         mov (d32,sp),an   -> mov (d16,sp),an
4255
         mov (d32,sp),dn   -> mov (d16,sp),dn
4256
         movbu (d32,sp),dn -> movbu (d16,sp),dn
4257
         movhu (d32,sp),dn -> movhu (d16,sp),dn
4258
         add imm32,dn      -> add imm16,dn
4259
         cmp imm32,dn      -> cmp imm16,dn
4260
         add imm32,an      -> add imm16,an
4261
         cmp imm32,an      -> cmp imm16,an
4262
         and imm32,dn      -> and imm16,dn
4263
         or imm32,dn       -> or imm16,dn
4264
         xor imm32,dn      -> xor imm16,dn
4265
         btst imm32,dn     -> btst imm16,dn */
4266
4267
0
      case 0xa0:
4268
0
      case 0xb0:
4269
0
      case 0xb1:
4270
0
      case 0xb2:
4271
0
      case 0xb3:
4272
0
      case 0xc0:
4273
0
      case 0xc8:
4274
4275
0
      case 0xd0:
4276
0
      case 0xd8:
4277
0
      case 0xe0:
4278
0
      case 0xe1:
4279
0
      case 0xe2:
4280
0
      case 0xe3:
4281
        /* cmp imm16, an zero-extends the immediate.  */
4282
0
        if (code == 0xdc
4283
0
      && (long) value < 0)
4284
0
          continue;
4285
4286
        /* So do sp-based offsets.  */
4287
0
        if (code >= 0xb0 && code <= 0xb3
4288
0
      && (long) value < 0)
4289
0
          continue;
4290
4291
        /* Note that we've changed the relocation contents, etc.  */
4292
0
        elf_section_data (sec)->relocs = internal_relocs;
4293
0
        elf_section_data (sec)->this_hdr.contents = contents;
4294
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
4295
4296
        /* Fix the opcode.  */
4297
0
        bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
4298
0
        bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
4299
4300
        /* Fix the relocation's type.  */
4301
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4302
0
             (ELF32_R_TYPE (irel->r_info)
4303
0
              == (int) R_MN10300_GOTOFF32)
4304
0
             ? R_MN10300_GOTOFF16
4305
0
             : (ELF32_R_TYPE (irel->r_info)
4306
0
                == (int) R_MN10300_GOT32)
4307
0
             ? R_MN10300_GOT16
4308
0
             : (ELF32_R_TYPE (irel->r_info)
4309
0
                == (int) R_MN10300_GOTPC32)
4310
0
             ? R_MN10300_GOTPC16 :
4311
0
             R_MN10300_16);
4312
4313
        /* Delete two bytes of data.  */
4314
0
        if (!mn10300_elf_relax_delete_bytes (abfd, sec,
4315
0
               irel->r_offset + 2, 2))
4316
0
          goto error_return;
4317
4318
        /* That will change things, so, we should relax again.
4319
           Note that this is not required, and it may be slow.  */
4320
0
        *again = true;
4321
0
        break;
4322
0
      }
4323
0
        else if (code == 0xfe)
4324
0
    {
4325
      /* add imm32,sp -> add imm16,sp  */
4326
4327
      /* Note that we've changed the relocation contents, etc.  */
4328
0
      elf_section_data (sec)->relocs = internal_relocs;
4329
0
      elf_section_data (sec)->this_hdr.contents = contents;
4330
0
      symtab_hdr->contents = (unsigned char *) isymbuf;
4331
4332
      /* Fix the opcode.  */
4333
0
      bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
4334
0
      bfd_put_8 (abfd, 0xfe, contents + irel->r_offset - 1);
4335
4336
      /* Fix the relocation's type.  */
4337
0
      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4338
0
                 (ELF32_R_TYPE (irel->r_info)
4339
0
            == (int) R_MN10300_GOT32)
4340
0
                 ? R_MN10300_GOT16
4341
0
                 : (ELF32_R_TYPE (irel->r_info)
4342
0
              == (int) R_MN10300_GOTOFF32)
4343
0
                 ? R_MN10300_GOTOFF16
4344
0
                 : (ELF32_R_TYPE (irel->r_info)
4345
0
              == (int) R_MN10300_GOTPC32)
4346
0
                 ? R_MN10300_GOTPC16 :
4347
0
                 R_MN10300_16);
4348
4349
      /* Delete two bytes of data.  */
4350
0
      if (!mn10300_elf_relax_delete_bytes (abfd, sec,
4351
0
                   irel->r_offset + 2, 2))
4352
0
        goto error_return;
4353
4354
      /* That will change things, so, we should relax again.
4355
         Note that this is not required, and it may be slow.  */
4356
0
      *again = true;
4357
0
      break;
4358
0
    }
4359
0
      }
4360
0
  }
4361
0
    }
4362
4363
0
  if (isymbuf != NULL
4364
0
      && symtab_hdr->contents != (unsigned char *) isymbuf)
4365
0
    {
4366
0
      if (! link_info->keep_memory)
4367
0
  free (isymbuf);
4368
0
      else
4369
0
  {
4370
    /* Cache the symbols for elf_link_input_bfd.  */
4371
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
4372
0
  }
4373
0
    }
4374
4375
0
  if (contents != NULL
4376
0
      && elf_section_data (sec)->this_hdr.contents != contents)
4377
0
    {
4378
0
      if (! link_info->keep_memory)
4379
0
  free (contents);
4380
0
      else
4381
0
  {
4382
    /* Cache the section contents for elf_link_input_bfd.  */
4383
0
    elf_section_data (sec)->this_hdr.contents = contents;
4384
0
  }
4385
0
    }
4386
4387
0
  if (elf_section_data (sec)->relocs != internal_relocs)
4388
0
    free (internal_relocs);
4389
4390
0
  return true;
4391
4392
0
 error_return:
4393
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
4394
0
    free (isymbuf);
4395
0
  if (elf_section_data (section)->this_hdr.contents != contents)
4396
0
    free (contents);
4397
0
  if (elf_section_data (section)->relocs != internal_relocs)
4398
0
    free (internal_relocs);
4399
4400
0
  return false;
4401
0
}
Unexecuted instantiation: elf-m10300.c:mn10300_elf_relax_section
Unexecuted instantiation: elf32-am33lin.c:mn10300_elf_relax_section
4402
4403
/* This is a version of bfd_generic_get_relocated_section_contents
4404
   which uses mn10300_elf_relocate_section.  */
4405
4406
static bfd_byte *
4407
mn10300_elf_get_relocated_section_contents (bfd *output_bfd,
4408
              struct bfd_link_info *link_info,
4409
              struct bfd_link_order *link_order,
4410
              bfd_byte *data,
4411
              bool relocatable,
4412
              asymbol **symbols)
4413
5
{
4414
5
  Elf_Internal_Shdr *symtab_hdr;
4415
5
  asection *input_section = link_order->u.indirect.section;
4416
5
  bfd *input_bfd = input_section->owner;
4417
5
  asection **sections = NULL;
4418
5
  Elf_Internal_Rela *internal_relocs = NULL;
4419
5
  Elf_Internal_Sym *isymbuf = NULL;
4420
4421
  /* We only need to handle the case of relaxing, or of having a
4422
     particular set of section contents, specially.  */
4423
5
  if (relocatable
4424
5
      || elf_section_data (input_section)->this_hdr.contents == NULL)
4425
5
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
4426
5
                   link_order, data,
4427
5
                   relocatable,
4428
5
                   symbols);
4429
4430
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
4431
4432
0
  bfd_byte *orig_data = data;
4433
0
  if (data == NULL)
4434
0
    {
4435
0
      data = bfd_malloc (input_section->size);
4436
0
      if (data == NULL)
4437
0
  return NULL;
4438
0
    }
4439
0
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
4440
0
    (size_t) input_section->size);
4441
4442
0
  if ((input_section->flags & SEC_RELOC) != 0
4443
0
      && input_section->reloc_count > 0)
4444
0
    {
4445
0
      asection **secpp;
4446
0
      Elf_Internal_Sym *isym, *isymend;
4447
0
      bfd_size_type amt;
4448
4449
0
      internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
4450
0
               NULL, NULL, false);
4451
0
      if (internal_relocs == NULL)
4452
0
  goto error_return;
4453
4454
0
      if (symtab_hdr->sh_info != 0)
4455
0
  {
4456
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
4457
0
    if (isymbuf == NULL)
4458
0
      isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
4459
0
              symtab_hdr->sh_info, 0,
4460
0
              NULL, NULL, NULL);
4461
0
    if (isymbuf == NULL)
4462
0
      goto error_return;
4463
0
  }
4464
4465
0
      amt = symtab_hdr->sh_info;
4466
0
      amt *= sizeof (asection *);
4467
0
      sections = bfd_malloc (amt);
4468
0
      if (sections == NULL && amt != 0)
4469
0
  goto error_return;
4470
4471
0
      isymend = isymbuf + symtab_hdr->sh_info;
4472
0
      for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
4473
0
  {
4474
0
    asection *isec;
4475
4476
0
    if (isym->st_shndx == SHN_UNDEF)
4477
0
      isec = bfd_und_section_ptr;
4478
0
    else if (isym->st_shndx == SHN_ABS)
4479
0
      isec = bfd_abs_section_ptr;
4480
0
    else if (isym->st_shndx == SHN_COMMON)
4481
0
      isec = bfd_com_section_ptr;
4482
0
    else
4483
0
      isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
4484
4485
0
    *secpp = isec;
4486
0
  }
4487
4488
0
      if (! mn10300_elf_relocate_section (output_bfd, link_info, input_bfd,
4489
0
            input_section, data, internal_relocs,
4490
0
            isymbuf, sections))
4491
0
  goto error_return;
4492
4493
0
      free (sections);
4494
0
      if (symtab_hdr->contents != (unsigned char *) isymbuf)
4495
0
  free (isymbuf);
4496
0
      if (internal_relocs != elf_section_data (input_section)->relocs)
4497
0
  free (internal_relocs);
4498
0
    }
4499
4500
0
  return data;
4501
4502
0
 error_return:
4503
0
  free (sections);
4504
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
4505
0
    free (isymbuf);
4506
0
  if (internal_relocs != elf_section_data (input_section)->relocs)
4507
0
    free (internal_relocs);
4508
0
  if (orig_data == NULL)
4509
0
    free (data);
4510
0
  return NULL;
4511
0
}
Unexecuted instantiation: elf-m10300.c:mn10300_elf_get_relocated_section_contents
elf32-am33lin.c:mn10300_elf_get_relocated_section_contents
Line
Count
Source
4413
5
{
4414
5
  Elf_Internal_Shdr *symtab_hdr;
4415
5
  asection *input_section = link_order->u.indirect.section;
4416
5
  bfd *input_bfd = input_section->owner;
4417
5
  asection **sections = NULL;
4418
5
  Elf_Internal_Rela *internal_relocs = NULL;
4419
5
  Elf_Internal_Sym *isymbuf = NULL;
4420
4421
  /* We only need to handle the case of relaxing, or of having a
4422
     particular set of section contents, specially.  */
4423
5
  if (relocatable
4424
5
      || elf_section_data (input_section)->this_hdr.contents == NULL)
4425
5
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
4426
5
                   link_order, data,
4427
5
                   relocatable,
4428
5
                   symbols);
4429
4430
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
4431
4432
0
  bfd_byte *orig_data = data;
4433
0
  if (data == NULL)
4434
0
    {
4435
0
      data = bfd_malloc (input_section->size);
4436
0
      if (data == NULL)
4437
0
  return NULL;
4438
0
    }
4439
0
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
4440
0
    (size_t) input_section->size);
4441
4442
0
  if ((input_section->flags & SEC_RELOC) != 0
4443
0
      && input_section->reloc_count > 0)
4444
0
    {
4445
0
      asection **secpp;
4446
0
      Elf_Internal_Sym *isym, *isymend;
4447
0
      bfd_size_type amt;
4448
4449
0
      internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
4450
0
               NULL, NULL, false);
4451
0
      if (internal_relocs == NULL)
4452
0
  goto error_return;
4453
4454
0
      if (symtab_hdr->sh_info != 0)
4455
0
  {
4456
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
4457
0
    if (isymbuf == NULL)
4458
0
      isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
4459
0
              symtab_hdr->sh_info, 0,
4460
0
              NULL, NULL, NULL);
4461
0
    if (isymbuf == NULL)
4462
0
      goto error_return;
4463
0
  }
4464
4465
0
      amt = symtab_hdr->sh_info;
4466
0
      amt *= sizeof (asection *);
4467
0
      sections = bfd_malloc (amt);
4468
0
      if (sections == NULL && amt != 0)
4469
0
  goto error_return;
4470
4471
0
      isymend = isymbuf + symtab_hdr->sh_info;
4472
0
      for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
4473
0
  {
4474
0
    asection *isec;
4475
4476
0
    if (isym->st_shndx == SHN_UNDEF)
4477
0
      isec = bfd_und_section_ptr;
4478
0
    else if (isym->st_shndx == SHN_ABS)
4479
0
      isec = bfd_abs_section_ptr;
4480
0
    else if (isym->st_shndx == SHN_COMMON)
4481
0
      isec = bfd_com_section_ptr;
4482
0
    else
4483
0
      isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
4484
4485
0
    *secpp = isec;
4486
0
  }
4487
4488
0
      if (! mn10300_elf_relocate_section (output_bfd, link_info, input_bfd,
4489
0
            input_section, data, internal_relocs,
4490
0
            isymbuf, sections))
4491
0
  goto error_return;
4492
4493
0
      free (sections);
4494
0
      if (symtab_hdr->contents != (unsigned char *) isymbuf)
4495
0
  free (isymbuf);
4496
0
      if (internal_relocs != elf_section_data (input_section)->relocs)
4497
0
  free (internal_relocs);
4498
0
    }
4499
4500
0
  return data;
4501
4502
0
 error_return:
4503
0
  free (sections);
4504
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
4505
0
    free (isymbuf);
4506
0
  if (internal_relocs != elf_section_data (input_section)->relocs)
4507
0
    free (internal_relocs);
4508
0
  if (orig_data == NULL)
4509
0
    free (data);
4510
  return NULL;
4511
0
}
4512
4513
/* Assorted hash table functions.  */
4514
4515
/* Initialize an entry in the link hash table.  */
4516
4517
/* Create an entry in an MN10300 ELF linker hash table.  */
4518
4519
static struct bfd_hash_entry *
4520
elf32_mn10300_link_hash_newfunc (struct bfd_hash_entry *entry,
4521
         struct bfd_hash_table *table,
4522
         const char *string)
4523
0
{
4524
0
  struct elf32_mn10300_link_hash_entry *ret =
4525
0
    (struct elf32_mn10300_link_hash_entry *) entry;
4526
4527
  /* Allocate the structure if it has not already been allocated by a
4528
     subclass.  */
4529
0
  if (ret == NULL)
4530
0
    ret = (struct elf32_mn10300_link_hash_entry *)
4531
0
     bfd_hash_allocate (table, sizeof (* ret));
4532
0
  if (ret == NULL)
4533
0
    return (struct bfd_hash_entry *) ret;
4534
4535
  /* Call the allocation method of the superclass.  */
4536
0
  ret = (struct elf32_mn10300_link_hash_entry *)
4537
0
   _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
4538
0
             table, string);
4539
0
  if (ret != NULL)
4540
0
    {
4541
0
      ret->direct_calls = 0;
4542
0
      ret->stack_size = 0;
4543
0
      ret->movm_args = 0;
4544
0
      ret->movm_stack_size = 0;
4545
0
      ret->flags = 0;
4546
0
      ret->value = 0;
4547
0
      ret->tls_type = GOT_UNKNOWN;
4548
0
    }
4549
4550
0
  return (struct bfd_hash_entry *) ret;
4551
0
}
Unexecuted instantiation: elf-m10300.c:elf32_mn10300_link_hash_newfunc
Unexecuted instantiation: elf32-am33lin.c:elf32_mn10300_link_hash_newfunc
4552
4553
static void
4554
_bfd_mn10300_copy_indirect_symbol (struct bfd_link_info *  info,
4555
           struct elf_link_hash_entry *  dir,
4556
           struct elf_link_hash_entry *  ind)
4557
0
{
4558
0
  struct elf32_mn10300_link_hash_entry * edir;
4559
0
  struct elf32_mn10300_link_hash_entry * eind;
4560
4561
0
  edir = elf_mn10300_hash_entry (dir);
4562
0
  eind = elf_mn10300_hash_entry (ind);
4563
4564
0
  if (ind->root.type == bfd_link_hash_indirect
4565
0
      && dir->got.refcount <= 0)
4566
0
    {
4567
0
      edir->tls_type = eind->tls_type;
4568
0
      eind->tls_type = GOT_UNKNOWN;
4569
0
    }
4570
0
  edir->direct_calls = eind->direct_calls;
4571
0
  edir->stack_size = eind->stack_size;
4572
0
  edir->movm_args = eind->movm_args;
4573
0
  edir->movm_stack_size = eind->movm_stack_size;
4574
0
  edir->flags = eind->flags;
4575
4576
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4577
0
}
Unexecuted instantiation: elf-m10300.c:_bfd_mn10300_copy_indirect_symbol
Unexecuted instantiation: elf32-am33lin.c:_bfd_mn10300_copy_indirect_symbol
4578
4579
/* Destroy an mn10300 ELF linker hash table.  */
4580
4581
static void
4582
elf32_mn10300_link_hash_table_free (bfd *obfd)
4583
0
{
4584
0
  struct elf32_mn10300_link_hash_table *ret
4585
0
    = (struct elf32_mn10300_link_hash_table *) obfd->link.hash;
4586
4587
0
  obfd->link.hash = &ret->static_hash_table->root.root;
4588
0
  _bfd_elf_link_hash_table_free (obfd);
4589
0
  obfd->is_linker_output = true;
4590
0
  obfd->link.hash = &ret->root.root;
4591
0
  _bfd_elf_link_hash_table_free (obfd);
4592
0
}
Unexecuted instantiation: elf-m10300.c:elf32_mn10300_link_hash_table_free
Unexecuted instantiation: elf32-am33lin.c:elf32_mn10300_link_hash_table_free
4593
4594
/* Create an mn10300 ELF linker hash table.  */
4595
4596
static struct bfd_link_hash_table *
4597
elf32_mn10300_link_hash_table_create (bfd *abfd)
4598
0
{
4599
0
  struct elf32_mn10300_link_hash_table *ret;
4600
0
  size_t amt = sizeof (* ret);
4601
4602
0
  ret = bfd_zmalloc (amt);
4603
0
  if (ret == NULL)
4604
0
    return NULL;
4605
4606
0
  amt = sizeof (struct elf_link_hash_table);
4607
0
  ret->static_hash_table = bfd_zmalloc (amt);
4608
0
  if (ret->static_hash_table == NULL)
4609
0
    {
4610
0
      free (ret);
4611
0
      return NULL;
4612
0
    }
4613
4614
0
  if (!_bfd_elf_link_hash_table_init (&ret->static_hash_table->root, abfd,
4615
0
              elf32_mn10300_link_hash_newfunc,
4616
0
              sizeof (struct elf32_mn10300_link_hash_entry)))
4617
0
    {
4618
0
      free (ret->static_hash_table);
4619
0
      free (ret);
4620
0
      return NULL;
4621
0
    }
4622
4623
0
  abfd->is_linker_output = false;
4624
0
  abfd->link.hash = NULL;
4625
0
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
4626
0
              elf32_mn10300_link_hash_newfunc,
4627
0
              sizeof (struct elf32_mn10300_link_hash_entry)))
4628
0
    {
4629
0
      abfd->is_linker_output = true;
4630
0
      abfd->link.hash = &ret->static_hash_table->root.root;
4631
0
      _bfd_elf_link_hash_table_free (abfd);
4632
0
      free (ret);
4633
0
      return NULL;
4634
0
    }
4635
0
  ret->root.root.hash_table_free = elf32_mn10300_link_hash_table_free;
4636
4637
0
  ret->tls_ldm_got.offset = -1;
4638
4639
0
  return & ret->root.root;
4640
0
}
Unexecuted instantiation: elf-m10300.c:elf32_mn10300_link_hash_table_create
Unexecuted instantiation: elf32-am33lin.c:elf32_mn10300_link_hash_table_create
4641
4642
static unsigned long
4643
elf_mn10300_mach (flagword flags)
4644
127
{
4645
127
  switch (flags & EF_MN10300_MACH)
4646
127
    {
4647
3
    case E_MN10300_MACH_MN10300:
4648
127
    default:
4649
127
      return bfd_mach_mn10300;
4650
4651
0
    case E_MN10300_MACH_AM33:
4652
0
      return bfd_mach_am33;
4653
4654
0
    case E_MN10300_MACH_AM33_2:
4655
0
      return bfd_mach_am33_2;
4656
127
    }
4657
127
}
elf-m10300.c:elf_mn10300_mach
Line
Count
Source
4644
50
{
4645
50
  switch (flags & EF_MN10300_MACH)
4646
50
    {
4647
1
    case E_MN10300_MACH_MN10300:
4648
50
    default:
4649
50
      return bfd_mach_mn10300;
4650
4651
0
    case E_MN10300_MACH_AM33:
4652
0
      return bfd_mach_am33;
4653
4654
0
    case E_MN10300_MACH_AM33_2:
4655
0
      return bfd_mach_am33_2;
4656
50
    }
4657
50
}
elf32-am33lin.c:elf_mn10300_mach
Line
Count
Source
4644
77
{
4645
77
  switch (flags & EF_MN10300_MACH)
4646
77
    {
4647
2
    case E_MN10300_MACH_MN10300:
4648
77
    default:
4649
77
      return bfd_mach_mn10300;
4650
4651
0
    case E_MN10300_MACH_AM33:
4652
0
      return bfd_mach_am33;
4653
4654
0
    case E_MN10300_MACH_AM33_2:
4655
0
      return bfd_mach_am33_2;
4656
77
    }
4657
77
}
4658
4659
/* The final processing done just before writing out a MN10300 ELF object
4660
   file.  This gets the MN10300 architecture right based on the machine
4661
   number.  */
4662
4663
static bool
4664
_bfd_mn10300_elf_final_write_processing (bfd *abfd)
4665
0
{
4666
0
  unsigned long val;
4667
4668
0
  switch (bfd_get_mach (abfd))
4669
0
    {
4670
0
    default:
4671
0
    case bfd_mach_mn10300:
4672
0
      val = E_MN10300_MACH_MN10300;
4673
0
      break;
4674
4675
0
    case bfd_mach_am33:
4676
0
      val = E_MN10300_MACH_AM33;
4677
0
      break;
4678
4679
0
    case bfd_mach_am33_2:
4680
0
      val = E_MN10300_MACH_AM33_2;
4681
0
      break;
4682
0
    }
4683
4684
0
  elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH);
4685
0
  elf_elfheader (abfd)->e_flags |= val;
4686
0
  return _bfd_elf_final_write_processing (abfd);
4687
0
}
Unexecuted instantiation: elf-m10300.c:_bfd_mn10300_elf_final_write_processing
Unexecuted instantiation: elf32-am33lin.c:_bfd_am33_elf_final_write_processing
4688
4689
static bool
4690
_bfd_mn10300_elf_object_p (bfd *abfd)
4691
127
{
4692
127
  bfd_default_set_arch_mach (abfd, bfd_arch_mn10300,
4693
127
           elf_mn10300_mach (elf_elfheader (abfd)->e_flags));
4694
127
  return true;
4695
127
}
elf-m10300.c:_bfd_mn10300_elf_object_p
Line
Count
Source
4691
50
{
4692
50
  bfd_default_set_arch_mach (abfd, bfd_arch_mn10300,
4693
50
           elf_mn10300_mach (elf_elfheader (abfd)->e_flags));
4694
  return true;
4695
50
}
elf32-am33lin.c:_bfd_am33_elf_object_p
Line
Count
Source
4691
77
{
4692
77
  bfd_default_set_arch_mach (abfd, bfd_arch_mn10300,
4693
77
           elf_mn10300_mach (elf_elfheader (abfd)->e_flags));
4694
  return true;
4695
77
}
4696
4697
/* Merge backend specific data from an object file to the output
4698
   object file when linking.  */
4699
4700
static bool
4701
_bfd_mn10300_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4702
0
{
4703
0
  bfd *obfd = info->output_bfd;
4704
4705
0
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4706
0
    return true;
4707
4708
0
  if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4709
0
      && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
4710
0
    {
4711
0
      if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
4712
0
             bfd_get_mach (ibfd)))
4713
0
  return false;
4714
0
    }
4715
4716
0
  return true;
4717
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
4718
4719
0
#define PLT0_ENTRY_SIZE     15
4720
0
#define PLT_ENTRY_SIZE      20
4721
0
#define PIC_PLT_ENTRY_SIZE  24
4722
4723
static const bfd_byte elf_mn10300_plt0_entry[PLT0_ENTRY_SIZE] =
4724
{
4725
  0xfc, 0xa0, 0, 0, 0, 0, /* mov  (.got+8),a0 */
4726
  0xfe, 0xe, 0x10, 0, 0, 0, 0,  /* mov  (.got+4),r1 */
4727
  0xf0, 0xf4,     /* jmp  (a0) */
4728
};
4729
4730
static const bfd_byte elf_mn10300_plt_entry[PLT_ENTRY_SIZE] =
4731
{
4732
  0xfc, 0xa0, 0, 0, 0, 0, /* mov  (nameN@GOT + .got),a0 */
4733
  0xf0, 0xf4,     /* jmp  (a0) */
4734
  0xfe, 8, 0, 0, 0, 0, 0, /* mov  reloc-table-address,r0 */
4735
  0xdc, 0, 0, 0, 0,   /* jmp  .plt0 */
4736
};
4737
4738
static const bfd_byte elf_mn10300_pic_plt_entry[PIC_PLT_ENTRY_SIZE] =
4739
{
4740
  0xfc, 0x22, 0, 0, 0, 0, /* mov  (nameN@GOT,a2),a0 */
4741
  0xf0, 0xf4,     /* jmp  (a0) */
4742
  0xfe, 8, 0, 0, 0, 0, 0, /* mov  reloc-table-address,r0 */
4743
  0xf8, 0x22, 8,    /* mov  (8,a2),a0 */
4744
  0xfb, 0xa, 0x1a, 4,   /* mov  (4,a2),r1 */
4745
  0xf0, 0xf4,     /* jmp  (a0) */
4746
};
4747
4748
/* Return size of the first PLT entry.  */
4749
#define elf_mn10300_sizeof_plt0(info) \
4750
0
  (bfd_link_pic (info) ? PIC_PLT_ENTRY_SIZE : PLT0_ENTRY_SIZE)
4751
4752
/* Return size of a PLT entry.  */
4753
#define elf_mn10300_sizeof_plt(info) \
4754
0
  (bfd_link_pic (info) ? PIC_PLT_ENTRY_SIZE : PLT_ENTRY_SIZE)
4755
4756
/* Return offset of the PLT0 address in an absolute PLT entry.  */
4757
#define elf_mn10300_plt_plt0_offset(info) 16
4758
4759
/* Return offset of the linker in PLT0 entry.  */
4760
#define elf_mn10300_plt0_linker_offset(info) 2
4761
4762
/* Return offset of the GOT id in PLT0 entry.  */
4763
#define elf_mn10300_plt0_gotid_offset(info) 9
4764
4765
/* Return offset of the temporary in PLT entry.  */
4766
#define elf_mn10300_plt_temp_offset(info) 8
4767
4768
/* Return offset of the symbol in PLT entry.  */
4769
#define elf_mn10300_plt_symbol_offset(info) 2
4770
4771
/* Return offset of the relocation in PLT entry.  */
4772
#define elf_mn10300_plt_reloc_offset(info) 11
4773
4774
/* The name of the dynamic interpreter.  This is put in the .interp
4775
   section.  */
4776
4777
0
#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
4778
4779
/* Create dynamic sections when linking against a dynamic object.  */
4780
4781
static bool
4782
_bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
4783
0
{
4784
0
  flagword   flags;
4785
0
  asection * s;
4786
0
  elf_backend_data *bed = get_elf_backend_data (abfd);
4787
0
  struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info);
4788
0
  int ptralign = 0;
4789
4790
0
  switch (bed->s->arch_size)
4791
0
    {
4792
0
    case 32:
4793
0
      ptralign = 2;
4794
0
      break;
4795
4796
0
    case 64:
4797
0
      ptralign = 3;
4798
0
      break;
4799
4800
0
    default:
4801
0
      bfd_set_error (bfd_error_bad_value);
4802
0
      return false;
4803
0
    }
4804
4805
  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
4806
     .rel[a].bss sections.  */
4807
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4808
0
     | SEC_LINKER_CREATED);
4809
4810
0
  s = bfd_make_section_anyway_with_flags (abfd,
4811
0
            (bed->default_use_rela_p
4812
0
             ? ".rela.plt" : ".rel.plt"),
4813
0
            flags | SEC_READONLY);
4814
0
  htab->root.srelplt = s;
4815
0
  if (s == NULL
4816
0
      || !bfd_set_section_alignment (s, ptralign))
4817
0
    return false;
4818
4819
0
  if (! _bfd_mn10300_elf_create_got_section (abfd, info))
4820
0
    return false;
4821
4822
0
  if (bed->want_dynbss)
4823
0
    {
4824
      /* The .dynbss section is a place to put symbols which are defined
4825
   by dynamic objects, are referenced by regular objects, and are
4826
   not functions.  We must allocate space for them in the process
4827
   image and use a R_*_COPY reloc to tell the dynamic linker to
4828
   initialize them at run time.  The linker script puts the .dynbss
4829
   section into the .bss section of the final image.  */
4830
0
      s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
4831
0
                SEC_ALLOC | SEC_LINKER_CREATED);
4832
0
      if (s == NULL)
4833
0
  return false;
4834
4835
      /* The .rel[a].bss section holds copy relocs.  This section is not
4836
   normally needed.  We need to create it here, though, so that the
4837
   linker will map it to an output section.  We can't just create it
4838
   only if we need it, because we will not know whether we need it
4839
   until we have seen all the input files, and the first time the
4840
   main linker code calls BFD after examining all the input files
4841
   (size_dynamic_sections) the input sections have already been
4842
   mapped to the output sections.  If the section turns out not to
4843
   be needed, we can discard it later.  We will never need this
4844
   section when generating a shared object, since they do not use
4845
   copy relocs.  */
4846
0
      if (! bfd_link_pic (info))
4847
0
  {
4848
0
    s = bfd_make_section_anyway_with_flags (abfd,
4849
0
              (bed->default_use_rela_p
4850
0
               ? ".rela.bss" : ".rel.bss"),
4851
0
              flags | SEC_READONLY);
4852
0
    if (s == NULL
4853
0
        || !bfd_set_section_alignment (s, ptralign))
4854
0
      return false;
4855
0
  }
4856
0
    }
4857
4858
0
  return true;
4859
0
}
Unexecuted instantiation: elf-m10300.c:_bfd_mn10300_elf_create_dynamic_sections
Unexecuted instantiation: elf32-am33lin.c:_bfd_mn10300_elf_create_dynamic_sections
4860

4861
/* Adjust a symbol defined by a dynamic object and referenced by a
4862
   regular object.  The current definition is in some section of the
4863
   dynamic object, but we're not including those sections.  We have to
4864
   change the definition to something the rest of the link can
4865
   understand.  */
4866
4867
static bool
4868
_bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
4869
          struct elf_link_hash_entry * h)
4870
0
{
4871
0
  struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info);
4872
0
  bfd * dynobj;
4873
0
  asection * s;
4874
4875
0
  dynobj = htab->root.dynobj;
4876
4877
  /* Make sure we know what is going on here.  */
4878
0
  BFD_ASSERT (dynobj != NULL
4879
0
        && (h->needs_plt
4880
0
      || h->is_weakalias
4881
0
      || (h->def_dynamic
4882
0
          && h->ref_regular
4883
0
          && !h->def_regular)));
4884
4885
  /* If this is a function, put it in the procedure linkage table.  We
4886
     will fill in the contents of the procedure linkage table later,
4887
     when we know the address of the .got section.  */
4888
0
  if (h->type == STT_FUNC
4889
0
      || h->needs_plt)
4890
0
    {
4891
0
      if (! bfd_link_pic (info)
4892
0
    && !h->def_dynamic
4893
0
    && !h->ref_dynamic)
4894
0
  {
4895
    /* This case can occur if we saw a PLT reloc in an input
4896
       file, but the symbol was never referred to by a dynamic
4897
       object.  In such a case, we don't actually need to build
4898
       a procedure linkage table, and we can just do a REL32
4899
       reloc instead.  */
4900
0
    BFD_ASSERT (h->needs_plt);
4901
0
    return true;
4902
0
  }
4903
4904
      /* Make sure this symbol is output as a dynamic symbol.  */
4905
0
      if (h->dynindx == -1)
4906
0
  {
4907
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
4908
0
      return false;
4909
0
  }
4910
4911
0
      s = htab->root.splt;
4912
0
      BFD_ASSERT (s != NULL);
4913
4914
      /* If this is the first .plt entry, make room for the special
4915
   first entry.  */
4916
0
      if (s->size == 0)
4917
0
  s->size += elf_mn10300_sizeof_plt0 (info);
4918
4919
      /* If this symbol is not defined in a regular file, and we are
4920
   not generating a shared library, then set the symbol to this
4921
   location in the .plt.  This is required to make function
4922
   pointers compare as equal between the normal executable and
4923
   the shared library.  */
4924
0
      if (! bfd_link_pic (info)
4925
0
    && !h->def_regular)
4926
0
  {
4927
0
    h->root.u.def.section = s;
4928
0
    h->root.u.def.value = s->size;
4929
0
  }
4930
4931
0
      h->plt.offset = s->size;
4932
4933
      /* Make room for this entry.  */
4934
0
      s->size += elf_mn10300_sizeof_plt (info);
4935
4936
      /* We also need to make an entry in the .got.plt section, which
4937
   will be placed in the .got section by the linker script.  */
4938
0
      s = htab->root.sgotplt;
4939
0
      BFD_ASSERT (s != NULL);
4940
0
      s->size += 4;
4941
4942
      /* We also need to make an entry in the .rela.plt section.  */
4943
0
      s = htab->root.srelplt;
4944
0
      BFD_ASSERT (s != NULL);
4945
0
      s->size += sizeof (Elf32_External_Rela);
4946
4947
0
      return true;
4948
0
    }
4949
4950
  /* If this is a weak symbol, and there is a real definition, the
4951
     processor independent code will have arranged for us to see the
4952
     real definition first, and we can just use the same value.  */
4953
0
  if (h->is_weakalias)
4954
0
    {
4955
0
      struct elf_link_hash_entry *def = weakdef (h);
4956
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
4957
0
      h->root.u.def.section = def->root.u.def.section;
4958
0
      h->root.u.def.value = def->root.u.def.value;
4959
0
      return true;
4960
0
    }
4961
4962
  /* This is a reference to a symbol defined by a dynamic object which
4963
     is not a function.  */
4964
4965
  /* If we are creating a shared library, we must presume that the
4966
     only references to the symbol are via the global offset table.
4967
     For such cases we need not do anything here; the relocations will
4968
     be handled correctly by relocate_section.  */
4969
0
  if (bfd_link_pic (info))
4970
0
    return true;
4971
4972
  /* If there are no references to this symbol that do not use the
4973
     GOT, we don't need to generate a copy reloc.  */
4974
0
  if (!h->non_got_ref)
4975
0
    return true;
4976
4977
  /* We must allocate the symbol in our .dynbss section, which will
4978
     become part of the .bss section of the executable.  There will be
4979
     an entry for this symbol in the .dynsym section.  The dynamic
4980
     object will contain position independent code, so all references
4981
     from the dynamic object to this symbol will go through the global
4982
     offset table.  The dynamic linker will use the .dynsym entry to
4983
     determine the address it must put in the global offset table, so
4984
     both the dynamic object and the regular object will refer to the
4985
     same memory location for the variable.  */
4986
4987
0
  s = bfd_get_linker_section (dynobj, ".dynbss");
4988
0
  BFD_ASSERT (s != NULL);
4989
4990
  /* We must generate a R_MN10300_COPY reloc to tell the dynamic linker to
4991
     copy the initial value out of the dynamic object and into the
4992
     runtime process image.  We need to remember the offset into the
4993
     .rela.bss section we are going to use.  */
4994
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
4995
0
    {
4996
0
      asection * srel;
4997
4998
0
      srel = bfd_get_linker_section (dynobj, ".rela.bss");
4999
0
      BFD_ASSERT (srel != NULL);
5000
0
      srel->size += sizeof (Elf32_External_Rela);
5001
0
      h->needs_copy = 1;
5002
0
    }
5003
5004
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
5005
0
}
Unexecuted instantiation: elf-m10300.c:_bfd_mn10300_elf_adjust_dynamic_symbol
Unexecuted instantiation: elf32-am33lin.c:_bfd_mn10300_elf_adjust_dynamic_symbol
5006
5007
/* Set the sizes of the dynamic sections.  */
5008
5009
static bool
5010
_bfd_mn10300_elf_late_size_sections (bfd * output_bfd,
5011
             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 (output_bfd, 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 (bfd * output_bfd,
5129
          struct bfd_link_info * info,
5130
          struct elf_link_hash_entry * h,
5131
          Elf_Internal_Sym * sym)
5132
0
{
5133
0
  struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info);
5134
0
  bfd * dynobj;
5135
5136
0
  dynobj = htab->root.dynobj;
5137
5138
0
  if (h->plt.offset != (bfd_vma) -1)
5139
0
    {
5140
0
      asection *  splt;
5141
0
      asection *  sgot;
5142
0
      asection *  srel;
5143
0
      bfd_vma   plt_index;
5144
0
      bfd_vma   got_offset;
5145
0
      Elf_Internal_Rela rel;
5146
5147
      /* This symbol has an entry in the procedure linkage table.  Set
5148
   it up.  */
5149
5150
0
      BFD_ASSERT (h->dynindx != -1);
5151
5152
0
      splt = htab->root.splt;
5153
0
      sgot = htab->root.sgotplt;
5154
0
      srel = htab->root.srelplt;
5155
0
      BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
5156
5157
      /* Get the index in the procedure linkage table which
5158
   corresponds to this symbol.  This is the index of this symbol
5159
   in all the symbols for which we are making plt entries.  The
5160
   first entry in the procedure linkage table is reserved.  */
5161
0
      plt_index = ((h->plt.offset - elf_mn10300_sizeof_plt0 (info))
5162
0
       / elf_mn10300_sizeof_plt (info));
5163
5164
      /* Get the offset into the .got table of the entry that
5165
   corresponds to this function.  Each .got entry is 4 bytes.
5166
   The first three are reserved.  */
5167
0
      got_offset = (plt_index + 3) * 4;
5168
5169
      /* Fill in the entry in the procedure linkage table.  */
5170
0
      if (! bfd_link_pic (info))
5171
0
  {
5172
0
    memcpy (splt->contents + h->plt.offset, elf_mn10300_plt_entry,
5173
0
      elf_mn10300_sizeof_plt (info));
5174
0
    bfd_put_32 (output_bfd,
5175
0
          (sgot->output_section->vma
5176
0
           + sgot->output_offset
5177
0
           + got_offset),
5178
0
          (splt->contents + h->plt.offset
5179
0
           + elf_mn10300_plt_symbol_offset (info)));
5180
5181
0
    bfd_put_32 (output_bfd,
5182
0
          (1 - h->plt.offset - elf_mn10300_plt_plt0_offset (info)),
5183
0
          (splt->contents + h->plt.offset
5184
0
           + elf_mn10300_plt_plt0_offset (info)));
5185
0
  }
5186
0
      else
5187
0
  {
5188
0
    memcpy (splt->contents + h->plt.offset, elf_mn10300_pic_plt_entry,
5189
0
      elf_mn10300_sizeof_plt (info));
5190
5191
0
    bfd_put_32 (output_bfd, got_offset,
5192
0
          (splt->contents + h->plt.offset
5193
0
           + elf_mn10300_plt_symbol_offset (info)));
5194
0
  }
5195
5196
0
      bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
5197
0
      (splt->contents + h->plt.offset
5198
0
       + elf_mn10300_plt_reloc_offset (info)));
5199
5200
      /* Fill in the entry in the global offset table.  */
5201
0
      bfd_put_32 (output_bfd,
5202
0
      (splt->output_section->vma
5203
0
       + splt->output_offset
5204
0
       + h->plt.offset
5205
0
       + elf_mn10300_plt_temp_offset (info)),
5206
0
      sgot->contents + got_offset);
5207
5208
      /* Fill in the entry in the .rela.plt section.  */
5209
0
      rel.r_offset = (sgot->output_section->vma
5210
0
          + sgot->output_offset
5211
0
          + got_offset);
5212
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_JMP_SLOT);
5213
0
      rel.r_addend = 0;
5214
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel,
5215
0
         (bfd_byte *) ((Elf32_External_Rela *) srel->contents
5216
0
                 + plt_index));
5217
5218
0
      if (!h->def_regular)
5219
  /* Mark the symbol as undefined, rather than as defined in
5220
     the .plt section.  Leave the value alone.  */
5221
0
  sym->st_shndx = SHN_UNDEF;
5222
0
    }
5223
5224
0
  if (h->got.offset != (bfd_vma) -1)
5225
0
    {
5226
0
      asection *  sgot;
5227
0
      asection *  srel;
5228
0
      Elf_Internal_Rela rel;
5229
5230
      /* This symbol has an entry in the global offset table.  Set it up.  */
5231
0
      sgot = htab->root.sgot;
5232
0
      srel = htab->root.srelgot;
5233
0
      BFD_ASSERT (sgot != NULL && srel != NULL);
5234
5235
0
      rel.r_offset = (sgot->output_section->vma
5236
0
          + sgot->output_offset
5237
0
          + (h->got.offset & ~1));
5238
5239
0
      switch (elf_mn10300_hash_entry (h)->tls_type)
5240
0
  {
5241
0
  case GOT_TLS_GD:
5242
0
    bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
5243
0
    bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset + 4);
5244
0
    rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_TLS_DTPMOD);
5245
0
    rel.r_addend = 0;
5246
0
    bfd_elf32_swap_reloca_out (output_bfd, & rel,
5247
0
             (bfd_byte *) ((Elf32_External_Rela *) srel->contents
5248
0
               + srel->reloc_count));
5249
0
    ++ srel->reloc_count;
5250
0
    rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_TLS_DTPOFF);
5251
0
    rel.r_offset += 4;
5252
0
    rel.r_addend = 0;
5253
0
    break;
5254
5255
0
  case GOT_TLS_IE:
5256
    /* We originally stored the addend in the GOT, but at this
5257
       point, we want to move it to the reloc instead as that's
5258
       where the dynamic linker wants it.  */
5259
0
    rel.r_addend = bfd_get_32 (output_bfd, sgot->contents + h->got.offset);
5260
0
    bfd_put_32 (output_bfd, (bfd_vma) 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 (output_bfd, (bfd_vma) 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 (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 (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 (bfd *output_bfd,
5335
            struct bfd_link_info *info,
5336
            bfd_byte *buf ATTRIBUTE_UNUSED)
5337
0
{
5338
0
  bfd *      dynobj;
5339
0
  asection * sgot;
5340
0
  asection * sdyn;
5341
0
  struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info);
5342
5343
0
  dynobj = htab->root.dynobj;
5344
0
  sgot = htab->root.sgotplt;
5345
0
  BFD_ASSERT (sgot != NULL);
5346
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5347
5348
0
  if (elf_hash_table (info)->dynamic_sections_created)
5349
0
    {
5350
0
      asection *     splt;
5351
0
      Elf32_External_Dyn * dyncon;
5352
0
      Elf32_External_Dyn * dynconend;
5353
5354
0
      BFD_ASSERT (sdyn != NULL);
5355
5356
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
5357
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5358
5359
0
      for (; dyncon < dynconend; dyncon++)
5360
0
  {
5361
0
    Elf_Internal_Dyn dyn;
5362
0
    asection * s;
5363
5364
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5365
5366
0
    switch (dyn.d_tag)
5367
0
      {
5368
0
      default:
5369
0
        break;
5370
5371
0
      case DT_PLTGOT:
5372
0
        s = htab->root.sgot;
5373
0
        goto get_vma;
5374
5375
0
      case DT_JMPREL:
5376
0
        s = htab->root.srelplt;
5377
0
      get_vma:
5378
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5379
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5380
0
        break;
5381
5382
0
      case DT_PLTRELSZ:
5383
0
        s = htab->root.srelplt;
5384
0
        dyn.d_un.d_val = s->size;
5385
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5386
0
        break;
5387
0
      }
5388
0
  }
5389
5390
      /* Fill in the first entry in the procedure linkage table.  */
5391
0
      splt = htab->root.splt;
5392
0
      if (splt && splt->size > 0)
5393
0
  {
5394
0
    if (bfd_link_pic (info))
5395
0
      {
5396
0
        memcpy (splt->contents, elf_mn10300_pic_plt_entry,
5397
0
          elf_mn10300_sizeof_plt (info));
5398
0
      }
5399
0
    else
5400
0
      {
5401
0
        memcpy (splt->contents, elf_mn10300_plt0_entry, PLT0_ENTRY_SIZE);
5402
0
        bfd_put_32 (output_bfd,
5403
0
        sgot->output_section->vma + sgot->output_offset + 4,
5404
0
        splt->contents + elf_mn10300_plt0_gotid_offset (info));
5405
0
        bfd_put_32 (output_bfd,
5406
0
        sgot->output_section->vma + sgot->output_offset + 8,
5407
0
        splt->contents + elf_mn10300_plt0_linker_offset (info));
5408
0
      }
5409
5410
    /* UnixWare sets the entsize of .plt to 4, although that doesn't
5411
       really seem like the right value.  */
5412
0
    elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
5413
5414
    /* UnixWare sets the entsize of .plt to 4, but this is incorrect
5415
       as it means that the size of the PLT0 section (15 bytes) is not
5416
       a multiple of the sh_entsize.  Some ELF tools flag this as an
5417
       error.  We could pad PLT0 to 16 bytes, but that would introduce
5418
       compatibilty issues with previous toolchains, so instead we
5419
       just set the entry size to 1.  */
5420
0
    elf_section_data (splt->output_section)->this_hdr.sh_entsize = 1;
5421
0
  }
5422
0
    }
5423
5424
  /* Fill in the first three entries in the global offset table.  */
5425
0
  if (sgot->size > 0)
5426
0
    {
5427
0
      if (sdyn == NULL)
5428
0
  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5429
0
      else
5430
0
  bfd_put_32 (output_bfd,
5431
0
        sdyn->output_section->vma + sdyn->output_offset,
5432
0
        sgot->contents);
5433
0
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
5434
0
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
5435
0
    }
5436
5437
0
  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5438
5439
0
  return true;
5440
0
}
Unexecuted instantiation: elf-m10300.c:_bfd_mn10300_elf_finish_dynamic_sections
Unexecuted instantiation: elf32-am33lin.c:_bfd_mn10300_elf_finish_dynamic_sections
5441
5442
/* Classify relocation types, such that combreloc can sort them
5443
   properly.  */
5444
5445
static enum elf_reloc_type_class
5446
_bfd_mn10300_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5447
           const asection *rel_sec ATTRIBUTE_UNUSED,
5448
           const Elf_Internal_Rela *rela)
5449
0
{
5450
0
  switch ((int) ELF32_R_TYPE (rela->r_info))
5451
0
    {
5452
0
    case R_MN10300_RELATIVE:  return reloc_class_relative;
5453
0
    case R_MN10300_JMP_SLOT:  return reloc_class_plt;
5454
0
    case R_MN10300_COPY:  return reloc_class_copy;
5455
0
    default:      return reloc_class_normal;
5456
0
    }
5457
0
}
Unexecuted instantiation: elf-m10300.c:_bfd_mn10300_elf_reloc_type_class
Unexecuted instantiation: elf32-am33lin.c:_bfd_mn10300_elf_reloc_type_class
5458
5459
/* Allocate space for an MN10300 extension to the bfd elf data structure.  */
5460
5461
static bool
5462
mn10300_elf_mkobject (bfd *abfd)
5463
34.8k
{
5464
34.8k
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_mn10300_obj_tdata));
5465
34.8k
}
elf-m10300.c:mn10300_elf_mkobject
Line
Count
Source
5463
17.3k
{
5464
17.3k
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_mn10300_obj_tdata));
5465
17.3k
}
elf32-am33lin.c:mn10300_elf_mkobject
Line
Count
Source
5463
17.4k
{
5464
17.4k
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_mn10300_obj_tdata));
5465
17.4k
}
5466
5467
#define bfd_elf32_mkobject  mn10300_elf_mkobject
5468
5469
#ifndef ELF_ARCH
5470
#define TARGET_LITTLE_SYM mn10300_elf32_vec
5471
#define TARGET_LITTLE_NAME  "elf32-mn10300"
5472
#define ELF_ARCH    bfd_arch_mn10300
5473
#define ELF_TARGET_ID   MN10300_ELF_DATA
5474
#define ELF_MACHINE_CODE  EM_MN10300
5475
#define ELF_MACHINE_ALT1  EM_CYGNUS_MN10300
5476
#define ELF_MAXPAGESIZE   0x1000
5477
#endif
5478
5479
#define elf_info_to_howto   mn10300_info_to_howto
5480
#define elf_info_to_howto_rel   NULL
5481
#define elf_backend_can_gc_sections 1
5482
#define elf_backend_rela_normal   1
5483
#define elf_backend_check_relocs  mn10300_elf_check_relocs
5484
#define elf_backend_gc_mark_hook  mn10300_elf_gc_mark_hook
5485
#define elf_backend_relocate_section  mn10300_elf_relocate_section
5486
#define bfd_elf32_bfd_relax_section mn10300_elf_relax_section
5487
#define bfd_elf32_bfd_get_relocated_section_contents \
5488
        mn10300_elf_get_relocated_section_contents
5489
#define bfd_elf32_bfd_link_hash_table_create \
5490
        elf32_mn10300_link_hash_table_create
5491
5492
#ifndef elf_symbol_leading_char
5493
#define elf_symbol_leading_char '_'
5494
#endif
5495
5496
/* So we can set bits in e_flags.  */
5497
#define elf_backend_final_write_processing \
5498
          _bfd_mn10300_elf_final_write_processing
5499
#define elf_backend_object_p    _bfd_mn10300_elf_object_p
5500
5501
#define bfd_elf32_bfd_merge_private_bfd_data \
5502
          _bfd_mn10300_elf_merge_private_bfd_data
5503
5504
#define elf_backend_can_gc_sections 1
5505
#define elf_backend_create_dynamic_sections \
5506
  _bfd_mn10300_elf_create_dynamic_sections
5507
#define elf_backend_adjust_dynamic_symbol \
5508
  _bfd_mn10300_elf_adjust_dynamic_symbol
5509
#define elf_backend_late_size_sections \
5510
  _bfd_mn10300_elf_late_size_sections
5511
#define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
5512
#define elf_backend_finish_dynamic_symbol \
5513
  _bfd_mn10300_elf_finish_dynamic_symbol
5514
#define elf_backend_finish_dynamic_sections \
5515
  _bfd_mn10300_elf_finish_dynamic_sections
5516
#define elf_backend_copy_indirect_symbol \
5517
  _bfd_mn10300_copy_indirect_symbol
5518
#define elf_backend_reloc_type_class \
5519
  _bfd_mn10300_elf_reloc_type_class
5520
5521
#define elf_backend_want_got_plt  1
5522
#define elf_backend_plt_readonly  1
5523
#define elf_backend_want_plt_sym  0
5524
#define elf_backend_got_header_size 12
5525
#define elf_backend_dtrel_excludes_plt  1
5526
5527
#include "elf32-target.h"