Coverage Report

Created: 2026-09-14 08:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/elf32-cr16.c
Line
Count
Source
1
/* BFD back-end for National Semiconductor's CR16 ELF
2
   Copyright (C) 2007-2026 Free Software Foundation, Inc.
3
   Written by M R Swami Reddy.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software Foundation,
19
   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
20
21
#include "sysdep.h"
22
#include "bfd.h"
23
#include "bfdlink.h"
24
#include "libbfd.h"
25
#include "libiberty.h"
26
#include "elf-bfd.h"
27
#include "elf/cr16.h"
28
#include "elf32-cr16.h"
29
30
/* The cr16 linker needs to keep track of the number of relocs that
31
   it decides to copy in check_relocs for each symbol.  This is so
32
   that it can discard PC relative relocs if it doesn't need them when
33
   linking with -Bsymbolic.  We store the information in a field
34
   extending the regular ELF linker hash table.  */
35
36
struct elf32_cr16_link_hash_entry
37
{
38
  /* The basic elf link hash table entry.  */
39
  struct elf_link_hash_entry root;
40
41
  /* For function symbols, the number of times this function is
42
     called directly (ie by name).  */
43
  unsigned int direct_calls;
44
45
  /* For function symbols, the size of this function's stack
46
     (if <= 255 bytes).  We stuff this into "call" instructions
47
     to this target when it's valid and profitable to do so.
48
49
     This does not include stack allocated by movm!  */
50
  unsigned char stack_size;
51
52
  /* For function symbols, arguments (if any) for movm instruction
53
     in the prologue.  We stuff this value into "call" instructions
54
     to the target when it's valid and profitable to do so.  */
55
  unsigned char movm_args;
56
57
  /* For function symbols, the amount of stack space that would be allocated
58
     by the movm instruction.  This is redundant with movm_args, but we
59
     add it to the hash table to avoid computing it over and over.  */
60
  unsigned char movm_stack_size;
61
62
/* Used to mark functions which have had redundant parts of their
63
   prologue deleted.  */
64
#define CR16_DELETED_PROLOGUE_BYTES 0x1
65
  unsigned char flags;
66
67
  /* Calculated value.  */
68
  bfd_vma value;
69
};
70
71
/* cr16_reloc_map array maps BFD relocation enum into a CRGAS relocation type.  */
72
73
struct cr16_reloc_map
74
{
75
  bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum.  */
76
  unsigned short cr16_reloc_type;    /* CR16 relocation type.  */
77
};
78
79
static const struct cr16_reloc_map cr16_reloc_map[R_CR16_MAX] =
80
{
81
  {BFD_RELOC_NONE,       R_CR16_NONE},
82
  {BFD_RELOC_CR16_NUM8,      R_CR16_NUM8},
83
  {BFD_RELOC_CR16_NUM16,     R_CR16_NUM16},
84
  {BFD_RELOC_CR16_NUM32,     R_CR16_NUM32},
85
  {BFD_RELOC_CR16_NUM32a,    R_CR16_NUM32a},
86
  {BFD_RELOC_CR16_REGREL4,   R_CR16_REGREL4},
87
  {BFD_RELOC_CR16_REGREL4a,  R_CR16_REGREL4a},
88
  {BFD_RELOC_CR16_REGREL14,  R_CR16_REGREL14},
89
  {BFD_RELOC_CR16_REGREL14a, R_CR16_REGREL14a},
90
  {BFD_RELOC_CR16_REGREL16,  R_CR16_REGREL16},
91
  {BFD_RELOC_CR16_REGREL20,  R_CR16_REGREL20},
92
  {BFD_RELOC_CR16_REGREL20a, R_CR16_REGREL20a},
93
  {BFD_RELOC_CR16_ABS20,     R_CR16_ABS20},
94
  {BFD_RELOC_CR16_ABS24,     R_CR16_ABS24},
95
  {BFD_RELOC_CR16_IMM4,      R_CR16_IMM4},
96
  {BFD_RELOC_CR16_IMM8,      R_CR16_IMM8},
97
  {BFD_RELOC_CR16_IMM16,     R_CR16_IMM16},
98
  {BFD_RELOC_CR16_IMM20,     R_CR16_IMM20},
99
  {BFD_RELOC_CR16_IMM24,     R_CR16_IMM24},
100
  {BFD_RELOC_CR16_IMM32,     R_CR16_IMM32},
101
  {BFD_RELOC_CR16_IMM32a,    R_CR16_IMM32a},
102
  {BFD_RELOC_CR16_DISP4,     R_CR16_DISP4},
103
  {BFD_RELOC_CR16_DISP8,     R_CR16_DISP8},
104
  {BFD_RELOC_CR16_DISP16,    R_CR16_DISP16},
105
  {BFD_RELOC_CR16_DISP24,    R_CR16_DISP24},
106
  {BFD_RELOC_CR16_DISP24a,   R_CR16_DISP24a},
107
  {BFD_RELOC_CR16_SWITCH8,   R_CR16_SWITCH8},
108
  {BFD_RELOC_CR16_SWITCH16,  R_CR16_SWITCH16},
109
  {BFD_RELOC_CR16_SWITCH32,  R_CR16_SWITCH32},
110
  {BFD_RELOC_CR16_GOT_REGREL20, R_CR16_GOT_REGREL20},
111
  {BFD_RELOC_CR16_GOTC_REGREL20, R_CR16_GOTC_REGREL20},
112
  {BFD_RELOC_GLOB_DAT,       R_CR16_GLOB_DAT}
113
};
114
115
static reloc_howto_type cr16_elf_howto_table[] =
116
{
117
  HOWTO (R_CR16_NONE,      /* type */
118
   0,        /* rightshift */
119
   0,        /* size */
120
   0,        /* bitsize */
121
   false,        /* pc_relative */
122
   0,        /* bitpos */
123
   complain_overflow_dont,   /* complain_on_overflow */
124
   bfd_elf_generic_reloc,    /* special_function */
125
   "R_CR16_NONE",      /* name */
126
   false,        /* partial_inplace */
127
   0,        /* src_mask */
128
   0,        /* dst_mask */
129
   false),       /* pcrel_offset */
130
131
  HOWTO (R_CR16_NUM8,      /* type */
132
   0,        /* rightshift */
133
   1,        /* size */
134
   8,        /* bitsize */
135
   false,        /* pc_relative */
136
   0,        /* bitpos */
137
   complain_overflow_bitfield,/* complain_on_overflow */
138
   bfd_elf_generic_reloc,    /* special_function */
139
   "R_CR16_NUM8",      /* name */
140
   false,        /* partial_inplace */
141
   0x0,        /* src_mask */
142
   0xff,         /* dst_mask */
143
   false),       /* pcrel_offset */
144
145
  HOWTO (R_CR16_NUM16,       /* type */
146
   0,        /* rightshift */
147
   2,        /* size */
148
   16,         /* bitsize */
149
   false,        /* pc_relative */
150
   0,        /* bitpos */
151
   complain_overflow_bitfield,/* complain_on_overflow */
152
   bfd_elf_generic_reloc,    /* special_function */
153
   "R_CR16_NUM16",     /* name */
154
   false,        /* partial_inplace */
155
   0x0,        /* src_mask */
156
   0xffff,       /* dst_mask */
157
   false),       /* pcrel_offset */
158
159
  HOWTO (R_CR16_NUM32,       /* type */
160
   0,        /* rightshift */
161
   4,        /* size */
162
   32,         /* bitsize */
163
   false,        /* pc_relative */
164
   0,        /* bitpos */
165
   complain_overflow_bitfield,/* complain_on_overflow */
166
   bfd_elf_generic_reloc,    /* special_function */
167
   "R_CR16_NUM32",     /* name */
168
   false,        /* partial_inplace */
169
   0x0,        /* src_mask */
170
   0xffffffff,       /* dst_mask */
171
   false),       /* pcrel_offset */
172
173
  HOWTO (R_CR16_NUM32a,      /* type */
174
   1,        /* rightshift */
175
   4,        /* size */
176
   32,         /* bitsize */
177
   false,        /* pc_relative */
178
   0,        /* bitpos */
179
   complain_overflow_bitfield,/* complain_on_overflow */
180
   bfd_elf_generic_reloc,    /* special_function */
181
   "R_CR16_NUM32a",    /* name */
182
   false,        /* partial_inplace */
183
   0x0,        /* src_mask */
184
   0xffffffff,       /* dst_mask */
185
   false),       /* pcrel_offset */
186
187
  HOWTO (R_CR16_REGREL4,     /* type */
188
   0,        /* rightshift */
189
   1,        /* size */
190
   4,        /* bitsize */
191
   false,        /* pc_relative */
192
   0,        /* bitpos */
193
   complain_overflow_bitfield,/* complain_on_overflow */
194
   bfd_elf_generic_reloc,    /* special_function */
195
   "R_CR16_REGREL4",     /* name */
196
   false,        /* partial_inplace */
197
   0x0,        /* src_mask */
198
   0xf,        /* dst_mask */
199
   false),       /* pcrel_offset */
200
201
  HOWTO (R_CR16_REGREL4a,    /* type */
202
   0,        /* rightshift */
203
   1,        /* size */
204
   4,        /* bitsize */
205
   false,        /* pc_relative */
206
   0,        /* bitpos */
207
   complain_overflow_bitfield,/* complain_on_overflow */
208
   bfd_elf_generic_reloc,    /* special_function */
209
   "R_CR16_REGREL4a",    /* name */
210
   false,        /* partial_inplace */
211
   0x0,        /* src_mask */
212
   0xf,        /* dst_mask */
213
   false),       /* pcrel_offset */
214
215
  HOWTO (R_CR16_REGREL14,    /* type */
216
   0,        /* rightshift */
217
   2,        /* size */
218
   14,         /* bitsize */
219
   false,        /* pc_relative */
220
   0,        /* bitpos */
221
   complain_overflow_bitfield,/* complain_on_overflow */
222
   bfd_elf_generic_reloc,    /* special_function */
223
   "R_CR16_REGREL14",    /* name */
224
   false,        /* partial_inplace */
225
   0x0,        /* src_mask */
226
   0x3fff,       /* dst_mask */
227
   false),       /* pcrel_offset */
228
229
  HOWTO (R_CR16_REGREL14a,     /* type */
230
   0,        /* rightshift */
231
   2,        /* size */
232
   14,         /* bitsize */
233
   false,        /* pc_relative */
234
   0,        /* bitpos */
235
   complain_overflow_bitfield,/* complain_on_overflow */
236
   bfd_elf_generic_reloc,    /* special_function */
237
   "R_CR16_REGREL14a",     /* name */
238
   false,        /* partial_inplace */
239
   0x0,        /* src_mask */
240
   0x3fff,       /* dst_mask */
241
   false),       /* pcrel_offset */
242
243
  HOWTO (R_CR16_REGREL16,    /* type */
244
   0,        /* rightshift */
245
   2,        /* size */
246
   16,         /* bitsize */
247
   false,        /* pc_relative */
248
   0,        /* bitpos */
249
   complain_overflow_bitfield,/* complain_on_overflow */
250
   bfd_elf_generic_reloc,    /* special_function */
251
   "R_CR16_REGREL16",    /* name */
252
   false,        /* partial_inplace */
253
   0x0,        /* src_mask */
254
   0xffff,       /* dst_mask */
255
   false),       /* pcrel_offset */
256
257
  HOWTO (R_CR16_REGREL20,    /* type */
258
   0,        /* rightshift */
259
   4,        /* size */
260
   20,         /* bitsize */
261
   false,        /* pc_relative */
262
   0,        /* bitpos */
263
   complain_overflow_bitfield,/* complain_on_overflow */
264
   bfd_elf_generic_reloc,    /* special_function */
265
   "R_CR16_REGREL20",    /* name */
266
   false,        /* partial_inplace */
267
   0x0,        /* src_mask */
268
   0xfffff,      /* dst_mask */
269
   false),       /* pcrel_offset */
270
271
  HOWTO (R_CR16_REGREL20a,     /* type */
272
   0,        /* rightshift */
273
   4,        /* size */
274
   20,         /* bitsize */
275
   false,        /* pc_relative */
276
   0,        /* bitpos */
277
   complain_overflow_bitfield,/* complain_on_overflow */
278
   bfd_elf_generic_reloc,    /* special_function */
279
   "R_CR16_REGREL20a",     /* name */
280
   false,        /* partial_inplace */
281
   0x0,        /* src_mask */
282
   0xfffff,      /* dst_mask */
283
   false),       /* pcrel_offset */
284
285
  HOWTO (R_CR16_ABS20,       /* type */
286
   0,        /* rightshift */
287
   4,        /* size */
288
   20,         /* bitsize */
289
   false,        /* pc_relative */
290
   0,        /* bitpos */
291
   complain_overflow_bitfield,/* complain_on_overflow */
292
   bfd_elf_generic_reloc,    /* special_function */
293
   "R_CR16_ABS20",     /* name */
294
   false,        /* partial_inplace */
295
   0x0,        /* src_mask */
296
   0xfffff,      /* dst_mask */
297
   false),       /* pcrel_offset */
298
299
  HOWTO (R_CR16_ABS24,       /* type */
300
   0,        /* rightshift */
301
   4,        /* size */
302
   24,         /* bitsize */
303
   false,        /* pc_relative */
304
   0,        /* bitpos */
305
   complain_overflow_bitfield,/* complain_on_overflow */
306
   bfd_elf_generic_reloc,    /* special_function */
307
   "R_CR16_ABS24",     /* name */
308
   false,        /* partial_inplace */
309
   0x0,        /* src_mask */
310
   0xffffff,       /* dst_mask */
311
   false),       /* pcrel_offset */
312
313
  HOWTO (R_CR16_IMM4,      /* type */
314
   0,        /* rightshift */
315
   1,        /* size */
316
   4,        /* bitsize */
317
   false,        /* pc_relative */
318
   0,        /* bitpos */
319
   complain_overflow_bitfield,/* complain_on_overflow */
320
   bfd_elf_generic_reloc,    /* special_function */
321
   "R_CR16_IMM4",      /* name */
322
   false,        /* partial_inplace */
323
   0x0,        /* src_mask */
324
   0xf,        /* dst_mask */
325
   false),       /* pcrel_offset */
326
327
  HOWTO (R_CR16_IMM8,      /* type */
328
   0,        /* rightshift */
329
   1,        /* size */
330
   8,        /* bitsize */
331
   false,        /* pc_relative */
332
   0,        /* bitpos */
333
   complain_overflow_bitfield,/* complain_on_overflow */
334
   bfd_elf_generic_reloc,    /* special_function */
335
   "R_CR16_IMM8",      /* name */
336
   false,        /* partial_inplace */
337
   0x0,        /* src_mask */
338
   0xff,         /* dst_mask */
339
   false),       /* pcrel_offset */
340
341
  HOWTO (R_CR16_IMM16,       /* type */
342
   0,        /* rightshift */
343
   2,        /* size */
344
   16,         /* bitsize */
345
   false,        /* pc_relative */
346
   0,        /* bitpos */
347
   complain_overflow_bitfield,/* complain_on_overflow */
348
   bfd_elf_generic_reloc,    /* special_function */
349
   "R_CR16_IMM16",     /* name */
350
   false,        /* partial_inplace */
351
   0x0,        /* src_mask */
352
   0xffff,       /* dst_mask */
353
   false),       /* pcrel_offset */
354
355
  HOWTO (R_CR16_IMM20,       /* type */
356
   0,        /* rightshift */
357
   4,        /* size */
358
   20,         /* bitsize */
359
   false,        /* pc_relative */
360
   0,        /* bitpos */
361
   complain_overflow_bitfield,/* complain_on_overflow */
362
   bfd_elf_generic_reloc,    /* special_function */
363
   "R_CR16_IMM20",     /* name */
364
   false,        /* partial_inplace */
365
   0x0,        /* src_mask */
366
   0xfffff,      /* dst_mask */
367
   false),       /* pcrel_offset */
368
369
  HOWTO (R_CR16_IMM24,       /* type */
370
   0,        /* rightshift */
371
   4,        /* size */
372
   24,         /* bitsize */
373
   false,        /* pc_relative */
374
   0,        /* bitpos */
375
   complain_overflow_bitfield,/* complain_on_overflow */
376
   bfd_elf_generic_reloc,    /* special_function */
377
   "R_CR16_IMM24",     /* name */
378
   false,        /* partial_inplace */
379
   0x0,        /* src_mask */
380
   0xffffff,       /* dst_mask */
381
   false),       /* pcrel_offset */
382
383
  HOWTO (R_CR16_IMM32,       /* type */
384
   0,        /* rightshift */
385
   4,        /* size */
386
   32,         /* bitsize */
387
   false,        /* pc_relative */
388
   0,        /* bitpos */
389
   complain_overflow_bitfield,/* complain_on_overflow */
390
   bfd_elf_generic_reloc,    /* special_function */
391
   "R_CR16_IMM32",     /* name */
392
   false,        /* partial_inplace */
393
   0x0,        /* src_mask */
394
   0xffffffff,       /* dst_mask */
395
   false),       /* pcrel_offset */
396
397
  HOWTO (R_CR16_IMM32a,      /* type */
398
   1,        /* rightshift */
399
   4,        /* size */
400
   32,         /* bitsize */
401
   false,        /* pc_relative */
402
   0,        /* bitpos */
403
   complain_overflow_bitfield,/* complain_on_overflow */
404
   bfd_elf_generic_reloc,    /* special_function */
405
   "R_CR16_IMM32a",    /* name */
406
   false,        /* partial_inplace */
407
   0x0,        /* src_mask */
408
   0xffffffff,       /* dst_mask */
409
   false),       /* pcrel_offset */
410
411
  HOWTO (R_CR16_DISP4,       /* type */
412
   1,        /* rightshift */
413
   1,        /* size */
414
   4,        /* bitsize */
415
   true,         /* pc_relative */
416
   0,        /* bitpos */
417
   complain_overflow_unsigned, /* complain_on_overflow */
418
   bfd_elf_generic_reloc,    /* special_function */
419
   "R_CR16_DISP4",     /* name */
420
   false,        /* partial_inplace */
421
   0x0,        /* src_mask */
422
   0xf,        /* dst_mask */
423
   false),       /* pcrel_offset */
424
425
  HOWTO (R_CR16_DISP8,       /* type */
426
   1,        /* rightshift */
427
   1,        /* size */
428
   8,        /* bitsize */
429
   true,         /* pc_relative */
430
   0,        /* bitpos */
431
   complain_overflow_unsigned, /* complain_on_overflow */
432
   bfd_elf_generic_reloc,    /* special_function */
433
   "R_CR16_DISP8",     /* name */
434
   false,        /* partial_inplace */
435
   0x0,        /* src_mask */
436
   0x1ff,        /* dst_mask */
437
   false),       /* pcrel_offset */
438
439
  HOWTO (R_CR16_DISP16,      /* type */
440
   0,        /* rightshift REVIITS: To sync with WinIDEA*/
441
   2,        /* size */
442
   16,         /* bitsize */
443
   true,         /* pc_relative */
444
   0,        /* bitpos */
445
   complain_overflow_unsigned, /* complain_on_overflow */
446
   bfd_elf_generic_reloc,    /* special_function */
447
   "R_CR16_DISP16",    /* name */
448
   false,        /* partial_inplace */
449
   0x0,        /* src_mask */
450
   0x1ffff,      /* dst_mask */
451
   false),       /* pcrel_offset */
452
  /* REVISIT: DISP24 should be left-shift by 2 as per ISA doc
453
     but its not done, to sync with WinIDEA and CR16 4.1 tools */
454
  HOWTO (R_CR16_DISP24,      /* type */
455
   0,        /* rightshift */
456
   4,        /* size */
457
   24,         /* bitsize */
458
   true,         /* pc_relative */
459
   0,        /* bitpos */
460
   complain_overflow_unsigned, /* complain_on_overflow */
461
   bfd_elf_generic_reloc,    /* special_function */
462
   "R_CR16_DISP24",    /* name */
463
   false,        /* partial_inplace */
464
   0x0,        /* src_mask */
465
   0x1ffffff,      /* dst_mask */
466
   false),       /* pcrel_offset */
467
468
  HOWTO (R_CR16_DISP24a,     /* type */
469
   0,        /* rightshift */
470
   4,        /* size */
471
   24,         /* bitsize */
472
   true,         /* pc_relative */
473
   0,        /* bitpos */
474
   complain_overflow_unsigned, /* complain_on_overflow */
475
   bfd_elf_generic_reloc,    /* special_function */
476
   "R_CR16_DISP24a",     /* name */
477
   false,        /* partial_inplace */
478
   0x0,        /* src_mask */
479
   0xffffff,       /* dst_mask */
480
   false),       /* pcrel_offset */
481
482
  /* An 8 bit switch table entry.  This is generated for an expression
483
     such as ``.byte L1 - L2''.  The offset holds the difference
484
     between the reloc address and L2.  */
485
  HOWTO (R_CR16_SWITCH8,     /* type */
486
   0,        /* rightshift */
487
   1,        /* size */
488
   8,        /* bitsize */
489
   false,        /* pc_relative */
490
   0,        /* bitpos */
491
   complain_overflow_unsigned, /* complain_on_overflow */
492
   bfd_elf_generic_reloc,    /* special_function */
493
   "R_CR16_SWITCH8",     /* name */
494
   false,        /* partial_inplace */
495
   0x0,        /* src_mask */
496
   0xff,         /* dst_mask */
497
   true),        /* pcrel_offset */
498
499
  /* A 16 bit switch table entry.  This is generated for an expression
500
     such as ``.word L1 - L2''.  The offset holds the difference
501
     between the reloc address and L2.  */
502
  HOWTO (R_CR16_SWITCH16,    /* type */
503
   0,        /* rightshift */
504
   2,        /* size */
505
   16,         /* bitsize */
506
   false,        /* pc_relative */
507
   0,        /* bitpos */
508
   complain_overflow_unsigned, /* complain_on_overflow */
509
   bfd_elf_generic_reloc,    /* special_function */
510
   "R_CR16_SWITCH16",    /* name */
511
   false,        /* partial_inplace */
512
   0x0,        /* src_mask */
513
   0xffff,       /* dst_mask */
514
   true),        /* pcrel_offset */
515
516
  /* A 32 bit switch table entry.  This is generated for an expression
517
     such as ``.long L1 - L2''.  The offset holds the difference
518
     between the reloc address and L2.  */
519
  HOWTO (R_CR16_SWITCH32,    /* type */
520
   0,        /* rightshift */
521
   4,        /* size */
522
   32,         /* bitsize */
523
   false,        /* pc_relative */
524
   0,        /* bitpos */
525
   complain_overflow_unsigned, /* complain_on_overflow */
526
   bfd_elf_generic_reloc,    /* special_function */
527
   "R_CR16_SWITCH32",    /* name */
528
   false,        /* partial_inplace */
529
   0x0,        /* src_mask */
530
   0xffffffff,       /* dst_mask */
531
   true),        /* pcrel_offset */
532
533
  HOWTO (R_CR16_GOT_REGREL20,    /* type */
534
   0,        /* rightshift */
535
   4,        /* size */
536
   20,         /* bitsize */
537
   false,        /* pc_relative */
538
   0,        /* bitpos */
539
   complain_overflow_bitfield,/* complain_on_overflow */
540
   bfd_elf_generic_reloc,    /* special_function */
541
   "R_CR16_GOT_REGREL20",    /* name */
542
   true,         /* partial_inplace */
543
   0x0,        /* src_mask */
544
   0xfffff,      /* dst_mask */
545
   false),       /* pcrel_offset */
546
547
  HOWTO (R_CR16_GOTC_REGREL20,     /* type */
548
   0,        /* rightshift */
549
   4,        /* size */
550
   20,         /* bitsize */
551
   false,        /* pc_relative */
552
   0,        /* bitpos */
553
   complain_overflow_bitfield,/* complain_on_overflow */
554
   bfd_elf_generic_reloc,    /* special_function */
555
   "R_CR16_GOTC_REGREL20",   /* name */
556
   true,         /* partial_inplace */
557
   0x0,        /* src_mask */
558
   0xfffff,      /* dst_mask */
559
   false),       /* pcrel_offset */
560
561
  HOWTO (R_CR16_GLOB_DAT,    /* type */
562
   0,        /* rightshift */
563
   4,        /* size */
564
   32,         /* bitsize */
565
   false,        /* pc_relative */
566
   0,        /* bitpos */
567
   complain_overflow_unsigned, /* complain_on_overflow */
568
   bfd_elf_generic_reloc,    /* special_function */
569
   "R_CR16_GLOB_DAT",    /* name */
570
   false,        /* partial_inplace */
571
   0x0,        /* src_mask */
572
   0xffffffff,       /* dst_mask */
573
   true)         /* pcrel_offset */
574
};
575
576
577
/* Create the GOT section.  */
578
579
static bool
580
_bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
581
0
{
582
0
  flagword   flags;
583
0
  asection * s;
584
0
  struct elf_link_hash_entry * h;
585
0
  elf_backend_data * bed = get_elf_backend_data (abfd);
586
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
587
0
  int ptralign;
588
589
  /* This function may be called more than once.  */
590
0
  if (htab->sgot != NULL)
591
0
    return true;
592
593
0
  switch (bed->s->arch_size)
594
0
    {
595
0
    case 16:
596
0
      ptralign = 1;
597
0
      break;
598
599
0
    case 32:
600
0
      ptralign = 2;
601
0
      break;
602
603
0
    default:
604
0
      bfd_set_error (bfd_error_bad_value);
605
0
      return false;
606
0
    }
607
608
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
609
0
     | SEC_LINKER_CREATED);
610
611
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
612
0
  htab->sgot= s;
613
0
  if (s == NULL
614
0
      || !bfd_set_section_alignment (s, ptralign))
615
0
    return false;
616
617
0
  if (bed->want_got_plt)
618
0
    {
619
0
      s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
620
0
      htab->sgotplt = s;
621
0
      if (s == NULL
622
0
    || !bfd_set_section_alignment (s, ptralign))
623
0
  return false;
624
0
    }
625
626
  /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
627
     (or .got.plt) section.  We don't do this in the linker script
628
     because we don't want to define the symbol if we are not creating
629
     a global offset table.  */
630
0
  h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
631
0
  htab->hgot = h;
632
0
  if (h == NULL)
633
0
    return false;
634
635
  /* The first bit of the global offset table is the header.  */
636
0
  s->size += bed->got_header_size;
637
638
0
  return true;
639
0
}
640
641
642
/* Retrieve a howto ptr using a BFD reloc_code.  */
643
644
static reloc_howto_type *
645
elf_cr16_reloc_type_lookup (bfd *abfd,
646
          bfd_reloc_code_real_type code)
647
0
{
648
0
  unsigned int i;
649
650
0
  for (i = 0; i < R_CR16_MAX; i++)
651
0
    if (code == cr16_reloc_map[i].bfd_reloc_enum)
652
0
      return &cr16_elf_howto_table[cr16_reloc_map[i].cr16_reloc_type];
653
654
0
  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
655
0
          abfd, code);
656
0
  return NULL;
657
0
}
658
659
static reloc_howto_type *
660
elf_cr16_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
661
          const char *r_name)
662
0
{
663
0
  unsigned int i;
664
665
0
  for (i = 0; ARRAY_SIZE (cr16_elf_howto_table); i++)
666
0
    if (cr16_elf_howto_table[i].name != NULL
667
0
  && strcasecmp (cr16_elf_howto_table[i].name, r_name) == 0)
668
0
      return cr16_elf_howto_table + i;
669
670
0
  return NULL;
671
0
}
672
673
/* Retrieve a howto ptr using an internal relocation entry.  */
674
675
static bool
676
elf_cr16_info_to_howto (bfd *abfd, arelent *cache_ptr,
677
      Elf_Internal_Rela *dst)
678
302
{
679
302
  unsigned int r_type = ELF32_R_TYPE (dst->r_info);
680
681
302
  if (r_type >= R_CR16_MAX)
682
20
    {
683
      /* xgettext:c-format */
684
20
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
685
20
        abfd, r_type);
686
20
      bfd_set_error (bfd_error_bad_value);
687
20
      return false;
688
20
    }
689
282
  cache_ptr->howto = cr16_elf_howto_table + r_type;
690
282
  return true;
691
302
}
692
693
/* Look through the relocs for a section during the first phase.
694
   Since we don't do .gots or .plts, we just need to consider the
695
   virtual table relocs for gc.  */
696
697
static bool
698
cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
699
           const Elf_Internal_Rela *relocs)
700
0
{
701
0
  Elf_Internal_Shdr *symtab_hdr;
702
0
  Elf_Internal_Sym * isymbuf = NULL;
703
0
  struct elf_link_hash_entry **sym_hashes;
704
0
  const Elf_Internal_Rela *rel;
705
0
  const Elf_Internal_Rela *rel_end;
706
0
  bfd *      dynobj;
707
0
  bfd_vma *  local_got_offsets;
708
0
  asection * sgot;
709
0
  asection * srelgot;
710
711
0
  sgot    = NULL;
712
0
  srelgot = NULL;
713
0
  bool result = false;
714
715
0
  if (bfd_link_relocatable (info))
716
0
    return true;
717
718
0
  symtab_hdr = &elf_symtab_hdr (abfd);
719
0
  sym_hashes = elf_sym_hashes (abfd);
720
721
0
  dynobj = elf_hash_table (info)->dynobj;
722
0
  local_got_offsets = elf_local_got_offsets (abfd);
723
0
  rel_end = relocs + sec->reloc_count;
724
0
  for (rel = relocs; rel < rel_end; rel++)
725
0
    {
726
0
      struct elf_link_hash_entry *h;
727
0
      unsigned long r_symndx;
728
729
0
      r_symndx = ELF32_R_SYM (rel->r_info);
730
0
      if (r_symndx < symtab_hdr->sh_info)
731
0
  h = NULL;
732
0
      else
733
0
  {
734
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
735
0
    while (h->root.type == bfd_link_hash_indirect
736
0
     || h->root.type == bfd_link_hash_warning)
737
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
738
0
  }
739
740
      /* Some relocs require a global offset table.  */
741
0
      if (dynobj == NULL)
742
0
  {
743
0
    switch (ELF32_R_TYPE (rel->r_info))
744
0
      {
745
0
      case R_CR16_GOT_REGREL20:
746
0
      case R_CR16_GOTC_REGREL20:
747
0
        dynobj = _bfd_elf_link_dynobj (info);
748
0
        if (dynobj == NULL)
749
0
    goto fail;
750
0
        if (! _bfd_cr16_elf_create_got_section (dynobj, info))
751
0
    goto fail;
752
0
        break;
753
754
0
      default:
755
0
        break;
756
0
      }
757
0
  }
758
759
0
      switch (ELF32_R_TYPE (rel->r_info))
760
0
  {
761
0
  case R_CR16_GOT_REGREL20:
762
0
  case R_CR16_GOTC_REGREL20:
763
    /* This symbol requires a global offset table entry.  */
764
765
0
    sgot = elf_hash_table (info)->sgot;
766
0
    srelgot = elf_hash_table (info)->srelgot;
767
0
    BFD_ASSERT (sgot != NULL && srelgot != NULL);
768
769
0
    if (h != NULL)
770
0
      {
771
0
        if (h->got.offset != (bfd_vma) -1)
772
    /* We have already allocated space in the .got.  */
773
0
    break;
774
775
0
        h->got.offset = sgot->size;
776
777
        /* Make sure this symbol is output as a dynamic symbol.  */
778
0
        if (h->dynindx == -1)
779
0
    {
780
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
781
0
        goto fail;
782
0
    }
783
784
0
        srelgot->size += sizeof (Elf32_External_Rela);
785
0
      }
786
0
    else
787
0
      {
788
        /* This is a global offset table entry for a local
789
     symbol.  */
790
0
        if (local_got_offsets == NULL)
791
0
    {
792
0
      size_t       size;
793
0
      unsigned int i;
794
795
0
      size = symtab_hdr->sh_info * sizeof (bfd_vma);
796
0
      local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
797
798
0
      if (local_got_offsets == NULL)
799
0
        goto fail;
800
801
0
      elf_local_got_offsets (abfd) = local_got_offsets;
802
803
0
      for (i = 0; i < symtab_hdr->sh_info; i++)
804
0
        local_got_offsets[i] = (bfd_vma) -1;
805
0
    }
806
807
0
        if (local_got_offsets[r_symndx] != (bfd_vma) -1)
808
    /* We have already allocated space in the .got.  */
809
0
    break;
810
811
0
        local_got_offsets[r_symndx] = sgot->size;
812
813
0
        if (bfd_link_executable (info))
814
    /* If we are generating a shared object, we need to
815
       output a R_CR16_RELATIVE reloc so that the dynamic
816
       linker can adjust this GOT entry.  */
817
0
    srelgot->size += sizeof (Elf32_External_Rela);
818
0
      }
819
820
0
    sgot->size += 4;
821
0
    break;
822
823
0
  }
824
0
    }
825
826
0
  result = true;
827
0
 fail:
828
0
  free (isymbuf);
829
830
0
  return result;
831
0
}
832
833
/* Perform a relocation as part of a final link.  */
834
835
static bfd_reloc_status_type
836
cr16_elf_final_link_relocate (reloc_howto_type *howto,
837
            bfd *input_bfd,
838
            bfd *output_bfd ATTRIBUTE_UNUSED,
839
            asection *input_section,
840
            bfd_byte *contents,
841
            bfd_vma offset,
842
            bfd_vma Rvalue,
843
            bfd_vma addend,
844
            struct elf_link_hash_entry * h,
845
            unsigned long symndx  ATTRIBUTE_UNUSED,
846
            struct bfd_link_info *info ATTRIBUTE_UNUSED,
847
            asection *sec ATTRIBUTE_UNUSED,
848
            int is_local ATTRIBUTE_UNUSED)
849
0
{
850
0
  unsigned short r_type = howto->type;
851
0
  bfd_byte *hit_data = contents + offset;
852
0
  bfd_vma reloc_bits, check, Rvalue1;
853
854
0
  switch (r_type)
855
0
    {
856
0
    case R_CR16_IMM4:
857
0
    case R_CR16_IMM20:
858
0
    case R_CR16_ABS20:
859
0
      break;
860
861
0
    case R_CR16_IMM8:
862
0
    case R_CR16_IMM16:
863
0
    case R_CR16_IMM32:
864
0
    case R_CR16_IMM32a:
865
0
    case R_CR16_REGREL4:
866
0
    case R_CR16_REGREL4a:
867
0
    case R_CR16_REGREL14:
868
0
    case R_CR16_REGREL14a:
869
0
    case R_CR16_REGREL16:
870
0
    case R_CR16_REGREL20:
871
0
    case R_CR16_REGREL20a:
872
0
    case R_CR16_GOT_REGREL20:
873
0
    case R_CR16_GOTC_REGREL20:
874
0
    case R_CR16_ABS24:
875
0
    case R_CR16_DISP16:
876
0
    case R_CR16_DISP24:
877
      /* 'hit_data' is relative to the start of the instruction, not the
878
   relocation offset.  Advance it to account for the exact offset.  */
879
0
      hit_data += 2;
880
0
      break;
881
882
0
    case R_CR16_NONE:
883
0
      return bfd_reloc_ok;
884
0
      break;
885
886
0
    case R_CR16_DISP4:
887
0
      if (is_local)
888
0
  Rvalue += -1;
889
0
      break;
890
891
0
    case R_CR16_DISP8:
892
0
    case R_CR16_DISP24a:
893
0
      if (is_local)
894
0
  Rvalue -= -1;
895
0
      break;
896
897
0
    case R_CR16_SWITCH8:
898
0
    case R_CR16_SWITCH16:
899
0
    case R_CR16_SWITCH32:
900
      /* We only care about the addend, where the difference between
901
   expressions is kept.  */
902
0
      Rvalue = 0;
903
904
0
    default:
905
0
      break;
906
0
    }
907
908
0
  if (howto->pc_relative)
909
0
    {
910
      /* Subtract the address of the section containing the location.  */
911
0
      Rvalue -= (input_section->output_section->vma
912
0
     + input_section->output_offset);
913
      /* Subtract the position of the location within the section.  */
914
0
      Rvalue -= offset;
915
0
    }
916
917
  /* Add in supplied addend.  */
918
0
  Rvalue += addend;
919
920
  /* Complain if the bitfield overflows, whether it is considered
921
     as signed or unsigned.  */
922
0
  check = Rvalue >> howto->rightshift;
923
924
0
  reloc_bits = ((bfd_vma) 1 << (howto->bitsize - 1) << 1) - 1;
925
926
  /* For GOT and GOTC relocs no boundary checks applied.  */
927
0
  if (!((r_type == R_CR16_GOT_REGREL20)
928
0
  || (r_type == R_CR16_GOTC_REGREL20)))
929
0
    {
930
0
      if (((bfd_vma) check & ~reloc_bits) != 0
931
0
    && (((bfd_vma) check & ~reloc_bits)
932
0
        != (-(bfd_vma) 1 & ~reloc_bits)))
933
0
  {
934
    /* The above right shift is incorrect for a signed
935
       value.  See if turning on the upper bits fixes the
936
       overflow.  */
937
0
    if (howto->rightshift && (bfd_signed_vma) Rvalue < 0)
938
0
      {
939
0
        check |= ((bfd_vma) -1
940
0
      & ~((bfd_vma) -1 >> howto->rightshift));
941
942
0
        if (((bfd_vma) check & ~reloc_bits)
943
0
      != (-(bfd_vma) 1 & ~reloc_bits))
944
0
    return bfd_reloc_overflow;
945
0
      }
946
0
    else
947
0
      return bfd_reloc_overflow;
948
0
  }
949
950
      /* Drop unwanted bits from the value we are relocating to.  */
951
0
      Rvalue >>= (bfd_vma) howto->rightshift;
952
953
      /* Apply dst_mask to select only relocatable part of the insn.  */
954
0
      Rvalue &= howto->dst_mask;
955
0
    }
956
957
0
  switch (bfd_get_reloc_size (howto))
958
0
    {
959
0
    case 1:
960
0
      if (r_type == R_CR16_DISP8)
961
0
  {
962
0
    Rvalue1 = bfd_get_16 (input_bfd, hit_data);
963
0
    Rvalue = ((Rvalue1 & 0xf000) | ((Rvalue << 4) & 0xf00)
964
0
        | (Rvalue1 & 0x00f0) | (Rvalue & 0xf));
965
0
    bfd_put_16 (input_bfd, Rvalue, hit_data);
966
0
  }
967
0
      else if (r_type == R_CR16_IMM4)
968
0
  {
969
0
    Rvalue1 = bfd_get_16 (input_bfd, hit_data);
970
0
    Rvalue = (((Rvalue1 & 0xff) << 8) | ((Rvalue << 4) & 0xf0)
971
0
        | ((Rvalue1 & 0x0f00) >> 8));
972
0
    bfd_put_16 (input_bfd, Rvalue, hit_data);
973
0
  }
974
0
      else if (r_type == R_CR16_DISP4)
975
0
  {
976
0
    Rvalue1 = bfd_get_16 (input_bfd, hit_data);
977
0
    Rvalue = (Rvalue1 | ((Rvalue & 0xf) << 4));
978
0
    bfd_put_16 (input_bfd, Rvalue, hit_data);
979
0
  }
980
0
      else
981
0
  {
982
0
    bfd_put_8 (input_bfd, (unsigned char) Rvalue, hit_data);
983
0
  }
984
0
      break;
985
986
0
    case 2:
987
0
      if (r_type == R_CR16_DISP16)
988
0
  {
989
0
    Rvalue |= (bfd_get_16 (input_bfd, hit_data));
990
0
    Rvalue = ((Rvalue & 0xfffe) | ((Rvalue >> 16) & 0x1));
991
0
  }
992
0
      if (r_type == R_CR16_IMM16)
993
0
  {
994
0
    Rvalue1 = bfd_get_16 (input_bfd, hit_data);
995
996
0
    Rvalue1 = (Rvalue1 ^ 0x8000) - 0x8000;
997
0
    Rvalue += Rvalue1;
998
999
    /* Check for range.  */
1000
0
    if (Rvalue > 0xffff)
1001
0
      return bfd_reloc_overflow;
1002
0
  }
1003
1004
0
      bfd_put_16 (input_bfd, Rvalue, hit_data);
1005
0
      break;
1006
1007
0
    case 4:
1008
0
      if ((r_type == R_CR16_ABS20) || (r_type == R_CR16_IMM20))
1009
0
  {
1010
0
    Rvalue1 = (bfd_get_16 (input_bfd, hit_data + 2)
1011
0
         | (((bfd_get_16 (input_bfd, hit_data) & 0xf) << 16)));
1012
1013
0
    Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
1014
0
    Rvalue += Rvalue1;
1015
1016
    /* Check for range.  */
1017
0
    if (Rvalue > 0xfffff)
1018
0
      return bfd_reloc_overflow;
1019
1020
0
    bfd_put_16 (input_bfd, ((bfd_get_16 (input_bfd, hit_data) & 0xfff0)
1021
0
          | ((Rvalue >> 16) & 0xf)), hit_data);
1022
0
    bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1023
0
  }
1024
0
      else if (r_type == R_CR16_GOT_REGREL20)
1025
0
  {
1026
0
    asection *sgot = elf_hash_table (info)->sgot;
1027
0
    bfd_vma off;
1028
1029
0
    if (h != NULL)
1030
0
      {
1031
0
        off = h->got.offset;
1032
0
        BFD_ASSERT (off != (bfd_vma) -1);
1033
1034
0
        if (! elf_hash_table (info)->dynamic_sections_created
1035
0
      || SYMBOL_REFERENCES_LOCAL (info, h))
1036
    /* This is actually a static link, or it is a
1037
       -Bsymbolic link and the symbol is defined
1038
       locally, or the symbol was forced to be local
1039
       because of a version file.  We must initialize
1040
       this entry in the global offset table.
1041
       When doing a dynamic link, we create a .rela.got
1042
       relocation entry to initialize the value.  This
1043
       is done in the finish_dynamic_symbol routine.  */
1044
0
    bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1045
0
      }
1046
0
    else
1047
0
      {
1048
0
        off = elf_local_got_offsets (input_bfd)[symndx];
1049
0
        bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1050
0
      }
1051
1052
0
    Rvalue = sgot->output_offset + off;
1053
0
    Rvalue += addend;
1054
1055
    /* REVISIT: if ((long) Rvalue > 0xffffff ||
1056
       (long) Rvalue < -0x800000).  */
1057
0
    if (Rvalue > 0xffffff)
1058
0
      return bfd_reloc_overflow;
1059
1060
1061
0
    bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
1062
0
          | (((Rvalue >> 16) & 0xf) << 8), hit_data);
1063
0
    bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1064
1065
0
  }
1066
0
      else if (r_type == R_CR16_GOTC_REGREL20)
1067
0
  {
1068
0
    asection *sgot = elf_hash_table (info)->sgot;
1069
0
    bfd_vma off;
1070
1071
0
    if (h != NULL)
1072
0
      {
1073
0
        off = h->got.offset;
1074
0
        BFD_ASSERT (off != (bfd_vma) -1);
1075
1076
0
        Rvalue >>= 1; /* For code symbols.  */
1077
1078
0
        if (! elf_hash_table (info)->dynamic_sections_created
1079
0
      || SYMBOL_REFERENCES_LOCAL (info, h))
1080
    /* This is actually a static link, or it is a
1081
       -Bsymbolic link and the symbol is defined
1082
       locally, or the symbol was forced to be local
1083
       because of a version file.  We must initialize
1084
       this entry in the global offset table.
1085
       When doing a dynamic link, we create a .rela.got
1086
       relocation entry to initialize the value.  This
1087
       is done in the finish_dynamic_symbol routine.  */
1088
0
    bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1089
0
      }
1090
0
    else
1091
0
      {
1092
0
        off = elf_local_got_offsets (input_bfd)[symndx];
1093
0
        Rvalue >>= 1;
1094
0
        bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1095
0
      }
1096
1097
0
    Rvalue = sgot->output_offset + off;
1098
0
    Rvalue += addend;
1099
1100
    /* Check if any value in DISP.  */
1101
0
    Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1102
0
    Rvalue1 = ((Rvalue1 >> 16) | ((Rvalue1 & 0xfff) >> 8 << 16));
1103
1104
0
    Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
1105
0
    Rvalue += Rvalue1;
1106
1107
    /* Check for range.  */
1108
    /* REVISIT: if ((long) Rvalue > 0xffffff
1109
       || (long) Rvalue < -0x800000).  */
1110
0
    if (Rvalue > 0xffffff)
1111
0
      return bfd_reloc_overflow;
1112
1113
0
    bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
1114
0
          | (((Rvalue >> 16) & 0xf) << 8), hit_data);
1115
0
    bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1116
0
  }
1117
0
      else
1118
0
  {
1119
0
    if (r_type == R_CR16_ABS24)
1120
0
      {
1121
0
        Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1122
0
        Rvalue1 = ((Rvalue1 >> 16)
1123
0
       | ((Rvalue1 & 0xfff) >> 8 << 16)
1124
0
       | ((Rvalue1 & 0xf) << 20));
1125
1126
0
        Rvalue1 = (Rvalue1 ^ 0x800000) - 0x800000;
1127
0
        Rvalue += Rvalue1;
1128
1129
        /* Check for Range.  */
1130
0
        if (Rvalue > 0xffffff)
1131
0
    return bfd_reloc_overflow;
1132
1133
0
        Rvalue = ((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf)<<8)
1134
0
       | (bfd_get_32 (input_bfd, hit_data) & 0xf0f0))
1135
0
      | ((Rvalue & 0xffff) << 16));
1136
0
      }
1137
0
    else if (r_type == R_CR16_DISP24)
1138
0
      {
1139
0
        Rvalue = ((((Rvalue >> 20)& 0xf) | (((Rvalue >>16) & 0xf)<<8)
1140
0
       | (bfd_get_16 (input_bfd, hit_data)))
1141
0
      | (((Rvalue & 0xfffe) | ((Rvalue >> 24) & 0x1)) << 16));
1142
0
      }
1143
0
    else if ((r_type == R_CR16_IMM32) || (r_type == R_CR16_IMM32a))
1144
0
      {
1145
0
        Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1146
0
        Rvalue1 = (((Rvalue1 >> 16) & 0xffff)
1147
0
       | ((Rvalue1 & 0xffff) << 16));
1148
1149
0
        Rvalue1 = (Rvalue1 ^ 0x80000000) - 0x80000000;
1150
0
        Rvalue += Rvalue1;
1151
1152
        /* Check for range.  */
1153
0
        if (Rvalue > 0xffffffff)
1154
0
    return bfd_reloc_overflow;
1155
1156
0
        Rvalue = (((Rvalue >> 16) & 0xffff) | (Rvalue & 0xffff) << 16);
1157
0
      }
1158
0
    else if (r_type == R_CR16_DISP24a)
1159
0
      {
1160
0
        Rvalue = (((Rvalue & 0xfffffe) | (Rvalue >> 23)));
1161
0
        Rvalue = (((Rvalue >> 16) & 0xff) | ((Rvalue & 0xffff) << 16)
1162
0
      | bfd_get_32 (input_bfd, hit_data));
1163
0
      }
1164
0
    else if ((r_type == R_CR16_REGREL20)
1165
0
       || (r_type == R_CR16_REGREL20a))
1166
0
      {
1167
0
        Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1168
0
        Rvalue1 = (((Rvalue1 >> 16) & 0xffff)
1169
0
       | ((Rvalue1 & 0xfff) >> 8 << 16));
1170
1171
0
        Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
1172
0
        Rvalue += Rvalue1;
1173
1174
        /* Check for range.  */
1175
0
        if (Rvalue > 0xfffff)
1176
0
    return bfd_reloc_overflow;
1177
1178
0
        Rvalue = (((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf) << 8)
1179
0
        | ((Rvalue & 0xffff) << 16)))
1180
0
      | (bfd_get_32 (input_bfd, hit_data) & 0xf0ff));
1181
1182
0
      }
1183
0
    else if (r_type == R_CR16_NUM32)
1184
0
      {
1185
0
        Rvalue1 = (bfd_get_32 (input_bfd, hit_data));
1186
1187
0
        Rvalue1 = (Rvalue1 ^ 0x80000000) - 0x80000000;
1188
0
        Rvalue += Rvalue1;
1189
1190
        /* Check for Range.  */
1191
0
        if (Rvalue > 0xffffffff)
1192
0
    return bfd_reloc_overflow;
1193
0
      }
1194
1195
0
    bfd_put_32 (input_bfd, Rvalue, hit_data);
1196
0
  }
1197
0
      break;
1198
1199
0
    default:
1200
0
      return bfd_reloc_notsupported;
1201
0
    }
1202
1203
0
  return bfd_reloc_ok;
1204
0
}
1205
1206
/* Delete some bytes from a section while relaxing.  */
1207
1208
static bool
1209
elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
1210
             asection *sec, bfd_vma addr, int count)
1211
0
{
1212
0
  Elf_Internal_Shdr *symtab_hdr;
1213
0
  unsigned int sec_shndx;
1214
0
  bfd_byte *contents;
1215
0
  Elf_Internal_Rela *irel, *irelend;
1216
0
  bfd_vma toaddr;
1217
0
  Elf_Internal_Sym *isym;
1218
0
  Elf_Internal_Sym *isymend;
1219
0
  struct elf_link_hash_entry **sym_hashes;
1220
0
  struct elf_link_hash_entry **end_hashes;
1221
0
  struct elf_link_hash_entry **start_hashes;
1222
0
  unsigned int symcount;
1223
1224
0
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1225
1226
0
  contents = elf_section_data (sec)->this_hdr.contents;
1227
1228
0
  toaddr = sec->size;
1229
1230
0
  irel = elf_section_data (sec)->relocs;
1231
0
  irelend = irel + sec->reloc_count;
1232
1233
  /* Actually delete the bytes.  */
1234
0
  memmove (contents + addr, contents + addr + count,
1235
0
     (size_t) (toaddr - addr - count));
1236
0
  sec->size -= count;
1237
1238
  /* Adjust all the relocs.  */
1239
0
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1240
    /* Get the new reloc address.  */
1241
0
    if ((irel->r_offset > addr && irel->r_offset < toaddr))
1242
0
      irel->r_offset -= count;
1243
1244
  /* Adjust the local symbols defined in this section.  */
1245
0
  symtab_hdr = &elf_symtab_hdr (abfd);
1246
0
  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1247
0
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
1248
0
    {
1249
0
      if (isym->st_shndx == sec_shndx
1250
0
    && isym->st_value > addr
1251
0
    && isym->st_value < toaddr)
1252
0
  {
1253
    /* Adjust the addend of SWITCH relocations in this section,
1254
       which reference this local symbol.  */
1255
#if 0
1256
    for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1257
      {
1258
        unsigned long r_symndx;
1259
        Elf_Internal_Sym *rsym;
1260
        bfd_vma addsym, subsym;
1261
1262
        /* Skip if not a SWITCH relocation.  */
1263
        if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH8
1264
      && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH16
1265
      && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH32)
1266
    continue;
1267
1268
        r_symndx = ELF32_R_SYM (irel->r_info);
1269
        rsym = (Elf_Internal_Sym *) symtab_hdr->contents + r_symndx;
1270
1271
        /* Skip if not the local adjusted symbol.  */
1272
        if (rsym != isym)
1273
    continue;
1274
1275
        addsym = isym->st_value;
1276
        subsym = addsym - irel->r_addend;
1277
1278
        /* Fix the addend only when -->> (addsym > addr >= subsym).  */
1279
        if (subsym <= addr)
1280
    irel->r_addend -= count;
1281
        else
1282
    continue;
1283
      }
1284
#endif
1285
1286
0
    isym->st_value -= count;
1287
0
  }
1288
0
    }
1289
1290
  /* Now adjust the global symbols defined in this section.  */
1291
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1292
0
        - symtab_hdr->sh_info);
1293
0
  sym_hashes = start_hashes = elf_sym_hashes (abfd);
1294
0
  end_hashes = sym_hashes + symcount;
1295
1296
0
  for (; sym_hashes < end_hashes; sym_hashes++)
1297
0
    {
1298
0
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
1299
1300
      /* The '--wrap SYMBOL' option is causing a pain when the object file,
1301
   containing the definition of __wrap_SYMBOL, includes a direct
1302
   call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
1303
   the same symbol (which is __wrap_SYMBOL), but still exist as two
1304
   different symbols in 'sym_hashes', we don't want to adjust
1305
   the global symbol __wrap_SYMBOL twice.
1306
   This check is only relevant when symbols are being wrapped.  */
1307
0
      if (link_info->wrap_hash != NULL)
1308
0
  {
1309
0
    struct elf_link_hash_entry **cur_sym_hashes;
1310
1311
    /* Loop only over the symbols whom been already checked.  */
1312
0
    for (cur_sym_hashes = start_hashes; cur_sym_hashes < sym_hashes;
1313
0
         cur_sym_hashes++)
1314
      /* If the current symbol is identical to 'sym_hash', that means
1315
         the symbol was already adjusted (or at least checked).  */
1316
0
      if (*cur_sym_hashes == sym_hash)
1317
0
        break;
1318
1319
    /* Don't adjust the symbol again.  */
1320
0
    if (cur_sym_hashes < sym_hashes)
1321
0
      continue;
1322
0
  }
1323
1324
0
      if ((sym_hash->root.type == bfd_link_hash_defined
1325
0
     || sym_hash->root.type == bfd_link_hash_defweak)
1326
0
    && sym_hash->root.u.def.section == sec
1327
0
    && sym_hash->root.u.def.value > addr
1328
0
    && sym_hash->root.u.def.value < toaddr)
1329
0
  sym_hash->root.u.def.value -= count;
1330
0
    }
1331
1332
0
  return true;
1333
0
}
1334
1335
/* Relocate a CR16 ELF section.  */
1336
1337
static int
1338
elf32_cr16_relocate_section (struct bfd_link_info *info,
1339
           bfd *input_bfd, asection *input_section,
1340
           bfd_byte *contents, Elf_Internal_Rela *relocs,
1341
           Elf_Internal_Sym *local_syms,
1342
           asection **local_sections)
1343
0
{
1344
0
  Elf_Internal_Shdr *symtab_hdr;
1345
0
  struct elf_link_hash_entry **sym_hashes;
1346
0
  Elf_Internal_Rela *rel, *relend;
1347
1348
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
1349
0
  sym_hashes = elf_sym_hashes (input_bfd);
1350
1351
0
  rel = relocs;
1352
0
  relend = relocs + input_section->reloc_count;
1353
0
  for (; rel < relend; rel++)
1354
0
    {
1355
0
      int r_type;
1356
0
      reloc_howto_type *howto;
1357
0
      unsigned long r_symndx;
1358
0
      Elf_Internal_Sym *sym;
1359
0
      asection *sec;
1360
0
      struct elf_link_hash_entry *h;
1361
0
      bfd_vma relocation;
1362
0
      bfd_reloc_status_type r;
1363
1364
0
      r_symndx = ELF32_R_SYM (rel->r_info);
1365
0
      r_type = ELF32_R_TYPE (rel->r_info);
1366
0
      howto = cr16_elf_howto_table + (r_type);
1367
1368
0
      h = NULL;
1369
0
      sym = NULL;
1370
0
      sec = NULL;
1371
0
      if (r_symndx < symtab_hdr->sh_info)
1372
0
  {
1373
0
    sym = local_syms + r_symndx;
1374
0
    sec = local_sections[r_symndx];
1375
0
    relocation = _bfd_elf_rela_local_sym (info->output_bfd,
1376
0
            sym, &sec, rel);
1377
0
  }
1378
0
      else
1379
0
  {
1380
0
    bool unresolved_reloc, warned, ignored;
1381
1382
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1383
0
           r_symndx, symtab_hdr, sym_hashes,
1384
0
           h, sec, relocation,
1385
0
           unresolved_reloc, warned, ignored);
1386
0
  }
1387
1388
0
      if (sec != NULL && discarded_section (sec))
1389
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1390
0
           rel, 1, relend, R_CR16_NONE,
1391
0
           howto, 0, contents);
1392
1393
0
      if (bfd_link_relocatable (info))
1394
0
  continue;
1395
1396
0
      r = cr16_elf_final_link_relocate (howto, input_bfd, info->output_bfd,
1397
0
          input_section,
1398
0
          contents, rel->r_offset,
1399
0
          relocation, rel->r_addend,
1400
0
          (struct elf_link_hash_entry *) h,
1401
0
          r_symndx,
1402
0
          info, sec, h == NULL);
1403
1404
0
      if (r != bfd_reloc_ok)
1405
0
  {
1406
0
    const char *name;
1407
0
    const char *msg = NULL;
1408
1409
0
    if (h != NULL)
1410
0
      name = h->root.root.string;
1411
0
    else
1412
0
      {
1413
0
        name = (bfd_elf_string_from_elf_section
1414
0
          (input_bfd, symtab_hdr->sh_link, sym->st_name));
1415
0
        if (name == NULL || *name == '\0')
1416
0
    name = bfd_section_name (sec);
1417
0
      }
1418
1419
0
    switch (r)
1420
0
      {
1421
0
      case bfd_reloc_overflow:
1422
0
        (*info->callbacks->reloc_overflow)
1423
0
    (info, (h ? &h->root : NULL), name, howto->name,
1424
0
     (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1425
0
        break;
1426
1427
0
      case bfd_reloc_undefined:
1428
0
        (*info->callbacks->undefined_symbol)
1429
0
    (info, name, input_bfd, input_section, rel->r_offset, true);
1430
0
        break;
1431
1432
0
      case bfd_reloc_outofrange:
1433
0
        msg = _("internal error: out of range error");
1434
0
        goto common_error;
1435
1436
0
      case bfd_reloc_notsupported:
1437
0
        msg = _("internal error: unsupported relocation error");
1438
0
        goto common_error;
1439
1440
0
      case bfd_reloc_dangerous:
1441
0
        msg = _("internal error: dangerous error");
1442
0
        goto common_error;
1443
1444
0
      default:
1445
0
        msg = _("internal error: unknown error");
1446
        /* Fall through.  */
1447
1448
0
      common_error:
1449
0
        (*info->callbacks->warning) (info, msg, name, input_bfd,
1450
0
             input_section, rel->r_offset);
1451
0
        break;
1452
0
      }
1453
0
  }
1454
0
    }
1455
1456
0
  return true;
1457
0
}
1458
1459
/* This is a version of bfd_generic_get_relocated_section_contents
1460
   which uses elf32_cr16_relocate_section.  */
1461
1462
static bfd_byte *
1463
elf32_cr16_get_relocated_section_contents
1464
  (bfd *output_bfd,
1465
   struct bfd_link_info *link_info,
1466
   const struct bfd_link_order *link_order,
1467
   bfd_byte *data,
1468
   bool relocatable,
1469
   asymbol **symbols)
1470
14
{
1471
14
  Elf_Internal_Shdr *symtab_hdr;
1472
14
  asection *input_section = link_order->u.indirect.section;
1473
14
  bfd *input_bfd = input_section->owner;
1474
14
  asection **sections = NULL;
1475
14
  Elf_Internal_Rela *internal_relocs = NULL;
1476
14
  Elf_Internal_Sym *isymbuf = NULL;
1477
1478
  /* We only need to handle the case of relaxing, or of having a
1479
     particular set of section contents, specially.  */
1480
14
  if (relocatable
1481
14
      || elf_section_data (input_section)->this_hdr.contents == NULL)
1482
14
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1483
14
                   link_order, data,
1484
14
                   relocatable,
1485
14
                   symbols);
1486
1487
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
1488
1489
0
  bfd_byte *orig_data = data;
1490
0
  if (data == NULL)
1491
0
    {
1492
0
      data = bfd_malloc (input_section->size);
1493
0
      if (data == NULL)
1494
0
  return NULL;
1495
0
    }
1496
0
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1497
0
    (size_t) input_section->size);
1498
1499
0
  if ((input_section->flags & SEC_RELOC) != 0
1500
0
      && input_section->reloc_count > 0)
1501
0
    {
1502
0
      Elf_Internal_Sym *isym;
1503
0
      Elf_Internal_Sym *isymend;
1504
0
      asection **secpp;
1505
0
      bfd_size_type amt;
1506
1507
0
      internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
1508
0
               NULL, NULL, false);
1509
0
      if (internal_relocs == NULL)
1510
0
  goto error_return;
1511
1512
0
      if (symtab_hdr->sh_info != 0)
1513
0
  {
1514
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1515
0
    if (isymbuf == NULL)
1516
0
      isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1517
0
              symtab_hdr->sh_info, 0,
1518
0
              NULL, NULL, NULL);
1519
0
    if (isymbuf == NULL)
1520
0
      goto error_return;
1521
0
  }
1522
1523
0
      amt = symtab_hdr->sh_info;
1524
0
      amt *= sizeof (asection *);
1525
0
      sections = bfd_malloc (amt);
1526
0
      if (sections == NULL && amt != 0)
1527
0
  goto error_return;
1528
1529
0
      isymend = isymbuf + symtab_hdr->sh_info;
1530
0
      for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1531
0
  {
1532
0
    asection *isec;
1533
1534
0
    if (isym->st_shndx == SHN_UNDEF)
1535
0
      isec = bfd_und_section_ptr;
1536
0
    else if (isym->st_shndx == SHN_ABS)
1537
0
      isec = bfd_abs_section_ptr;
1538
0
    else if (isym->st_shndx == SHN_COMMON)
1539
0
      isec = bfd_com_section_ptr;
1540
0
    else
1541
0
      isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1542
1543
0
    *secpp = isec;
1544
0
  }
1545
1546
0
      if (! elf32_cr16_relocate_section (link_info, input_bfd,
1547
0
           input_section, data, internal_relocs,
1548
0
           isymbuf, sections))
1549
0
  goto error_return;
1550
1551
0
      free (sections);
1552
0
      if (symtab_hdr->contents != (unsigned char *) isymbuf)
1553
0
  free (isymbuf);
1554
0
      if (elf_section_data (input_section)->relocs != internal_relocs)
1555
0
  free (internal_relocs);
1556
0
    }
1557
1558
0
  return data;
1559
1560
0
 error_return:
1561
0
  free (sections);
1562
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
1563
0
    free (isymbuf);
1564
0
  if (elf_section_data (input_section)->relocs != internal_relocs)
1565
0
    free (internal_relocs);
1566
0
  if (orig_data == NULL)
1567
0
    free (data);
1568
0
  return NULL;
1569
0
}
1570
1571
/* Assorted hash table functions.  */
1572
1573
/* Initialize an entry in the link hash table.  */
1574
1575
/* Create an entry in an CR16 ELF linker hash table.  */
1576
1577
static struct bfd_hash_entry *
1578
elf32_cr16_link_hash_newfunc (struct bfd_hash_entry *entry,
1579
            struct bfd_hash_table *table,
1580
            const char *string)
1581
0
{
1582
0
  struct elf32_cr16_link_hash_entry *ret =
1583
0
    (struct elf32_cr16_link_hash_entry *) entry;
1584
1585
  /* Allocate the structure if it has not already been allocated by a
1586
     subclass.  */
1587
0
  if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
1588
0
    ret = ((struct elf32_cr16_link_hash_entry *)
1589
0
     bfd_hash_allocate (table,
1590
0
            sizeof (struct elf32_cr16_link_hash_entry)));
1591
0
  if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
1592
0
    return (struct bfd_hash_entry *) ret;
1593
1594
  /* Call the allocation method of the superclass.  */
1595
0
  ret = ((struct elf32_cr16_link_hash_entry *)
1596
0
   _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1597
0
             table, string));
1598
0
  if (ret != (struct elf32_cr16_link_hash_entry *) NULL)
1599
0
    {
1600
0
      ret->direct_calls = 0;
1601
0
      ret->stack_size = 0;
1602
0
      ret->movm_args = 0;
1603
0
      ret->movm_stack_size = 0;
1604
0
      ret->flags = 0;
1605
0
      ret->value = 0;
1606
0
    }
1607
1608
0
  return (struct bfd_hash_entry *) ret;
1609
0
}
1610
1611
/* Create an cr16 ELF linker hash table.  */
1612
1613
static struct bfd_link_hash_table *
1614
elf32_cr16_link_hash_table_create (bfd *abfd)
1615
0
{
1616
0
  struct elf_link_hash_table *ret;
1617
0
  size_t amt = sizeof (struct elf_link_hash_table);
1618
1619
0
  ret = (struct elf_link_hash_table *) bfd_zmalloc (amt);
1620
0
  if (ret == (struct elf_link_hash_table *) NULL)
1621
0
    return NULL;
1622
1623
0
  if (!_bfd_elf_link_hash_table_init (ret, abfd,
1624
0
              elf32_cr16_link_hash_newfunc,
1625
0
              sizeof (struct elf32_cr16_link_hash_entry)))
1626
0
    {
1627
0
      free (ret);
1628
0
      return NULL;
1629
0
    }
1630
1631
0
  return &ret->root;
1632
0
}
1633
1634
static unsigned long
1635
elf_cr16_mach (flagword flags)
1636
171
{
1637
171
  switch (flags)
1638
171
    {
1639
0
    case EM_CR16:
1640
171
    default:
1641
171
      return bfd_mach_cr16;
1642
171
    }
1643
171
}
1644
1645
/* The final processing done just before writing out a CR16 ELF object
1646
   file.  This gets the CR16 architecture right based on the machine
1647
   number.  */
1648
1649
static bool
1650
_bfd_cr16_elf_final_write_processing (bfd *abfd)
1651
1
{
1652
1
  unsigned long val;
1653
1
  switch (bfd_get_mach (abfd))
1654
1
    {
1655
0
    default:
1656
1
    case bfd_mach_cr16:
1657
1
      val = EM_CR16;
1658
1
      break;
1659
1
    }
1660
1
  elf_elfheader (abfd)->e_flags |= val;
1661
1
  return _bfd_elf_final_write_processing (abfd);
1662
1
}
1663
1664
1665
static bool
1666
_bfd_cr16_elf_object_p (bfd *abfd)
1667
171
{
1668
171
  bfd_default_set_arch_mach (abfd, bfd_arch_cr16,
1669
171
           elf_cr16_mach (elf_elfheader (abfd)->e_flags));
1670
171
  return true;
1671
171
}
1672
1673
/* Merge backend specific data from an object file to the output
1674
   object file when linking.  */
1675
1676
static bool
1677
_bfd_cr16_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
1678
0
{
1679
0
  bfd *obfd = info->output_bfd;
1680
1681
0
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1682
0
    return true;
1683
1684
0
  if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1685
0
      && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
1686
0
    {
1687
0
      if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
1688
0
             bfd_get_mach (ibfd)))
1689
0
  return false;
1690
0
    }
1691
1692
0
  return true;
1693
0
}
1694
1695
1696
/* This function handles relaxing for the CR16.
1697
1698
   There's quite a few relaxing opportunites available on the CR16:
1699
1700
  * bcond:24 -> bcond:16              1 byte
1701
  * bcond:16 -> bcond:8             1 byte
1702
  * arithmetic imm32 -> arithmetic imm20          12 bits
1703
  * arithmetic imm20/imm16 -> arithmetic imm4       12/16 bits
1704
1705
   Symbol- and reloc-reading infrastructure copied from elf-m10200.c.  */
1706
1707
static bool
1708
elf32_cr16_relax_section (bfd *abfd, asection *sec,
1709
        struct bfd_link_info *link_info, bool *again)
1710
0
{
1711
0
  Elf_Internal_Shdr *symtab_hdr;
1712
0
  Elf_Internal_Rela *internal_relocs;
1713
0
  Elf_Internal_Rela *irel, *irelend;
1714
0
  bfd_byte *contents = NULL;
1715
0
  Elf_Internal_Sym *isymbuf = NULL;
1716
1717
  /* Assume nothing changes.  */
1718
0
  *again = false;
1719
1720
  /* We don't have to do anything for a relocatable link, if
1721
     this section does not have relocs, or if this is not a
1722
     code section.  */
1723
0
  if (bfd_link_relocatable (link_info)
1724
0
      || sec->reloc_count == 0
1725
0
      || (sec->flags & SEC_RELOC) == 0
1726
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
1727
0
      || (sec->flags & SEC_CODE) == 0)
1728
0
    return true;
1729
1730
0
  symtab_hdr = &elf_symtab_hdr (abfd);
1731
1732
  /* Get a copy of the native relocations.  */
1733
0
  internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
1734
0
                 link_info->keep_memory);
1735
0
  if (internal_relocs == NULL)
1736
0
    goto error_return;
1737
1738
  /* Walk through them looking for relaxing opportunities.  */
1739
0
  irelend = internal_relocs + sec->reloc_count;
1740
0
  for (irel = internal_relocs; irel < irelend; irel++)
1741
0
    {
1742
0
      bfd_vma symval;
1743
1744
      /* If this isn't something that can be relaxed, then ignore
1745
   this reloc.  */
1746
0
      if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP16
1747
0
    && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP24
1748
0
    && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM32
1749
0
    && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM20
1750
0
    && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM16)
1751
0
  continue;
1752
1753
      /* Get the section contents if we haven't done so already.  */
1754
0
      if (contents == NULL)
1755
0
  {
1756
    /* Get cached copy if it exists.  */
1757
0
    if (elf_section_data (sec)->this_hdr.contents != NULL)
1758
0
      contents = elf_section_data (sec)->this_hdr.contents;
1759
    /* Go get them off disk.  */
1760
0
    else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1761
0
      goto error_return;
1762
0
  }
1763
1764
      /* Read this BFD's local symbols if we haven't done so already.  */
1765
0
      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1766
0
  {
1767
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1768
0
    if (isymbuf == NULL)
1769
0
      isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1770
0
              symtab_hdr->sh_info, 0,
1771
0
              NULL, NULL, NULL);
1772
0
    if (isymbuf == NULL)
1773
0
      goto error_return;
1774
0
  }
1775
1776
      /* Get the value of the symbol referred to by the reloc.  */
1777
0
      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1778
0
  {
1779
    /* A local symbol.  */
1780
0
    Elf_Internal_Sym *isym;
1781
0
    asection *sym_sec;
1782
1783
0
    isym = isymbuf + ELF32_R_SYM (irel->r_info);
1784
0
    if (isym->st_shndx == SHN_UNDEF)
1785
0
      sym_sec = bfd_und_section_ptr;
1786
0
    else if (isym->st_shndx == SHN_ABS)
1787
0
      sym_sec = bfd_abs_section_ptr;
1788
0
    else if (isym->st_shndx == SHN_COMMON)
1789
0
      sym_sec = bfd_com_section_ptr;
1790
0
    else
1791
0
      sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1792
0
    symval = (isym->st_value
1793
0
        + sym_sec->output_section->vma
1794
0
        + sym_sec->output_offset);
1795
0
  }
1796
0
      else
1797
0
  {
1798
0
    unsigned long indx;
1799
0
    struct elf_link_hash_entry *h;
1800
1801
    /* An external symbol.  */
1802
0
    indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1803
0
    h = elf_sym_hashes (abfd)[indx];
1804
0
    BFD_ASSERT (h != NULL);
1805
1806
0
    if (h->root.type != bfd_link_hash_defined
1807
0
        && h->root.type != bfd_link_hash_defweak)
1808
      /* This appears to be a reference to an undefined
1809
         symbol.  Just ignore it--it will be caught by the
1810
         regular reloc processing.  */
1811
0
      continue;
1812
1813
0
    symval = (h->root.u.def.value
1814
0
        + h->root.u.def.section->output_section->vma
1815
0
        + h->root.u.def.section->output_offset);
1816
0
  }
1817
1818
      /* For simplicity of coding, we are going to modify the section
1819
   contents, the section relocs, and the BFD symbol table.  We
1820
   must tell the rest of the code not to free up this
1821
   information.  It would be possible to instead create a table
1822
   of changes which have to be made, as is done in coff-mips.c;
1823
   that would be more work, but would require less memory when
1824
   the linker is run.  */
1825
1826
      /* Try to turn a 24  branch/call into a 16bit relative
1827
   branch/call.  */
1828
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP24)
1829
0
  {
1830
0
    bfd_vma value = symval;
1831
1832
    /* Deal with pc-relative gunk.  */
1833
0
    value -= (sec->output_section->vma + sec->output_offset);
1834
0
    value -= irel->r_offset;
1835
0
    value += irel->r_addend;
1836
1837
    /* See if the value will fit in 16 bits, note the high value is
1838
       0xfffe + 2 as the target will be two bytes closer if we are
1839
       able to relax.  */
1840
0
    if ((long) value < 0x10000 && (long) value > -0x10002)
1841
0
      {
1842
0
        unsigned int code;
1843
1844
        /* Get the opcode.  */
1845
0
        code = (unsigned int) bfd_get_32 (abfd,
1846
0
            contents + irel->r_offset);
1847
1848
        /* Verify it's a 'bcond' and fix the opcode.  */
1849
0
        if ((code  & 0xffff) == 0x0010)
1850
0
    bfd_put_16 (abfd, 0x1800 | ((0xf & (code >> 20)) << 4),
1851
0
          contents + irel->r_offset);
1852
0
        else
1853
0
    continue;
1854
1855
        /* Note that we've changed the relocs, section contents, etc.  */
1856
0
        elf_section_data (sec)->relocs = internal_relocs;
1857
0
        elf_section_data (sec)->this_hdr.contents = contents;
1858
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
1859
1860
        /* Fix the relocation's type.  */
1861
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1862
0
             R_CR16_DISP16);
1863
1864
        /* Delete two bytes of data.  */
1865
0
        if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
1866
0
              irel->r_offset + 2, 2))
1867
0
    goto error_return;
1868
1869
        /* That will change things, so, we should relax again.
1870
     Note that this is not required, and it may be slow.  */
1871
0
        *again = true;
1872
0
      }
1873
0
  }
1874
1875
      /* Try to turn a 16bit pc-relative branch into an
1876
   8bit pc-relative branch.  */
1877
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP16)
1878
0
  {
1879
0
    bfd_vma value = symval;
1880
1881
    /* Deal with pc-relative gunk.  */
1882
0
    value -= (sec->output_section->vma + sec->output_offset);
1883
0
    value -= irel->r_offset;
1884
0
    value += irel->r_addend;
1885
1886
    /* See if the value will fit in 8 bits, note the high value is
1887
       0xfc + 2 as the target will be two bytes closer if we are
1888
       able to relax.  */
1889
    /*if ((long) value < 0x1fa && (long) value > -0x100) REVISIT:range */
1890
0
    if ((long) value < 0xfa && (long) value > -0x100)
1891
0
      {
1892
0
        unsigned short code;
1893
1894
        /* Get the opcode.  */
1895
0
        code = bfd_get_16 (abfd, contents + irel->r_offset);
1896
1897
        /* Verify it's a 'bcond' and fix the opcode.  */
1898
0
        if ((code & 0xff0f) == 0x1800)
1899
0
    bfd_put_16 (abfd, (code & 0xf0f0), contents + irel->r_offset);
1900
0
        else
1901
0
    continue;
1902
1903
        /* Note that we've changed the relocs, section contents, etc.  */
1904
0
        elf_section_data (sec)->relocs = internal_relocs;
1905
0
        elf_section_data (sec)->this_hdr.contents = contents;
1906
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
1907
1908
        /* Fix the relocation's type.  */
1909
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1910
0
             R_CR16_DISP8);
1911
1912
        /* Delete two bytes of data.  */
1913
0
        if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
1914
0
              irel->r_offset + 2, 2))
1915
0
    goto error_return;
1916
1917
        /* That will change things, so, we should relax again.
1918
     Note that this is not required, and it may be slow.  */
1919
0
        *again = true;
1920
0
      }
1921
0
  }
1922
1923
      /* Try to turn a 32-bit IMM address into a 20/16-bit IMM address */
1924
0
      if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM32)
1925
0
  {
1926
0
    bfd_vma value = symval;
1927
0
    unsigned short is_add_mov = 0;
1928
0
    bfd_vma value1 = 0;
1929
1930
    /* Get the existing value from the mcode */
1931
0
    value1 = bfd_get_32 (abfd, contents + irel->r_offset + 2);
1932
0
    value1 = (value1 >> 16) | ((value1 & 0xffff) << 16);
1933
1934
    /* See if the value will fit in 20 bits.  */
1935
0
    if ((long) (value + value1) < 0xfffff && (long) (value + value1) > 0)
1936
0
      {
1937
0
        unsigned short code;
1938
1939
        /* Get the opcode.  */
1940
0
        code = bfd_get_16 (abfd, contents + irel->r_offset);
1941
1942
        /* Verify it's a 'arithmetic ADDD or MOVD instruction'.
1943
     For ADDD and MOVD only, convert to IMM32 -> IMM20.  */
1944
1945
0
        if (((code & 0xfff0) == 0x0070) || ((code & 0xfff0) == 0x0020))
1946
0
    is_add_mov = 1;
1947
1948
0
        if (is_add_mov)
1949
0
    {
1950
      /* Note that we've changed the relocs, section contents,
1951
         etc.  */
1952
0
      elf_section_data (sec)->relocs = internal_relocs;
1953
0
      elf_section_data (sec)->this_hdr.contents = contents;
1954
0
      symtab_hdr->contents = (unsigned char *) isymbuf;
1955
1956
      /* Fix the opcode.  */
1957
0
      if ((code & 0xfff0) == 0x0070) /* For movd.  */
1958
0
        bfd_put_8 (abfd, 0x05, contents + irel->r_offset + 1);
1959
0
      else         /* code == 0x0020 for addd.  */
1960
0
        bfd_put_8 (abfd, 0x04, contents + irel->r_offset + 1);
1961
1962
0
      bfd_put_8 (abfd, (code & 0xf) << 4, contents + irel->r_offset);
1963
1964
      /* If existing value is nagavive adjust approriately
1965
         place the 16-20bits (ie 4 bit) in new opcode,
1966
         as the 0xffffxxxx, the higher 2 byte values removed. */
1967
0
      if (value1 & 0x80000000)
1968
0
        bfd_put_8 (abfd,
1969
0
             (0x0f | (bfd_get_8 (abfd,
1970
0
               contents + irel->r_offset))),
1971
0
             contents + irel->r_offset);
1972
0
      else
1973
0
        bfd_put_8 (abfd,
1974
0
             (((value1 >> 16) & 0xf)
1975
0
        | (bfd_get_8 (abfd,
1976
0
                contents + irel->r_offset))),
1977
0
             contents + irel->r_offset);
1978
1979
      /* Fix the relocation's type.  */
1980
0
      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1981
0
                 R_CR16_IMM20);
1982
1983
      /* Delete two bytes of data.  */
1984
0
      if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
1985
0
                  irel->r_offset + 2, 2))
1986
0
        goto error_return;
1987
1988
      /* That will change things, so, we should relax again.
1989
         Note that this is not required, and it may be slow.  */
1990
0
      *again = true;
1991
0
    }
1992
0
      }
1993
1994
    /* See if the value will fit in 16 bits.  */
1995
0
    if ((!is_add_mov)
1996
0
        && ((long)(value + value1) < 0x7fff && (long)(value + value1) > 0))
1997
0
      {
1998
0
        unsigned short code;
1999
2000
        /* Get the opcode.  */
2001
0
        code = bfd_get_16 (abfd, contents + irel->r_offset);
2002
2003
        /* Note that we've changed the relocs, section contents, etc.  */
2004
0
        elf_section_data (sec)->relocs = internal_relocs;
2005
0
        elf_section_data (sec)->this_hdr.contents = contents;
2006
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
2007
2008
        /* Fix the opcode.  */
2009
0
        if ((code & 0xf0) == 0x70)   /* For movd.  */
2010
0
    bfd_put_8 (abfd, 0x54, contents + irel->r_offset + 1);
2011
0
        else if ((code & 0xf0) == 0x20)   /* For addd.  */
2012
0
    bfd_put_8 (abfd, 0x60, contents + irel->r_offset + 1);
2013
0
        else if ((code & 0xf0) == 0x90)   /* For cmpd.  */
2014
0
    bfd_put_8 (abfd, 0x56, contents + irel->r_offset + 1);
2015
0
        else
2016
0
    continue;
2017
2018
0
        bfd_put_8 (abfd, 0xb0 | (code & 0xf), contents + irel->r_offset);
2019
2020
        /* If existing value is nagavive adjust approriately
2021
     place the 12-16bits (ie 4 bit) in new opcode,
2022
     as the 0xfffffxxx, the higher 2 byte values removed. */
2023
0
        if (value1 & 0x80000000)
2024
0
    bfd_put_8 (abfd,
2025
0
         (0x0f | (bfd_get_8 (abfd,
2026
0
                 contents + irel->r_offset))),
2027
0
         contents + irel->r_offset);
2028
0
        else
2029
0
    bfd_put_16 (abfd, value1, contents + irel->r_offset + 2);
2030
2031
2032
        /* Fix the relocation's type.  */
2033
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2034
0
             R_CR16_IMM16);
2035
2036
        /* Delete two bytes of data.  */
2037
0
        if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
2038
0
              irel->r_offset + 2, 2))
2039
0
    goto error_return;
2040
2041
        /* That will change things, so, we should relax again.
2042
     Note that this is not required, and it may be slow.  */
2043
0
        *again = true;
2044
0
      }
2045
0
  }
2046
2047
#if 0
2048
      /* Try to turn a 16bit immediate address into a 4bit
2049
   immediate address.  */
2050
      if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
2051
    || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM16))
2052
  {
2053
    bfd_vma value = symval;
2054
    bfd_vma value1 = 0;
2055
2056
    /* Get the existing value from the mcode */
2057
    value1 = ((bfd_get_16 (abfd, contents + irel->r_offset + 2) & 0xffff));
2058
2059
    if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
2060
      {
2061
        value1 |= ((bfd_get_16 (abfd, contents + irel->r_offset + 1)
2062
        & 0xf000) << 0x4);
2063
      }
2064
2065
    /* See if the value will fit in 4 bits.  */
2066
    if ((((long) (value + value1)) < 0xf)
2067
        && (((long) (value + value1)) > 0))
2068
      {
2069
        unsigned short code;
2070
2071
        /* Get the opcode.  */
2072
        code = bfd_get_16 (abfd, contents + irel->r_offset);
2073
2074
        /* Note that we've changed the relocs, section contents, etc.  */
2075
        elf_section_data (sec)->relocs = internal_relocs;
2076
        elf_section_data (sec)->this_hdr.contents = contents;
2077
        symtab_hdr->contents = (unsigned char *) isymbuf;
2078
2079
        /* Fix the opcode.  */
2080
        if (((code & 0x0f00) == 0x0400) || ((code & 0x0f00) == 0x0500))
2081
    {
2082
      if ((code & 0x0f00) == 0x0400)      /* For movd imm20.  */
2083
        bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
2084
      else              /* For addd imm20.  */
2085
        bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
2086
      bfd_put_8 (abfd, (code & 0xf0) >> 4,
2087
           contents + irel->r_offset + 1);
2088
    }
2089
        else
2090
    {
2091
      if ((code & 0xfff0) == 0x56b0)       /*  For cmpd imm16.  */
2092
        bfd_put_8 (abfd, 0x56, contents + irel->r_offset);
2093
      else if ((code & 0xfff0) == 0x54b0)  /*  For movd imm16.  */
2094
        bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
2095
      else if ((code & 0xfff0) == 0x58b0)  /*  For movb imm16.  */
2096
        bfd_put_8 (abfd, 0x58, contents + irel->r_offset);
2097
      else if ((code & 0xfff0) == 0x5Ab0)  /*  For movw imm16.  */
2098
        bfd_put_8 (abfd, 0x5A, contents + irel->r_offset);
2099
      else if ((code & 0xfff0) == 0x60b0)  /*  For addd imm16.  */
2100
        bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
2101
      else if ((code & 0xfff0) == 0x30b0)  /*  For addb imm16.  */
2102
        bfd_put_8 (abfd, 0x30, contents + irel->r_offset);
2103
      else if ((code & 0xfff0) == 0x2Cb0)  /*  For addub imm16.  */
2104
        bfd_put_8 (abfd, 0x2C, contents + irel->r_offset);
2105
      else if ((code & 0xfff0) == 0x32b0)  /*  For adduw imm16.  */
2106
        bfd_put_8 (abfd, 0x32, contents + irel->r_offset);
2107
      else if ((code & 0xfff0) == 0x38b0)  /*  For subb imm16.  */
2108
        bfd_put_8 (abfd, 0x38, contents + irel->r_offset);
2109
      else if ((code & 0xfff0) == 0x3Cb0)  /*  For subcb imm16.  */
2110
        bfd_put_8 (abfd, 0x3C, contents + irel->r_offset);
2111
      else if ((code & 0xfff0) == 0x3Fb0)  /*  For subcw imm16.  */
2112
        bfd_put_8 (abfd, 0x3F, contents + irel->r_offset);
2113
      else if ((code & 0xfff0) == 0x3Ab0)  /*  For subw imm16.  */
2114
        bfd_put_8 (abfd, 0x3A, contents + irel->r_offset);
2115
      else if ((code & 0xfff0) == 0x50b0)  /*  For cmpb imm16.  */
2116
        bfd_put_8 (abfd, 0x50, contents + irel->r_offset);
2117
      else if ((code & 0xfff0) == 0x52b0)  /*  For cmpw imm16.  */
2118
        bfd_put_8 (abfd, 0x52, contents + irel->r_offset);
2119
      else
2120
        continue;
2121
2122
      bfd_put_8 (abfd, (code & 0xf), contents + irel->r_offset + 1);
2123
    }
2124
2125
        /* Fix the relocation's type.  */
2126
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2127
             R_CR16_IMM4);
2128
2129
        /* Delete two bytes of data.  */
2130
        if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
2131
              irel->r_offset + 2, 2))
2132
    goto error_return;
2133
2134
        /* That will change things, so, we should relax again.
2135
     Note that this is not required, and it may be slow.  */
2136
        *again = true;
2137
      }
2138
  }
2139
#endif
2140
0
    }
2141
2142
0
  if (isymbuf != NULL
2143
0
      && symtab_hdr->contents != (unsigned char *) isymbuf)
2144
0
    {
2145
0
      if (! link_info->keep_memory)
2146
0
  free (isymbuf);
2147
0
      else
2148
  /* Cache the symbols for elf_link_input_bfd.  */
2149
0
  symtab_hdr->contents = (unsigned char *) isymbuf;
2150
0
    }
2151
2152
0
  if (contents != NULL
2153
0
      && elf_section_data (sec)->this_hdr.contents != contents)
2154
0
    {
2155
0
      if (! link_info->keep_memory)
2156
0
  free (contents);
2157
0
      else
2158
  /* Cache the section contents for elf_link_input_bfd.  */
2159
0
  elf_section_data (sec)->this_hdr.contents = contents;
2160
2161
0
    }
2162
2163
0
  if (elf_section_data (sec)->relocs != internal_relocs)
2164
0
    free (internal_relocs);
2165
2166
0
  return true;
2167
2168
0
 error_return:
2169
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
2170
0
    free (isymbuf);
2171
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
2172
0
    free (contents);
2173
0
  if (elf_section_data (sec)->relocs != internal_relocs)
2174
0
    free (internal_relocs);
2175
2176
0
  return false;
2177
0
}
2178
2179
/* Create dynamic sections when linking against a dynamic object.  */
2180
2181
static bool
2182
_bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2183
0
{
2184
0
  flagword   flags;
2185
0
  asection * s;
2186
0
  elf_backend_data * bed = get_elf_backend_data (abfd);
2187
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2188
0
  int ptralign = 0;
2189
2190
0
  switch (bed->s->arch_size)
2191
0
    {
2192
0
    case 16:
2193
0
      ptralign = 1;
2194
0
      break;
2195
2196
0
    case 32:
2197
0
      ptralign = 2;
2198
0
      break;
2199
2200
0
    default:
2201
0
      bfd_set_error (bfd_error_bad_value);
2202
0
      return false;
2203
0
    }
2204
2205
  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2206
     .rel[a].bss sections.  */
2207
2208
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2209
0
     | SEC_LINKER_CREATED);
2210
2211
0
  s = bfd_make_section_anyway_with_flags (abfd,
2212
0
            (bed->default_use_rela_p
2213
0
             ? ".rela.plt" : ".rel.plt"),
2214
0
            flags | SEC_READONLY);
2215
0
  htab->srelplt = s;
2216
0
  if (s == NULL
2217
0
      || !bfd_set_section_alignment (s, ptralign))
2218
0
    return false;
2219
2220
0
  if (! _bfd_cr16_elf_create_got_section (abfd, info))
2221
0
    return false;
2222
2223
0
  if (bed->want_dynbss)
2224
0
    {
2225
      /* The .dynbss section is a place to put symbols which are defined
2226
   by dynamic objects, are referenced by regular objects, and are
2227
   not functions.  We must allocate space for them in the process
2228
   image and use a R_*_COPY reloc to tell the dynamic linker to
2229
   initialize them at run time.  The linker script puts the .dynbss
2230
   section into the .bss section of the final image.  */
2231
0
      s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
2232
0
                SEC_ALLOC | SEC_LINKER_CREATED);
2233
0
      if (s == NULL)
2234
0
  return false;
2235
2236
      /* The .rel[a].bss section holds copy relocs.  This section is not
2237
   normally needed.  We need to create it here, though, so that the
2238
   linker will map it to an output section.  We can't just create it
2239
   only if we need it, because we will not know whether we need it
2240
   until we have seen all the input files, and the first time the
2241
   main linker code calls BFD after examining all the input files
2242
   (size_dynamic_sections) the input sections have already been
2243
   mapped to the output sections.  If the section turns out not to
2244
   be needed, we can discard it later.  We will never need this
2245
   section when generating a shared object, since they do not use
2246
   copy relocs.  */
2247
0
      if (! bfd_link_executable (info))
2248
0
  {
2249
0
    s = bfd_make_section_anyway_with_flags (abfd,
2250
0
              (bed->default_use_rela_p
2251
0
               ? ".rela.bss" : ".rel.bss"),
2252
0
              flags | SEC_READONLY);
2253
0
    if (s == NULL
2254
0
        || !bfd_set_section_alignment (s, ptralign))
2255
0
      return false;
2256
0
  }
2257
0
    }
2258
2259
0
  return true;
2260
0
}
2261

2262
/* Adjust a symbol defined by a dynamic object and referenced by a
2263
   regular object.  The current definition is in some section of the
2264
   dynamic object, but we're not including those sections.  We have to
2265
   change the definition to something the rest of the link can
2266
   understand.  */
2267
2268
static bool
2269
_bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
2270
             struct elf_link_hash_entry * h)
2271
0
{
2272
0
  bfd * dynobj;
2273
0
  asection * s;
2274
2275
0
  dynobj = elf_hash_table (info)->dynobj;
2276
2277
  /* Make sure we know what is going on here.  */
2278
0
  BFD_ASSERT (dynobj != NULL
2279
0
        && (h->needs_plt
2280
0
      || h->is_weakalias
2281
0
      || (h->def_dynamic
2282
0
          && h->ref_regular
2283
0
          && !h->def_regular)));
2284
2285
  /* If this is a function, put it in the procedure linkage table.  We
2286
     will fill in the contents of the procedure linkage table later,
2287
     when we know the address of the .got section.  */
2288
0
  if (h->type == STT_FUNC
2289
0
      || h->needs_plt)
2290
0
    {
2291
0
      if (! bfd_link_executable (info)
2292
0
    && !h->def_dynamic
2293
0
    && !h->ref_dynamic)
2294
0
  {
2295
    /* This case can occur if we saw a PLT reloc in an input
2296
       file, but the symbol was never referred to by a dynamic
2297
       object.  In such a case, we don't actually need to build
2298
       a procedure linkage table, and we can just do a REL32
2299
       reloc instead.  */
2300
0
    BFD_ASSERT (h->needs_plt);
2301
0
    return true;
2302
0
  }
2303
2304
      /* Make sure this symbol is output as a dynamic symbol.  */
2305
0
      if (h->dynindx == -1)
2306
0
  {
2307
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
2308
0
      return false;
2309
0
  }
2310
2311
      /* We also need to make an entry in the .got.plt section, which
2312
   will be placed in the .got section by the linker script.  */
2313
2314
0
      s = elf_hash_table (info)->sgotplt;
2315
0
      BFD_ASSERT (s != NULL);
2316
0
      s->size += 4;
2317
2318
      /* We also need to make an entry in the .rela.plt section.  */
2319
2320
0
      s = elf_hash_table (info)->srelplt;
2321
0
      BFD_ASSERT (s != NULL);
2322
0
      s->size += sizeof (Elf32_External_Rela);
2323
2324
0
      return true;
2325
0
    }
2326
2327
  /* If this is a weak symbol, and there is a real definition, the
2328
     processor independent code will have arranged for us to see the
2329
     real definition first, and we can just use the same value.  */
2330
0
  if (h->is_weakalias)
2331
0
    {
2332
0
      struct elf_link_hash_entry *def = weakdef (h);
2333
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2334
0
      h->root.u.def.section = def->root.u.def.section;
2335
0
      h->root.u.def.value = def->root.u.def.value;
2336
0
      return true;
2337
0
    }
2338
2339
  /* This is a reference to a symbol defined by a dynamic object which
2340
     is not a function.  */
2341
2342
  /* If we are creating a shared library, we must presume that the
2343
     only references to the symbol are via the global offset table.
2344
     For such cases we need not do anything here; the relocations will
2345
     be handled correctly by relocate_section.  */
2346
0
  if (bfd_link_executable (info))
2347
0
    return true;
2348
2349
  /* If there are no references to this symbol that do not use the
2350
     GOT, we don't need to generate a copy reloc.  */
2351
0
  if (!h->non_got_ref)
2352
0
    return true;
2353
2354
  /* We must allocate the symbol in our .dynbss section, which will
2355
     become part of the .bss section of the executable.  There will be
2356
     an entry for this symbol in the .dynsym section.  The dynamic
2357
     object will contain position independent code, so all references
2358
     from the dynamic object to this symbol will go through the global
2359
     offset table.  The dynamic linker will use the .dynsym entry to
2360
     determine the address it must put in the global offset table, so
2361
     both the dynamic object and the regular object will refer to the
2362
     same memory location for the variable.  */
2363
2364
0
  s = bfd_get_linker_section (dynobj, ".dynbss");
2365
0
  BFD_ASSERT (s != NULL);
2366
2367
  /* We must generate a R_CR16_COPY reloc to tell the dynamic linker to
2368
     copy the initial value out of the dynamic object and into the
2369
     runtime process image.  We need to remember the offset into the
2370
     .rela.bss section we are going to use.  */
2371
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2372
0
    {
2373
0
      asection * srel;
2374
2375
0
      srel = bfd_get_linker_section (dynobj, ".rela.bss");
2376
0
      BFD_ASSERT (srel != NULL);
2377
0
      srel->size += sizeof (Elf32_External_Rela);
2378
0
      h->needs_copy = 1;
2379
0
    }
2380
2381
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
2382
0
}
2383
2384
/* Set the sizes of the dynamic sections.  */
2385
2386
static bool
2387
_bfd_cr16_elf_late_size_sections (struct bfd_link_info *info)
2388
0
{
2389
0
  bfd * dynobj;
2390
0
  asection * s;
2391
0
  bool relocs;
2392
2393
0
  dynobj = elf_hash_table (info)->dynobj;
2394
0
  if (dynobj == NULL)
2395
0
    return true;
2396
2397
0
  if (elf_hash_table (info)->dynamic_sections_created)
2398
0
    {
2399
      /* Set the contents of the .interp section to the interpreter.  */
2400
0
      if (bfd_link_executable (info) && !info->nointerp)
2401
0
  {
2402
#if 0
2403
    s = elf_hash_table (info)->interp;
2404
    BFD_ASSERT (s != NULL);
2405
    s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2406
    s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2407
    s->alloced = 1;
2408
#endif
2409
0
  }
2410
0
    }
2411
0
  else
2412
0
    {
2413
      /* We may have created entries in the .rela.got section.
2414
   However, if we are not creating the dynamic sections, we will
2415
   not actually use these entries.  Reset the size of .rela.got,
2416
   which will cause it to get stripped from the output file
2417
   below.  */
2418
0
      s = elf_hash_table (info)->srelgot;
2419
0
      if (s != NULL)
2420
0
  s->size = 0;
2421
0
    }
2422
2423
  /* The check_relocs and adjust_dynamic_symbol entry points have
2424
     determined the sizes of the various dynamic sections.  Allocate
2425
     memory for them.  */
2426
0
  relocs = false;
2427
0
  for (s = dynobj->sections; s != NULL; s = s->next)
2428
0
    {
2429
0
      const char * name;
2430
2431
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
2432
0
  continue;
2433
2434
      /* It's OK to base decisions on the section name, because none
2435
   of the dynobj section names depend upon the input files.  */
2436
0
      name = bfd_section_name (s);
2437
2438
0
      if (strcmp (name, ".plt") == 0)
2439
0
  {
2440
    /* Remember whether there is a PLT.  */
2441
0
    ;
2442
0
  }
2443
0
      else if (startswith (name, ".rela"))
2444
0
  {
2445
0
    if (s->size != 0)
2446
0
      {
2447
        /* Remember whether there are any reloc sections other
2448
     than .rela.plt.  */
2449
0
        if (strcmp (name, ".rela.plt") != 0)
2450
0
    relocs = true;
2451
2452
        /* We use the reloc_count field as a counter if we need
2453
     to copy relocs into the output file.  */
2454
0
        s->reloc_count = 0;
2455
0
      }
2456
0
  }
2457
0
      else if (! startswith (name, ".got")
2458
0
         && strcmp (name, ".dynbss") != 0)
2459
  /* It's not one of our sections, so don't allocate space.  */
2460
0
  continue;
2461
2462
0
      if (s->size == 0)
2463
0
  {
2464
    /* If we don't need this section, strip it from the
2465
       output file.  This is mostly to handle .rela.bss and
2466
       .rela.plt.  We must create both sections in
2467
       create_dynamic_sections, because they must be created
2468
       before the linker maps input sections to output
2469
       sections.  The linker does that before
2470
       adjust_dynamic_symbol is called, and it is that
2471
       function which decides whether anything needs to go
2472
       into these sections.  */
2473
0
    s->flags |= SEC_EXCLUDE;
2474
0
    continue;
2475
0
  }
2476
2477
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
2478
0
  continue;
2479
2480
      /* Allocate memory for the section contents.  We use bfd_zalloc
2481
   here in case unused entries are not reclaimed before the
2482
   section's contents are written out.  This should not happen,
2483
   but this way if it does, we get a R_CR16_NONE reloc
2484
   instead of garbage.  */
2485
0
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2486
0
      if (s->contents == NULL)
2487
0
  return false;
2488
0
      s->alloced = 1;
2489
0
    }
2490
2491
0
  return _bfd_elf_add_dynamic_tags (info, relocs);
2492
0
}
2493
2494
/* Finish up dynamic symbol handling.  We set the contents of various
2495
   dynamic sections here.  */
2496
2497
static bool
2498
_bfd_cr16_elf_finish_dynamic_symbol (struct bfd_link_info * info,
2499
             struct elf_link_hash_entry * h,
2500
             Elf_Internal_Sym * sym)
2501
0
{
2502
0
  bfd * dynobj;
2503
2504
0
  dynobj = elf_hash_table (info)->dynobj;
2505
2506
0
  if (h->got.offset != (bfd_vma) -1)
2507
0
    {
2508
0
      asection *  sgot;
2509
0
      asection *  srel;
2510
0
      Elf_Internal_Rela rel;
2511
2512
      /* This symbol has an entry in the global offset table.  Set it up.  */
2513
2514
0
      sgot = elf_hash_table (info)->sgot;
2515
0
      srel = elf_hash_table (info)->srelgot;
2516
0
      BFD_ASSERT (sgot != NULL && srel != NULL);
2517
2518
0
      rel.r_offset = (sgot->output_section->vma
2519
0
          + sgot->output_offset
2520
0
          + (h->got.offset & ~1));
2521
2522
      /* If this is a -Bsymbolic link, and the symbol is defined
2523
   locally, we just want to emit a RELATIVE reloc.  Likewise if
2524
   the symbol was forced to be local because of a version file.
2525
   The entry in the global offset table will already have been
2526
   initialized in the relocate_section function.  */
2527
0
      if (bfd_link_executable (info)
2528
0
    && (info->symbolic || h->dynindx == -1)
2529
0
    && h->def_regular)
2530
0
  {
2531
0
    rel.r_info = ELF32_R_INFO (0, R_CR16_GOT_REGREL20);
2532
0
    rel.r_addend = (h->root.u.def.value
2533
0
        + h->root.u.def.section->output_section->vma
2534
0
        + h->root.u.def.section->output_offset);
2535
0
  }
2536
0
      else
2537
0
  {
2538
0
    bfd_put_32 (info->output_bfd, 0, sgot->contents + h->got.offset);
2539
0
    rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
2540
0
    rel.r_addend = 0;
2541
0
  }
2542
2543
0
      bfd_elf32_swap_reloca_out (info->output_bfd, &rel,
2544
0
         (bfd_byte *) ((Elf32_External_Rela *) srel->contents
2545
0
                 + srel->reloc_count));
2546
0
      ++ srel->reloc_count;
2547
0
    }
2548
2549
0
  if (h->needs_copy)
2550
0
    {
2551
0
      asection *  s;
2552
0
      Elf_Internal_Rela rel;
2553
2554
      /* This symbol needs a copy reloc.  Set it up.  */
2555
0
      BFD_ASSERT (h->dynindx != -1
2556
0
      && (h->root.type == bfd_link_hash_defined
2557
0
          || h->root.type == bfd_link_hash_defweak));
2558
2559
0
      s = bfd_get_linker_section (dynobj, ".rela.bss");
2560
0
      BFD_ASSERT (s != NULL);
2561
2562
0
      rel.r_offset = (h->root.u.def.value
2563
0
          + h->root.u.def.section->output_section->vma
2564
0
          + h->root.u.def.section->output_offset);
2565
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
2566
0
      rel.r_addend = 0;
2567
0
      bfd_elf32_swap_reloca_out (info->output_bfd, &rel,
2568
0
         (bfd_byte *) ((Elf32_External_Rela *) s->contents
2569
0
                 + s->reloc_count));
2570
0
      ++ s->reloc_count;
2571
0
    }
2572
2573
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
2574
0
  if (h == elf_hash_table (info)->hdynamic
2575
0
      || h == elf_hash_table (info)->hgot)
2576
0
    sym->st_shndx = SHN_ABS;
2577
2578
0
  return true;
2579
0
}
2580
2581
/* Finish up the dynamic sections.  */
2582
2583
static bool
2584
_bfd_cr16_elf_finish_dynamic_sections (struct bfd_link_info *info,
2585
               bfd_byte *buf ATTRIBUTE_UNUSED)
2586
0
{
2587
0
  bfd *      dynobj;
2588
0
  asection * sgot;
2589
0
  asection * sdyn;
2590
2591
0
  dynobj = elf_hash_table (info)->dynobj;
2592
0
  sgot = elf_hash_table (info)->sgotplt;
2593
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2594
2595
0
  if (elf_hash_table (info)->dynamic_sections_created)
2596
0
    {
2597
0
      Elf32_External_Dyn * dyncon;
2598
0
      Elf32_External_Dyn * dynconend;
2599
2600
0
      BFD_ASSERT (sdyn != NULL && sgot != NULL);
2601
2602
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
2603
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
2604
2605
0
      for (; dyncon < dynconend; dyncon++)
2606
0
  {
2607
0
    Elf_Internal_Dyn dyn;
2608
0
    asection * s;
2609
2610
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2611
2612
0
    switch (dyn.d_tag)
2613
0
      {
2614
0
      default:
2615
0
        break;
2616
2617
0
      case DT_PLTGOT:
2618
0
        s = elf_hash_table (info)->sgotplt;
2619
0
        goto get_vma;
2620
2621
0
      case DT_JMPREL:
2622
0
        s = elf_hash_table (info)->srelplt;
2623
0
      get_vma:
2624
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2625
0
        bfd_elf32_swap_dyn_out (info->output_bfd, &dyn, dyncon);
2626
0
        break;
2627
2628
0
      case DT_PLTRELSZ:
2629
0
        s = elf_hash_table (info)->srelplt;
2630
0
        dyn.d_un.d_val = s->size;
2631
0
        bfd_elf32_swap_dyn_out (info->output_bfd, &dyn, dyncon);
2632
0
        break;
2633
0
      }
2634
0
  }
2635
2636
0
    }
2637
2638
  /* Fill in the first three entries in the global offset table.  */
2639
0
  if (sgot != NULL && sgot->size > 0)
2640
0
    {
2641
0
      if (sdyn == NULL)
2642
0
  bfd_put_32 (info->output_bfd, 0, sgot->contents);
2643
0
      else
2644
0
  bfd_put_32 (info->output_bfd,
2645
0
        sdyn->output_section->vma + sdyn->output_offset,
2646
0
        sgot->contents);
2647
2648
0
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2649
0
    }
2650
2651
0
  return true;
2652
0
}
2653
2654
/* Given a .data.rel section and a .emreloc in-memory section, store
2655
   relocation information into the .emreloc section which can be
2656
   used at runtime to relocate the section.  This is called by the
2657
   linker when the --embedded-relocs switch is used.  This is called
2658
   after the add_symbols entry point has been called for all the
2659
   objects, and before the final_link entry point is called.  */
2660
2661
bool
2662
bfd_cr16_elf32_create_embedded_relocs (bfd *abfd,
2663
               struct bfd_link_info *info,
2664
               asection *datasec,
2665
               asection *relsec,
2666
               char **errmsg)
2667
0
{
2668
0
  Elf_Internal_Shdr *symtab_hdr;
2669
0
  Elf_Internal_Sym *isymbuf = NULL;
2670
0
  Elf_Internal_Rela *internal_relocs = NULL;
2671
0
  Elf_Internal_Rela *irel, *irelend;
2672
0
  bfd_byte *p;
2673
0
  bfd_size_type amt;
2674
2675
0
  BFD_ASSERT (! bfd_link_relocatable (info));
2676
2677
0
  *errmsg = NULL;
2678
2679
0
  if (datasec->reloc_count == 0)
2680
0
    return true;
2681
2682
0
  symtab_hdr = &elf_symtab_hdr (abfd);
2683
2684
  /* Get a copy of the native relocations.  */
2685
0
  internal_relocs = (_bfd_elf_link_read_relocs
2686
0
         (abfd, datasec, NULL, NULL, info->keep_memory));
2687
0
  if (internal_relocs == NULL)
2688
0
    goto error_return;
2689
2690
0
  amt = (bfd_size_type) datasec->reloc_count * 8;
2691
0
  relsec->contents = (bfd_byte *) bfd_alloc (abfd, amt);
2692
0
  if (relsec->contents == NULL)
2693
0
    goto error_return;
2694
0
  relsec->alloced = 1;
2695
2696
0
  p = relsec->contents;
2697
2698
0
  irelend = internal_relocs + datasec->reloc_count;
2699
0
  for (irel = internal_relocs; irel < irelend; irel++, p += 8)
2700
0
    {
2701
0
      asection *targetsec;
2702
2703
      /* We are going to write a four byte longword into the runtime
2704
   reloc section.  The longword will be the address in the data
2705
   section which must be relocated.  It is followed by the name
2706
   of the target section NUL-padded or truncated to 8
2707
   characters.  */
2708
2709
      /* We can only relocate absolute longword relocs at run time.  */
2710
0
      if (!((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
2711
0
      || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32)))
2712
0
  {
2713
0
    *errmsg = _("unsupported relocation type");
2714
0
    bfd_set_error (bfd_error_bad_value);
2715
0
    goto error_return;
2716
0
  }
2717
2718
      /* Get the target section referred to by the reloc.  */
2719
0
      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2720
0
  {
2721
    /* A local symbol.  */
2722
0
    Elf_Internal_Sym *isym;
2723
2724
    /* Read this BFD's local symbols if we haven't done so already.  */
2725
0
    if (isymbuf == NULL)
2726
0
      {
2727
0
        isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2728
0
        if (isymbuf == NULL)
2729
0
    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2730
0
            symtab_hdr->sh_info, 0,
2731
0
            NULL, NULL, NULL);
2732
0
        if (isymbuf == NULL)
2733
0
    goto error_return;
2734
0
      }
2735
2736
0
    isym = isymbuf + ELF32_R_SYM (irel->r_info);
2737
0
    targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2738
0
  }
2739
0
      else
2740
0
  {
2741
0
    unsigned long indx;
2742
0
    struct elf_link_hash_entry *h;
2743
2744
    /* An external symbol.  */
2745
0
    indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2746
0
    h = elf_sym_hashes (abfd)[indx];
2747
0
    BFD_ASSERT (h != NULL);
2748
0
    if (h->root.type == bfd_link_hash_defined
2749
0
        || h->root.type == bfd_link_hash_defweak)
2750
0
      targetsec = h->root.u.def.section;
2751
0
    else
2752
0
      targetsec = NULL;
2753
0
  }
2754
2755
0
      bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
2756
0
      memset (p + 4, 0, 4);
2757
0
      if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
2758
0
    && (targetsec != NULL) )
2759
0
  strncpy ((char *) p + 4, targetsec->output_section->name, 4);
2760
0
    }
2761
2762
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
2763
0
    free (isymbuf);
2764
0
  if (elf_section_data (datasec)->relocs != internal_relocs)
2765
0
    free (internal_relocs);
2766
0
  return true;
2767
2768
0
 error_return:
2769
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
2770
0
    free (isymbuf);
2771
0
  if (elf_section_data (datasec)->relocs != internal_relocs)
2772
0
    free (internal_relocs);
2773
0
  return false;
2774
0
}
2775
2776
2777
/* Classify relocation types, such that combreloc can sort them
2778
   properly.  */
2779
2780
static enum elf_reloc_type_class
2781
_bfd_cr16_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2782
        const asection *rel_sec ATTRIBUTE_UNUSED,
2783
        const Elf_Internal_Rela *rela)
2784
0
{
2785
0
  switch ((int) ELF32_R_TYPE (rela->r_info))
2786
0
    {
2787
0
    case R_CR16_GOT_REGREL20:
2788
0
    case R_CR16_GOTC_REGREL20:
2789
0
      return reloc_class_relative;
2790
0
    default:
2791
0
      return reloc_class_normal;
2792
0
    }
2793
0
}
2794
2795
/* Definitions for setting CR16 target vector.  */
2796
#define TARGET_LITTLE_SYM     cr16_elf32_vec
2797
#define TARGET_LITTLE_NAME      "elf32-cr16"
2798
#define ELF_ARCH        bfd_arch_cr16
2799
#define ELF_TARGET_ID       CR16_ELF_DATA
2800
#define ELF_MACHINE_CODE      EM_CR16
2801
#define ELF_MACHINE_ALT1      EM_CR16_OLD
2802
#define ELF_MAXPAGESIZE       0x1
2803
#define elf_symbol_leading_char     '_'
2804
2805
#define bfd_elf32_bfd_reloc_type_lookup   elf_cr16_reloc_type_lookup
2806
#define bfd_elf32_bfd_reloc_name_lookup   elf_cr16_reloc_name_lookup
2807
#define elf_info_to_howto     elf_cr16_info_to_howto
2808
#define elf_info_to_howto_rel     NULL
2809
#define elf_backend_relocate_section    elf32_cr16_relocate_section
2810
#define bfd_elf32_bfd_relax_section   elf32_cr16_relax_section
2811
#define bfd_elf32_bfd_get_relocated_section_contents \
2812
        elf32_cr16_get_relocated_section_contents
2813
#define elf_backend_can_gc_sections   1
2814
#define elf_backend_rela_normal     1
2815
#define elf_backend_check_relocs    cr16_elf_check_relocs
2816
/* So we can set bits in e_flags.  */
2817
#define elf_backend_final_write_processing \
2818
         _bfd_cr16_elf_final_write_processing
2819
#define elf_backend_object_p   _bfd_cr16_elf_object_p
2820
2821
#define bfd_elf32_bfd_merge_private_bfd_data \
2822
         _bfd_cr16_elf_merge_private_bfd_data
2823
2824
2825
#define bfd_elf32_bfd_link_hash_table_create \
2826
          elf32_cr16_link_hash_table_create
2827
2828
#define elf_backend_create_dynamic_sections \
2829
          _bfd_cr16_elf_create_dynamic_sections
2830
#define elf_backend_adjust_dynamic_symbol \
2831
          _bfd_cr16_elf_adjust_dynamic_symbol
2832
#define elf_backend_late_size_sections \
2833
          _bfd_cr16_elf_late_size_sections
2834
#define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
2835
#define elf_backend_finish_dynamic_symbol \
2836
           _bfd_cr16_elf_finish_dynamic_symbol
2837
#define elf_backend_finish_dynamic_sections \
2838
           _bfd_cr16_elf_finish_dynamic_sections
2839
2840
#define elf_backend_reloc_type_class   _bfd_cr16_elf_reloc_type_class
2841
2842
2843
#define elf_backend_want_got_plt  1
2844
#define elf_backend_plt_readonly  1
2845
#define elf_backend_want_plt_sym  0
2846
#define elf_backend_got_header_size 12
2847
#define elf_backend_dtrel_excludes_plt  1
2848
2849
#include "elf32-target.h"