Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/elf32-arm.c
Line
Count
Source (jump to first uncovered line)
1
/* 32-bit ELF support for ARM
2
   Copyright (C) 1998-2025 Free Software Foundation, Inc.
3
4
   This file is part of BFD, the Binary File Descriptor library.
5
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
#include "sysdep.h"
22
#include <limits.h>
23
24
#include "bfd.h"
25
#include "libiberty.h"
26
#include "libbfd.h"
27
#include "elf-bfd.h"
28
#include "elf-nacl.h"
29
#include "elf-vxworks.h"
30
#include "elf/arm.h"
31
#include "elf32-arm.h"
32
#include "cpu-arm.h"
33
34
/* Return the relocation section associated with NAME.  HTAB is the
35
   bfd's elf32_arm_link_hash_entry.  */
36
#define RELOC_SECTION(HTAB, NAME) \
37
0
  ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
38
39
/* Return size of a relocation entry.  HTAB is the bfd's
40
   elf32_arm_link_hash_entry.  */
41
#define RELOC_SIZE(HTAB) \
42
0
  ((HTAB)->use_rel \
43
0
   ? sizeof (Elf32_External_Rel) \
44
0
   : sizeof (Elf32_External_Rela))
45
46
/* Return function to swap relocations in.  HTAB is the bfd's
47
   elf32_arm_link_hash_entry.  */
48
#define SWAP_RELOC_IN(HTAB) \
49
0
  ((HTAB)->use_rel \
50
0
   ? bfd_elf32_swap_reloc_in \
51
0
   : bfd_elf32_swap_reloca_in)
52
53
/* Return function to swap relocations out.  HTAB is the bfd's
54
   elf32_arm_link_hash_entry.  */
55
#define SWAP_RELOC_OUT(HTAB) \
56
0
  ((HTAB)->use_rel \
57
0
   ? bfd_elf32_swap_reloc_out \
58
0
   : bfd_elf32_swap_reloca_out)
59
60
#define elf_info_to_howto   NULL
61
#define elf_info_to_howto_rel   elf32_arm_info_to_howto
62
63
2
#define ARM_ELF_ABI_VERSION   0
64
#define ARM_ELF_OS_ABI_VERSION    ELFOSABI_ARM
65
66
/* The Adjusted Place, as defined by AAELF.  */
67
0
#define Pa(X) ((X) & 0xfffffffc)
68
69
static bool elf32_arm_write_section (bfd *output_bfd,
70
             struct bfd_link_info *link_info,
71
             asection *sec,
72
             bfd_byte *contents);
73
74
/* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
75
   R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
76
   in that slot.  */
77
78
static reloc_howto_type elf32_arm_howto_table_1[] =
79
{
80
  /* No relocation.  */
81
  HOWTO (R_ARM_NONE,    /* type */
82
   0,     /* rightshift */
83
   0,     /* size */
84
   0,     /* bitsize */
85
   false,     /* pc_relative */
86
   0,     /* bitpos */
87
   complain_overflow_dont,/* complain_on_overflow */
88
   bfd_elf_generic_reloc, /* special_function */
89
   "R_ARM_NONE",    /* name */
90
   false,     /* partial_inplace */
91
   0,     /* src_mask */
92
   0,     /* dst_mask */
93
   false),    /* pcrel_offset */
94
95
  HOWTO (R_ARM_PC24,    /* type */
96
   2,     /* rightshift */
97
   4,     /* size */
98
   24,      /* bitsize */
99
   true,      /* pc_relative */
100
   0,     /* bitpos */
101
   complain_overflow_signed,/* complain_on_overflow */
102
   bfd_elf_generic_reloc, /* special_function */
103
   "R_ARM_PC24",    /* name */
104
   false,     /* partial_inplace */
105
   0x00ffffff,    /* src_mask */
106
   0x00ffffff,    /* dst_mask */
107
   true),     /* pcrel_offset */
108
109
  /* 32 bit absolute */
110
  HOWTO (R_ARM_ABS32,   /* type */
111
   0,     /* rightshift */
112
   4,     /* size */
113
   32,      /* bitsize */
114
   false,     /* pc_relative */
115
   0,     /* bitpos */
116
   complain_overflow_bitfield,/* complain_on_overflow */
117
   bfd_elf_generic_reloc, /* special_function */
118
   "R_ARM_ABS32",   /* name */
119
   false,     /* partial_inplace */
120
   0xffffffff,    /* src_mask */
121
   0xffffffff,    /* dst_mask */
122
   false),    /* pcrel_offset */
123
124
  /* standard 32bit pc-relative reloc */
125
  HOWTO (R_ARM_REL32,   /* type */
126
   0,     /* rightshift */
127
   4,     /* size */
128
   32,      /* bitsize */
129
   true,      /* pc_relative */
130
   0,     /* bitpos */
131
   complain_overflow_bitfield,/* complain_on_overflow */
132
   bfd_elf_generic_reloc, /* special_function */
133
   "R_ARM_REL32",   /* name */
134
   false,     /* partial_inplace */
135
   0xffffffff,    /* src_mask */
136
   0xffffffff,    /* dst_mask */
137
   true),     /* pcrel_offset */
138
139
  /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
140
  HOWTO (R_ARM_LDR_PC_G0, /* type */
141
   0,     /* rightshift */
142
   1,     /* size */
143
   32,      /* bitsize */
144
   true,      /* pc_relative */
145
   0,     /* bitpos */
146
   complain_overflow_dont,/* complain_on_overflow */
147
   bfd_elf_generic_reloc, /* special_function */
148
   "R_ARM_LDR_PC_G0",     /* name */
149
   false,     /* partial_inplace */
150
   0xffffffff,    /* src_mask */
151
   0xffffffff,    /* dst_mask */
152
   true),     /* pcrel_offset */
153
154
   /* 16 bit absolute */
155
  HOWTO (R_ARM_ABS16,   /* type */
156
   0,     /* rightshift */
157
   2,     /* size */
158
   16,      /* bitsize */
159
   false,     /* pc_relative */
160
   0,     /* bitpos */
161
   complain_overflow_bitfield,/* complain_on_overflow */
162
   bfd_elf_generic_reloc, /* special_function */
163
   "R_ARM_ABS16",   /* name */
164
   false,     /* partial_inplace */
165
   0x0000ffff,    /* src_mask */
166
   0x0000ffff,    /* dst_mask */
167
   false),    /* pcrel_offset */
168
169
  /* 12 bit absolute */
170
  HOWTO (R_ARM_ABS12,   /* type */
171
   0,     /* rightshift */
172
   4,     /* size */
173
   12,      /* bitsize */
174
   false,     /* pc_relative */
175
   0,     /* bitpos */
176
   complain_overflow_bitfield,/* complain_on_overflow */
177
   bfd_elf_generic_reloc, /* special_function */
178
   "R_ARM_ABS12",   /* name */
179
   false,     /* partial_inplace */
180
   0x00000fff,    /* src_mask */
181
   0x00000fff,    /* dst_mask */
182
   false),    /* pcrel_offset */
183
184
  HOWTO (R_ARM_THM_ABS5,  /* type */
185
   6,     /* rightshift */
186
   2,     /* size */
187
   5,     /* bitsize */
188
   false,     /* pc_relative */
189
   0,     /* bitpos */
190
   complain_overflow_bitfield,/* complain_on_overflow */
191
   bfd_elf_generic_reloc, /* special_function */
192
   "R_ARM_THM_ABS5",  /* name */
193
   false,     /* partial_inplace */
194
   0x000007e0,    /* src_mask */
195
   0x000007e0,    /* dst_mask */
196
   false),    /* pcrel_offset */
197
198
  /* 8 bit absolute */
199
  HOWTO (R_ARM_ABS8,    /* type */
200
   0,     /* rightshift */
201
   1,     /* size */
202
   8,     /* bitsize */
203
   false,     /* pc_relative */
204
   0,     /* bitpos */
205
   complain_overflow_bitfield,/* complain_on_overflow */
206
   bfd_elf_generic_reloc, /* special_function */
207
   "R_ARM_ABS8",    /* name */
208
   false,     /* partial_inplace */
209
   0x000000ff,    /* src_mask */
210
   0x000000ff,    /* dst_mask */
211
   false),    /* pcrel_offset */
212
213
  HOWTO (R_ARM_SBREL32,   /* type */
214
   0,     /* rightshift */
215
   4,     /* size */
216
   32,      /* bitsize */
217
   false,     /* pc_relative */
218
   0,     /* bitpos */
219
   complain_overflow_dont,/* complain_on_overflow */
220
   bfd_elf_generic_reloc, /* special_function */
221
   "R_ARM_SBREL32", /* name */
222
   false,     /* partial_inplace */
223
   0xffffffff,    /* src_mask */
224
   0xffffffff,    /* dst_mask */
225
   false),    /* pcrel_offset */
226
227
  HOWTO (R_ARM_THM_CALL,  /* type */
228
   1,     /* rightshift */
229
   4,     /* size */
230
   24,      /* bitsize */
231
   true,      /* pc_relative */
232
   0,     /* bitpos */
233
   complain_overflow_signed,/* complain_on_overflow */
234
   bfd_elf_generic_reloc, /* special_function */
235
   "R_ARM_THM_CALL",  /* name */
236
   false,     /* partial_inplace */
237
   0x07ff2fff,    /* src_mask */
238
   0x07ff2fff,    /* dst_mask */
239
   true),     /* pcrel_offset */
240
241
  HOWTO (R_ARM_THM_PC8,   /* type */
242
   1,     /* rightshift */
243
   2,     /* size */
244
   8,     /* bitsize */
245
   true,      /* pc_relative */
246
   0,     /* bitpos */
247
   complain_overflow_signed,/* complain_on_overflow */
248
   bfd_elf_generic_reloc, /* special_function */
249
   "R_ARM_THM_PC8", /* name */
250
   false,     /* partial_inplace */
251
   0x000000ff,    /* src_mask */
252
   0x000000ff,    /* dst_mask */
253
   true),     /* pcrel_offset */
254
255
  HOWTO (R_ARM_BREL_ADJ,  /* type */
256
   1,     /* rightshift */
257
   2,     /* size */
258
   32,      /* bitsize */
259
   false,     /* pc_relative */
260
   0,     /* bitpos */
261
   complain_overflow_signed,/* complain_on_overflow */
262
   bfd_elf_generic_reloc, /* special_function */
263
   "R_ARM_BREL_ADJ",  /* name */
264
   false,     /* partial_inplace */
265
   0xffffffff,    /* src_mask */
266
   0xffffffff,    /* dst_mask */
267
   false),    /* pcrel_offset */
268
269
  HOWTO (R_ARM_TLS_DESC,  /* type */
270
   0,     /* rightshift */
271
   4,     /* size */
272
   32,      /* bitsize */
273
   false,     /* pc_relative */
274
   0,     /* bitpos */
275
   complain_overflow_bitfield,/* complain_on_overflow */
276
   bfd_elf_generic_reloc, /* special_function */
277
   "R_ARM_TLS_DESC",  /* name */
278
   false,     /* partial_inplace */
279
   0xffffffff,    /* src_mask */
280
   0xffffffff,    /* dst_mask */
281
   false),    /* pcrel_offset */
282
283
  HOWTO (R_ARM_THM_SWI8,  /* type */
284
   0,     /* rightshift */
285
   0,     /* size */
286
   0,     /* bitsize */
287
   false,     /* pc_relative */
288
   0,     /* bitpos */
289
   complain_overflow_signed,/* complain_on_overflow */
290
   bfd_elf_generic_reloc, /* special_function */
291
   "R_ARM_SWI8",    /* name */
292
   false,     /* partial_inplace */
293
   0x00000000,    /* src_mask */
294
   0x00000000,    /* dst_mask */
295
   false),    /* pcrel_offset */
296
297
  /* BLX instruction for the ARM.  */
298
  HOWTO (R_ARM_XPC25,   /* type */
299
   2,     /* rightshift */
300
   4,     /* size */
301
   24,      /* bitsize */
302
   true,      /* pc_relative */
303
   0,     /* bitpos */
304
   complain_overflow_signed,/* complain_on_overflow */
305
   bfd_elf_generic_reloc, /* special_function */
306
   "R_ARM_XPC25",   /* name */
307
   false,     /* partial_inplace */
308
   0x00ffffff,    /* src_mask */
309
   0x00ffffff,    /* dst_mask */
310
   true),     /* pcrel_offset */
311
312
  /* BLX instruction for the Thumb.  */
313
  HOWTO (R_ARM_THM_XPC22, /* type */
314
   2,     /* rightshift */
315
   4,     /* size */
316
   24,      /* bitsize */
317
   true,      /* pc_relative */
318
   0,     /* bitpos */
319
   complain_overflow_signed,/* complain_on_overflow */
320
   bfd_elf_generic_reloc, /* special_function */
321
   "R_ARM_THM_XPC22", /* name */
322
   false,     /* partial_inplace */
323
   0x07ff2fff,    /* src_mask */
324
   0x07ff2fff,    /* dst_mask */
325
   true),     /* pcrel_offset */
326
327
  /* Dynamic TLS relocations.  */
328
329
  HOWTO (R_ARM_TLS_DTPMOD32,  /* type */
330
   0,     /* rightshift */
331
   4,     /* size */
332
   32,      /* bitsize */
333
   false,     /* pc_relative */
334
   0,     /* bitpos */
335
   complain_overflow_bitfield,/* complain_on_overflow */
336
   bfd_elf_generic_reloc, /* special_function */
337
   "R_ARM_TLS_DTPMOD32",  /* name */
338
   true,      /* partial_inplace */
339
   0xffffffff,    /* src_mask */
340
   0xffffffff,    /* dst_mask */
341
   false),    /* pcrel_offset */
342
343
  HOWTO (R_ARM_TLS_DTPOFF32,  /* type */
344
   0,     /* rightshift */
345
   4,     /* size */
346
   32,      /* bitsize */
347
   false,     /* pc_relative */
348
   0,     /* bitpos */
349
   complain_overflow_bitfield,/* complain_on_overflow */
350
   bfd_elf_generic_reloc, /* special_function */
351
   "R_ARM_TLS_DTPOFF32",  /* name */
352
   true,      /* partial_inplace */
353
   0xffffffff,    /* src_mask */
354
   0xffffffff,    /* dst_mask */
355
   false),    /* pcrel_offset */
356
357
  HOWTO (R_ARM_TLS_TPOFF32, /* type */
358
   0,     /* rightshift */
359
   4,     /* size */
360
   32,      /* bitsize */
361
   false,     /* pc_relative */
362
   0,     /* bitpos */
363
   complain_overflow_bitfield,/* complain_on_overflow */
364
   bfd_elf_generic_reloc, /* special_function */
365
   "R_ARM_TLS_TPOFF32", /* name */
366
   true,      /* partial_inplace */
367
   0xffffffff,    /* src_mask */
368
   0xffffffff,    /* dst_mask */
369
   false),    /* pcrel_offset */
370
371
  /* Relocs used in ARM Linux */
372
373
  HOWTO (R_ARM_COPY,    /* type */
374
   0,     /* rightshift */
375
   4,     /* size */
376
   32,      /* bitsize */
377
   false,     /* pc_relative */
378
   0,     /* bitpos */
379
   complain_overflow_bitfield,/* complain_on_overflow */
380
   bfd_elf_generic_reloc, /* special_function */
381
   "R_ARM_COPY",    /* name */
382
   true,      /* partial_inplace */
383
   0xffffffff,    /* src_mask */
384
   0xffffffff,    /* dst_mask */
385
   false),    /* pcrel_offset */
386
387
  HOWTO (R_ARM_GLOB_DAT,  /* type */
388
   0,     /* rightshift */
389
   4,     /* size */
390
   32,      /* bitsize */
391
   false,     /* pc_relative */
392
   0,     /* bitpos */
393
   complain_overflow_bitfield,/* complain_on_overflow */
394
   bfd_elf_generic_reloc, /* special_function */
395
   "R_ARM_GLOB_DAT",  /* name */
396
   true,      /* partial_inplace */
397
   0xffffffff,    /* src_mask */
398
   0xffffffff,    /* dst_mask */
399
   false),    /* pcrel_offset */
400
401
  HOWTO (R_ARM_JUMP_SLOT, /* type */
402
   0,     /* rightshift */
403
   4,     /* size */
404
   32,      /* bitsize */
405
   false,     /* pc_relative */
406
   0,     /* bitpos */
407
   complain_overflow_bitfield,/* complain_on_overflow */
408
   bfd_elf_generic_reloc, /* special_function */
409
   "R_ARM_JUMP_SLOT", /* name */
410
   true,      /* partial_inplace */
411
   0xffffffff,    /* src_mask */
412
   0xffffffff,    /* dst_mask */
413
   false),    /* pcrel_offset */
414
415
  HOWTO (R_ARM_RELATIVE,  /* type */
416
   0,     /* rightshift */
417
   4,     /* size */
418
   32,      /* bitsize */
419
   false,     /* pc_relative */
420
   0,     /* bitpos */
421
   complain_overflow_bitfield,/* complain_on_overflow */
422
   bfd_elf_generic_reloc, /* special_function */
423
   "R_ARM_RELATIVE",  /* name */
424
   true,      /* partial_inplace */
425
   0xffffffff,    /* src_mask */
426
   0xffffffff,    /* dst_mask */
427
   false),    /* pcrel_offset */
428
429
  HOWTO (R_ARM_GOTOFF32,  /* type */
430
   0,     /* rightshift */
431
   4,     /* size */
432
   32,      /* bitsize */
433
   false,     /* pc_relative */
434
   0,     /* bitpos */
435
   complain_overflow_bitfield,/* complain_on_overflow */
436
   bfd_elf_generic_reloc, /* special_function */
437
   "R_ARM_GOTOFF32",  /* name */
438
   true,      /* partial_inplace */
439
   0xffffffff,    /* src_mask */
440
   0xffffffff,    /* dst_mask */
441
   false),    /* pcrel_offset */
442
443
  HOWTO (R_ARM_GOTPC,   /* type */
444
   0,     /* rightshift */
445
   4,     /* size */
446
   32,      /* bitsize */
447
   true,      /* pc_relative */
448
   0,     /* bitpos */
449
   complain_overflow_bitfield,/* complain_on_overflow */
450
   bfd_elf_generic_reloc, /* special_function */
451
   "R_ARM_GOTPC",   /* name */
452
   true,      /* partial_inplace */
453
   0xffffffff,    /* src_mask */
454
   0xffffffff,    /* dst_mask */
455
   true),     /* pcrel_offset */
456
457
  HOWTO (R_ARM_GOT32,   /* type */
458
   0,     /* rightshift */
459
   4,     /* size */
460
   32,      /* bitsize */
461
   false,     /* pc_relative */
462
   0,     /* bitpos */
463
   complain_overflow_bitfield,/* complain_on_overflow */
464
   bfd_elf_generic_reloc, /* special_function */
465
   "R_ARM_GOT32",   /* name */
466
   true,      /* partial_inplace */
467
   0xffffffff,    /* src_mask */
468
   0xffffffff,    /* dst_mask */
469
   false),    /* pcrel_offset */
470
471
  HOWTO (R_ARM_PLT32,   /* type */
472
   2,     /* rightshift */
473
   4,     /* size */
474
   24,      /* bitsize */
475
   true,      /* pc_relative */
476
   0,     /* bitpos */
477
   complain_overflow_bitfield,/* complain_on_overflow */
478
   bfd_elf_generic_reloc, /* special_function */
479
   "R_ARM_PLT32",   /* name */
480
   false,     /* partial_inplace */
481
   0x00ffffff,    /* src_mask */
482
   0x00ffffff,    /* dst_mask */
483
   true),     /* pcrel_offset */
484
485
  HOWTO (R_ARM_CALL,    /* type */
486
   2,     /* rightshift */
487
   4,     /* size */
488
   24,      /* bitsize */
489
   true,      /* pc_relative */
490
   0,     /* bitpos */
491
   complain_overflow_signed,/* complain_on_overflow */
492
   bfd_elf_generic_reloc, /* special_function */
493
   "R_ARM_CALL",    /* name */
494
   false,     /* partial_inplace */
495
   0x00ffffff,    /* src_mask */
496
   0x00ffffff,    /* dst_mask */
497
   true),     /* pcrel_offset */
498
499
  HOWTO (R_ARM_JUMP24,    /* type */
500
   2,     /* rightshift */
501
   4,     /* size */
502
   24,      /* bitsize */
503
   true,      /* pc_relative */
504
   0,     /* bitpos */
505
   complain_overflow_signed,/* complain_on_overflow */
506
   bfd_elf_generic_reloc, /* special_function */
507
   "R_ARM_JUMP24",  /* name */
508
   false,     /* partial_inplace */
509
   0x00ffffff,    /* src_mask */
510
   0x00ffffff,    /* dst_mask */
511
   true),     /* pcrel_offset */
512
513
  HOWTO (R_ARM_THM_JUMP24,  /* type */
514
   1,     /* rightshift */
515
   4,     /* size */
516
   24,      /* bitsize */
517
   true,      /* pc_relative */
518
   0,     /* bitpos */
519
   complain_overflow_signed,/* complain_on_overflow */
520
   bfd_elf_generic_reloc, /* special_function */
521
   "R_ARM_THM_JUMP24",  /* name */
522
   false,     /* partial_inplace */
523
   0x07ff2fff,    /* src_mask */
524
   0x07ff2fff,    /* dst_mask */
525
   true),     /* pcrel_offset */
526
527
  HOWTO (R_ARM_BASE_ABS,  /* type */
528
   0,     /* rightshift */
529
   4,     /* size */
530
   32,      /* bitsize */
531
   false,     /* pc_relative */
532
   0,     /* bitpos */
533
   complain_overflow_dont,/* complain_on_overflow */
534
   bfd_elf_generic_reloc, /* special_function */
535
   "R_ARM_BASE_ABS",  /* name */
536
   false,     /* partial_inplace */
537
   0xffffffff,    /* src_mask */
538
   0xffffffff,    /* dst_mask */
539
   false),    /* pcrel_offset */
540
541
  HOWTO (R_ARM_ALU_PCREL7_0,  /* type */
542
   0,     /* rightshift */
543
   4,     /* size */
544
   12,      /* bitsize */
545
   true,      /* pc_relative */
546
   0,     /* bitpos */
547
   complain_overflow_dont,/* complain_on_overflow */
548
   bfd_elf_generic_reloc, /* special_function */
549
   "R_ARM_ALU_PCREL_7_0", /* name */
550
   false,     /* partial_inplace */
551
   0x00000fff,    /* src_mask */
552
   0x00000fff,    /* dst_mask */
553
   true),     /* pcrel_offset */
554
555
  HOWTO (R_ARM_ALU_PCREL15_8, /* type */
556
   0,     /* rightshift */
557
   4,     /* size */
558
   12,      /* bitsize */
559
   true,      /* pc_relative */
560
   8,     /* bitpos */
561
   complain_overflow_dont,/* complain_on_overflow */
562
   bfd_elf_generic_reloc, /* special_function */
563
   "R_ARM_ALU_PCREL_15_8",/* name */
564
   false,     /* partial_inplace */
565
   0x00000fff,    /* src_mask */
566
   0x00000fff,    /* dst_mask */
567
   true),     /* pcrel_offset */
568
569
  HOWTO (R_ARM_ALU_PCREL23_15,  /* type */
570
   0,     /* rightshift */
571
   4,     /* size */
572
   12,      /* bitsize */
573
   true,      /* pc_relative */
574
   16,      /* bitpos */
575
   complain_overflow_dont,/* complain_on_overflow */
576
   bfd_elf_generic_reloc, /* special_function */
577
   "R_ARM_ALU_PCREL_23_15",/* name */
578
   false,     /* partial_inplace */
579
   0x00000fff,    /* src_mask */
580
   0x00000fff,    /* dst_mask */
581
   true),     /* pcrel_offset */
582
583
  HOWTO (R_ARM_LDR_SBREL_11_0,  /* type */
584
   0,     /* rightshift */
585
   4,     /* size */
586
   12,      /* bitsize */
587
   false,     /* pc_relative */
588
   0,     /* bitpos */
589
   complain_overflow_dont,/* complain_on_overflow */
590
   bfd_elf_generic_reloc, /* special_function */
591
   "R_ARM_LDR_SBREL_11_0",/* name */
592
   false,     /* partial_inplace */
593
   0x00000fff,    /* src_mask */
594
   0x00000fff,    /* dst_mask */
595
   false),    /* pcrel_offset */
596
597
  HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
598
   0,     /* rightshift */
599
   4,     /* size */
600
   8,     /* bitsize */
601
   false,     /* pc_relative */
602
   12,      /* bitpos */
603
   complain_overflow_dont,/* complain_on_overflow */
604
   bfd_elf_generic_reloc, /* special_function */
605
   "R_ARM_ALU_SBREL_19_12",/* name */
606
   false,     /* partial_inplace */
607
   0x000ff000,    /* src_mask */
608
   0x000ff000,    /* dst_mask */
609
   false),    /* pcrel_offset */
610
611
  HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
612
   0,     /* rightshift */
613
   4,     /* size */
614
   8,     /* bitsize */
615
   false,     /* pc_relative */
616
   20,      /* bitpos */
617
   complain_overflow_dont,/* complain_on_overflow */
618
   bfd_elf_generic_reloc, /* special_function */
619
   "R_ARM_ALU_SBREL_27_20",/* name */
620
   false,     /* partial_inplace */
621
   0x0ff00000,    /* src_mask */
622
   0x0ff00000,    /* dst_mask */
623
   false),    /* pcrel_offset */
624
625
  HOWTO (R_ARM_TARGET1,   /* type */
626
   0,     /* rightshift */
627
   4,     /* size */
628
   32,      /* bitsize */
629
   false,     /* pc_relative */
630
   0,     /* bitpos */
631
   complain_overflow_dont,/* complain_on_overflow */
632
   bfd_elf_generic_reloc, /* special_function */
633
   "R_ARM_TARGET1", /* name */
634
   false,     /* partial_inplace */
635
   0xffffffff,    /* src_mask */
636
   0xffffffff,    /* dst_mask */
637
   false),    /* pcrel_offset */
638
639
  HOWTO (R_ARM_ROSEGREL32,  /* type */
640
   0,     /* rightshift */
641
   4,     /* size */
642
   32,      /* bitsize */
643
   false,     /* pc_relative */
644
   0,     /* bitpos */
645
   complain_overflow_dont,/* complain_on_overflow */
646
   bfd_elf_generic_reloc, /* special_function */
647
   "R_ARM_ROSEGREL32",  /* name */
648
   false,     /* partial_inplace */
649
   0xffffffff,    /* src_mask */
650
   0xffffffff,    /* dst_mask */
651
   false),    /* pcrel_offset */
652
653
  HOWTO (R_ARM_V4BX,    /* type */
654
   0,     /* rightshift */
655
   4,     /* size */
656
   32,      /* bitsize */
657
   false,     /* pc_relative */
658
   0,     /* bitpos */
659
   complain_overflow_dont,/* complain_on_overflow */
660
   bfd_elf_generic_reloc, /* special_function */
661
   "R_ARM_V4BX",    /* name */
662
   false,     /* partial_inplace */
663
   0xffffffff,    /* src_mask */
664
   0xffffffff,    /* dst_mask */
665
   false),    /* pcrel_offset */
666
667
  HOWTO (R_ARM_TARGET2,   /* type */
668
   0,     /* rightshift */
669
   4,     /* size */
670
   32,      /* bitsize */
671
   false,     /* pc_relative */
672
   0,     /* bitpos */
673
   complain_overflow_signed,/* complain_on_overflow */
674
   bfd_elf_generic_reloc, /* special_function */
675
   "R_ARM_TARGET2", /* name */
676
   false,     /* partial_inplace */
677
   0xffffffff,    /* src_mask */
678
   0xffffffff,    /* dst_mask */
679
   true),     /* pcrel_offset */
680
681
  HOWTO (R_ARM_PREL31,    /* type */
682
   0,     /* rightshift */
683
   4,     /* size */
684
   31,      /* bitsize */
685
   true,      /* pc_relative */
686
   0,     /* bitpos */
687
   complain_overflow_signed,/* complain_on_overflow */
688
   bfd_elf_generic_reloc, /* special_function */
689
   "R_ARM_PREL31",  /* name */
690
   false,     /* partial_inplace */
691
   0x7fffffff,    /* src_mask */
692
   0x7fffffff,    /* dst_mask */
693
   true),     /* pcrel_offset */
694
695
  HOWTO (R_ARM_MOVW_ABS_NC, /* type */
696
   0,     /* rightshift */
697
   4,     /* size */
698
   16,      /* bitsize */
699
   false,     /* pc_relative */
700
   0,     /* bitpos */
701
   complain_overflow_dont,/* complain_on_overflow */
702
   bfd_elf_generic_reloc, /* special_function */
703
   "R_ARM_MOVW_ABS_NC", /* name */
704
   false,     /* partial_inplace */
705
   0x000f0fff,    /* src_mask */
706
   0x000f0fff,    /* dst_mask */
707
   false),    /* pcrel_offset */
708
709
  HOWTO (R_ARM_MOVT_ABS,  /* type */
710
   0,     /* rightshift */
711
   4,     /* size */
712
   16,      /* bitsize */
713
   false,     /* pc_relative */
714
   0,     /* bitpos */
715
   complain_overflow_bitfield,/* complain_on_overflow */
716
   bfd_elf_generic_reloc, /* special_function */
717
   "R_ARM_MOVT_ABS",  /* name */
718
   false,     /* partial_inplace */
719
   0x000f0fff,    /* src_mask */
720
   0x000f0fff,    /* dst_mask */
721
   false),    /* pcrel_offset */
722
723
  HOWTO (R_ARM_MOVW_PREL_NC,  /* type */
724
   0,     /* rightshift */
725
   4,     /* size */
726
   16,      /* bitsize */
727
   true,      /* pc_relative */
728
   0,     /* bitpos */
729
   complain_overflow_dont,/* complain_on_overflow */
730
   bfd_elf_generic_reloc, /* special_function */
731
   "R_ARM_MOVW_PREL_NC",  /* name */
732
   false,     /* partial_inplace */
733
   0x000f0fff,    /* src_mask */
734
   0x000f0fff,    /* dst_mask */
735
   true),     /* pcrel_offset */
736
737
  HOWTO (R_ARM_MOVT_PREL, /* type */
738
   0,     /* rightshift */
739
   4,     /* size */
740
   16,      /* bitsize */
741
   true,      /* pc_relative */
742
   0,     /* bitpos */
743
   complain_overflow_bitfield,/* complain_on_overflow */
744
   bfd_elf_generic_reloc, /* special_function */
745
   "R_ARM_MOVT_PREL", /* name */
746
   false,     /* partial_inplace */
747
   0x000f0fff,    /* src_mask */
748
   0x000f0fff,    /* dst_mask */
749
   true),     /* pcrel_offset */
750
751
  HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
752
   0,     /* rightshift */
753
   4,     /* size */
754
   16,      /* bitsize */
755
   false,     /* pc_relative */
756
   0,     /* bitpos */
757
   complain_overflow_dont,/* complain_on_overflow */
758
   bfd_elf_generic_reloc, /* special_function */
759
   "R_ARM_THM_MOVW_ABS_NC",/* name */
760
   false,     /* partial_inplace */
761
   0x040f70ff,    /* src_mask */
762
   0x040f70ff,    /* dst_mask */
763
   false),    /* pcrel_offset */
764
765
  HOWTO (R_ARM_THM_MOVT_ABS,  /* type */
766
   0,     /* rightshift */
767
   4,     /* size */
768
   16,      /* bitsize */
769
   false,     /* pc_relative */
770
   0,     /* bitpos */
771
   complain_overflow_bitfield,/* complain_on_overflow */
772
   bfd_elf_generic_reloc, /* special_function */
773
   "R_ARM_THM_MOVT_ABS",  /* name */
774
   false,     /* partial_inplace */
775
   0x040f70ff,    /* src_mask */
776
   0x040f70ff,    /* dst_mask */
777
   false),    /* pcrel_offset */
778
779
  HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
780
   0,     /* rightshift */
781
   4,     /* size */
782
   16,      /* bitsize */
783
   true,      /* pc_relative */
784
   0,     /* bitpos */
785
   complain_overflow_dont,/* complain_on_overflow */
786
   bfd_elf_generic_reloc, /* special_function */
787
   "R_ARM_THM_MOVW_PREL_NC",/* name */
788
   false,     /* partial_inplace */
789
   0x040f70ff,    /* src_mask */
790
   0x040f70ff,    /* dst_mask */
791
   true),     /* pcrel_offset */
792
793
  HOWTO (R_ARM_THM_MOVT_PREL, /* type */
794
   0,     /* rightshift */
795
   4,     /* size */
796
   16,      /* bitsize */
797
   true,      /* pc_relative */
798
   0,     /* bitpos */
799
   complain_overflow_bitfield,/* complain_on_overflow */
800
   bfd_elf_generic_reloc, /* special_function */
801
   "R_ARM_THM_MOVT_PREL", /* name */
802
   false,     /* partial_inplace */
803
   0x040f70ff,    /* src_mask */
804
   0x040f70ff,    /* dst_mask */
805
   true),     /* pcrel_offset */
806
807
  HOWTO (R_ARM_THM_JUMP19,  /* type */
808
   1,     /* rightshift */
809
   4,     /* size */
810
   19,      /* bitsize */
811
   true,      /* pc_relative */
812
   0,     /* bitpos */
813
   complain_overflow_signed,/* complain_on_overflow */
814
   bfd_elf_generic_reloc, /* special_function */
815
   "R_ARM_THM_JUMP19",  /* name */
816
   false,     /* partial_inplace */
817
   0x043f2fff,    /* src_mask */
818
   0x043f2fff,    /* dst_mask */
819
   true),     /* pcrel_offset */
820
821
  HOWTO (R_ARM_THM_JUMP6, /* type */
822
   1,     /* rightshift */
823
   2,     /* size */
824
   6,     /* bitsize */
825
   true,      /* pc_relative */
826
   0,     /* bitpos */
827
   complain_overflow_unsigned,/* complain_on_overflow */
828
   bfd_elf_generic_reloc, /* special_function */
829
   "R_ARM_THM_JUMP6", /* name */
830
   false,     /* partial_inplace */
831
   0x02f8,    /* src_mask */
832
   0x02f8,    /* dst_mask */
833
   true),     /* pcrel_offset */
834
835
  /* These are declared as 13-bit signed relocations because we can
836
     address -4095 .. 4095(base) by altering ADDW to SUBW or vice
837
     versa.  */
838
  HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
839
   0,     /* rightshift */
840
   4,     /* size */
841
   13,      /* bitsize */
842
   true,      /* pc_relative */
843
   0,     /* bitpos */
844
   complain_overflow_dont,/* complain_on_overflow */
845
   bfd_elf_generic_reloc, /* special_function */
846
   "R_ARM_THM_ALU_PREL_11_0",/* name */
847
   false,     /* partial_inplace */
848
   0xffffffff,    /* src_mask */
849
   0xffffffff,    /* dst_mask */
850
   true),     /* pcrel_offset */
851
852
  HOWTO (R_ARM_THM_PC12,  /* type */
853
   0,     /* rightshift */
854
   4,     /* size */
855
   13,      /* bitsize */
856
   true,      /* pc_relative */
857
   0,     /* bitpos */
858
   complain_overflow_dont,/* complain_on_overflow */
859
   bfd_elf_generic_reloc, /* special_function */
860
   "R_ARM_THM_PC12",  /* name */
861
   false,     /* partial_inplace */
862
   0xffffffff,    /* src_mask */
863
   0xffffffff,    /* dst_mask */
864
   true),     /* pcrel_offset */
865
866
  HOWTO (R_ARM_ABS32_NOI, /* type */
867
   0,     /* rightshift */
868
   4,     /* size */
869
   32,      /* bitsize */
870
   false,     /* pc_relative */
871
   0,     /* bitpos */
872
   complain_overflow_dont,/* complain_on_overflow */
873
   bfd_elf_generic_reloc, /* special_function */
874
   "R_ARM_ABS32_NOI", /* name */
875
   false,     /* partial_inplace */
876
   0xffffffff,    /* src_mask */
877
   0xffffffff,    /* dst_mask */
878
   false),    /* pcrel_offset */
879
880
  HOWTO (R_ARM_REL32_NOI, /* type */
881
   0,     /* rightshift */
882
   4,     /* size */
883
   32,      /* bitsize */
884
   true,      /* pc_relative */
885
   0,     /* bitpos */
886
   complain_overflow_dont,/* complain_on_overflow */
887
   bfd_elf_generic_reloc, /* special_function */
888
   "R_ARM_REL32_NOI", /* name */
889
   false,     /* partial_inplace */
890
   0xffffffff,    /* src_mask */
891
   0xffffffff,    /* dst_mask */
892
   false),    /* pcrel_offset */
893
894
  /* Group relocations.  */
895
896
  HOWTO (R_ARM_ALU_PC_G0_NC,  /* type */
897
   0,     /* rightshift */
898
   4,     /* size */
899
   32,      /* bitsize */
900
   true,      /* pc_relative */
901
   0,     /* bitpos */
902
   complain_overflow_dont,/* complain_on_overflow */
903
   bfd_elf_generic_reloc, /* special_function */
904
   "R_ARM_ALU_PC_G0_NC",  /* name */
905
   false,     /* partial_inplace */
906
   0xffffffff,    /* src_mask */
907
   0xffffffff,    /* dst_mask */
908
   true),     /* pcrel_offset */
909
910
  HOWTO (R_ARM_ALU_PC_G0, /* type */
911
   0,     /* rightshift */
912
   4,     /* size */
913
   32,      /* bitsize */
914
   true,      /* pc_relative */
915
   0,     /* bitpos */
916
   complain_overflow_dont,/* complain_on_overflow */
917
   bfd_elf_generic_reloc, /* special_function */
918
   "R_ARM_ALU_PC_G0", /* name */
919
   false,     /* partial_inplace */
920
   0xffffffff,    /* src_mask */
921
   0xffffffff,    /* dst_mask */
922
   true),     /* pcrel_offset */
923
924
  HOWTO (R_ARM_ALU_PC_G1_NC,  /* type */
925
   0,     /* rightshift */
926
   4,     /* size */
927
   32,      /* bitsize */
928
   true,      /* pc_relative */
929
   0,     /* bitpos */
930
   complain_overflow_dont,/* complain_on_overflow */
931
   bfd_elf_generic_reloc, /* special_function */
932
   "R_ARM_ALU_PC_G1_NC",  /* name */
933
   false,     /* partial_inplace */
934
   0xffffffff,    /* src_mask */
935
   0xffffffff,    /* dst_mask */
936
   true),     /* pcrel_offset */
937
938
  HOWTO (R_ARM_ALU_PC_G1, /* type */
939
   0,     /* rightshift */
940
   4,     /* size */
941
   32,      /* bitsize */
942
   true,      /* pc_relative */
943
   0,     /* bitpos */
944
   complain_overflow_dont,/* complain_on_overflow */
945
   bfd_elf_generic_reloc, /* special_function */
946
   "R_ARM_ALU_PC_G1", /* name */
947
   false,     /* partial_inplace */
948
   0xffffffff,    /* src_mask */
949
   0xffffffff,    /* dst_mask */
950
   true),     /* pcrel_offset */
951
952
  HOWTO (R_ARM_ALU_PC_G2, /* type */
953
   0,     /* rightshift */
954
   4,     /* size */
955
   32,      /* bitsize */
956
   true,      /* pc_relative */
957
   0,     /* bitpos */
958
   complain_overflow_dont,/* complain_on_overflow */
959
   bfd_elf_generic_reloc, /* special_function */
960
   "R_ARM_ALU_PC_G2", /* name */
961
   false,     /* partial_inplace */
962
   0xffffffff,    /* src_mask */
963
   0xffffffff,    /* dst_mask */
964
   true),     /* pcrel_offset */
965
966
  HOWTO (R_ARM_LDR_PC_G1, /* type */
967
   0,     /* rightshift */
968
   4,     /* size */
969
   32,      /* bitsize */
970
   true,      /* pc_relative */
971
   0,     /* bitpos */
972
   complain_overflow_dont,/* complain_on_overflow */
973
   bfd_elf_generic_reloc, /* special_function */
974
   "R_ARM_LDR_PC_G1", /* name */
975
   false,     /* partial_inplace */
976
   0xffffffff,    /* src_mask */
977
   0xffffffff,    /* dst_mask */
978
   true),     /* pcrel_offset */
979
980
  HOWTO (R_ARM_LDR_PC_G2, /* type */
981
   0,     /* rightshift */
982
   4,     /* size */
983
   32,      /* bitsize */
984
   true,      /* pc_relative */
985
   0,     /* bitpos */
986
   complain_overflow_dont,/* complain_on_overflow */
987
   bfd_elf_generic_reloc, /* special_function */
988
   "R_ARM_LDR_PC_G2", /* name */
989
   false,     /* partial_inplace */
990
   0xffffffff,    /* src_mask */
991
   0xffffffff,    /* dst_mask */
992
   true),     /* pcrel_offset */
993
994
  HOWTO (R_ARM_LDRS_PC_G0,  /* type */
995
   0,     /* rightshift */
996
   4,     /* size */
997
   32,      /* bitsize */
998
   true,      /* pc_relative */
999
   0,     /* bitpos */
1000
   complain_overflow_dont,/* complain_on_overflow */
1001
   bfd_elf_generic_reloc, /* special_function */
1002
   "R_ARM_LDRS_PC_G0",  /* name */
1003
   false,     /* partial_inplace */
1004
   0xffffffff,    /* src_mask */
1005
   0xffffffff,    /* dst_mask */
1006
   true),     /* pcrel_offset */
1007
1008
  HOWTO (R_ARM_LDRS_PC_G1,  /* type */
1009
   0,     /* rightshift */
1010
   4,     /* size */
1011
   32,      /* bitsize */
1012
   true,      /* pc_relative */
1013
   0,     /* bitpos */
1014
   complain_overflow_dont,/* complain_on_overflow */
1015
   bfd_elf_generic_reloc, /* special_function */
1016
   "R_ARM_LDRS_PC_G1",  /* name */
1017
   false,     /* partial_inplace */
1018
   0xffffffff,    /* src_mask */
1019
   0xffffffff,    /* dst_mask */
1020
   true),     /* pcrel_offset */
1021
1022
  HOWTO (R_ARM_LDRS_PC_G2,  /* type */
1023
   0,     /* rightshift */
1024
   4,     /* size */
1025
   32,      /* bitsize */
1026
   true,      /* pc_relative */
1027
   0,     /* bitpos */
1028
   complain_overflow_dont,/* complain_on_overflow */
1029
   bfd_elf_generic_reloc, /* special_function */
1030
   "R_ARM_LDRS_PC_G2",  /* name */
1031
   false,     /* partial_inplace */
1032
   0xffffffff,    /* src_mask */
1033
   0xffffffff,    /* dst_mask */
1034
   true),     /* pcrel_offset */
1035
1036
  HOWTO (R_ARM_LDC_PC_G0, /* type */
1037
   0,     /* rightshift */
1038
   4,     /* size */
1039
   32,      /* bitsize */
1040
   true,      /* pc_relative */
1041
   0,     /* bitpos */
1042
   complain_overflow_dont,/* complain_on_overflow */
1043
   bfd_elf_generic_reloc, /* special_function */
1044
   "R_ARM_LDC_PC_G0", /* name */
1045
   false,     /* partial_inplace */
1046
   0xffffffff,    /* src_mask */
1047
   0xffffffff,    /* dst_mask */
1048
   true),     /* pcrel_offset */
1049
1050
  HOWTO (R_ARM_LDC_PC_G1, /* type */
1051
   0,     /* rightshift */
1052
   4,     /* size */
1053
   32,      /* bitsize */
1054
   true,      /* pc_relative */
1055
   0,     /* bitpos */
1056
   complain_overflow_dont,/* complain_on_overflow */
1057
   bfd_elf_generic_reloc, /* special_function */
1058
   "R_ARM_LDC_PC_G1", /* name */
1059
   false,     /* partial_inplace */
1060
   0xffffffff,    /* src_mask */
1061
   0xffffffff,    /* dst_mask */
1062
   true),     /* pcrel_offset */
1063
1064
  HOWTO (R_ARM_LDC_PC_G2, /* type */
1065
   0,     /* rightshift */
1066
   4,     /* size */
1067
   32,      /* bitsize */
1068
   true,      /* pc_relative */
1069
   0,     /* bitpos */
1070
   complain_overflow_dont,/* complain_on_overflow */
1071
   bfd_elf_generic_reloc, /* special_function */
1072
   "R_ARM_LDC_PC_G2", /* name */
1073
   false,     /* partial_inplace */
1074
   0xffffffff,    /* src_mask */
1075
   0xffffffff,    /* dst_mask */
1076
   true),     /* pcrel_offset */
1077
1078
  HOWTO (R_ARM_ALU_SB_G0_NC,  /* type */
1079
   0,     /* rightshift */
1080
   4,     /* size */
1081
   32,      /* bitsize */
1082
   true,      /* pc_relative */
1083
   0,     /* bitpos */
1084
   complain_overflow_dont,/* complain_on_overflow */
1085
   bfd_elf_generic_reloc, /* special_function */
1086
   "R_ARM_ALU_SB_G0_NC",  /* name */
1087
   false,     /* partial_inplace */
1088
   0xffffffff,    /* src_mask */
1089
   0xffffffff,    /* dst_mask */
1090
   true),     /* pcrel_offset */
1091
1092
  HOWTO (R_ARM_ALU_SB_G0, /* type */
1093
   0,     /* rightshift */
1094
   4,     /* size */
1095
   32,      /* bitsize */
1096
   true,      /* pc_relative */
1097
   0,     /* bitpos */
1098
   complain_overflow_dont,/* complain_on_overflow */
1099
   bfd_elf_generic_reloc, /* special_function */
1100
   "R_ARM_ALU_SB_G0", /* name */
1101
   false,     /* partial_inplace */
1102
   0xffffffff,    /* src_mask */
1103
   0xffffffff,    /* dst_mask */
1104
   true),     /* pcrel_offset */
1105
1106
  HOWTO (R_ARM_ALU_SB_G1_NC,  /* type */
1107
   0,     /* rightshift */
1108
   4,     /* size */
1109
   32,      /* bitsize */
1110
   true,      /* pc_relative */
1111
   0,     /* bitpos */
1112
   complain_overflow_dont,/* complain_on_overflow */
1113
   bfd_elf_generic_reloc, /* special_function */
1114
   "R_ARM_ALU_SB_G1_NC",  /* name */
1115
   false,     /* partial_inplace */
1116
   0xffffffff,    /* src_mask */
1117
   0xffffffff,    /* dst_mask */
1118
   true),     /* pcrel_offset */
1119
1120
  HOWTO (R_ARM_ALU_SB_G1, /* type */
1121
   0,     /* rightshift */
1122
   4,     /* size */
1123
   32,      /* bitsize */
1124
   true,      /* pc_relative */
1125
   0,     /* bitpos */
1126
   complain_overflow_dont,/* complain_on_overflow */
1127
   bfd_elf_generic_reloc, /* special_function */
1128
   "R_ARM_ALU_SB_G1", /* name */
1129
   false,     /* partial_inplace */
1130
   0xffffffff,    /* src_mask */
1131
   0xffffffff,    /* dst_mask */
1132
   true),     /* pcrel_offset */
1133
1134
  HOWTO (R_ARM_ALU_SB_G2, /* type */
1135
   0,     /* rightshift */
1136
   4,     /* size */
1137
   32,      /* bitsize */
1138
   true,      /* pc_relative */
1139
   0,     /* bitpos */
1140
   complain_overflow_dont,/* complain_on_overflow */
1141
   bfd_elf_generic_reloc, /* special_function */
1142
   "R_ARM_ALU_SB_G2", /* name */
1143
   false,     /* partial_inplace */
1144
   0xffffffff,    /* src_mask */
1145
   0xffffffff,    /* dst_mask */
1146
   true),     /* pcrel_offset */
1147
1148
  HOWTO (R_ARM_LDR_SB_G0, /* type */
1149
   0,     /* rightshift */
1150
   4,     /* size */
1151
   32,      /* bitsize */
1152
   true,      /* pc_relative */
1153
   0,     /* bitpos */
1154
   complain_overflow_dont,/* complain_on_overflow */
1155
   bfd_elf_generic_reloc, /* special_function */
1156
   "R_ARM_LDR_SB_G0", /* name */
1157
   false,     /* partial_inplace */
1158
   0xffffffff,    /* src_mask */
1159
   0xffffffff,    /* dst_mask */
1160
   true),     /* pcrel_offset */
1161
1162
  HOWTO (R_ARM_LDR_SB_G1, /* type */
1163
   0,     /* rightshift */
1164
   4,     /* size */
1165
   32,      /* bitsize */
1166
   true,      /* pc_relative */
1167
   0,     /* bitpos */
1168
   complain_overflow_dont,/* complain_on_overflow */
1169
   bfd_elf_generic_reloc, /* special_function */
1170
   "R_ARM_LDR_SB_G1", /* name */
1171
   false,     /* partial_inplace */
1172
   0xffffffff,    /* src_mask */
1173
   0xffffffff,    /* dst_mask */
1174
   true),     /* pcrel_offset */
1175
1176
  HOWTO (R_ARM_LDR_SB_G2, /* type */
1177
   0,     /* rightshift */
1178
   4,     /* size */
1179
   32,      /* bitsize */
1180
   true,      /* pc_relative */
1181
   0,     /* bitpos */
1182
   complain_overflow_dont,/* complain_on_overflow */
1183
   bfd_elf_generic_reloc, /* special_function */
1184
   "R_ARM_LDR_SB_G2", /* name */
1185
   false,     /* partial_inplace */
1186
   0xffffffff,    /* src_mask */
1187
   0xffffffff,    /* dst_mask */
1188
   true),     /* pcrel_offset */
1189
1190
  HOWTO (R_ARM_LDRS_SB_G0,  /* type */
1191
   0,     /* rightshift */
1192
   4,     /* size */
1193
   32,      /* bitsize */
1194
   true,      /* pc_relative */
1195
   0,     /* bitpos */
1196
   complain_overflow_dont,/* complain_on_overflow */
1197
   bfd_elf_generic_reloc, /* special_function */
1198
   "R_ARM_LDRS_SB_G0",  /* name */
1199
   false,     /* partial_inplace */
1200
   0xffffffff,    /* src_mask */
1201
   0xffffffff,    /* dst_mask */
1202
   true),     /* pcrel_offset */
1203
1204
  HOWTO (R_ARM_LDRS_SB_G1,  /* type */
1205
   0,     /* rightshift */
1206
   4,     /* size */
1207
   32,      /* bitsize */
1208
   true,      /* pc_relative */
1209
   0,     /* bitpos */
1210
   complain_overflow_dont,/* complain_on_overflow */
1211
   bfd_elf_generic_reloc, /* special_function */
1212
   "R_ARM_LDRS_SB_G1",  /* name */
1213
   false,     /* partial_inplace */
1214
   0xffffffff,    /* src_mask */
1215
   0xffffffff,    /* dst_mask */
1216
   true),     /* pcrel_offset */
1217
1218
  HOWTO (R_ARM_LDRS_SB_G2,  /* type */
1219
   0,     /* rightshift */
1220
   4,     /* size */
1221
   32,      /* bitsize */
1222
   true,      /* pc_relative */
1223
   0,     /* bitpos */
1224
   complain_overflow_dont,/* complain_on_overflow */
1225
   bfd_elf_generic_reloc, /* special_function */
1226
   "R_ARM_LDRS_SB_G2",  /* name */
1227
   false,     /* partial_inplace */
1228
   0xffffffff,    /* src_mask */
1229
   0xffffffff,    /* dst_mask */
1230
   true),     /* pcrel_offset */
1231
1232
  HOWTO (R_ARM_LDC_SB_G0, /* type */
1233
   0,     /* rightshift */
1234
   4,     /* size */
1235
   32,      /* bitsize */
1236
   true,      /* pc_relative */
1237
   0,     /* bitpos */
1238
   complain_overflow_dont,/* complain_on_overflow */
1239
   bfd_elf_generic_reloc, /* special_function */
1240
   "R_ARM_LDC_SB_G0", /* name */
1241
   false,     /* partial_inplace */
1242
   0xffffffff,    /* src_mask */
1243
   0xffffffff,    /* dst_mask */
1244
   true),     /* pcrel_offset */
1245
1246
  HOWTO (R_ARM_LDC_SB_G1, /* type */
1247
   0,     /* rightshift */
1248
   4,     /* size */
1249
   32,      /* bitsize */
1250
   true,      /* pc_relative */
1251
   0,     /* bitpos */
1252
   complain_overflow_dont,/* complain_on_overflow */
1253
   bfd_elf_generic_reloc, /* special_function */
1254
   "R_ARM_LDC_SB_G1", /* name */
1255
   false,     /* partial_inplace */
1256
   0xffffffff,    /* src_mask */
1257
   0xffffffff,    /* dst_mask */
1258
   true),     /* pcrel_offset */
1259
1260
  HOWTO (R_ARM_LDC_SB_G2, /* type */
1261
   0,     /* rightshift */
1262
   4,     /* size */
1263
   32,      /* bitsize */
1264
   true,      /* pc_relative */
1265
   0,     /* bitpos */
1266
   complain_overflow_dont,/* complain_on_overflow */
1267
   bfd_elf_generic_reloc, /* special_function */
1268
   "R_ARM_LDC_SB_G2", /* name */
1269
   false,     /* partial_inplace */
1270
   0xffffffff,    /* src_mask */
1271
   0xffffffff,    /* dst_mask */
1272
   true),     /* pcrel_offset */
1273
1274
  /* End of group relocations.  */
1275
1276
  HOWTO (R_ARM_MOVW_BREL_NC,  /* type */
1277
   0,     /* rightshift */
1278
   4,     /* size */
1279
   16,      /* bitsize */
1280
   false,     /* pc_relative */
1281
   0,     /* bitpos */
1282
   complain_overflow_dont,/* complain_on_overflow */
1283
   bfd_elf_generic_reloc, /* special_function */
1284
   "R_ARM_MOVW_BREL_NC",  /* name */
1285
   false,     /* partial_inplace */
1286
   0x0000ffff,    /* src_mask */
1287
   0x0000ffff,    /* dst_mask */
1288
   false),    /* pcrel_offset */
1289
1290
  HOWTO (R_ARM_MOVT_BREL, /* type */
1291
   0,     /* rightshift */
1292
   4,     /* size */
1293
   16,      /* bitsize */
1294
   false,     /* pc_relative */
1295
   0,     /* bitpos */
1296
   complain_overflow_bitfield,/* complain_on_overflow */
1297
   bfd_elf_generic_reloc, /* special_function */
1298
   "R_ARM_MOVT_BREL", /* name */
1299
   false,     /* partial_inplace */
1300
   0x0000ffff,    /* src_mask */
1301
   0x0000ffff,    /* dst_mask */
1302
   false),    /* pcrel_offset */
1303
1304
  HOWTO (R_ARM_MOVW_BREL, /* type */
1305
   0,     /* rightshift */
1306
   4,     /* size */
1307
   16,      /* bitsize */
1308
   false,     /* pc_relative */
1309
   0,     /* bitpos */
1310
   complain_overflow_dont,/* complain_on_overflow */
1311
   bfd_elf_generic_reloc, /* special_function */
1312
   "R_ARM_MOVW_BREL", /* name */
1313
   false,     /* partial_inplace */
1314
   0x0000ffff,    /* src_mask */
1315
   0x0000ffff,    /* dst_mask */
1316
   false),    /* pcrel_offset */
1317
1318
  HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
1319
   0,     /* rightshift */
1320
   4,     /* size */
1321
   16,      /* bitsize */
1322
   false,     /* pc_relative */
1323
   0,     /* bitpos */
1324
   complain_overflow_dont,/* complain_on_overflow */
1325
   bfd_elf_generic_reloc, /* special_function */
1326
   "R_ARM_THM_MOVW_BREL_NC",/* name */
1327
   false,     /* partial_inplace */
1328
   0x040f70ff,    /* src_mask */
1329
   0x040f70ff,    /* dst_mask */
1330
   false),    /* pcrel_offset */
1331
1332
  HOWTO (R_ARM_THM_MOVT_BREL, /* type */
1333
   0,     /* rightshift */
1334
   4,     /* size */
1335
   16,      /* bitsize */
1336
   false,     /* pc_relative */
1337
   0,     /* bitpos */
1338
   complain_overflow_bitfield,/* complain_on_overflow */
1339
   bfd_elf_generic_reloc, /* special_function */
1340
   "R_ARM_THM_MOVT_BREL", /* name */
1341
   false,     /* partial_inplace */
1342
   0x040f70ff,    /* src_mask */
1343
   0x040f70ff,    /* dst_mask */
1344
   false),    /* pcrel_offset */
1345
1346
  HOWTO (R_ARM_THM_MOVW_BREL, /* type */
1347
   0,     /* rightshift */
1348
   4,     /* size */
1349
   16,      /* bitsize */
1350
   false,     /* pc_relative */
1351
   0,     /* bitpos */
1352
   complain_overflow_dont,/* complain_on_overflow */
1353
   bfd_elf_generic_reloc, /* special_function */
1354
   "R_ARM_THM_MOVW_BREL", /* name */
1355
   false,     /* partial_inplace */
1356
   0x040f70ff,    /* src_mask */
1357
   0x040f70ff,    /* dst_mask */
1358
   false),    /* pcrel_offset */
1359
1360
  HOWTO (R_ARM_TLS_GOTDESC, /* type */
1361
   0,     /* rightshift */
1362
   4,     /* size */
1363
   32,      /* bitsize */
1364
   false,     /* pc_relative */
1365
   0,     /* bitpos */
1366
   complain_overflow_bitfield,/* complain_on_overflow */
1367
   NULL,      /* special_function */
1368
   "R_ARM_TLS_GOTDESC", /* name */
1369
   true,      /* partial_inplace */
1370
   0xffffffff,    /* src_mask */
1371
   0xffffffff,    /* dst_mask */
1372
   false),    /* pcrel_offset */
1373
1374
  HOWTO (R_ARM_TLS_CALL,  /* type */
1375
   0,     /* rightshift */
1376
   4,     /* size */
1377
   24,      /* bitsize */
1378
   false,     /* pc_relative */
1379
   0,     /* bitpos */
1380
   complain_overflow_dont,/* complain_on_overflow */
1381
   bfd_elf_generic_reloc, /* special_function */
1382
   "R_ARM_TLS_CALL",  /* name */
1383
   false,     /* partial_inplace */
1384
   0x00ffffff,    /* src_mask */
1385
   0x00ffffff,    /* dst_mask */
1386
   false),    /* pcrel_offset */
1387
1388
  HOWTO (R_ARM_TLS_DESCSEQ, /* type */
1389
   0,     /* rightshift */
1390
   4,     /* size */
1391
   0,     /* bitsize */
1392
   false,     /* pc_relative */
1393
   0,     /* bitpos */
1394
   complain_overflow_dont,/* complain_on_overflow */
1395
   bfd_elf_generic_reloc, /* special_function */
1396
   "R_ARM_TLS_DESCSEQ", /* name */
1397
   false,     /* partial_inplace */
1398
   0x00000000,    /* src_mask */
1399
   0x00000000,    /* dst_mask */
1400
   false),    /* pcrel_offset */
1401
1402
  HOWTO (R_ARM_THM_TLS_CALL,  /* type */
1403
   0,     /* rightshift */
1404
   4,     /* size */
1405
   24,      /* bitsize */
1406
   false,     /* pc_relative */
1407
   0,     /* bitpos */
1408
   complain_overflow_dont,/* complain_on_overflow */
1409
   bfd_elf_generic_reloc, /* special_function */
1410
   "R_ARM_THM_TLS_CALL",  /* name */
1411
   false,     /* partial_inplace */
1412
   0x07ff07ff,    /* src_mask */
1413
   0x07ff07ff,    /* dst_mask */
1414
   false),    /* pcrel_offset */
1415
1416
  HOWTO (R_ARM_PLT32_ABS, /* type */
1417
   0,     /* rightshift */
1418
   4,     /* size */
1419
   32,      /* bitsize */
1420
   false,     /* pc_relative */
1421
   0,     /* bitpos */
1422
   complain_overflow_dont,/* complain_on_overflow */
1423
   bfd_elf_generic_reloc, /* special_function */
1424
   "R_ARM_PLT32_ABS", /* name */
1425
   false,     /* partial_inplace */
1426
   0xffffffff,    /* src_mask */
1427
   0xffffffff,    /* dst_mask */
1428
   false),    /* pcrel_offset */
1429
1430
  HOWTO (R_ARM_GOT_ABS,   /* type */
1431
   0,     /* rightshift */
1432
   4,     /* size */
1433
   32,      /* bitsize */
1434
   false,     /* pc_relative */
1435
   0,     /* bitpos */
1436
   complain_overflow_dont,/* complain_on_overflow */
1437
   bfd_elf_generic_reloc, /* special_function */
1438
   "R_ARM_GOT_ABS", /* name */
1439
   false,     /* partial_inplace */
1440
   0xffffffff,    /* src_mask */
1441
   0xffffffff,    /* dst_mask */
1442
   false),      /* pcrel_offset */
1443
1444
  HOWTO (R_ARM_GOT_PREL,  /* type */
1445
   0,     /* rightshift */
1446
   4,     /* size */
1447
   32,      /* bitsize */
1448
   true,      /* pc_relative */
1449
   0,     /* bitpos */
1450
   complain_overflow_dont,  /* complain_on_overflow */
1451
   bfd_elf_generic_reloc, /* special_function */
1452
   "R_ARM_GOT_PREL",  /* name */
1453
   false,     /* partial_inplace */
1454
   0xffffffff,    /* src_mask */
1455
   0xffffffff,    /* dst_mask */
1456
   true),     /* pcrel_offset */
1457
1458
  HOWTO (R_ARM_GOT_BREL12,  /* type */
1459
   0,     /* rightshift */
1460
   4,     /* size */
1461
   12,      /* bitsize */
1462
   false,     /* pc_relative */
1463
   0,     /* bitpos */
1464
   complain_overflow_bitfield,/* complain_on_overflow */
1465
   bfd_elf_generic_reloc, /* special_function */
1466
   "R_ARM_GOT_BREL12",  /* name */
1467
   false,     /* partial_inplace */
1468
   0x00000fff,    /* src_mask */
1469
   0x00000fff,    /* dst_mask */
1470
   false),    /* pcrel_offset */
1471
1472
  HOWTO (R_ARM_GOTOFF12,  /* type */
1473
   0,     /* rightshift */
1474
   4,     /* size */
1475
   12,      /* bitsize */
1476
   false,     /* pc_relative */
1477
   0,     /* bitpos */
1478
   complain_overflow_bitfield,/* complain_on_overflow */
1479
   bfd_elf_generic_reloc, /* special_function */
1480
   "R_ARM_GOTOFF12",  /* name */
1481
   false,     /* partial_inplace */
1482
   0x00000fff,    /* src_mask */
1483
   0x00000fff,    /* dst_mask */
1484
   false),    /* pcrel_offset */
1485
1486
  EMPTY_HOWTO (R_ARM_GOTRELAX),  /* reserved for future GOT-load optimizations */
1487
1488
  /* GNU extension to record C++ vtable member usage */
1489
  HOWTO (R_ARM_GNU_VTENTRY, /* type */
1490
   0,     /* rightshift */
1491
   4,     /* size */
1492
   0,     /* bitsize */
1493
   false,     /* pc_relative */
1494
   0,     /* bitpos */
1495
   complain_overflow_dont, /* complain_on_overflow */
1496
   _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
1497
   "R_ARM_GNU_VTENTRY", /* name */
1498
   false,     /* partial_inplace */
1499
   0,     /* src_mask */
1500
   0,     /* dst_mask */
1501
   false),    /* pcrel_offset */
1502
1503
  /* GNU extension to record C++ vtable hierarchy */
1504
  HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1505
   0,     /* rightshift */
1506
   4,     /* size */
1507
   0,     /* bitsize */
1508
   false,     /* pc_relative */
1509
   0,     /* bitpos */
1510
   complain_overflow_dont, /* complain_on_overflow */
1511
   NULL,      /* special_function */
1512
   "R_ARM_GNU_VTINHERIT", /* name */
1513
   false,     /* partial_inplace */
1514
   0,     /* src_mask */
1515
   0,     /* dst_mask */
1516
   false),    /* pcrel_offset */
1517
1518
  HOWTO (R_ARM_THM_JUMP11,  /* type */
1519
   1,     /* rightshift */
1520
   2,     /* size */
1521
   11,      /* bitsize */
1522
   true,      /* pc_relative */
1523
   0,     /* bitpos */
1524
   complain_overflow_signed,  /* complain_on_overflow */
1525
   bfd_elf_generic_reloc, /* special_function */
1526
   "R_ARM_THM_JUMP11",  /* name */
1527
   false,     /* partial_inplace */
1528
   0x000007ff,    /* src_mask */
1529
   0x000007ff,    /* dst_mask */
1530
   true),     /* pcrel_offset */
1531
1532
  HOWTO (R_ARM_THM_JUMP8, /* type */
1533
   1,     /* rightshift */
1534
   2,     /* size */
1535
   8,     /* bitsize */
1536
   true,      /* pc_relative */
1537
   0,     /* bitpos */
1538
   complain_overflow_signed,  /* complain_on_overflow */
1539
   bfd_elf_generic_reloc, /* special_function */
1540
   "R_ARM_THM_JUMP8", /* name */
1541
   false,     /* partial_inplace */
1542
   0x000000ff,    /* src_mask */
1543
   0x000000ff,    /* dst_mask */
1544
   true),     /* pcrel_offset */
1545
1546
  /* TLS relocations */
1547
  HOWTO (R_ARM_TLS_GD32,  /* type */
1548
   0,     /* rightshift */
1549
   4,     /* size */
1550
   32,      /* bitsize */
1551
   false,     /* pc_relative */
1552
   0,     /* bitpos */
1553
   complain_overflow_bitfield,/* complain_on_overflow */
1554
   NULL,      /* special_function */
1555
   "R_ARM_TLS_GD32",  /* name */
1556
   true,      /* partial_inplace */
1557
   0xffffffff,    /* src_mask */
1558
   0xffffffff,    /* dst_mask */
1559
   false),    /* pcrel_offset */
1560
1561
  HOWTO (R_ARM_TLS_LDM32, /* type */
1562
   0,     /* rightshift */
1563
   4,     /* size */
1564
   32,      /* bitsize */
1565
   false,     /* pc_relative */
1566
   0,     /* bitpos */
1567
   complain_overflow_bitfield,/* complain_on_overflow */
1568
   bfd_elf_generic_reloc, /* special_function */
1569
   "R_ARM_TLS_LDM32", /* name */
1570
   true,      /* partial_inplace */
1571
   0xffffffff,    /* src_mask */
1572
   0xffffffff,    /* dst_mask */
1573
   false),    /* pcrel_offset */
1574
1575
  HOWTO (R_ARM_TLS_LDO32, /* type */
1576
   0,     /* rightshift */
1577
   4,     /* size */
1578
   32,      /* bitsize */
1579
   false,     /* pc_relative */
1580
   0,     /* bitpos */
1581
   complain_overflow_bitfield,/* complain_on_overflow */
1582
   bfd_elf_generic_reloc, /* special_function */
1583
   "R_ARM_TLS_LDO32", /* name */
1584
   true,      /* partial_inplace */
1585
   0xffffffff,    /* src_mask */
1586
   0xffffffff,    /* dst_mask */
1587
   false),    /* pcrel_offset */
1588
1589
  HOWTO (R_ARM_TLS_IE32,  /* type */
1590
   0,     /* rightshift */
1591
   4,     /* size */
1592
   32,      /* bitsize */
1593
   false,      /* pc_relative */
1594
   0,     /* bitpos */
1595
   complain_overflow_bitfield,/* complain_on_overflow */
1596
   NULL,      /* special_function */
1597
   "R_ARM_TLS_IE32",  /* name */
1598
   true,      /* partial_inplace */
1599
   0xffffffff,    /* src_mask */
1600
   0xffffffff,    /* dst_mask */
1601
   false),    /* pcrel_offset */
1602
1603
  HOWTO (R_ARM_TLS_LE32,  /* type */
1604
   0,     /* rightshift */
1605
   4,     /* size */
1606
   32,      /* bitsize */
1607
   false,     /* pc_relative */
1608
   0,     /* bitpos */
1609
   complain_overflow_bitfield,/* complain_on_overflow */
1610
   NULL,      /* special_function */
1611
   "R_ARM_TLS_LE32",  /* name */
1612
   true,      /* partial_inplace */
1613
   0xffffffff,    /* src_mask */
1614
   0xffffffff,    /* dst_mask */
1615
   false),    /* pcrel_offset */
1616
1617
  HOWTO (R_ARM_TLS_LDO12, /* type */
1618
   0,     /* rightshift */
1619
   4,     /* size */
1620
   12,      /* bitsize */
1621
   false,     /* pc_relative */
1622
   0,     /* bitpos */
1623
   complain_overflow_bitfield,/* complain_on_overflow */
1624
   bfd_elf_generic_reloc, /* special_function */
1625
   "R_ARM_TLS_LDO12", /* name */
1626
   false,     /* partial_inplace */
1627
   0x00000fff,    /* src_mask */
1628
   0x00000fff,    /* dst_mask */
1629
   false),    /* pcrel_offset */
1630
1631
  HOWTO (R_ARM_TLS_LE12,  /* type */
1632
   0,     /* rightshift */
1633
   4,     /* size */
1634
   12,      /* bitsize */
1635
   false,     /* pc_relative */
1636
   0,     /* bitpos */
1637
   complain_overflow_bitfield,/* complain_on_overflow */
1638
   bfd_elf_generic_reloc, /* special_function */
1639
   "R_ARM_TLS_LE12",  /* name */
1640
   false,     /* partial_inplace */
1641
   0x00000fff,    /* src_mask */
1642
   0x00000fff,    /* dst_mask */
1643
   false),    /* pcrel_offset */
1644
1645
  HOWTO (R_ARM_TLS_IE12GP,  /* type */
1646
   0,     /* rightshift */
1647
   4,     /* size */
1648
   12,      /* bitsize */
1649
   false,     /* pc_relative */
1650
   0,     /* bitpos */
1651
   complain_overflow_bitfield,/* complain_on_overflow */
1652
   bfd_elf_generic_reloc, /* special_function */
1653
   "R_ARM_TLS_IE12GP",  /* name */
1654
   false,     /* partial_inplace */
1655
   0x00000fff,    /* src_mask */
1656
   0x00000fff,    /* dst_mask */
1657
   false),    /* pcrel_offset */
1658
1659
  /* 112-127 private relocations.  */
1660
  EMPTY_HOWTO (112),
1661
  EMPTY_HOWTO (113),
1662
  EMPTY_HOWTO (114),
1663
  EMPTY_HOWTO (115),
1664
  EMPTY_HOWTO (116),
1665
  EMPTY_HOWTO (117),
1666
  EMPTY_HOWTO (118),
1667
  EMPTY_HOWTO (119),
1668
  EMPTY_HOWTO (120),
1669
  EMPTY_HOWTO (121),
1670
  EMPTY_HOWTO (122),
1671
  EMPTY_HOWTO (123),
1672
  EMPTY_HOWTO (124),
1673
  EMPTY_HOWTO (125),
1674
  EMPTY_HOWTO (126),
1675
  EMPTY_HOWTO (127),
1676
1677
  /* R_ARM_ME_TOO, obsolete.  */
1678
  EMPTY_HOWTO (128),
1679
1680
  HOWTO (R_ARM_THM_TLS_DESCSEQ, /* type */
1681
   0,     /* rightshift */
1682
   2,     /* size */
1683
   0,     /* bitsize */
1684
   false,     /* pc_relative */
1685
   0,     /* bitpos */
1686
   complain_overflow_dont,/* complain_on_overflow */
1687
   bfd_elf_generic_reloc, /* special_function */
1688
   "R_ARM_THM_TLS_DESCSEQ",/* name */
1689
   false,     /* partial_inplace */
1690
   0x00000000,    /* src_mask */
1691
   0x00000000,    /* dst_mask */
1692
   false),    /* pcrel_offset */
1693
  EMPTY_HOWTO (130),
1694
  EMPTY_HOWTO (131),
1695
  HOWTO (R_ARM_THM_ALU_ABS_G0_NC,/* type.  */
1696
   0,     /* rightshift.  */
1697
   2,     /* size.  */
1698
   16,      /* bitsize.  */
1699
   false,     /* pc_relative.  */
1700
   0,     /* bitpos.  */
1701
   complain_overflow_bitfield,/* complain_on_overflow.  */
1702
   bfd_elf_generic_reloc, /* special_function.  */
1703
   "R_ARM_THM_ALU_ABS_G0_NC",/* name.  */
1704
   false,     /* partial_inplace.  */
1705
   0x00000000,    /* src_mask.  */
1706
   0x00000000,    /* dst_mask.  */
1707
   false),    /* pcrel_offset.  */
1708
  HOWTO (R_ARM_THM_ALU_ABS_G1_NC,/* type.  */
1709
   0,     /* rightshift.  */
1710
   2,     /* size.  */
1711
   16,      /* bitsize.  */
1712
   false,     /* pc_relative.  */
1713
   0,     /* bitpos.  */
1714
   complain_overflow_bitfield,/* complain_on_overflow.  */
1715
   bfd_elf_generic_reloc, /* special_function.  */
1716
   "R_ARM_THM_ALU_ABS_G1_NC",/* name.  */
1717
   false,     /* partial_inplace.  */
1718
   0x00000000,    /* src_mask.  */
1719
   0x00000000,    /* dst_mask.  */
1720
   false),    /* pcrel_offset.  */
1721
  HOWTO (R_ARM_THM_ALU_ABS_G2_NC,/* type.  */
1722
   0,     /* rightshift.  */
1723
   2,     /* size.  */
1724
   16,      /* bitsize.  */
1725
   false,     /* pc_relative.  */
1726
   0,     /* bitpos.  */
1727
   complain_overflow_bitfield,/* complain_on_overflow.  */
1728
   bfd_elf_generic_reloc, /* special_function.  */
1729
   "R_ARM_THM_ALU_ABS_G2_NC",/* name.  */
1730
   false,     /* partial_inplace.  */
1731
   0x00000000,    /* src_mask.  */
1732
   0x00000000,    /* dst_mask.  */
1733
   false),    /* pcrel_offset.  */
1734
  HOWTO (R_ARM_THM_ALU_ABS_G3_NC,/* type.  */
1735
   0,     /* rightshift.  */
1736
   2,     /* size.  */
1737
   16,      /* bitsize.  */
1738
   false,     /* pc_relative.  */
1739
   0,     /* bitpos.  */
1740
   complain_overflow_bitfield,/* complain_on_overflow.  */
1741
   bfd_elf_generic_reloc, /* special_function.  */
1742
   "R_ARM_THM_ALU_ABS_G3_NC",/* name.  */
1743
   false,     /* partial_inplace.  */
1744
   0x00000000,    /* src_mask.  */
1745
   0x00000000,    /* dst_mask.  */
1746
   false),    /* pcrel_offset.  */
1747
  /* Relocations for Armv8.1-M Mainline.  */
1748
  HOWTO (R_ARM_THM_BF16,  /* type.  */
1749
   0,     /* rightshift.  */
1750
   2,     /* size.  */
1751
   16,      /* bitsize.  */
1752
   true,      /* pc_relative.  */
1753
   0,     /* bitpos.  */
1754
   complain_overflow_dont,/* do not complain_on_overflow.  */
1755
   bfd_elf_generic_reloc, /* special_function.  */
1756
   "R_ARM_THM_BF16",  /* name.  */
1757
   false,     /* partial_inplace.  */
1758
   0x001f0ffe,    /* src_mask.  */
1759
   0x001f0ffe,    /* dst_mask.  */
1760
   true),     /* pcrel_offset.  */
1761
  HOWTO (R_ARM_THM_BF12,  /* type.  */
1762
   0,     /* rightshift.  */
1763
   2,     /* size.  */
1764
   12,      /* bitsize.  */
1765
   true,      /* pc_relative.  */
1766
   0,     /* bitpos.  */
1767
   complain_overflow_dont,/* do not complain_on_overflow.  */
1768
   bfd_elf_generic_reloc, /* special_function.  */
1769
   "R_ARM_THM_BF12",  /* name.  */
1770
   false,     /* partial_inplace.  */
1771
   0x00010ffe,    /* src_mask.  */
1772
   0x00010ffe,    /* dst_mask.  */
1773
   true),     /* pcrel_offset.  */
1774
  HOWTO (R_ARM_THM_BF18,  /* type.  */
1775
   0,     /* rightshift.  */
1776
   2,     /* size.  */
1777
   18,      /* bitsize.  */
1778
   true,      /* pc_relative.  */
1779
   0,     /* bitpos.  */
1780
   complain_overflow_dont,/* do not complain_on_overflow.  */
1781
   bfd_elf_generic_reloc, /* special_function.  */
1782
   "R_ARM_THM_BF18",  /* name.  */
1783
   false,     /* partial_inplace.  */
1784
   0x007f0ffe,    /* src_mask.  */
1785
   0x007f0ffe,    /* dst_mask.  */
1786
   true),     /* pcrel_offset.  */
1787
};
1788
1789
/* 160 onwards: */
1790
static reloc_howto_type elf32_arm_howto_table_2[8] =
1791
{
1792
  HOWTO (R_ARM_IRELATIVE, /* type */
1793
   0,     /* rightshift */
1794
   4,     /* size */
1795
   32,      /* bitsize */
1796
   false,     /* pc_relative */
1797
   0,     /* bitpos */
1798
   complain_overflow_bitfield,/* complain_on_overflow */
1799
   bfd_elf_generic_reloc, /* special_function */
1800
   "R_ARM_IRELATIVE", /* name */
1801
   true,      /* partial_inplace */
1802
   0xffffffff,    /* src_mask */
1803
   0xffffffff,    /* dst_mask */
1804
   false),    /* pcrel_offset */
1805
  HOWTO (R_ARM_GOTFUNCDESC, /* type */
1806
   0,     /* rightshift */
1807
   4,     /* size */
1808
   32,      /* bitsize */
1809
   false,     /* pc_relative */
1810
   0,     /* bitpos */
1811
   complain_overflow_bitfield,/* complain_on_overflow */
1812
   bfd_elf_generic_reloc, /* special_function */
1813
   "R_ARM_GOTFUNCDESC", /* name */
1814
   false,     /* partial_inplace */
1815
   0,     /* src_mask */
1816
   0xffffffff,    /* dst_mask */
1817
   false),    /* pcrel_offset */
1818
  HOWTO (R_ARM_GOTOFFFUNCDESC, /* type */
1819
   0,     /* rightshift */
1820
   4,     /* size */
1821
   32,      /* bitsize */
1822
   false,     /* pc_relative */
1823
   0,     /* bitpos */
1824
   complain_overflow_bitfield,/* complain_on_overflow */
1825
   bfd_elf_generic_reloc, /* special_function */
1826
   "R_ARM_GOTOFFFUNCDESC",/* name */
1827
   false,     /* partial_inplace */
1828
   0,     /* src_mask */
1829
   0xffffffff,    /* dst_mask */
1830
   false),    /* pcrel_offset */
1831
  HOWTO (R_ARM_FUNCDESC,  /* type */
1832
   0,     /* rightshift */
1833
   4,     /* size */
1834
   32,      /* bitsize */
1835
   false,     /* pc_relative */
1836
   0,     /* bitpos */
1837
   complain_overflow_bitfield,/* complain_on_overflow */
1838
   bfd_elf_generic_reloc, /* special_function */
1839
   "R_ARM_FUNCDESC",  /* name */
1840
   false,     /* partial_inplace */
1841
   0,     /* src_mask */
1842
   0xffffffff,    /* dst_mask */
1843
   false),    /* pcrel_offset */
1844
  HOWTO (R_ARM_FUNCDESC_VALUE,  /* type */
1845
   0,     /* rightshift */
1846
   4,     /* size */
1847
   64,      /* bitsize */
1848
   false,     /* pc_relative */
1849
   0,     /* bitpos */
1850
   complain_overflow_bitfield,/* complain_on_overflow */
1851
   bfd_elf_generic_reloc, /* special_function */
1852
   "R_ARM_FUNCDESC_VALUE",/* name */
1853
   false,     /* partial_inplace */
1854
   0,     /* src_mask */
1855
   0xffffffff,    /* dst_mask */
1856
   false),    /* pcrel_offset */
1857
  HOWTO (R_ARM_TLS_GD32_FDPIC,  /* type */
1858
   0,     /* rightshift */
1859
   4,     /* size */
1860
   32,      /* bitsize */
1861
   false,     /* pc_relative */
1862
   0,     /* bitpos */
1863
   complain_overflow_bitfield,/* complain_on_overflow */
1864
   bfd_elf_generic_reloc, /* special_function */
1865
   "R_ARM_TLS_GD32_FDPIC",/* name */
1866
   false,     /* partial_inplace */
1867
   0,     /* src_mask */
1868
   0xffffffff,    /* dst_mask */
1869
   false),    /* pcrel_offset */
1870
  HOWTO (R_ARM_TLS_LDM32_FDPIC, /* type */
1871
   0,     /* rightshift */
1872
   4,     /* size */
1873
   32,      /* bitsize */
1874
   false,     /* pc_relative */
1875
   0,     /* bitpos */
1876
   complain_overflow_bitfield,/* complain_on_overflow */
1877
   bfd_elf_generic_reloc, /* special_function */
1878
   "R_ARM_TLS_LDM32_FDPIC",/* name */
1879
   false,     /* partial_inplace */
1880
   0,     /* src_mask */
1881
   0xffffffff,    /* dst_mask */
1882
   false),    /* pcrel_offset */
1883
  HOWTO (R_ARM_TLS_IE32_FDPIC,  /* type */
1884
   0,     /* rightshift */
1885
   4,     /* size */
1886
   32,      /* bitsize */
1887
   false,     /* pc_relative */
1888
   0,     /* bitpos */
1889
   complain_overflow_bitfield,/* complain_on_overflow */
1890
   bfd_elf_generic_reloc, /* special_function */
1891
   "R_ARM_TLS_IE32_FDPIC",/* name */
1892
   false,     /* partial_inplace */
1893
   0,     /* src_mask */
1894
   0xffffffff,    /* dst_mask */
1895
   false),    /* pcrel_offset */
1896
};
1897
1898
/* 249-255 extended, currently unused, relocations:  */
1899
static reloc_howto_type elf32_arm_howto_table_3[4] =
1900
{
1901
  HOWTO (R_ARM_RREL32,    /* type */
1902
   0,     /* rightshift */
1903
   0,     /* size */
1904
   0,     /* bitsize */
1905
   false,     /* pc_relative */
1906
   0,     /* bitpos */
1907
   complain_overflow_dont,/* complain_on_overflow */
1908
   bfd_elf_generic_reloc, /* special_function */
1909
   "R_ARM_RREL32",  /* name */
1910
   false,     /* partial_inplace */
1911
   0,     /* src_mask */
1912
   0,     /* dst_mask */
1913
   false),    /* pcrel_offset */
1914
1915
  HOWTO (R_ARM_RABS32,    /* type */
1916
   0,     /* rightshift */
1917
   0,     /* size */
1918
   0,     /* bitsize */
1919
   false,     /* pc_relative */
1920
   0,     /* bitpos */
1921
   complain_overflow_dont,/* complain_on_overflow */
1922
   bfd_elf_generic_reloc, /* special_function */
1923
   "R_ARM_RABS32",  /* name */
1924
   false,     /* partial_inplace */
1925
   0,     /* src_mask */
1926
   0,     /* dst_mask */
1927
   false),    /* pcrel_offset */
1928
1929
  HOWTO (R_ARM_RPC24,   /* type */
1930
   0,     /* rightshift */
1931
   0,     /* size */
1932
   0,     /* bitsize */
1933
   false,     /* pc_relative */
1934
   0,     /* bitpos */
1935
   complain_overflow_dont,/* complain_on_overflow */
1936
   bfd_elf_generic_reloc, /* special_function */
1937
   "R_ARM_RPC24",   /* name */
1938
   false,     /* partial_inplace */
1939
   0,     /* src_mask */
1940
   0,     /* dst_mask */
1941
   false),    /* pcrel_offset */
1942
1943
  HOWTO (R_ARM_RBASE,   /* type */
1944
   0,     /* rightshift */
1945
   0,     /* size */
1946
   0,     /* bitsize */
1947
   false,     /* pc_relative */
1948
   0,     /* bitpos */
1949
   complain_overflow_dont,/* complain_on_overflow */
1950
   bfd_elf_generic_reloc, /* special_function */
1951
   "R_ARM_RBASE",   /* name */
1952
   false,     /* partial_inplace */
1953
   0,     /* src_mask */
1954
   0,     /* dst_mask */
1955
   false)     /* pcrel_offset */
1956
};
1957
1958
static reloc_howto_type *
1959
elf32_arm_howto_from_type (unsigned int r_type)
1960
833
{
1961
833
  if (r_type < ARRAY_SIZE (elf32_arm_howto_table_1))
1962
833
    return &elf32_arm_howto_table_1[r_type];
1963
1964
0
  if (r_type >= R_ARM_IRELATIVE
1965
0
      && r_type < R_ARM_IRELATIVE + ARRAY_SIZE (elf32_arm_howto_table_2))
1966
0
    return &elf32_arm_howto_table_2[r_type - R_ARM_IRELATIVE];
1967
1968
0
  if (r_type >= R_ARM_RREL32
1969
0
      && r_type < R_ARM_RREL32 + ARRAY_SIZE (elf32_arm_howto_table_3))
1970
0
    return &elf32_arm_howto_table_3[r_type - R_ARM_RREL32];
1971
1972
0
  return NULL;
1973
0
}
1974
1975
static bool
1976
elf32_arm_info_to_howto (bfd * abfd, arelent * bfd_reloc,
1977
       Elf_Internal_Rela * elf_reloc)
1978
833
{
1979
833
  unsigned int r_type;
1980
1981
833
  r_type = ELF32_R_TYPE (elf_reloc->r_info);
1982
833
  if ((bfd_reloc->howto = elf32_arm_howto_from_type (r_type)) == NULL)
1983
0
    {
1984
      /* xgettext:c-format */
1985
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1986
0
        abfd, r_type);
1987
0
      bfd_set_error (bfd_error_bad_value);
1988
0
      return false;
1989
0
    }
1990
833
  return true;
1991
833
}
1992
1993
struct elf32_arm_reloc_map
1994
  {
1995
    bfd_reloc_code_real_type  bfd_reloc_val;
1996
    unsigned char       elf_reloc_val;
1997
  };
1998
1999
/* All entries in this list must also be present in elf32_arm_howto_table.  */
2000
static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
2001
  {
2002
    {BFD_RELOC_NONE,         R_ARM_NONE},
2003
    {BFD_RELOC_ARM_PCREL_BRANCH,     R_ARM_PC24},
2004
    {BFD_RELOC_ARM_PCREL_CALL,       R_ARM_CALL},
2005
    {BFD_RELOC_ARM_PCREL_JUMP,       R_ARM_JUMP24},
2006
    {BFD_RELOC_ARM_PCREL_BLX,      R_ARM_XPC25},
2007
    {BFD_RELOC_THUMB_PCREL_BLX,      R_ARM_THM_XPC22},
2008
    {BFD_RELOC_32,         R_ARM_ABS32},
2009
    {BFD_RELOC_32_PCREL,       R_ARM_REL32},
2010
    {BFD_RELOC_8,        R_ARM_ABS8},
2011
    {BFD_RELOC_16,         R_ARM_ABS16},
2012
    {BFD_RELOC_ARM_OFFSET_IMM,       R_ARM_ABS12},
2013
    {BFD_RELOC_ARM_THUMB_OFFSET,     R_ARM_THM_ABS5},
2014
    {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
2015
    {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
2016
    {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
2017
    {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
2018
    {BFD_RELOC_THUMB_PCREL_BRANCH9,  R_ARM_THM_JUMP8},
2019
    {BFD_RELOC_THUMB_PCREL_BRANCH7,  R_ARM_THM_JUMP6},
2020
    {BFD_RELOC_ARM_GLOB_DAT,       R_ARM_GLOB_DAT},
2021
    {BFD_RELOC_ARM_JUMP_SLOT,      R_ARM_JUMP_SLOT},
2022
    {BFD_RELOC_ARM_RELATIVE,       R_ARM_RELATIVE},
2023
    {BFD_RELOC_ARM_GOTOFF,       R_ARM_GOTOFF32},
2024
    {BFD_RELOC_ARM_GOTPC,      R_ARM_GOTPC},
2025
    {BFD_RELOC_ARM_GOT_PREL,       R_ARM_GOT_PREL},
2026
    {BFD_RELOC_ARM_GOT32,      R_ARM_GOT32},
2027
    {BFD_RELOC_ARM_PLT32,      R_ARM_PLT32},
2028
    {BFD_RELOC_ARM_TARGET1,      R_ARM_TARGET1},
2029
    {BFD_RELOC_ARM_ROSEGREL32,       R_ARM_ROSEGREL32},
2030
    {BFD_RELOC_ARM_SBREL32,      R_ARM_SBREL32},
2031
    {BFD_RELOC_ARM_PREL31,       R_ARM_PREL31},
2032
    {BFD_RELOC_ARM_TARGET2,      R_ARM_TARGET2},
2033
    {BFD_RELOC_ARM_PLT32,      R_ARM_PLT32},
2034
    {BFD_RELOC_ARM_TLS_GOTDESC,      R_ARM_TLS_GOTDESC},
2035
    {BFD_RELOC_ARM_TLS_CALL,       R_ARM_TLS_CALL},
2036
    {BFD_RELOC_ARM_THM_TLS_CALL,     R_ARM_THM_TLS_CALL},
2037
    {BFD_RELOC_ARM_TLS_DESCSEQ,      R_ARM_TLS_DESCSEQ},
2038
    {BFD_RELOC_ARM_THM_TLS_DESCSEQ,  R_ARM_THM_TLS_DESCSEQ},
2039
    {BFD_RELOC_ARM_TLS_DESC,       R_ARM_TLS_DESC},
2040
    {BFD_RELOC_ARM_TLS_GD32,       R_ARM_TLS_GD32},
2041
    {BFD_RELOC_ARM_TLS_LDO32,      R_ARM_TLS_LDO32},
2042
    {BFD_RELOC_ARM_TLS_LDM32,      R_ARM_TLS_LDM32},
2043
    {BFD_RELOC_ARM_TLS_DTPMOD32,     R_ARM_TLS_DTPMOD32},
2044
    {BFD_RELOC_ARM_TLS_DTPOFF32,     R_ARM_TLS_DTPOFF32},
2045
    {BFD_RELOC_ARM_TLS_TPOFF32,      R_ARM_TLS_TPOFF32},
2046
    {BFD_RELOC_ARM_TLS_IE32,       R_ARM_TLS_IE32},
2047
    {BFD_RELOC_ARM_TLS_LE32,       R_ARM_TLS_LE32},
2048
    {BFD_RELOC_ARM_IRELATIVE,      R_ARM_IRELATIVE},
2049
    {BFD_RELOC_ARM_GOTFUNCDESC,      R_ARM_GOTFUNCDESC},
2050
    {BFD_RELOC_ARM_GOTOFFFUNCDESC,   R_ARM_GOTOFFFUNCDESC},
2051
    {BFD_RELOC_ARM_FUNCDESC,         R_ARM_FUNCDESC},
2052
    {BFD_RELOC_ARM_FUNCDESC_VALUE,   R_ARM_FUNCDESC_VALUE},
2053
    {BFD_RELOC_ARM_TLS_GD32_FDPIC,   R_ARM_TLS_GD32_FDPIC},
2054
    {BFD_RELOC_ARM_TLS_LDM32_FDPIC,  R_ARM_TLS_LDM32_FDPIC},
2055
    {BFD_RELOC_ARM_TLS_IE32_FDPIC,   R_ARM_TLS_IE32_FDPIC},
2056
    {BFD_RELOC_VTABLE_INHERIT,       R_ARM_GNU_VTINHERIT},
2057
    {BFD_RELOC_VTABLE_ENTRY,       R_ARM_GNU_VTENTRY},
2058
    {BFD_RELOC_ARM_MOVW,       R_ARM_MOVW_ABS_NC},
2059
    {BFD_RELOC_ARM_MOVT,       R_ARM_MOVT_ABS},
2060
    {BFD_RELOC_ARM_MOVW_PCREL,       R_ARM_MOVW_PREL_NC},
2061
    {BFD_RELOC_ARM_MOVT_PCREL,       R_ARM_MOVT_PREL},
2062
    {BFD_RELOC_ARM_THUMB_MOVW,       R_ARM_THM_MOVW_ABS_NC},
2063
    {BFD_RELOC_ARM_THUMB_MOVT,       R_ARM_THM_MOVT_ABS},
2064
    {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
2065
    {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
2066
    {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
2067
    {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
2068
    {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
2069
    {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
2070
    {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
2071
    {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
2072
    {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
2073
    {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
2074
    {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
2075
    {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
2076
    {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
2077
    {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
2078
    {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
2079
    {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
2080
    {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
2081
    {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
2082
    {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
2083
    {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
2084
    {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
2085
    {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
2086
    {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
2087
    {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
2088
    {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
2089
    {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
2090
    {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
2091
    {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
2092
    {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
2093
    {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2},
2094
    {BFD_RELOC_ARM_V4BX,       R_ARM_V4BX},
2095
    {BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC, R_ARM_THM_ALU_ABS_G3_NC},
2096
    {BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC, R_ARM_THM_ALU_ABS_G2_NC},
2097
    {BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC, R_ARM_THM_ALU_ABS_G1_NC},
2098
    {BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC, R_ARM_THM_ALU_ABS_G0_NC},
2099
    {BFD_RELOC_ARM_THUMB_BF17, R_ARM_THM_BF16},
2100
    {BFD_RELOC_ARM_THUMB_BF13, R_ARM_THM_BF12},
2101
    {BFD_RELOC_ARM_THUMB_BF19, R_ARM_THM_BF18}
2102
  };
2103
2104
static reloc_howto_type *
2105
elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2106
           bfd_reloc_code_real_type code)
2107
0
{
2108
0
  unsigned int i;
2109
2110
0
  for (i = 0; i < ARRAY_SIZE (elf32_arm_reloc_map); i ++)
2111
0
    if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
2112
0
      return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
2113
2114
0
  return NULL;
2115
0
}
2116
2117
static reloc_howto_type *
2118
elf32_arm_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2119
           const char *r_name)
2120
0
{
2121
0
  unsigned int i;
2122
2123
0
  for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_1); i++)
2124
0
    if (elf32_arm_howto_table_1[i].name != NULL
2125
0
  && strcasecmp (elf32_arm_howto_table_1[i].name, r_name) == 0)
2126
0
      return &elf32_arm_howto_table_1[i];
2127
2128
0
  for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_2); i++)
2129
0
    if (elf32_arm_howto_table_2[i].name != NULL
2130
0
  && strcasecmp (elf32_arm_howto_table_2[i].name, r_name) == 0)
2131
0
      return &elf32_arm_howto_table_2[i];
2132
2133
0
  for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_3); i++)
2134
0
    if (elf32_arm_howto_table_3[i].name != NULL
2135
0
  && strcasecmp (elf32_arm_howto_table_3[i].name, r_name) == 0)
2136
0
      return &elf32_arm_howto_table_3[i];
2137
2138
0
  return NULL;
2139
0
}
2140
2141
/* Support for core dump NOTE sections.  */
2142
2143
static bool
2144
elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2145
30
{
2146
30
  int offset;
2147
30
  size_t size;
2148
2149
30
  switch (note->descsz)
2150
30
    {
2151
30
      default:
2152
30
  return false;
2153
2154
0
      case 148:   /* Linux/ARM 32-bit.  */
2155
  /* pr_cursig */
2156
0
  elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2157
2158
  /* pr_pid */
2159
0
  elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
2160
2161
  /* pr_reg */
2162
0
  offset = 72;
2163
0
  size = 72;
2164
2165
0
  break;
2166
30
    }
2167
2168
  /* Make a ".reg/999" section.  */
2169
0
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2170
0
            size, note->descpos + offset);
2171
30
}
2172
2173
static bool
2174
elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2175
16
{
2176
16
  switch (note->descsz)
2177
16
    {
2178
16
      default:
2179
16
  return false;
2180
2181
0
      case 124:   /* Linux/ARM elf_prpsinfo.  */
2182
0
  elf_tdata (abfd)->core->pid
2183
0
   = bfd_get_32 (abfd, note->descdata + 12);
2184
0
  elf_tdata (abfd)->core->program
2185
0
   = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
2186
0
  elf_tdata (abfd)->core->command
2187
0
   = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
2188
16
    }
2189
2190
  /* Note that for some reason, a spurious space is tacked
2191
     onto the end of the args in some (at least one anyway)
2192
     implementations, so strip it off if it exists.  */
2193
0
  {
2194
0
    char *command = elf_tdata (abfd)->core->command;
2195
0
    int n = strlen (command);
2196
2197
0
    if (0 < n && command[n - 1] == ' ')
2198
0
      command[n - 1] = '\0';
2199
0
  }
2200
2201
0
  return true;
2202
16
}
2203
2204
static char *
2205
elf32_arm_nabi_write_core_note (bfd *abfd, char *buf, int *bufsiz,
2206
        int note_type, ...)
2207
0
{
2208
0
  switch (note_type)
2209
0
    {
2210
0
    default:
2211
0
      return NULL;
2212
2213
0
    case NT_PRPSINFO:
2214
0
      {
2215
0
  char data[124] ATTRIBUTE_NONSTRING;
2216
0
  va_list ap;
2217
2218
0
  va_start (ap, note_type);
2219
0
  memset (data, 0, sizeof (data));
2220
0
  strncpy (data + 28, va_arg (ap, const char *), 16);
2221
#if GCC_VERSION == 8000 || GCC_VERSION == 8001
2222
  DIAGNOSTIC_PUSH;
2223
  /* GCC 8.0 and 8.1 warn about 80 equals destination size with
2224
     -Wstringop-truncation:
2225
     https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
2226
   */
2227
  DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
2228
#endif
2229
0
  strncpy (data + 44, va_arg (ap, const char *), 80);
2230
#if GCC_VERSION == 8000 || GCC_VERSION == 8001
2231
  DIAGNOSTIC_POP;
2232
#endif
2233
0
  va_end (ap);
2234
2235
0
  return elfcore_write_note (abfd, buf, bufsiz,
2236
0
           "CORE", note_type, data, sizeof (data));
2237
0
      }
2238
2239
0
    case NT_PRSTATUS:
2240
0
      {
2241
0
  char data[148];
2242
0
  va_list ap;
2243
0
  long pid;
2244
0
  int cursig;
2245
0
  const void *greg;
2246
2247
0
  va_start (ap, note_type);
2248
0
  memset (data, 0, sizeof (data));
2249
0
  pid = va_arg (ap, long);
2250
0
  bfd_put_32 (abfd, pid, data + 24);
2251
0
  cursig = va_arg (ap, int);
2252
0
  bfd_put_16 (abfd, cursig, data + 12);
2253
0
  greg = va_arg (ap, const void *);
2254
0
  memcpy (data + 72, greg, 72);
2255
0
  va_end (ap);
2256
2257
0
  return elfcore_write_note (abfd, buf, bufsiz,
2258
0
           "CORE", note_type, data, sizeof (data));
2259
0
      }
2260
0
    }
2261
0
}
2262
2263
#define TARGET_LITTLE_SYM   arm_elf32_le_vec
2264
#define TARGET_LITTLE_NAME    "elf32-littlearm"
2265
#define TARGET_BIG_SYM      arm_elf32_be_vec
2266
#define TARGET_BIG_NAME     "elf32-bigarm"
2267
2268
#define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
2269
#define elf_backend_grok_psinfo   elf32_arm_nabi_grok_psinfo
2270
#define elf_backend_write_core_note elf32_arm_nabi_write_core_note
2271
2272
typedef unsigned long int insn32;
2273
typedef unsigned short int insn16;
2274
2275
/* In lieu of proper flags, assume all EABIv4 or later objects are
2276
   interworkable.  */
2277
#define INTERWORK_FLAG(abfd)  \
2278
0
  (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
2279
0
  || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK) \
2280
0
  || ((abfd)->flags & BFD_LINKER_CREATED))
2281
2282
/* The linker script knows the section names for placement.
2283
   The entry_names are used to do simple name mangling on the stubs.
2284
   Given a function name, and its type, the stub can be found. The
2285
   name can be changed. The only requirement is the %s be present.  */
2286
0
#define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
2287
0
#define THUMB2ARM_GLUE_ENTRY_NAME   "__%s_from_thumb"
2288
2289
0
#define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
2290
0
#define ARM2THUMB_GLUE_ENTRY_NAME   "__%s_from_arm"
2291
2292
0
#define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
2293
0
#define VFP11_ERRATUM_VENEER_ENTRY_NAME   "__vfp11_veneer_%x"
2294
2295
0
#define STM32L4XX_ERRATUM_VENEER_SECTION_NAME ".text.stm32l4xx_veneer"
2296
0
#define STM32L4XX_ERRATUM_VENEER_ENTRY_NAME   "__stm32l4xx_veneer_%x"
2297
2298
0
#define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
2299
0
#define ARM_BX_GLUE_ENTRY_NAME   "__bx_r%d"
2300
2301
0
#define STUB_ENTRY_NAME   "__%s_veneer"
2302
2303
0
#define CMSE_PREFIX "__acle_se_"
2304
2305
0
#define CMSE_STUB_NAME ".gnu.sgstubs"
2306
2307
/* The name of the dynamic interpreter.  This is put in the .interp
2308
   section.  */
2309
0
#define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
2310
2311
/* FDPIC default stack size.  */
2312
0
#define DEFAULT_STACK_SIZE 0x8000
2313
2314
static const unsigned long tls_trampoline [] =
2315
{
2316
  0xe08e0000,   /* add r0, lr, r0 */
2317
  0xe5901004,   /* ldr r1, [r0,#4] */
2318
  0xe12fff11,   /* bx  r1 */
2319
};
2320
2321
static const unsigned long dl_tlsdesc_lazy_trampoline [] =
2322
{
2323
  0xe52d2004, /*  push    {r2}      */
2324
  0xe59f200c, /*      ldr     r2, [pc, #3f - . - 8] */
2325
  0xe59f100c, /*      ldr     r1, [pc, #4f - . - 8] */
2326
  0xe79f2002, /* 1:   ldr     r2, [pc, r2]    */
2327
  0xe081100f, /* 2:   add     r1, pc      */
2328
  0xe12fff12, /*      bx      r2      */
2329
  0x00000014, /* 3:   .word  _GLOBAL_OFFSET_TABLE_ - 1b - 8
2330
        + dl_tlsdesc_lazy_resolver(GOT)   */
2331
  0x00000018, /* 4:   .word  _GLOBAL_OFFSET_TABLE_ - 2b - 8 */
2332
};
2333
2334
/* NOTE: [Thumb nop sequence]
2335
   When adding code that transitions from Thumb to Arm the instruction that
2336
   should be used for the alignment padding should be 0xe7fd (b .-2) instead of
2337
   a nop for performance reasons.  */
2338
2339
/* ARM FDPIC PLT entry.  */
2340
/* The last 5 words contain PLT lazy fragment code and data.  */
2341
static const bfd_vma elf32_arm_fdpic_plt_entry [] =
2342
  {
2343
    0xe59fc008,    /* ldr     r12, .L1 */
2344
    0xe08cc009,    /* add     r12, r12, r9 */
2345
    0xe59c9004,    /* ldr     r9, [r12, #4] */
2346
    0xe59cf000,    /* ldr     pc, [r12] */
2347
    0x00000000,    /* L1.     .word   foo(GOTOFFFUNCDESC) */
2348
    0x00000000,    /* L1.     .word   foo(funcdesc_value_reloc_offset) */
2349
    0xe51fc00c,    /* ldr     r12, [pc, #-12] */
2350
    0xe92d1000,    /* push    {r12} */
2351
    0xe599c004,    /* ldr     r12, [r9, #4] */
2352
    0xe599f000,    /* ldr     pc, [r9] */
2353
  };
2354
2355
/* Thumb FDPIC PLT entry.  */
2356
/* The last 5 words contain PLT lazy fragment code and data.  */
2357
static const bfd_vma elf32_arm_fdpic_thumb_plt_entry [] =
2358
  {
2359
    0xc00cf8df,    /* ldr.w   r12, .L1 */
2360
    0x0c09eb0c,    /* add.w   r12, r12, r9 */
2361
    0x9004f8dc,    /* ldr.w   r9, [r12, #4] */
2362
    0xf000f8dc,    /* ldr.w   pc, [r12] */
2363
    0x00000000,    /* .L1     .word   foo(GOTOFFFUNCDESC) */
2364
    0x00000000,    /* .L2     .word   foo(funcdesc_value_reloc_offset) */
2365
    0xc008f85f,    /* ldr.w   r12, .L2 */
2366
    0xcd04f84d,    /* push    {r12} */
2367
    0xc004f8d9,    /* ldr.w   r12, [r9, #4] */
2368
    0xf000f8d9,    /* ldr.w   pc, [r9] */
2369
  };
2370
2371
#ifdef FOUR_WORD_PLT
2372
2373
/* The first entry in a procedure linkage table looks like
2374
   this.  It is set up so that any shared library function that is
2375
   called before the relocation has been set up calls the dynamic
2376
   linker first.  */
2377
static const bfd_vma elf32_arm_plt0_entry [] =
2378
{
2379
  0xe52de004,   /* str   lr, [sp, #-4]! */
2380
  0xe59fe010,   /* ldr   lr, [pc, #16]  */
2381
  0xe08fe00e,   /* add   lr, pc, lr     */
2382
  0xe5bef008,   /* ldr   pc, [lr, #8]!  */
2383
};
2384
2385
/* Subsequent entries in a procedure linkage table look like
2386
   this.  */
2387
static const bfd_vma elf32_arm_plt_entry [] =
2388
{
2389
  0xe28fc600,   /* add   ip, pc, #NN  */
2390
  0xe28cca00,   /* add   ip, ip, #NN  */
2391
  0xe5bcf000,   /* ldr   pc, [ip, #NN]! */
2392
  0x00000000,   /* unused   */
2393
};
2394
2395
#else /* not FOUR_WORD_PLT */
2396
2397
/* The first entry in a procedure linkage table looks like
2398
   this.  It is set up so that any shared library function that is
2399
   called before the relocation has been set up calls the dynamic
2400
   linker first.  */
2401
static const bfd_vma elf32_arm_plt0_entry [] =
2402
{
2403
  0xe52de004,   /* str   lr, [sp, #-4]! */
2404
  0xe59fe004,   /* ldr   lr, [pc, #4] */
2405
  0xe08fe00e,   /* add   lr, pc, lr */
2406
  0xe5bef008,   /* ldr   pc, [lr, #8]!  */
2407
  0x00000000,   /* &GOT[0] - .    */
2408
};
2409
2410
/* By default subsequent entries in a procedure linkage table look like
2411
   this. Offsets that don't fit into 28 bits will cause link error.  */
2412
static const bfd_vma elf32_arm_plt_entry_short [] =
2413
{
2414
  0xe28fc600,   /* add   ip, pc, #0xNN00000 */
2415
  0xe28cca00,   /* add   ip, ip, #0xNN000   */
2416
  0xe5bcf000,   /* ldr   pc, [ip, #0xNNN]!  */
2417
};
2418
2419
/* When explicitly asked, we'll use this "long" entry format
2420
   which can cope with arbitrary displacements.  */
2421
static const bfd_vma elf32_arm_plt_entry_long [] =
2422
{
2423
  0xe28fc200,   /* add   ip, pc, #0xN0000000 */
2424
  0xe28cc600,   /* add   ip, ip, #0xNN00000  */
2425
  0xe28cca00,   /* add   ip, ip, #0xNN000    */
2426
  0xe5bcf000,   /* ldr   pc, [ip, #0xNNN]!   */
2427
};
2428
2429
static bool elf32_arm_use_long_plt_entry = false;
2430
2431
#endif /* not FOUR_WORD_PLT */
2432
2433
/* The first entry in a procedure linkage table looks like this.
2434
   It is set up so that any shared library function that is called before the
2435
   relocation has been set up calls the dynamic linker first.  */
2436
static const bfd_vma elf32_thumb2_plt0_entry [] =
2437
{
2438
  /* NOTE: As this is a mixture of 16-bit and 32-bit instructions,
2439
     an instruction maybe encoded to one or two array elements.  */
2440
  0xf8dfb500,   /* push    {lr}    */
2441
  0x44fee008,   /* ldr.w   lr, [pc, #8]  */
2442
      /* add     lr, pc  */
2443
  0xff08f85e,   /* ldr.w   pc, [lr, #8]! */
2444
  0x00000000,   /* &GOT[0] - .     */
2445
};
2446
2447
/* Subsequent entries in a procedure linkage table for thumb only target
2448
   look like this.  */
2449
static const bfd_vma elf32_thumb2_plt_entry [] =
2450
{
2451
  /* NOTE: As this is a mixture of 16-bit and 32-bit instructions,
2452
     an instruction maybe encoded to one or two array elements.  */
2453
  0x0c00f240,   /* movw    ip, #0xNNNN    */
2454
  0x0c00f2c0,   /* movt    ip, #0xNNNN    */
2455
  0xf8dc44fc,   /* add     ip, pc   */
2456
  0xe7fcf000    /* ldr.w   pc, [ip]   */
2457
      /* b      .-4     */
2458
};
2459
2460
/* The format of the first entry in the procedure linkage table
2461
   for a VxWorks executable.  */
2462
static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
2463
{
2464
  0xe52dc008,   /* str    ip,[sp,#-8]!      */
2465
  0xe59fc000,   /* ldr    ip,[pc]     */
2466
  0xe59cf008,   /* ldr    pc,[ip,#8]      */
2467
  0x00000000,   /* .long  _GLOBAL_OFFSET_TABLE_   */
2468
};
2469
2470
/* The format of subsequent entries in a VxWorks executable.  */
2471
static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
2472
{
2473
  0xe59fc000,       /* ldr  ip,[pc]     */
2474
  0xe59cf000,       /* ldr  pc,[ip]     */
2475
  0x00000000,       /* .long  @got        */
2476
  0xe59fc000,       /* ldr  ip,[pc]     */
2477
  0xea000000,       /* b  _PLT        */
2478
  0x00000000,       /* .long  @pltindex*sizeof(Elf32_Rela)  */
2479
};
2480
2481
/* The format of entries in a VxWorks shared library.  */
2482
static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
2483
{
2484
  0xe59fc000,       /* ldr  ip,[pc]     */
2485
  0xe79cf009,       /* ldr  pc,[ip,r9]      */
2486
  0x00000000,       /* .long  @got        */
2487
  0xe59fc000,       /* ldr  ip,[pc]     */
2488
  0xe599f008,       /* ldr  pc,[r9,#8]      */
2489
  0x00000000,       /* .long  @pltindex*sizeof(Elf32_Rela)  */
2490
};
2491
2492
/* An initial stub used if the PLT entry is referenced from Thumb code.  */
2493
0
#define PLT_THUMB_STUB_SIZE 4
2494
static const bfd_vma elf32_arm_plt_thumb_stub [] =
2495
{
2496
  0x4778,   /* bx pc */
2497
  0xe7fd    /* b .-2 */
2498
};
2499
2500
/* The first entry in a procedure linkage table looks like
2501
   this.  It is set up so that any shared library function that is
2502
   called before the relocation has been set up calls the dynamic
2503
   linker first.  */
2504
static const bfd_vma elf32_arm_nacl_plt0_entry [] =
2505
{
2506
  /* First bundle: */
2507
  0xe300c000,   /* movw ip, #:lower16:&GOT[2]-.+8 */
2508
  0xe340c000,   /* movt ip, #:upper16:&GOT[2]-.+8 */
2509
  0xe08cc00f,   /* add  ip, ip, pc      */
2510
  0xe52dc008,   /* str  ip, [sp, #-8]!      */
2511
  /* Second bundle: */
2512
  0xe3ccc103,   /* bic  ip, ip, #0xc0000000   */
2513
  0xe59cc000,   /* ldr  ip, [ip]      */
2514
  0xe3ccc13f,   /* bic  ip, ip, #0xc000000f   */
2515
  0xe12fff1c,   /* bx ip        */
2516
  /* Third bundle: */
2517
  0xe320f000,   /* nop          */
2518
  0xe320f000,   /* nop          */
2519
  0xe320f000,   /* nop          */
2520
  /* .Lplt_tail: */
2521
  0xe50dc004,   /* str  ip, [sp, #-4]     */
2522
  /* Fourth bundle: */
2523
  0xe3ccc103,   /* bic  ip, ip, #0xc0000000   */
2524
  0xe59cc000,   /* ldr  ip, [ip]      */
2525
  0xe3ccc13f,   /* bic  ip, ip, #0xc000000f   */
2526
  0xe12fff1c,   /* bx ip        */
2527
};
2528
0
#define ARM_NACL_PLT_TAIL_OFFSET  (11 * 4)
2529
2530
/* Subsequent entries in a procedure linkage table look like this.  */
2531
static const bfd_vma elf32_arm_nacl_plt_entry [] =
2532
{
2533
  0xe300c000,   /* movw ip, #:lower16:&GOT[n]-.+8 */
2534
  0xe340c000,   /* movt ip, #:upper16:&GOT[n]-.+8 */
2535
  0xe08cc00f,   /* add  ip, ip, pc      */
2536
  0xea000000,   /* b  .Lplt_tail      */
2537
};
2538
2539
/* PR 28924:
2540
   There was a bug due to too high values of THM_MAX_FWD_BRANCH_OFFSET and
2541
   THM2_MAX_FWD_BRANCH_OFFSET.  The first macro concerns the case when Thumb-2
2542
   is not available, and second macro when Thumb-2 is available.  Among other
2543
   things, they affect the range of branches represented as BLX instructions
2544
   in Encoding T2 defined in Section A8.8.25 of the ARM Architecture
2545
   Reference Manual ARMv7-A and ARMv7-R edition issue C.d.  Such branches are
2546
   specified there to have a maximum forward offset that is a multiple of 4.
2547
   Previously, the respective values defined here were multiples of 2 but not
2548
   4 and they are included in comments for reference.  */
2549
0
#define ARM_MAX_FWD_BRANCH_OFFSET  ((((1 << 23) - 1) << 2) + 8)
2550
0
#define ARM_MAX_BWD_BRANCH_OFFSET ((-((1 << 23) << 2)) + 8)
2551
0
#define THM_MAX_FWD_BRANCH_OFFSET   ((1 << 22) - 4 + 4)
2552
/* #def THM_MAX_FWD_BRANCH_OFFSET   ((1 << 22) - 2 + 4) */
2553
0
#define THM_MAX_BWD_BRANCH_OFFSET  (-(1 << 22) + 4)
2554
0
#define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 4) + 4)
2555
/* #def THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4) */
2556
0
#define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
2557
0
#define THM2_MAX_FWD_COND_BRANCH_OFFSET (((1 << 20) -2) + 4)
2558
0
#define THM2_MAX_BWD_COND_BRANCH_OFFSET (-(1 << 20) + 4)
2559
2560
enum stub_insn_type
2561
{
2562
  THUMB16_TYPE = 1,
2563
  THUMB32_TYPE,
2564
  ARM_TYPE,
2565
  DATA_TYPE
2566
};
2567
2568
#define THUMB16_INSN(X)   {(X), THUMB16_TYPE, R_ARM_NONE, 0}
2569
/* A bit of a hack.  A Thumb conditional branch, in which the proper condition
2570
   is inserted in arm_build_one_stub().  */
2571
#define THUMB16_BCOND_INSN(X) {(X), THUMB16_TYPE, R_ARM_NONE, 1}
2572
#define THUMB32_INSN(X)   {(X), THUMB32_TYPE, R_ARM_NONE, 0}
2573
#define THUMB32_MOVT(X)   {(X), THUMB32_TYPE, R_ARM_THM_MOVT_ABS, 0}
2574
#define THUMB32_MOVW(X)   {(X), THUMB32_TYPE, R_ARM_THM_MOVW_ABS_NC, 0}
2575
#define THUMB32_B_INSN(X, Z)  {(X), THUMB32_TYPE, R_ARM_THM_JUMP24, (Z)}
2576
#define ARM_INSN(X)   {(X), ARM_TYPE, R_ARM_NONE, 0}
2577
#define ARM_REL_INSN(X, Z)  {(X), ARM_TYPE, R_ARM_JUMP24, (Z)}
2578
#define DATA_WORD(X,Y,Z)  {(X), DATA_TYPE, (Y), (Z)}
2579
2580
typedef struct
2581
{
2582
  bfd_vma        data;
2583
  enum stub_insn_type  type;
2584
  unsigned int         r_type;
2585
  int          reloc_addend;
2586
}  insn_sequence;
2587
2588
/* See note [Thumb nop sequence] when adding a veneer.  */
2589
2590
/* Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2591
   to reach the stub if necessary.  */
2592
static const insn_sequence elf32_arm_stub_long_branch_any_any[] =
2593
{
2594
  ARM_INSN (0xe51ff004),      /* ldr   pc, [pc, #-4] */
2595
  DATA_WORD (0, R_ARM_ABS32, 0),    /* dcd   R_ARM_ABS32(X) */
2596
};
2597
2598
/* V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
2599
   available.  */
2600
static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb[] =
2601
{
2602
  ARM_INSN (0xe59fc000),      /* ldr   ip, [pc, #0] */
2603
  ARM_INSN (0xe12fff1c),      /* bx    ip */
2604
  DATA_WORD (0, R_ARM_ABS32, 0),    /* dcd   R_ARM_ABS32(X) */
2605
};
2606
2607
/* Thumb -> Thumb long branch stub. Used on M-profile architectures.  */
2608
static const insn_sequence elf32_arm_stub_long_branch_thumb_only[] =
2609
{
2610
  THUMB16_INSN (0xb401),       /* push {r0} */
2611
  THUMB16_INSN (0x4802),       /* ldr  r0, [pc, #8] */
2612
  THUMB16_INSN (0x4684),       /* mov  ip, r0 */
2613
  THUMB16_INSN (0xbc01),       /* pop  {r0} */
2614
  THUMB16_INSN (0x4760),       /* bx   ip */
2615
  THUMB16_INSN (0xbf00),       /* nop */
2616
  DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(X) */
2617
};
2618
2619
/* Thumb -> Thumb long branch stub in thumb2 encoding.  Used on armv7.  */
2620
static const insn_sequence elf32_arm_stub_long_branch_thumb2_only[] =
2621
{
2622
  THUMB32_INSN (0xf85ff000),       /* ldr.w  pc, [pc, #-0] */
2623
  DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(x) */
2624
};
2625
2626
/* Thumb -> Thumb long branch stub. Used for PureCode sections on Thumb2
2627
   M-profile architectures.  */
2628
static const insn_sequence elf32_arm_stub_long_branch_thumb2_only_pure[] =
2629
{
2630
  THUMB32_MOVW (0xf2400c00),       /* mov.w ip, R_ARM_MOVW_ABS_NC */
2631
  THUMB32_MOVT (0xf2c00c00),       /* movt  ip, R_ARM_MOVT_ABS << 16 */
2632
  THUMB16_INSN (0x4760),       /* bx   ip */
2633
  THUMB16_INSN (0xbf00),       /* nop */
2634
  /* The nop is added to ensure alignment of following stubs in the section.  */
2635
};
2636
2637
/* V4T Thumb -> Thumb long branch stub. Using the stack is not
2638
   allowed.  */
2639
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
2640
{
2641
  THUMB16_INSN (0x4778),       /* bx   pc */
2642
  THUMB16_INSN (0xe7fd),       /* b   .-2 */
2643
  ARM_INSN (0xe59fc000),       /* ldr  ip, [pc, #0] */
2644
  ARM_INSN (0xe12fff1c),       /* bx   ip */
2645
  DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(X) */
2646
};
2647
2648
/* V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
2649
   available.  */
2650
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm[] =
2651
{
2652
  THUMB16_INSN (0x4778),       /* bx   pc */
2653
  THUMB16_INSN (0xe7fd),       /* b   .-2 */
2654
  ARM_INSN (0xe51ff004),       /* ldr   pc, [pc, #-4] */
2655
  DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd   R_ARM_ABS32(X) */
2656
};
2657
2658
/* V4T Thumb -> ARM short branch stub. Shorter variant of the above
2659
   one, when the destination is close enough.  */
2660
static const insn_sequence elf32_arm_stub_short_branch_v4t_thumb_arm[] =
2661
{
2662
  THUMB16_INSN (0x4778),       /* bx   pc */
2663
  THUMB16_INSN (0xe7fd),       /* b   .-2 */
2664
  ARM_REL_INSN (0xea000000, -8),     /* b    (X-8) */
2665
};
2666
2667
/* ARM/Thumb -> ARM long branch stub, PIC.  On V5T and above, use
2668
   blx to reach the stub if necessary.  */
2669
static const insn_sequence elf32_arm_stub_long_branch_any_arm_pic[] =
2670
{
2671
  ARM_INSN (0xe59fc000),       /* ldr   ip, [pc] */
2672
  ARM_INSN (0xe08ff00c),       /* add   pc, pc, ip */
2673
  DATA_WORD (0, R_ARM_REL32, -4),    /* dcd   R_ARM_REL32(X-4) */
2674
};
2675
2676
/* ARM/Thumb -> Thumb long branch stub, PIC.  On V5T and above, use
2677
   blx to reach the stub if necessary.  We can not add into pc;
2678
   it is not guaranteed to mode switch (different in ARMv6 and
2679
   ARMv7).  */
2680
static const insn_sequence elf32_arm_stub_long_branch_any_thumb_pic[] =
2681
{
2682
  ARM_INSN (0xe59fc004),       /* ldr   ip, [pc, #4] */
2683
  ARM_INSN (0xe08fc00c),       /* add   ip, pc, ip */
2684
  ARM_INSN (0xe12fff1c),       /* bx    ip */
2685
  DATA_WORD (0, R_ARM_REL32, 0),     /* dcd   R_ARM_REL32(X) */
2686
};
2687
2688
/* V4T ARM -> ARM long branch stub, PIC.  */
2689
static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
2690
{
2691
  ARM_INSN (0xe59fc004),       /* ldr   ip, [pc, #4] */
2692
  ARM_INSN (0xe08fc00c),       /* add   ip, pc, ip */
2693
  ARM_INSN (0xe12fff1c),       /* bx    ip */
2694
  DATA_WORD (0, R_ARM_REL32, 0),     /* dcd   R_ARM_REL32(X) */
2695
};
2696
2697
/* V4T Thumb -> ARM long branch stub, PIC.  */
2698
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
2699
{
2700
  THUMB16_INSN (0x4778),       /* bx   pc */
2701
  THUMB16_INSN (0xe7fd),       /* b   .-2 */
2702
  ARM_INSN (0xe59fc000),       /* ldr  ip, [pc, #0] */
2703
  ARM_INSN (0xe08cf00f),       /* add  pc, ip, pc */
2704
  DATA_WORD (0, R_ARM_REL32, -4),     /* dcd  R_ARM_REL32(X) */
2705
};
2706
2707
/* Thumb -> Thumb long branch stub, PIC. Used on M-profile
2708
   architectures.  */
2709
static const insn_sequence elf32_arm_stub_long_branch_thumb_only_pic[] =
2710
{
2711
  THUMB16_INSN (0xb401),       /* push {r0} */
2712
  THUMB16_INSN (0x4802),       /* ldr  r0, [pc, #8] */
2713
  THUMB16_INSN (0x46fc),       /* mov  ip, pc */
2714
  THUMB16_INSN (0x4484),       /* add  ip, r0 */
2715
  THUMB16_INSN (0xbc01),       /* pop  {r0} */
2716
  THUMB16_INSN (0x4760),       /* bx   ip */
2717
  DATA_WORD (0, R_ARM_REL32, 4),     /* dcd  R_ARM_REL32(X) */
2718
};
2719
2720
/* V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
2721
   allowed.  */
2722
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
2723
{
2724
  THUMB16_INSN (0x4778),       /* bx   pc */
2725
  THUMB16_INSN (0xe7fd),       /* b   .-2 */
2726
  ARM_INSN (0xe59fc004),       /* ldr  ip, [pc, #4] */
2727
  ARM_INSN (0xe08fc00c),       /* add   ip, pc, ip */
2728
  ARM_INSN (0xe12fff1c),       /* bx   ip */
2729
  DATA_WORD (0, R_ARM_REL32, 0),     /* dcd  R_ARM_REL32(X) */
2730
};
2731
2732
/* Thumb2/ARM -> TLS trampoline.  Lowest common denominator, which is a
2733
   long PIC stub.  We can use r1 as a scratch -- and cannot use ip.  */
2734
static const insn_sequence elf32_arm_stub_long_branch_any_tls_pic[] =
2735
{
2736
  ARM_INSN (0xe59f1000),       /* ldr   r1, [pc] */
2737
  ARM_INSN (0xe08ff001),       /* add   pc, pc, r1 */
2738
  DATA_WORD (0, R_ARM_REL32, -4),    /* dcd   R_ARM_REL32(X-4) */
2739
};
2740
2741
/* V4T Thumb -> TLS trampoline.  lowest common denominator, which is a
2742
   long PIC stub.  We can use r1 as a scratch -- and cannot use ip.  */
2743
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_tls_pic[] =
2744
{
2745
  THUMB16_INSN (0x4778),       /* bx   pc */
2746
  THUMB16_INSN (0xe7fd),       /* b   .-2 */
2747
  ARM_INSN (0xe59f1000),       /* ldr  r1, [pc, #0] */
2748
  ARM_INSN (0xe081f00f),       /* add  pc, r1, pc */
2749
  DATA_WORD (0, R_ARM_REL32, -4),    /* dcd  R_ARM_REL32(X) */
2750
};
2751
2752
/* NaCl ARM -> ARM long branch stub.  */
2753
static const insn_sequence elf32_arm_stub_long_branch_arm_nacl[] =
2754
{
2755
  ARM_INSN (0xe59fc00c),    /* ldr  ip, [pc, #12] */
2756
  ARM_INSN (0xe3ccc13f),    /* bic  ip, ip, #0xc000000f */
2757
  ARM_INSN (0xe12fff1c),    /* bx ip */
2758
  ARM_INSN (0xe320f000),    /* nop */
2759
  ARM_INSN (0xe125be70),    /* bkpt 0x5be0 */
2760
  DATA_WORD (0, R_ARM_ABS32, 0),  /* dcd  R_ARM_ABS32(X) */
2761
  DATA_WORD (0, R_ARM_NONE, 0),   /* .word 0 */
2762
  DATA_WORD (0, R_ARM_NONE, 0),   /* .word 0 */
2763
};
2764
2765
/* NaCl ARM -> ARM long branch stub, PIC.  */
2766
static const insn_sequence elf32_arm_stub_long_branch_arm_nacl_pic[] =
2767
{
2768
  ARM_INSN (0xe59fc00c),    /* ldr  ip, [pc, #12] */
2769
  ARM_INSN (0xe08cc00f),    /* add  ip, ip, pc */
2770
  ARM_INSN (0xe3ccc13f),    /* bic  ip, ip, #0xc000000f */
2771
  ARM_INSN (0xe12fff1c),    /* bx ip */
2772
  ARM_INSN (0xe125be70),    /* bkpt 0x5be0 */
2773
  DATA_WORD (0, R_ARM_REL32, 8),  /* dcd  R_ARM_REL32(X+8) */
2774
  DATA_WORD (0, R_ARM_NONE, 0),   /* .word 0 */
2775
  DATA_WORD (0, R_ARM_NONE, 0),   /* .word 0 */
2776
};
2777
2778
/* Stub used for transition to secure state (aka SG veneer).  */
2779
static const insn_sequence elf32_arm_stub_cmse_branch_thumb_only[] =
2780
{
2781
  THUMB32_INSN (0xe97fe97f),    /* sg.  */
2782
  THUMB32_B_INSN (0xf000b800, -4),  /* b.w original_branch_dest.  */
2783
};
2784
2785
2786
/* Cortex-A8 erratum-workaround stubs.  */
2787
2788
/* Stub used for conditional branches (which may be beyond +/-1MB away, so we
2789
   can't use a conditional branch to reach this stub).  */
2790
2791
static const insn_sequence elf32_arm_stub_a8_veneer_b_cond[] =
2792
{
2793
  THUMB16_BCOND_INSN (0xd001),         /* b<cond>.n true.  */
2794
  THUMB32_B_INSN (0xf000b800, -4),     /* b.w insn_after_original_branch.  */
2795
  THUMB32_B_INSN (0xf000b800, -4)      /* true: b.w original_branch_dest.  */
2796
};
2797
2798
/* Stub used for b.w and bl.w instructions.  */
2799
2800
static const insn_sequence elf32_arm_stub_a8_veneer_b[] =
2801
{
2802
  THUMB32_B_INSN (0xf000b800, -4) /* b.w original_branch_dest.  */
2803
};
2804
2805
static const insn_sequence elf32_arm_stub_a8_veneer_bl[] =
2806
{
2807
  THUMB32_B_INSN (0xf000b800, -4) /* b.w original_branch_dest.  */
2808
};
2809
2810
/* Stub used for Thumb-2 blx.w instructions.  We modified the original blx.w
2811
   instruction (which switches to ARM mode) to point to this stub.  Jump to the
2812
   real destination using an ARM-mode branch.  */
2813
2814
static const insn_sequence elf32_arm_stub_a8_veneer_blx[] =
2815
{
2816
  ARM_REL_INSN (0xea000000, -8) /* b original_branch_dest.  */
2817
};
2818
2819
/* For each section group there can be a specially created linker section
2820
   to hold the stubs for that group.  The name of the stub section is based
2821
   upon the name of another section within that group with the suffix below
2822
   applied.
2823
2824
   PR 13049: STUB_SUFFIX used to be ".stub", but this allowed the user to
2825
   create what appeared to be a linker stub section when it actually
2826
   contained user code/data.  For example, consider this fragment:
2827
2828
     const char * stubborn_problems[] = { "np" };
2829
2830
   If this is compiled with "-fPIC -fdata-sections" then gcc produces a
2831
   section called:
2832
2833
     .data.rel.local.stubborn_problems
2834
2835
   This then causes problems in arm32_arm_build_stubs() as it triggers:
2836
2837
      // Ignore non-stub sections.
2838
      if (!strstr (stub_sec->name, STUB_SUFFIX))
2839
  continue;
2840
2841
   And so the section would be ignored instead of being processed.  Hence
2842
   the change in definition of STUB_SUFFIX to a name that cannot be a valid
2843
   C identifier.  */
2844
0
#define STUB_SUFFIX ".__stub"
2845
2846
/* One entry per long/short branch stub defined above.  */
2847
#define DEF_STUBS \
2848
  DEF_STUB (long_branch_any_any)  \
2849
  DEF_STUB (long_branch_v4t_arm_thumb) \
2850
  DEF_STUB (long_branch_thumb_only) \
2851
  DEF_STUB (long_branch_v4t_thumb_thumb)  \
2852
  DEF_STUB (long_branch_v4t_thumb_arm) \
2853
  DEF_STUB (short_branch_v4t_thumb_arm) \
2854
  DEF_STUB (long_branch_any_arm_pic) \
2855
  DEF_STUB (long_branch_any_thumb_pic) \
2856
  DEF_STUB (long_branch_v4t_thumb_thumb_pic) \
2857
  DEF_STUB (long_branch_v4t_arm_thumb_pic) \
2858
  DEF_STUB (long_branch_v4t_thumb_arm_pic) \
2859
  DEF_STUB (long_branch_thumb_only_pic) \
2860
  DEF_STUB (long_branch_any_tls_pic) \
2861
  DEF_STUB (long_branch_v4t_thumb_tls_pic) \
2862
  DEF_STUB (long_branch_arm_nacl) \
2863
  DEF_STUB (long_branch_arm_nacl_pic) \
2864
  DEF_STUB (cmse_branch_thumb_only) \
2865
  DEF_STUB (a8_veneer_b_cond) \
2866
  DEF_STUB (a8_veneer_b) \
2867
  DEF_STUB (a8_veneer_bl) \
2868
  DEF_STUB (a8_veneer_blx) \
2869
  DEF_STUB (long_branch_thumb2_only) \
2870
  DEF_STUB (long_branch_thumb2_only_pure)
2871
2872
#define DEF_STUB(x) arm_stub_##x,
2873
enum elf32_arm_stub_type
2874
{
2875
  arm_stub_none,
2876
  DEF_STUBS
2877
  max_stub_type
2878
};
2879
#undef DEF_STUB
2880
2881
/* Note the first a8_veneer type.  */
2882
const unsigned arm_stub_a8_veneer_lwm = arm_stub_a8_veneer_b_cond;
2883
2884
typedef struct
2885
{
2886
  const insn_sequence* template_sequence;
2887
  int template_size;
2888
} stub_def;
2889
2890
#define DEF_STUB(x) {elf32_arm_stub_##x, ARRAY_SIZE(elf32_arm_stub_##x)},
2891
static const stub_def stub_definitions[] =
2892
{
2893
  {NULL, 0},
2894
  DEF_STUBS
2895
};
2896
2897
struct elf32_arm_stub_hash_entry
2898
{
2899
  /* Base hash table entry structure.  */
2900
  struct bfd_hash_entry root;
2901
2902
  /* The stub section.  */
2903
  asection *stub_sec;
2904
2905
  /* Offset within stub_sec of the beginning of this stub.  */
2906
  bfd_vma stub_offset;
2907
2908
  /* Given the symbol's value and its section we can determine its final
2909
     value when building the stubs (so the stub knows where to jump).  */
2910
  bfd_vma target_value;
2911
  asection *target_section;
2912
2913
  /* Same as above but for the source of the branch to the stub.  Used for
2914
     Cortex-A8 erratum workaround to patch it to branch to the stub.  As
2915
     such, source section does not need to be recorded since Cortex-A8 erratum
2916
     workaround stubs are only generated when both source and target are in the
2917
     same section.  */
2918
  bfd_vma source_value;
2919
2920
  /* The instruction which caused this stub to be generated (only valid for
2921
     Cortex-A8 erratum workaround stubs at present).  */
2922
  unsigned long orig_insn;
2923
2924
  /* The stub type.  */
2925
  enum elf32_arm_stub_type stub_type;
2926
  /* Its encoding size in bytes.  */
2927
  int stub_size;
2928
  /* Its template.  */
2929
  const insn_sequence *stub_template;
2930
  /* The size of the template (number of entries).  */
2931
  int stub_template_size;
2932
2933
  /* The symbol table entry, if any, that this was derived from.  */
2934
  struct elf32_arm_link_hash_entry *h;
2935
2936
  /* Type of branch.  */
2937
  enum arm_st_branch_type branch_type;
2938
2939
  /* Where this stub is being called from, or, in the case of combined
2940
     stub sections, the first input section in the group.  */
2941
  asection *id_sec;
2942
2943
  /* The name for the local symbol at the start of this stub.  The
2944
     stub name in the hash table has to be unique; this does not, so
2945
     it can be friendlier.  */
2946
  char *output_name;
2947
};
2948
2949
/* Used to build a map of a section.  This is required for mixed-endian
2950
   code/data.  */
2951
2952
typedef struct elf32_elf_section_map
2953
{
2954
  bfd_vma vma;
2955
  char type;
2956
}
2957
elf32_arm_section_map;
2958
2959
/* Information about a VFP11 erratum veneer, or a branch to such a veneer.  */
2960
2961
typedef enum
2962
{
2963
  VFP11_ERRATUM_BRANCH_TO_ARM_VENEER,
2964
  VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER,
2965
  VFP11_ERRATUM_ARM_VENEER,
2966
  VFP11_ERRATUM_THUMB_VENEER
2967
}
2968
elf32_vfp11_erratum_type;
2969
2970
typedef struct elf32_vfp11_erratum_list
2971
{
2972
  struct elf32_vfp11_erratum_list *next;
2973
  bfd_vma vma;
2974
  union
2975
  {
2976
    struct
2977
    {
2978
      struct elf32_vfp11_erratum_list *veneer;
2979
      unsigned int vfp_insn;
2980
    } b;
2981
    struct
2982
    {
2983
      struct elf32_vfp11_erratum_list *branch;
2984
      unsigned int id;
2985
    } v;
2986
  } u;
2987
  elf32_vfp11_erratum_type type;
2988
}
2989
elf32_vfp11_erratum_list;
2990
2991
/* Information about a STM32L4XX erratum veneer, or a branch to such a
2992
   veneer.  */
2993
typedef enum
2994
{
2995
  STM32L4XX_ERRATUM_BRANCH_TO_VENEER,
2996
  STM32L4XX_ERRATUM_VENEER
2997
}
2998
elf32_stm32l4xx_erratum_type;
2999
3000
typedef struct elf32_stm32l4xx_erratum_list
3001
{
3002
  struct elf32_stm32l4xx_erratum_list *next;
3003
  bfd_vma vma;
3004
  union
3005
  {
3006
    struct
3007
    {
3008
      struct elf32_stm32l4xx_erratum_list *veneer;
3009
      unsigned int insn;
3010
    } b;
3011
    struct
3012
    {
3013
      struct elf32_stm32l4xx_erratum_list *branch;
3014
      unsigned int id;
3015
    } v;
3016
  } u;
3017
  elf32_stm32l4xx_erratum_type type;
3018
}
3019
elf32_stm32l4xx_erratum_list;
3020
3021
typedef enum
3022
{
3023
  DELETE_EXIDX_ENTRY,
3024
  INSERT_EXIDX_CANTUNWIND_AT_END
3025
}
3026
arm_unwind_edit_type;
3027
3028
/* A (sorted) list of edits to apply to an unwind table.  */
3029
typedef struct arm_unwind_table_edit
3030
{
3031
  arm_unwind_edit_type type;
3032
  /* Note: we sometimes want to insert an unwind entry corresponding to a
3033
     section different from the one we're currently writing out, so record the
3034
     (text) section this edit relates to here.  */
3035
  asection *linked_section;
3036
  unsigned int index;
3037
  struct arm_unwind_table_edit *next;
3038
}
3039
arm_unwind_table_edit;
3040
3041
typedef struct _arm_elf_section_data
3042
{
3043
  /* Information about mapping symbols.  */
3044
  struct bfd_elf_section_data elf;
3045
  unsigned int mapcount;
3046
  unsigned int mapsize;
3047
  elf32_arm_section_map *map;
3048
  /* Information about CPU errata.  */
3049
  unsigned int erratumcount;
3050
  elf32_vfp11_erratum_list *erratumlist;
3051
  unsigned int stm32l4xx_erratumcount;
3052
  elf32_stm32l4xx_erratum_list *stm32l4xx_erratumlist;
3053
  unsigned int additional_reloc_count;
3054
  /* Information about unwind tables.  */
3055
  union
3056
  {
3057
    /* Unwind info attached to a text section.  */
3058
    struct
3059
    {
3060
      asection *arm_exidx_sec;
3061
    } text;
3062
3063
    /* Unwind info attached to an .ARM.exidx section.  */
3064
    struct
3065
    {
3066
      arm_unwind_table_edit *unwind_edit_list;
3067
      arm_unwind_table_edit *unwind_edit_tail;
3068
    } exidx;
3069
  } u;
3070
}
3071
_arm_elf_section_data;
3072
3073
#define elf32_arm_section_data(sec) \
3074
0
  ((_arm_elf_section_data *) elf_section_data (sec))
3075
3076
/* A fix which might be required for Cortex-A8 Thumb-2 branch/TLB erratum.
3077
   These fixes are subject to a relaxation procedure (in elf32_arm_size_stubs),
3078
   so may be created multiple times: we use an array of these entries whilst
3079
   relaxing which we can refresh easily, then create stubs for each potentially
3080
   erratum-triggering instruction once we've settled on a solution.  */
3081
3082
struct a8_erratum_fix
3083
{
3084
  bfd *input_bfd;
3085
  asection *section;
3086
  bfd_vma offset;
3087
  bfd_vma target_offset;
3088
  unsigned long orig_insn;
3089
  char *stub_name;
3090
  enum elf32_arm_stub_type stub_type;
3091
  enum arm_st_branch_type branch_type;
3092
};
3093
3094
/* A table of relocs applied to branches which might trigger Cortex-A8
3095
   erratum.  */
3096
3097
struct a8_erratum_reloc
3098
{
3099
  bfd_vma from;
3100
  bfd_vma destination;
3101
  struct elf32_arm_link_hash_entry *hash;
3102
  const char *sym_name;
3103
  unsigned int r_type;
3104
  enum arm_st_branch_type branch_type;
3105
  bool non_a8_stub;
3106
};
3107
3108
/* The size of the thread control block.  */
3109
#define TCB_SIZE  8
3110
3111
/* ARM-specific information about a PLT entry, over and above the usual
3112
   gotplt_union.  */
3113
struct arm_plt_info
3114
{
3115
  /* We reference count Thumb references to a PLT entry separately,
3116
     so that we can emit the Thumb trampoline only if needed.  */
3117
  bfd_signed_vma thumb_refcount;
3118
3119
  /* Some references from Thumb code may be eliminated by BL->BLX
3120
     conversion, so record them separately.  */
3121
  bfd_signed_vma maybe_thumb_refcount;
3122
3123
  /* How many of the recorded PLT accesses were from non-call relocations.
3124
     This information is useful when deciding whether anything takes the
3125
     address of an STT_GNU_IFUNC PLT.  A value of 0 means that all
3126
     non-call references to the function should resolve directly to the
3127
     real runtime target.  */
3128
  unsigned int noncall_refcount;
3129
3130
  /* Since PLT entries have variable size if the Thumb prologue is
3131
     used, we need to record the index into .got.plt instead of
3132
     recomputing it from the PLT offset.  */
3133
  bfd_signed_vma got_offset;
3134
};
3135
3136
/* Information about an .iplt entry for a local STT_GNU_IFUNC symbol.  */
3137
struct arm_local_iplt_info
3138
{
3139
  /* The information that is usually found in the generic ELF part of
3140
     the hash table entry.  */
3141
  union gotplt_union root;
3142
3143
  /* The information that is usually found in the ARM-specific part of
3144
     the hash table entry.  */
3145
  struct arm_plt_info arm;
3146
3147
  /* A list of all potential dynamic relocations against this symbol.  */
3148
  struct elf_dyn_relocs *dyn_relocs;
3149
};
3150
3151
/* Structure to handle FDPIC support for local functions.  */
3152
struct fdpic_local
3153
{
3154
  unsigned int funcdesc_cnt;
3155
  unsigned int gotofffuncdesc_cnt;
3156
  int funcdesc_offset;
3157
};
3158
3159
struct elf_arm_obj_tdata
3160
{
3161
  struct elf_obj_tdata root;
3162
3163
  /* Zero to warn when linking objects with incompatible enum sizes.  */
3164
  int no_enum_size_warning;
3165
3166
  /* Zero to warn when linking objects with incompatible wchar_t sizes.  */
3167
  int no_wchar_size_warning;
3168
3169
  /* The number of entries in each of the arrays in this strcuture.
3170
     Used to avoid buffer overruns.  */
3171
  bfd_size_type num_entries;
3172
3173
  /* tls_type for each local got entry.  */
3174
  char *local_got_tls_type;
3175
3176
  /* GOTPLT entries for TLS descriptors.  */
3177
  bfd_vma *local_tlsdesc_gotent;
3178
3179
  /* Information for local symbols that need entries in .iplt.  */
3180
  struct arm_local_iplt_info **local_iplt;
3181
3182
  /* Maintains FDPIC counters and funcdesc info.  */
3183
  struct fdpic_local *local_fdpic_cnts;
3184
};
3185
3186
#define elf_arm_tdata(bfd) \
3187
0
  ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
3188
3189
#define elf32_arm_num_entries(bfd) \
3190
0
  (elf_arm_tdata (bfd)->num_entries)
3191
3192
#define elf32_arm_local_got_tls_type(bfd) \
3193
0
  (elf_arm_tdata (bfd)->local_got_tls_type)
3194
3195
#define elf32_arm_local_tlsdesc_gotent(bfd) \
3196
0
  (elf_arm_tdata (bfd)->local_tlsdesc_gotent)
3197
3198
#define elf32_arm_local_iplt(bfd) \
3199
0
  (elf_arm_tdata (bfd)->local_iplt)
3200
3201
#define elf32_arm_local_fdpic_cnts(bfd) \
3202
0
  (elf_arm_tdata (bfd)->local_fdpic_cnts)
3203
3204
#define is_arm_elf(bfd) \
3205
6
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
3206
4
   && elf_tdata (bfd) != NULL \
3207
6
   && elf_object_id (bfd) == ARM_ELF_DATA)
3208
3209
static bool
3210
elf32_arm_mkobject (bfd *abfd)
3211
929k
{
3212
929k
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_arm_obj_tdata));
3213
929k
}
3214
3215
0
#define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
3216
3217
/* Structure to handle FDPIC support for extern functions.  */
3218
struct fdpic_global {
3219
  unsigned int gotofffuncdesc_cnt;
3220
  unsigned int gotfuncdesc_cnt;
3221
  unsigned int funcdesc_cnt;
3222
  int funcdesc_offset;
3223
  int gotfuncdesc_offset;
3224
};
3225
3226
/* Arm ELF linker hash entry.  */
3227
struct elf32_arm_link_hash_entry
3228
{
3229
  struct elf_link_hash_entry root;
3230
3231
  /* ARM-specific PLT information.  */
3232
  struct arm_plt_info plt;
3233
3234
0
#define GOT_UNKNOWN 0
3235
0
#define GOT_NORMAL  1
3236
0
#define GOT_TLS_GD  2
3237
0
#define GOT_TLS_IE  4
3238
0
#define GOT_TLS_GDESC 8
3239
0
#define GOT_TLS_GD_ANY_P(type)  ((type & GOT_TLS_GD) || (type & GOT_TLS_GDESC))
3240
  unsigned int tls_type : 8;
3241
3242
  /* True if the symbol's PLT entry is in .iplt rather than .plt.  */
3243
  unsigned int is_iplt : 1;
3244
3245
  unsigned int unused : 23;
3246
3247
  /* Offset of the GOTPLT entry reserved for the TLS descriptor,
3248
     starting at the end of the jump table.  */
3249
  bfd_vma tlsdesc_got;
3250
3251
  /* The symbol marking the real symbol location for exported thumb
3252
     symbols with Arm stubs.  */
3253
  struct elf_link_hash_entry *export_glue;
3254
3255
  /* A pointer to the most recently used stub hash entry against this
3256
     symbol.  */
3257
  struct elf32_arm_stub_hash_entry *stub_cache;
3258
3259
  /* Counter for FDPIC relocations against this symbol.  */
3260
  struct fdpic_global fdpic_cnts;
3261
};
3262
3263
/* Traverse an arm ELF linker hash table.  */
3264
#define elf32_arm_link_hash_traverse(table, func, info)     \
3265
  (elf_link_hash_traverse           \
3266
   (&(table)->root,             \
3267
    (bool (*) (struct elf_link_hash_entry *, void *)) (func),   \
3268
    (info)))
3269
3270
/* Get the ARM elf linker hash table from a link_info structure.  */
3271
#define elf32_arm_hash_table(p) \
3272
0
  ((is_elf_hash_table ((p)->hash)          \
3273
0
    && elf_hash_table_id (elf_hash_table (p)) == ARM_ELF_DATA)   \
3274
0
   ? (struct elf32_arm_link_hash_table *) (p)->hash : NULL)
3275
3276
#define arm_stub_hash_lookup(table, string, create, copy) \
3277
0
  ((struct elf32_arm_stub_hash_entry *) \
3278
0
   bfd_hash_lookup ((table), (string), (create), (copy)))
3279
3280
/* Array to keep track of which stub sections have been created, and
3281
   information on stub grouping.  */
3282
struct map_stub
3283
{
3284
  /* This is the section to which stubs in the group will be
3285
     attached.  */
3286
  asection *link_sec;
3287
  /* The stub section.  */
3288
  asection *stub_sec;
3289
};
3290
3291
#define elf32_arm_compute_jump_table_size(htab) \
3292
0
  ((htab)->next_tls_desc_index * 4)
3293
3294
/* ARM ELF linker hash table.  */
3295
struct elf32_arm_link_hash_table
3296
{
3297
  /* The main hash table.  */
3298
  struct elf_link_hash_table root;
3299
3300
  /* The size in bytes of the section containing the Thumb-to-ARM glue.  */
3301
  bfd_size_type thumb_glue_size;
3302
3303
  /* The size in bytes of the section containing the ARM-to-Thumb glue.  */
3304
  bfd_size_type arm_glue_size;
3305
3306
  /* The size in bytes of section containing the ARMv4 BX veneers.  */
3307
  bfd_size_type bx_glue_size;
3308
3309
  /* Offsets of ARMv4 BX veneers.  Bit1 set if present, and Bit0 set when
3310
     veneer has been populated.  */
3311
  bfd_vma bx_glue_offset[15];
3312
3313
  /* The size in bytes of the section containing glue for VFP11 erratum
3314
     veneers.  */
3315
  bfd_size_type vfp11_erratum_glue_size;
3316
3317
 /* The size in bytes of the section containing glue for STM32L4XX erratum
3318
     veneers.  */
3319
  bfd_size_type stm32l4xx_erratum_glue_size;
3320
3321
  /* A table of fix locations for Cortex-A8 Thumb-2 branch/TLB erratum.  This
3322
     holds Cortex-A8 erratum fix locations between elf32_arm_size_stubs() and
3323
     elf32_arm_write_section().  */
3324
  struct a8_erratum_fix *a8_erratum_fixes;
3325
  unsigned int num_a8_erratum_fixes;
3326
3327
  /* An arbitrary input BFD chosen to hold the glue sections.  */
3328
  bfd * bfd_of_glue_owner;
3329
3330
  /* Nonzero to output a BE8 image.  */
3331
  int byteswap_code;
3332
3333
  /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
3334
     Nonzero if R_ARM_TARGET1 means R_ARM_REL32.  */
3335
  int target1_is_rel;
3336
3337
  /* The relocation to use for R_ARM_TARGET2 relocations.  */
3338
  int target2_reloc;
3339
3340
  /* 0 = Ignore R_ARM_V4BX.
3341
     1 = Convert BX to MOV PC.
3342
     2 = Generate v4 interworing stubs.  */
3343
  int fix_v4bx;
3344
3345
  /* Whether we should fix the Cortex-A8 Thumb-2 branch/TLB erratum.  */
3346
  int fix_cortex_a8;
3347
3348
  /* Whether we should fix the ARM1176 BLX immediate issue.  */
3349
  int fix_arm1176;
3350
3351
  /* Nonzero if the ARM/Thumb BLX instructions are available for use.  */
3352
  int use_blx;
3353
3354
  /* What sort of code sequences we should look for which may trigger the
3355
     VFP11 denorm erratum.  */
3356
  bfd_arm_vfp11_fix vfp11_fix;
3357
3358
  /* Global counter for the number of fixes we have emitted.  */
3359
  int num_vfp11_fixes;
3360
3361
  /* What sort of code sequences we should look for which may trigger the
3362
     STM32L4XX erratum.  */
3363
  bfd_arm_stm32l4xx_fix stm32l4xx_fix;
3364
3365
  /* Global counter for the number of fixes we have emitted.  */
3366
  int num_stm32l4xx_fixes;
3367
3368
  /* Nonzero to force PIC branch veneers.  */
3369
  int pic_veneer;
3370
3371
  /* The number of bytes in the initial entry in the PLT.  */
3372
  bfd_size_type plt_header_size;
3373
3374
  /* The number of bytes in the subsequent PLT etries.  */
3375
  bfd_size_type plt_entry_size;
3376
3377
  /* True if the target uses REL relocations.  */
3378
  bool use_rel;
3379
3380
  /* Nonzero if import library must be a secure gateway import library
3381
     as per ARMv8-M Security Extensions.  */
3382
  int cmse_implib;
3383
3384
  /* The import library whose symbols' address must remain stable in
3385
     the import library generated.  */
3386
  bfd *in_implib_bfd;
3387
3388
  /* The index of the next unused R_ARM_TLS_DESC slot in .rel.plt.  */
3389
  bfd_vma next_tls_desc_index;
3390
3391
  /* How many R_ARM_TLS_DESC relocations were generated so far.  */
3392
  bfd_vma num_tls_desc;
3393
3394
  /* The (unloaded but important) VxWorks .rela.plt.unloaded section.  */
3395
  asection *srelplt2;
3396
3397
  /* Offset in .plt section of tls_arm_trampoline.  */
3398
  bfd_vma tls_trampoline;
3399
3400
  /* Data for R_ARM_TLS_LDM32/R_ARM_TLS_LDM32_FDPIC relocations.  */
3401
  union
3402
  {
3403
    bfd_signed_vma refcount;
3404
    bfd_vma offset;
3405
  } tls_ldm_got;
3406
3407
  /* For convenience in allocate_dynrelocs.  */
3408
  bfd * obfd;
3409
3410
  /* The amount of space used by the reserved portion of the sgotplt
3411
     section, plus whatever space is used by the jump slots.  */
3412
  bfd_vma sgotplt_jump_table_size;
3413
3414
  /* The stub hash table.  */
3415
  struct bfd_hash_table stub_hash_table;
3416
3417
  /* Linker stub bfd.  */
3418
  bfd *stub_bfd;
3419
3420
  /* Linker call-backs.  */
3421
  asection * (*add_stub_section) (const char *, asection *, asection *,
3422
          unsigned int);
3423
  void (*layout_sections_again) (void);
3424
3425
  /* Array to keep track of which stub sections have been created, and
3426
     information on stub grouping.  */
3427
  struct map_stub *stub_group;
3428
3429
  /* Input stub section holding secure gateway veneers.  */
3430
  asection *cmse_stub_sec;
3431
3432
  /* Offset in cmse_stub_sec where new SG veneers (not in input import library)
3433
     start to be allocated.  */
3434
  bfd_vma new_cmse_stub_offset;
3435
3436
  /* Number of elements in stub_group.  */
3437
  unsigned int top_id;
3438
3439
  /* Assorted information used by elf32_arm_size_stubs.  */
3440
  unsigned int bfd_count;
3441
  unsigned int top_index;
3442
  asection **input_list;
3443
3444
  /* True if the target system uses FDPIC. */
3445
  int fdpic_p;
3446
3447
  /* Fixup section. Used for FDPIC.  */
3448
  asection *srofixup;
3449
};
3450
3451
/* Add an FDPIC read-only fixup.  */
3452
static void
3453
arm_elf_add_rofixup (bfd *output_bfd, asection *srofixup, bfd_vma offset)
3454
0
{
3455
0
  bfd_vma fixup_offset;
3456
3457
0
  fixup_offset = srofixup->reloc_count++ * 4;
3458
0
  BFD_ASSERT (fixup_offset < srofixup->size);
3459
0
  bfd_put_32 (output_bfd, offset, srofixup->contents + fixup_offset);
3460
0
}
3461
3462
static inline int
3463
ctz (unsigned int mask)
3464
0
{
3465
0
#if GCC_VERSION >= 3004
3466
0
  return __builtin_ctz (mask);
3467
#else
3468
  unsigned int i;
3469
3470
  for (i = 0; i < 8 * sizeof (mask); i++)
3471
    {
3472
      if (mask & 0x1)
3473
  break;
3474
      mask = (mask >> 1);
3475
    }
3476
  return i;
3477
#endif
3478
0
}
3479
3480
static inline int
3481
elf32_arm_popcount (unsigned int mask)
3482
0
{
3483
0
#if GCC_VERSION >= 3004
3484
0
  return __builtin_popcount (mask);
3485
#else
3486
  unsigned int i;
3487
  int sum = 0;
3488
3489
  for (i = 0; i < 8 * sizeof (mask); i++)
3490
    {
3491
      if (mask & 0x1)
3492
  sum++;
3493
      mask = (mask >> 1);
3494
    }
3495
  return sum;
3496
#endif
3497
0
}
3498
3499
static void elf32_arm_add_dynreloc (bfd *output_bfd, struct bfd_link_info *info,
3500
            asection *sreloc, Elf_Internal_Rela *rel);
3501
3502
static void
3503
arm_elf_fill_funcdesc (bfd *output_bfd,
3504
           struct bfd_link_info *info,
3505
           int *funcdesc_offset,
3506
           int dynindx,
3507
           int offset,
3508
           bfd_vma addr,
3509
           bfd_vma dynreloc_value,
3510
           bfd_vma seg)
3511
0
{
3512
0
  if ((*funcdesc_offset & 1) == 0)
3513
0
    {
3514
0
      struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
3515
0
      asection *sgot = globals->root.sgot;
3516
3517
0
      if (bfd_link_pic (info))
3518
0
  {
3519
0
    asection *srelgot = globals->root.srelgot;
3520
0
    Elf_Internal_Rela outrel;
3521
3522
0
    outrel.r_info = ELF32_R_INFO (dynindx, R_ARM_FUNCDESC_VALUE);
3523
0
    outrel.r_offset = sgot->output_section->vma + sgot->output_offset + offset;
3524
0
    outrel.r_addend = 0;
3525
3526
0
    elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
3527
0
    bfd_put_32 (output_bfd, addr, sgot->contents + offset);
3528
0
    bfd_put_32 (output_bfd, seg, sgot->contents + offset + 4);
3529
0
  }
3530
0
      else
3531
0
  {
3532
0
    struct elf_link_hash_entry *hgot = globals->root.hgot;
3533
0
    bfd_vma got_value = hgot->root.u.def.value
3534
0
      + hgot->root.u.def.section->output_section->vma
3535
0
      + hgot->root.u.def.section->output_offset;
3536
3537
0
    arm_elf_add_rofixup (output_bfd, globals->srofixup,
3538
0
             sgot->output_section->vma + sgot->output_offset
3539
0
             + offset);
3540
0
    arm_elf_add_rofixup (output_bfd, globals->srofixup,
3541
0
             sgot->output_section->vma + sgot->output_offset
3542
0
             + offset + 4);
3543
0
    bfd_put_32 (output_bfd, dynreloc_value, sgot->contents + offset);
3544
0
    bfd_put_32 (output_bfd, got_value, sgot->contents + offset + 4);
3545
0
  }
3546
0
      *funcdesc_offset |= 1;
3547
0
    }
3548
0
}
3549
3550
/* Create an entry in an ARM ELF linker hash table.  */
3551
3552
static struct bfd_hash_entry *
3553
elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
3554
           struct bfd_hash_table * table,
3555
           const char * string)
3556
0
{
3557
0
  struct elf32_arm_link_hash_entry * ret =
3558
0
    (struct elf32_arm_link_hash_entry *) entry;
3559
3560
  /* Allocate the structure if it has not already been allocated by a
3561
     subclass.  */
3562
0
  if (ret == NULL)
3563
0
    ret = (struct elf32_arm_link_hash_entry *)
3564
0
  bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
3565
0
  if (ret == NULL)
3566
0
    return (struct bfd_hash_entry *) ret;
3567
3568
  /* Call the allocation method of the superclass.  */
3569
0
  ret = ((struct elf32_arm_link_hash_entry *)
3570
0
   _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3571
0
             table, string));
3572
0
  if (ret != NULL)
3573
0
    {
3574
0
      ret->tls_type = GOT_UNKNOWN;
3575
0
      ret->tlsdesc_got = (bfd_vma) -1;
3576
0
      ret->plt.thumb_refcount = 0;
3577
0
      ret->plt.maybe_thumb_refcount = 0;
3578
0
      ret->plt.noncall_refcount = 0;
3579
0
      ret->plt.got_offset = -1;
3580
0
      ret->is_iplt = false;
3581
0
      ret->export_glue = NULL;
3582
3583
0
      ret->stub_cache = NULL;
3584
3585
0
      ret->fdpic_cnts.gotofffuncdesc_cnt = 0;
3586
0
      ret->fdpic_cnts.gotfuncdesc_cnt = 0;
3587
0
      ret->fdpic_cnts.funcdesc_cnt = 0;
3588
0
      ret->fdpic_cnts.funcdesc_offset = -1;
3589
0
      ret->fdpic_cnts.gotfuncdesc_offset = -1;
3590
0
    }
3591
3592
0
  return (struct bfd_hash_entry *) ret;
3593
0
}
3594
3595
/* Ensure that we have allocated bookkeeping structures for ABFD's local
3596
   symbols.  */
3597
3598
static bool
3599
elf32_arm_allocate_local_sym_info (bfd *abfd)
3600
0
{
3601
0
  if (elf_local_got_refcounts (abfd) == NULL)
3602
0
    {
3603
0
      bfd_size_type num_syms;
3604
3605
0
      elf32_arm_num_entries (abfd) = 0;
3606
3607
      /* Whilst it might be tempting to allocate a single block of memory and
3608
   then divide it up amoungst the arrays in the elf_arm_obj_tdata
3609
   structure, this interferes with the work of memory checkers looking
3610
   for buffer overruns.  So allocate each array individually.  */
3611
3612
0
      num_syms = elf_tdata (abfd)->symtab_hdr.sh_info;
3613
3614
0
      elf_local_got_refcounts (abfd) = bfd_zalloc
3615
0
  (abfd, num_syms * sizeof (* elf_local_got_refcounts (abfd)));
3616
3617
0
      if (elf_local_got_refcounts (abfd) == NULL)
3618
0
  return false;
3619
3620
0
      elf32_arm_local_tlsdesc_gotent (abfd) = bfd_zalloc
3621
0
  (abfd, num_syms * sizeof (* elf32_arm_local_tlsdesc_gotent (abfd)));
3622
3623
0
      if (elf32_arm_local_tlsdesc_gotent (abfd) == NULL)
3624
0
  return false;
3625
3626
0
      elf32_arm_local_iplt (abfd) = bfd_zalloc
3627
0
  (abfd, num_syms * sizeof (* elf32_arm_local_iplt (abfd)));
3628
3629
0
      if (elf32_arm_local_iplt (abfd) == NULL)
3630
0
  return false;
3631
3632
0
      elf32_arm_local_fdpic_cnts (abfd) = bfd_zalloc
3633
0
  (abfd, num_syms * sizeof (* elf32_arm_local_fdpic_cnts (abfd)));
3634
3635
0
      if (elf32_arm_local_fdpic_cnts (abfd) == NULL)
3636
0
  return false;
3637
3638
0
      elf32_arm_local_got_tls_type (abfd) = bfd_zalloc
3639
0
  (abfd, num_syms * sizeof (* elf32_arm_local_got_tls_type (abfd)));
3640
3641
0
      if (elf32_arm_local_got_tls_type (abfd) == NULL)
3642
0
  return false;
3643
3644
0
      elf32_arm_num_entries (abfd) = num_syms;
3645
3646
0
#if GCC_VERSION >= 3000
3647
0
      BFD_ASSERT (__alignof__ (*elf32_arm_local_tlsdesc_gotent (abfd))
3648
0
      <= __alignof__ (*elf_local_got_refcounts (abfd)));
3649
0
      BFD_ASSERT (__alignof__ (*elf32_arm_local_iplt (abfd))
3650
0
      <= __alignof__ (*elf32_arm_local_tlsdesc_gotent (abfd)));
3651
0
      BFD_ASSERT (__alignof__ (*elf32_arm_local_fdpic_cnts (abfd))
3652
0
      <= __alignof__ (*elf32_arm_local_iplt (abfd)));
3653
0
      BFD_ASSERT (__alignof__ (*elf32_arm_local_got_tls_type (abfd))
3654
0
      <= __alignof__ (*elf32_arm_local_fdpic_cnts (abfd)));
3655
0
#endif
3656
0
    }
3657
0
  return true;
3658
0
}
3659
3660
/* Return the .iplt information for local symbol R_SYMNDX, which belongs
3661
   to input bfd ABFD.  Create the information if it doesn't already exist.
3662
   Return null if an allocation fails.  */
3663
3664
static struct arm_local_iplt_info *
3665
elf32_arm_create_local_iplt (bfd *abfd, unsigned long r_symndx)
3666
0
{
3667
0
  struct arm_local_iplt_info **ptr;
3668
3669
0
  if (!elf32_arm_allocate_local_sym_info (abfd))
3670
0
    return NULL;
3671
3672
0
  BFD_ASSERT (r_symndx < elf_tdata (abfd)->symtab_hdr.sh_info);
3673
0
  BFD_ASSERT (r_symndx < elf32_arm_num_entries (abfd));
3674
0
  ptr = &elf32_arm_local_iplt (abfd)[r_symndx];
3675
0
  if (*ptr == NULL)
3676
0
    *ptr = bfd_zalloc (abfd, sizeof (**ptr));
3677
0
  return *ptr;
3678
0
}
3679
3680
/* Try to obtain PLT information for the symbol with index R_SYMNDX
3681
   in ABFD's symbol table.  If the symbol is global, H points to its
3682
   hash table entry, otherwise H is null.
3683
3684
   Return true if the symbol does have PLT information.  When returning
3685
   true, point *ROOT_PLT at the target-independent reference count/offset
3686
   union and *ARM_PLT at the ARM-specific information.  */
3687
3688
static bool
3689
elf32_arm_get_plt_info (bfd *abfd, struct elf32_arm_link_hash_table *globals,
3690
      struct elf32_arm_link_hash_entry *h,
3691
      unsigned long r_symndx, union gotplt_union **root_plt,
3692
      struct arm_plt_info **arm_plt)
3693
0
{
3694
0
  struct arm_local_iplt_info *local_iplt;
3695
3696
0
  if (globals->root.splt == NULL && globals->root.iplt == NULL)
3697
0
    return false;
3698
3699
0
  if (h != NULL)
3700
0
    {
3701
0
      *root_plt = &h->root.plt;
3702
0
      *arm_plt = &h->plt;
3703
0
      return true;
3704
0
    }
3705
3706
0
  if (elf32_arm_local_iplt (abfd) == NULL)
3707
0
    return false;
3708
3709
0
  if (r_symndx >= elf32_arm_num_entries (abfd))
3710
0
    return false;
3711
3712
0
  local_iplt = elf32_arm_local_iplt (abfd)[r_symndx];
3713
0
  if (local_iplt == NULL)
3714
0
    return false;
3715
3716
0
  *root_plt = &local_iplt->root;
3717
0
  *arm_plt = &local_iplt->arm;
3718
0
  return true;
3719
0
}
3720
3721
static bool using_thumb_only (struct elf32_arm_link_hash_table *globals);
3722
3723
/* Return true if the PLT described by ARM_PLT requires a Thumb stub
3724
   before it.  */
3725
3726
static bool
3727
elf32_arm_plt_needs_thumb_stub_p (struct bfd_link_info *info,
3728
          struct arm_plt_info *arm_plt)
3729
0
{
3730
0
  struct elf32_arm_link_hash_table *htab;
3731
3732
0
  htab = elf32_arm_hash_table (info);
3733
3734
0
  return (!using_thumb_only (htab) && (arm_plt->thumb_refcount != 0
3735
0
    || (!htab->use_blx && arm_plt->maybe_thumb_refcount != 0)));
3736
0
}
3737
3738
/* Return a pointer to the head of the dynamic reloc list that should
3739
   be used for local symbol ISYM, which is symbol number R_SYMNDX in
3740
   ABFD's symbol table.  Return null if an error occurs.  */
3741
3742
static struct elf_dyn_relocs **
3743
elf32_arm_get_local_dynreloc_list (bfd *abfd, unsigned long r_symndx,
3744
           Elf_Internal_Sym *isym)
3745
0
{
3746
0
  if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3747
0
    {
3748
0
      struct arm_local_iplt_info *local_iplt;
3749
3750
0
      local_iplt = elf32_arm_create_local_iplt (abfd, r_symndx);
3751
0
      if (local_iplt == NULL)
3752
0
  return NULL;
3753
0
      return &local_iplt->dyn_relocs;
3754
0
    }
3755
0
  else
3756
0
    {
3757
      /* Track dynamic relocs needed for local syms too.
3758
   We really need local syms available to do this
3759
   easily.  Oh well.  */
3760
0
      asection *s;
3761
0
      void *vpp;
3762
3763
0
      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3764
0
      if (s == NULL)
3765
0
  return NULL;
3766
3767
0
      vpp = &elf_section_data (s)->local_dynrel;
3768
0
      return (struct elf_dyn_relocs **) vpp;
3769
0
    }
3770
0
}
3771
3772
/* Initialize an entry in the stub hash table.  */
3773
3774
static struct bfd_hash_entry *
3775
stub_hash_newfunc (struct bfd_hash_entry *entry,
3776
       struct bfd_hash_table *table,
3777
       const char *string)
3778
0
{
3779
  /* Allocate the structure if it has not already been allocated by a
3780
     subclass.  */
3781
0
  if (entry == NULL)
3782
0
    {
3783
0
      entry = (struct bfd_hash_entry *)
3784
0
    bfd_hash_allocate (table, sizeof (struct elf32_arm_stub_hash_entry));
3785
0
      if (entry == NULL)
3786
0
  return entry;
3787
0
    }
3788
3789
  /* Call the allocation method of the superclass.  */
3790
0
  entry = bfd_hash_newfunc (entry, table, string);
3791
0
  if (entry != NULL)
3792
0
    {
3793
0
      struct elf32_arm_stub_hash_entry *eh;
3794
3795
      /* Initialize the local fields.  */
3796
0
      eh = (struct elf32_arm_stub_hash_entry *) entry;
3797
0
      eh->stub_sec = NULL;
3798
0
      eh->stub_offset = (bfd_vma) -1;
3799
0
      eh->source_value = 0;
3800
0
      eh->target_value = 0;
3801
0
      eh->target_section = NULL;
3802
0
      eh->orig_insn = 0;
3803
0
      eh->stub_type = arm_stub_none;
3804
0
      eh->stub_size = 0;
3805
0
      eh->stub_template = NULL;
3806
0
      eh->stub_template_size = -1;
3807
0
      eh->h = NULL;
3808
0
      eh->id_sec = NULL;
3809
0
      eh->output_name = NULL;
3810
0
    }
3811
3812
0
  return entry;
3813
0
}
3814
3815
/* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
3816
   shortcuts to them in our hash table.  */
3817
3818
static bool
3819
create_got_section (bfd *dynobj, struct bfd_link_info *info)
3820
0
{
3821
0
  struct elf32_arm_link_hash_table *htab;
3822
3823
0
  htab = elf32_arm_hash_table (info);
3824
0
  if (htab == NULL)
3825
0
    return false;
3826
3827
0
  if (! _bfd_elf_create_got_section (dynobj, info))
3828
0
    return false;
3829
3830
  /* Also create .rofixup.  */
3831
0
  if (htab->fdpic_p)
3832
0
    {
3833
0
      htab->srofixup = bfd_make_section_with_flags (dynobj, ".rofixup",
3834
0
                (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3835
0
                 | SEC_IN_MEMORY | SEC_LINKER_CREATED | SEC_READONLY));
3836
0
      if (htab->srofixup == NULL
3837
0
    || !bfd_set_section_alignment (htab->srofixup, 2))
3838
0
  return false;
3839
0
    }
3840
3841
0
  return true;
3842
0
}
3843
3844
/* Create the .iplt, .rel(a).iplt and .igot.plt sections.  */
3845
3846
static bool
3847
create_ifunc_sections (struct bfd_link_info *info)
3848
0
{
3849
0
  struct elf32_arm_link_hash_table *htab;
3850
0
  const struct elf_backend_data *bed;
3851
0
  bfd *dynobj;
3852
0
  asection *s;
3853
0
  flagword flags;
3854
3855
0
  htab = elf32_arm_hash_table (info);
3856
0
  dynobj = htab->root.dynobj;
3857
0
  bed = get_elf_backend_data (dynobj);
3858
0
  flags = bed->dynamic_sec_flags;
3859
3860
0
  if (htab->root.iplt == NULL)
3861
0
    {
3862
0
      s = bfd_make_section_anyway_with_flags (dynobj, ".iplt",
3863
0
                flags | SEC_READONLY | SEC_CODE);
3864
0
      if (s == NULL
3865
0
    || !bfd_set_section_alignment (s, bed->plt_alignment))
3866
0
  return false;
3867
0
      htab->root.iplt = s;
3868
0
    }
3869
3870
0
  if (htab->root.irelplt == NULL)
3871
0
    {
3872
0
      s = bfd_make_section_anyway_with_flags (dynobj,
3873
0
                RELOC_SECTION (htab, ".iplt"),
3874
0
                flags | SEC_READONLY);
3875
0
      if (s == NULL
3876
0
    || !bfd_set_section_alignment (s, bed->s->log_file_align))
3877
0
  return false;
3878
0
      htab->root.irelplt = s;
3879
0
    }
3880
3881
0
  if (htab->root.igotplt == NULL)
3882
0
    {
3883
0
      s = bfd_make_section_anyway_with_flags (dynobj, ".igot.plt", flags);
3884
0
      if (s == NULL
3885
0
    || !bfd_set_section_alignment (s, bed->s->log_file_align))
3886
0
  return false;
3887
0
      htab->root.igotplt = s;
3888
0
    }
3889
0
  return true;
3890
0
}
3891
3892
/* Determine if we're dealing with a Thumb only architecture.  */
3893
3894
static bool
3895
using_thumb_only (struct elf32_arm_link_hash_table *globals)
3896
0
{
3897
0
  int arch;
3898
0
  int profile = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3899
0
            Tag_CPU_arch_profile);
3900
3901
0
  if (profile)
3902
0
    return profile == 'M';
3903
3904
0
  arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
3905
3906
  /* Force return logic to be reviewed for each new architecture.  */
3907
0
  BFD_ASSERT (arch <= TAG_CPU_ARCH_V8_1M_MAIN);
3908
3909
0
  if (arch == TAG_CPU_ARCH_V6_M
3910
0
      || arch == TAG_CPU_ARCH_V6S_M
3911
0
      || arch == TAG_CPU_ARCH_V7E_M
3912
0
      || arch == TAG_CPU_ARCH_V8M_BASE
3913
0
      || arch == TAG_CPU_ARCH_V8M_MAIN
3914
0
      || arch == TAG_CPU_ARCH_V8_1M_MAIN)
3915
0
    return true;
3916
3917
0
  return false;
3918
0
}
3919
3920
/* Determine if we're dealing with a Thumb-2 object.  */
3921
3922
static bool
3923
using_thumb2 (struct elf32_arm_link_hash_table *globals)
3924
0
{
3925
0
  int arch;
3926
0
  int thumb_isa = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3927
0
              Tag_THUMB_ISA_use);
3928
3929
  /* No use of thumb permitted, or a legacy thumb-1/2 definition.  */
3930
0
  if (thumb_isa < 3)
3931
0
    return thumb_isa == 2;
3932
3933
  /* Variant of thumb is described by the architecture tag.  */
3934
0
  arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
3935
3936
  /* Force return logic to be reviewed for each new architecture.  */
3937
0
  BFD_ASSERT (arch <= TAG_CPU_ARCH_V8_1M_MAIN);
3938
3939
0
  return (arch == TAG_CPU_ARCH_V6T2
3940
0
    || arch == TAG_CPU_ARCH_V7
3941
0
    || arch == TAG_CPU_ARCH_V7E_M
3942
0
    || arch == TAG_CPU_ARCH_V8
3943
0
    || arch == TAG_CPU_ARCH_V8R
3944
0
    || arch == TAG_CPU_ARCH_V8M_MAIN
3945
0
    || arch == TAG_CPU_ARCH_V8_1M_MAIN);
3946
0
}
3947
3948
/* Determine whether Thumb-2 BL instruction is available.  */
3949
3950
static bool
3951
using_thumb2_bl (struct elf32_arm_link_hash_table *globals)
3952
0
{
3953
0
  int arch =
3954
0
    bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
3955
3956
  /* Force return logic to be reviewed for each new architecture.  */
3957
0
  BFD_ASSERT (arch <= TAG_CPU_ARCH_V9);
3958
3959
  /* Architecture was introduced after ARMv6T2 (eg. ARMv6-M).  */
3960
0
  return (arch == TAG_CPU_ARCH_V6T2
3961
0
    || arch >= TAG_CPU_ARCH_V7);
3962
0
}
3963
3964
/* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
3965
   .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
3966
   hash table.  */
3967
3968
static bool
3969
elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3970
0
{
3971
0
  struct elf32_arm_link_hash_table *htab;
3972
3973
0
  htab = elf32_arm_hash_table (info);
3974
0
  if (htab == NULL)
3975
0
    return false;
3976
3977
0
  if (!htab->root.sgot && !create_got_section (dynobj, info))
3978
0
    return false;
3979
3980
0
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3981
0
    return false;
3982
3983
0
  if (htab->root.target_os == is_vxworks)
3984
0
    {
3985
0
      if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
3986
0
  return false;
3987
3988
0
      if (bfd_link_pic (info))
3989
0
  {
3990
0
    htab->plt_header_size = 0;
3991
0
    htab->plt_entry_size
3992
0
      = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
3993
0
  }
3994
0
      else
3995
0
  {
3996
0
    htab->plt_header_size
3997
0
      = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
3998
0
    htab->plt_entry_size
3999
0
      = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
4000
0
  }
4001
4002
0
      if (elf_elfheader (dynobj))
4003
0
  elf_elfheader (dynobj)->e_ident[EI_CLASS] = ELFCLASS32;
4004
0
    }
4005
0
  else
4006
0
    {
4007
      /* PR ld/16017
4008
   Test for thumb only architectures.  Note - we cannot just call
4009
   using_thumb_only() as the attributes in the output bfd have not been
4010
   initialised at this point, so instead we use the input bfd.  */
4011
0
      bfd * saved_obfd = htab->obfd;
4012
4013
0
      htab->obfd = dynobj;
4014
0
      if (using_thumb_only (htab))
4015
0
  {
4016
0
    htab->plt_header_size = 4 * ARRAY_SIZE (elf32_thumb2_plt0_entry);
4017
0
    htab->plt_entry_size  = 4 * ARRAY_SIZE (elf32_thumb2_plt_entry);
4018
0
  }
4019
0
      htab->obfd = saved_obfd;
4020
0
    }
4021
4022
0
  if (htab->fdpic_p) {
4023
0
    htab->plt_header_size = 0;
4024
0
    if (info->flags & DF_BIND_NOW)
4025
0
      htab->plt_entry_size = 4 * (ARRAY_SIZE (elf32_arm_fdpic_plt_entry) - 5);
4026
0
    else
4027
0
      htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_fdpic_plt_entry);
4028
0
  }
4029
4030
0
  if (!htab->root.splt
4031
0
      || !htab->root.srelplt
4032
0
      || !htab->root.sdynbss
4033
0
      || (!bfd_link_pic (info) && !htab->root.srelbss))
4034
0
    abort ();
4035
4036
0
  return true;
4037
0
}
4038
4039
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
4040
4041
static void
4042
elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
4043
        struct elf_link_hash_entry *dir,
4044
        struct elf_link_hash_entry *ind)
4045
0
{
4046
0
  struct elf32_arm_link_hash_entry *edir, *eind;
4047
4048
0
  edir = (struct elf32_arm_link_hash_entry *) dir;
4049
0
  eind = (struct elf32_arm_link_hash_entry *) ind;
4050
4051
0
  if (ind->root.type == bfd_link_hash_indirect)
4052
0
    {
4053
      /* Copy over PLT info.  */
4054
0
      edir->plt.thumb_refcount += eind->plt.thumb_refcount;
4055
0
      eind->plt.thumb_refcount = 0;
4056
0
      edir->plt.maybe_thumb_refcount += eind->plt.maybe_thumb_refcount;
4057
0
      eind->plt.maybe_thumb_refcount = 0;
4058
0
      edir->plt.noncall_refcount += eind->plt.noncall_refcount;
4059
0
      eind->plt.noncall_refcount = 0;
4060
4061
      /* Copy FDPIC counters.  */
4062
0
      edir->fdpic_cnts.gotofffuncdesc_cnt += eind->fdpic_cnts.gotofffuncdesc_cnt;
4063
0
      edir->fdpic_cnts.gotfuncdesc_cnt += eind->fdpic_cnts.gotfuncdesc_cnt;
4064
0
      edir->fdpic_cnts.funcdesc_cnt += eind->fdpic_cnts.funcdesc_cnt;
4065
4066
      /* We should only allocate a function to .iplt once the final
4067
   symbol information is known.  */
4068
0
      BFD_ASSERT (!eind->is_iplt);
4069
4070
0
      if (dir->got.refcount <= 0)
4071
0
  {
4072
0
    edir->tls_type = eind->tls_type;
4073
0
    eind->tls_type = GOT_UNKNOWN;
4074
0
  }
4075
0
    }
4076
4077
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4078
0
}
4079
4080
/* Destroy an ARM elf linker hash table.  */
4081
4082
static void
4083
elf32_arm_link_hash_table_free (bfd *obfd)
4084
0
{
4085
0
  struct elf32_arm_link_hash_table *ret
4086
0
    = (struct elf32_arm_link_hash_table *) obfd->link.hash;
4087
4088
0
  bfd_hash_table_free (&ret->stub_hash_table);
4089
0
  _bfd_elf_link_hash_table_free (obfd);
4090
0
}
4091
4092
/* Create an ARM elf linker hash table.  */
4093
4094
static struct bfd_link_hash_table *
4095
elf32_arm_link_hash_table_create (bfd *abfd)
4096
0
{
4097
0
  struct elf32_arm_link_hash_table *ret;
4098
0
  size_t amt = sizeof (struct elf32_arm_link_hash_table);
4099
4100
0
  ret = (struct elf32_arm_link_hash_table *) bfd_zmalloc (amt);
4101
0
  if (ret == NULL)
4102
0
    return NULL;
4103
4104
0
  if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
4105
0
              elf32_arm_link_hash_newfunc,
4106
0
              sizeof (struct elf32_arm_link_hash_entry)))
4107
0
    {
4108
0
      free (ret);
4109
0
      return NULL;
4110
0
    }
4111
4112
0
  ret->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4113
0
  ret->stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_NONE;
4114
#ifdef FOUR_WORD_PLT
4115
  ret->plt_header_size = 16;
4116
  ret->plt_entry_size = 16;
4117
#else
4118
0
  ret->plt_header_size = 20;
4119
0
  ret->plt_entry_size = elf32_arm_use_long_plt_entry ? 16 : 12;
4120
0
#endif
4121
0
  ret->use_rel = true;
4122
0
  ret->obfd = abfd;
4123
0
  ret->fdpic_p = 0;
4124
4125
0
  if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
4126
0
          sizeof (struct elf32_arm_stub_hash_entry)))
4127
0
    {
4128
0
      _bfd_elf_link_hash_table_free (abfd);
4129
0
      return NULL;
4130
0
    }
4131
0
  ret->root.root.hash_table_free = elf32_arm_link_hash_table_free;
4132
4133
0
  return &ret->root.root;
4134
0
}
4135
4136
/* Determine what kind of NOPs are available.  */
4137
4138
static bool
4139
arch_has_arm_nop (struct elf32_arm_link_hash_table *globals)
4140
0
{
4141
0
  const int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
4142
0
               Tag_CPU_arch);
4143
4144
  /* Force return logic to be reviewed for each new architecture.  */
4145
0
  BFD_ASSERT (arch <= TAG_CPU_ARCH_V9);
4146
4147
0
  return (arch == TAG_CPU_ARCH_V6T2
4148
0
    || arch == TAG_CPU_ARCH_V6K
4149
0
    || arch == TAG_CPU_ARCH_V7
4150
0
    || arch == TAG_CPU_ARCH_V8
4151
0
    || arch == TAG_CPU_ARCH_V8R
4152
0
    || arch == TAG_CPU_ARCH_V9);
4153
0
}
4154
4155
static bool
4156
arm_stub_is_thumb (enum elf32_arm_stub_type stub_type)
4157
0
{
4158
0
  switch (stub_type)
4159
0
    {
4160
0
    case arm_stub_long_branch_thumb_only:
4161
0
    case arm_stub_long_branch_thumb2_only:
4162
0
    case arm_stub_long_branch_thumb2_only_pure:
4163
0
    case arm_stub_long_branch_v4t_thumb_arm:
4164
0
    case arm_stub_short_branch_v4t_thumb_arm:
4165
0
    case arm_stub_long_branch_v4t_thumb_arm_pic:
4166
0
    case arm_stub_long_branch_v4t_thumb_tls_pic:
4167
0
    case arm_stub_long_branch_thumb_only_pic:
4168
0
    case arm_stub_cmse_branch_thumb_only:
4169
0
      return true;
4170
0
    case arm_stub_none:
4171
0
      BFD_FAIL ();
4172
0
      return false;
4173
0
      break;
4174
0
    default:
4175
0
      return false;
4176
0
    }
4177
0
}
4178
4179
/* Determine the type of stub needed, if any, for a call.  */
4180
4181
static enum elf32_arm_stub_type
4182
arm_type_of_stub (struct bfd_link_info *info,
4183
      asection *input_sec,
4184
      const Elf_Internal_Rela *rel,
4185
      unsigned char st_type,
4186
      enum arm_st_branch_type *actual_branch_type,
4187
      struct elf32_arm_link_hash_entry *hash,
4188
      bfd_vma destination,
4189
      asection *sym_sec,
4190
      bfd *input_bfd,
4191
      const char *name)
4192
0
{
4193
0
  bfd_vma location;
4194
0
  bfd_signed_vma branch_offset;
4195
0
  unsigned int r_type;
4196
0
  struct elf32_arm_link_hash_table * globals;
4197
0
  bool thumb2, thumb2_bl, thumb_only;
4198
0
  enum elf32_arm_stub_type stub_type = arm_stub_none;
4199
0
  int use_plt = 0;
4200
0
  enum arm_st_branch_type branch_type = *actual_branch_type;
4201
0
  union gotplt_union *root_plt;
4202
0
  struct arm_plt_info *arm_plt;
4203
0
  int arch;
4204
0
  int thumb2_movw;
4205
4206
0
  if (branch_type == ST_BRANCH_LONG)
4207
0
    return stub_type;
4208
4209
0
  globals = elf32_arm_hash_table (info);
4210
0
  if (globals == NULL)
4211
0
    return stub_type;
4212
4213
0
  thumb_only = using_thumb_only (globals);
4214
0
  thumb2 = using_thumb2 (globals);
4215
0
  thumb2_bl = using_thumb2_bl (globals);
4216
4217
0
  arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
4218
4219
  /* True for architectures that implement the thumb2 movw instruction.  */
4220
0
  thumb2_movw = thumb2 || (arch  == TAG_CPU_ARCH_V8M_BASE);
4221
4222
  /* Determine where the call point is.  */
4223
0
  location = (input_sec->output_offset
4224
0
        + input_sec->output_section->vma
4225
0
        + rel->r_offset);
4226
4227
0
  r_type = ELF32_R_TYPE (rel->r_info);
4228
4229
  /* Don't pretend we know what stub to use (if any) when we target a
4230
     Thumb-only target and we don't know the actual destination
4231
     type.  */
4232
0
  if (branch_type == ST_BRANCH_UNKNOWN && thumb_only)
4233
0
    return stub_type;
4234
4235
  /* ST_BRANCH_TO_ARM is nonsense to thumb-only targets when we
4236
     are considering a function call relocation.  */
4237
0
  if (thumb_only && (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24
4238
0
         || r_type == R_ARM_THM_JUMP19)
4239
0
      && branch_type == ST_BRANCH_TO_ARM)
4240
0
    {
4241
0
      if (sym_sec == bfd_abs_section_ptr)
4242
  /* As an exception, assume that absolute symbols are of the
4243
     right kind (Thumb).  They are presumably defined in the
4244
     linker script, where it is not possible to declare them as
4245
     Thumb (and thus are seen as Arm mode). We'll inform the
4246
     user with a warning, though, in
4247
     elf32_arm_final_link_relocate. */
4248
0
  branch_type = ST_BRANCH_TO_THUMB;
4249
0
      else
4250
  /* Otherwise do not silently build a stub, and let the users
4251
     know they have to fix their code.  Indeed, we could decide
4252
     to insert a stub involving Arm code and/or BLX, leading to
4253
     a run-time crash.  */
4254
0
  return stub_type;
4255
0
    }
4256
4257
  /* For TLS call relocs, it is the caller's responsibility to provide
4258
     the address of the appropriate trampoline.  */
4259
0
  if (r_type != R_ARM_TLS_CALL
4260
0
      && r_type != R_ARM_THM_TLS_CALL
4261
0
      && elf32_arm_get_plt_info (input_bfd, globals, hash,
4262
0
         ELF32_R_SYM (rel->r_info), &root_plt,
4263
0
         &arm_plt)
4264
0
      && root_plt->offset != (bfd_vma) -1)
4265
0
    {
4266
0
      asection *splt;
4267
4268
0
      if (hash == NULL || hash->is_iplt)
4269
0
  splt = globals->root.iplt;
4270
0
      else
4271
0
  splt = globals->root.splt;
4272
0
      if (splt != NULL)
4273
0
  {
4274
0
    use_plt = 1;
4275
4276
    /* Note when dealing with PLT entries: the main PLT stub is in
4277
       ARM mode, so if the branch is in Thumb mode, another
4278
       Thumb->ARM stub will be inserted later just before the ARM
4279
       PLT stub. If a long branch stub is needed, we'll add a
4280
       Thumb->Arm one and branch directly to the ARM PLT entry.
4281
       Here, we have to check if a pre-PLT Thumb->ARM stub
4282
       is needed and if it will be close enough.  */
4283
4284
0
    destination = (splt->output_section->vma
4285
0
       + splt->output_offset
4286
0
       + root_plt->offset);
4287
0
    st_type = STT_FUNC;
4288
4289
    /* Thumb branch/call to PLT: it can become a branch to ARM
4290
       or to Thumb. We must perform the same checks and
4291
       corrections as in elf32_arm_final_link_relocate.  */
4292
0
    if ((r_type == R_ARM_THM_CALL)
4293
0
        || (r_type == R_ARM_THM_JUMP24))
4294
0
      {
4295
0
        if (globals->use_blx
4296
0
      && r_type == R_ARM_THM_CALL
4297
0
      && !thumb_only)
4298
0
    {
4299
      /* If the Thumb BLX instruction is available, convert
4300
         the BL to a BLX instruction to call the ARM-mode
4301
         PLT entry.  */
4302
0
      branch_type = ST_BRANCH_TO_ARM;
4303
0
    }
4304
0
        else
4305
0
    {
4306
0
      if (!thumb_only)
4307
        /* Target the Thumb stub before the ARM PLT entry.  */
4308
0
        destination -= PLT_THUMB_STUB_SIZE;
4309
0
      branch_type = ST_BRANCH_TO_THUMB;
4310
0
    }
4311
0
      }
4312
0
    else
4313
0
      {
4314
0
        branch_type = ST_BRANCH_TO_ARM;
4315
0
      }
4316
0
  }
4317
0
    }
4318
  /* Calls to STT_GNU_IFUNC symbols should go through a PLT.  */
4319
0
  BFD_ASSERT (st_type != STT_GNU_IFUNC);
4320
4321
0
  branch_offset = (bfd_signed_vma)(destination - location);
4322
4323
0
  if (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24
4324
0
      || r_type == R_ARM_THM_TLS_CALL || r_type == R_ARM_THM_JUMP19)
4325
0
    {
4326
      /* Handle cases where:
4327
   - this call goes too far (different Thumb/Thumb2 max
4328
     distance)
4329
   - it's a Thumb->Arm call and blx is not available, or it's a
4330
     Thumb->Arm branch (not bl). A stub is needed in this case,
4331
     but only if this call is not through a PLT entry. Indeed,
4332
     PLT stubs handle mode switching already.  */
4333
0
      if ((!thumb2_bl
4334
0
      && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4335
0
    || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4336
0
    || (thumb2_bl
4337
0
        && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4338
0
      || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4339
0
    || (thumb2
4340
0
        && (branch_offset > THM2_MAX_FWD_COND_BRANCH_OFFSET
4341
0
      || (branch_offset < THM2_MAX_BWD_COND_BRANCH_OFFSET))
4342
0
        && (r_type == R_ARM_THM_JUMP19))
4343
0
    || (branch_type == ST_BRANCH_TO_ARM
4344
0
        && (((r_type == R_ARM_THM_CALL
4345
0
        || r_type == R_ARM_THM_TLS_CALL) && !globals->use_blx)
4346
0
      || (r_type == R_ARM_THM_JUMP24)
4347
0
      || (r_type == R_ARM_THM_JUMP19))
4348
0
        && !use_plt))
4349
0
  {
4350
    /* If we need to insert a Thumb-Thumb long branch stub to a
4351
       PLT, use one that branches directly to the ARM PLT
4352
       stub. If we pretended we'd use the pre-PLT Thumb->ARM
4353
       stub, undo this now.  */
4354
0
    if ((branch_type == ST_BRANCH_TO_THUMB) && use_plt && !thumb_only)
4355
0
      {
4356
0
        branch_type = ST_BRANCH_TO_ARM;
4357
0
        branch_offset += PLT_THUMB_STUB_SIZE;
4358
0
      }
4359
4360
0
    if (branch_type == ST_BRANCH_TO_THUMB)
4361
0
      {
4362
        /* Thumb to thumb.  */
4363
0
        if (!thumb_only)
4364
0
    {
4365
0
      if (input_sec->flags & SEC_ELF_PURECODE)
4366
0
        _bfd_error_handler
4367
0
          (_("%pB(%pA): warning: long branch veneers used in"
4368
0
       " section with SHF_ARM_PURECODE section"
4369
0
       " attribute is only supported for M-profile"
4370
0
       " targets that implement the movw instruction"),
4371
0
           input_bfd, input_sec);
4372
4373
0
      stub_type = (bfd_link_pic (info) | globals->pic_veneer)
4374
        /* PIC stubs.  */
4375
0
        ? ((globals->use_blx
4376
0
      && (r_type == R_ARM_THM_CALL))
4377
           /* V5T and above. Stub starts with ARM code, so
4378
        we must be able to switch mode before
4379
        reaching it, which is only possible for 'bl'
4380
        (ie R_ARM_THM_CALL relocation).  */
4381
0
           ? arm_stub_long_branch_any_thumb_pic
4382
           /* On V4T, use Thumb code only.  */
4383
0
           : arm_stub_long_branch_v4t_thumb_thumb_pic)
4384
4385
        /* non-PIC stubs.  */
4386
0
        : ((globals->use_blx
4387
0
      && (r_type == R_ARM_THM_CALL))
4388
           /* V5T and above.  */
4389
0
           ? arm_stub_long_branch_any_any
4390
           /* V4T.  */
4391
0
           : arm_stub_long_branch_v4t_thumb_thumb);
4392
0
    }
4393
0
        else
4394
0
    {
4395
0
      if (thumb2_movw && (input_sec->flags & SEC_ELF_PURECODE))
4396
0
          stub_type = arm_stub_long_branch_thumb2_only_pure;
4397
0
      else
4398
0
        {
4399
0
          if (input_sec->flags & SEC_ELF_PURECODE)
4400
0
      _bfd_error_handler
4401
0
        (_("%pB(%pA): warning: long branch veneers used in"
4402
0
           " section with SHF_ARM_PURECODE section"
4403
0
           " attribute is only supported for M-profile"
4404
0
           " targets that implement the movw instruction"),
4405
0
         input_bfd, input_sec);
4406
4407
0
          stub_type = (bfd_link_pic (info) | globals->pic_veneer)
4408
      /* PIC stub.  */
4409
0
      ? arm_stub_long_branch_thumb_only_pic
4410
      /* non-PIC stub.  */
4411
0
      : (thumb2 ? arm_stub_long_branch_thumb2_only
4412
0
          : arm_stub_long_branch_thumb_only);
4413
0
        }
4414
0
    }
4415
0
      }
4416
0
    else
4417
0
      {
4418
0
        if (input_sec->flags & SEC_ELF_PURECODE)
4419
0
    _bfd_error_handler
4420
0
      (_("%pB(%pA): warning: long branch veneers used in"
4421
0
         " section with SHF_ARM_PURECODE section"
4422
0
         " attribute is only supported" " for M-profile"
4423
0
         " targets that implement the movw instruction"),
4424
0
       input_bfd, input_sec);
4425
4426
        /* Thumb to arm.  */
4427
0
        if (sym_sec != NULL
4428
0
      && sym_sec->owner != NULL
4429
0
      && !INTERWORK_FLAG (sym_sec->owner))
4430
0
    {
4431
0
      _bfd_error_handler
4432
0
        (_("%pB(%s): warning: interworking not enabled;"
4433
0
           " first occurrence: %pB: %s call to %s"),
4434
0
         sym_sec->owner, name, input_bfd, "Thumb", "ARM");
4435
0
    }
4436
4437
0
        stub_type =
4438
0
    (bfd_link_pic (info) | globals->pic_veneer)
4439
    /* PIC stubs.  */
4440
0
    ? (r_type == R_ARM_THM_TLS_CALL
4441
       /* TLS PIC stubs.  */
4442
0
       ? (globals->use_blx ? arm_stub_long_branch_any_tls_pic
4443
0
          : arm_stub_long_branch_v4t_thumb_tls_pic)
4444
0
       : ((globals->use_blx && r_type == R_ARM_THM_CALL)
4445
          /* V5T PIC and above.  */
4446
0
          ? arm_stub_long_branch_any_arm_pic
4447
          /* V4T PIC stub.  */
4448
0
          : arm_stub_long_branch_v4t_thumb_arm_pic))
4449
4450
    /* non-PIC stubs.  */
4451
0
    : ((globals->use_blx && r_type == R_ARM_THM_CALL)
4452
       /* V5T and above.  */
4453
0
       ? arm_stub_long_branch_any_any
4454
       /* V4T.  */
4455
0
       : arm_stub_long_branch_v4t_thumb_arm);
4456
4457
        /* Handle v4t short branches.  */
4458
0
        if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4459
0
      && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4460
0
      && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4461
0
    stub_type = arm_stub_short_branch_v4t_thumb_arm;
4462
0
      }
4463
0
  }
4464
0
    }
4465
0
  else if (r_type == R_ARM_CALL
4466
0
     || r_type == R_ARM_JUMP24
4467
0
     || r_type == R_ARM_PLT32
4468
0
     || r_type == R_ARM_TLS_CALL)
4469
0
    {
4470
0
      if (input_sec->flags & SEC_ELF_PURECODE)
4471
0
  _bfd_error_handler
4472
0
    (_("%pB(%pA): warning: long branch veneers used in"
4473
0
       " section with SHF_ARM_PURECODE section"
4474
0
       " attribute is only supported for M-profile"
4475
0
       " targets that implement the movw instruction"),
4476
0
     input_bfd, input_sec);
4477
0
      if (branch_type == ST_BRANCH_TO_THUMB)
4478
0
  {
4479
    /* Arm to thumb.  */
4480
4481
0
    if (sym_sec != NULL
4482
0
        && sym_sec->owner != NULL
4483
0
        && !INTERWORK_FLAG (sym_sec->owner))
4484
0
      {
4485
0
        _bfd_error_handler
4486
0
    (_("%pB(%s): warning: interworking not enabled;"
4487
0
       " first occurrence: %pB: %s call to %s"),
4488
0
     sym_sec->owner, name, input_bfd, "ARM", "Thumb");
4489
0
      }
4490
4491
    /* We have an extra 2-bytes reach because of
4492
       the mode change (bit 24 (H) of BLX encoding).  */
4493
0
    if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4494
0
        || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4495
0
        || (r_type == R_ARM_CALL && !globals->use_blx)
4496
0
        || (r_type == R_ARM_JUMP24)
4497
0
        || (r_type == R_ARM_PLT32))
4498
0
      {
4499
0
        stub_type = (bfd_link_pic (info) | globals->pic_veneer)
4500
    /* PIC stubs.  */
4501
0
    ? ((globals->use_blx)
4502
       /* V5T and above.  */
4503
0
       ? arm_stub_long_branch_any_thumb_pic
4504
       /* V4T stub.  */
4505
0
       : arm_stub_long_branch_v4t_arm_thumb_pic)
4506
4507
    /* non-PIC stubs.  */
4508
0
    : ((globals->use_blx)
4509
       /* V5T and above.  */
4510
0
       ? arm_stub_long_branch_any_any
4511
       /* V4T.  */
4512
0
       : arm_stub_long_branch_v4t_arm_thumb);
4513
0
      }
4514
0
  }
4515
0
      else
4516
0
  {
4517
    /* Arm to arm.  */
4518
0
    if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4519
0
        || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4520
0
      {
4521
0
        stub_type =
4522
0
    (bfd_link_pic (info) | globals->pic_veneer)
4523
    /* PIC stubs.  */
4524
0
    ? (r_type == R_ARM_TLS_CALL
4525
       /* TLS PIC Stub.  */
4526
0
       ? arm_stub_long_branch_any_tls_pic
4527
0
       : (globals->root.target_os == is_nacl
4528
0
          ? arm_stub_long_branch_arm_nacl_pic
4529
0
          : arm_stub_long_branch_any_arm_pic))
4530
    /* non-PIC stubs.  */
4531
0
    : (globals->root.target_os == is_nacl
4532
0
       ? arm_stub_long_branch_arm_nacl
4533
0
       : arm_stub_long_branch_any_any);
4534
0
      }
4535
0
  }
4536
0
    }
4537
4538
  /* If a stub is needed, record the actual destination type.  */
4539
0
  if (stub_type != arm_stub_none)
4540
0
    *actual_branch_type = branch_type;
4541
4542
0
  return stub_type;
4543
0
}
4544
4545
/* Build a name for an entry in the stub hash table.  */
4546
4547
static char *
4548
elf32_arm_stub_name (const asection *input_section,
4549
         const asection *sym_sec,
4550
         const struct elf32_arm_link_hash_entry *hash,
4551
         const Elf_Internal_Rela *rel,
4552
         enum elf32_arm_stub_type stub_type)
4553
0
{
4554
0
  char *stub_name;
4555
0
  bfd_size_type len;
4556
4557
0
  if (hash)
4558
0
    {
4559
0
      len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 8 + 1 + 2 + 1;
4560
0
      stub_name = (char *) bfd_malloc (len);
4561
0
      if (stub_name != NULL)
4562
0
  sprintf (stub_name, "%08x_%s+%x_%d",
4563
0
     input_section->id & 0xffffffff,
4564
0
     hash->root.root.root.string,
4565
0
     (int) rel->r_addend & 0xffffffff,
4566
0
     (int) stub_type);
4567
0
    }
4568
0
  else
4569
0
    {
4570
0
      len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1 + 2 + 1;
4571
0
      stub_name = (char *) bfd_malloc (len);
4572
0
      if (stub_name != NULL)
4573
0
  sprintf (stub_name, "%08x_%x:%x+%x_%d",
4574
0
     input_section->id & 0xffffffff,
4575
0
     sym_sec->id & 0xffffffff,
4576
0
     ELF32_R_TYPE (rel->r_info) == R_ARM_TLS_CALL
4577
0
     || ELF32_R_TYPE (rel->r_info) == R_ARM_THM_TLS_CALL
4578
0
     ? 0 : (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
4579
0
     (int) rel->r_addend & 0xffffffff,
4580
0
     (int) stub_type);
4581
0
    }
4582
4583
0
  return stub_name;
4584
0
}
4585
4586
/* Look up an entry in the stub hash.  Stub entries are cached because
4587
   creating the stub name takes a bit of time.  */
4588
4589
static struct elf32_arm_stub_hash_entry *
4590
elf32_arm_get_stub_entry (const asection *input_section,
4591
        const asection *sym_sec,
4592
        struct elf_link_hash_entry *hash,
4593
        const Elf_Internal_Rela *rel,
4594
        struct elf32_arm_link_hash_table *htab,
4595
        enum elf32_arm_stub_type stub_type)
4596
0
{
4597
0
  struct elf32_arm_stub_hash_entry *stub_entry;
4598
0
  struct elf32_arm_link_hash_entry *h = (struct elf32_arm_link_hash_entry *) hash;
4599
0
  const asection *id_sec;
4600
4601
0
  if ((input_section->flags & SEC_CODE) == 0)
4602
0
    return NULL;
4603
4604
  /* If the input section is the CMSE stubs one and it needs a long
4605
     branch stub to reach it's final destination, give up with an
4606
     error message: this is not supported.  See PR ld/24709.  */
4607
0
  if (!strncmp (input_section->name, CMSE_STUB_NAME, strlen (CMSE_STUB_NAME)))
4608
0
    {
4609
0
      bfd *output_bfd = htab->obfd;
4610
0
      asection *out_sec = bfd_get_section_by_name (output_bfd, CMSE_STUB_NAME);
4611
4612
0
      _bfd_error_handler (_("ERROR: CMSE stub (%s section) too far "
4613
0
          "(%#" PRIx64 ") from destination (%#" PRIx64 ")"),
4614
0
        CMSE_STUB_NAME,
4615
0
        (uint64_t)out_sec->output_section->vma
4616
0
          + out_sec->output_offset,
4617
0
        (uint64_t)sym_sec->output_section->vma
4618
0
          + sym_sec->output_offset
4619
0
          + h->root.root.u.def.value);
4620
      /* Exit, rather than leave incompletely processed
4621
   relocations.  */
4622
0
      xexit (1);
4623
0
    }
4624
4625
  /* If this input section is part of a group of sections sharing one
4626
     stub section, then use the id of the first section in the group.
4627
     Stub names need to include a section id, as there may well be
4628
     more than one stub used to reach say, printf, and we need to
4629
     distinguish between them.  */
4630
0
  BFD_ASSERT (input_section->id <= htab->top_id);
4631
0
  id_sec = htab->stub_group[input_section->id].link_sec;
4632
4633
0
  if (h != NULL && h->stub_cache != NULL
4634
0
      && h->stub_cache->h == h
4635
0
      && h->stub_cache->id_sec == id_sec
4636
0
      && h->stub_cache->stub_type == stub_type)
4637
0
    {
4638
0
      stub_entry = h->stub_cache;
4639
0
    }
4640
0
  else
4641
0
    {
4642
0
      char *stub_name;
4643
4644
0
      stub_name = elf32_arm_stub_name (id_sec, sym_sec, h, rel, stub_type);
4645
0
      if (stub_name == NULL)
4646
0
  return NULL;
4647
4648
0
      stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
4649
0
          stub_name, false, false);
4650
0
      if (h != NULL)
4651
0
  h->stub_cache = stub_entry;
4652
4653
0
      free (stub_name);
4654
0
    }
4655
4656
0
  return stub_entry;
4657
0
}
4658
4659
/* Whether veneers of type STUB_TYPE require to be in a dedicated output
4660
   section.  */
4661
4662
static bool
4663
arm_dedicated_stub_output_section_required (enum elf32_arm_stub_type stub_type)
4664
0
{
4665
0
  if (stub_type >= max_stub_type)
4666
0
    abort ();  /* Should be unreachable.  */
4667
4668
0
  switch (stub_type)
4669
0
    {
4670
0
    case arm_stub_cmse_branch_thumb_only:
4671
0
      return true;
4672
4673
0
    default:
4674
0
      return false;
4675
0
    }
4676
4677
0
  abort ();  /* Should be unreachable.  */
4678
0
}
4679
4680
/* Required alignment (as a power of 2) for the dedicated section holding
4681
   veneers of type STUB_TYPE, or 0 if veneers of this type are interspersed
4682
   with input sections.  */
4683
4684
static int
4685
arm_dedicated_stub_output_section_required_alignment
4686
  (enum elf32_arm_stub_type stub_type)
4687
0
{
4688
0
  if (stub_type >= max_stub_type)
4689
0
    abort ();  /* Should be unreachable.  */
4690
4691
0
  switch (stub_type)
4692
0
    {
4693
    /* Vectors of Secure Gateway veneers must be aligned on 32byte
4694
       boundary.  */
4695
0
    case arm_stub_cmse_branch_thumb_only:
4696
0
      return 5;
4697
4698
0
    default:
4699
0
      BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
4700
0
      return 0;
4701
0
    }
4702
4703
0
  abort ();  /* Should be unreachable.  */
4704
0
}
4705
4706
/* Name of the dedicated output section to put veneers of type STUB_TYPE, or
4707
   NULL if veneers of this type are interspersed with input sections.  */
4708
4709
static const char *
4710
arm_dedicated_stub_output_section_name (enum elf32_arm_stub_type stub_type)
4711
0
{
4712
0
  if (stub_type >= max_stub_type)
4713
0
    abort ();  /* Should be unreachable.  */
4714
4715
0
  switch (stub_type)
4716
0
    {
4717
0
    case arm_stub_cmse_branch_thumb_only:
4718
0
      return CMSE_STUB_NAME;
4719
4720
0
    default:
4721
0
      BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
4722
0
      return NULL;
4723
0
    }
4724
4725
0
  abort ();  /* Should be unreachable.  */
4726
0
}
4727
4728
/* If veneers of type STUB_TYPE should go in a dedicated output section,
4729
   returns the address of the hash table field in HTAB holding a pointer to the
4730
   corresponding input section.  Otherwise, returns NULL.  */
4731
4732
static asection **
4733
arm_dedicated_stub_input_section_ptr (struct elf32_arm_link_hash_table *htab,
4734
              enum elf32_arm_stub_type stub_type)
4735
0
{
4736
0
  if (stub_type >= max_stub_type)
4737
0
    abort ();  /* Should be unreachable.  */
4738
4739
0
  switch (stub_type)
4740
0
    {
4741
0
    case arm_stub_cmse_branch_thumb_only:
4742
0
      return &htab->cmse_stub_sec;
4743
4744
0
    default:
4745
0
      BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
4746
0
      return NULL;
4747
0
    }
4748
4749
0
  abort ();  /* Should be unreachable.  */
4750
0
}
4751
4752
/* Find or create a stub section to contain a stub of type STUB_TYPE.  SECTION
4753
   is the section that branch into veneer and can be NULL if stub should go in
4754
   a dedicated output section.  Returns a pointer to the stub section, and the
4755
   section to which the stub section will be attached (in *LINK_SEC_P).
4756
   LINK_SEC_P may be NULL.  */
4757
4758
static asection *
4759
elf32_arm_create_or_find_stub_sec (asection **link_sec_p, asection *section,
4760
           struct elf32_arm_link_hash_table *htab,
4761
           enum elf32_arm_stub_type stub_type)
4762
0
{
4763
0
  asection *link_sec, *out_sec, **stub_sec_p;
4764
0
  const char *stub_sec_prefix;
4765
0
  bool dedicated_output_section =
4766
0
    arm_dedicated_stub_output_section_required (stub_type);
4767
0
  int align;
4768
4769
0
  if (dedicated_output_section)
4770
0
    {
4771
0
      bfd *output_bfd = htab->obfd;
4772
0
      const char *out_sec_name =
4773
0
  arm_dedicated_stub_output_section_name (stub_type);
4774
0
      link_sec = NULL;
4775
0
      stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
4776
0
      stub_sec_prefix = out_sec_name;
4777
0
      align = arm_dedicated_stub_output_section_required_alignment (stub_type);
4778
0
      out_sec = bfd_get_section_by_name (output_bfd, out_sec_name);
4779
0
      if (out_sec == NULL)
4780
0
  {
4781
0
    _bfd_error_handler (_("no address assigned to the veneers output "
4782
0
        "section %s"), out_sec_name);
4783
0
    return NULL;
4784
0
  }
4785
0
    }
4786
0
  else
4787
0
    {
4788
0
      BFD_ASSERT (section->id <= htab->top_id);
4789
0
      link_sec = htab->stub_group[section->id].link_sec;
4790
0
      BFD_ASSERT (link_sec != NULL);
4791
0
      stub_sec_p = &htab->stub_group[section->id].stub_sec;
4792
0
      if (*stub_sec_p == NULL)
4793
0
  stub_sec_p = &htab->stub_group[link_sec->id].stub_sec;
4794
0
      stub_sec_prefix = link_sec->name;
4795
0
      out_sec = link_sec->output_section;
4796
0
      align = htab->root.target_os == is_nacl ? 4 : 3;
4797
0
    }
4798
4799
0
  if (*stub_sec_p == NULL)
4800
0
    {
4801
0
      size_t namelen;
4802
0
      bfd_size_type len;
4803
0
      char *s_name;
4804
4805
0
      namelen = strlen (stub_sec_prefix);
4806
0
      len = namelen + sizeof (STUB_SUFFIX);
4807
0
      s_name = (char *) bfd_alloc (htab->stub_bfd, len);
4808
0
      if (s_name == NULL)
4809
0
  return NULL;
4810
4811
0
      memcpy (s_name, stub_sec_prefix, namelen);
4812
0
      memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4813
0
      *stub_sec_p = (*htab->add_stub_section) (s_name, out_sec, link_sec,
4814
0
                 align);
4815
0
      if (*stub_sec_p == NULL)
4816
0
  return NULL;
4817
4818
0
      out_sec->flags |= SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
4819
0
      | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY
4820
0
      | SEC_KEEP;
4821
0
    }
4822
4823
0
  if (!dedicated_output_section)
4824
0
    htab->stub_group[section->id].stub_sec = *stub_sec_p;
4825
4826
0
  if (link_sec_p)
4827
0
    *link_sec_p = link_sec;
4828
4829
0
  return *stub_sec_p;
4830
0
}
4831
4832
/* Add a new stub entry to the stub hash.  Not all fields of the new
4833
   stub entry are initialised.  */
4834
4835
static struct elf32_arm_stub_hash_entry *
4836
elf32_arm_add_stub (const char *stub_name, asection *section,
4837
        struct elf32_arm_link_hash_table *htab,
4838
        enum elf32_arm_stub_type stub_type)
4839
0
{
4840
0
  asection *link_sec;
4841
0
  asection *stub_sec;
4842
0
  struct elf32_arm_stub_hash_entry *stub_entry;
4843
4844
0
  stub_sec = elf32_arm_create_or_find_stub_sec (&link_sec, section, htab,
4845
0
            stub_type);
4846
0
  if (stub_sec == NULL)
4847
0
    return NULL;
4848
4849
  /* Enter this entry into the linker stub hash table.  */
4850
0
  stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4851
0
             true, false);
4852
0
  if (stub_entry == NULL)
4853
0
    {
4854
0
      if (section == NULL)
4855
0
  section = stub_sec;
4856
0
      _bfd_error_handler (_("%pB: cannot create stub entry %s"),
4857
0
        section->owner, stub_name);
4858
0
      return NULL;
4859
0
    }
4860
4861
0
  stub_entry->stub_sec = stub_sec;
4862
0
  stub_entry->stub_offset = (bfd_vma) -1;
4863
0
  stub_entry->id_sec = link_sec;
4864
4865
0
  return stub_entry;
4866
0
}
4867
4868
/* Store an Arm insn into an output section not processed by
4869
   elf32_arm_write_section.  */
4870
4871
static void
4872
put_arm_insn (struct elf32_arm_link_hash_table * htab,
4873
        bfd * output_bfd, bfd_vma val, void * ptr)
4874
0
{
4875
0
  if (htab->byteswap_code != bfd_little_endian (output_bfd))
4876
0
    bfd_putl32 (val, ptr);
4877
0
  else
4878
0
    bfd_putb32 (val, ptr);
4879
0
}
4880
4881
/* Store a 16-bit Thumb insn into an output section not processed by
4882
   elf32_arm_write_section.  */
4883
4884
static void
4885
put_thumb_insn (struct elf32_arm_link_hash_table * htab,
4886
    bfd * output_bfd, bfd_vma val, void * ptr)
4887
0
{
4888
0
  if (htab->byteswap_code != bfd_little_endian (output_bfd))
4889
0
    bfd_putl16 (val, ptr);
4890
0
  else
4891
0
    bfd_putb16 (val, ptr);
4892
0
}
4893
4894
/* Store a Thumb2 insn into an output section not processed by
4895
   elf32_arm_write_section.  */
4896
4897
static void
4898
put_thumb2_insn (struct elf32_arm_link_hash_table * htab,
4899
     bfd * output_bfd, bfd_vma val, bfd_byte * ptr)
4900
0
{
4901
  /* T2 instructions are 16-bit streamed.  */
4902
0
  if (htab->byteswap_code != bfd_little_endian (output_bfd))
4903
0
    {
4904
0
      bfd_putl16 ((val >> 16) & 0xffff, ptr);
4905
0
      bfd_putl16 ((val & 0xffff), ptr + 2);
4906
0
    }
4907
0
  else
4908
0
    {
4909
0
      bfd_putb16 ((val >> 16) & 0xffff, ptr);
4910
0
      bfd_putb16 ((val & 0xffff), ptr + 2);
4911
0
    }
4912
0
}
4913
4914
/* If it's possible to change R_TYPE to a more efficient access
4915
   model, return the new reloc type.  */
4916
4917
static unsigned
4918
elf32_arm_tls_transition (struct bfd_link_info *info, int r_type,
4919
        struct elf_link_hash_entry *h)
4920
0
{
4921
0
  int is_local = (h == NULL);
4922
4923
0
  if (bfd_link_dll (info)
4924
0
      || (h && h->root.type == bfd_link_hash_undefweak))
4925
0
    return r_type;
4926
4927
  /* We do not support relaxations for Old TLS models.  */
4928
0
  switch (r_type)
4929
0
    {
4930
0
    case R_ARM_TLS_GOTDESC:
4931
0
    case R_ARM_TLS_CALL:
4932
0
    case R_ARM_THM_TLS_CALL:
4933
0
    case R_ARM_TLS_DESCSEQ:
4934
0
    case R_ARM_THM_TLS_DESCSEQ:
4935
0
      return is_local ? R_ARM_TLS_LE32 : R_ARM_TLS_IE32;
4936
0
    }
4937
4938
0
  return r_type;
4939
0
}
4940
4941
static bfd_reloc_status_type elf32_arm_final_link_relocate
4942
  (reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *,
4943
   Elf_Internal_Rela *, bfd_vma, struct bfd_link_info *, asection *,
4944
   const char *, unsigned char, enum arm_st_branch_type,
4945
   struct elf_link_hash_entry *, bool *, char **);
4946
4947
static unsigned int
4948
arm_stub_required_alignment (enum elf32_arm_stub_type stub_type)
4949
0
{
4950
0
  switch (stub_type)
4951
0
    {
4952
0
    case arm_stub_a8_veneer_b_cond:
4953
0
    case arm_stub_a8_veneer_b:
4954
0
    case arm_stub_a8_veneer_bl:
4955
0
      return 2;
4956
4957
0
    case arm_stub_long_branch_any_any:
4958
0
    case arm_stub_long_branch_v4t_arm_thumb:
4959
0
    case arm_stub_long_branch_thumb_only:
4960
0
    case arm_stub_long_branch_thumb2_only:
4961
0
    case arm_stub_long_branch_thumb2_only_pure:
4962
0
    case arm_stub_long_branch_v4t_thumb_thumb:
4963
0
    case arm_stub_long_branch_v4t_thumb_arm:
4964
0
    case arm_stub_short_branch_v4t_thumb_arm:
4965
0
    case arm_stub_long_branch_any_arm_pic:
4966
0
    case arm_stub_long_branch_any_thumb_pic:
4967
0
    case arm_stub_long_branch_v4t_thumb_thumb_pic:
4968
0
    case arm_stub_long_branch_v4t_arm_thumb_pic:
4969
0
    case arm_stub_long_branch_v4t_thumb_arm_pic:
4970
0
    case arm_stub_long_branch_thumb_only_pic:
4971
0
    case arm_stub_long_branch_any_tls_pic:
4972
0
    case arm_stub_long_branch_v4t_thumb_tls_pic:
4973
0
    case arm_stub_cmse_branch_thumb_only:
4974
0
    case arm_stub_a8_veneer_blx:
4975
0
      return 4;
4976
4977
0
    case arm_stub_long_branch_arm_nacl:
4978
0
    case arm_stub_long_branch_arm_nacl_pic:
4979
0
      return 16;
4980
4981
0
    default:
4982
0
      abort ();  /* Should be unreachable.  */
4983
0
    }
4984
0
}
4985
4986
/* Returns whether stubs of type STUB_TYPE take over the symbol they are
4987
   veneering (TRUE) or have their own symbol (FALSE).  */
4988
4989
static bool
4990
arm_stub_sym_claimed (enum elf32_arm_stub_type stub_type)
4991
0
{
4992
0
  if (stub_type >= max_stub_type)
4993
0
    abort ();  /* Should be unreachable.  */
4994
4995
0
  switch (stub_type)
4996
0
    {
4997
0
    case arm_stub_cmse_branch_thumb_only:
4998
0
      return true;
4999
5000
0
    default:
5001
0
      return false;
5002
0
    }
5003
5004
0
  abort ();  /* Should be unreachable.  */
5005
0
}
5006
5007
/* Returns the padding needed for the dedicated section used stubs of type
5008
   STUB_TYPE.  */
5009
5010
static int
5011
arm_dedicated_stub_section_padding (enum elf32_arm_stub_type stub_type)
5012
0
{
5013
0
  if (stub_type >= max_stub_type)
5014
0
    abort ();  /* Should be unreachable.  */
5015
5016
0
  switch (stub_type)
5017
0
    {
5018
0
    case arm_stub_cmse_branch_thumb_only:
5019
0
      return 32;
5020
5021
0
    default:
5022
0
      return 0;
5023
0
    }
5024
5025
0
  abort ();  /* Should be unreachable.  */
5026
0
}
5027
5028
/* If veneers of type STUB_TYPE should go in a dedicated output section,
5029
   returns the address of the hash table field in HTAB holding the offset at
5030
   which new veneers should be layed out in the stub section.  */
5031
5032
static bfd_vma*
5033
arm_new_stubs_start_offset_ptr (struct elf32_arm_link_hash_table *htab,
5034
        enum elf32_arm_stub_type stub_type)
5035
0
{
5036
0
  switch (stub_type)
5037
0
    {
5038
0
    case arm_stub_cmse_branch_thumb_only:
5039
0
      return &htab->new_cmse_stub_offset;
5040
5041
0
    default:
5042
0
      BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
5043
0
      return NULL;
5044
0
    }
5045
0
}
5046
5047
static bool
5048
arm_build_one_stub (struct bfd_hash_entry *gen_entry,
5049
        void * in_arg)
5050
0
{
5051
0
#define MAXRELOCS 3
5052
0
  bool removed_sg_veneer;
5053
0
  struct elf32_arm_stub_hash_entry *stub_entry;
5054
0
  struct elf32_arm_link_hash_table *globals;
5055
0
  struct bfd_link_info *info;
5056
0
  asection *stub_sec;
5057
0
  bfd *stub_bfd;
5058
0
  bfd_byte *loc;
5059
0
  bfd_vma sym_value;
5060
0
  int template_size;
5061
0
  int size;
5062
0
  const insn_sequence *template_sequence;
5063
0
  int i;
5064
0
  int stub_reloc_idx[MAXRELOCS] = {-1, -1};
5065
0
  int stub_reloc_offset[MAXRELOCS] = {0, 0};
5066
0
  int nrelocs = 0;
5067
0
  int just_allocated = 0;
5068
5069
  /* Massage our args to the form they really have.  */
5070
0
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
5071
0
  info = (struct bfd_link_info *) in_arg;
5072
5073
  /* Fail if the target section could not be assigned to an output
5074
     section.  The user should fix his linker script.  */
5075
0
  if (stub_entry->target_section->output_section == NULL
5076
0
      && info->non_contiguous_regions)
5077
0
    info->callbacks->fatal (_("%P: Could not assign `%pA' to an output section. "
5078
0
            "Retry without --enable-non-contiguous-regions.\n"),
5079
0
          stub_entry->target_section);
5080
5081
0
  globals = elf32_arm_hash_table (info);
5082
0
  if (globals == NULL)
5083
0
    return false;
5084
5085
0
  stub_sec = stub_entry->stub_sec;
5086
5087
0
  if ((globals->fix_cortex_a8 < 0)
5088
0
      != (arm_stub_required_alignment (stub_entry->stub_type) == 2))
5089
    /* We have to do less-strictly-aligned fixes last.  */
5090
0
    return true;
5091
5092
  /* Assign a slot at the end of section if none assigned yet.  */
5093
0
  if (stub_entry->stub_offset == (bfd_vma) -1)
5094
0
    {
5095
0
      stub_entry->stub_offset = stub_sec->size;
5096
0
      just_allocated = 1;
5097
0
    }
5098
0
  loc = stub_sec->contents + stub_entry->stub_offset;
5099
5100
0
  stub_bfd = stub_sec->owner;
5101
5102
  /* This is the address of the stub destination.  */
5103
0
  sym_value = (stub_entry->target_value
5104
0
         + stub_entry->target_section->output_offset
5105
0
         + stub_entry->target_section->output_section->vma);
5106
5107
0
  template_sequence = stub_entry->stub_template;
5108
0
  template_size = stub_entry->stub_template_size;
5109
5110
0
  size = 0;
5111
0
  for (i = 0; i < template_size; i++)
5112
0
    {
5113
0
      switch (template_sequence[i].type)
5114
0
  {
5115
0
  case THUMB16_TYPE:
5116
0
    {
5117
0
      bfd_vma data = (bfd_vma) template_sequence[i].data;
5118
0
      if (template_sequence[i].reloc_addend != 0)
5119
0
        {
5120
    /* We've borrowed the reloc_addend field to mean we should
5121
       insert a condition code into this (Thumb-1 branch)
5122
       instruction.  See THUMB16_BCOND_INSN.  */
5123
0
    BFD_ASSERT ((data & 0xff00) == 0xd000);
5124
0
    data |= ((stub_entry->orig_insn >> 22) & 0xf) << 8;
5125
0
        }
5126
0
      bfd_put_16 (stub_bfd, data, loc + size);
5127
0
      size += 2;
5128
0
    }
5129
0
    break;
5130
5131
0
  case THUMB32_TYPE:
5132
0
    bfd_put_16 (stub_bfd,
5133
0
          (template_sequence[i].data >> 16) & 0xffff,
5134
0
          loc + size);
5135
0
    bfd_put_16 (stub_bfd, template_sequence[i].data & 0xffff,
5136
0
          loc + size + 2);
5137
0
    if (template_sequence[i].r_type != R_ARM_NONE)
5138
0
      {
5139
0
        stub_reloc_idx[nrelocs] = i;
5140
0
        stub_reloc_offset[nrelocs++] = size;
5141
0
      }
5142
0
    size += 4;
5143
0
    break;
5144
5145
0
  case ARM_TYPE:
5146
0
    bfd_put_32 (stub_bfd, template_sequence[i].data,
5147
0
          loc + size);
5148
    /* Handle cases where the target is encoded within the
5149
       instruction.  */
5150
0
    if (template_sequence[i].r_type == R_ARM_JUMP24)
5151
0
      {
5152
0
        stub_reloc_idx[nrelocs] = i;
5153
0
        stub_reloc_offset[nrelocs++] = size;
5154
0
      }
5155
0
    size += 4;
5156
0
    break;
5157
5158
0
  case DATA_TYPE:
5159
0
    bfd_put_32 (stub_bfd, template_sequence[i].data, loc + size);
5160
0
    stub_reloc_idx[nrelocs] = i;
5161
0
    stub_reloc_offset[nrelocs++] = size;
5162
0
    size += 4;
5163
0
    break;
5164
5165
0
  default:
5166
0
    BFD_FAIL ();
5167
0
    return false;
5168
0
  }
5169
0
    }
5170
5171
0
  if (just_allocated)
5172
0
    stub_sec->size += size;
5173
5174
  /* Stub size has already been computed in arm_size_one_stub. Check
5175
     consistency.  */
5176
0
  BFD_ASSERT (size == stub_entry->stub_size);
5177
5178
  /* Destination is Thumb. Force bit 0 to 1 to reflect this.  */
5179
0
  if (stub_entry->branch_type == ST_BRANCH_TO_THUMB)
5180
0
    sym_value |= 1;
5181
5182
  /* Assume non empty slots have at least one and at most MAXRELOCS entries
5183
     to relocate in each stub.  */
5184
0
  removed_sg_veneer =
5185
0
    (size == 0 && stub_entry->stub_type == arm_stub_cmse_branch_thumb_only);
5186
0
  BFD_ASSERT (removed_sg_veneer || (nrelocs != 0 && nrelocs <= MAXRELOCS));
5187
5188
0
  for (i = 0; i < nrelocs; i++)
5189
0
    {
5190
0
      Elf_Internal_Rela rel;
5191
0
      bool unresolved_reloc;
5192
0
      char *error_message;
5193
0
      bfd_vma points_to =
5194
0
  sym_value + template_sequence[stub_reloc_idx[i]].reloc_addend;
5195
5196
0
      rel.r_offset = stub_entry->stub_offset + stub_reloc_offset[i];
5197
0
      rel.r_info = ELF32_R_INFO (0,
5198
0
         template_sequence[stub_reloc_idx[i]].r_type);
5199
0
      rel.r_addend = 0;
5200
5201
0
      if (stub_entry->stub_type == arm_stub_a8_veneer_b_cond && i == 0)
5202
  /* The first relocation in the elf32_arm_stub_a8_veneer_b_cond[]
5203
     template should refer back to the instruction after the original
5204
     branch.  We use target_section as Cortex-A8 erratum workaround stubs
5205
     are only generated when both source and target are in the same
5206
     section.  */
5207
0
  points_to = stub_entry->target_section->output_section->vma
5208
0
        + stub_entry->target_section->output_offset
5209
0
        + stub_entry->source_value;
5210
5211
0
      elf32_arm_final_link_relocate (elf32_arm_howto_from_type
5212
0
    (template_sequence[stub_reloc_idx[i]].r_type),
5213
0
     stub_bfd, info->output_bfd, stub_sec, stub_sec->contents, &rel,
5214
0
     points_to, info, stub_entry->target_section, "", STT_FUNC,
5215
0
     stub_entry->branch_type,
5216
0
     (struct elf_link_hash_entry *) stub_entry->h, &unresolved_reloc,
5217
0
     &error_message);
5218
0
    }
5219
5220
0
  return true;
5221
0
#undef MAXRELOCS
5222
0
}
5223
5224
/* Calculate the template, template size and instruction size for a stub.
5225
   Return value is the instruction size.  */
5226
5227
static unsigned int
5228
find_stub_size_and_template (enum elf32_arm_stub_type stub_type,
5229
           const insn_sequence **stub_template,
5230
           int *stub_template_size)
5231
0
{
5232
0
  const insn_sequence *template_sequence = NULL;
5233
0
  int template_size = 0, i;
5234
0
  unsigned int size;
5235
5236
0
  template_sequence = stub_definitions[stub_type].template_sequence;
5237
0
  if (stub_template)
5238
0
    *stub_template = template_sequence;
5239
5240
0
  template_size = stub_definitions[stub_type].template_size;
5241
0
  if (stub_template_size)
5242
0
    *stub_template_size = template_size;
5243
5244
0
  size = 0;
5245
0
  for (i = 0; i < template_size; i++)
5246
0
    {
5247
0
      switch (template_sequence[i].type)
5248
0
  {
5249
0
  case THUMB16_TYPE:
5250
0
    size += 2;
5251
0
    break;
5252
5253
0
  case ARM_TYPE:
5254
0
  case THUMB32_TYPE:
5255
0
  case DATA_TYPE:
5256
0
    size += 4;
5257
0
    break;
5258
5259
0
  default:
5260
0
    BFD_FAIL ();
5261
0
    return 0;
5262
0
  }
5263
0
    }
5264
5265
0
  return size;
5266
0
}
5267
5268
/* As above, but don't actually build the stub.  Just bump offset so
5269
   we know stub section sizes.  */
5270
5271
static bool
5272
arm_size_one_stub (struct bfd_hash_entry *gen_entry,
5273
       void *in_arg ATTRIBUTE_UNUSED)
5274
0
{
5275
0
  struct elf32_arm_stub_hash_entry *stub_entry;
5276
0
  const insn_sequence *template_sequence;
5277
0
  int template_size, size;
5278
5279
  /* Massage our args to the form they really have.  */
5280
0
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
5281
5282
0
  BFD_ASSERT ((stub_entry->stub_type > arm_stub_none)
5283
0
        && stub_entry->stub_type < ARRAY_SIZE (stub_definitions));
5284
5285
0
  size = find_stub_size_and_template (stub_entry->stub_type, &template_sequence,
5286
0
              &template_size);
5287
5288
  /* Initialized to -1.  Null size indicates an empty slot full of zeros.  */
5289
0
  if (stub_entry->stub_template_size)
5290
0
    {
5291
0
      stub_entry->stub_size = size;
5292
0
      stub_entry->stub_template = template_sequence;
5293
0
      stub_entry->stub_template_size = template_size;
5294
0
    }
5295
5296
  /* Already accounted for.  */
5297
0
  if (stub_entry->stub_offset != (bfd_vma) -1)
5298
0
    return true;
5299
5300
0
  size = (size + 7) & ~7;
5301
0
  stub_entry->stub_sec->size += size;
5302
5303
0
  return true;
5304
0
}
5305
5306
/* External entry points for sizing and building linker stubs.  */
5307
5308
/* Set up various things so that we can make a list of input sections
5309
   for each output section included in the link.  Returns -1 on error,
5310
   0 when no stubs will be needed, and 1 on success.  */
5311
5312
int
5313
elf32_arm_setup_section_lists (bfd *output_bfd,
5314
             struct bfd_link_info *info)
5315
0
{
5316
0
  bfd *input_bfd;
5317
0
  unsigned int bfd_count;
5318
0
  unsigned int top_id, top_index;
5319
0
  asection *section;
5320
0
  asection **input_list, **list;
5321
0
  size_t amt;
5322
0
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
5323
5324
0
  if (htab == NULL)
5325
0
    return 0;
5326
5327
  /* Count the number of input BFDs and find the top input section id.  */
5328
0
  for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
5329
0
       input_bfd != NULL;
5330
0
       input_bfd = input_bfd->link.next)
5331
0
    {
5332
0
      bfd_count += 1;
5333
0
      for (section = input_bfd->sections;
5334
0
     section != NULL;
5335
0
     section = section->next)
5336
0
  {
5337
0
    if (top_id < section->id)
5338
0
      top_id = section->id;
5339
0
  }
5340
0
    }
5341
0
  htab->bfd_count = bfd_count;
5342
5343
0
  amt = sizeof (struct map_stub) * (top_id + 1);
5344
0
  htab->stub_group = (struct map_stub *) bfd_zmalloc (amt);
5345
0
  if (htab->stub_group == NULL)
5346
0
    return -1;
5347
0
  htab->top_id = top_id;
5348
5349
  /* We can't use output_bfd->section_count here to find the top output
5350
     section index as some sections may have been removed, and
5351
     _bfd_strip_section_from_output doesn't renumber the indices.  */
5352
0
  for (section = output_bfd->sections, top_index = 0;
5353
0
       section != NULL;
5354
0
       section = section->next)
5355
0
    {
5356
0
      if (top_index < section->index)
5357
0
  top_index = section->index;
5358
0
    }
5359
5360
0
  htab->top_index = top_index;
5361
0
  amt = sizeof (asection *) * (top_index + 1);
5362
0
  input_list = (asection **) bfd_malloc (amt);
5363
0
  htab->input_list = input_list;
5364
0
  if (input_list == NULL)
5365
0
    return -1;
5366
5367
  /* For sections we aren't interested in, mark their entries with a
5368
     value we can check later.  */
5369
0
  list = input_list + top_index;
5370
0
  do
5371
0
    *list = bfd_abs_section_ptr;
5372
0
  while (list-- != input_list);
5373
5374
0
  for (section = output_bfd->sections;
5375
0
       section != NULL;
5376
0
       section = section->next)
5377
0
    {
5378
0
      if ((section->flags & SEC_CODE) != 0)
5379
0
  input_list[section->index] = NULL;
5380
0
    }
5381
5382
0
  return 1;
5383
0
}
5384
5385
/* The linker repeatedly calls this function for each input section,
5386
   in the order that input sections are linked into output sections.
5387
   Build lists of input sections to determine groupings between which
5388
   we may insert linker stubs.  */
5389
5390
void
5391
elf32_arm_next_input_section (struct bfd_link_info *info,
5392
            asection *isec)
5393
0
{
5394
0
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
5395
5396
0
  if (htab == NULL)
5397
0
    return;
5398
5399
0
  if (isec->output_section->index <= htab->top_index)
5400
0
    {
5401
0
      asection **list = htab->input_list + isec->output_section->index;
5402
5403
0
      if (*list != bfd_abs_section_ptr && (isec->flags & SEC_CODE) != 0)
5404
0
  {
5405
    /* Steal the link_sec pointer for our list.  */
5406
0
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
5407
    /* This happens to make the list in reverse order,
5408
       which we reverse later.  */
5409
0
    PREV_SEC (isec) = *list;
5410
0
    *list = isec;
5411
0
  }
5412
0
    }
5413
0
}
5414
5415
/* See whether we can group stub sections together.  Grouping stub
5416
   sections may result in fewer stubs.  More importantly, we need to
5417
   put all .init* and .fini* stubs at the end of the .init or
5418
   .fini output sections respectively, because glibc splits the
5419
   _init and _fini functions into multiple parts.  Putting a stub in
5420
   the middle of a function is not a good idea.  */
5421
5422
static void
5423
group_sections (struct elf32_arm_link_hash_table *htab,
5424
    bfd_size_type stub_group_size,
5425
    bool stubs_always_after_branch)
5426
0
{
5427
0
  asection **list = htab->input_list;
5428
5429
0
  do
5430
0
    {
5431
0
      asection *tail = *list;
5432
0
      asection *head;
5433
5434
0
      if (tail == bfd_abs_section_ptr)
5435
0
  continue;
5436
5437
      /* Reverse the list: we must avoid placing stubs at the
5438
   beginning of the section because the beginning of the text
5439
   section may be required for an interrupt vector in bare metal
5440
   code.  */
5441
0
#define NEXT_SEC PREV_SEC
5442
0
      head = NULL;
5443
0
      while (tail != NULL)
5444
0
  {
5445
    /* Pop from tail.  */
5446
0
    asection *item = tail;
5447
0
    tail = PREV_SEC (item);
5448
5449
    /* Push on head.  */
5450
0
    NEXT_SEC (item) = head;
5451
0
    head = item;
5452
0
  }
5453
5454
0
      while (head != NULL)
5455
0
  {
5456
0
    asection *curr;
5457
0
    asection *next;
5458
0
    bfd_vma stub_group_start = head->output_offset;
5459
0
    bfd_vma end_of_next;
5460
5461
0
    curr = head;
5462
0
    while (NEXT_SEC (curr) != NULL)
5463
0
      {
5464
0
        next = NEXT_SEC (curr);
5465
0
        end_of_next = next->output_offset + next->size;
5466
0
        if (end_of_next - stub_group_start >= stub_group_size)
5467
    /* End of NEXT is too far from start, so stop.  */
5468
0
    break;
5469
        /* Add NEXT to the group.  */
5470
0
        curr = next;
5471
0
      }
5472
5473
    /* OK, the size from the start to the start of CURR is less
5474
       than stub_group_size and thus can be handled by one stub
5475
       section.  (Or the head section is itself larger than
5476
       stub_group_size, in which case we may be toast.)
5477
       We should really be keeping track of the total size of
5478
       stubs added here, as stubs contribute to the final output
5479
       section size.  */
5480
0
    do
5481
0
      {
5482
0
        next = NEXT_SEC (head);
5483
        /* Set up this stub group.  */
5484
0
        htab->stub_group[head->id].link_sec = curr;
5485
0
      }
5486
0
    while (head != curr && (head = next) != NULL);
5487
5488
    /* But wait, there's more!  Input sections up to stub_group_size
5489
       bytes after the stub section can be handled by it too.  */
5490
0
    if (!stubs_always_after_branch)
5491
0
      {
5492
0
        stub_group_start = curr->output_offset + curr->size;
5493
5494
0
        while (next != NULL)
5495
0
    {
5496
0
      end_of_next = next->output_offset + next->size;
5497
0
      if (end_of_next - stub_group_start >= stub_group_size)
5498
        /* End of NEXT is too far from stubs, so stop.  */
5499
0
        break;
5500
      /* Add NEXT to the stub group.  */
5501
0
      head = next;
5502
0
      next = NEXT_SEC (head);
5503
0
      htab->stub_group[head->id].link_sec = curr;
5504
0
    }
5505
0
      }
5506
0
    head = next;
5507
0
  }
5508
0
    }
5509
0
  while (list++ != htab->input_list + htab->top_index);
5510
5511
0
  free (htab->input_list);
5512
0
#undef PREV_SEC
5513
0
#undef NEXT_SEC
5514
0
}
5515
5516
/* Comparison function for sorting/searching relocations relating to Cortex-A8
5517
   erratum fix.  */
5518
5519
static int
5520
a8_reloc_compare (const void *a, const void *b)
5521
0
{
5522
0
  const struct a8_erratum_reloc *ra = (const struct a8_erratum_reloc *) a;
5523
0
  const struct a8_erratum_reloc *rb = (const struct a8_erratum_reloc *) b;
5524
5525
0
  if (ra->from < rb->from)
5526
0
    return -1;
5527
0
  else if (ra->from > rb->from)
5528
0
    return 1;
5529
0
  else
5530
0
    return 0;
5531
0
}
5532
5533
static struct elf_link_hash_entry *find_thumb_glue (struct bfd_link_info *,
5534
                const char *, char **);
5535
5536
/* Helper function to scan code for sequences which might trigger the Cortex-A8
5537
   branch/TLB erratum.  Fill in the table described by A8_FIXES_P,
5538
   NUM_A8_FIXES_P, A8_FIX_TABLE_SIZE_P.  Returns true if an error occurs, false
5539
   otherwise.  */
5540
5541
static bool
5542
cortex_a8_erratum_scan (bfd *input_bfd,
5543
      struct bfd_link_info *info,
5544
      struct a8_erratum_fix **a8_fixes_p,
5545
      unsigned int *num_a8_fixes_p,
5546
      unsigned int *a8_fix_table_size_p,
5547
      struct a8_erratum_reloc *a8_relocs,
5548
      unsigned int num_a8_relocs,
5549
      unsigned prev_num_a8_fixes,
5550
      bool *stub_changed_p)
5551
0
{
5552
0
  asection *section;
5553
0
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
5554
0
  struct a8_erratum_fix *a8_fixes = *a8_fixes_p;
5555
0
  unsigned int num_a8_fixes = *num_a8_fixes_p;
5556
0
  unsigned int a8_fix_table_size = *a8_fix_table_size_p;
5557
5558
0
  if (htab == NULL)
5559
0
    return false;
5560
5561
0
  for (section = input_bfd->sections;
5562
0
       section != NULL;
5563
0
       section = section->next)
5564
0
    {
5565
0
      bfd_byte *contents = NULL;
5566
0
      struct _arm_elf_section_data *sec_data;
5567
0
      unsigned int span;
5568
0
      bfd_vma base_vma;
5569
5570
0
      if (elf_section_type (section) != SHT_PROGBITS
5571
0
    || (elf_section_flags (section) & SHF_EXECINSTR) == 0
5572
0
    || (section->flags & SEC_EXCLUDE) != 0
5573
0
    || (section->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
5574
0
    || (section->output_section == bfd_abs_section_ptr))
5575
0
  continue;
5576
5577
0
      base_vma = section->output_section->vma + section->output_offset;
5578
5579
0
      if (elf_section_data (section)->this_hdr.contents != NULL)
5580
0
  contents = elf_section_data (section)->this_hdr.contents;
5581
0
      else if (! bfd_malloc_and_get_section (input_bfd, section, &contents))
5582
0
  return true;
5583
5584
0
      sec_data = elf32_arm_section_data (section);
5585
5586
0
      for (span = 0; span < sec_data->mapcount; span++)
5587
0
  {
5588
0
    unsigned int span_start = sec_data->map[span].vma;
5589
0
    unsigned int span_end = (span == sec_data->mapcount - 1)
5590
0
      ? section->size : sec_data->map[span + 1].vma;
5591
0
    unsigned int i;
5592
0
    char span_type = sec_data->map[span].type;
5593
0
    bool last_was_32bit = false, last_was_branch = false;
5594
5595
0
    if (span_type != 't')
5596
0
      continue;
5597
5598
    /* Span is entirely within a single 4KB region: skip scanning.  */
5599
0
    if (((base_vma + span_start) & ~0xfff)
5600
0
        == ((base_vma + span_end) & ~0xfff))
5601
0
      continue;
5602
5603
    /* Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
5604
5605
         * The opcode is BLX.W, BL.W, B.W, Bcc.W
5606
         * The branch target is in the same 4KB region as the
5607
     first half of the branch.
5608
         * The instruction before the branch is a 32-bit
5609
     length non-branch instruction.  */
5610
0
    for (i = span_start; i < span_end;)
5611
0
      {
5612
0
        unsigned int insn = bfd_getl16 (&contents[i]);
5613
0
        bool insn_32bit = false, is_blx = false, is_b = false;
5614
0
        bool is_bl = false, is_bcc = false, is_32bit_branch;
5615
5616
0
        if ((insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000)
5617
0
    insn_32bit = true;
5618
5619
0
        if (insn_32bit)
5620
0
    {
5621
      /* Load the rest of the insn (in manual-friendly order).  */
5622
0
      insn = (insn << 16) | bfd_getl16 (&contents[i + 2]);
5623
5624
      /* Encoding T4: B<c>.W.  */
5625
0
      is_b = (insn & 0xf800d000) == 0xf0009000;
5626
      /* Encoding T1: BL<c>.W.  */
5627
0
      is_bl = (insn & 0xf800d000) == 0xf000d000;
5628
      /* Encoding T2: BLX<c>.W.  */
5629
0
      is_blx = (insn & 0xf800d000) == 0xf000c000;
5630
      /* Encoding T3: B<c>.W (not permitted in IT block).  */
5631
0
      is_bcc = (insn & 0xf800d000) == 0xf0008000
5632
0
         && (insn & 0x07f00000) != 0x03800000;
5633
0
    }
5634
5635
0
        is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
5636
5637
0
        if (((base_vma + i) & 0xfff) == 0xffe
5638
0
      && insn_32bit
5639
0
      && is_32bit_branch
5640
0
      && last_was_32bit
5641
0
      && ! last_was_branch)
5642
0
    {
5643
0
      bfd_signed_vma offset = 0;
5644
0
      bool force_target_arm = false;
5645
0
      bool force_target_thumb = false;
5646
0
      bfd_vma target;
5647
0
      enum elf32_arm_stub_type stub_type = arm_stub_none;
5648
0
      struct a8_erratum_reloc key, *found;
5649
0
      bool use_plt = false;
5650
5651
0
      key.from = base_vma + i;
5652
0
      found = (struct a8_erratum_reloc *)
5653
0
          bsearch (&key, a8_relocs, num_a8_relocs,
5654
0
             sizeof (struct a8_erratum_reloc),
5655
0
             &a8_reloc_compare);
5656
5657
0
      if (found)
5658
0
        {
5659
0
          char *error_message = NULL;
5660
0
          struct elf_link_hash_entry *entry;
5661
5662
          /* We don't care about the error returned from this
5663
       function, only if there is glue or not.  */
5664
0
          entry = find_thumb_glue (info, found->sym_name,
5665
0
                 &error_message);
5666
5667
0
          if (entry)
5668
0
      found->non_a8_stub = true;
5669
5670
          /* Keep a simpler condition, for the sake of clarity.  */
5671
0
          if (htab->root.splt != NULL && found->hash != NULL
5672
0
        && found->hash->root.plt.offset != (bfd_vma) -1)
5673
0
      use_plt = true;
5674
5675
0
          if (found->r_type == R_ARM_THM_CALL)
5676
0
      {
5677
0
        if (found->branch_type == ST_BRANCH_TO_ARM
5678
0
            || use_plt)
5679
0
          force_target_arm = true;
5680
0
        else
5681
0
          force_target_thumb = true;
5682
0
      }
5683
0
        }
5684
5685
      /* Check if we have an offending branch instruction.  */
5686
5687
0
      if (found && found->non_a8_stub)
5688
        /* We've already made a stub for this instruction, e.g.
5689
           it's a long branch or a Thumb->ARM stub.  Assume that
5690
           stub will suffice to work around the A8 erratum (see
5691
           setting of always_after_branch above).  */
5692
0
        ;
5693
0
      else if (is_bcc)
5694
0
        {
5695
0
          offset = (insn & 0x7ff) << 1;
5696
0
          offset |= (insn & 0x3f0000) >> 4;
5697
0
          offset |= (insn & 0x2000) ? 0x40000 : 0;
5698
0
          offset |= (insn & 0x800) ? 0x80000 : 0;
5699
0
          offset |= (insn & 0x4000000) ? 0x100000 : 0;
5700
0
          if (offset & 0x100000)
5701
0
      offset |= ~ ((bfd_signed_vma) 0xfffff);
5702
0
          stub_type = arm_stub_a8_veneer_b_cond;
5703
0
        }
5704
0
      else if (is_b || is_bl || is_blx)
5705
0
        {
5706
0
          int s = (insn & 0x4000000) != 0;
5707
0
          int j1 = (insn & 0x2000) != 0;
5708
0
          int j2 = (insn & 0x800) != 0;
5709
0
          int i1 = !(j1 ^ s);
5710
0
          int i2 = !(j2 ^ s);
5711
5712
0
          offset = (insn & 0x7ff) << 1;
5713
0
          offset |= (insn & 0x3ff0000) >> 4;
5714
0
          offset |= i2 << 22;
5715
0
          offset |= i1 << 23;
5716
0
          offset |= s << 24;
5717
0
          if (offset & 0x1000000)
5718
0
      offset |= ~ ((bfd_signed_vma) 0xffffff);
5719
5720
0
          if (is_blx)
5721
0
      offset &= ~ ((bfd_signed_vma) 3);
5722
5723
0
          stub_type = is_blx ? arm_stub_a8_veneer_blx :
5724
0
      is_bl ? arm_stub_a8_veneer_bl : arm_stub_a8_veneer_b;
5725
0
        }
5726
5727
0
      if (stub_type != arm_stub_none)
5728
0
        {
5729
0
          bfd_vma pc_for_insn = base_vma + i + 4;
5730
5731
          /* The original instruction is a BL, but the target is
5732
       an ARM instruction.  If we were not making a stub,
5733
       the BL would have been converted to a BLX.  Use the
5734
       BLX stub instead in that case.  */
5735
0
          if (htab->use_blx && force_target_arm
5736
0
        && stub_type == arm_stub_a8_veneer_bl)
5737
0
      {
5738
0
        stub_type = arm_stub_a8_veneer_blx;
5739
0
        is_blx = true;
5740
0
        is_bl = false;
5741
0
      }
5742
          /* Conversely, if the original instruction was
5743
       BLX but the target is Thumb mode, use the BL
5744
       stub.  */
5745
0
          else if (force_target_thumb
5746
0
             && stub_type == arm_stub_a8_veneer_blx)
5747
0
      {
5748
0
        stub_type = arm_stub_a8_veneer_bl;
5749
0
        is_blx = false;
5750
0
        is_bl = true;
5751
0
      }
5752
5753
0
          if (is_blx)
5754
0
      pc_for_insn &= ~ ((bfd_vma) 3);
5755
5756
          /* If we found a relocation, use the proper destination,
5757
       not the offset in the (unrelocated) instruction.
5758
       Note this is always done if we switched the stub type
5759
       above.  */
5760
0
          if (found)
5761
0
      offset =
5762
0
        (bfd_signed_vma) (found->destination - pc_for_insn);
5763
5764
          /* If the stub will use a Thumb-mode branch to a
5765
       PLT target, redirect it to the preceding Thumb
5766
       entry point.  */
5767
0
          if (stub_type != arm_stub_a8_veneer_blx && use_plt)
5768
0
      offset -= PLT_THUMB_STUB_SIZE;
5769
5770
0
          target = pc_for_insn + offset;
5771
5772
          /* The BLX stub is ARM-mode code.  Adjust the offset to
5773
       take the different PC value (+8 instead of +4) into
5774
       account.  */
5775
0
          if (stub_type == arm_stub_a8_veneer_blx)
5776
0
      offset += 4;
5777
5778
0
          if (((base_vma + i) & ~0xfff) == (target & ~0xfff))
5779
0
      {
5780
0
        char *stub_name = NULL;
5781
5782
0
        if (num_a8_fixes == a8_fix_table_size)
5783
0
          {
5784
0
            a8_fix_table_size *= 2;
5785
0
            a8_fixes = (struct a8_erratum_fix *)
5786
0
          bfd_realloc (a8_fixes,
5787
0
                 sizeof (struct a8_erratum_fix)
5788
0
                 * a8_fix_table_size);
5789
0
          }
5790
5791
0
        if (num_a8_fixes < prev_num_a8_fixes)
5792
0
          {
5793
            /* If we're doing a subsequent scan,
5794
         check if we've found the same fix as
5795
         before, and try and reuse the stub
5796
         name.  */
5797
0
            stub_name = a8_fixes[num_a8_fixes].stub_name;
5798
0
            if ((a8_fixes[num_a8_fixes].section != section)
5799
0
          || (a8_fixes[num_a8_fixes].offset != i))
5800
0
        {
5801
0
          free (stub_name);
5802
0
          stub_name = NULL;
5803
0
          *stub_changed_p = true;
5804
0
        }
5805
0
          }
5806
5807
0
        if (!stub_name)
5808
0
          {
5809
0
            stub_name = (char *) bfd_malloc (8 + 1 + 8 + 1);
5810
0
            if (stub_name != NULL)
5811
0
        sprintf (stub_name, "%x:%x", section->id, i);
5812
0
          }
5813
5814
0
        a8_fixes[num_a8_fixes].input_bfd = input_bfd;
5815
0
        a8_fixes[num_a8_fixes].section = section;
5816
0
        a8_fixes[num_a8_fixes].offset = i;
5817
0
        a8_fixes[num_a8_fixes].target_offset =
5818
0
          target - base_vma;
5819
0
        a8_fixes[num_a8_fixes].orig_insn = insn;
5820
0
        a8_fixes[num_a8_fixes].stub_name = stub_name;
5821
0
        a8_fixes[num_a8_fixes].stub_type = stub_type;
5822
0
        a8_fixes[num_a8_fixes].branch_type =
5823
0
          is_blx ? ST_BRANCH_TO_ARM : ST_BRANCH_TO_THUMB;
5824
5825
0
        num_a8_fixes++;
5826
0
      }
5827
0
        }
5828
0
    }
5829
5830
0
        i += insn_32bit ? 4 : 2;
5831
0
        last_was_32bit = insn_32bit;
5832
0
        last_was_branch = is_32bit_branch;
5833
0
      }
5834
0
  }
5835
5836
0
      if (elf_section_data (section)->this_hdr.contents == NULL)
5837
0
  free (contents);
5838
0
    }
5839
5840
0
  *a8_fixes_p = a8_fixes;
5841
0
  *num_a8_fixes_p = num_a8_fixes;
5842
0
  *a8_fix_table_size_p = a8_fix_table_size;
5843
5844
0
  return false;
5845
0
}
5846
5847
/* Create or update a stub entry depending on whether the stub can already be
5848
   found in HTAB.  The stub is identified by:
5849
   - its type STUB_TYPE
5850
   - its source branch (note that several can share the same stub) whose
5851
     section and relocation (if any) are given by SECTION and IRELA
5852
     respectively
5853
   - its target symbol whose input section, hash, name, value and branch type
5854
     are given in SYM_SEC, HASH, SYM_NAME, SYM_VALUE and BRANCH_TYPE
5855
     respectively
5856
5857
   If found, the value of the stub's target symbol is updated from SYM_VALUE
5858
   and *NEW_STUB is set to FALSE.  Otherwise, *NEW_STUB is set to
5859
   TRUE and the stub entry is initialized.
5860
5861
   Returns the stub that was created or updated, or NULL if an error
5862
   occurred.  */
5863
5864
static struct elf32_arm_stub_hash_entry *
5865
elf32_arm_create_stub (struct elf32_arm_link_hash_table *htab,
5866
           enum elf32_arm_stub_type stub_type, asection *section,
5867
           Elf_Internal_Rela *irela, asection *sym_sec,
5868
           struct elf32_arm_link_hash_entry *hash, char *sym_name,
5869
           bfd_vma sym_value, enum arm_st_branch_type branch_type,
5870
           bool *new_stub)
5871
0
{
5872
0
  const asection *id_sec;
5873
0
  char *stub_name;
5874
0
  struct elf32_arm_stub_hash_entry *stub_entry;
5875
0
  unsigned int r_type;
5876
0
  bool sym_claimed = arm_stub_sym_claimed (stub_type);
5877
5878
0
  BFD_ASSERT (stub_type != arm_stub_none);
5879
0
  *new_stub = false;
5880
5881
0
  if (sym_claimed)
5882
0
    stub_name = sym_name;
5883
0
  else
5884
0
    {
5885
0
      BFD_ASSERT (irela);
5886
0
      BFD_ASSERT (section);
5887
0
      BFD_ASSERT (section->id <= htab->top_id);
5888
5889
      /* Support for grouping stub sections.  */
5890
0
      id_sec = htab->stub_group[section->id].link_sec;
5891
5892
      /* Get the name of this stub.  */
5893
0
      stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash, irela,
5894
0
               stub_type);
5895
0
      if (!stub_name)
5896
0
  return NULL;
5897
0
    }
5898
5899
0
  stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name, false,
5900
0
             false);
5901
  /* The proper stub has already been created, just update its value.  */
5902
0
  if (stub_entry != NULL)
5903
0
    {
5904
0
      if (!sym_claimed)
5905
0
  free (stub_name);
5906
0
      stub_entry->target_value = sym_value;
5907
0
      return stub_entry;
5908
0
    }
5909
5910
0
  stub_entry = elf32_arm_add_stub (stub_name, section, htab, stub_type);
5911
0
  if (stub_entry == NULL)
5912
0
    {
5913
0
      if (!sym_claimed)
5914
0
  free (stub_name);
5915
0
      return NULL;
5916
0
    }
5917
5918
0
  stub_entry->target_value = sym_value;
5919
0
  stub_entry->target_section = sym_sec;
5920
0
  stub_entry->stub_type = stub_type;
5921
0
  stub_entry->h = hash;
5922
0
  stub_entry->branch_type = branch_type;
5923
5924
0
  if (sym_claimed)
5925
0
    stub_entry->output_name = sym_name;
5926
0
  else
5927
0
    {
5928
0
      if (sym_name == NULL)
5929
0
  sym_name = "unnamed";
5930
0
      stub_entry->output_name = (char *)
5931
0
  bfd_alloc (htab->stub_bfd, sizeof (THUMB2ARM_GLUE_ENTRY_NAME)
5932
0
           + strlen (sym_name));
5933
0
      if (stub_entry->output_name == NULL)
5934
0
  {
5935
0
    free (stub_name);
5936
0
    return NULL;
5937
0
  }
5938
5939
      /* For historical reasons, use the existing names for ARM-to-Thumb and
5940
   Thumb-to-ARM stubs.  */
5941
0
      r_type = ELF32_R_TYPE (irela->r_info);
5942
0
      if ((r_type == (unsigned int) R_ARM_THM_CALL
5943
0
     || r_type == (unsigned int) R_ARM_THM_JUMP24
5944
0
     || r_type == (unsigned int) R_ARM_THM_JUMP19)
5945
0
    && branch_type == ST_BRANCH_TO_ARM)
5946
0
  sprintf (stub_entry->output_name, THUMB2ARM_GLUE_ENTRY_NAME, sym_name);
5947
0
      else if ((r_type == (unsigned int) R_ARM_CALL
5948
0
    || r_type == (unsigned int) R_ARM_JUMP24)
5949
0
         && branch_type == ST_BRANCH_TO_THUMB)
5950
0
  sprintf (stub_entry->output_name, ARM2THUMB_GLUE_ENTRY_NAME, sym_name);
5951
0
      else
5952
0
  sprintf (stub_entry->output_name, STUB_ENTRY_NAME, sym_name);
5953
0
    }
5954
5955
0
  *new_stub = true;
5956
0
  return stub_entry;
5957
0
}
5958
5959
/* Scan symbols in INPUT_BFD to identify secure entry functions needing a
5960
   gateway veneer to transition from non secure to secure state and create them
5961
   accordingly.
5962
5963
   "ARMv8-M Security Extensions: Requirements on Development Tools" document
5964
   defines the conditions that govern Secure Gateway veneer creation for a
5965
   given symbol <SYM> as follows:
5966
   - it has function type
5967
   - it has non local binding
5968
   - a symbol named __acle_se_<SYM> (called special symbol) exists with the
5969
     same type, binding and value as <SYM> (called normal symbol).
5970
   An entry function can handle secure state transition itself in which case
5971
   its special symbol would have a different value from the normal symbol.
5972
5973
   OUT_ATTR gives the output attributes, SYM_HASHES the symbol index to hash
5974
   entry mapping while HTAB gives the name to hash entry mapping.
5975
   *CMSE_STUB_CREATED is increased by the number of secure gateway veneer
5976
   created.
5977
5978
   The return value gives whether a stub failed to be allocated.  */
5979
5980
static bool
5981
cmse_scan (bfd *input_bfd, struct elf32_arm_link_hash_table *htab,
5982
     obj_attribute *out_attr, struct elf_link_hash_entry **sym_hashes,
5983
     int *cmse_stub_created)
5984
0
{
5985
0
  const struct elf_backend_data *bed;
5986
0
  Elf_Internal_Shdr *symtab_hdr;
5987
0
  unsigned i, j, sym_count, ext_start;
5988
0
  Elf_Internal_Sym *cmse_sym, *local_syms;
5989
0
  struct elf32_arm_link_hash_entry *hash, *cmse_hash = NULL;
5990
0
  enum arm_st_branch_type branch_type;
5991
0
  char *sym_name, *lsym_name;
5992
0
  bfd_vma sym_value;
5993
0
  asection *section;
5994
0
  struct elf32_arm_stub_hash_entry *stub_entry;
5995
0
  bool is_v8m, new_stub, cmse_invalid, ret = true;
5996
5997
0
  bed = get_elf_backend_data (input_bfd);
5998
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5999
0
  sym_count = symtab_hdr->sh_size / bed->s->sizeof_sym;
6000
0
  ext_start = symtab_hdr->sh_info;
6001
0
  is_v8m = (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V8M_BASE
6002
0
      && out_attr[Tag_CPU_arch_profile].i == 'M');
6003
6004
0
  local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
6005
0
  if (local_syms == NULL)
6006
0
    local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
6007
0
               symtab_hdr->sh_info, 0, NULL, NULL,
6008
0
               NULL);
6009
0
  if (symtab_hdr->sh_info && local_syms == NULL)
6010
0
    return false;
6011
6012
  /* Scan symbols.  */
6013
0
  for (i = 0; i < sym_count; i++)
6014
0
    {
6015
0
      cmse_invalid = false;
6016
6017
0
      if (i < ext_start)
6018
0
  {
6019
0
    cmse_sym = &local_syms[i];
6020
0
    sym_name = bfd_elf_string_from_elf_section (input_bfd,
6021
0
                  symtab_hdr->sh_link,
6022
0
                  cmse_sym->st_name);
6023
0
    if (!sym_name || !startswith (sym_name, CMSE_PREFIX))
6024
0
      continue;
6025
6026
    /* Special symbol with local binding.  */
6027
0
    cmse_invalid = true;
6028
0
  }
6029
0
      else
6030
0
  {
6031
0
    cmse_hash = elf32_arm_hash_entry (sym_hashes[i - ext_start]);
6032
0
    if (cmse_hash == NULL)
6033
0
      continue;
6034
6035
0
    sym_name = (char *) cmse_hash->root.root.root.string;
6036
0
    if (!startswith (sym_name, CMSE_PREFIX))
6037
0
      continue;
6038
6039
    /* Special symbol has incorrect binding or type.  */
6040
0
    if ((cmse_hash->root.root.type != bfd_link_hash_defined
6041
0
         && cmse_hash->root.root.type != bfd_link_hash_defweak)
6042
0
        || cmse_hash->root.type != STT_FUNC)
6043
0
      cmse_invalid = true;
6044
0
  }
6045
6046
0
      if (!is_v8m)
6047
0
  {
6048
0
    _bfd_error_handler (_("%pB: special symbol `%s' only allowed for "
6049
0
        "ARMv8-M architecture or later"),
6050
0
            input_bfd, sym_name);
6051
0
    is_v8m = true; /* Avoid multiple warning.  */
6052
0
    ret = false;
6053
0
  }
6054
6055
0
      if (cmse_invalid)
6056
0
  {
6057
0
    _bfd_error_handler (_("%pB: invalid special symbol `%s'; it must be"
6058
0
        " a global or weak function symbol"),
6059
0
            input_bfd, sym_name);
6060
0
    ret = false;
6061
0
    if (i < ext_start)
6062
0
      continue;
6063
0
  }
6064
6065
0
      sym_name += strlen (CMSE_PREFIX);
6066
0
      hash = (struct elf32_arm_link_hash_entry *)
6067
0
  elf_link_hash_lookup (&(htab)->root, sym_name, false, false, true);
6068
6069
      /* No associated normal symbol or it is neither global nor weak.  */
6070
0
      if (!hash
6071
0
    || (hash->root.root.type != bfd_link_hash_defined
6072
0
        && hash->root.root.type != bfd_link_hash_defweak)
6073
0
    || hash->root.type != STT_FUNC)
6074
0
  {
6075
    /* Initialize here to avoid warning about use of possibly
6076
       uninitialized variable.  */
6077
0
    j = 0;
6078
6079
0
    if (!hash)
6080
0
      {
6081
        /* Searching for a normal symbol with local binding.  */
6082
0
        for (; j < ext_start; j++)
6083
0
    {
6084
0
      lsym_name =
6085
0
        bfd_elf_string_from_elf_section (input_bfd,
6086
0
                 symtab_hdr->sh_link,
6087
0
                 local_syms[j].st_name);
6088
0
      if (!strcmp (sym_name, lsym_name))
6089
0
        break;
6090
0
    }
6091
0
      }
6092
6093
0
    if (hash || j < ext_start)
6094
0
      {
6095
0
        _bfd_error_handler
6096
0
    (_("%pB: invalid standard symbol `%s'; it must be "
6097
0
       "a global or weak function symbol"),
6098
0
     input_bfd, sym_name);
6099
0
      }
6100
0
    else
6101
0
      _bfd_error_handler
6102
0
        (_("%pB: absent standard symbol `%s'"), input_bfd, sym_name);
6103
0
    ret = false;
6104
0
    if (!hash)
6105
0
      continue;
6106
0
  }
6107
6108
0
      sym_value = hash->root.root.u.def.value;
6109
0
      section = hash->root.root.u.def.section;
6110
6111
0
      if (cmse_hash->root.root.u.def.section != section)
6112
0
  {
6113
0
    _bfd_error_handler
6114
0
      (_("%pB: `%s' and its special symbol are in different sections"),
6115
0
       input_bfd, sym_name);
6116
0
    ret = false;
6117
0
  }
6118
0
      if (cmse_hash->root.root.u.def.value != sym_value)
6119
0
  continue; /* Ignore: could be an entry function starting with SG.  */
6120
6121
  /* If this section is a link-once section that will be discarded, then
6122
     don't create any stubs.  */
6123
0
      if (section->output_section == NULL)
6124
0
  {
6125
0
    _bfd_error_handler
6126
0
      (_("%pB: entry function `%s' not output"), input_bfd, sym_name);
6127
0
    continue;
6128
0
  }
6129
6130
0
      if (hash->root.size == 0)
6131
0
  {
6132
0
    _bfd_error_handler
6133
0
      (_("%pB: entry function `%s' is empty"), input_bfd, sym_name);
6134
0
    ret = false;
6135
0
  }
6136
6137
0
      if (!ret)
6138
0
  continue;
6139
0
      branch_type = ARM_GET_SYM_BRANCH_TYPE (hash->root.target_internal);
6140
0
      stub_entry
6141
0
  = elf32_arm_create_stub (htab, arm_stub_cmse_branch_thumb_only,
6142
0
         NULL, NULL, section, hash, sym_name,
6143
0
         sym_value, branch_type, &new_stub);
6144
6145
0
      if (stub_entry == NULL)
6146
0
   ret = false;
6147
0
      else
6148
0
  {
6149
0
    BFD_ASSERT (new_stub);
6150
0
    (*cmse_stub_created)++;
6151
0
  }
6152
0
    }
6153
6154
0
  if (!symtab_hdr->contents)
6155
0
    free (local_syms);
6156
0
  return ret;
6157
0
}
6158
6159
/* Return TRUE iff a symbol identified by its linker HASH entry is a secure
6160
   code entry function, ie can be called from non secure code without using a
6161
   veneer.  */
6162
6163
static bool
6164
cmse_entry_fct_p (struct elf32_arm_link_hash_entry *hash)
6165
0
{
6166
0
  bfd_byte contents[4];
6167
0
  uint32_t first_insn;
6168
0
  asection *section;
6169
0
  file_ptr offset;
6170
0
  bfd *abfd;
6171
6172
  /* Defined symbol of function type.  */
6173
0
  if (hash->root.root.type != bfd_link_hash_defined
6174
0
      && hash->root.root.type != bfd_link_hash_defweak)
6175
0
    return false;
6176
0
  if (hash->root.type != STT_FUNC)
6177
0
    return false;
6178
6179
  /* Read first instruction.  */
6180
0
  section = hash->root.root.u.def.section;
6181
0
  abfd = section->owner;
6182
0
  offset = hash->root.root.u.def.value - section->vma;
6183
0
  if (!bfd_get_section_contents (abfd, section, contents, offset,
6184
0
         sizeof (contents)))
6185
0
    return false;
6186
6187
0
  first_insn = bfd_get_32 (abfd, contents);
6188
6189
  /* Starts by SG instruction.  */
6190
0
  return first_insn == 0xe97fe97f;
6191
0
}
6192
6193
/* Output the name (in symbol table) of the veneer GEN_ENTRY if it is a new
6194
   secure gateway veneers (ie. the veneers was not in the input import library)
6195
   and there is no output import library (GEN_INFO->out_implib_bfd is NULL.  */
6196
6197
static bool
6198
arm_list_new_cmse_stub (struct bfd_hash_entry *gen_entry, void *gen_info)
6199
0
{
6200
0
  struct elf32_arm_stub_hash_entry *stub_entry;
6201
0
  struct bfd_link_info *info;
6202
6203
  /* Massage our args to the form they really have.  */
6204
0
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
6205
0
  info = (struct bfd_link_info *) gen_info;
6206
6207
0
  if (info->out_implib_bfd)
6208
0
    return true;
6209
6210
0
  if (stub_entry->stub_type != arm_stub_cmse_branch_thumb_only)
6211
0
    return true;
6212
6213
0
  if (stub_entry->stub_offset == (bfd_vma) -1)
6214
0
    _bfd_error_handler ("  %s", stub_entry->output_name);
6215
6216
0
  return true;
6217
0
}
6218
6219
/* Set offset of each secure gateway veneers so that its address remain
6220
   identical to the one in the input import library referred by
6221
   HTAB->in_implib_bfd.  A warning is issued for veneers that disappeared
6222
   (present in input import library but absent from the executable being
6223
   linked) or if new veneers appeared and there is no output import library
6224
   (INFO->out_implib_bfd is NULL and *CMSE_STUB_CREATED is bigger than the
6225
   number of secure gateway veneers found in the input import library.
6226
6227
   The function returns whether an error occurred.  If no error occurred,
6228
   *CMSE_STUB_CREATED gives the number of SG veneers created by both cmse_scan
6229
   and this function and HTAB->new_cmse_stub_offset is set to the biggest
6230
   veneer observed set for new veneers to be layed out after.  */
6231
6232
static bool
6233
set_cmse_veneer_addr_from_implib (struct bfd_link_info *info,
6234
          struct elf32_arm_link_hash_table *htab,
6235
          int *cmse_stub_created)
6236
0
{
6237
0
  long symsize;
6238
0
  char *sym_name;
6239
0
  flagword flags;
6240
0
  long i, symcount;
6241
0
  bfd *in_implib_bfd;
6242
0
  asection *stub_out_sec;
6243
0
  bool ret = true;
6244
0
  Elf_Internal_Sym *intsym;
6245
0
  const char *out_sec_name;
6246
0
  bfd_size_type cmse_stub_size;
6247
0
  asymbol **sympp = NULL, *sym;
6248
0
  struct elf32_arm_link_hash_entry *hash;
6249
0
  const insn_sequence *cmse_stub_template;
6250
0
  struct elf32_arm_stub_hash_entry *stub_entry;
6251
0
  int cmse_stub_template_size, new_cmse_stubs_created = *cmse_stub_created;
6252
0
  bfd_vma veneer_value, stub_offset, next_cmse_stub_offset;
6253
0
  bfd_vma cmse_stub_array_start = (bfd_vma) -1, cmse_stub_sec_vma = 0;
6254
6255
  /* No input secure gateway import library.  */
6256
0
  if (!htab->in_implib_bfd)
6257
0
    return true;
6258
6259
0
  in_implib_bfd = htab->in_implib_bfd;
6260
0
  if (!htab->cmse_implib)
6261
0
    {
6262
0
      _bfd_error_handler (_("%pB: --in-implib only supported for Secure "
6263
0
          "Gateway import libraries"), in_implib_bfd);
6264
0
      return false;
6265
0
    }
6266
6267
  /* Get symbol table size.  */
6268
0
  symsize = bfd_get_symtab_upper_bound (in_implib_bfd);
6269
0
  if (symsize < 0)
6270
0
    return false;
6271
6272
  /* Read in the input secure gateway import library's symbol table.  */
6273
0
  sympp = (asymbol **) bfd_malloc (symsize);
6274
0
  if (sympp == NULL)
6275
0
    return false;
6276
6277
0
  symcount = bfd_canonicalize_symtab (in_implib_bfd, sympp);
6278
0
  if (symcount < 0)
6279
0
    {
6280
0
      ret = false;
6281
0
      goto free_sym_buf;
6282
0
    }
6283
6284
0
  htab->new_cmse_stub_offset = 0;
6285
0
  cmse_stub_size =
6286
0
    find_stub_size_and_template (arm_stub_cmse_branch_thumb_only,
6287
0
         &cmse_stub_template,
6288
0
         &cmse_stub_template_size);
6289
0
  out_sec_name =
6290
0
    arm_dedicated_stub_output_section_name (arm_stub_cmse_branch_thumb_only);
6291
0
  stub_out_sec =
6292
0
    bfd_get_section_by_name (htab->obfd, out_sec_name);
6293
0
  if (stub_out_sec != NULL)
6294
0
    cmse_stub_sec_vma = stub_out_sec->vma;
6295
6296
  /* Set addresses of veneers mentionned in input secure gateway import
6297
     library's symbol table.  */
6298
0
  for (i = 0; i < symcount; i++)
6299
0
    {
6300
0
      sym = sympp[i];
6301
0
      flags = sym->flags;
6302
0
      sym_name = (char *) bfd_asymbol_name (sym);
6303
0
      intsym = &((elf_symbol_type *) sym)->internal_elf_sym;
6304
6305
0
      if (sym->section != bfd_abs_section_ptr
6306
0
    || !(flags & (BSF_GLOBAL | BSF_WEAK))
6307
0
    || (flags & BSF_FUNCTION) != BSF_FUNCTION
6308
0
    || (ARM_GET_SYM_BRANCH_TYPE (intsym->st_target_internal)
6309
0
        != ST_BRANCH_TO_THUMB))
6310
0
  {
6311
0
    _bfd_error_handler (_("%pB: invalid import library entry: `%s'; "
6312
0
        "symbol should be absolute, global and "
6313
0
        "refer to Thumb functions"),
6314
0
            in_implib_bfd, sym_name);
6315
0
    ret = false;
6316
0
    continue;
6317
0
  }
6318
6319
0
      veneer_value = bfd_asymbol_value (sym);
6320
0
      stub_offset = veneer_value - cmse_stub_sec_vma;
6321
0
      stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, sym_name,
6322
0
           false, false);
6323
0
      hash = (struct elf32_arm_link_hash_entry *)
6324
0
  elf_link_hash_lookup (&(htab)->root, sym_name, false, false, true);
6325
6326
      /* Stub entry should have been created by cmse_scan or the symbol be of
6327
   a secure function callable from non secure code.  */
6328
0
      if (!stub_entry && !hash)
6329
0
  {
6330
0
    bool new_stub;
6331
6332
0
    _bfd_error_handler
6333
0
      (_("entry function `%s' disappeared from secure code"), sym_name);
6334
0
    hash = (struct elf32_arm_link_hash_entry *)
6335
0
      elf_link_hash_lookup (&(htab)->root, sym_name, true, true, true);
6336
0
    stub_entry
6337
0
      = elf32_arm_create_stub (htab, arm_stub_cmse_branch_thumb_only,
6338
0
             NULL, NULL, bfd_abs_section_ptr, hash,
6339
0
             sym_name, veneer_value,
6340
0
             ST_BRANCH_TO_THUMB, &new_stub);
6341
0
    if (stub_entry == NULL)
6342
0
      ret = false;
6343
0
    else
6344
0
    {
6345
0
      BFD_ASSERT (new_stub);
6346
0
      new_cmse_stubs_created++;
6347
0
      (*cmse_stub_created)++;
6348
0
    }
6349
0
    stub_entry->stub_template_size = stub_entry->stub_size = 0;
6350
0
    stub_entry->stub_offset = stub_offset;
6351
0
  }
6352
      /* Symbol found is not callable from non secure code.  */
6353
0
      else if (!stub_entry)
6354
0
  {
6355
0
    if (!cmse_entry_fct_p (hash))
6356
0
      {
6357
0
        _bfd_error_handler (_("`%s' refers to a non entry function"),
6358
0
          sym_name);
6359
0
        ret = false;
6360
0
      }
6361
0
    continue;
6362
0
  }
6363
0
      else
6364
0
  {
6365
    /* Only stubs for SG veneers should have been created.  */
6366
0
    BFD_ASSERT (stub_entry->stub_type == arm_stub_cmse_branch_thumb_only);
6367
6368
    /* Check visibility hasn't changed.  */
6369
0
    if (!!(flags & BSF_GLOBAL)
6370
0
        != (hash->root.root.type == bfd_link_hash_defined))
6371
0
      _bfd_error_handler
6372
0
        (_("%pB: visibility of symbol `%s' has changed"), in_implib_bfd,
6373
0
         sym_name);
6374
6375
0
    stub_entry->stub_offset = stub_offset;
6376
0
  }
6377
6378
      /* Size should match that of a SG veneer.  */
6379
0
      if (intsym->st_size != cmse_stub_size)
6380
0
  {
6381
0
    _bfd_error_handler (_("%pB: incorrect size for symbol `%s'"),
6382
0
            in_implib_bfd, sym_name);
6383
0
    ret = false;
6384
0
  }
6385
6386
      /* Previous veneer address is before current SG veneer section.  */
6387
0
      if (veneer_value < cmse_stub_sec_vma)
6388
0
  {
6389
    /* Avoid offset underflow.  */
6390
0
    if (stub_entry)
6391
0
      stub_entry->stub_offset = 0;
6392
0
    stub_offset = 0;
6393
0
    ret = false;
6394
0
  }
6395
6396
      /* Complain if stub offset not a multiple of stub size.  */
6397
0
      if (stub_offset % cmse_stub_size)
6398
0
  {
6399
0
    _bfd_error_handler
6400
0
      (_("offset of veneer for entry function `%s' not a multiple of "
6401
0
         "its size"), sym_name);
6402
0
    ret = false;
6403
0
  }
6404
6405
0
      if (!ret)
6406
0
  continue;
6407
6408
0
      new_cmse_stubs_created--;
6409
0
      if (veneer_value < cmse_stub_array_start)
6410
0
  cmse_stub_array_start = veneer_value;
6411
0
      next_cmse_stub_offset = stub_offset + ((cmse_stub_size + 7) & ~7);
6412
0
      if (next_cmse_stub_offset > htab->new_cmse_stub_offset)
6413
0
  htab->new_cmse_stub_offset = next_cmse_stub_offset;
6414
0
    }
6415
6416
0
  if (!info->out_implib_bfd && new_cmse_stubs_created != 0)
6417
0
    {
6418
0
      BFD_ASSERT (new_cmse_stubs_created > 0);
6419
0
      _bfd_error_handler
6420
0
  (_("new entry function(s) introduced but no output import library "
6421
0
     "specified:"));
6422
0
      bfd_hash_traverse (&htab->stub_hash_table, arm_list_new_cmse_stub, info);
6423
0
    }
6424
6425
0
  if (cmse_stub_array_start != cmse_stub_sec_vma)
6426
0
    {
6427
0
      _bfd_error_handler
6428
0
  (_("start address of `%s' is different from previous link"),
6429
0
   out_sec_name);
6430
0
      ret = false;
6431
0
    }
6432
6433
0
 free_sym_buf:
6434
0
  free (sympp);
6435
0
  return ret;
6436
0
}
6437
6438
/* Determine and set the size of the stub section for a final link.
6439
6440
   The basic idea here is to examine all the relocations looking for
6441
   PC-relative calls to a target that is unreachable with a "bl"
6442
   instruction.  */
6443
6444
bool
6445
elf32_arm_size_stubs (bfd *output_bfd,
6446
          bfd *stub_bfd,
6447
          struct bfd_link_info *info,
6448
          bfd_signed_vma group_size,
6449
          asection * (*add_stub_section) (const char *, asection *,
6450
                  asection *,
6451
                  unsigned int),
6452
          void (*layout_sections_again) (void))
6453
0
{
6454
0
  bool ret = true;
6455
0
  obj_attribute *out_attr;
6456
0
  int cmse_stub_created = 0;
6457
0
  bfd_size_type stub_group_size;
6458
0
  bool m_profile, stubs_always_after_branch, first_veneer_scan = true;
6459
0
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
6460
0
  struct a8_erratum_fix *a8_fixes = NULL;
6461
0
  unsigned int num_a8_fixes = 0, a8_fix_table_size = 10;
6462
0
  struct a8_erratum_reloc *a8_relocs = NULL;
6463
0
  unsigned int num_a8_relocs = 0, a8_reloc_table_size = 10, i;
6464
6465
0
  if (htab == NULL)
6466
0
    return false;
6467
6468
0
  if (htab->fix_cortex_a8)
6469
0
    {
6470
0
      a8_fixes = (struct a8_erratum_fix *)
6471
0
    bfd_zmalloc (sizeof (struct a8_erratum_fix) * a8_fix_table_size);
6472
0
      a8_relocs = (struct a8_erratum_reloc *)
6473
0
    bfd_zmalloc (sizeof (struct a8_erratum_reloc) * a8_reloc_table_size);
6474
0
    }
6475
6476
  /* Propagate mach to stub bfd, because it may not have been
6477
     finalized when we created stub_bfd.  */
6478
0
  bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
6479
0
         bfd_get_mach (output_bfd));
6480
6481
  /* Stash our params away.  */
6482
0
  htab->stub_bfd = stub_bfd;
6483
0
  htab->add_stub_section = add_stub_section;
6484
0
  htab->layout_sections_again = layout_sections_again;
6485
0
  stubs_always_after_branch = group_size < 0;
6486
6487
0
  out_attr = elf_known_obj_attributes_proc (output_bfd);
6488
0
  m_profile = out_attr[Tag_CPU_arch_profile].i == 'M';
6489
6490
  /* The Cortex-A8 erratum fix depends on stubs not being in the same 4K page
6491
     as the first half of a 32-bit branch straddling two 4K pages.  This is a
6492
     crude way of enforcing that.  */
6493
0
  if (htab->fix_cortex_a8)
6494
0
    stubs_always_after_branch = 1;
6495
6496
0
  if (group_size < 0)
6497
0
    stub_group_size = -group_size;
6498
0
  else
6499
0
    stub_group_size = group_size;
6500
6501
0
  if (stub_group_size == 1)
6502
0
    {
6503
      /* Default values.  */
6504
      /* Thumb branch range is +-4MB has to be used as the default
6505
   maximum size (a given section can contain both ARM and Thumb
6506
   code, so the worst case has to be taken into account).
6507
6508
   This value is 24K less than that, which allows for 2025
6509
   12-byte stubs.  If we exceed that, then we will fail to link.
6510
   The user will have to relink with an explicit group size
6511
   option.  */
6512
0
      stub_group_size = 4170000;
6513
0
    }
6514
6515
0
  group_sections (htab, stub_group_size, stubs_always_after_branch);
6516
6517
  /* If we're applying the cortex A8 fix, we need to determine the
6518
     program header size now, because we cannot change it later --
6519
     that could alter section placements.  Notice the A8 erratum fix
6520
     ends up requiring the section addresses to remain unchanged
6521
     modulo the page size.  That's something we cannot represent
6522
     inside BFD, and we don't want to force the section alignment to
6523
     be the page size.  */
6524
0
  if (htab->fix_cortex_a8)
6525
0
    (*htab->layout_sections_again) ();
6526
6527
0
  while (1)
6528
0
    {
6529
0
      bfd *input_bfd;
6530
0
      unsigned int bfd_indx;
6531
0
      asection *stub_sec;
6532
0
      enum elf32_arm_stub_type stub_type;
6533
0
      bool stub_changed = false;
6534
0
      unsigned prev_num_a8_fixes = num_a8_fixes;
6535
6536
0
      num_a8_fixes = 0;
6537
0
      for (input_bfd = info->input_bfds, bfd_indx = 0;
6538
0
     input_bfd != NULL;
6539
0
     input_bfd = input_bfd->link.next, bfd_indx++)
6540
0
  {
6541
0
    Elf_Internal_Shdr *symtab_hdr;
6542
0
    asection *section;
6543
0
    Elf_Internal_Sym *local_syms = NULL;
6544
6545
0
    if (!is_arm_elf (input_bfd))
6546
0
      continue;
6547
0
    if ((input_bfd->flags & DYNAMIC) != 0
6548
0
        && (elf_sym_hashes (input_bfd) == NULL
6549
0
      || (elf_dyn_lib_class (input_bfd) & DYN_AS_NEEDED) != 0))
6550
0
      continue;
6551
6552
0
    num_a8_relocs = 0;
6553
6554
    /* We'll need the symbol table in a second.  */
6555
0
    symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
6556
0
    if (symtab_hdr->sh_info == 0)
6557
0
      continue;
6558
6559
    /* Limit scan of symbols to object file whose profile is
6560
       Microcontroller to not hinder performance in the general case.  */
6561
0
    if (m_profile && first_veneer_scan)
6562
0
      {
6563
0
        struct elf_link_hash_entry **sym_hashes;
6564
6565
0
        sym_hashes = elf_sym_hashes (input_bfd);
6566
0
        if (!cmse_scan (input_bfd, htab, out_attr, sym_hashes,
6567
0
            &cmse_stub_created))
6568
0
    goto error_ret_free_local;
6569
6570
0
        if (cmse_stub_created != 0)
6571
0
    stub_changed = true;
6572
0
      }
6573
6574
    /* Walk over each section attached to the input bfd.  */
6575
0
    for (section = input_bfd->sections;
6576
0
         section != NULL;
6577
0
         section = section->next)
6578
0
      {
6579
0
        Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
6580
6581
        /* If there aren't any relocs, then there's nothing more
6582
     to do.  */
6583
0
        if ((section->flags & SEC_RELOC) == 0
6584
0
      || section->reloc_count == 0
6585
0
      || (section->flags & SEC_CODE) == 0)
6586
0
    continue;
6587
6588
        /* If this section is a link-once section that will be
6589
     discarded, then don't create any stubs.  */
6590
0
        if (section->output_section == NULL
6591
0
      || section->output_section->owner != output_bfd)
6592
0
    continue;
6593
6594
        /* Get the relocs.  */
6595
0
        internal_relocs
6596
0
    = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
6597
0
               NULL, info->keep_memory);
6598
0
        if (internal_relocs == NULL)
6599
0
    goto error_ret_free_local;
6600
6601
        /* Now examine each relocation.  */
6602
0
        irela = internal_relocs;
6603
0
        irelaend = irela + section->reloc_count;
6604
0
        for (; irela < irelaend; irela++)
6605
0
    {
6606
0
      unsigned int r_type, r_indx;
6607
0
      asection *sym_sec;
6608
0
      bfd_vma sym_value;
6609
0
      bfd_vma destination;
6610
0
      struct elf32_arm_link_hash_entry *hash;
6611
0
      const char *sym_name;
6612
0
      unsigned char st_type;
6613
0
      enum arm_st_branch_type branch_type;
6614
0
      bool created_stub = false;
6615
6616
0
      r_type = ELF32_R_TYPE (irela->r_info);
6617
0
      r_indx = ELF32_R_SYM (irela->r_info);
6618
6619
0
      if (r_type >= (unsigned int) R_ARM_max)
6620
0
        {
6621
0
          bfd_set_error (bfd_error_bad_value);
6622
0
        error_ret_free_internal:
6623
0
          if (elf_section_data (section)->relocs == NULL)
6624
0
      free (internal_relocs);
6625
        /* Fall through.  */
6626
0
        error_ret_free_local:
6627
0
          if (symtab_hdr->contents != (unsigned char *) local_syms)
6628
0
      free (local_syms);
6629
0
          return false;
6630
0
        }
6631
6632
0
      hash = NULL;
6633
0
      if (r_indx >= symtab_hdr->sh_info)
6634
0
        hash = elf32_arm_hash_entry
6635
0
          (elf_sym_hashes (input_bfd)
6636
0
           [r_indx - symtab_hdr->sh_info]);
6637
6638
      /* Only look for stubs on branch instructions, or
6639
         non-relaxed TLSCALL  */
6640
0
      if ((r_type != (unsigned int) R_ARM_CALL)
6641
0
          && (r_type != (unsigned int) R_ARM_THM_CALL)
6642
0
          && (r_type != (unsigned int) R_ARM_JUMP24)
6643
0
          && (r_type != (unsigned int) R_ARM_THM_JUMP19)
6644
0
          && (r_type != (unsigned int) R_ARM_THM_XPC22)
6645
0
          && (r_type != (unsigned int) R_ARM_THM_JUMP24)
6646
0
          && (r_type != (unsigned int) R_ARM_PLT32)
6647
0
          && !((r_type == (unsigned int) R_ARM_TLS_CALL
6648
0
          || r_type == (unsigned int) R_ARM_THM_TLS_CALL)
6649
0
         && r_type == (elf32_arm_tls_transition
6650
0
           (info, r_type,
6651
0
            (struct elf_link_hash_entry *) hash))
6652
0
         && ((hash ? hash->tls_type
6653
0
        : (elf32_arm_local_got_tls_type
6654
0
           (input_bfd)[r_indx]))
6655
0
             & GOT_TLS_GDESC) != 0))
6656
0
        continue;
6657
6658
      /* Now determine the call target, its name, value,
6659
         section.  */
6660
0
      sym_sec = NULL;
6661
0
      sym_value = 0;
6662
0
      destination = 0;
6663
0
      sym_name = NULL;
6664
6665
0
      if (r_type == (unsigned int) R_ARM_TLS_CALL
6666
0
          || r_type == (unsigned int) R_ARM_THM_TLS_CALL)
6667
0
        {
6668
          /* A non-relaxed TLS call.  The target is the
6669
       plt-resident trampoline and nothing to do
6670
       with the symbol.  */
6671
0
          BFD_ASSERT (htab->tls_trampoline > 0);
6672
0
          sym_sec = htab->root.splt;
6673
0
          sym_value = htab->tls_trampoline;
6674
0
          hash = 0;
6675
0
          st_type = STT_FUNC;
6676
0
          branch_type = ST_BRANCH_TO_ARM;
6677
0
        }
6678
0
      else if (!hash)
6679
0
        {
6680
          /* It's a local symbol.  */
6681
0
          Elf_Internal_Sym *sym;
6682
6683
0
          if (local_syms == NULL)
6684
0
      {
6685
0
        local_syms
6686
0
          = (Elf_Internal_Sym *) symtab_hdr->contents;
6687
0
        if (local_syms == NULL)
6688
0
          local_syms
6689
0
            = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
6690
0
                  symtab_hdr->sh_info, 0,
6691
0
                  NULL, NULL, NULL);
6692
0
        if (local_syms == NULL)
6693
0
          goto error_ret_free_internal;
6694
0
      }
6695
6696
0
          sym = local_syms + r_indx;
6697
0
          if (sym->st_shndx == SHN_UNDEF)
6698
0
      sym_sec = bfd_und_section_ptr;
6699
0
          else if (sym->st_shndx == SHN_ABS)
6700
0
      sym_sec = bfd_abs_section_ptr;
6701
0
          else if (sym->st_shndx == SHN_COMMON)
6702
0
      sym_sec = bfd_com_section_ptr;
6703
0
          else
6704
0
      sym_sec =
6705
0
        bfd_section_from_elf_index (input_bfd, sym->st_shndx);
6706
6707
0
          if (!sym_sec)
6708
      /* This is an undefined symbol.  It can never
6709
         be resolved.  */
6710
0
      continue;
6711
6712
0
          if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
6713
0
      sym_value = sym->st_value;
6714
0
          destination = (sym_value + irela->r_addend
6715
0
             + sym_sec->output_offset
6716
0
             + sym_sec->output_section->vma);
6717
0
          st_type = ELF_ST_TYPE (sym->st_info);
6718
0
          branch_type =
6719
0
      ARM_GET_SYM_BRANCH_TYPE (sym->st_target_internal);
6720
0
          sym_name
6721
0
      = bfd_elf_string_from_elf_section (input_bfd,
6722
0
                 symtab_hdr->sh_link,
6723
0
                 sym->st_name);
6724
0
        }
6725
0
      else
6726
0
        {
6727
          /* It's an external symbol.  */
6728
0
          while (hash->root.root.type == bfd_link_hash_indirect
6729
0
           || hash->root.root.type == bfd_link_hash_warning)
6730
0
      hash = ((struct elf32_arm_link_hash_entry *)
6731
0
        hash->root.root.u.i.link);
6732
6733
0
          if (hash->root.root.type == bfd_link_hash_defined
6734
0
        || hash->root.root.type == bfd_link_hash_defweak)
6735
0
      {
6736
0
        sym_sec = hash->root.root.u.def.section;
6737
0
        sym_value = hash->root.root.u.def.value;
6738
6739
0
        struct elf32_arm_link_hash_table *globals =
6740
0
              elf32_arm_hash_table (info);
6741
6742
        /* For a destination in a shared library,
6743
           use the PLT stub as target address to
6744
           decide whether a branch stub is
6745
           needed.  */
6746
0
        if (globals != NULL
6747
0
            && globals->root.splt != NULL
6748
0
            && hash != NULL
6749
0
            && hash->root.plt.offset != (bfd_vma) -1)
6750
0
          {
6751
0
            sym_sec = globals->root.splt;
6752
0
            sym_value = hash->root.plt.offset;
6753
0
            if (sym_sec->output_section != NULL)
6754
0
        destination = (sym_value
6755
0
                 + sym_sec->output_offset
6756
0
                 + sym_sec->output_section->vma);
6757
0
          }
6758
0
        else if (sym_sec->output_section != NULL)
6759
0
          destination = (sym_value + irela->r_addend
6760
0
             + sym_sec->output_offset
6761
0
             + sym_sec->output_section->vma);
6762
0
      }
6763
0
          else if ((hash->root.root.type == bfd_link_hash_undefined)
6764
0
             || (hash->root.root.type == bfd_link_hash_undefweak))
6765
0
      {
6766
        /* For a shared library, use the PLT stub as
6767
           target address to decide whether a long
6768
           branch stub is needed.
6769
           For absolute code, they cannot be handled.  */
6770
0
        struct elf32_arm_link_hash_table *globals =
6771
0
          elf32_arm_hash_table (info);
6772
6773
0
        if (globals != NULL
6774
0
            && globals->root.splt != NULL
6775
0
            && hash != NULL
6776
0
            && hash->root.plt.offset != (bfd_vma) -1)
6777
0
          {
6778
0
            sym_sec = globals->root.splt;
6779
0
            sym_value = hash->root.plt.offset;
6780
0
            if (sym_sec->output_section != NULL)
6781
0
        destination = (sym_value
6782
0
                 + sym_sec->output_offset
6783
0
                 + sym_sec->output_section->vma);
6784
0
          }
6785
0
        else
6786
0
          continue;
6787
0
      }
6788
0
          else
6789
0
      {
6790
0
        bfd_set_error (bfd_error_bad_value);
6791
0
        goto error_ret_free_internal;
6792
0
      }
6793
0
          st_type = hash->root.type;
6794
0
          branch_type =
6795
0
      ARM_GET_SYM_BRANCH_TYPE (hash->root.target_internal);
6796
0
          sym_name = hash->root.root.root.string;
6797
0
        }
6798
6799
0
      do
6800
0
        {
6801
0
          bool new_stub;
6802
0
          struct elf32_arm_stub_hash_entry *stub_entry;
6803
6804
          /* Determine what (if any) linker stub is needed.  */
6805
0
          stub_type = arm_type_of_stub (info, section, irela,
6806
0
                st_type, &branch_type,
6807
0
                hash, destination, sym_sec,
6808
0
                input_bfd, sym_name);
6809
0
          if (stub_type == arm_stub_none)
6810
0
      break;
6811
6812
          /* We've either created a stub for this reloc already,
6813
       or we are about to.  */
6814
0
          stub_entry =
6815
0
      elf32_arm_create_stub (htab, stub_type, section, irela,
6816
0
                 sym_sec, hash,
6817
0
                 (char *) sym_name, sym_value,
6818
0
                 branch_type, &new_stub);
6819
6820
0
          created_stub = stub_entry != NULL;
6821
0
          if (!created_stub)
6822
0
      goto error_ret_free_internal;
6823
0
          else if (!new_stub)
6824
0
      break;
6825
0
          else
6826
0
      stub_changed = true;
6827
0
        }
6828
0
      while (0);
6829
6830
      /* Look for relocations which might trigger Cortex-A8
6831
         erratum.  */
6832
0
      if (htab->fix_cortex_a8
6833
0
          && (r_type == (unsigned int) R_ARM_THM_JUMP24
6834
0
        || r_type == (unsigned int) R_ARM_THM_JUMP19
6835
0
        || r_type == (unsigned int) R_ARM_THM_CALL
6836
0
        || r_type == (unsigned int) R_ARM_THM_XPC22))
6837
0
        {
6838
0
          bfd_vma from = section->output_section->vma
6839
0
             + section->output_offset
6840
0
             + irela->r_offset;
6841
6842
0
          if ((from & 0xfff) == 0xffe)
6843
0
      {
6844
        /* Found a candidate.  Note we haven't checked the
6845
           destination is within 4K here: if we do so (and
6846
           don't create an entry in a8_relocs) we can't tell
6847
           that a branch should have been relocated when
6848
           scanning later.  */
6849
0
        if (num_a8_relocs == a8_reloc_table_size)
6850
0
          {
6851
0
            a8_reloc_table_size *= 2;
6852
0
            a8_relocs = (struct a8_erratum_reloc *)
6853
0
          bfd_realloc (a8_relocs,
6854
0
                 sizeof (struct a8_erratum_reloc)
6855
0
                 * a8_reloc_table_size);
6856
0
          }
6857
6858
0
        a8_relocs[num_a8_relocs].from = from;
6859
0
        a8_relocs[num_a8_relocs].destination = destination;
6860
0
        a8_relocs[num_a8_relocs].r_type = r_type;
6861
0
        a8_relocs[num_a8_relocs].branch_type = branch_type;
6862
0
        a8_relocs[num_a8_relocs].sym_name = sym_name;
6863
0
        a8_relocs[num_a8_relocs].non_a8_stub = created_stub;
6864
0
        a8_relocs[num_a8_relocs].hash = hash;
6865
6866
0
        num_a8_relocs++;
6867
0
      }
6868
0
        }
6869
0
    }
6870
6871
        /* We're done with the internal relocs, free them.  */
6872
0
        if (elf_section_data (section)->relocs == NULL)
6873
0
    free (internal_relocs);
6874
0
      }
6875
6876
0
    if (htab->fix_cortex_a8)
6877
0
      {
6878
        /* Sort relocs which might apply to Cortex-A8 erratum.  */
6879
0
        qsort (a8_relocs, num_a8_relocs,
6880
0
         sizeof (struct a8_erratum_reloc),
6881
0
         &a8_reloc_compare);
6882
6883
        /* Scan for branches which might trigger Cortex-A8 erratum.  */
6884
0
        if (cortex_a8_erratum_scan (input_bfd, info, &a8_fixes,
6885
0
            &num_a8_fixes, &a8_fix_table_size,
6886
0
            a8_relocs, num_a8_relocs,
6887
0
            prev_num_a8_fixes, &stub_changed)
6888
0
      != 0)
6889
0
    goto error_ret_free_local;
6890
0
      }
6891
6892
0
    if (local_syms != NULL
6893
0
        && symtab_hdr->contents != (unsigned char *) local_syms)
6894
0
      {
6895
0
        if (!info->keep_memory)
6896
0
    free (local_syms);
6897
0
        else
6898
0
    symtab_hdr->contents = (unsigned char *) local_syms;
6899
0
      }
6900
0
  }
6901
6902
0
      if (first_veneer_scan
6903
0
    && !set_cmse_veneer_addr_from_implib (info, htab,
6904
0
            &cmse_stub_created))
6905
0
  ret = false;
6906
6907
0
      if (prev_num_a8_fixes != num_a8_fixes)
6908
0
  stub_changed = true;
6909
6910
0
      if (!stub_changed)
6911
0
  break;
6912
6913
      /* OK, we've added some stubs.  Find out the new size of the
6914
   stub sections.  */
6915
0
      for (stub_sec = htab->stub_bfd->sections;
6916
0
     stub_sec != NULL;
6917
0
     stub_sec = stub_sec->next)
6918
0
  {
6919
    /* Ignore non-stub sections.  */
6920
0
    if (!strstr (stub_sec->name, STUB_SUFFIX))
6921
0
      continue;
6922
6923
0
    stub_sec->size = 0;
6924
0
  }
6925
6926
      /* Add new SG veneers after those already in the input import
6927
   library.  */
6928
0
      for (stub_type = arm_stub_none + 1; stub_type < max_stub_type;
6929
0
     stub_type++)
6930
0
  {
6931
0
    bfd_vma *start_offset_p;
6932
0
    asection **stub_sec_p;
6933
6934
0
    start_offset_p = arm_new_stubs_start_offset_ptr (htab, stub_type);
6935
0
    stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
6936
0
    if (start_offset_p == NULL)
6937
0
      continue;
6938
6939
0
    BFD_ASSERT (stub_sec_p != NULL);
6940
0
    if (*stub_sec_p != NULL)
6941
0
      (*stub_sec_p)->size = *start_offset_p;
6942
0
  }
6943
6944
      /* Compute stub section size, considering padding.  */
6945
0
      bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
6946
0
      for (stub_type = arm_stub_none + 1; stub_type < max_stub_type;
6947
0
     stub_type++)
6948
0
  {
6949
0
    int size, padding;
6950
0
    asection **stub_sec_p;
6951
6952
0
    padding = arm_dedicated_stub_section_padding (stub_type);
6953
0
    stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
6954
    /* Skip if no stub input section or no stub section padding
6955
       required.  */
6956
0
    if ((stub_sec_p != NULL && *stub_sec_p == NULL) || padding == 0)
6957
0
      continue;
6958
    /* Stub section padding required but no dedicated section.  */
6959
0
    BFD_ASSERT (stub_sec_p);
6960
6961
0
    size = (*stub_sec_p)->size;
6962
0
    size = (size + padding - 1) & ~(padding - 1);
6963
0
    (*stub_sec_p)->size = size;
6964
0
  }
6965
6966
      /* Add Cortex-A8 erratum veneers to stub section sizes too.  */
6967
0
      if (htab->fix_cortex_a8)
6968
0
  for (i = 0; i < num_a8_fixes; i++)
6969
0
    {
6970
0
      stub_sec = elf32_arm_create_or_find_stub_sec (NULL,
6971
0
       a8_fixes[i].section, htab, a8_fixes[i].stub_type);
6972
6973
0
      if (stub_sec == NULL)
6974
0
        return false;
6975
6976
0
      stub_sec->size
6977
0
        += find_stub_size_and_template (a8_fixes[i].stub_type, NULL,
6978
0
                NULL);
6979
0
    }
6980
6981
6982
      /* Ask the linker to do its stuff.  */
6983
0
      (*htab->layout_sections_again) ();
6984
0
      first_veneer_scan = false;
6985
0
    }
6986
6987
  /* Add stubs for Cortex-A8 erratum fixes now.  */
6988
0
  if (htab->fix_cortex_a8)
6989
0
    {
6990
0
      for (i = 0; i < num_a8_fixes; i++)
6991
0
  {
6992
0
    struct elf32_arm_stub_hash_entry *stub_entry;
6993
0
    char *stub_name = a8_fixes[i].stub_name;
6994
0
    asection *section = a8_fixes[i].section;
6995
0
    unsigned int section_id = a8_fixes[i].section->id;
6996
0
    asection *link_sec = htab->stub_group[section_id].link_sec;
6997
0
    asection *stub_sec = htab->stub_group[section_id].stub_sec;
6998
0
    const insn_sequence *template_sequence;
6999
0
    int template_size, size = 0;
7000
7001
0
    stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
7002
0
               true, false);
7003
0
    if (stub_entry == NULL)
7004
0
      {
7005
0
        _bfd_error_handler (_("%pB: cannot create stub entry %s"),
7006
0
          section->owner, stub_name);
7007
0
        return false;
7008
0
      }
7009
7010
0
    stub_entry->stub_sec = stub_sec;
7011
0
    stub_entry->stub_offset = (bfd_vma) -1;
7012
0
    stub_entry->id_sec = link_sec;
7013
0
    stub_entry->stub_type = a8_fixes[i].stub_type;
7014
0
    stub_entry->source_value = a8_fixes[i].offset;
7015
0
    stub_entry->target_section = a8_fixes[i].section;
7016
0
    stub_entry->target_value = a8_fixes[i].target_offset;
7017
0
    stub_entry->orig_insn = a8_fixes[i].orig_insn;
7018
0
    stub_entry->branch_type = a8_fixes[i].branch_type;
7019
7020
0
    size = find_stub_size_and_template (a8_fixes[i].stub_type,
7021
0
                &template_sequence,
7022
0
                &template_size);
7023
7024
0
    stub_entry->stub_size = size;
7025
0
    stub_entry->stub_template = template_sequence;
7026
0
    stub_entry->stub_template_size = template_size;
7027
0
  }
7028
7029
      /* Stash the Cortex-A8 erratum fix array for use later in
7030
   elf32_arm_write_section().  */
7031
0
      htab->a8_erratum_fixes = a8_fixes;
7032
0
      htab->num_a8_erratum_fixes = num_a8_fixes;
7033
0
    }
7034
0
  else
7035
0
    {
7036
0
      htab->a8_erratum_fixes = NULL;
7037
0
      htab->num_a8_erratum_fixes = 0;
7038
0
    }
7039
0
  return ret;
7040
0
}
7041
7042
/* Build all the stubs associated with the current output file.  The
7043
   stubs are kept in a hash table attached to the main linker hash
7044
   table.  We also set up the .plt entries for statically linked PIC
7045
   functions here.  This function is called via arm_elf_finish in the
7046
   linker.  */
7047
7048
bool
7049
elf32_arm_build_stubs (struct bfd_link_info *info)
7050
0
{
7051
0
  asection *stub_sec;
7052
0
  struct bfd_hash_table *table;
7053
0
  enum elf32_arm_stub_type stub_type;
7054
0
  struct elf32_arm_link_hash_table *htab;
7055
7056
0
  htab = elf32_arm_hash_table (info);
7057
0
  if (htab == NULL)
7058
0
    return false;
7059
7060
0
  for (stub_sec = htab->stub_bfd->sections;
7061
0
       stub_sec != NULL;
7062
0
       stub_sec = stub_sec->next)
7063
0
    {
7064
0
      bfd_size_type size;
7065
7066
      /* Ignore non-stub sections.  */
7067
0
      if (!strstr (stub_sec->name, STUB_SUFFIX))
7068
0
  continue;
7069
7070
      /* Allocate memory to hold the linker stubs.  Zeroing the stub sections
7071
   must at least be done for stub section requiring padding and for SG
7072
   veneers to ensure that a non secure code branching to a removed SG
7073
   veneer causes an error.  */
7074
0
      size = stub_sec->size;
7075
0
      stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd, size);
7076
0
      if (stub_sec->contents == NULL && size != 0)
7077
0
  return false;
7078
0
      stub_sec->alloced = 1;
7079
7080
0
      stub_sec->size = 0;
7081
0
    }
7082
7083
  /* Add new SG veneers after those already in the input import library.  */
7084
0
  for (stub_type = arm_stub_none + 1; stub_type < max_stub_type; stub_type++)
7085
0
    {
7086
0
      bfd_vma *start_offset_p;
7087
0
      asection **stub_sec_p;
7088
7089
0
      start_offset_p = arm_new_stubs_start_offset_ptr (htab, stub_type);
7090
0
      stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
7091
0
      if (start_offset_p == NULL)
7092
0
  continue;
7093
7094
0
      BFD_ASSERT (stub_sec_p != NULL);
7095
0
      if (*stub_sec_p != NULL)
7096
0
  (*stub_sec_p)->size = *start_offset_p;
7097
0
    }
7098
7099
  /* Build the stubs as directed by the stub hash table.  */
7100
0
  table = &htab->stub_hash_table;
7101
0
  bfd_hash_traverse (table, arm_build_one_stub, info);
7102
0
  if (htab->fix_cortex_a8)
7103
0
    {
7104
      /* Place the cortex a8 stubs last.  */
7105
0
      htab->fix_cortex_a8 = -1;
7106
0
      bfd_hash_traverse (table, arm_build_one_stub, info);
7107
0
    }
7108
7109
0
  return true;
7110
0
}
7111
7112
/* Locate the Thumb encoded calling stub for NAME.  */
7113
7114
static struct elf_link_hash_entry *
7115
find_thumb_glue (struct bfd_link_info *link_info,
7116
     const char *name,
7117
     char **error_message)
7118
0
{
7119
0
  char *tmp_name;
7120
0
  struct elf_link_hash_entry *hash;
7121
0
  struct elf32_arm_link_hash_table *hash_table;
7122
7123
  /* We need a pointer to the armelf specific hash table.  */
7124
0
  hash_table = elf32_arm_hash_table (link_info);
7125
0
  if (hash_table == NULL)
7126
0
    return NULL;
7127
7128
0
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
7129
0
          + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
7130
7131
0
  BFD_ASSERT (tmp_name);
7132
7133
0
  sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
7134
7135
0
  hash = elf_link_hash_lookup
7136
0
    (&(hash_table)->root, tmp_name, false, false, true);
7137
7138
0
  if (hash == NULL)
7139
0
    {
7140
0
      *error_message = bfd_asprintf (_("unable to find %s glue '%s' for '%s'"),
7141
0
             "Thumb", tmp_name, name);
7142
0
      if (*error_message == NULL)
7143
0
  *error_message = (char *) bfd_errmsg (bfd_error_system_call);
7144
0
    }
7145
7146
0
  free (tmp_name);
7147
7148
0
  return hash;
7149
0
}
7150
7151
/* Locate the ARM encoded calling stub for NAME.  */
7152
7153
static struct elf_link_hash_entry *
7154
find_arm_glue (struct bfd_link_info *link_info,
7155
         const char *name,
7156
         char **error_message)
7157
0
{
7158
0
  char *tmp_name;
7159
0
  struct elf_link_hash_entry *myh;
7160
0
  struct elf32_arm_link_hash_table *hash_table;
7161
7162
  /* We need a pointer to the elfarm specific hash table.  */
7163
0
  hash_table = elf32_arm_hash_table (link_info);
7164
0
  if (hash_table == NULL)
7165
0
    return NULL;
7166
7167
0
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
7168
0
          + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
7169
0
  BFD_ASSERT (tmp_name);
7170
7171
0
  sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
7172
7173
0
  myh = elf_link_hash_lookup
7174
0
    (&(hash_table)->root, tmp_name, false, false, true);
7175
7176
0
  if (myh == NULL)
7177
0
    {
7178
0
      *error_message = bfd_asprintf (_("unable to find %s glue '%s' for '%s'"),
7179
0
             "ARM", tmp_name, name);
7180
0
      if (*error_message == NULL)
7181
0
  *error_message = (char *) bfd_errmsg (bfd_error_system_call);
7182
0
    }
7183
0
  free (tmp_name);
7184
7185
0
  return myh;
7186
0
}
7187
7188
/* ARM->Thumb glue (static images):
7189
7190
   .arm
7191
   __func_from_arm:
7192
   ldr r12, __func_addr
7193
   bx  r12
7194
   __func_addr:
7195
   .word func    @ behave as if you saw a ARM_32 reloc.
7196
7197
   (v5t static images)
7198
   .arm
7199
   __func_from_arm:
7200
   ldr pc, __func_addr
7201
   __func_addr:
7202
   .word func    @ behave as if you saw a ARM_32 reloc.
7203
7204
   (relocatable images)
7205
   .arm
7206
   __func_from_arm:
7207
   ldr r12, __func_offset
7208
   add r12, r12, pc
7209
   bx  r12
7210
   __func_offset:
7211
   .word func - .   */
7212
7213
0
#define ARM2THUMB_STATIC_GLUE_SIZE 12
7214
static const insn32 a2t1_ldr_insn = 0xe59fc000;
7215
static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
7216
static const insn32 a2t3_func_addr_insn = 0x00000001;
7217
7218
0
#define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
7219
static const insn32 a2t1v5_ldr_insn = 0xe51ff004;
7220
static const insn32 a2t2v5_func_addr_insn = 0x00000001;
7221
7222
0
#define ARM2THUMB_PIC_GLUE_SIZE 16
7223
static const insn32 a2t1p_ldr_insn = 0xe59fc004;
7224
static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
7225
static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
7226
7227
/* Thumb->ARM:        Thumb->(non-interworking aware) ARM
7228
7229
     .thumb       .thumb
7230
     .align 2       .align 2
7231
 __func_from_thumb:       __func_from_thumb:
7232
     bx pc        push {r6, lr}
7233
     nop        ldr  r6, __func_addr
7234
     .arm       mov  lr, pc
7235
     b func       bx   r6
7236
          .arm
7237
            ;; back_to_thumb
7238
          ldmia r13! {r6, lr}
7239
          bx    lr
7240
            __func_addr:
7241
          .word      func  */
7242
7243
0
#define THUMB2ARM_GLUE_SIZE 8
7244
static const insn16 t2a1_bx_pc_insn = 0x4778;
7245
static const insn16 t2a2_noop_insn = 0x46c0;
7246
static const insn32 t2a3_b_insn = 0xea000000;
7247
7248
0
#define VFP11_ERRATUM_VENEER_SIZE 8
7249
0
#define STM32L4XX_ERRATUM_LDM_VENEER_SIZE 16
7250
0
#define STM32L4XX_ERRATUM_VLDM_VENEER_SIZE 24
7251
7252
0
#define ARM_BX_VENEER_SIZE 12
7253
static const insn32 armbx1_tst_insn = 0xe3100001;
7254
static const insn32 armbx2_moveq_insn = 0x01a0f000;
7255
static const insn32 armbx3_bx_insn = 0xe12fff10;
7256
7257
#ifndef ELFARM_NABI_C_INCLUDED
7258
static void
7259
arm_allocate_glue_section_space (bfd * abfd, bfd_size_type size, const char * name)
7260
0
{
7261
0
  asection * s;
7262
0
  bfd_byte * contents;
7263
7264
0
  if (size == 0)
7265
0
    {
7266
      /* Do not include empty glue sections in the output.  */
7267
0
      if (abfd != NULL)
7268
0
  {
7269
0
    s = bfd_get_linker_section (abfd, name);
7270
0
    if (s != NULL)
7271
0
      s->flags |= SEC_EXCLUDE;
7272
0
  }
7273
0
      return;
7274
0
    }
7275
7276
0
  BFD_ASSERT (abfd != NULL);
7277
7278
0
  s = bfd_get_linker_section (abfd, name);
7279
0
  BFD_ASSERT (s != NULL);
7280
7281
0
  contents = (bfd_byte *) bfd_zalloc (abfd, size);
7282
7283
0
  BFD_ASSERT (s->size == size);
7284
0
  s->contents = contents;
7285
0
  s->alloced = 1;
7286
0
}
7287
7288
bool
7289
bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
7290
0
{
7291
0
  struct elf32_arm_link_hash_table * globals;
7292
7293
0
  globals = elf32_arm_hash_table (info);
7294
0
  BFD_ASSERT (globals != NULL);
7295
7296
0
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7297
0
           globals->arm_glue_size,
7298
0
           ARM2THUMB_GLUE_SECTION_NAME);
7299
7300
0
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7301
0
           globals->thumb_glue_size,
7302
0
           THUMB2ARM_GLUE_SECTION_NAME);
7303
7304
0
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7305
0
           globals->vfp11_erratum_glue_size,
7306
0
           VFP11_ERRATUM_VENEER_SECTION_NAME);
7307
7308
0
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7309
0
           globals->stm32l4xx_erratum_glue_size,
7310
0
           STM32L4XX_ERRATUM_VENEER_SECTION_NAME);
7311
7312
0
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7313
0
           globals->bx_glue_size,
7314
0
           ARM_BX_GLUE_SECTION_NAME);
7315
7316
0
  return true;
7317
0
}
7318
7319
/* Allocate space and symbols for calling a Thumb function from Arm mode.
7320
   returns the symbol identifying the stub.  */
7321
7322
static struct elf_link_hash_entry *
7323
record_arm_to_thumb_glue (struct bfd_link_info * link_info,
7324
        struct elf_link_hash_entry * h)
7325
0
{
7326
0
  const char * name = h->root.root.string;
7327
0
  asection * s;
7328
0
  char * tmp_name;
7329
0
  struct elf_link_hash_entry * myh;
7330
0
  struct bfd_link_hash_entry * bh;
7331
0
  struct elf32_arm_link_hash_table * globals;
7332
0
  bfd_vma val;
7333
0
  bfd_size_type size;
7334
7335
0
  globals = elf32_arm_hash_table (link_info);
7336
0
  BFD_ASSERT (globals != NULL);
7337
0
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7338
7339
0
  s = bfd_get_linker_section
7340
0
    (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
7341
7342
0
  BFD_ASSERT (s != NULL);
7343
7344
0
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
7345
0
          + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
7346
0
  BFD_ASSERT (tmp_name);
7347
7348
0
  sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
7349
7350
0
  myh = elf_link_hash_lookup
7351
0
    (&(globals)->root, tmp_name, false, false, true);
7352
7353
0
  if (myh != NULL)
7354
0
    {
7355
      /* We've already seen this guy.  */
7356
0
      free (tmp_name);
7357
0
      return myh;
7358
0
    }
7359
7360
  /* The only trick here is using hash_table->arm_glue_size as the value.
7361
     Even though the section isn't allocated yet, this is where we will be
7362
     putting it.  The +1 on the value marks that the stub has not been
7363
     output yet - not that it is a Thumb function.  */
7364
0
  bh = NULL;
7365
0
  val = globals->arm_glue_size + 1;
7366
0
  _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
7367
0
            tmp_name, BSF_GLOBAL, s, val,
7368
0
            NULL, true, false, &bh);
7369
7370
0
  myh = (struct elf_link_hash_entry *) bh;
7371
0
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7372
0
  myh->forced_local = 1;
7373
7374
0
  free (tmp_name);
7375
7376
0
  if (bfd_link_pic (link_info)
7377
0
      || globals->pic_veneer)
7378
0
    size = ARM2THUMB_PIC_GLUE_SIZE;
7379
0
  else if (globals->use_blx)
7380
0
    size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
7381
0
  else
7382
0
    size = ARM2THUMB_STATIC_GLUE_SIZE;
7383
7384
0
  s->size += size;
7385
0
  globals->arm_glue_size += size;
7386
7387
0
  return myh;
7388
0
}
7389
7390
/* Allocate space for ARMv4 BX veneers.  */
7391
7392
static void
7393
record_arm_bx_glue (struct bfd_link_info * link_info, int reg)
7394
0
{
7395
0
  asection * s;
7396
0
  struct elf32_arm_link_hash_table *globals;
7397
0
  char *tmp_name;
7398
0
  struct elf_link_hash_entry *myh;
7399
0
  struct bfd_link_hash_entry *bh;
7400
0
  bfd_vma val;
7401
7402
  /* BX PC does not need a veneer.  */
7403
0
  if (reg == 15)
7404
0
    return;
7405
7406
0
  globals = elf32_arm_hash_table (link_info);
7407
0
  BFD_ASSERT (globals != NULL);
7408
0
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7409
7410
  /* Check if this veneer has already been allocated.  */
7411
0
  if (globals->bx_glue_offset[reg])
7412
0
    return;
7413
7414
0
  s = bfd_get_linker_section
7415
0
    (globals->bfd_of_glue_owner, ARM_BX_GLUE_SECTION_NAME);
7416
7417
0
  BFD_ASSERT (s != NULL);
7418
7419
  /* Add symbol for veneer.  */
7420
0
  tmp_name = (char *)
7421
0
      bfd_malloc ((bfd_size_type) strlen (ARM_BX_GLUE_ENTRY_NAME) + 1);
7422
0
  BFD_ASSERT (tmp_name);
7423
7424
0
  sprintf (tmp_name, ARM_BX_GLUE_ENTRY_NAME, reg);
7425
7426
0
  myh = elf_link_hash_lookup
7427
0
    (&(globals)->root, tmp_name, false, false, false);
7428
7429
0
  BFD_ASSERT (myh == NULL);
7430
7431
0
  bh = NULL;
7432
0
  val = globals->bx_glue_size;
7433
0
  _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
7434
0
            tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
7435
0
            NULL, true, false, &bh);
7436
7437
0
  myh = (struct elf_link_hash_entry *) bh;
7438
0
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7439
0
  myh->forced_local = 1;
7440
7441
0
  s->size += ARM_BX_VENEER_SIZE;
7442
0
  globals->bx_glue_offset[reg] = globals->bx_glue_size | 2;
7443
0
  globals->bx_glue_size += ARM_BX_VENEER_SIZE;
7444
0
}
7445
7446
7447
/* Add an entry to the code/data map for section SEC.  */
7448
7449
static void
7450
elf32_arm_section_map_add (asection *sec, char type, bfd_vma vma)
7451
0
{
7452
0
  struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
7453
0
  unsigned int newidx;
7454
7455
0
  if (sec_data->map == NULL)
7456
0
    {
7457
0
      sec_data->map = (elf32_arm_section_map *)
7458
0
    bfd_malloc (sizeof (elf32_arm_section_map));
7459
0
      sec_data->mapcount = 0;
7460
0
      sec_data->mapsize = 1;
7461
0
    }
7462
7463
0
  newidx = sec_data->mapcount++;
7464
7465
0
  if (sec_data->mapcount > sec_data->mapsize)
7466
0
    {
7467
0
      sec_data->mapsize *= 2;
7468
0
      sec_data->map = (elf32_arm_section_map *)
7469
0
    bfd_realloc_or_free (sec_data->map, sec_data->mapsize
7470
0
             * sizeof (elf32_arm_section_map));
7471
0
    }
7472
7473
0
  if (sec_data->map)
7474
0
    {
7475
0
      sec_data->map[newidx].vma = vma;
7476
0
      sec_data->map[newidx].type = type;
7477
0
    }
7478
0
}
7479
7480
7481
/* Record information about a VFP11 denorm-erratum veneer.  Only ARM-mode
7482
   veneers are handled for now.  */
7483
7484
static bfd_vma
7485
record_vfp11_erratum_veneer (struct bfd_link_info *link_info,
7486
           elf32_vfp11_erratum_list *branch,
7487
           bfd *branch_bfd,
7488
           asection *branch_sec,
7489
           unsigned int offset)
7490
0
{
7491
0
  asection *s;
7492
0
  struct elf32_arm_link_hash_table *hash_table;
7493
0
  char *tmp_name;
7494
0
  struct elf_link_hash_entry *myh;
7495
0
  struct bfd_link_hash_entry *bh;
7496
0
  bfd_vma val;
7497
0
  struct _arm_elf_section_data *sec_data;
7498
0
  elf32_vfp11_erratum_list *newerr;
7499
7500
0
  hash_table = elf32_arm_hash_table (link_info);
7501
0
  BFD_ASSERT (hash_table != NULL);
7502
0
  BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
7503
7504
0
  s = bfd_get_linker_section
7505
0
    (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME);
7506
7507
0
  sec_data = elf32_arm_section_data (s);
7508
7509
0
  BFD_ASSERT (s != NULL);
7510
7511
0
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
7512
0
          (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
7513
0
  BFD_ASSERT (tmp_name);
7514
7515
0
  sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
7516
0
     hash_table->num_vfp11_fixes);
7517
7518
0
  myh = elf_link_hash_lookup
7519
0
    (&(hash_table)->root, tmp_name, false, false, false);
7520
7521
0
  BFD_ASSERT (myh == NULL);
7522
7523
0
  bh = NULL;
7524
0
  val = hash_table->vfp11_erratum_glue_size;
7525
0
  _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
7526
0
            tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
7527
0
            NULL, true, false, &bh);
7528
7529
0
  myh = (struct elf_link_hash_entry *) bh;
7530
0
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7531
0
  myh->forced_local = 1;
7532
7533
  /* Link veneer back to calling location.  */
7534
0
  sec_data->erratumcount += 1;
7535
0
  newerr = (elf32_vfp11_erratum_list *)
7536
0
      bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
7537
7538
0
  newerr->type = VFP11_ERRATUM_ARM_VENEER;
7539
0
  newerr->vma = -1;
7540
0
  newerr->u.v.branch = branch;
7541
0
  newerr->u.v.id = hash_table->num_vfp11_fixes;
7542
0
  branch->u.b.veneer = newerr;
7543
7544
0
  newerr->next = sec_data->erratumlist;
7545
0
  sec_data->erratumlist = newerr;
7546
7547
  /* A symbol for the return from the veneer.  */
7548
0
  sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
7549
0
     hash_table->num_vfp11_fixes);
7550
7551
0
  myh = elf_link_hash_lookup
7552
0
    (&(hash_table)->root, tmp_name, false, false, false);
7553
7554
0
  if (myh != NULL)
7555
0
    abort ();
7556
7557
0
  bh = NULL;
7558
0
  val = offset + 4;
7559
0
  _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
7560
0
            branch_sec, val, NULL, true, false, &bh);
7561
7562
0
  myh = (struct elf_link_hash_entry *) bh;
7563
0
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7564
0
  myh->forced_local = 1;
7565
7566
0
  free (tmp_name);
7567
7568
  /* Generate a mapping symbol for the veneer section, and explicitly add an
7569
     entry for that symbol to the code/data map for the section.  */
7570
0
  if (hash_table->vfp11_erratum_glue_size == 0)
7571
0
    {
7572
0
      bh = NULL;
7573
      /* FIXME: Creates an ARM symbol.  Thumb mode will need attention if it
7574
   ever requires this erratum fix.  */
7575
0
      _bfd_generic_link_add_one_symbol (link_info,
7576
0
          hash_table->bfd_of_glue_owner, "$a",
7577
0
          BSF_LOCAL, s, 0, NULL,
7578
0
          true, false, &bh);
7579
7580
0
      myh = (struct elf_link_hash_entry *) bh;
7581
0
      myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
7582
0
      myh->forced_local = 1;
7583
7584
      /* The elf32_arm_init_maps function only cares about symbols from input
7585
   BFDs.  We must make a note of this generated mapping symbol
7586
   ourselves so that code byteswapping works properly in
7587
   elf32_arm_write_section.  */
7588
0
      elf32_arm_section_map_add (s, 'a', 0);
7589
0
    }
7590
7591
0
  s->size += VFP11_ERRATUM_VENEER_SIZE;
7592
0
  hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE;
7593
0
  hash_table->num_vfp11_fixes++;
7594
7595
  /* The offset of the veneer.  */
7596
0
  return val;
7597
0
}
7598
7599
/* Record information about a STM32L4XX STM erratum veneer.  Only THUMB-mode
7600
   veneers need to be handled because used only in Cortex-M.  */
7601
7602
static bfd_vma
7603
record_stm32l4xx_erratum_veneer (struct bfd_link_info *link_info,
7604
         elf32_stm32l4xx_erratum_list *branch,
7605
         bfd *branch_bfd,
7606
         asection *branch_sec,
7607
         unsigned int offset,
7608
         bfd_size_type veneer_size)
7609
0
{
7610
0
  asection *s;
7611
0
  struct elf32_arm_link_hash_table *hash_table;
7612
0
  char *tmp_name;
7613
0
  struct elf_link_hash_entry *myh;
7614
0
  struct bfd_link_hash_entry *bh;
7615
0
  bfd_vma val;
7616
0
  struct _arm_elf_section_data *sec_data;
7617
0
  elf32_stm32l4xx_erratum_list *newerr;
7618
7619
0
  hash_table = elf32_arm_hash_table (link_info);
7620
0
  BFD_ASSERT (hash_table != NULL);
7621
0
  BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
7622
7623
0
  s = bfd_get_linker_section
7624
0
    (hash_table->bfd_of_glue_owner, STM32L4XX_ERRATUM_VENEER_SECTION_NAME);
7625
7626
0
  BFD_ASSERT (s != NULL);
7627
7628
0
  sec_data = elf32_arm_section_data (s);
7629
7630
0
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
7631
0
          (STM32L4XX_ERRATUM_VENEER_ENTRY_NAME) + 10);
7632
0
  BFD_ASSERT (tmp_name);
7633
7634
0
  sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME,
7635
0
     hash_table->num_stm32l4xx_fixes);
7636
7637
0
  myh = elf_link_hash_lookup
7638
0
    (&(hash_table)->root, tmp_name, false, false, false);
7639
7640
0
  BFD_ASSERT (myh == NULL);
7641
7642
0
  bh = NULL;
7643
0
  val = hash_table->stm32l4xx_erratum_glue_size;
7644
0
  _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
7645
0
            tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
7646
0
            NULL, true, false, &bh);
7647
7648
0
  myh = (struct elf_link_hash_entry *) bh;
7649
0
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7650
0
  myh->forced_local = 1;
7651
7652
  /* Link veneer back to calling location.  */
7653
0
  sec_data->stm32l4xx_erratumcount += 1;
7654
0
  newerr = (elf32_stm32l4xx_erratum_list *)
7655
0
      bfd_zmalloc (sizeof (elf32_stm32l4xx_erratum_list));
7656
7657
0
  newerr->type = STM32L4XX_ERRATUM_VENEER;
7658
0
  newerr->vma = -1;
7659
0
  newerr->u.v.branch = branch;
7660
0
  newerr->u.v.id = hash_table->num_stm32l4xx_fixes;
7661
0
  branch->u.b.veneer = newerr;
7662
7663
0
  newerr->next = sec_data->stm32l4xx_erratumlist;
7664
0
  sec_data->stm32l4xx_erratumlist = newerr;
7665
7666
  /* A symbol for the return from the veneer.  */
7667
0
  sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME "_r",
7668
0
     hash_table->num_stm32l4xx_fixes);
7669
7670
0
  myh = elf_link_hash_lookup
7671
0
    (&(hash_table)->root, tmp_name, false, false, false);
7672
7673
0
  if (myh != NULL)
7674
0
    abort ();
7675
7676
0
  bh = NULL;
7677
0
  val = offset + 4;
7678
0
  _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
7679
0
            branch_sec, val, NULL, true, false, &bh);
7680
7681
0
  myh = (struct elf_link_hash_entry *) bh;
7682
0
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7683
0
  myh->forced_local = 1;
7684
7685
0
  free (tmp_name);
7686
7687
  /* Generate a mapping symbol for the veneer section, and explicitly add an
7688
     entry for that symbol to the code/data map for the section.  */
7689
0
  if (hash_table->stm32l4xx_erratum_glue_size == 0)
7690
0
    {
7691
0
      bh = NULL;
7692
      /* Creates a THUMB symbol since there is no other choice.  */
7693
0
      _bfd_generic_link_add_one_symbol (link_info,
7694
0
          hash_table->bfd_of_glue_owner, "$t",
7695
0
          BSF_LOCAL, s, 0, NULL,
7696
0
          true, false, &bh);
7697
7698
0
      myh = (struct elf_link_hash_entry *) bh;
7699
0
      myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
7700
0
      myh->forced_local = 1;
7701
7702
      /* The elf32_arm_init_maps function only cares about symbols from input
7703
   BFDs.  We must make a note of this generated mapping symbol
7704
   ourselves so that code byteswapping works properly in
7705
   elf32_arm_write_section.  */
7706
0
      elf32_arm_section_map_add (s, 't', 0);
7707
0
    }
7708
7709
0
  s->size += veneer_size;
7710
0
  hash_table->stm32l4xx_erratum_glue_size += veneer_size;
7711
0
  hash_table->num_stm32l4xx_fixes++;
7712
7713
  /* The offset of the veneer.  */
7714
0
  return val;
7715
0
}
7716
7717
#define ARM_GLUE_SECTION_FLAGS \
7718
0
  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE \
7719
0
   | SEC_READONLY | SEC_LINKER_CREATED)
7720
7721
/* Create a fake section for use by the ARM backend of the linker.  */
7722
7723
static bool
7724
arm_make_glue_section (bfd * abfd, const char * name)
7725
0
{
7726
0
  asection * sec;
7727
7728
0
  sec = bfd_get_linker_section (abfd, name);
7729
0
  if (sec != NULL)
7730
    /* Already made.  */
7731
0
    return true;
7732
7733
0
  sec = bfd_make_section_anyway_with_flags (abfd, name, ARM_GLUE_SECTION_FLAGS);
7734
7735
0
  if (sec == NULL
7736
0
      || !bfd_set_section_alignment (sec, 2))
7737
0
    return false;
7738
7739
  /* Set the gc mark to prevent the section from being removed by garbage
7740
     collection, despite the fact that no relocs refer to this section.  */
7741
0
  sec->gc_mark = 1;
7742
7743
0
  return true;
7744
0
}
7745
7746
/* Set size of .plt entries.  This function is called from the
7747
   linker scripts in ld/emultempl/{armelf}.em.  */
7748
7749
void
7750
bfd_elf32_arm_use_long_plt (void)
7751
0
{
7752
0
  elf32_arm_use_long_plt_entry = true;
7753
0
}
7754
7755
/* Add the glue sections to ABFD.  This function is called from the
7756
   linker scripts in ld/emultempl/{armelf}.em.  */
7757
7758
bool
7759
bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
7760
          struct bfd_link_info *info)
7761
0
{
7762
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
7763
0
  bool dostm32l4xx = globals
7764
0
    && globals->stm32l4xx_fix != BFD_ARM_STM32L4XX_FIX_NONE;
7765
0
  bool addglue;
7766
7767
  /* If we are only performing a partial
7768
     link do not bother adding the glue.  */
7769
0
  if (bfd_link_relocatable (info))
7770
0
    return true;
7771
7772
0
  addglue = arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
7773
0
    && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
7774
0
    && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
7775
0
    && arm_make_glue_section (abfd, ARM_BX_GLUE_SECTION_NAME);
7776
7777
0
  if (!dostm32l4xx)
7778
0
    return addglue;
7779
7780
0
  return addglue
7781
0
    && arm_make_glue_section (abfd, STM32L4XX_ERRATUM_VENEER_SECTION_NAME);
7782
0
}
7783
7784
/* Mark output sections of veneers needing a dedicated one with SEC_KEEP.  This
7785
   ensures they are not marked for deletion by
7786
   strip_excluded_output_sections () when veneers are going to be created
7787
   later.  Not doing so would trigger assert on empty section size in
7788
   lang_size_sections_1 ().  */
7789
7790
void
7791
bfd_elf32_arm_keep_private_stub_output_sections (struct bfd_link_info *info)
7792
0
{
7793
0
  enum elf32_arm_stub_type stub_type;
7794
7795
  /* If we are only performing a partial
7796
     link do not bother adding the glue.  */
7797
0
  if (bfd_link_relocatable (info))
7798
0
    return;
7799
7800
0
  for (stub_type = arm_stub_none + 1; stub_type < max_stub_type; stub_type++)
7801
0
    {
7802
0
      asection *out_sec;
7803
0
      const char *out_sec_name;
7804
7805
0
      if (!arm_dedicated_stub_output_section_required (stub_type))
7806
0
  continue;
7807
7808
0
     out_sec_name = arm_dedicated_stub_output_section_name (stub_type);
7809
0
     out_sec = bfd_get_section_by_name (info->output_bfd, out_sec_name);
7810
0
     if (out_sec != NULL)
7811
0
  out_sec->flags |= SEC_KEEP;
7812
0
    }
7813
0
}
7814
7815
/* Select a BFD to be used to hold the sections used by the glue code.
7816
   This function is called from the linker scripts in ld/emultempl/
7817
   {armelf/pe}.em.  */
7818
7819
bool
7820
bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
7821
0
{
7822
0
  struct elf32_arm_link_hash_table *globals;
7823
7824
  /* If we are only performing a partial link
7825
     do not bother getting a bfd to hold the glue.  */
7826
0
  if (bfd_link_relocatable (info))
7827
0
    return true;
7828
7829
  /* Make sure we don't attach the glue sections to a dynamic object.  */
7830
0
  BFD_ASSERT (!(abfd->flags & DYNAMIC));
7831
7832
0
  globals = elf32_arm_hash_table (info);
7833
0
  BFD_ASSERT (globals != NULL);
7834
7835
0
  if (globals->bfd_of_glue_owner != NULL)
7836
0
    return true;
7837
7838
  /* Save the bfd for later use.  */
7839
0
  globals->bfd_of_glue_owner = abfd;
7840
7841
0
  return true;
7842
0
}
7843
7844
static void
7845
check_use_blx (struct elf32_arm_link_hash_table *globals)
7846
0
{
7847
0
  int cpu_arch;
7848
7849
0
  cpu_arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
7850
0
               Tag_CPU_arch);
7851
7852
0
  if (globals->fix_arm1176)
7853
0
    {
7854
0
      if (cpu_arch == TAG_CPU_ARCH_V6T2 || cpu_arch > TAG_CPU_ARCH_V6K)
7855
0
  globals->use_blx = 1;
7856
0
    }
7857
0
  else
7858
0
    {
7859
0
      if (cpu_arch > TAG_CPU_ARCH_V4T)
7860
0
  globals->use_blx = 1;
7861
0
    }
7862
0
}
7863
7864
bool
7865
bfd_elf32_arm_process_before_allocation (bfd *abfd,
7866
           struct bfd_link_info *link_info)
7867
0
{
7868
0
  Elf_Internal_Shdr *symtab_hdr;
7869
0
  Elf_Internal_Rela *internal_relocs = NULL;
7870
0
  Elf_Internal_Rela *irel, *irelend;
7871
0
  bfd_byte *contents = NULL;
7872
7873
0
  asection *sec;
7874
0
  struct elf32_arm_link_hash_table *globals;
7875
7876
  /* If we are only performing a partial link do not bother
7877
     to construct any glue.  */
7878
0
  if (bfd_link_relocatable (link_info))
7879
0
    return true;
7880
7881
  /* Here we have a bfd that is to be included on the link.  We have a
7882
     hook to do reloc rummaging, before section sizes are nailed down.  */
7883
0
  globals = elf32_arm_hash_table (link_info);
7884
0
  BFD_ASSERT (globals != NULL);
7885
7886
0
  check_use_blx (globals);
7887
7888
0
  if (globals->byteswap_code && !bfd_big_endian (abfd))
7889
0
    {
7890
0
      _bfd_error_handler (_("%pB: BE8 images only valid in big-endian mode"),
7891
0
        abfd);
7892
0
      return false;
7893
0
    }
7894
7895
  /* PR 5398: If we have not decided to include any loadable sections in
7896
     the output then we will not have a glue owner bfd.  This is OK, it
7897
     just means that there is nothing else for us to do here.  */
7898
0
  if (globals->bfd_of_glue_owner == NULL)
7899
0
    return true;
7900
7901
  /* Rummage around all the relocs and map the glue vectors.  */
7902
0
  sec = abfd->sections;
7903
7904
0
  if (sec == NULL)
7905
0
    return true;
7906
7907
0
  for (; sec != NULL; sec = sec->next)
7908
0
    {
7909
0
      if (sec->reloc_count == 0)
7910
0
  continue;
7911
7912
0
      if ((sec->flags & SEC_EXCLUDE) != 0
7913
0
    || (sec->flags & SEC_HAS_CONTENTS) == 0)
7914
0
  continue;
7915
7916
0
      symtab_hdr = & elf_symtab_hdr (abfd);
7917
7918
      /* Load the relocs.  */
7919
0
      internal_relocs
7920
0
  = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, false);
7921
7922
0
      if (internal_relocs == NULL)
7923
0
  goto error_return;
7924
7925
0
      irelend = internal_relocs + sec->reloc_count;
7926
0
      for (irel = internal_relocs; irel < irelend; irel++)
7927
0
  {
7928
0
    long r_type;
7929
0
    unsigned long r_index;
7930
7931
0
    struct elf_link_hash_entry *h;
7932
7933
0
    r_type = ELF32_R_TYPE (irel->r_info);
7934
0
    r_index = ELF32_R_SYM (irel->r_info);
7935
7936
    /* These are the only relocation types we care about.  */
7937
0
    if (   r_type != R_ARM_PC24
7938
0
        && (r_type != R_ARM_V4BX || globals->fix_v4bx < 2))
7939
0
      continue;
7940
7941
    /* Get the section contents if we haven't done so already.  */
7942
0
    if (contents == NULL)
7943
0
      {
7944
        /* Get cached copy if it exists.  */
7945
0
        if (elf_section_data (sec)->this_hdr.contents != NULL)
7946
0
    contents = elf_section_data (sec)->this_hdr.contents;
7947
0
        else
7948
0
    {
7949
      /* Go get them off disk.  */
7950
0
      if (! bfd_malloc_and_get_section (abfd, sec, &contents))
7951
0
        goto error_return;
7952
0
    }
7953
0
      }
7954
7955
0
    if (r_type == R_ARM_V4BX)
7956
0
      {
7957
0
        int reg;
7958
7959
0
        reg = bfd_get_32 (abfd, contents + irel->r_offset) & 0xf;
7960
0
        record_arm_bx_glue (link_info, reg);
7961
0
        continue;
7962
0
      }
7963
7964
    /* If the relocation is not against a symbol it cannot concern us.  */
7965
0
    h = NULL;
7966
7967
    /* We don't care about local symbols.  */
7968
0
    if (r_index < symtab_hdr->sh_info)
7969
0
      continue;
7970
7971
    /* This is an external symbol.  */
7972
0
    r_index -= symtab_hdr->sh_info;
7973
0
    h = (struct elf_link_hash_entry *)
7974
0
      elf_sym_hashes (abfd)[r_index];
7975
7976
    /* If the relocation is against a static symbol it must be within
7977
       the current section and so cannot be a cross ARM/Thumb relocation.  */
7978
0
    if (h == NULL)
7979
0
      continue;
7980
7981
    /* If the call will go through a PLT entry then we do not need
7982
       glue.  */
7983
0
    if (globals->root.splt != NULL && h->plt.offset != (bfd_vma) -1)
7984
0
      continue;
7985
7986
0
    switch (r_type)
7987
0
      {
7988
0
      case R_ARM_PC24:
7989
        /* This one is a call from arm code.  We need to look up
7990
     the target of the call.  If it is a thumb target, we
7991
     insert glue.  */
7992
0
        if (ARM_GET_SYM_BRANCH_TYPE (h->target_internal)
7993
0
      == ST_BRANCH_TO_THUMB)
7994
0
    record_arm_to_thumb_glue (link_info, h);
7995
0
        break;
7996
7997
0
      default:
7998
0
        abort ();
7999
0
      }
8000
0
  }
8001
8002
0
      if (elf_section_data (sec)->this_hdr.contents != contents)
8003
0
  free (contents);
8004
0
      contents = NULL;
8005
8006
0
      if (elf_section_data (sec)->relocs != internal_relocs)
8007
0
  free (internal_relocs);
8008
0
      internal_relocs = NULL;
8009
0
    }
8010
8011
0
  return true;
8012
8013
0
 error_return:
8014
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
8015
0
    free (contents);
8016
0
  if (elf_section_data (sec)->relocs != internal_relocs)
8017
0
    free (internal_relocs);
8018
8019
0
  return false;
8020
0
}
8021
#endif
8022
8023
8024
/* Initialise maps of ARM/Thumb/data for input BFDs.  */
8025
8026
void
8027
bfd_elf32_arm_init_maps (bfd *abfd)
8028
0
{
8029
0
  Elf_Internal_Sym *isymbuf;
8030
0
  Elf_Internal_Shdr *hdr;
8031
0
  unsigned int i, localsyms;
8032
8033
  /* PR 7093: Make sure that we are dealing with an arm elf binary.  */
8034
0
  if (! is_arm_elf (abfd))
8035
0
    return;
8036
8037
0
  if ((abfd->flags & DYNAMIC) != 0)
8038
0
    return;
8039
8040
0
  hdr = & elf_symtab_hdr (abfd);
8041
0
  localsyms = hdr->sh_info;
8042
8043
  /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
8044
     should contain the number of local symbols, which should come before any
8045
     global symbols.  Mapping symbols are always local.  */
8046
0
  isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL,
8047
0
          NULL);
8048
8049
  /* No internal symbols read?  Skip this BFD.  */
8050
0
  if (isymbuf == NULL)
8051
0
    return;
8052
8053
0
  for (i = 0; i < localsyms; i++)
8054
0
    {
8055
0
      Elf_Internal_Sym *isym = &isymbuf[i];
8056
0
      asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
8057
0
      const char *name;
8058
8059
0
      if (sec != NULL
8060
0
    && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
8061
0
  {
8062
0
    name = bfd_elf_string_from_elf_section (abfd,
8063
0
      hdr->sh_link, isym->st_name);
8064
8065
0
    if (bfd_is_arm_special_symbol_name (name,
8066
0
                BFD_ARM_SPECIAL_SYM_TYPE_MAP))
8067
0
      elf32_arm_section_map_add (sec, name[1], isym->st_value);
8068
0
  }
8069
0
    }
8070
0
}
8071
8072
8073
/* Auto-select enabling of Cortex-A8 erratum fix if the user didn't explicitly
8074
   say what they wanted.  */
8075
8076
void
8077
bfd_elf32_arm_set_cortex_a8_fix (bfd *obfd, struct bfd_link_info *link_info)
8078
0
{
8079
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8080
0
  obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
8081
8082
0
  if (globals == NULL)
8083
0
    return;
8084
8085
0
  if (globals->fix_cortex_a8 == -1)
8086
0
    {
8087
      /* Turn on Cortex-A8 erratum workaround for ARMv7-A.  */
8088
0
      if (out_attr[Tag_CPU_arch].i == TAG_CPU_ARCH_V7
8089
0
    && (out_attr[Tag_CPU_arch_profile].i == 'A'
8090
0
        || out_attr[Tag_CPU_arch_profile].i == 0))
8091
0
  globals->fix_cortex_a8 = 1;
8092
0
      else
8093
0
  globals->fix_cortex_a8 = 0;
8094
0
    }
8095
0
}
8096
8097
8098
void
8099
bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info)
8100
0
{
8101
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8102
0
  obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
8103
8104
0
  if (globals == NULL)
8105
0
    return;
8106
  /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix.  */
8107
0
  if (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V7)
8108
0
    {
8109
0
      switch (globals->vfp11_fix)
8110
0
  {
8111
0
  case BFD_ARM_VFP11_FIX_DEFAULT:
8112
0
  case BFD_ARM_VFP11_FIX_NONE:
8113
0
    globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
8114
0
    break;
8115
8116
0
  default:
8117
    /* Give a warning, but do as the user requests anyway.  */
8118
0
    _bfd_error_handler (_("%pB: warning: selected VFP11 erratum "
8119
0
      "workaround is not necessary for target architecture"), obfd);
8120
0
  }
8121
0
    }
8122
0
  else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT)
8123
    /* For earlier architectures, we might need the workaround, but do not
8124
       enable it by default.  If users is running with broken hardware, they
8125
       must enable the erratum fix explicitly.  */
8126
0
    globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
8127
0
}
8128
8129
void
8130
bfd_elf32_arm_set_stm32l4xx_fix (bfd *obfd, struct bfd_link_info *link_info)
8131
0
{
8132
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8133
0
  obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
8134
8135
0
  if (globals == NULL)
8136
0
    return;
8137
8138
  /* We assume only Cortex-M4 may require the fix.  */
8139
0
  if (out_attr[Tag_CPU_arch].i != TAG_CPU_ARCH_V7E_M
8140
0
      || out_attr[Tag_CPU_arch_profile].i != 'M')
8141
0
    {
8142
0
      if (globals->stm32l4xx_fix != BFD_ARM_STM32L4XX_FIX_NONE)
8143
  /* Give a warning, but do as the user requests anyway.  */
8144
0
  _bfd_error_handler
8145
0
    (_("%pB: warning: selected STM32L4XX erratum "
8146
0
       "workaround is not necessary for target architecture"), obfd);
8147
0
    }
8148
0
}
8149
8150
enum bfd_arm_vfp11_pipe
8151
{
8152
  VFP11_FMAC,
8153
  VFP11_LS,
8154
  VFP11_DS,
8155
  VFP11_BAD
8156
};
8157
8158
/* Return a VFP register number.  This is encoded as RX:X for single-precision
8159
   registers, or X:RX for double-precision registers, where RX is the group of
8160
   four bits in the instruction encoding and X is the single extension bit.
8161
   RX and X fields are specified using their lowest (starting) bit.  The return
8162
   value is:
8163
8164
     0...31: single-precision registers s0...s31
8165
     32...63: double-precision registers d0...d31.
8166
8167
   Although X should be zero for VFP11 (encoding d0...d15 only), we might
8168
   encounter VFP3 instructions, so we allow the full range for DP registers.  */
8169
8170
static unsigned int
8171
bfd_arm_vfp11_regno (unsigned int insn, bool is_double, unsigned int rx,
8172
         unsigned int x)
8173
0
{
8174
0
  if (is_double)
8175
0
    return (((insn >> rx) & 0xf) | (((insn >> x) & 1) << 4)) + 32;
8176
0
  else
8177
0
    return (((insn >> rx) & 0xf) << 1) | ((insn >> x) & 1);
8178
0
}
8179
8180
/* Set bits in *WMASK according to a register number REG as encoded by
8181
   bfd_arm_vfp11_regno().  Ignore d16-d31.  */
8182
8183
static void
8184
bfd_arm_vfp11_write_mask (unsigned int *wmask, unsigned int reg)
8185
0
{
8186
0
  if (reg < 32)
8187
0
    *wmask |= 1 << reg;
8188
0
  else if (reg < 48)
8189
0
    *wmask |= 3 << ((reg - 32) * 2);
8190
0
}
8191
8192
/* Return TRUE if WMASK overwrites anything in REGS.  */
8193
8194
static bool
8195
bfd_arm_vfp11_antidependency (unsigned int wmask, int *regs, int numregs)
8196
0
{
8197
0
  int i;
8198
8199
0
  for (i = 0; i < numregs; i++)
8200
0
    {
8201
0
      unsigned int reg = regs[i];
8202
8203
0
      if (reg < 32 && (wmask & (1 << reg)) != 0)
8204
0
  return true;
8205
8206
0
      reg -= 32;
8207
8208
0
      if (reg >= 16)
8209
0
  continue;
8210
8211
0
      if ((wmask & (3 << (reg * 2))) != 0)
8212
0
  return true;
8213
0
    }
8214
8215
0
  return false;
8216
0
}
8217
8218
/* In this function, we're interested in two things: finding input registers
8219
   for VFP data-processing instructions, and finding the set of registers which
8220
   arbitrary VFP instructions may write to.  We use a 32-bit unsigned int to
8221
   hold the written set, so FLDM etc. are easy to deal with (we're only
8222
   interested in 32 SP registers or 16 dp registers, due to the VFP version
8223
   implemented by the chip in question).  DP registers are marked by setting
8224
   both SP registers in the write mask).  */
8225
8226
static enum bfd_arm_vfp11_pipe
8227
bfd_arm_vfp11_insn_decode (unsigned int insn, unsigned int *destmask, int *regs,
8228
         int *numregs)
8229
0
{
8230
0
  enum bfd_arm_vfp11_pipe vpipe = VFP11_BAD;
8231
0
  bool is_double = ((insn & 0xf00) == 0xb00) ? 1 : 0;
8232
8233
0
  if ((insn & 0x0f000e10) == 0x0e000a00)  /* A data-processing insn.  */
8234
0
    {
8235
0
      unsigned int pqrs;
8236
0
      unsigned int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
8237
0
      unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
8238
8239
0
      pqrs = ((insn & 0x00800000) >> 20)
8240
0
     | ((insn & 0x00300000) >> 19)
8241
0
     | ((insn & 0x00000040) >> 6);
8242
8243
0
      switch (pqrs)
8244
0
  {
8245
0
  case 0: /* fmac[sd].  */
8246
0
  case 1: /* fnmac[sd].  */
8247
0
  case 2: /* fmsc[sd].  */
8248
0
  case 3: /* fnmsc[sd].  */
8249
0
    vpipe = VFP11_FMAC;
8250
0
    bfd_arm_vfp11_write_mask (destmask, fd);
8251
0
    regs[0] = fd;
8252
0
    regs[1] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);  /* Fn.  */
8253
0
    regs[2] = fm;
8254
0
    *numregs = 3;
8255
0
    break;
8256
8257
0
  case 4: /* fmul[sd].  */
8258
0
  case 5: /* fnmul[sd].  */
8259
0
  case 6: /* fadd[sd].  */
8260
0
  case 7: /* fsub[sd].  */
8261
0
    vpipe = VFP11_FMAC;
8262
0
    goto vfp_binop;
8263
8264
0
  case 8: /* fdiv[sd].  */
8265
0
    vpipe = VFP11_DS;
8266
0
    vfp_binop:
8267
0
    bfd_arm_vfp11_write_mask (destmask, fd);
8268
0
    regs[0] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);   /* Fn.  */
8269
0
    regs[1] = fm;
8270
0
    *numregs = 2;
8271
0
    break;
8272
8273
0
  case 15: /* extended opcode.  */
8274
0
    {
8275
0
      unsigned int extn = ((insn >> 15) & 0x1e)
8276
0
            | ((insn >> 7) & 1);
8277
8278
0
      switch (extn)
8279
0
        {
8280
0
        case 0: /* fcpy[sd].  */
8281
0
        case 1: /* fabs[sd].  */
8282
0
        case 2: /* fneg[sd].  */
8283
0
        case 8: /* fcmp[sd].  */
8284
0
        case 9: /* fcmpe[sd].  */
8285
0
        case 10: /* fcmpz[sd].  */
8286
0
        case 11: /* fcmpez[sd].  */
8287
0
        case 16: /* fuito[sd].  */
8288
0
        case 17: /* fsito[sd].  */
8289
0
        case 24: /* ftoui[sd].  */
8290
0
        case 25: /* ftouiz[sd].  */
8291
0
        case 26: /* ftosi[sd].  */
8292
0
        case 27: /* ftosiz[sd].  */
8293
    /* These instructions will not bounce due to underflow.  */
8294
0
    *numregs = 0;
8295
0
    vpipe = VFP11_FMAC;
8296
0
    break;
8297
8298
0
        case 3: /* fsqrt[sd].  */
8299
    /* fsqrt cannot underflow, but it can (perhaps) overwrite
8300
       registers to cause the erratum in previous instructions.  */
8301
0
    bfd_arm_vfp11_write_mask (destmask, fd);
8302
0
    vpipe = VFP11_DS;
8303
0
    break;
8304
8305
0
        case 15: /* fcvt{ds,sd}.  */
8306
0
    {
8307
0
      int rnum = 0;
8308
8309
0
      bfd_arm_vfp11_write_mask (destmask, fd);
8310
8311
      /* Only FCVTSD can underflow.  */
8312
0
      if ((insn & 0x100) != 0)
8313
0
        regs[rnum++] = fm;
8314
8315
0
      *numregs = rnum;
8316
8317
0
      vpipe = VFP11_FMAC;
8318
0
    }
8319
0
    break;
8320
8321
0
        default:
8322
0
    return VFP11_BAD;
8323
0
        }
8324
0
    }
8325
0
    break;
8326
8327
0
  default:
8328
0
    return VFP11_BAD;
8329
0
  }
8330
0
    }
8331
  /* Two-register transfer.  */
8332
0
  else if ((insn & 0x0fe00ed0) == 0x0c400a10)
8333
0
    {
8334
0
      unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
8335
8336
0
      if ((insn & 0x100000) == 0)
8337
0
  {
8338
0
    if (is_double)
8339
0
      bfd_arm_vfp11_write_mask (destmask, fm);
8340
0
    else
8341
0
      {
8342
0
        bfd_arm_vfp11_write_mask (destmask, fm);
8343
0
        bfd_arm_vfp11_write_mask (destmask, fm + 1);
8344
0
      }
8345
0
  }
8346
8347
0
      vpipe = VFP11_LS;
8348
0
    }
8349
0
  else if ((insn & 0x0e100e00) == 0x0c100a00)  /* A load insn.  */
8350
0
    {
8351
0
      int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
8352
0
      unsigned int puw = ((insn >> 21) & 0x1) | (((insn >> 23) & 3) << 1);
8353
8354
0
      switch (puw)
8355
0
  {
8356
0
  case 0: /* Two-reg transfer.  We should catch these above.  */
8357
0
    abort ();
8358
8359
0
  case 2: /* fldm[sdx].  */
8360
0
  case 3:
8361
0
  case 5:
8362
0
    {
8363
0
      unsigned int i, offset = insn & 0xff;
8364
8365
0
      if (is_double)
8366
0
        offset >>= 1;
8367
8368
0
      for (i = fd; i < fd + offset; i++)
8369
0
        bfd_arm_vfp11_write_mask (destmask, i);
8370
0
    }
8371
0
    break;
8372
8373
0
  case 4: /* fld[sd].  */
8374
0
  case 6:
8375
0
    bfd_arm_vfp11_write_mask (destmask, fd);
8376
0
    break;
8377
8378
0
  default:
8379
0
    return VFP11_BAD;
8380
0
  }
8381
8382
0
      vpipe = VFP11_LS;
8383
0
    }
8384
  /* Single-register transfer. Note L==0.  */
8385
0
  else if ((insn & 0x0f100e10) == 0x0e000a10)
8386
0
    {
8387
0
      unsigned int opcode = (insn >> 21) & 7;
8388
0
      unsigned int fn = bfd_arm_vfp11_regno (insn, is_double, 16, 7);
8389
8390
0
      switch (opcode)
8391
0
  {
8392
0
  case 0: /* fmsr/fmdlr.  */
8393
0
  case 1: /* fmdhr.  */
8394
    /* Mark fmdhr and fmdlr as writing to the whole of the DP
8395
       destination register.  I don't know if this is exactly right,
8396
       but it is the conservative choice.  */
8397
0
    bfd_arm_vfp11_write_mask (destmask, fn);
8398
0
    break;
8399
8400
0
  case 7: /* fmxr.  */
8401
0
    break;
8402
0
  }
8403
8404
0
      vpipe = VFP11_LS;
8405
0
    }
8406
8407
0
  return vpipe;
8408
0
}
8409
8410
8411
static int elf32_arm_compare_mapping (const void * a, const void * b);
8412
8413
8414
/* Look for potentially-troublesome code sequences which might trigger the
8415
   VFP11 denormal/antidependency erratum.  See, e.g., the ARM1136 errata sheet
8416
   (available from ARM) for details of the erratum.  A short version is
8417
   described in ld.texinfo.  */
8418
8419
bool
8420
bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
8421
0
{
8422
0
  asection *sec;
8423
0
  bfd_byte *contents = NULL;
8424
0
  int state = 0;
8425
0
  int regs[3], numregs = 0;
8426
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8427
0
  int use_vector = (globals->vfp11_fix == BFD_ARM_VFP11_FIX_VECTOR);
8428
8429
0
  if (globals == NULL)
8430
0
    return false;
8431
8432
  /* We use a simple FSM to match troublesome VFP11 instruction sequences.
8433
     The states transition as follows:
8434
8435
       0 -> 1 (vector) or 0 -> 2 (scalar)
8436
     A VFP FMAC-pipeline instruction has been seen. Fill
8437
     regs[0]..regs[numregs-1] with its input operands. Remember this
8438
     instruction in 'first_fmac'.
8439
8440
       1 -> 2
8441
     Any instruction, except for a VFP instruction which overwrites
8442
     regs[*].
8443
8444
       1 -> 3 [ -> 0 ]  or
8445
       2 -> 3 [ -> 0 ]
8446
     A VFP instruction has been seen which overwrites any of regs[*].
8447
     We must make a veneer!  Reset state to 0 before examining next
8448
     instruction.
8449
8450
       2 -> 0
8451
     If we fail to match anything in state 2, reset to state 0 and reset
8452
     the instruction pointer to the instruction after 'first_fmac'.
8453
8454
     If the VFP11 vector mode is in use, there must be at least two unrelated
8455
     instructions between anti-dependent VFP11 instructions to properly avoid
8456
     triggering the erratum, hence the use of the extra state 1.  */
8457
8458
  /* If we are only performing a partial link do not bother
8459
     to construct any glue.  */
8460
0
  if (bfd_link_relocatable (link_info))
8461
0
    return true;
8462
8463
  /* Skip if this bfd does not correspond to an ELF image.  */
8464
0
  if (! is_arm_elf (abfd))
8465
0
    return true;
8466
8467
  /* We should have chosen a fix type by the time we get here.  */
8468
0
  BFD_ASSERT (globals->vfp11_fix != BFD_ARM_VFP11_FIX_DEFAULT);
8469
8470
0
  if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_NONE)
8471
0
    return true;
8472
8473
  /* Skip this BFD if it corresponds to an executable or dynamic object.  */
8474
0
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
8475
0
    return true;
8476
8477
0
  for (sec = abfd->sections; sec != NULL; sec = sec->next)
8478
0
    {
8479
0
      unsigned int i, span, first_fmac = 0, veneer_of_insn = 0;
8480
0
      struct _arm_elf_section_data *sec_data;
8481
8482
      /* If we don't have executable progbits, we're not interested in this
8483
   section.  Also skip if section is to be excluded.  */
8484
0
      if (elf_section_type (sec) != SHT_PROGBITS
8485
0
    || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
8486
0
    || (sec->flags & SEC_EXCLUDE) != 0
8487
0
    || sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8488
0
    || sec->output_section == bfd_abs_section_ptr
8489
0
    || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
8490
0
  continue;
8491
8492
0
      sec_data = elf32_arm_section_data (sec);
8493
8494
0
      if (sec_data->mapcount == 0)
8495
0
  continue;
8496
8497
0
      if (elf_section_data (sec)->this_hdr.contents != NULL)
8498
0
  contents = elf_section_data (sec)->this_hdr.contents;
8499
0
      else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
8500
0
  goto error_return;
8501
8502
0
      qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
8503
0
       elf32_arm_compare_mapping);
8504
8505
0
      for (span = 0; span < sec_data->mapcount; span++)
8506
0
  {
8507
0
    unsigned int span_start = sec_data->map[span].vma;
8508
0
    unsigned int span_end = (span == sec_data->mapcount - 1)
8509
0
          ? sec->size : sec_data->map[span + 1].vma;
8510
0
    char span_type = sec_data->map[span].type;
8511
8512
    /* FIXME: Only ARM mode is supported at present.  We may need to
8513
       support Thumb-2 mode also at some point.  */
8514
0
    if (span_type != 'a')
8515
0
      continue;
8516
8517
0
    for (i = span_start; i < span_end;)
8518
0
      {
8519
0
        unsigned int next_i = i + 4;
8520
0
        unsigned int insn = bfd_big_endian (abfd)
8521
0
    ? (((unsigned) contents[i] << 24)
8522
0
       | (contents[i + 1] << 16)
8523
0
       | (contents[i + 2] << 8)
8524
0
       | contents[i + 3])
8525
0
    : (((unsigned) contents[i + 3] << 24)
8526
0
       | (contents[i + 2] << 16)
8527
0
       | (contents[i + 1] << 8)
8528
0
       | contents[i]);
8529
0
        unsigned int writemask = 0;
8530
0
        enum bfd_arm_vfp11_pipe vpipe;
8531
8532
0
        switch (state)
8533
0
    {
8534
0
    case 0:
8535
0
      vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask, regs,
8536
0
                &numregs);
8537
      /* I'm assuming the VFP11 erratum can trigger with denorm
8538
         operands on either the FMAC or the DS pipeline. This might
8539
         lead to slightly overenthusiastic veneer insertion.  */
8540
0
      if (vpipe == VFP11_FMAC || vpipe == VFP11_DS)
8541
0
        {
8542
0
          state = use_vector ? 1 : 2;
8543
0
          first_fmac = i;
8544
0
          veneer_of_insn = insn;
8545
0
        }
8546
0
      break;
8547
8548
0
    case 1:
8549
0
      {
8550
0
        int other_regs[3], other_numregs;
8551
0
        vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
8552
0
                  other_regs,
8553
0
                  &other_numregs);
8554
0
        if (vpipe != VFP11_BAD
8555
0
      && bfd_arm_vfp11_antidependency (writemask, regs,
8556
0
               numregs))
8557
0
          state = 3;
8558
0
        else
8559
0
          state = 2;
8560
0
      }
8561
0
      break;
8562
8563
0
    case 2:
8564
0
      {
8565
0
        int other_regs[3], other_numregs;
8566
0
        vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
8567
0
                  other_regs,
8568
0
                  &other_numregs);
8569
0
        if (vpipe != VFP11_BAD
8570
0
      && bfd_arm_vfp11_antidependency (writemask, regs,
8571
0
               numregs))
8572
0
          state = 3;
8573
0
        else
8574
0
          {
8575
0
      state = 0;
8576
0
      next_i = first_fmac + 4;
8577
0
          }
8578
0
      }
8579
0
      break;
8580
8581
0
    case 3:
8582
0
      abort ();  /* Should be unreachable.  */
8583
0
    }
8584
8585
0
        if (state == 3)
8586
0
    {
8587
0
      elf32_vfp11_erratum_list *newerr =(elf32_vfp11_erratum_list *)
8588
0
          bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
8589
8590
0
      elf32_arm_section_data (sec)->erratumcount += 1;
8591
8592
0
      newerr->u.b.vfp_insn = veneer_of_insn;
8593
8594
0
      switch (span_type)
8595
0
        {
8596
0
        case 'a':
8597
0
          newerr->type = VFP11_ERRATUM_BRANCH_TO_ARM_VENEER;
8598
0
          break;
8599
8600
0
        default:
8601
0
          abort ();
8602
0
        }
8603
8604
0
      record_vfp11_erratum_veneer (link_info, newerr, abfd, sec,
8605
0
                 first_fmac);
8606
8607
0
      newerr->vma = -1;
8608
8609
0
      newerr->next = sec_data->erratumlist;
8610
0
      sec_data->erratumlist = newerr;
8611
8612
0
      state = 0;
8613
0
    }
8614
8615
0
        i = next_i;
8616
0
      }
8617
0
  }
8618
8619
0
      if (elf_section_data (sec)->this_hdr.contents != contents)
8620
0
  free (contents);
8621
0
      contents = NULL;
8622
0
    }
8623
8624
0
  return true;
8625
8626
0
 error_return:
8627
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
8628
0
    free (contents);
8629
8630
0
  return false;
8631
0
}
8632
8633
/* Find virtual-memory addresses for VFP11 erratum veneers and return locations
8634
   after sections have been laid out, using specially-named symbols.  */
8635
8636
void
8637
bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd,
8638
            struct bfd_link_info *link_info)
8639
0
{
8640
0
  asection *sec;
8641
0
  struct elf32_arm_link_hash_table *globals;
8642
0
  char *tmp_name;
8643
8644
0
  if (bfd_link_relocatable (link_info))
8645
0
    return;
8646
8647
  /* Skip if this bfd does not correspond to an ELF image.  */
8648
0
  if (! is_arm_elf (abfd))
8649
0
    return;
8650
8651
0
  globals = elf32_arm_hash_table (link_info);
8652
0
  if (globals == NULL)
8653
0
    return;
8654
8655
0
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
8656
0
          (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
8657
0
  BFD_ASSERT (tmp_name);
8658
8659
0
  for (sec = abfd->sections; sec != NULL; sec = sec->next)
8660
0
    {
8661
0
      struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
8662
0
      elf32_vfp11_erratum_list *errnode = sec_data->erratumlist;
8663
8664
0
      for (; errnode != NULL; errnode = errnode->next)
8665
0
  {
8666
0
    struct elf_link_hash_entry *myh;
8667
0
    bfd_vma vma;
8668
8669
0
    switch (errnode->type)
8670
0
      {
8671
0
      case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
8672
0
      case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER:
8673
        /* Find veneer symbol.  */
8674
0
        sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
8675
0
           errnode->u.b.veneer->u.v.id);
8676
8677
0
        myh = elf_link_hash_lookup
8678
0
    (&(globals)->root, tmp_name, false, false, true);
8679
8680
0
        if (myh == NULL)
8681
0
    _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8682
0
            abfd, "VFP11", tmp_name);
8683
8684
0
        vma = myh->root.u.def.section->output_section->vma
8685
0
        + myh->root.u.def.section->output_offset
8686
0
        + myh->root.u.def.value;
8687
8688
0
        errnode->u.b.veneer->vma = vma;
8689
0
        break;
8690
8691
0
      case VFP11_ERRATUM_ARM_VENEER:
8692
0
      case VFP11_ERRATUM_THUMB_VENEER:
8693
        /* Find return location.  */
8694
0
        sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
8695
0
           errnode->u.v.id);
8696
8697
0
        myh = elf_link_hash_lookup
8698
0
    (&(globals)->root, tmp_name, false, false, true);
8699
8700
0
        if (myh == NULL)
8701
0
    _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8702
0
            abfd, "VFP11", tmp_name);
8703
8704
0
        vma = myh->root.u.def.section->output_section->vma
8705
0
        + myh->root.u.def.section->output_offset
8706
0
        + myh->root.u.def.value;
8707
8708
0
        errnode->u.v.branch->vma = vma;
8709
0
        break;
8710
8711
0
      default:
8712
0
        abort ();
8713
0
      }
8714
0
  }
8715
0
    }
8716
8717
0
  free (tmp_name);
8718
0
}
8719
8720
/* Find virtual-memory addresses for STM32L4XX erratum veneers and
8721
   return locations after sections have been laid out, using
8722
   specially-named symbols.  */
8723
8724
void
8725
bfd_elf32_arm_stm32l4xx_fix_veneer_locations (bfd *abfd,
8726
                struct bfd_link_info *link_info)
8727
0
{
8728
0
  asection *sec;
8729
0
  struct elf32_arm_link_hash_table *globals;
8730
0
  char *tmp_name;
8731
8732
0
  if (bfd_link_relocatable (link_info))
8733
0
    return;
8734
8735
  /* Skip if this bfd does not correspond to an ELF image.  */
8736
0
  if (! is_arm_elf (abfd))
8737
0
    return;
8738
8739
0
  globals = elf32_arm_hash_table (link_info);
8740
0
  if (globals == NULL)
8741
0
    return;
8742
8743
0
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
8744
0
          (STM32L4XX_ERRATUM_VENEER_ENTRY_NAME) + 10);
8745
0
  BFD_ASSERT (tmp_name);
8746
8747
0
  for (sec = abfd->sections; sec != NULL; sec = sec->next)
8748
0
    {
8749
0
      struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
8750
0
      elf32_stm32l4xx_erratum_list *errnode = sec_data->stm32l4xx_erratumlist;
8751
8752
0
      for (; errnode != NULL; errnode = errnode->next)
8753
0
  {
8754
0
    struct elf_link_hash_entry *myh;
8755
0
    bfd_vma vma;
8756
8757
0
    switch (errnode->type)
8758
0
      {
8759
0
      case STM32L4XX_ERRATUM_BRANCH_TO_VENEER:
8760
        /* Find veneer symbol.  */
8761
0
        sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME,
8762
0
           errnode->u.b.veneer->u.v.id);
8763
8764
0
        myh = elf_link_hash_lookup
8765
0
    (&(globals)->root, tmp_name, false, false, true);
8766
8767
0
        if (myh == NULL)
8768
0
    _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8769
0
            abfd, "STM32L4XX", tmp_name);
8770
8771
0
        vma = myh->root.u.def.section->output_section->vma
8772
0
    + myh->root.u.def.section->output_offset
8773
0
    + myh->root.u.def.value;
8774
8775
0
        errnode->u.b.veneer->vma = vma;
8776
0
        break;
8777
8778
0
      case STM32L4XX_ERRATUM_VENEER:
8779
        /* Find return location.  */
8780
0
        sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME "_r",
8781
0
           errnode->u.v.id);
8782
8783
0
        myh = elf_link_hash_lookup
8784
0
    (&(globals)->root, tmp_name, false, false, true);
8785
8786
0
        if (myh == NULL)
8787
0
    _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8788
0
            abfd, "STM32L4XX", tmp_name);
8789
8790
0
        vma = myh->root.u.def.section->output_section->vma
8791
0
    + myh->root.u.def.section->output_offset
8792
0
    + myh->root.u.def.value;
8793
8794
0
        errnode->u.v.branch->vma = vma;
8795
0
        break;
8796
8797
0
      default:
8798
0
        abort ();
8799
0
      }
8800
0
  }
8801
0
    }
8802
8803
0
  free (tmp_name);
8804
0
}
8805
8806
static inline bool
8807
is_thumb2_ldmia (const insn32 insn)
8808
0
{
8809
  /* Encoding T2: LDM<c>.W <Rn>{!},<registers>
8810
     1110 - 1000 - 10W1 - rrrr - PM (0) l - llll - llll - llll.  */
8811
0
  return (insn & 0xffd02000) == 0xe8900000;
8812
0
}
8813
8814
static inline bool
8815
is_thumb2_ldmdb (const insn32 insn)
8816
0
{
8817
  /* Encoding T1: LDMDB<c> <Rn>{!},<registers>
8818
     1110 - 1001 - 00W1 - rrrr - PM (0) l - llll - llll - llll.  */
8819
0
  return (insn & 0xffd02000) == 0xe9100000;
8820
0
}
8821
8822
static inline bool
8823
is_thumb2_vldm (const insn32 insn)
8824
0
{
8825
  /* A6.5 Extension register load or store instruction
8826
     A7.7.229
8827
     We look for SP 32-bit and DP 64-bit registers.
8828
     Encoding T1 VLDM{mode}<c> <Rn>{!}, <list>
8829
     <list> is consecutive 64-bit registers
8830
     1110 - 110P - UDW1 - rrrr - vvvv - 1011 - iiii - iiii
8831
     Encoding T2 VLDM{mode}<c> <Rn>{!}, <list>
8832
     <list> is consecutive 32-bit registers
8833
     1110 - 110P - UDW1 - rrrr - vvvv - 1010 - iiii - iiii
8834
     if P==0 && U==1 && W==1 && Rn=1101 VPOP
8835
     if PUW=010 || PUW=011 || PUW=101 VLDM.  */
8836
0
  return
8837
0
    (((insn & 0xfe100f00) == 0xec100b00) ||
8838
0
     ((insn & 0xfe100f00) == 0xec100a00))
8839
0
    && /* (IA without !).  */
8840
0
    (((((insn << 7) >> 28) & 0xd) == 0x4)
8841
     /* (IA with !), includes VPOP (when reg number is SP).  */
8842
0
     || ((((insn << 7) >> 28) & 0xd) == 0x5)
8843
     /* (DB with !).  */
8844
0
     || ((((insn << 7) >> 28) & 0xd) == 0x9));
8845
0
}
8846
8847
/* STM STM32L4XX erratum : This function assumes that it receives an LDM or
8848
   VLDM opcode and:
8849
 - computes the number and the mode of memory accesses
8850
 - decides if the replacement should be done:
8851
   . replaces only if > 8-word accesses
8852
   . or (testing purposes only) replaces all accesses.  */
8853
8854
static bool
8855
stm32l4xx_need_create_replacing_stub (const insn32 insn,
8856
              bfd_arm_stm32l4xx_fix stm32l4xx_fix)
8857
0
{
8858
0
  int nb_words = 0;
8859
8860
  /* The field encoding the register list is the same for both LDMIA
8861
     and LDMDB encodings.  */
8862
0
  if (is_thumb2_ldmia (insn) || is_thumb2_ldmdb (insn))
8863
0
    nb_words = elf32_arm_popcount (insn & 0x0000ffff);
8864
0
  else if (is_thumb2_vldm (insn))
8865
0
   nb_words = (insn & 0xff);
8866
8867
  /* DEFAULT mode accounts for the real bug condition situation,
8868
     ALL mode inserts stubs for each LDM/VLDM instruction (testing).  */
8869
0
  return (stm32l4xx_fix == BFD_ARM_STM32L4XX_FIX_DEFAULT
8870
0
    ? nb_words > 8
8871
0
    : stm32l4xx_fix == BFD_ARM_STM32L4XX_FIX_ALL);
8872
0
}
8873
8874
/* Look for potentially-troublesome code sequences which might trigger
8875
   the STM STM32L4XX erratum.  */
8876
8877
bool
8878
bfd_elf32_arm_stm32l4xx_erratum_scan (bfd *abfd,
8879
              struct bfd_link_info *link_info)
8880
0
{
8881
0
  asection *sec;
8882
0
  bfd_byte *contents = NULL;
8883
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8884
8885
0
  if (globals == NULL)
8886
0
    return false;
8887
8888
  /* If we are only performing a partial link do not bother
8889
     to construct any glue.  */
8890
0
  if (bfd_link_relocatable (link_info))
8891
0
    return true;
8892
8893
  /* Skip if this bfd does not correspond to an ELF image.  */
8894
0
  if (! is_arm_elf (abfd))
8895
0
    return true;
8896
8897
0
  if (globals->stm32l4xx_fix == BFD_ARM_STM32L4XX_FIX_NONE)
8898
0
    return true;
8899
8900
  /* Skip this BFD if it corresponds to an executable or dynamic object.  */
8901
0
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
8902
0
    return true;
8903
8904
0
  for (sec = abfd->sections; sec != NULL; sec = sec->next)
8905
0
    {
8906
0
      unsigned int i, span;
8907
0
      struct _arm_elf_section_data *sec_data;
8908
8909
      /* If we don't have executable progbits, we're not interested in this
8910
   section.  Also skip if section is to be excluded.  */
8911
0
      if (elf_section_type (sec) != SHT_PROGBITS
8912
0
    || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
8913
0
    || (sec->flags & SEC_EXCLUDE) != 0
8914
0
    || sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8915
0
    || sec->output_section == bfd_abs_section_ptr
8916
0
    || strcmp (sec->name, STM32L4XX_ERRATUM_VENEER_SECTION_NAME) == 0)
8917
0
  continue;
8918
8919
0
      sec_data = elf32_arm_section_data (sec);
8920
8921
0
      if (sec_data->mapcount == 0)
8922
0
  continue;
8923
8924
0
      if (elf_section_data (sec)->this_hdr.contents != NULL)
8925
0
  contents = elf_section_data (sec)->this_hdr.contents;
8926
0
      else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
8927
0
  goto error_return;
8928
8929
0
      qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
8930
0
       elf32_arm_compare_mapping);
8931
8932
0
      for (span = 0; span < sec_data->mapcount; span++)
8933
0
  {
8934
0
    unsigned int span_start = sec_data->map[span].vma;
8935
0
    unsigned int span_end = (span == sec_data->mapcount - 1)
8936
0
      ? sec->size : sec_data->map[span + 1].vma;
8937
0
    char span_type = sec_data->map[span].type;
8938
0
    int itblock_current_pos = 0;
8939
8940
    /* Only Thumb2 mode need be supported with this CM4 specific
8941
       code, we should not encounter any arm mode eg span_type
8942
       != 'a'.  */
8943
0
    if (span_type != 't')
8944
0
      continue;
8945
8946
0
    for (i = span_start; i < span_end;)
8947
0
      {
8948
0
        unsigned int insn = bfd_get_16 (abfd, &contents[i]);
8949
0
        bool insn_32bit = false;
8950
0
        bool is_ldm = false;
8951
0
        bool is_vldm = false;
8952
0
        bool is_not_last_in_it_block = false;
8953
8954
        /* The first 16-bits of all 32-bit thumb2 instructions start
8955
     with opcode[15..13]=0b111 and the encoded op1 can be anything
8956
     except opcode[12..11]!=0b00.
8957
     See 32-bit Thumb instruction encoding.  */
8958
0
        if ((insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000)
8959
0
    insn_32bit = true;
8960
8961
        /* Compute the predicate that tells if the instruction
8962
     is concerned by the IT block
8963
     - Creates an error if there is a ldm that is not
8964
       last in the IT block thus cannot be replaced
8965
     - Otherwise we can create a branch at the end of the
8966
       IT block, it will be controlled naturally by IT
8967
       with the proper pseudo-predicate
8968
     - So the only interesting predicate is the one that
8969
       tells that we are not on the last item of an IT
8970
       block.  */
8971
0
        if (itblock_current_pos != 0)
8972
0
      is_not_last_in_it_block = !!--itblock_current_pos;
8973
8974
0
        if (insn_32bit)
8975
0
    {
8976
      /* Load the rest of the insn (in manual-friendly order).  */
8977
0
      insn = (insn << 16) | bfd_get_16 (abfd, &contents[i + 2]);
8978
0
      is_ldm = is_thumb2_ldmia (insn) || is_thumb2_ldmdb (insn);
8979
0
      is_vldm = is_thumb2_vldm (insn);
8980
8981
      /* Veneers are created for (v)ldm depending on
8982
         option flags and memory accesses conditions; but
8983
         if the instruction is not the last instruction of
8984
         an IT block, we cannot create a jump there, so we
8985
         bail out.  */
8986
0
        if ((is_ldm || is_vldm)
8987
0
      && stm32l4xx_need_create_replacing_stub
8988
0
      (insn, globals->stm32l4xx_fix))
8989
0
          {
8990
0
      if (is_not_last_in_it_block)
8991
0
        {
8992
0
          _bfd_error_handler
8993
            /* xgettext:c-format */
8994
0
            (_("%pB(%pA+%#x): error: multiple load detected"
8995
0
         " in non-last IT block instruction:"
8996
0
         " STM32L4XX veneer cannot be generated; "
8997
0
         "use gcc option -mrestrict-it to generate"
8998
0
         " only one instruction per IT block"),
8999
0
             abfd, sec, i);
9000
0
        }
9001
0
      else
9002
0
        {
9003
0
          elf32_stm32l4xx_erratum_list *newerr =
9004
0
            (elf32_stm32l4xx_erratum_list *)
9005
0
            bfd_zmalloc
9006
0
            (sizeof (elf32_stm32l4xx_erratum_list));
9007
9008
0
          elf32_arm_section_data (sec)
9009
0
            ->stm32l4xx_erratumcount += 1;
9010
0
          newerr->u.b.insn = insn;
9011
          /* We create only thumb branches.  */
9012
0
          newerr->type =
9013
0
            STM32L4XX_ERRATUM_BRANCH_TO_VENEER;
9014
0
          record_stm32l4xx_erratum_veneer
9015
0
            (link_info, newerr, abfd, sec,
9016
0
             i,
9017
0
             is_ldm ?
9018
0
             STM32L4XX_ERRATUM_LDM_VENEER_SIZE:
9019
0
             STM32L4XX_ERRATUM_VLDM_VENEER_SIZE);
9020
0
          newerr->vma = -1;
9021
0
          newerr->next = sec_data->stm32l4xx_erratumlist;
9022
0
          sec_data->stm32l4xx_erratumlist = newerr;
9023
0
        }
9024
0
          }
9025
0
    }
9026
0
        else
9027
0
    {
9028
      /* A7.7.37 IT p208
9029
         IT blocks are only encoded in T1
9030
         Encoding T1: IT{x{y{z}}} <firstcond>
9031
         1 0 1 1 - 1 1 1 1 - firstcond - mask
9032
         if mask = '0000' then see 'related encodings'
9033
         We don't deal with UNPREDICTABLE, just ignore these.
9034
         There can be no nested IT blocks so an IT block
9035
         is naturally a new one for which it is worth
9036
         computing its size.  */
9037
0
      bool is_newitblock = ((insn & 0xff00) == 0xbf00)
9038
0
        && ((insn & 0x000f) != 0x0000);
9039
      /* If we have a new IT block we compute its size.  */
9040
0
      if (is_newitblock)
9041
0
        {
9042
          /* Compute the number of instructions controlled
9043
       by the IT block, it will be used to decide
9044
       whether we are inside an IT block or not.  */
9045
0
          unsigned int mask = insn & 0x000f;
9046
0
          itblock_current_pos = 4 - ctz (mask);
9047
0
        }
9048
0
    }
9049
9050
0
        i += insn_32bit ? 4 : 2;
9051
0
      }
9052
0
  }
9053
9054
0
      if (elf_section_data (sec)->this_hdr.contents != contents)
9055
0
  free (contents);
9056
0
      contents = NULL;
9057
0
    }
9058
9059
0
  return true;
9060
9061
0
 error_return:
9062
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
9063
0
    free (contents);
9064
9065
0
  return false;
9066
0
}
9067
9068
/* Set target relocation values needed during linking.  */
9069
9070
void
9071
bfd_elf32_arm_set_target_params (struct bfd *output_bfd,
9072
         struct bfd_link_info *link_info,
9073
         struct elf32_arm_params *params)
9074
0
{
9075
0
  struct elf32_arm_link_hash_table *globals;
9076
9077
0
  globals = elf32_arm_hash_table (link_info);
9078
0
  if (globals == NULL)
9079
0
    return;
9080
9081
0
  globals->target1_is_rel = params->target1_is_rel;
9082
0
  if (globals->fdpic_p)
9083
0
    globals->target2_reloc = R_ARM_GOT32;
9084
0
  else if (strcmp (params->target2_type, "rel") == 0)
9085
0
    globals->target2_reloc = R_ARM_REL32;
9086
0
  else if (strcmp (params->target2_type, "abs") == 0)
9087
0
    globals->target2_reloc = R_ARM_ABS32;
9088
0
  else if (strcmp (params->target2_type, "got-rel") == 0)
9089
0
    globals->target2_reloc = R_ARM_GOT_PREL;
9090
0
  else
9091
0
    {
9092
0
      _bfd_error_handler (_("invalid TARGET2 relocation type '%s'"),
9093
0
        params->target2_type);
9094
0
    }
9095
0
  globals->fix_v4bx = params->fix_v4bx;
9096
0
  globals->use_blx |= params->use_blx;
9097
0
  globals->vfp11_fix = params->vfp11_denorm_fix;
9098
0
  globals->stm32l4xx_fix = params->stm32l4xx_fix;
9099
0
  if (globals->fdpic_p)
9100
0
    globals->pic_veneer = 1;
9101
0
  else
9102
0
    globals->pic_veneer = params->pic_veneer;
9103
0
  globals->fix_cortex_a8 = params->fix_cortex_a8;
9104
0
  globals->fix_arm1176 = params->fix_arm1176;
9105
0
  globals->cmse_implib = params->cmse_implib;
9106
0
  globals->in_implib_bfd = params->in_implib_bfd;
9107
9108
0
  BFD_ASSERT (is_arm_elf (output_bfd));
9109
0
  elf_arm_tdata (output_bfd)->no_enum_size_warning
9110
0
    = params->no_enum_size_warning;
9111
0
  elf_arm_tdata (output_bfd)->no_wchar_size_warning
9112
0
    = params->no_wchar_size_warning;
9113
0
}
9114
9115
/* Replace the target offset of a Thumb bl or b.w instruction.  */
9116
9117
static void
9118
insert_thumb_branch (bfd *abfd, long int offset, bfd_byte *insn)
9119
0
{
9120
0
  bfd_vma upper;
9121
0
  bfd_vma lower;
9122
0
  int reloc_sign;
9123
9124
0
  BFD_ASSERT ((offset & 1) == 0);
9125
9126
0
  upper = bfd_get_16 (abfd, insn);
9127
0
  lower = bfd_get_16 (abfd, insn + 2);
9128
0
  reloc_sign = (offset < 0) ? 1 : 0;
9129
0
  upper = (upper & ~(bfd_vma) 0x7ff)
9130
0
    | ((offset >> 12) & 0x3ff)
9131
0
    | (reloc_sign << 10);
9132
0
  lower = (lower & ~(bfd_vma) 0x2fff)
9133
0
    | (((!((offset >> 23) & 1)) ^ reloc_sign) << 13)
9134
0
    | (((!((offset >> 22) & 1)) ^ reloc_sign) << 11)
9135
0
    | ((offset >> 1) & 0x7ff);
9136
0
  bfd_put_16 (abfd, upper, insn);
9137
0
  bfd_put_16 (abfd, lower, insn + 2);
9138
0
}
9139
9140
/* Thumb code calling an ARM function.  */
9141
9142
static int
9143
elf32_thumb_to_arm_stub (struct bfd_link_info * info,
9144
       const char *   name,
9145
       bfd *      input_bfd,
9146
       bfd *      output_bfd,
9147
       asection *   input_section,
9148
       bfd_byte *   hit_data,
9149
       asection *   sym_sec,
9150
       bfd_vma    offset,
9151
       bfd_signed_vma   addend,
9152
       bfd_vma    val,
9153
       char **error_message)
9154
0
{
9155
0
  asection * s = 0;
9156
0
  bfd_vma my_offset;
9157
0
  long int ret_offset;
9158
0
  struct elf_link_hash_entry * myh;
9159
0
  struct elf32_arm_link_hash_table * globals;
9160
9161
0
  myh = find_thumb_glue (info, name, error_message);
9162
0
  if (myh == NULL)
9163
0
    return false;
9164
9165
0
  globals = elf32_arm_hash_table (info);
9166
0
  BFD_ASSERT (globals != NULL);
9167
0
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9168
9169
0
  my_offset = myh->root.u.def.value;
9170
9171
0
  s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9172
0
            THUMB2ARM_GLUE_SECTION_NAME);
9173
9174
0
  BFD_ASSERT (s != NULL);
9175
0
  BFD_ASSERT (s->contents != NULL);
9176
0
  BFD_ASSERT (s->output_section != NULL);
9177
9178
0
  if ((my_offset & 0x01) == 0x01)
9179
0
    {
9180
0
      if (sym_sec != NULL
9181
0
    && sym_sec->owner != NULL
9182
0
    && !INTERWORK_FLAG (sym_sec->owner))
9183
0
  {
9184
0
    _bfd_error_handler
9185
0
      (_("%pB(%s): warning: interworking not enabled;"
9186
0
         " first occurrence: %pB: %s call to %s"),
9187
0
       sym_sec->owner, name, input_bfd, "Thumb", "ARM");
9188
9189
0
    return false;
9190
0
  }
9191
9192
0
      --my_offset;
9193
0
      myh->root.u.def.value = my_offset;
9194
9195
0
      put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
9196
0
          s->contents + my_offset);
9197
9198
0
      put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
9199
0
          s->contents + my_offset + 2);
9200
9201
0
      ret_offset =
9202
  /* Address of destination of the stub.  */
9203
0
  ((bfd_signed_vma) val)
9204
0
  - ((bfd_signed_vma)
9205
     /* Offset from the start of the current section
9206
        to the start of the stubs.  */
9207
0
     (s->output_offset
9208
      /* Offset of the start of this stub from the start of the stubs.  */
9209
0
      + my_offset
9210
      /* Address of the start of the current section.  */
9211
0
      + s->output_section->vma)
9212
     /* The branch instruction is 4 bytes into the stub.  */
9213
0
     + 4
9214
     /* ARM branches work from the pc of the instruction + 8.  */
9215
0
     + 8);
9216
9217
0
      put_arm_insn (globals, output_bfd,
9218
0
        (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
9219
0
        s->contents + my_offset + 4);
9220
0
    }
9221
9222
0
  BFD_ASSERT (my_offset <= globals->thumb_glue_size);
9223
9224
  /* Now go back and fix up the original BL insn to point to here.  */
9225
0
  ret_offset =
9226
    /* Address of where the stub is located.  */
9227
0
    (s->output_section->vma + s->output_offset + my_offset)
9228
     /* Address of where the BL is located.  */
9229
0
    - (input_section->output_section->vma + input_section->output_offset
9230
0
       + offset)
9231
    /* Addend in the relocation.  */
9232
0
    - addend
9233
    /* Biassing for PC-relative addressing.  */
9234
0
    - 8;
9235
9236
0
  insert_thumb_branch (input_bfd, ret_offset, hit_data - input_section->vma);
9237
9238
0
  return true;
9239
0
}
9240
9241
/* Populate an Arm to Thumb stub.  Returns the stub symbol.  */
9242
9243
static struct elf_link_hash_entry *
9244
elf32_arm_create_thumb_stub (struct bfd_link_info * info,
9245
           const char *     name,
9246
           bfd *        input_bfd,
9247
           bfd *        output_bfd,
9248
           asection *       sym_sec,
9249
           bfd_vma        val,
9250
           asection *       s,
9251
           char **        error_message)
9252
0
{
9253
0
  bfd_vma my_offset;
9254
0
  long int ret_offset;
9255
0
  struct elf_link_hash_entry * myh;
9256
0
  struct elf32_arm_link_hash_table * globals;
9257
9258
0
  myh = find_arm_glue (info, name, error_message);
9259
0
  if (myh == NULL)
9260
0
    return NULL;
9261
9262
0
  globals = elf32_arm_hash_table (info);
9263
0
  BFD_ASSERT (globals != NULL);
9264
0
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9265
9266
0
  my_offset = myh->root.u.def.value;
9267
9268
0
  if ((my_offset & 0x01) == 0x01)
9269
0
    {
9270
0
      if (sym_sec != NULL
9271
0
    && sym_sec->owner != NULL
9272
0
    && !INTERWORK_FLAG (sym_sec->owner))
9273
0
  {
9274
0
    _bfd_error_handler
9275
0
      (_("%pB(%s): warning: interworking not enabled;"
9276
0
         " first occurrence: %pB: %s call to %s"),
9277
0
       sym_sec->owner, name, input_bfd, "ARM", "Thumb");
9278
0
  }
9279
9280
0
      --my_offset;
9281
0
      myh->root.u.def.value = my_offset;
9282
9283
0
      if (bfd_link_pic (info)
9284
0
    || globals->pic_veneer)
9285
0
  {
9286
    /* For relocatable objects we can't use absolute addresses,
9287
       so construct the address from a relative offset.  */
9288
    /* TODO: If the offset is small it's probably worth
9289
       constructing the address with adds.  */
9290
0
    put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
9291
0
      s->contents + my_offset);
9292
0
    put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
9293
0
      s->contents + my_offset + 4);
9294
0
    put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
9295
0
      s->contents + my_offset + 8);
9296
    /* Adjust the offset by 4 for the position of the add,
9297
       and 8 for the pipeline offset.  */
9298
0
    ret_offset = (val - (s->output_offset
9299
0
             + s->output_section->vma
9300
0
             + my_offset + 12))
9301
0
           | 1;
9302
0
    bfd_put_32 (output_bfd, ret_offset,
9303
0
          s->contents + my_offset + 12);
9304
0
  }
9305
0
      else if (globals->use_blx)
9306
0
  {
9307
0
    put_arm_insn (globals, output_bfd, (bfd_vma) a2t1v5_ldr_insn,
9308
0
      s->contents + my_offset);
9309
9310
    /* It's a thumb address.  Add the low order bit.  */
9311
0
    bfd_put_32 (output_bfd, val | a2t2v5_func_addr_insn,
9312
0
          s->contents + my_offset + 4);
9313
0
  }
9314
0
      else
9315
0
  {
9316
0
    put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
9317
0
      s->contents + my_offset);
9318
9319
0
    put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
9320
0
      s->contents + my_offset + 4);
9321
9322
    /* It's a thumb address.  Add the low order bit.  */
9323
0
    bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
9324
0
          s->contents + my_offset + 8);
9325
9326
0
    my_offset += 12;
9327
0
  }
9328
0
    }
9329
9330
0
  BFD_ASSERT (my_offset <= globals->arm_glue_size);
9331
9332
0
  return myh;
9333
0
}
9334
9335
/* Arm code calling a Thumb function.  */
9336
9337
static int
9338
elf32_arm_to_thumb_stub (struct bfd_link_info * info,
9339
       const char *   name,
9340
       bfd *      input_bfd,
9341
       bfd *      output_bfd,
9342
       asection *   input_section,
9343
       bfd_byte *   hit_data,
9344
       asection *   sym_sec,
9345
       bfd_vma    offset,
9346
       bfd_signed_vma   addend,
9347
       bfd_vma    val,
9348
       char **error_message)
9349
0
{
9350
0
  unsigned long int tmp;
9351
0
  bfd_vma my_offset;
9352
0
  asection * s;
9353
0
  long int ret_offset;
9354
0
  struct elf_link_hash_entry * myh;
9355
0
  struct elf32_arm_link_hash_table * globals;
9356
9357
0
  globals = elf32_arm_hash_table (info);
9358
0
  BFD_ASSERT (globals != NULL);
9359
0
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9360
9361
0
  s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9362
0
            ARM2THUMB_GLUE_SECTION_NAME);
9363
0
  BFD_ASSERT (s != NULL);
9364
0
  BFD_ASSERT (s->contents != NULL);
9365
0
  BFD_ASSERT (s->output_section != NULL);
9366
9367
0
  myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
9368
0
             sym_sec, val, s, error_message);
9369
0
  if (!myh)
9370
0
    return false;
9371
9372
0
  my_offset = myh->root.u.def.value;
9373
0
  tmp = bfd_get_32 (input_bfd, hit_data);
9374
0
  tmp = tmp & 0xFF000000;
9375
9376
  /* Somehow these are both 4 too far, so subtract 8.  */
9377
0
  ret_offset = (s->output_offset
9378
0
    + my_offset
9379
0
    + s->output_section->vma
9380
0
    - (input_section->output_offset
9381
0
       + input_section->output_section->vma
9382
0
       + offset + addend)
9383
0
    - 8);
9384
9385
0
  tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
9386
9387
0
  bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
9388
9389
0
  return true;
9390
0
}
9391
9392
/* Populate Arm stub for an exported Thumb function.  */
9393
9394
static bool
9395
elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
9396
0
{
9397
0
  struct bfd_link_info * info = (struct bfd_link_info *) inf;
9398
0
  asection * s;
9399
0
  struct elf_link_hash_entry * myh;
9400
0
  struct elf32_arm_link_hash_entry *eh;
9401
0
  struct elf32_arm_link_hash_table * globals;
9402
0
  asection *sec;
9403
0
  bfd_vma val;
9404
0
  char *error_message;
9405
9406
0
  eh = elf32_arm_hash_entry (h);
9407
  /* Allocate stubs for exported Thumb functions on v4t.  */
9408
0
  if (eh->export_glue == NULL)
9409
0
    return true;
9410
9411
0
  globals = elf32_arm_hash_table (info);
9412
0
  BFD_ASSERT (globals != NULL);
9413
0
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9414
9415
0
  s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9416
0
            ARM2THUMB_GLUE_SECTION_NAME);
9417
0
  BFD_ASSERT (s != NULL);
9418
0
  BFD_ASSERT (s->contents != NULL);
9419
0
  BFD_ASSERT (s->output_section != NULL);
9420
9421
0
  sec = eh->export_glue->root.u.def.section;
9422
9423
0
  BFD_ASSERT (sec->output_section != NULL);
9424
9425
0
  val = eh->export_glue->root.u.def.value + sec->output_offset
9426
0
  + sec->output_section->vma;
9427
9428
0
  myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
9429
0
             h->root.u.def.section->owner,
9430
0
             globals->obfd, sec, val, s,
9431
0
             &error_message);
9432
0
  BFD_ASSERT (myh);
9433
0
  return true;
9434
0
}
9435
9436
/* Populate ARMv4 BX veneers.  Returns the absolute adress of the veneer.  */
9437
9438
static bfd_vma
9439
elf32_arm_bx_glue (struct bfd_link_info * info, int reg)
9440
0
{
9441
0
  bfd_byte *p;
9442
0
  bfd_vma glue_addr;
9443
0
  asection *s;
9444
0
  struct elf32_arm_link_hash_table *globals;
9445
9446
0
  globals = elf32_arm_hash_table (info);
9447
0
  BFD_ASSERT (globals != NULL);
9448
0
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9449
9450
0
  s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9451
0
            ARM_BX_GLUE_SECTION_NAME);
9452
0
  BFD_ASSERT (s != NULL);
9453
0
  BFD_ASSERT (s->contents != NULL);
9454
0
  BFD_ASSERT (s->output_section != NULL);
9455
9456
0
  BFD_ASSERT (globals->bx_glue_offset[reg] & 2);
9457
9458
0
  glue_addr = globals->bx_glue_offset[reg] & ~(bfd_vma)3;
9459
9460
0
  if ((globals->bx_glue_offset[reg] & 1) == 0)
9461
0
    {
9462
0
      p = s->contents + glue_addr;
9463
0
      bfd_put_32 (globals->obfd, armbx1_tst_insn + (reg << 16), p);
9464
0
      bfd_put_32 (globals->obfd, armbx2_moveq_insn + reg, p + 4);
9465
0
      bfd_put_32 (globals->obfd, armbx3_bx_insn + reg, p + 8);
9466
0
      globals->bx_glue_offset[reg] |= 1;
9467
0
    }
9468
9469
0
  return glue_addr + s->output_section->vma + s->output_offset;
9470
0
}
9471
9472
/* Generate Arm stubs for exported Thumb symbols.  */
9473
static void
9474
elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
9475
          struct bfd_link_info *link_info)
9476
2
{
9477
2
  struct elf32_arm_link_hash_table * globals;
9478
9479
2
  if (link_info == NULL)
9480
    /* Ignore this if we are not called by the ELF backend linker.  */
9481
2
    return;
9482
9483
0
  globals = elf32_arm_hash_table (link_info);
9484
0
  if (globals == NULL)
9485
0
    return;
9486
9487
  /* If blx is available then exported Thumb symbols are OK and there is
9488
     nothing to do.  */
9489
0
  if (globals->use_blx)
9490
0
    return;
9491
9492
0
  elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
9493
0
        link_info);
9494
0
}
9495
9496
/* Reserve space for COUNT dynamic relocations in relocation selection
9497
   SRELOC.  */
9498
9499
static void
9500
elf32_arm_allocate_dynrelocs (struct bfd_link_info *info, asection *sreloc,
9501
            bfd_size_type count)
9502
0
{
9503
0
  struct elf32_arm_link_hash_table *htab;
9504
9505
0
  htab = elf32_arm_hash_table (info);
9506
0
  BFD_ASSERT (htab->root.dynamic_sections_created);
9507
0
  if (sreloc == NULL)
9508
0
    abort ();
9509
0
  sreloc->size += RELOC_SIZE (htab) * count;
9510
0
}
9511
9512
/* Reserve space for COUNT R_ARM_IRELATIVE relocations.  If the link is
9513
   dynamic, the relocations should go in SRELOC, otherwise they should
9514
   go in the special .rel.iplt section.  */
9515
9516
static void
9517
elf32_arm_allocate_irelocs (struct bfd_link_info *info, asection *sreloc,
9518
          bfd_size_type count)
9519
0
{
9520
0
  struct elf32_arm_link_hash_table *htab;
9521
9522
0
  htab = elf32_arm_hash_table (info);
9523
0
  if (!htab->root.dynamic_sections_created)
9524
0
    htab->root.irelplt->size += RELOC_SIZE (htab) * count;
9525
0
  else
9526
0
    {
9527
0
      BFD_ASSERT (sreloc != NULL);
9528
0
      sreloc->size += RELOC_SIZE (htab) * count;
9529
0
    }
9530
0
}
9531
9532
/* Add relocation REL to the end of relocation section SRELOC.  */
9533
9534
static void
9535
elf32_arm_add_dynreloc (bfd *output_bfd, struct bfd_link_info *info,
9536
      asection *sreloc, Elf_Internal_Rela *rel)
9537
0
{
9538
0
  bfd_byte *loc;
9539
0
  struct elf32_arm_link_hash_table *htab;
9540
9541
0
  htab = elf32_arm_hash_table (info);
9542
0
  if (!htab->root.dynamic_sections_created
9543
0
      && ELF32_R_TYPE (rel->r_info) == R_ARM_IRELATIVE)
9544
0
    sreloc = htab->root.irelplt;
9545
0
  if (sreloc == NULL)
9546
0
    abort ();
9547
0
  loc = sreloc->contents;
9548
0
  loc += sreloc->reloc_count++ * RELOC_SIZE (htab);
9549
0
  if (sreloc->reloc_count * RELOC_SIZE (htab) > sreloc->size)
9550
0
    abort ();
9551
0
  SWAP_RELOC_OUT (htab) (output_bfd, rel, loc);
9552
0
}
9553
9554
/* Allocate room for a PLT entry described by ROOT_PLT and ARM_PLT.
9555
   IS_IPLT_ENTRY says whether the entry belongs to .iplt rather than
9556
   to .plt.  */
9557
9558
static void
9559
elf32_arm_allocate_plt_entry (struct bfd_link_info *info,
9560
            bool is_iplt_entry,
9561
            union gotplt_union *root_plt,
9562
            struct arm_plt_info *arm_plt)
9563
0
{
9564
0
  struct elf32_arm_link_hash_table *htab;
9565
0
  asection *splt;
9566
0
  asection *sgotplt;
9567
9568
0
  htab = elf32_arm_hash_table (info);
9569
9570
0
  if (is_iplt_entry)
9571
0
    {
9572
0
      splt = htab->root.iplt;
9573
0
      sgotplt = htab->root.igotplt;
9574
9575
      /* NaCl uses a special first entry in .iplt too.  */
9576
0
      if (htab->root.target_os == is_nacl && splt->size == 0)
9577
0
  splt->size += htab->plt_header_size;
9578
9579
      /* Allocate room for an R_ARM_IRELATIVE relocation in .rel.iplt.  */
9580
0
      elf32_arm_allocate_irelocs (info, htab->root.irelplt, 1);
9581
0
    }
9582
0
  else
9583
0
    {
9584
0
      splt = htab->root.splt;
9585
0
      sgotplt = htab->root.sgotplt;
9586
9587
0
    if (htab->fdpic_p)
9588
0
      {
9589
  /* Allocate room for R_ARM_FUNCDESC_VALUE.  */
9590
  /* For lazy binding, relocations will be put into .rel.plt, in
9591
     .rel.got otherwise.  */
9592
  /* FIXME: today we don't support lazy binding so put it in .rel.got */
9593
0
  if (info->flags & DF_BIND_NOW)
9594
0
    elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
9595
0
  else
9596
0
    elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
9597
0
      }
9598
0
    else
9599
0
      {
9600
  /* Allocate room for an R_JUMP_SLOT relocation in .rel.plt.  */
9601
0
  elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
9602
0
      }
9603
9604
      /* If this is the first .plt entry, make room for the special
9605
   first entry.  */
9606
0
      if (splt->size == 0)
9607
0
  splt->size += htab->plt_header_size;
9608
9609
0
      htab->next_tls_desc_index++;
9610
0
    }
9611
9612
  /* Allocate the PLT entry itself, including any leading Thumb stub.  */
9613
0
  if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
9614
0
    splt->size += PLT_THUMB_STUB_SIZE;
9615
0
  root_plt->offset = splt->size;
9616
0
  splt->size += htab->plt_entry_size;
9617
9618
  /* We also need to make an entry in the .got.plt section, which
9619
     will be placed in the .got section by the linker script.  */
9620
0
  if (is_iplt_entry)
9621
0
    arm_plt->got_offset = sgotplt->size;
9622
0
  else
9623
0
    arm_plt->got_offset = sgotplt->size - 8 * htab->num_tls_desc;
9624
0
  if (htab->fdpic_p)
9625
    /* Function descriptor takes 64 bits in GOT.  */
9626
0
    sgotplt->size += 8;
9627
0
  else
9628
0
    sgotplt->size += 4;
9629
0
}
9630
9631
static bfd_vma
9632
arm_movw_immediate (bfd_vma value)
9633
0
{
9634
0
  return (value & 0x00000fff) | ((value & 0x0000f000) << 4);
9635
0
}
9636
9637
static bfd_vma
9638
arm_movt_immediate (bfd_vma value)
9639
0
{
9640
0
  return ((value & 0x0fff0000) >> 16) | ((value & 0xf0000000) >> 12);
9641
0
}
9642
9643
/* Fill in a PLT entry and its associated GOT slot.  If DYNINDX == -1,
9644
   the entry lives in .iplt and resolves to (*SYM_VALUE)().
9645
   Otherwise, DYNINDX is the index of the symbol in the dynamic
9646
   symbol table and SYM_VALUE is undefined.
9647
9648
   ROOT_PLT points to the offset of the PLT entry from the start of its
9649
   section (.iplt or .plt).  ARM_PLT points to the symbol's ARM-specific
9650
   bookkeeping information.
9651
9652
   Returns FALSE if there was a problem.  */
9653
9654
static bool
9655
elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
9656
            union gotplt_union *root_plt,
9657
            struct arm_plt_info *arm_plt,
9658
            int dynindx, bfd_vma sym_value)
9659
0
{
9660
0
  struct elf32_arm_link_hash_table *htab;
9661
0
  asection *sgot;
9662
0
  asection *splt;
9663
0
  asection *srel;
9664
0
  bfd_byte *loc;
9665
0
  bfd_vma plt_index;
9666
0
  Elf_Internal_Rela rel;
9667
0
  bfd_vma got_header_size;
9668
9669
0
  htab = elf32_arm_hash_table (info);
9670
9671
  /* Pick the appropriate sections and sizes.  */
9672
0
  if (dynindx == -1)
9673
0
    {
9674
0
      splt = htab->root.iplt;
9675
0
      sgot = htab->root.igotplt;
9676
0
      srel = htab->root.irelplt;
9677
9678
      /* There are no reserved entries in .igot.plt, and no special
9679
   first entry in .iplt.  */
9680
0
      got_header_size = 0;
9681
0
    }
9682
0
  else
9683
0
    {
9684
0
      splt = htab->root.splt;
9685
0
      sgot = htab->root.sgotplt;
9686
0
      srel = htab->root.srelplt;
9687
9688
0
      got_header_size = get_elf_backend_data (output_bfd)->got_header_size;
9689
0
    }
9690
0
  BFD_ASSERT (splt != NULL && srel != NULL);
9691
9692
0
  bfd_vma got_offset, got_address, plt_address;
9693
0
  bfd_vma got_displacement, initial_got_entry;
9694
0
  bfd_byte * ptr;
9695
9696
0
  BFD_ASSERT (sgot != NULL);
9697
9698
  /* Get the offset into the .(i)got.plt table of the entry that
9699
     corresponds to this function.  */
9700
0
  got_offset = (arm_plt->got_offset & -2);
9701
9702
  /* Get the index in the procedure linkage table which
9703
     corresponds to this symbol.  This is the index of this symbol
9704
     in all the symbols for which we are making plt entries.
9705
     After the reserved .got.plt entries, all symbols appear in
9706
     the same order as in .plt.  */
9707
0
  if (htab->fdpic_p)
9708
    /* Function descriptor takes 8 bytes.  */
9709
0
    plt_index = (got_offset - got_header_size) / 8;
9710
0
  else
9711
0
    plt_index = (got_offset - got_header_size) / 4;
9712
9713
  /* Calculate the address of the GOT entry.  */
9714
0
  got_address = (sgot->output_section->vma
9715
0
     + sgot->output_offset
9716
0
     + got_offset);
9717
9718
  /* ...and the address of the PLT entry.  */
9719
0
  plt_address = (splt->output_section->vma
9720
0
     + splt->output_offset
9721
0
     + root_plt->offset);
9722
9723
0
  ptr = splt->contents + root_plt->offset;
9724
0
  if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
9725
0
    {
9726
0
      unsigned int i;
9727
0
      bfd_vma val;
9728
9729
0
      for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
9730
0
  {
9731
0
    val = elf32_arm_vxworks_shared_plt_entry[i];
9732
0
    if (i == 2)
9733
0
      val |= got_address - sgot->output_section->vma;
9734
0
    if (i == 5)
9735
0
      val |= plt_index * RELOC_SIZE (htab);
9736
0
    if (i == 2 || i == 5)
9737
0
      bfd_put_32 (output_bfd, val, ptr);
9738
0
    else
9739
0
      put_arm_insn (htab, output_bfd, val, ptr);
9740
0
  }
9741
0
    }
9742
0
  else if (htab->root.target_os == is_vxworks)
9743
0
    {
9744
0
      unsigned int i;
9745
0
      bfd_vma val;
9746
9747
0
      for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
9748
0
  {
9749
0
    val = elf32_arm_vxworks_exec_plt_entry[i];
9750
0
    if (i == 2)
9751
0
      val |= got_address;
9752
0
    if (i == 4)
9753
0
      val |= 0xffffff & -((root_plt->offset + i * 4 + 8) >> 2);
9754
0
    if (i == 5)
9755
0
      val |= plt_index * RELOC_SIZE (htab);
9756
0
    if (i == 2 || i == 5)
9757
0
      bfd_put_32 (output_bfd, val, ptr);
9758
0
    else
9759
0
      put_arm_insn (htab, output_bfd, val, ptr);
9760
0
  }
9761
9762
0
      loc = (htab->srelplt2->contents
9763
0
       + (plt_index * 2 + 1) * RELOC_SIZE (htab));
9764
9765
      /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
9766
   referencing the GOT for this PLT entry.  */
9767
0
      rel.r_offset = plt_address + 8;
9768
0
      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
9769
0
      rel.r_addend = got_offset;
9770
0
      SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
9771
0
      loc += RELOC_SIZE (htab);
9772
9773
      /* Create the R_ARM_ABS32 relocation referencing the
9774
   beginning of the PLT for this GOT entry.  */
9775
0
      rel.r_offset = got_address;
9776
0
      rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
9777
0
      rel.r_addend = 0;
9778
0
      SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
9779
0
    }
9780
0
  else if (htab->root.target_os == is_nacl)
9781
0
    {
9782
      /* Calculate the displacement between the PLT slot and the
9783
   common tail that's part of the special initial PLT slot.  */
9784
0
      int32_t tail_displacement
9785
0
  = ((splt->output_section->vma + splt->output_offset
9786
0
      + ARM_NACL_PLT_TAIL_OFFSET)
9787
0
     - (plt_address + htab->plt_entry_size + 4));
9788
0
      BFD_ASSERT ((tail_displacement & 3) == 0);
9789
0
      tail_displacement >>= 2;
9790
9791
0
      BFD_ASSERT ((tail_displacement & 0xff000000) == 0
9792
0
      || (-tail_displacement & 0xff000000) == 0);
9793
9794
      /* Calculate the displacement between the PLT slot and the entry
9795
   in the GOT.  The offset accounts for the value produced by
9796
   adding to pc in the penultimate instruction of the PLT stub.  */
9797
0
      got_displacement = (got_address
9798
0
        - (plt_address + htab->plt_entry_size));
9799
9800
      /* NaCl does not support interworking at all.  */
9801
0
      BFD_ASSERT (!elf32_arm_plt_needs_thumb_stub_p (info, arm_plt));
9802
9803
0
      put_arm_insn (htab, output_bfd,
9804
0
        elf32_arm_nacl_plt_entry[0]
9805
0
        | arm_movw_immediate (got_displacement),
9806
0
        ptr + 0);
9807
0
      put_arm_insn (htab, output_bfd,
9808
0
        elf32_arm_nacl_plt_entry[1]
9809
0
        | arm_movt_immediate (got_displacement),
9810
0
        ptr + 4);
9811
0
      put_arm_insn (htab, output_bfd,
9812
0
        elf32_arm_nacl_plt_entry[2],
9813
0
        ptr + 8);
9814
0
      put_arm_insn (htab, output_bfd,
9815
0
        elf32_arm_nacl_plt_entry[3]
9816
0
        | (tail_displacement & 0x00ffffff),
9817
0
        ptr + 12);
9818
0
    }
9819
0
  else if (htab->fdpic_p)
9820
0
    {
9821
0
      const bfd_vma *plt_entry = using_thumb_only (htab)
9822
0
  ? elf32_arm_fdpic_thumb_plt_entry
9823
0
  : elf32_arm_fdpic_plt_entry;
9824
9825
      /* Fill-up Thumb stub if needed.  */
9826
0
      if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
9827
0
  {
9828
0
    put_thumb_insn (htab, output_bfd,
9829
0
        elf32_arm_plt_thumb_stub[0], ptr - 4);
9830
0
    put_thumb_insn (htab, output_bfd,
9831
0
        elf32_arm_plt_thumb_stub[1], ptr - 2);
9832
0
  }
9833
      /* As we are using 32 bit instructions even for the Thumb
9834
   version, we have to use 'put_arm_insn' instead of
9835
   'put_thumb_insn'.  */
9836
0
      put_arm_insn (htab, output_bfd, plt_entry[0], ptr + 0);
9837
0
      put_arm_insn (htab, output_bfd, plt_entry[1], ptr + 4);
9838
0
      put_arm_insn (htab, output_bfd, plt_entry[2], ptr + 8);
9839
0
      put_arm_insn (htab, output_bfd, plt_entry[3], ptr + 12);
9840
0
      bfd_put_32 (output_bfd, got_offset, ptr + 16);
9841
9842
0
      if (!(info->flags & DF_BIND_NOW))
9843
0
  {
9844
    /* funcdesc_value_reloc_offset.  */
9845
0
    bfd_put_32 (output_bfd,
9846
0
          htab->root.srelplt->reloc_count * RELOC_SIZE (htab),
9847
0
          ptr + 20);
9848
0
    put_arm_insn (htab, output_bfd, plt_entry[6], ptr + 24);
9849
0
    put_arm_insn (htab, output_bfd, plt_entry[7], ptr + 28);
9850
0
    put_arm_insn (htab, output_bfd, plt_entry[8], ptr + 32);
9851
0
    put_arm_insn (htab, output_bfd, plt_entry[9], ptr + 36);
9852
0
  }
9853
0
    }
9854
0
  else if (using_thumb_only (htab))
9855
0
    {
9856
      /* PR ld/16017: Generate thumb only PLT entries.  */
9857
0
      if (!using_thumb2 (htab))
9858
0
  {
9859
    /* FIXME: We ought to be able to generate thumb-1 PLT
9860
       instructions...  */
9861
0
    _bfd_error_handler (_("%pB: warning: thumb-1 mode PLT generation not currently supported"),
9862
0
            output_bfd);
9863
0
    return false;
9864
0
  }
9865
9866
      /* Calculate the displacement between the PLT slot and the entry in
9867
   the GOT.  The 12-byte offset accounts for the value produced by
9868
   adding to pc in the 3rd instruction of the PLT stub.  */
9869
0
      got_displacement = got_address - (plt_address + 12);
9870
9871
      /* As we are using 32 bit instructions we have to use 'put_arm_insn'
9872
   instead of 'put_thumb_insn'.  */
9873
0
      put_arm_insn (htab, output_bfd,
9874
0
        elf32_thumb2_plt_entry[0]
9875
0
        | ((got_displacement & 0x000000ff) << 16)
9876
0
        | ((got_displacement & 0x00000700) << 20)
9877
0
        | ((got_displacement & 0x00000800) >>  1)
9878
0
        | ((got_displacement & 0x0000f000) >> 12),
9879
0
        ptr + 0);
9880
0
      put_arm_insn (htab, output_bfd,
9881
0
        elf32_thumb2_plt_entry[1]
9882
0
        | ((got_displacement & 0x00ff0000)      )
9883
0
        | ((got_displacement & 0x07000000) <<  4)
9884
0
        | ((got_displacement & 0x08000000) >> 17)
9885
0
        | ((got_displacement & 0xf0000000) >> 28),
9886
0
        ptr + 4);
9887
0
      put_arm_insn (htab, output_bfd,
9888
0
        elf32_thumb2_plt_entry[2],
9889
0
        ptr + 8);
9890
0
      put_arm_insn (htab, output_bfd,
9891
0
        elf32_thumb2_plt_entry[3],
9892
0
        ptr + 12);
9893
0
    }
9894
0
  else
9895
0
    {
9896
      /* Calculate the displacement between the PLT slot and the
9897
   entry in the GOT.  The eight-byte offset accounts for the
9898
   value produced by adding to pc in the first instruction
9899
   of the PLT stub.  */
9900
0
      got_displacement = got_address - (plt_address + 8);
9901
9902
0
      if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
9903
0
  {
9904
0
    put_thumb_insn (htab, output_bfd,
9905
0
        elf32_arm_plt_thumb_stub[0], ptr - 4);
9906
0
    put_thumb_insn (htab, output_bfd,
9907
0
        elf32_arm_plt_thumb_stub[1], ptr - 2);
9908
0
  }
9909
9910
0
      if (!elf32_arm_use_long_plt_entry)
9911
0
  {
9912
0
    BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
9913
9914
0
    put_arm_insn (htab, output_bfd,
9915
0
      elf32_arm_plt_entry_short[0]
9916
0
      | ((got_displacement & 0x0ff00000) >> 20),
9917
0
      ptr + 0);
9918
0
    put_arm_insn (htab, output_bfd,
9919
0
      elf32_arm_plt_entry_short[1]
9920
0
      | ((got_displacement & 0x000ff000) >> 12),
9921
0
      ptr+ 4);
9922
0
    put_arm_insn (htab, output_bfd,
9923
0
      elf32_arm_plt_entry_short[2]
9924
0
      | (got_displacement & 0x00000fff),
9925
0
      ptr + 8);
9926
#ifdef FOUR_WORD_PLT
9927
    bfd_put_32 (output_bfd, elf32_arm_plt_entry_short[3], ptr + 12);
9928
#endif
9929
0
  }
9930
0
      else
9931
0
  {
9932
0
    put_arm_insn (htab, output_bfd,
9933
0
      elf32_arm_plt_entry_long[0]
9934
0
      | ((got_displacement & 0xf0000000) >> 28),
9935
0
      ptr + 0);
9936
0
    put_arm_insn (htab, output_bfd,
9937
0
      elf32_arm_plt_entry_long[1]
9938
0
      | ((got_displacement & 0x0ff00000) >> 20),
9939
0
      ptr + 4);
9940
0
    put_arm_insn (htab, output_bfd,
9941
0
      elf32_arm_plt_entry_long[2]
9942
0
      | ((got_displacement & 0x000ff000) >> 12),
9943
0
      ptr+ 8);
9944
0
    put_arm_insn (htab, output_bfd,
9945
0
      elf32_arm_plt_entry_long[3]
9946
0
      | (got_displacement & 0x00000fff),
9947
0
      ptr + 12);
9948
0
  }
9949
0
    }
9950
9951
  /* Fill in the entry in the .rel(a).(i)plt section.  */
9952
0
  rel.r_offset = got_address;
9953
0
  rel.r_addend = 0;
9954
0
  if (dynindx == -1)
9955
0
    {
9956
      /* .igot.plt entries use IRELATIVE relocations against SYM_VALUE.
9957
   The dynamic linker or static executable then calls SYM_VALUE
9958
   to determine the correct run-time value of the .igot.plt entry.  */
9959
0
      rel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
9960
0
      initial_got_entry = sym_value;
9961
0
    }
9962
0
  else
9963
0
    {
9964
      /* For FDPIC we will have to resolve a R_ARM_FUNCDESC_VALUE
9965
   used by PLT entry.  */
9966
0
      if (htab->fdpic_p)
9967
0
  {
9968
0
    rel.r_info = ELF32_R_INFO (dynindx, R_ARM_FUNCDESC_VALUE);
9969
0
    initial_got_entry = 0;
9970
0
  }
9971
0
      else
9972
0
  {
9973
0
    rel.r_info = ELF32_R_INFO (dynindx, R_ARM_JUMP_SLOT);
9974
0
    initial_got_entry = (splt->output_section->vma
9975
0
             + splt->output_offset);
9976
9977
    /* PR ld/16017
9978
       When thumb only we need to set the LSB for any address that
9979
       will be used with an interworking branch instruction.  */
9980
0
    if (using_thumb_only (htab))
9981
0
      initial_got_entry |= 1;
9982
0
  }
9983
0
    }
9984
9985
  /* Fill in the entry in the global offset table.  */
9986
0
  bfd_put_32 (output_bfd, initial_got_entry,
9987
0
        sgot->contents + got_offset);
9988
9989
0
  if (htab->fdpic_p && !(info->flags & DF_BIND_NOW))
9990
0
    {
9991
      /* Setup initial funcdesc value.  */
9992
      /* FIXME: we don't support lazy binding because there is a
9993
   race condition between both words getting written and
9994
   some other thread attempting to read them. The ARM
9995
   architecture does not have an atomic 64 bit load/store
9996
   instruction that could be used to prevent it; it is
9997
   recommended that threaded FDPIC applications run with the
9998
   LD_BIND_NOW environment variable set.  */
9999
0
      bfd_put_32 (output_bfd, plt_address + 0x18,
10000
0
      sgot->contents + got_offset);
10001
0
      bfd_put_32 (output_bfd, -1 /*TODO*/,
10002
0
      sgot->contents + got_offset + 4);
10003
0
    }
10004
10005
0
  if (dynindx == -1)
10006
0
    elf32_arm_add_dynreloc (output_bfd, info, srel, &rel);
10007
0
  else
10008
0
    {
10009
0
      if (htab->fdpic_p)
10010
0
  {
10011
    /* For FDPIC we put PLT relocationss into .rel.got when not
10012
       lazy binding otherwise we put them in .rel.plt.  For now,
10013
       we don't support lazy binding so put it in .rel.got.  */
10014
0
    if (info->flags & DF_BIND_NOW)
10015
0
      elf32_arm_add_dynreloc (output_bfd, info, htab->root.srelgot, &rel);
10016
0
    else
10017
0
      elf32_arm_add_dynreloc (output_bfd, info, htab->root.srelplt, &rel);
10018
0
  }
10019
0
      else
10020
0
  {
10021
0
    loc = srel->contents + plt_index * RELOC_SIZE (htab);
10022
0
    SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10023
0
  }
10024
0
    }
10025
10026
0
  return true;
10027
0
}
10028
10029
/* Some relocations map to different relocations depending on the
10030
   target.  Return the real relocation.  */
10031
10032
static int
10033
arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
10034
         int r_type)
10035
0
{
10036
0
  switch (r_type)
10037
0
    {
10038
0
    case R_ARM_TARGET1:
10039
0
      if (globals->target1_is_rel)
10040
0
  return R_ARM_REL32;
10041
0
      else
10042
0
  return R_ARM_ABS32;
10043
10044
0
    case R_ARM_TARGET2:
10045
0
      return globals->target2_reloc;
10046
10047
0
    default:
10048
0
      return r_type;
10049
0
    }
10050
0
}
10051
10052
/* Return the base VMA address which should be subtracted from real addresses
10053
   when resolving @dtpoff relocation.
10054
   This is PT_TLS segment p_vaddr.  */
10055
10056
static bfd_vma
10057
dtpoff_base (struct bfd_link_info *info)
10058
0
{
10059
  /* If tls_sec is NULL, we should have signalled an error already.  */
10060
0
  if (elf_hash_table (info)->tls_sec == NULL)
10061
0
    return 0;
10062
0
  return elf_hash_table (info)->tls_sec->vma;
10063
0
}
10064
10065
/* Return the relocation value for @tpoff relocation
10066
   if STT_TLS virtual address is ADDRESS.  */
10067
10068
static bfd_vma
10069
tpoff (struct bfd_link_info *info, bfd_vma address)
10070
0
{
10071
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
10072
0
  bfd_vma base;
10073
10074
  /* If tls_sec is NULL, we should have signalled an error already.  */
10075
0
  if (htab->tls_sec == NULL)
10076
0
    return 0;
10077
0
  base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
10078
0
  return address - htab->tls_sec->vma + base;
10079
0
}
10080
10081
/* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
10082
   VALUE is the relocation value.  */
10083
10084
static bfd_reloc_status_type
10085
elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
10086
0
{
10087
0
  if (value > 0xfff)
10088
0
    return bfd_reloc_overflow;
10089
10090
0
  value |= bfd_get_32 (abfd, data) & 0xfffff000;
10091
0
  bfd_put_32 (abfd, value, data);
10092
0
  return bfd_reloc_ok;
10093
0
}
10094
10095
/* Handle TLS relaxations.  Relaxing is possible for symbols that use
10096
   R_ARM_GOTDESC, R_ARM_{,THM_}TLS_CALL or
10097
   R_ARM_{,THM_}TLS_DESCSEQ relocations, during a static link.
10098
10099
   Return bfd_reloc_ok if we're done, bfd_reloc_continue if the caller
10100
   is to then call final_link_relocate.  Return other values in the
10101
   case of error.
10102
10103
   FIXME:When --emit-relocs is in effect, we'll emit relocs describing
10104
   the pre-relaxed code.  It would be nice if the relocs were updated
10105
   to match the optimization.   */
10106
10107
static bfd_reloc_status_type
10108
elf32_arm_tls_relax (struct elf32_arm_link_hash_table *globals,
10109
         bfd *input_bfd, asection *input_sec, bfd_byte *contents,
10110
         Elf_Internal_Rela *rel, unsigned long is_local)
10111
0
{
10112
0
  unsigned long insn;
10113
10114
0
  switch (ELF32_R_TYPE (rel->r_info))
10115
0
    {
10116
0
    default:
10117
0
      return bfd_reloc_notsupported;
10118
10119
0
    case R_ARM_TLS_GOTDESC:
10120
0
      if (is_local)
10121
0
  insn = 0;
10122
0
      else
10123
0
  {
10124
0
    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
10125
0
    if (insn & 1)
10126
0
      insn -= 5; /* THUMB */
10127
0
    else
10128
0
      insn -= 8; /* ARM */
10129
0
  }
10130
0
      bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
10131
0
      return bfd_reloc_continue;
10132
10133
0
    case R_ARM_THM_TLS_DESCSEQ:
10134
      /* Thumb insn.  */
10135
0
      insn = bfd_get_16 (input_bfd, contents + rel->r_offset);
10136
0
      if ((insn & 0xff78) == 0x4478)   /* add rx, pc */
10137
0
  {
10138
0
    if (is_local)
10139
      /* nop */
10140
0
      bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
10141
0
  }
10142
0
      else if ((insn & 0xffc0) == 0x6840)  /* ldr rx,[ry,#4] */
10143
0
  {
10144
0
    if (is_local)
10145
      /* nop */
10146
0
      bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
10147
0
    else
10148
      /* ldr rx,[ry] */
10149
0
      bfd_put_16 (input_bfd, insn & 0xf83f, contents + rel->r_offset);
10150
0
  }
10151
0
      else if ((insn & 0xff87) == 0x4780)  /* blx rx */
10152
0
  {
10153
0
    if (is_local)
10154
      /* nop */
10155
0
      bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
10156
0
    else
10157
      /* mov r0, rx */
10158
0
      bfd_put_16 (input_bfd, 0x4600 | (insn & 0x78),
10159
0
      contents + rel->r_offset);
10160
0
  }
10161
0
      else
10162
0
  {
10163
0
    if ((insn & 0xf000) == 0xf000 || (insn & 0xf800) == 0xe800)
10164
      /* It's a 32 bit instruction, fetch the rest of it for
10165
         error generation.  */
10166
0
      insn = (insn << 16)
10167
0
        | bfd_get_16 (input_bfd, contents + rel->r_offset + 2);
10168
0
    _bfd_error_handler
10169
      /* xgettext:c-format */
10170
0
      (_("%pB(%pA+%#" PRIx64 "): "
10171
0
         "unexpected %s instruction '%#lx' in TLS trampoline"),
10172
0
       input_bfd, input_sec, (uint64_t) rel->r_offset,
10173
0
       "Thumb", insn);
10174
0
    return bfd_reloc_notsupported;
10175
0
  }
10176
0
      break;
10177
10178
0
    case R_ARM_TLS_DESCSEQ:
10179
      /* arm insn.  */
10180
0
      insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
10181
0
      if ((insn & 0xffff0ff0) == 0xe08f0000) /* add rx,pc,ry */
10182
0
  {
10183
0
    if (is_local)
10184
      /* mov rx, ry */
10185
0
      bfd_put_32 (input_bfd, 0xe1a00000 | (insn & 0xffff),
10186
0
      contents + rel->r_offset);
10187
0
  }
10188
0
      else if ((insn & 0xfff00fff) == 0xe5900004) /* ldr rx,[ry,#4]*/
10189
0
  {
10190
0
    if (is_local)
10191
      /* nop */
10192
0
      bfd_put_32 (input_bfd, 0xe1a00000, contents + rel->r_offset);
10193
0
    else
10194
      /* ldr rx,[ry] */
10195
0
      bfd_put_32 (input_bfd, insn & 0xfffff000,
10196
0
      contents + rel->r_offset);
10197
0
  }
10198
0
      else if ((insn & 0xfffffff0) == 0xe12fff30) /* blx rx */
10199
0
  {
10200
0
    if (is_local)
10201
      /* nop */
10202
0
      bfd_put_32 (input_bfd, 0xe1a00000, contents + rel->r_offset);
10203
0
    else
10204
      /* mov r0, rx */
10205
0
      bfd_put_32 (input_bfd, 0xe1a00000 | (insn & 0xf),
10206
0
      contents + rel->r_offset);
10207
0
  }
10208
0
      else
10209
0
  {
10210
0
    _bfd_error_handler
10211
      /* xgettext:c-format */
10212
0
      (_("%pB(%pA+%#" PRIx64 "): "
10213
0
         "unexpected %s instruction '%#lx' in TLS trampoline"),
10214
0
       input_bfd, input_sec, (uint64_t) rel->r_offset,
10215
0
       "ARM", insn);
10216
0
    return bfd_reloc_notsupported;
10217
0
  }
10218
0
      break;
10219
10220
0
    case R_ARM_TLS_CALL:
10221
      /* GD->IE relaxation, turn the instruction into 'nop' or
10222
   'ldr r0, [pc,r0]'  */
10223
0
      insn = is_local ? 0xe1a00000 : 0xe79f0000;
10224
0
      bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
10225
0
      break;
10226
10227
0
    case R_ARM_THM_TLS_CALL:
10228
      /* GD->IE relaxation.  */
10229
0
      if (!is_local)
10230
  /* add r0,pc; ldr r0, [r0]  */
10231
0
  insn = 0x44786800;
10232
0
      else if (using_thumb2 (globals))
10233
  /* nop.w */
10234
0
  insn = 0xf3af8000;
10235
0
      else
10236
  /* nop; nop */
10237
0
  insn = 0xbf00bf00;
10238
10239
0
      bfd_put_16 (input_bfd, insn >> 16, contents + rel->r_offset);
10240
0
      bfd_put_16 (input_bfd, insn & 0xffff, contents + rel->r_offset + 2);
10241
0
      break;
10242
0
    }
10243
0
  return bfd_reloc_ok;
10244
0
}
10245
10246
/* For a given value of n, calculate the value of G_n as required to
10247
   deal with group relocations.  We return it in the form of an
10248
   encoded constant-and-rotation, together with the final residual.  If n is
10249
   specified as less than zero, then final_residual is filled with the
10250
   input value and no further action is performed.  */
10251
10252
static bfd_vma
10253
calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
10254
0
{
10255
0
  int current_n;
10256
0
  bfd_vma g_n;
10257
0
  bfd_vma encoded_g_n = 0;
10258
0
  bfd_vma residual = value; /* Also known as Y_n.  */
10259
10260
0
  for (current_n = 0; current_n <= n; current_n++)
10261
0
    {
10262
0
      int shift;
10263
10264
      /* Calculate which part of the value to mask.  */
10265
0
      if (residual == 0)
10266
0
  shift = 0;
10267
0
      else
10268
0
  {
10269
0
    int msb;
10270
10271
    /* Determine the most significant bit in the residual and
10272
       align the resulting value to a 2-bit boundary.  */
10273
0
    for (msb = 30; msb >= 0; msb -= 2)
10274
0
      if (residual & (3u << msb))
10275
0
        break;
10276
10277
    /* The desired shift is now (msb - 6), or zero, whichever
10278
       is the greater.  */
10279
0
    shift = msb - 6;
10280
0
    if (shift < 0)
10281
0
      shift = 0;
10282
0
  }
10283
10284
      /* Calculate g_n in 32-bit as well as encoded constant+rotation form.  */
10285
0
      g_n = residual & (0xff << shift);
10286
0
      encoded_g_n = (g_n >> shift)
10287
0
        | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
10288
10289
      /* Calculate the residual for the next time around.  */
10290
0
      residual &= ~g_n;
10291
0
    }
10292
10293
0
  *final_residual = residual;
10294
10295
0
  return encoded_g_n;
10296
0
}
10297
10298
/* Given an ARM instruction, determine whether it is an ADD or a SUB.
10299
   Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise.  */
10300
10301
static int
10302
identify_add_or_sub (bfd_vma insn)
10303
0
{
10304
0
  int opcode = insn & 0x1e00000;
10305
10306
0
  if (opcode == 1 << 23) /* ADD */
10307
0
    return 1;
10308
10309
0
  if (opcode == 1 << 22) /* SUB */
10310
0
    return -1;
10311
10312
0
  return 0;
10313
0
}
10314
10315
/* Perform a relocation as part of a final link.  */
10316
10317
static bfd_reloc_status_type
10318
elf32_arm_final_link_relocate (reloc_howto_type *     howto,
10319
             bfd *          input_bfd,
10320
             bfd *          output_bfd,
10321
             asection *       input_section,
10322
             bfd_byte *       contents,
10323
             Elf_Internal_Rela *      rel,
10324
             bfd_vma          value,
10325
             struct bfd_link_info *     info,
10326
             asection *       sym_sec,
10327
             const char *       sym_name,
10328
             unsigned char        st_type,
10329
             enum arm_st_branch_type      branch_type,
10330
             struct elf_link_hash_entry * h,
10331
             bool *         unresolved_reloc_p,
10332
             char **          error_message)
10333
0
{
10334
0
  unsigned long     r_type = howto->type;
10335
0
  unsigned long     r_symndx;
10336
0
  bfd_byte *      hit_data = contents + rel->r_offset;
10337
0
  bfd_vma *     local_got_offsets;
10338
0
  bfd_vma *     local_tlsdesc_gotents;
10339
0
  asection *      sgot;
10340
0
  asection *      splt;
10341
0
  asection *      sreloc = NULL;
10342
0
  asection *      srelgot;
10343
0
  bfd_vma     addend;
10344
0
  bfd_signed_vma    signed_addend;
10345
0
  unsigned char     dynreloc_st_type;
10346
0
  bfd_vma     dynreloc_value;
10347
0
  struct elf32_arm_link_hash_table * globals;
10348
0
  struct elf32_arm_link_hash_entry *eh;
10349
0
  union gotplt_union         *root_plt;
10350
0
  struct arm_plt_info        *arm_plt;
10351
0
  bfd_vma     plt_offset;
10352
0
  bfd_vma     gotplt_offset;
10353
0
  bool        has_iplt_entry;
10354
0
  bool        resolved_to_zero;
10355
10356
0
  globals = elf32_arm_hash_table (info);
10357
0
  if (globals == NULL)
10358
0
    return bfd_reloc_notsupported;
10359
10360
0
  BFD_ASSERT (is_arm_elf (input_bfd));
10361
0
  BFD_ASSERT (howto != NULL);
10362
10363
  /* Some relocation types map to different relocations depending on the
10364
     target.  We pick the right one here.  */
10365
0
  r_type = arm_real_reloc_type (globals, r_type);
10366
10367
  /* It is possible to have linker relaxations on some TLS access
10368
     models.  Update our information here.  */
10369
0
  r_type = elf32_arm_tls_transition (info, r_type, h);
10370
10371
0
  if (r_type != howto->type)
10372
0
    howto = elf32_arm_howto_from_type (r_type);
10373
10374
0
  eh = (struct elf32_arm_link_hash_entry *) h;
10375
0
  sgot = globals->root.sgot;
10376
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
10377
0
  local_tlsdesc_gotents = elf32_arm_local_tlsdesc_gotent (input_bfd);
10378
10379
0
  if (globals->root.dynamic_sections_created)
10380
0
    srelgot = globals->root.srelgot;
10381
0
  else
10382
0
    srelgot = NULL;
10383
10384
0
  r_symndx = ELF32_R_SYM (rel->r_info);
10385
10386
0
  if (globals->use_rel)
10387
0
    {
10388
0
      bfd_vma sign;
10389
10390
0
      switch (bfd_get_reloc_size (howto))
10391
0
  {
10392
0
  case 1: addend = bfd_get_8 (input_bfd, hit_data); break;
10393
0
  case 2: addend = bfd_get_16 (input_bfd, hit_data); break;
10394
0
  case 4: addend = bfd_get_32 (input_bfd, hit_data); break;
10395
0
  default: addend = 0; break;
10396
0
  }
10397
      /* Note: the addend and signed_addend calculated here are
10398
   incorrect for any split field.  */
10399
0
      addend &= howto->src_mask;
10400
0
      sign = howto->src_mask & ~(howto->src_mask >> 1);
10401
0
      signed_addend = (addend ^ sign) - sign;
10402
0
      signed_addend = (bfd_vma) signed_addend << howto->rightshift;
10403
0
      addend <<= howto->rightshift;
10404
0
    }
10405
0
  else
10406
0
    addend = signed_addend = rel->r_addend;
10407
10408
  /* Record the symbol information that should be used in dynamic
10409
     relocations.  */
10410
0
  dynreloc_st_type = st_type;
10411
0
  dynreloc_value = value;
10412
0
  if (branch_type == ST_BRANCH_TO_THUMB)
10413
0
    dynreloc_value |= 1;
10414
10415
  /* Find out whether the symbol has a PLT.  Set ST_VALUE, BRANCH_TYPE and
10416
     VALUE appropriately for relocations that we resolve at link time.  */
10417
0
  has_iplt_entry = false;
10418
0
  if (elf32_arm_get_plt_info (input_bfd, globals, eh, r_symndx, &root_plt,
10419
0
            &arm_plt)
10420
0
      && root_plt->offset != (bfd_vma) -1)
10421
0
    {
10422
0
      plt_offset = root_plt->offset;
10423
0
      gotplt_offset = arm_plt->got_offset;
10424
10425
0
      if (h == NULL || eh->is_iplt)
10426
0
  {
10427
0
    has_iplt_entry = true;
10428
0
    splt = globals->root.iplt;
10429
10430
    /* Populate .iplt entries here, because not all of them will
10431
       be seen by finish_dynamic_symbol.  The lower bit is set if
10432
       we have already populated the entry.  */
10433
0
    if (plt_offset & 1)
10434
0
      plt_offset--;
10435
0
    else
10436
0
      {
10437
0
        if (elf32_arm_populate_plt_entry (output_bfd, info, root_plt, arm_plt,
10438
0
            -1, dynreloc_value))
10439
0
    root_plt->offset |= 1;
10440
0
        else
10441
0
    return bfd_reloc_notsupported;
10442
0
      }
10443
10444
    /* Static relocations always resolve to the .iplt entry.  */
10445
0
    st_type = STT_FUNC;
10446
0
    value = (splt->output_section->vma
10447
0
       + splt->output_offset
10448
0
       + plt_offset);
10449
0
    branch_type = ST_BRANCH_TO_ARM;
10450
10451
    /* If there are non-call relocations that resolve to the .iplt
10452
       entry, then all dynamic ones must too.  */
10453
0
    if (arm_plt->noncall_refcount != 0)
10454
0
      {
10455
0
        dynreloc_st_type = st_type;
10456
0
        dynreloc_value = value;
10457
0
      }
10458
0
  }
10459
0
      else
10460
  /* We populate the .plt entry in finish_dynamic_symbol.  */
10461
0
  splt = globals->root.splt;
10462
0
    }
10463
0
  else
10464
0
    {
10465
0
      splt = NULL;
10466
0
      plt_offset = (bfd_vma) -1;
10467
0
      gotplt_offset = (bfd_vma) -1;
10468
0
    }
10469
10470
  /* ST_BRANCH_TO_ARM is nonsense to thumb-only targets when we are
10471
     resolving a function call relocation.  We want to inform the user
10472
     that something is wrong.  */
10473
0
  if (using_thumb_only (globals)
10474
0
      && (r_type == R_ARM_THM_CALL
10475
0
    || r_type == R_ARM_THM_JUMP24)
10476
0
      && branch_type == ST_BRANCH_TO_ARM
10477
      /* Calls through a PLT are special: the assembly source code
10478
   cannot be annotated with '.type foo(PLT), %function', and
10479
   they handled specifically below anyway. */
10480
0
      && splt == NULL)
10481
0
    {
10482
0
      if (sym_sec == bfd_abs_section_ptr)
10483
0
  {
10484
  /* As an exception, assume that absolute symbols are of the
10485
     right kind (Thumb).  They are presumably defined in the
10486
     linker script, where it is not possible to declare them as
10487
     Thumb (and thus are seen as Arm mode). Inform the user with
10488
     a warning, though. */
10489
0
    branch_type = ST_BRANCH_TO_THUMB;
10490
10491
0
    if (sym_sec->owner)
10492
0
      _bfd_error_handler
10493
0
        (_("warning: %pB(%s): Forcing bramch to absolute symbol in Thumb mode (Thumb-only CPU)"
10494
0
     " in %pB"),
10495
0
         sym_sec->owner, sym_name, input_bfd);
10496
0
    else
10497
0
      _bfd_error_handler
10498
0
        (_("warning: (%s): Forcing branch to absolute symbol in Thumb mode (Thumb-only CPU)"
10499
0
     " in %pB"),
10500
0
         sym_name, input_bfd);
10501
0
  }
10502
0
      else
10503
  /* Otherwise do not silently build a stub, and let the users
10504
     know they have to fix their code.  Indeed, we could decide
10505
     to insert a stub involving Arm code and/or BLX, leading to
10506
     a run-time crash.  */
10507
0
  branch_type = ST_BRANCH_UNKNOWN;
10508
0
    }
10509
10510
  /* Fail early if branch_type is ST_BRANCH_UNKNOWN and we target a
10511
     Thumb-only CPU.  We could emit a warning on Arm-capable targets
10512
     too, but that would be too verbose (a lot of legacy code does not
10513
     use the .type foo, %function directive).  */
10514
0
  if (using_thumb_only (globals)
10515
0
      && (r_type == R_ARM_THM_CALL
10516
0
    || r_type == R_ARM_THM_JUMP24)
10517
0
      && branch_type == ST_BRANCH_UNKNOWN
10518
      /* Exception to the rule above: a branch to an undefined weak
10519
   symbol is turned into a jump to the next instruction unless a
10520
   PLT entry will be created (see below).  */
10521
0
      && !(h && h->root.type == bfd_link_hash_undefweak
10522
0
     && plt_offset == (bfd_vma) -1))
10523
0
    {
10524
0
      if (sym_sec != NULL
10525
0
    && sym_sec->owner != NULL)
10526
0
  _bfd_error_handler
10527
0
    (_("%pB(%s): Unknown destination type (ARM/Thumb) in %pB"),
10528
0
     sym_sec->owner, sym_name, input_bfd);
10529
0
      else
10530
0
  _bfd_error_handler
10531
0
    (_("(%s): Unknown destination type (ARM/Thumb) in %pB"),
10532
0
     sym_name, input_bfd);
10533
10534
0
      return bfd_reloc_notsupported;
10535
0
    }
10536
10537
0
  resolved_to_zero = (h != NULL
10538
0
          && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
10539
10540
0
  switch (r_type)
10541
0
    {
10542
0
    case R_ARM_NONE:
10543
      /* We don't need to find a value for this symbol.  It's just a
10544
   marker.  */
10545
0
      *unresolved_reloc_p = false;
10546
0
      return bfd_reloc_ok;
10547
10548
0
    case R_ARM_ABS12:
10549
0
      if (globals->root.target_os != is_vxworks)
10550
0
  return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
10551
      /* Fall through.  */
10552
10553
0
    case R_ARM_PC24:
10554
0
    case R_ARM_ABS32:
10555
0
    case R_ARM_ABS32_NOI:
10556
0
    case R_ARM_REL32:
10557
0
    case R_ARM_REL32_NOI:
10558
0
    case R_ARM_CALL:
10559
0
    case R_ARM_JUMP24:
10560
0
    case R_ARM_XPC25:
10561
0
    case R_ARM_PREL31:
10562
0
    case R_ARM_PLT32:
10563
      /* Handle relocations which should use the PLT entry.  ABS32/REL32
10564
   will use the symbol's value, which may point to a PLT entry, but we
10565
   don't need to handle that here.  If we created a PLT entry, all
10566
   branches in this object should go to it, except if the PLT is too
10567
   far away, in which case a long branch stub should be inserted.  */
10568
0
      if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
10569
0
     && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI
10570
0
     && r_type != R_ARM_CALL
10571
0
     && r_type != R_ARM_JUMP24
10572
0
     && r_type != R_ARM_PLT32)
10573
0
    && plt_offset != (bfd_vma) -1)
10574
0
  {
10575
    /* If we've created a .plt section, and assigned a PLT entry
10576
       to this function, it must either be a STT_GNU_IFUNC reference
10577
       or not be known to bind locally.  In other cases, we should
10578
       have cleared the PLT entry by now.  */
10579
0
    BFD_ASSERT (has_iplt_entry || !SYMBOL_CALLS_LOCAL (info, h));
10580
10581
0
    value = (splt->output_section->vma
10582
0
       + splt->output_offset
10583
0
       + plt_offset);
10584
0
    *unresolved_reloc_p = false;
10585
0
    return _bfd_final_link_relocate (howto, input_bfd, input_section,
10586
0
             contents, rel->r_offset, value,
10587
0
             rel->r_addend);
10588
0
  }
10589
10590
      /* When generating a shared library or PIE, these relocations
10591
   are copied into the output file to be resolved at run time.  */
10592
0
      if ((bfd_link_pic (info)
10593
0
     || globals->fdpic_p)
10594
0
    && (input_section->flags & SEC_ALLOC)
10595
0
    && !(globals->root.target_os == is_vxworks
10596
0
         && strcmp (input_section->output_section->name,
10597
0
        ".tls_vars") == 0)
10598
0
    && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
10599
0
        || !SYMBOL_CALLS_LOCAL (info, h))
10600
0
    && !(input_bfd == globals->stub_bfd
10601
0
         && strstr (input_section->name, STUB_SUFFIX))
10602
0
    && (h == NULL
10603
0
        || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
10604
0
      && !resolved_to_zero)
10605
0
        || h->root.type != bfd_link_hash_undefweak)
10606
0
    && r_type != R_ARM_PC24
10607
0
    && r_type != R_ARM_CALL
10608
0
    && r_type != R_ARM_JUMP24
10609
0
    && r_type != R_ARM_PREL31
10610
0
    && r_type != R_ARM_PLT32)
10611
0
  {
10612
0
    Elf_Internal_Rela outrel;
10613
0
    bool skip, relocate;
10614
0
    int isrofixup = 0;
10615
10616
0
    if ((r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
10617
0
        && !h->def_regular)
10618
0
      {
10619
0
        char *v = _("shared object");
10620
10621
0
        if (bfd_link_executable (info))
10622
0
    v = _("PIE executable");
10623
10624
0
        _bfd_error_handler
10625
0
    (_("%pB: relocation %s against external or undefined symbol `%s'"
10626
0
       " can not be used when making a %s; recompile with -fPIC"), input_bfd,
10627
0
     elf32_arm_howto_table_1[r_type].name, h->root.root.string, v);
10628
0
        return bfd_reloc_notsupported;
10629
0
      }
10630
10631
0
    *unresolved_reloc_p = false;
10632
10633
0
    if (sreloc == NULL && globals->root.dynamic_sections_created)
10634
0
      {
10635
0
        sreloc = _bfd_elf_get_dynamic_reloc_section (input_bfd, input_section,
10636
0
                 ! globals->use_rel);
10637
10638
0
        if (sreloc == NULL)
10639
0
    return bfd_reloc_notsupported;
10640
0
      }
10641
10642
0
    skip = false;
10643
0
    relocate = false;
10644
10645
0
    outrel.r_addend = addend;
10646
0
    outrel.r_offset =
10647
0
      _bfd_elf_section_offset (output_bfd, info, input_section,
10648
0
             rel->r_offset);
10649
0
    if (outrel.r_offset == (bfd_vma) -1)
10650
0
      skip = true;
10651
0
    else if (outrel.r_offset == (bfd_vma) -2)
10652
0
      skip = true, relocate = true;
10653
0
    outrel.r_offset += (input_section->output_section->vma
10654
0
            + input_section->output_offset);
10655
10656
0
    if (skip)
10657
0
      memset (&outrel, 0, sizeof outrel);
10658
0
    else if (h != NULL
10659
0
       && h->dynindx != -1
10660
0
       && (!bfd_link_pic (info)
10661
0
           || !(bfd_link_pie (info)
10662
0
          || SYMBOLIC_BIND (info, h))
10663
0
           || !h->def_regular))
10664
0
      outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
10665
0
    else
10666
0
      {
10667
0
        int symbol;
10668
10669
        /* This symbol is local, or marked to become local.  */
10670
0
        BFD_ASSERT (r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI
10671
0
        || (globals->fdpic_p && !bfd_link_pic (info)));
10672
        /* On SVR4-ish systems, the dynamic loader cannot
10673
     relocate the text and data segments independently,
10674
     so the symbol does not matter.  */
10675
0
        symbol = 0;
10676
0
        if (dynreloc_st_type == STT_GNU_IFUNC)
10677
    /* We have an STT_GNU_IFUNC symbol that doesn't resolve
10678
       to the .iplt entry.  Instead, every non-call reference
10679
       must use an R_ARM_IRELATIVE relocation to obtain the
10680
       correct run-time address.  */
10681
0
    outrel.r_info = ELF32_R_INFO (symbol, R_ARM_IRELATIVE);
10682
0
        else if (globals->fdpic_p && !bfd_link_pic (info))
10683
0
    isrofixup = 1;
10684
0
        else
10685
0
    outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
10686
0
        if (globals->use_rel)
10687
0
    relocate = true;
10688
0
        else
10689
0
    outrel.r_addend += dynreloc_value;
10690
0
      }
10691
10692
0
    if (isrofixup)
10693
0
      arm_elf_add_rofixup (output_bfd, globals->srofixup, outrel.r_offset);
10694
0
    else
10695
0
      elf32_arm_add_dynreloc (output_bfd, info, sreloc, &outrel);
10696
10697
    /* If this reloc is against an external symbol, we do not want to
10698
       fiddle with the addend.  Otherwise, we need to include the symbol
10699
       value so that it becomes an addend for the dynamic reloc.  */
10700
0
    if (! relocate)
10701
0
      return bfd_reloc_ok;
10702
10703
0
    return _bfd_final_link_relocate (howto, input_bfd, input_section,
10704
0
             contents, rel->r_offset,
10705
0
             dynreloc_value, (bfd_vma) 0);
10706
0
  }
10707
0
      else switch (r_type)
10708
0
  {
10709
0
  case R_ARM_ABS12:
10710
0
    return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
10711
10712
0
  case R_ARM_XPC25:   /* Arm BLX instruction.  */
10713
0
  case R_ARM_CALL:
10714
0
  case R_ARM_JUMP24:
10715
0
  case R_ARM_PC24:    /* Arm B/BL instruction.  */
10716
0
  case R_ARM_PLT32:
10717
0
    {
10718
0
    struct elf32_arm_stub_hash_entry *stub_entry = NULL;
10719
10720
0
    if (r_type == R_ARM_XPC25)
10721
0
      {
10722
        /* Check for Arm calling Arm function.  */
10723
        /* FIXME: Should we translate the instruction into a BL
10724
     instruction instead ?  */
10725
0
        if (branch_type != ST_BRANCH_TO_THUMB)
10726
0
    _bfd_error_handler
10727
0
      (_("\%pB: warning: %s BLX instruction targets"
10728
0
         " %s function '%s'"),
10729
0
       input_bfd, "ARM",
10730
0
       "ARM", h ? h->root.root.string : "(local)");
10731
0
      }
10732
0
    else if (r_type == R_ARM_PC24)
10733
0
      {
10734
        /* Check for Arm calling Thumb function.  */
10735
0
        if (branch_type == ST_BRANCH_TO_THUMB)
10736
0
    {
10737
0
      if (elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
10738
0
                 output_bfd, input_section,
10739
0
                 hit_data, sym_sec, rel->r_offset,
10740
0
                 signed_addend, value,
10741
0
                 error_message))
10742
0
        return bfd_reloc_ok;
10743
0
      else
10744
0
        return bfd_reloc_dangerous;
10745
0
    }
10746
0
      }
10747
10748
    /* Check if a stub has to be inserted because the
10749
       destination is too far or we are changing mode.  */
10750
0
    if (   r_type == R_ARM_CALL
10751
0
        || r_type == R_ARM_JUMP24
10752
0
        || r_type == R_ARM_PLT32)
10753
0
      {
10754
0
        enum elf32_arm_stub_type stub_type = arm_stub_none;
10755
0
        struct elf32_arm_link_hash_entry *hash;
10756
10757
0
        hash = (struct elf32_arm_link_hash_entry *) h;
10758
0
        stub_type = arm_type_of_stub (info, input_section, rel,
10759
0
              st_type, &branch_type,
10760
0
              hash, value, sym_sec,
10761
0
              input_bfd, sym_name);
10762
10763
0
        if (stub_type != arm_stub_none)
10764
0
    {
10765
      /* The target is out of reach, so redirect the
10766
         branch to the local stub for this function.  */
10767
0
      stub_entry = elf32_arm_get_stub_entry (input_section,
10768
0
               sym_sec, h,
10769
0
               rel, globals,
10770
0
               stub_type);
10771
0
      {
10772
0
        if (stub_entry != NULL)
10773
0
          value = (stub_entry->stub_offset
10774
0
             + stub_entry->stub_sec->output_offset
10775
0
             + stub_entry->stub_sec->output_section->vma);
10776
10777
0
        if (plt_offset != (bfd_vma) -1)
10778
0
          *unresolved_reloc_p = false;
10779
0
      }
10780
0
    }
10781
0
        else
10782
0
    {
10783
      /* If the call goes through a PLT entry, make sure to
10784
         check distance to the right destination address.  */
10785
0
      if (plt_offset != (bfd_vma) -1)
10786
0
        {
10787
0
          value = (splt->output_section->vma
10788
0
             + splt->output_offset
10789
0
             + plt_offset);
10790
0
          *unresolved_reloc_p = false;
10791
          /* The PLT entry is in ARM mode, regardless of the
10792
       target function.  */
10793
0
          branch_type = ST_BRANCH_TO_ARM;
10794
0
        }
10795
0
    }
10796
0
      }
10797
10798
    /* The ARM ELF ABI says that this reloc is computed as: S - P + A
10799
       where:
10800
        S is the address of the symbol in the relocation.
10801
        P is address of the instruction being relocated.
10802
        A is the addend (extracted from the instruction) in bytes.
10803
10804
       S is held in 'value'.
10805
       P is the base address of the section containing the
10806
         instruction plus the offset of the reloc into that
10807
         section, ie:
10808
     (input_section->output_section->vma +
10809
      input_section->output_offset +
10810
      rel->r_offset).
10811
       A is the addend, converted into bytes, ie:
10812
     (signed_addend * 4)
10813
10814
       Note: None of these operations have knowledge of the pipeline
10815
       size of the processor, thus it is up to the assembler to
10816
       encode this information into the addend.  */
10817
0
    value -= (input_section->output_section->vma
10818
0
        + input_section->output_offset);
10819
0
    value -= rel->r_offset;
10820
0
    value += signed_addend;
10821
10822
0
    signed_addend = value;
10823
0
    signed_addend >>= howto->rightshift;
10824
10825
    /* A branch to an undefined weak symbol is turned into a jump to
10826
       the next instruction unless a PLT entry will be created.
10827
       Do the same for local undefined symbols (but not for STN_UNDEF).
10828
       The jump to the next instruction is optimized as a NOP depending
10829
       on the architecture.  */
10830
0
    if (h ? (h->root.type == bfd_link_hash_undefweak
10831
0
       && plt_offset == (bfd_vma) -1)
10832
0
        : r_symndx != STN_UNDEF && bfd_is_und_section (sym_sec))
10833
0
      {
10834
0
        value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000);
10835
10836
0
        if (arch_has_arm_nop (globals))
10837
0
    value |= 0x0320f000;
10838
0
        else
10839
0
    value |= 0x01a00000; /* Using pre-UAL nop: mov r0, r0.  */
10840
0
      }
10841
0
    else
10842
0
      {
10843
        /* Perform a signed range check.  */
10844
0
        if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
10845
0
      || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
10846
0
    return bfd_reloc_overflow;
10847
10848
0
        addend = (value & 2);
10849
10850
0
        value = (signed_addend & howto->dst_mask)
10851
0
    | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
10852
10853
0
        if (r_type == R_ARM_CALL)
10854
0
    {
10855
      /* Set the H bit in the BLX instruction.  */
10856
0
      if (branch_type == ST_BRANCH_TO_THUMB)
10857
0
        {
10858
0
          if (addend)
10859
0
      value |= (1 << 24);
10860
0
          else
10861
0
      value &= ~(bfd_vma)(1 << 24);
10862
0
        }
10863
10864
      /* Select the correct instruction (BL or BLX).  */
10865
      /* Only if we are not handling a BL to a stub. In this
10866
         case, mode switching is performed by the stub.  */
10867
0
      if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry)
10868
0
        value |= (1 << 28);
10869
0
      else if (stub_entry || branch_type != ST_BRANCH_UNKNOWN)
10870
0
        {
10871
0
          value &= ~(bfd_vma)(1 << 28);
10872
0
          value |= (1 << 24);
10873
0
        }
10874
0
    }
10875
0
      }
10876
0
    }
10877
0
    break;
10878
10879
0
  case R_ARM_ABS32:
10880
0
    value += addend;
10881
0
    if (branch_type == ST_BRANCH_TO_THUMB)
10882
0
      value |= 1;
10883
0
    break;
10884
10885
0
  case R_ARM_ABS32_NOI:
10886
0
    value += addend;
10887
0
    break;
10888
10889
0
  case R_ARM_REL32:
10890
0
    value += addend;
10891
0
    if (branch_type == ST_BRANCH_TO_THUMB)
10892
0
      value |= 1;
10893
0
    value -= (input_section->output_section->vma
10894
0
        + input_section->output_offset + rel->r_offset);
10895
0
    break;
10896
10897
0
  case R_ARM_REL32_NOI:
10898
0
    value += addend;
10899
0
    value -= (input_section->output_section->vma
10900
0
        + input_section->output_offset + rel->r_offset);
10901
0
    break;
10902
10903
0
  case R_ARM_PREL31:
10904
0
    value -= (input_section->output_section->vma
10905
0
        + input_section->output_offset + rel->r_offset);
10906
0
    value += signed_addend;
10907
0
    if (! h || h->root.type != bfd_link_hash_undefweak)
10908
0
      {
10909
        /* Check for overflow.  */
10910
0
        if ((value ^ (value >> 1)) & (1 << 30))
10911
0
    return bfd_reloc_overflow;
10912
0
      }
10913
0
    value &= 0x7fffffff;
10914
0
    value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
10915
0
    if (branch_type == ST_BRANCH_TO_THUMB)
10916
0
      value |= 1;
10917
0
    break;
10918
0
  }
10919
10920
0
      bfd_put_32 (input_bfd, value, hit_data);
10921
0
      return bfd_reloc_ok;
10922
10923
0
    case R_ARM_ABS8:
10924
0
      value += addend;
10925
10926
      /* There is no way to tell whether the user intended to use a signed or
10927
   unsigned addend.  When checking for overflow we accept either,
10928
   as specified by the AAELF.  */
10929
0
      if ((long) value > 0xff || (long) value < -0x80)
10930
0
  return bfd_reloc_overflow;
10931
10932
0
      bfd_put_8 (input_bfd, value, hit_data);
10933
0
      return bfd_reloc_ok;
10934
10935
0
    case R_ARM_ABS16:
10936
0
      value += addend;
10937
10938
      /* See comment for R_ARM_ABS8.  */
10939
0
      if ((long) value > 0xffff || (long) value < -0x8000)
10940
0
  return bfd_reloc_overflow;
10941
10942
0
      bfd_put_16 (input_bfd, value, hit_data);
10943
0
      return bfd_reloc_ok;
10944
10945
0
    case R_ARM_THM_ABS5:
10946
      /* Support ldr and str instructions for the thumb.  */
10947
0
      if (globals->use_rel)
10948
0
  {
10949
    /* Need to refetch addend.  */
10950
0
    addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
10951
    /* ??? Need to determine shift amount from operand size.  */
10952
0
    addend >>= howto->rightshift;
10953
0
  }
10954
0
      value += addend;
10955
10956
      /* ??? Isn't value unsigned?  */
10957
0
      if ((long) value > 0x1f || (long) value < -0x10)
10958
0
  return bfd_reloc_overflow;
10959
10960
      /* ??? Value needs to be properly shifted into place first.  */
10961
0
      value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
10962
0
      bfd_put_16 (input_bfd, value, hit_data);
10963
0
      return bfd_reloc_ok;
10964
10965
0
    case R_ARM_THM_ALU_PREL_11_0:
10966
      /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw).  */
10967
0
      {
10968
0
  bfd_vma insn;
10969
0
  bfd_signed_vma relocation;
10970
10971
0
  insn = (bfd_get_16 (input_bfd, hit_data) << 16)
10972
0
       | bfd_get_16 (input_bfd, hit_data + 2);
10973
10974
0
  if (globals->use_rel)
10975
0
    {
10976
0
      signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
10977
0
        | ((insn & (1 << 26)) >> 15);
10978
0
      if (insn & 0xf00000)
10979
0
        signed_addend = -signed_addend;
10980
0
    }
10981
10982
0
  relocation = value + signed_addend;
10983
0
  relocation -= Pa (input_section->output_section->vma
10984
0
        + input_section->output_offset
10985
0
        + rel->r_offset);
10986
10987
  /* PR 21523: Use an absolute value.  The user of this reloc will
10988
     have already selected an ADD or SUB insn appropriately.  */
10989
0
  value = llabs (relocation);
10990
10991
0
  if (value >= 0x1000)
10992
0
    return bfd_reloc_overflow;
10993
10994
  /* Destination is Thumb.  Force bit 0 to 1 to reflect this.  */
10995
0
  if (branch_type == ST_BRANCH_TO_THUMB)
10996
0
    value |= 1;
10997
10998
0
  insn = (insn & 0xfb0f8f00) | (value & 0xff)
10999
0
       | ((value & 0x700) << 4)
11000
0
       | ((value & 0x800) << 15);
11001
0
  if (relocation < 0)
11002
0
    insn |= 0xa00000;
11003
11004
0
  bfd_put_16 (input_bfd, insn >> 16, hit_data);
11005
0
  bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
11006
11007
0
  return bfd_reloc_ok;
11008
0
      }
11009
11010
0
    case R_ARM_THM_PC8:
11011
      /* PR 10073:  This reloc is not generated by the GNU toolchain,
11012
   but it is supported for compatibility with third party libraries
11013
   generated by other compilers, specifically the ARM/IAR.  */
11014
0
      {
11015
0
  bfd_vma insn;
11016
0
  bfd_signed_vma relocation;
11017
11018
0
  insn = bfd_get_16 (input_bfd, hit_data);
11019
11020
0
  if (globals->use_rel)
11021
0
    addend = ((((insn & 0x00ff) << 2) + 4) & 0x3ff) -4;
11022
11023
0
  relocation = value + addend;
11024
0
  relocation -= Pa (input_section->output_section->vma
11025
0
        + input_section->output_offset
11026
0
        + rel->r_offset);
11027
11028
0
  value = relocation;
11029
11030
  /* We do not check for overflow of this reloc.  Although strictly
11031
     speaking this is incorrect, it appears to be necessary in order
11032
     to work with IAR generated relocs.  Since GCC and GAS do not
11033
     generate R_ARM_THM_PC8 relocs, the lack of a check should not be
11034
     a problem for them.  */
11035
0
  value &= 0x3fc;
11036
11037
0
  insn = (insn & 0xff00) | (value >> 2);
11038
11039
0
  bfd_put_16 (input_bfd, insn, hit_data);
11040
11041
0
  return bfd_reloc_ok;
11042
0
      }
11043
11044
0
    case R_ARM_THM_PC12:
11045
      /* Corresponds to: ldr.w reg, [pc, #offset].  */
11046
0
      {
11047
0
  bfd_vma insn;
11048
0
  bfd_signed_vma relocation;
11049
11050
0
  insn = (bfd_get_16 (input_bfd, hit_data) << 16)
11051
0
       | bfd_get_16 (input_bfd, hit_data + 2);
11052
11053
0
  if (globals->use_rel)
11054
0
    {
11055
0
      signed_addend = insn & 0xfff;
11056
0
      if (!(insn & (1 << 23)))
11057
0
        signed_addend = -signed_addend;
11058
0
    }
11059
11060
0
  relocation = value + signed_addend;
11061
0
  relocation -= Pa (input_section->output_section->vma
11062
0
        + input_section->output_offset
11063
0
        + rel->r_offset);
11064
11065
0
  value = relocation;
11066
11067
0
  if (value >= 0x1000)
11068
0
    return bfd_reloc_overflow;
11069
11070
0
  insn = (insn & 0xff7ff000) | value;
11071
0
  if (relocation >= 0)
11072
0
    insn |= (1 << 23);
11073
11074
0
  bfd_put_16 (input_bfd, insn >> 16, hit_data);
11075
0
  bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
11076
11077
0
  return bfd_reloc_ok;
11078
0
      }
11079
11080
0
    case R_ARM_THM_XPC22:
11081
0
    case R_ARM_THM_CALL:
11082
0
    case R_ARM_THM_JUMP24:
11083
      /* Thumb BL (branch long instruction).  */
11084
0
      {
11085
0
  bfd_vma relocation;
11086
0
  bfd_vma reloc_sign;
11087
0
  bool overflow = false;
11088
0
  bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
11089
0
  bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
11090
0
  bfd_signed_vma reloc_signed_max;
11091
0
  bfd_signed_vma reloc_signed_min;
11092
0
  bfd_vma check;
11093
0
  bfd_signed_vma signed_check;
11094
0
  int bitsize;
11095
0
  const int thumb2 = using_thumb2 (globals);
11096
0
  const int thumb2_bl = using_thumb2_bl (globals);
11097
11098
  /* A branch to an undefined weak symbol is turned into a jump to
11099
     the next instruction unless a PLT entry will be created.
11100
     The jump to the next instruction is optimized as a NOP.W for
11101
     Thumb-2 enabled architectures.  */
11102
0
  if (h && h->root.type == bfd_link_hash_undefweak
11103
0
      && plt_offset == (bfd_vma) -1)
11104
0
    {
11105
0
      if (thumb2)
11106
0
        {
11107
0
    bfd_put_16 (input_bfd, 0xf3af, hit_data);
11108
0
    bfd_put_16 (input_bfd, 0x8000, hit_data + 2);
11109
0
        }
11110
0
      else
11111
0
        {
11112
0
    bfd_put_16 (input_bfd, 0xe000, hit_data);
11113
0
    bfd_put_16 (input_bfd, 0xbf00, hit_data + 2);
11114
0
        }
11115
0
      return bfd_reloc_ok;
11116
0
    }
11117
11118
  /* Fetch the addend.  We use the Thumb-2 encoding (backwards compatible
11119
     with Thumb-1) involving the J1 and J2 bits.  */
11120
0
  if (globals->use_rel)
11121
0
    {
11122
0
      bfd_vma s = (upper_insn & (1 << 10)) >> 10;
11123
0
      bfd_vma upper = upper_insn & 0x3ff;
11124
0
      bfd_vma lower = lower_insn & 0x7ff;
11125
0
      bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
11126
0
      bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
11127
0
      bfd_vma i1 = j1 ^ s ? 0 : 1;
11128
0
      bfd_vma i2 = j2 ^ s ? 0 : 1;
11129
11130
0
      addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
11131
      /* Sign extend.  */
11132
0
      addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
11133
11134
0
      signed_addend = addend;
11135
0
    }
11136
11137
0
  if (r_type == R_ARM_THM_XPC22)
11138
0
    {
11139
      /* Check for Thumb to Thumb call.  */
11140
      /* FIXME: Should we translate the instruction into a BL
11141
         instruction instead ?  */
11142
0
      if (branch_type == ST_BRANCH_TO_THUMB)
11143
0
        _bfd_error_handler
11144
0
    (_("%pB: warning: %s BLX instruction targets"
11145
0
       " %s function '%s'"),
11146
0
     input_bfd, "Thumb",
11147
0
     "Thumb", h ? h->root.root.string : "(local)");
11148
0
    }
11149
0
  else
11150
0
    {
11151
      /* If it is not a call to Thumb, assume call to Arm.
11152
         If it is a call relative to a section name, then it is not a
11153
         function call at all, but rather a long jump.  Calls through
11154
         the PLT do not require stubs.  */
11155
0
      if (branch_type == ST_BRANCH_TO_ARM && plt_offset == (bfd_vma) -1)
11156
0
        {
11157
0
    if (globals->use_blx && r_type == R_ARM_THM_CALL)
11158
0
      {
11159
        /* Convert BL to BLX.  */
11160
0
        lower_insn = (lower_insn & ~0x1000) | 0x0800;
11161
0
      }
11162
0
    else if ((   r_type != R_ARM_THM_CALL)
11163
0
       && (r_type != R_ARM_THM_JUMP24))
11164
0
      {
11165
0
        if (elf32_thumb_to_arm_stub
11166
0
      (info, sym_name, input_bfd, output_bfd, input_section,
11167
0
       hit_data, sym_sec, rel->r_offset, signed_addend, value,
11168
0
       error_message))
11169
0
          return bfd_reloc_ok;
11170
0
        else
11171
0
          return bfd_reloc_dangerous;
11172
0
      }
11173
0
        }
11174
0
      else if (branch_type == ST_BRANCH_TO_THUMB
11175
0
         && globals->use_blx
11176
0
         && r_type == R_ARM_THM_CALL)
11177
0
        {
11178
    /* Make sure this is a BL.  */
11179
0
    lower_insn |= 0x1800;
11180
0
        }
11181
0
    }
11182
11183
0
  enum elf32_arm_stub_type stub_type = arm_stub_none;
11184
0
  if (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24)
11185
0
    {
11186
      /* Check if a stub has to be inserted because the destination
11187
         is too far.  */
11188
0
      struct elf32_arm_stub_hash_entry *stub_entry;
11189
0
      struct elf32_arm_link_hash_entry *hash;
11190
11191
0
      hash = (struct elf32_arm_link_hash_entry *) h;
11192
11193
0
      stub_type = arm_type_of_stub (info, input_section, rel,
11194
0
            st_type, &branch_type,
11195
0
            hash, value, sym_sec,
11196
0
            input_bfd, sym_name);
11197
11198
0
      if (stub_type != arm_stub_none)
11199
0
        {
11200
    /* The target is out of reach or we are changing modes, so
11201
       redirect the branch to the local stub for this
11202
       function.  */
11203
0
    stub_entry = elf32_arm_get_stub_entry (input_section,
11204
0
                   sym_sec, h,
11205
0
                   rel, globals,
11206
0
                   stub_type);
11207
0
    if (stub_entry != NULL)
11208
0
      {
11209
0
        value = (stub_entry->stub_offset
11210
0
           + stub_entry->stub_sec->output_offset
11211
0
           + stub_entry->stub_sec->output_section->vma);
11212
11213
0
        if (plt_offset != (bfd_vma) -1)
11214
0
          *unresolved_reloc_p = false;
11215
0
      }
11216
11217
    /* If this call becomes a call to Arm, force BLX.  */
11218
0
    if (globals->use_blx && (r_type == R_ARM_THM_CALL))
11219
0
      {
11220
0
        if ((stub_entry
11221
0
       && !arm_stub_is_thumb (stub_entry->stub_type))
11222
0
      || branch_type != ST_BRANCH_TO_THUMB)
11223
0
          lower_insn = (lower_insn & ~0x1000) | 0x0800;
11224
0
      }
11225
0
        }
11226
0
    }
11227
11228
  /* Handle calls via the PLT.  */
11229
0
  if (stub_type == arm_stub_none && plt_offset != (bfd_vma) -1)
11230
0
    {
11231
0
      value = (splt->output_section->vma
11232
0
         + splt->output_offset
11233
0
         + plt_offset);
11234
11235
0
      if (globals->use_blx
11236
0
    && r_type == R_ARM_THM_CALL
11237
0
    && ! using_thumb_only (globals))
11238
0
        {
11239
    /* If the Thumb BLX instruction is available, convert
11240
       the BL to a BLX instruction to call the ARM-mode
11241
       PLT entry.  */
11242
0
    lower_insn = (lower_insn & ~0x1000) | 0x0800;
11243
0
    branch_type = ST_BRANCH_TO_ARM;
11244
0
        }
11245
0
      else
11246
0
        {
11247
0
    if (! using_thumb_only (globals))
11248
      /* Target the Thumb stub before the ARM PLT entry.  */
11249
0
      value -= PLT_THUMB_STUB_SIZE;
11250
0
    branch_type = ST_BRANCH_TO_THUMB;
11251
0
        }
11252
0
      *unresolved_reloc_p = false;
11253
0
    }
11254
11255
0
  relocation = value + signed_addend;
11256
11257
0
  relocation -= (input_section->output_section->vma
11258
0
           + input_section->output_offset
11259
0
           + rel->r_offset);
11260
11261
0
  check = relocation >> howto->rightshift;
11262
11263
  /* If this is a signed value, the rightshift just dropped
11264
     leading 1 bits (assuming twos complement).  */
11265
0
  if ((bfd_signed_vma) relocation >= 0)
11266
0
    signed_check = check;
11267
0
  else
11268
0
    signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
11269
11270
  /* Calculate the permissable maximum and minimum values for
11271
     this relocation according to whether we're relocating for
11272
     Thumb-2 or not.  */
11273
0
  bitsize = howto->bitsize;
11274
0
  if (!thumb2_bl)
11275
0
    bitsize -= 2;
11276
0
  reloc_signed_max = (1 << (bitsize - 1)) - 1;
11277
0
  reloc_signed_min = ~reloc_signed_max;
11278
11279
  /* Assumes two's complement.  */
11280
0
  if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
11281
0
    overflow = true;
11282
11283
0
  if ((lower_insn & 0x5000) == 0x4000)
11284
    /* For a BLX instruction, make sure that the relocation is rounded up
11285
       to a word boundary.  This follows the semantics of the instruction
11286
       which specifies that bit 1 of the target address will come from bit
11287
       1 of the base address.  */
11288
0
    relocation = (relocation + 2) & ~ 3;
11289
11290
  /* Put RELOCATION back into the insn.  Assumes two's complement.
11291
     We use the Thumb-2 encoding, which is safe even if dealing with
11292
     a Thumb-1 instruction by virtue of our overflow check above.  */
11293
0
  reloc_sign = (signed_check < 0) ? 1 : 0;
11294
0
  upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
11295
0
         | ((relocation >> 12) & 0x3ff)
11296
0
         | (reloc_sign << 10);
11297
0
  lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
11298
0
         | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
11299
0
         | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
11300
0
         | ((relocation >> 1) & 0x7ff);
11301
11302
  /* Put the relocated value back in the object file:  */
11303
0
  bfd_put_16 (input_bfd, upper_insn, hit_data);
11304
0
  bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
11305
11306
0
  return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
11307
0
      }
11308
0
      break;
11309
11310
0
    case R_ARM_THM_JUMP19:
11311
      /* Thumb32 conditional branch instruction.  */
11312
0
      {
11313
0
  bfd_vma relocation;
11314
0
  bool overflow = false;
11315
0
  bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
11316
0
  bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
11317
0
  bfd_signed_vma reloc_signed_max = 0xffffe;
11318
0
  bfd_signed_vma reloc_signed_min = -0x100000;
11319
0
  bfd_signed_vma signed_check;
11320
0
  enum elf32_arm_stub_type stub_type = arm_stub_none;
11321
0
  struct elf32_arm_stub_hash_entry *stub_entry;
11322
0
  struct elf32_arm_link_hash_entry *hash;
11323
11324
  /* Need to refetch the addend, reconstruct the top three bits,
11325
     and squish the two 11 bit pieces together.  */
11326
0
  if (globals->use_rel)
11327
0
    {
11328
0
      bfd_vma S     = (upper_insn & 0x0400) >> 10;
11329
0
      bfd_vma upper = (upper_insn & 0x003f);
11330
0
      bfd_vma J1    = (lower_insn & 0x2000) >> 13;
11331
0
      bfd_vma J2    = (lower_insn & 0x0800) >> 11;
11332
0
      bfd_vma lower = (lower_insn & 0x07ff);
11333
11334
0
      upper |= J1 << 6;
11335
0
      upper |= J2 << 7;
11336
0
      upper |= (!S) << 8;
11337
0
      upper -= 0x0100; /* Sign extend.  */
11338
11339
0
      addend = (upper << 12) | (lower << 1);
11340
0
      signed_addend = addend;
11341
0
    }
11342
11343
  /* Handle calls via the PLT.  */
11344
0
  if (plt_offset != (bfd_vma) -1)
11345
0
    {
11346
0
      value = (splt->output_section->vma
11347
0
         + splt->output_offset
11348
0
         + plt_offset);
11349
      /* Target the Thumb stub before the ARM PLT entry.  */
11350
0
      value -= PLT_THUMB_STUB_SIZE;
11351
0
      *unresolved_reloc_p = false;
11352
0
    }
11353
11354
0
  hash = (struct elf32_arm_link_hash_entry *)h;
11355
11356
0
  stub_type = arm_type_of_stub (info, input_section, rel,
11357
0
              st_type, &branch_type,
11358
0
              hash, value, sym_sec,
11359
0
              input_bfd, sym_name);
11360
0
  if (stub_type != arm_stub_none)
11361
0
    {
11362
0
      stub_entry = elf32_arm_get_stub_entry (input_section,
11363
0
               sym_sec, h,
11364
0
               rel, globals,
11365
0
               stub_type);
11366
0
      if (stub_entry != NULL)
11367
0
        {
11368
0
    value = (stub_entry->stub_offset
11369
0
      + stub_entry->stub_sec->output_offset
11370
0
      + stub_entry->stub_sec->output_section->vma);
11371
0
        }
11372
0
    }
11373
11374
0
  relocation = value + signed_addend;
11375
0
  relocation -= (input_section->output_section->vma
11376
0
           + input_section->output_offset
11377
0
           + rel->r_offset);
11378
0
  signed_check = (bfd_signed_vma) relocation;
11379
11380
0
  if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
11381
0
    overflow = true;
11382
11383
  /* Put RELOCATION back into the insn.  */
11384
0
  {
11385
0
    bfd_vma S  = (relocation & 0x00100000) >> 20;
11386
0
    bfd_vma J2 = (relocation & 0x00080000) >> 19;
11387
0
    bfd_vma J1 = (relocation & 0x00040000) >> 18;
11388
0
    bfd_vma hi = (relocation & 0x0003f000) >> 12;
11389
0
    bfd_vma lo = (relocation & 0x00000ffe) >>  1;
11390
11391
0
    upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
11392
0
    lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
11393
0
  }
11394
11395
  /* Put the relocated value back in the object file:  */
11396
0
  bfd_put_16 (input_bfd, upper_insn, hit_data);
11397
0
  bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
11398
11399
0
  return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
11400
0
      }
11401
11402
0
    case R_ARM_THM_JUMP11:
11403
0
    case R_ARM_THM_JUMP8:
11404
0
    case R_ARM_THM_JUMP6:
11405
      /* Thumb B (branch) instruction).  */
11406
0
      {
11407
0
  bfd_signed_vma relocation;
11408
0
  bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
11409
0
  bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
11410
0
  bfd_signed_vma signed_check;
11411
11412
  /* CZB cannot jump backward.  */
11413
0
  if (r_type == R_ARM_THM_JUMP6)
11414
0
    {
11415
0
      reloc_signed_min = 0;
11416
0
      if (globals->use_rel)
11417
0
        signed_addend = ((addend & 0x200) >> 3) | ((addend & 0xf8) >> 2);
11418
0
    }
11419
11420
0
  relocation = value + signed_addend;
11421
11422
0
  relocation -= (input_section->output_section->vma
11423
0
           + input_section->output_offset
11424
0
           + rel->r_offset);
11425
11426
0
  relocation >>= howto->rightshift;
11427
0
  signed_check = relocation;
11428
11429
0
  if (r_type == R_ARM_THM_JUMP6)
11430
0
    relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
11431
0
  else
11432
0
    relocation &= howto->dst_mask;
11433
0
  relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
11434
11435
0
  bfd_put_16 (input_bfd, relocation, hit_data);
11436
11437
  /* Assumes two's complement.  */
11438
0
  if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
11439
0
    return bfd_reloc_overflow;
11440
11441
0
  return bfd_reloc_ok;
11442
0
      }
11443
11444
0
    case R_ARM_ALU_PCREL7_0:
11445
0
    case R_ARM_ALU_PCREL15_8:
11446
0
    case R_ARM_ALU_PCREL23_15:
11447
0
      {
11448
0
  bfd_vma insn;
11449
0
  bfd_vma relocation;
11450
11451
0
  insn = bfd_get_32 (input_bfd, hit_data);
11452
0
  if (globals->use_rel)
11453
0
    {
11454
      /* Extract the addend.  */
11455
0
      addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
11456
0
      signed_addend = addend;
11457
0
    }
11458
0
  relocation = value + signed_addend;
11459
11460
0
  relocation -= (input_section->output_section->vma
11461
0
           + input_section->output_offset
11462
0
           + rel->r_offset);
11463
0
  insn = (insn & ~0xfff)
11464
0
         | ((howto->bitpos << 7) & 0xf00)
11465
0
         | ((relocation >> howto->bitpos) & 0xff);
11466
0
  bfd_put_32 (input_bfd, value, hit_data);
11467
0
      }
11468
0
      return bfd_reloc_ok;
11469
11470
0
    case R_ARM_GNU_VTINHERIT:
11471
0
    case R_ARM_GNU_VTENTRY:
11472
0
      return bfd_reloc_ok;
11473
11474
0
    case R_ARM_GOTOFF32:
11475
      /* Relocation is relative to the start of the
11476
   global offset table.  */
11477
11478
0
      BFD_ASSERT (sgot != NULL);
11479
0
      if (sgot == NULL)
11480
0
  return bfd_reloc_notsupported;
11481
11482
      /* If we are addressing a Thumb function, we need to adjust the
11483
   address by one, so that attempts to call the function pointer will
11484
   correctly interpret it as Thumb code.  */
11485
0
      if (branch_type == ST_BRANCH_TO_THUMB)
11486
0
  value += 1;
11487
11488
      /* Note that sgot->output_offset is not involved in this
11489
   calculation.  We always want the start of .got.  If we
11490
   define _GLOBAL_OFFSET_TABLE in a different way, as is
11491
   permitted by the ABI, we might have to change this
11492
   calculation.  */
11493
0
      value -= sgot->output_section->vma;
11494
0
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
11495
0
               contents, rel->r_offset, value,
11496
0
               rel->r_addend);
11497
11498
0
    case R_ARM_GOTPC:
11499
      /* Use global offset table as symbol value.  */
11500
0
      BFD_ASSERT (sgot != NULL);
11501
11502
0
      if (sgot == NULL)
11503
0
  return bfd_reloc_notsupported;
11504
11505
0
      *unresolved_reloc_p = false;
11506
0
      value = sgot->output_section->vma;
11507
0
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
11508
0
               contents, rel->r_offset, value,
11509
0
               rel->r_addend);
11510
11511
0
    case R_ARM_GOT32:
11512
0
    case R_ARM_GOT_PREL:
11513
      /* Relocation is to the entry for this symbol in the
11514
   global offset table.  */
11515
0
      if (sgot == NULL)
11516
0
  return bfd_reloc_notsupported;
11517
11518
0
      if (dynreloc_st_type == STT_GNU_IFUNC
11519
0
    && plt_offset != (bfd_vma) -1
11520
0
    && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, h)))
11521
0
  {
11522
    /* We have a relocation against a locally-binding STT_GNU_IFUNC
11523
       symbol, and the relocation resolves directly to the runtime
11524
       target rather than to the .iplt entry.  This means that any
11525
       .got entry would be the same value as the .igot.plt entry,
11526
       so there's no point creating both.  */
11527
0
    sgot = globals->root.igotplt;
11528
0
    value = sgot->output_offset + gotplt_offset;
11529
0
  }
11530
0
      else if (h != NULL)
11531
0
  {
11532
0
    bfd_vma off;
11533
11534
0
    off = h->got.offset;
11535
0
    BFD_ASSERT (off != (bfd_vma) -1);
11536
0
    if ((off & 1) != 0)
11537
0
      {
11538
        /* We have already processsed one GOT relocation against
11539
     this symbol.  */
11540
0
        off &= ~1;
11541
0
        if (globals->root.dynamic_sections_created
11542
0
      && !SYMBOL_REFERENCES_LOCAL (info, h))
11543
0
    *unresolved_reloc_p = false;
11544
0
      }
11545
0
    else
11546
0
      {
11547
0
        Elf_Internal_Rela outrel;
11548
0
        int isrofixup = 0;
11549
11550
0
        if (((h->dynindx != -1) || globals->fdpic_p)
11551
0
      && !SYMBOL_REFERENCES_LOCAL (info, h))
11552
0
    {
11553
      /* If the symbol doesn't resolve locally in a static
11554
         object, we have an undefined reference.  If the
11555
         symbol doesn't resolve locally in a dynamic object,
11556
         it should be resolved by the dynamic linker.  */
11557
0
      if (globals->root.dynamic_sections_created)
11558
0
        {
11559
0
          outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
11560
0
          *unresolved_reloc_p = false;
11561
0
        }
11562
0
      else
11563
0
        outrel.r_info = 0;
11564
0
      outrel.r_addend = 0;
11565
0
    }
11566
0
        else
11567
0
    {
11568
0
      if (dynreloc_st_type == STT_GNU_IFUNC)
11569
0
        outrel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
11570
0
      else if (bfd_link_pic (info)
11571
0
         && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
11572
0
        outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
11573
0
      else
11574
0
        {
11575
0
          outrel.r_info = 0;
11576
0
          if (globals->fdpic_p)
11577
0
      isrofixup = 1;
11578
0
        }
11579
0
      outrel.r_addend = dynreloc_value;
11580
0
    }
11581
11582
        /* The GOT entry is initialized to zero by default.
11583
     See if we should install a different value.  */
11584
0
        if (outrel.r_addend != 0
11585
0
      && (globals->use_rel || outrel.r_info == 0))
11586
0
    {
11587
0
      bfd_put_32 (output_bfd, outrel.r_addend,
11588
0
            sgot->contents + off);
11589
0
      outrel.r_addend = 0;
11590
0
    }
11591
11592
0
        if (isrofixup)
11593
0
    arm_elf_add_rofixup (output_bfd,
11594
0
             elf32_arm_hash_table (info)->srofixup,
11595
0
             sgot->output_section->vma
11596
0
             + sgot->output_offset + off);
11597
11598
0
        else if (outrel.r_info != 0)
11599
0
    {
11600
0
      outrel.r_offset = (sgot->output_section->vma
11601
0
             + sgot->output_offset
11602
0
             + off);
11603
0
      elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11604
0
    }
11605
11606
0
        h->got.offset |= 1;
11607
0
      }
11608
0
    value = sgot->output_offset + off;
11609
0
  }
11610
0
      else
11611
0
  {
11612
0
    bfd_vma off;
11613
11614
0
    BFD_ASSERT (local_got_offsets != NULL
11615
0
          && local_got_offsets[r_symndx] != (bfd_vma) -1);
11616
11617
0
    off = local_got_offsets[r_symndx];
11618
11619
    /* The offset must always be a multiple of 4.  We use the
11620
       least significant bit to record whether we have already
11621
       generated the necessary reloc.  */
11622
0
    if ((off & 1) != 0)
11623
0
      off &= ~1;
11624
0
    else
11625
0
      {
11626
0
        Elf_Internal_Rela outrel;
11627
0
        int isrofixup = 0;
11628
11629
0
        if (dynreloc_st_type == STT_GNU_IFUNC)
11630
0
    outrel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
11631
0
        else if (bfd_link_pic (info))
11632
0
    outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
11633
0
        else
11634
0
    {
11635
0
      outrel.r_info = 0;
11636
0
      if (globals->fdpic_p)
11637
0
        isrofixup = 1;
11638
0
    }
11639
11640
        /* The GOT entry is initialized to zero by default.
11641
     See if we should install a different value.  */
11642
0
        if (globals->use_rel || outrel.r_info == 0)
11643
0
    bfd_put_32 (output_bfd, dynreloc_value, sgot->contents + off);
11644
11645
0
        if (isrofixup)
11646
0
    arm_elf_add_rofixup (output_bfd,
11647
0
             globals->srofixup,
11648
0
             sgot->output_section->vma
11649
0
             + sgot->output_offset + off);
11650
11651
0
        else if (outrel.r_info != 0)
11652
0
    {
11653
0
      outrel.r_addend = addend + dynreloc_value;
11654
0
      outrel.r_offset = (sgot->output_section->vma
11655
0
             + sgot->output_offset
11656
0
             + off);
11657
0
      elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11658
0
    }
11659
11660
0
        local_got_offsets[r_symndx] |= 1;
11661
0
      }
11662
11663
0
    value = sgot->output_offset + off;
11664
0
  }
11665
0
      if (r_type != R_ARM_GOT32)
11666
0
  value += sgot->output_section->vma;
11667
11668
0
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
11669
0
               contents, rel->r_offset, value,
11670
0
               rel->r_addend);
11671
11672
0
    case R_ARM_TLS_LDO32:
11673
0
      value = value - dtpoff_base (info);
11674
11675
0
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
11676
0
               contents, rel->r_offset, value,
11677
0
               rel->r_addend);
11678
11679
0
    case R_ARM_TLS_LDM32:
11680
0
    case R_ARM_TLS_LDM32_FDPIC:
11681
0
      {
11682
0
  bfd_vma off;
11683
11684
0
  if (sgot == NULL)
11685
0
    abort ();
11686
11687
0
  off = globals->tls_ldm_got.offset;
11688
11689
0
  if ((off & 1) != 0)
11690
0
    off &= ~1;
11691
0
  else
11692
0
    {
11693
      /* If we don't know the module number, create a relocation
11694
         for it.  */
11695
0
      if (bfd_link_dll (info))
11696
0
        {
11697
0
    Elf_Internal_Rela outrel;
11698
11699
0
    if (srelgot == NULL)
11700
0
      abort ();
11701
11702
0
    outrel.r_addend = 0;
11703
0
    outrel.r_offset = (sgot->output_section->vma
11704
0
           + sgot->output_offset + off);
11705
0
    outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
11706
11707
0
    if (globals->use_rel)
11708
0
      bfd_put_32 (output_bfd, outrel.r_addend,
11709
0
            sgot->contents + off);
11710
11711
0
    elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11712
0
        }
11713
0
      else
11714
0
        bfd_put_32 (output_bfd, 1, sgot->contents + off);
11715
11716
0
      globals->tls_ldm_got.offset |= 1;
11717
0
    }
11718
11719
0
  if (r_type == R_ARM_TLS_LDM32_FDPIC)
11720
0
    {
11721
0
      bfd_put_32 (output_bfd,
11722
0
      globals->root.sgot->output_offset + off,
11723
0
      contents + rel->r_offset);
11724
11725
0
      return bfd_reloc_ok;
11726
0
    }
11727
0
  else
11728
0
    {
11729
0
      value = sgot->output_section->vma + sgot->output_offset + off
11730
0
        - (input_section->output_section->vma
11731
0
     + input_section->output_offset + rel->r_offset);
11732
11733
0
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
11734
0
               contents, rel->r_offset, value,
11735
0
               rel->r_addend);
11736
0
    }
11737
0
      }
11738
11739
0
    case R_ARM_TLS_CALL:
11740
0
    case R_ARM_THM_TLS_CALL:
11741
0
    case R_ARM_TLS_GD32:
11742
0
    case R_ARM_TLS_GD32_FDPIC:
11743
0
    case R_ARM_TLS_IE32:
11744
0
    case R_ARM_TLS_IE32_FDPIC:
11745
0
    case R_ARM_TLS_GOTDESC:
11746
0
    case R_ARM_TLS_DESCSEQ:
11747
0
    case R_ARM_THM_TLS_DESCSEQ:
11748
0
      {
11749
0
  bfd_vma off, offplt;
11750
0
  int indx = 0;
11751
0
  char tls_type;
11752
11753
0
  BFD_ASSERT (sgot != NULL);
11754
11755
0
  if (h != NULL)
11756
0
    {
11757
0
      bool dyn;
11758
0
      dyn = globals->root.dynamic_sections_created;
11759
0
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
11760
0
             bfd_link_pic (info),
11761
0
             h)
11762
0
    && (!bfd_link_pic (info)
11763
0
        || !SYMBOL_REFERENCES_LOCAL (info, h)))
11764
0
        {
11765
0
    *unresolved_reloc_p = false;
11766
0
    indx = h->dynindx;
11767
0
        }
11768
0
      off = h->got.offset;
11769
0
      offplt = elf32_arm_hash_entry (h)->tlsdesc_got;
11770
0
      tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
11771
0
    }
11772
0
  else
11773
0
    {
11774
0
      BFD_ASSERT (local_got_offsets != NULL);
11775
11776
0
      if (r_symndx >= elf32_arm_num_entries (input_bfd))
11777
0
        {
11778
0
    _bfd_error_handler (_("\
11779
0
%pB: expected symbol index in range 0..%lu but found local symbol with index %lu"),
11780
0
            input_bfd,
11781
0
            (unsigned long) elf32_arm_num_entries (input_bfd),
11782
0
            r_symndx);
11783
0
    return false;
11784
0
        }
11785
0
      off = local_got_offsets[r_symndx];
11786
0
      offplt = local_tlsdesc_gotents[r_symndx];
11787
0
      tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
11788
0
    }
11789
11790
  /* Linker relaxations happens from one of the
11791
     R_ARM_{GOTDESC,CALL,DESCSEQ} relocations to IE or LE.  */
11792
0
  if (ELF32_R_TYPE (rel->r_info) != r_type)
11793
0
    tls_type = GOT_TLS_IE;
11794
11795
0
  BFD_ASSERT (tls_type != GOT_UNKNOWN);
11796
11797
0
  if ((off & 1) != 0)
11798
0
    off &= ~1;
11799
0
  else
11800
0
    {
11801
0
      bool need_relocs = false;
11802
0
      Elf_Internal_Rela outrel;
11803
0
      int cur_off = off;
11804
11805
      /* The GOT entries have not been initialized yet.  Do it
11806
         now, and emit any relocations.  If both an IE GOT and a
11807
         GD GOT are necessary, we emit the GD first.  */
11808
11809
0
      if ((bfd_link_dll (info) || indx != 0)
11810
0
    && (h == NULL
11811
0
        || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
11812
0
      && !resolved_to_zero)
11813
0
        || h->root.type != bfd_link_hash_undefweak))
11814
0
        {
11815
0
    need_relocs = true;
11816
0
    BFD_ASSERT (srelgot != NULL);
11817
0
        }
11818
11819
0
      if (tls_type & GOT_TLS_GDESC)
11820
0
        {
11821
0
    bfd_byte *loc;
11822
11823
    /* We should have relaxed, unless this is an undefined
11824
       weak symbol.  */
11825
0
    BFD_ASSERT ((h && (h->root.type == bfd_link_hash_undefweak))
11826
0
          || bfd_link_dll (info));
11827
0
    BFD_ASSERT (globals->sgotplt_jump_table_size + offplt + 8
11828
0
          <= globals->root.sgotplt->size);
11829
11830
0
    outrel.r_addend = 0;
11831
0
    outrel.r_offset = (globals->root.sgotplt->output_section->vma
11832
0
           + globals->root.sgotplt->output_offset
11833
0
           + offplt
11834
0
           + globals->sgotplt_jump_table_size);
11835
11836
0
    outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DESC);
11837
0
    sreloc = globals->root.srelplt;
11838
0
    loc = sreloc->contents;
11839
0
    loc += globals->next_tls_desc_index++ * RELOC_SIZE (globals);
11840
0
    BFD_ASSERT (loc + RELOC_SIZE (globals)
11841
0
         <= sreloc->contents + sreloc->size);
11842
11843
0
    SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
11844
11845
    /* For globals, the first word in the relocation gets
11846
       the relocation index and the top bit set, or zero,
11847
       if we're binding now.  For locals, it gets the
11848
       symbol's offset in the tls section.  */
11849
0
    bfd_put_32 (output_bfd,
11850
0
          !h ? value - elf_hash_table (info)->tls_sec->vma
11851
0
          : info->flags & DF_BIND_NOW ? 0
11852
0
          : 0x80000000 | ELF32_R_SYM (outrel.r_info),
11853
0
          globals->root.sgotplt->contents + offplt
11854
0
          + globals->sgotplt_jump_table_size);
11855
11856
    /* Second word in the relocation is always zero.  */
11857
0
    bfd_put_32 (output_bfd, 0,
11858
0
          globals->root.sgotplt->contents + offplt
11859
0
          + globals->sgotplt_jump_table_size + 4);
11860
0
        }
11861
0
      if (tls_type & GOT_TLS_GD)
11862
0
        {
11863
0
    if (need_relocs)
11864
0
      {
11865
0
        outrel.r_addend = 0;
11866
0
        outrel.r_offset = (sgot->output_section->vma
11867
0
               + sgot->output_offset
11868
0
               + cur_off);
11869
0
        outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
11870
11871
0
        if (globals->use_rel)
11872
0
          bfd_put_32 (output_bfd, outrel.r_addend,
11873
0
          sgot->contents + cur_off);
11874
11875
0
        elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11876
11877
0
        if (indx == 0)
11878
0
          bfd_put_32 (output_bfd, value - dtpoff_base (info),
11879
0
          sgot->contents + cur_off + 4);
11880
0
        else
11881
0
          {
11882
0
      outrel.r_addend = 0;
11883
0
      outrel.r_info = ELF32_R_INFO (indx,
11884
0
                  R_ARM_TLS_DTPOFF32);
11885
0
      outrel.r_offset += 4;
11886
11887
0
      if (globals->use_rel)
11888
0
        bfd_put_32 (output_bfd, outrel.r_addend,
11889
0
              sgot->contents + cur_off + 4);
11890
11891
0
      elf32_arm_add_dynreloc (output_bfd, info,
11892
0
            srelgot, &outrel);
11893
0
          }
11894
0
      }
11895
0
    else
11896
0
      {
11897
        /* If we are not emitting relocations for a
11898
           general dynamic reference, then we must be in a
11899
           static link or an executable link with the
11900
           symbol binding locally.  Mark it as belonging
11901
           to module 1, the executable.  */
11902
0
        bfd_put_32 (output_bfd, 1,
11903
0
        sgot->contents + cur_off);
11904
0
        bfd_put_32 (output_bfd, value - dtpoff_base (info),
11905
0
        sgot->contents + cur_off + 4);
11906
0
      }
11907
11908
0
    cur_off += 8;
11909
0
        }
11910
11911
0
      if (tls_type & GOT_TLS_IE)
11912
0
        {
11913
0
    if (need_relocs)
11914
0
      {
11915
0
        if (indx == 0)
11916
0
          outrel.r_addend = value - dtpoff_base (info);
11917
0
        else
11918
0
          outrel.r_addend = 0;
11919
0
        outrel.r_offset = (sgot->output_section->vma
11920
0
               + sgot->output_offset
11921
0
               + cur_off);
11922
0
        outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
11923
11924
0
        if (globals->use_rel)
11925
0
          bfd_put_32 (output_bfd, outrel.r_addend,
11926
0
          sgot->contents + cur_off);
11927
11928
0
        elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11929
0
      }
11930
0
    else
11931
0
      bfd_put_32 (output_bfd, tpoff (info, value),
11932
0
            sgot->contents + cur_off);
11933
0
    cur_off += 4;
11934
0
        }
11935
11936
0
      if (h != NULL)
11937
0
        h->got.offset |= 1;
11938
0
      else
11939
0
        local_got_offsets[r_symndx] |= 1;
11940
0
    }
11941
11942
0
  if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32 && r_type != R_ARM_TLS_GD32_FDPIC)
11943
0
    off += 8;
11944
0
  else if (tls_type & GOT_TLS_GDESC)
11945
0
    off = offplt;
11946
11947
0
  if (ELF32_R_TYPE (rel->r_info) == R_ARM_TLS_CALL
11948
0
      || ELF32_R_TYPE (rel->r_info) == R_ARM_THM_TLS_CALL)
11949
0
    {
11950
0
      bfd_signed_vma offset;
11951
      /* TLS stubs are arm mode.  The original symbol is a
11952
         data object, so branch_type is bogus.  */
11953
0
      branch_type = ST_BRANCH_TO_ARM;
11954
0
      enum elf32_arm_stub_type stub_type
11955
0
        = arm_type_of_stub (info, input_section, rel,
11956
0
          st_type, &branch_type,
11957
0
          (struct elf32_arm_link_hash_entry *)h,
11958
0
          globals->tls_trampoline, globals->root.splt,
11959
0
          input_bfd, sym_name);
11960
11961
0
      if (stub_type != arm_stub_none)
11962
0
        {
11963
0
    struct elf32_arm_stub_hash_entry *stub_entry
11964
0
      = elf32_arm_get_stub_entry
11965
0
      (input_section, globals->root.splt, 0, rel,
11966
0
       globals, stub_type);
11967
0
    offset = (stub_entry->stub_offset
11968
0
        + stub_entry->stub_sec->output_offset
11969
0
        + stub_entry->stub_sec->output_section->vma);
11970
0
        }
11971
0
      else
11972
0
        offset = (globals->root.splt->output_section->vma
11973
0
      + globals->root.splt->output_offset
11974
0
      + globals->tls_trampoline);
11975
11976
0
      if (ELF32_R_TYPE (rel->r_info) == R_ARM_TLS_CALL)
11977
0
        {
11978
0
    unsigned long inst;
11979
11980
0
    offset -= (input_section->output_section->vma
11981
0
         + input_section->output_offset
11982
0
         + rel->r_offset + 8);
11983
11984
0
    inst = offset >> 2;
11985
0
    inst &= 0x00ffffff;
11986
0
    value = inst | (globals->use_blx ? 0xfa000000 : 0xeb000000);
11987
0
        }
11988
0
      else
11989
0
        {
11990
    /* Thumb blx encodes the offset in a complicated
11991
       fashion.  */
11992
0
    unsigned upper_insn, lower_insn;
11993
0
    unsigned neg;
11994
11995
0
    offset -= (input_section->output_section->vma
11996
0
         + input_section->output_offset
11997
0
         + rel->r_offset + 4);
11998
11999
0
    if (stub_type != arm_stub_none
12000
0
        && arm_stub_is_thumb (stub_type))
12001
0
      {
12002
0
        lower_insn = 0xd000;
12003
0
      }
12004
0
    else
12005
0
      {
12006
0
        lower_insn = 0xc000;
12007
        /* Round up the offset to a word boundary.  */
12008
0
        offset = (offset + 2) & ~2;
12009
0
      }
12010
12011
0
    neg = offset < 0;
12012
0
    upper_insn = (0xf000
12013
0
            | ((offset >> 12) & 0x3ff)
12014
0
            | (neg << 10));
12015
0
    lower_insn |= (((!((offset >> 23) & 1)) ^ neg) << 13)
12016
0
            | (((!((offset >> 22) & 1)) ^ neg) << 11)
12017
0
            | ((offset >> 1) & 0x7ff);
12018
0
    bfd_put_16 (input_bfd, upper_insn, hit_data);
12019
0
    bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
12020
0
    return bfd_reloc_ok;
12021
0
        }
12022
0
    }
12023
  /* These relocations needs special care, as besides the fact
12024
     they point somewhere in .gotplt, the addend must be
12025
     adjusted accordingly depending on the type of instruction
12026
     we refer to.  */
12027
0
  else if ((r_type == R_ARM_TLS_GOTDESC) && (tls_type & GOT_TLS_GDESC))
12028
0
    {
12029
0
      unsigned long data, insn;
12030
0
      unsigned thumb;
12031
12032
0
      data = bfd_get_signed_32 (input_bfd, hit_data);
12033
0
      thumb = data & 1;
12034
0
      data &= ~1ul;
12035
12036
0
      if (thumb)
12037
0
        {
12038
0
    insn = bfd_get_16 (input_bfd, contents + rel->r_offset - data);
12039
0
    if ((insn & 0xf000) == 0xf000 || (insn & 0xf800) == 0xe800)
12040
0
      insn = (insn << 16)
12041
0
        | bfd_get_16 (input_bfd,
12042
0
          contents + rel->r_offset - data + 2);
12043
0
    if ((insn & 0xf800c000) == 0xf000c000)
12044
      /* bl/blx */
12045
0
      value = -6;
12046
0
    else if ((insn & 0xffffff00) == 0x4400)
12047
      /* add */
12048
0
      value = -5;
12049
0
    else
12050
0
      {
12051
0
        _bfd_error_handler
12052
          /* xgettext:c-format */
12053
0
          (_("%pB(%pA+%#" PRIx64 "): "
12054
0
       "unexpected %s instruction '%#lx' "
12055
0
       "referenced by TLS_GOTDESC"),
12056
0
           input_bfd, input_section, (uint64_t) rel->r_offset,
12057
0
           "Thumb", insn);
12058
0
        return bfd_reloc_notsupported;
12059
0
      }
12060
0
        }
12061
0
      else
12062
0
        {
12063
0
    insn = bfd_get_32 (input_bfd, contents + rel->r_offset - data);
12064
12065
0
    switch (insn >> 24)
12066
0
      {
12067
0
      case 0xeb:  /* bl */
12068
0
      case 0xfa:  /* blx */
12069
0
        value = -4;
12070
0
        break;
12071
12072
0
      case 0xe0:  /* add */
12073
0
        value = -8;
12074
0
        break;
12075
12076
0
      default:
12077
0
        _bfd_error_handler
12078
          /* xgettext:c-format */
12079
0
          (_("%pB(%pA+%#" PRIx64 "): "
12080
0
       "unexpected %s instruction '%#lx' "
12081
0
       "referenced by TLS_GOTDESC"),
12082
0
           input_bfd, input_section, (uint64_t) rel->r_offset,
12083
0
           "ARM", insn);
12084
0
        return bfd_reloc_notsupported;
12085
0
      }
12086
0
        }
12087
12088
0
      value += ((globals->root.sgotplt->output_section->vma
12089
0
           + globals->root.sgotplt->output_offset + off)
12090
0
          - (input_section->output_section->vma
12091
0
       + input_section->output_offset
12092
0
       + rel->r_offset)
12093
0
          + globals->sgotplt_jump_table_size);
12094
0
    }
12095
0
  else
12096
0
    value = ((globals->root.sgot->output_section->vma
12097
0
        + globals->root.sgot->output_offset + off)
12098
0
       - (input_section->output_section->vma
12099
0
          + input_section->output_offset + rel->r_offset));
12100
12101
0
  if (globals->fdpic_p && (r_type == R_ARM_TLS_GD32_FDPIC ||
12102
0
         r_type == R_ARM_TLS_IE32_FDPIC))
12103
0
    {
12104
      /* For FDPIC relocations, resolve to the offset of the GOT
12105
         entry from the start of GOT.  */
12106
0
      bfd_put_32 (output_bfd,
12107
0
      globals->root.sgot->output_offset + off,
12108
0
      contents + rel->r_offset);
12109
12110
0
      return bfd_reloc_ok;
12111
0
    }
12112
0
  else
12113
0
    {
12114
0
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
12115
0
               contents, rel->r_offset, value,
12116
0
               rel->r_addend);
12117
0
    }
12118
0
      }
12119
12120
0
    case R_ARM_TLS_LE32:
12121
0
      if (bfd_link_dll (info))
12122
0
  {
12123
0
    _bfd_error_handler
12124
      /* xgettext:c-format */
12125
0
      (_("%pB(%pA+%#" PRIx64 "): %s relocation not permitted "
12126
0
         "in shared object"),
12127
0
       input_bfd, input_section, (uint64_t) rel->r_offset, howto->name);
12128
0
    return bfd_reloc_notsupported;
12129
0
  }
12130
0
      else
12131
0
  value = tpoff (info, value);
12132
12133
0
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
12134
0
               contents, rel->r_offset, value,
12135
0
               rel->r_addend);
12136
12137
0
    case R_ARM_V4BX:
12138
0
      if (globals->fix_v4bx)
12139
0
  {
12140
0
    bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12141
12142
    /* Ensure that we have a BX instruction.  */
12143
0
    BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
12144
12145
0
    if (globals->fix_v4bx == 2 && (insn & 0xf) != 0xf)
12146
0
      {
12147
        /* Branch to veneer.  */
12148
0
        bfd_vma glue_addr;
12149
0
        glue_addr = elf32_arm_bx_glue (info, insn & 0xf);
12150
0
        glue_addr -= input_section->output_section->vma
12151
0
         + input_section->output_offset
12152
0
         + rel->r_offset + 8;
12153
0
        insn = (insn & 0xf0000000) | 0x0a000000
12154
0
         | ((glue_addr >> 2) & 0x00ffffff);
12155
0
      }
12156
0
    else
12157
0
      {
12158
        /* Preserve Rm (lowest four bits) and the condition code
12159
     (highest four bits). Other bits encode MOV PC,Rm.  */
12160
0
        insn = (insn & 0xf000000f) | 0x01a0f000;
12161
0
      }
12162
12163
0
    bfd_put_32 (input_bfd, insn, hit_data);
12164
0
  }
12165
0
      return bfd_reloc_ok;
12166
12167
0
    case R_ARM_MOVW_ABS_NC:
12168
0
    case R_ARM_MOVT_ABS:
12169
0
    case R_ARM_MOVW_PREL_NC:
12170
0
    case R_ARM_MOVT_PREL:
12171
    /* Until we properly support segment-base-relative addressing then
12172
       we assume the segment base to be zero, as for the group relocations.
12173
       Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
12174
       and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS.  */
12175
0
    case R_ARM_MOVW_BREL_NC:
12176
0
    case R_ARM_MOVW_BREL:
12177
0
    case R_ARM_MOVT_BREL:
12178
0
      {
12179
0
  bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12180
12181
0
  if (globals->use_rel)
12182
0
    {
12183
0
      addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
12184
0
      signed_addend = (addend ^ 0x8000) - 0x8000;
12185
0
    }
12186
12187
0
  value += signed_addend;
12188
12189
0
  if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
12190
0
    value -= (input_section->output_section->vma
12191
0
        + input_section->output_offset + rel->r_offset);
12192
12193
0
  if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
12194
0
    return bfd_reloc_overflow;
12195
12196
0
  if (branch_type == ST_BRANCH_TO_THUMB)
12197
0
    value |= 1;
12198
12199
0
  if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
12200
0
      || r_type == R_ARM_MOVT_BREL)
12201
0
    value >>= 16;
12202
12203
0
  insn &= 0xfff0f000;
12204
0
  insn |= value & 0xfff;
12205
0
  insn |= (value & 0xf000) << 4;
12206
0
  bfd_put_32 (input_bfd, insn, hit_data);
12207
0
      }
12208
0
      return bfd_reloc_ok;
12209
12210
0
    case R_ARM_THM_MOVW_ABS_NC:
12211
0
    case R_ARM_THM_MOVT_ABS:
12212
0
    case R_ARM_THM_MOVW_PREL_NC:
12213
0
    case R_ARM_THM_MOVT_PREL:
12214
    /* Until we properly support segment-base-relative addressing then
12215
       we assume the segment base to be zero, as for the above relocations.
12216
       Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
12217
       R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
12218
       as R_ARM_THM_MOVT_ABS.  */
12219
0
    case R_ARM_THM_MOVW_BREL_NC:
12220
0
    case R_ARM_THM_MOVW_BREL:
12221
0
    case R_ARM_THM_MOVT_BREL:
12222
0
      {
12223
0
  bfd_vma insn;
12224
12225
0
  insn = bfd_get_16 (input_bfd, hit_data) << 16;
12226
0
  insn |= bfd_get_16 (input_bfd, hit_data + 2);
12227
12228
0
  if (globals->use_rel)
12229
0
    {
12230
0
      addend = ((insn >> 4)  & 0xf000)
12231
0
       | ((insn >> 15) & 0x0800)
12232
0
       | ((insn >> 4)  & 0x0700)
12233
0
       | (insn     & 0x00ff);
12234
0
      signed_addend = (addend ^ 0x8000) - 0x8000;
12235
0
    }
12236
12237
0
  value += signed_addend;
12238
12239
0
  if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
12240
0
    value -= (input_section->output_section->vma
12241
0
        + input_section->output_offset + rel->r_offset);
12242
12243
0
  if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
12244
0
    return bfd_reloc_overflow;
12245
12246
0
  if (branch_type == ST_BRANCH_TO_THUMB)
12247
0
    value |= 1;
12248
12249
0
  if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
12250
0
      || r_type == R_ARM_THM_MOVT_BREL)
12251
0
    value >>= 16;
12252
12253
0
  insn &= 0xfbf08f00;
12254
0
  insn |= (value & 0xf000) << 4;
12255
0
  insn |= (value & 0x0800) << 15;
12256
0
  insn |= (value & 0x0700) << 4;
12257
0
  insn |= (value & 0x00ff);
12258
12259
0
  bfd_put_16 (input_bfd, insn >> 16, hit_data);
12260
0
  bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
12261
0
      }
12262
0
      return bfd_reloc_ok;
12263
12264
0
    case R_ARM_ALU_PC_G0_NC:
12265
0
    case R_ARM_ALU_PC_G1_NC:
12266
0
    case R_ARM_ALU_PC_G0:
12267
0
    case R_ARM_ALU_PC_G1:
12268
0
    case R_ARM_ALU_PC_G2:
12269
0
    case R_ARM_ALU_SB_G0_NC:
12270
0
    case R_ARM_ALU_SB_G1_NC:
12271
0
    case R_ARM_ALU_SB_G0:
12272
0
    case R_ARM_ALU_SB_G1:
12273
0
    case R_ARM_ALU_SB_G2:
12274
0
      {
12275
0
  bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12276
0
  bfd_vma pc = input_section->output_section->vma
12277
0
         + input_section->output_offset + rel->r_offset;
12278
  /* sb is the origin of the *segment* containing the symbol.  */
12279
0
  bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12280
0
  bfd_vma residual;
12281
0
  bfd_vma g_n;
12282
0
  bfd_signed_vma signed_value;
12283
0
  int group = 0;
12284
12285
  /* Determine which group of bits to select.  */
12286
0
  switch (r_type)
12287
0
    {
12288
0
    case R_ARM_ALU_PC_G0_NC:
12289
0
    case R_ARM_ALU_PC_G0:
12290
0
    case R_ARM_ALU_SB_G0_NC:
12291
0
    case R_ARM_ALU_SB_G0:
12292
0
      group = 0;
12293
0
      break;
12294
12295
0
    case R_ARM_ALU_PC_G1_NC:
12296
0
    case R_ARM_ALU_PC_G1:
12297
0
    case R_ARM_ALU_SB_G1_NC:
12298
0
    case R_ARM_ALU_SB_G1:
12299
0
      group = 1;
12300
0
      break;
12301
12302
0
    case R_ARM_ALU_PC_G2:
12303
0
    case R_ARM_ALU_SB_G2:
12304
0
      group = 2;
12305
0
      break;
12306
12307
0
    default:
12308
0
      abort ();
12309
0
    }
12310
12311
  /* If REL, extract the addend from the insn.  If RELA, it will
12312
     have already been fetched for us.  */
12313
0
  if (globals->use_rel)
12314
0
    {
12315
0
      int negative;
12316
0
      bfd_vma constant = insn & 0xff;
12317
0
      bfd_vma rotation = (insn & 0xf00) >> 8;
12318
12319
0
      if (rotation == 0)
12320
0
        signed_addend = constant;
12321
0
      else
12322
0
        {
12323
    /* Compensate for the fact that in the instruction, the
12324
       rotation is stored in multiples of 2 bits.  */
12325
0
    rotation *= 2;
12326
12327
    /* Rotate "constant" right by "rotation" bits.  */
12328
0
    signed_addend = (constant >> rotation) |
12329
0
        (constant << (8 * sizeof (bfd_vma) - rotation));
12330
0
        }
12331
12332
      /* Determine if the instruction is an ADD or a SUB.
12333
         (For REL, this determines the sign of the addend.)  */
12334
0
      negative = identify_add_or_sub (insn);
12335
0
      if (negative == 0)
12336
0
        {
12337
0
    _bfd_error_handler
12338
      /* xgettext:c-format */
12339
0
      (_("%pB(%pA+%#" PRIx64 "): only ADD or SUB instructions "
12340
0
         "are allowed for ALU group relocations"),
12341
0
      input_bfd, input_section, (uint64_t) rel->r_offset);
12342
0
    return bfd_reloc_overflow;
12343
0
        }
12344
12345
0
      signed_addend *= negative;
12346
0
    }
12347
12348
  /* Compute the value (X) to go in the place.  */
12349
0
  if (r_type == R_ARM_ALU_PC_G0_NC
12350
0
      || r_type == R_ARM_ALU_PC_G1_NC
12351
0
      || r_type == R_ARM_ALU_PC_G0
12352
0
      || r_type == R_ARM_ALU_PC_G1
12353
0
      || r_type == R_ARM_ALU_PC_G2)
12354
    /* PC relative.  */
12355
0
    signed_value = value - pc + signed_addend;
12356
0
  else
12357
    /* Section base relative.  */
12358
0
    signed_value = value - sb + signed_addend;
12359
12360
  /* If the target symbol is a Thumb function, then set the
12361
     Thumb bit in the address.  */
12362
0
  if (branch_type == ST_BRANCH_TO_THUMB)
12363
0
    signed_value |= 1;
12364
12365
  /* Calculate the value of the relevant G_n, in encoded
12366
     constant-with-rotation format.  */
12367
0
  g_n = calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12368
0
            group, &residual);
12369
12370
  /* Check for overflow if required.  */
12371
0
  if ((r_type == R_ARM_ALU_PC_G0
12372
0
       || r_type == R_ARM_ALU_PC_G1
12373
0
       || r_type == R_ARM_ALU_PC_G2
12374
0
       || r_type == R_ARM_ALU_SB_G0
12375
0
       || r_type == R_ARM_ALU_SB_G1
12376
0
       || r_type == R_ARM_ALU_SB_G2) && residual != 0)
12377
0
    {
12378
0
      _bfd_error_handler
12379
        /* xgettext:c-format */
12380
0
        (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12381
0
     "splitting %#" PRIx64 " for group relocation %s"),
12382
0
         input_bfd, input_section, (uint64_t) rel->r_offset,
12383
0
         (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12384
0
         howto->name);
12385
0
      return bfd_reloc_overflow;
12386
0
    }
12387
12388
  /* Mask out the value and the ADD/SUB part of the opcode; take care
12389
     not to destroy the S bit.  */
12390
0
  insn &= 0xff1ff000;
12391
12392
  /* Set the opcode according to whether the value to go in the
12393
     place is negative.  */
12394
0
  if (signed_value < 0)
12395
0
    insn |= 1 << 22;
12396
0
  else
12397
0
    insn |= 1 << 23;
12398
12399
  /* Encode the offset.  */
12400
0
  insn |= g_n;
12401
12402
0
  bfd_put_32 (input_bfd, insn, hit_data);
12403
0
      }
12404
0
      return bfd_reloc_ok;
12405
12406
0
    case R_ARM_LDR_PC_G0:
12407
0
    case R_ARM_LDR_PC_G1:
12408
0
    case R_ARM_LDR_PC_G2:
12409
0
    case R_ARM_LDR_SB_G0:
12410
0
    case R_ARM_LDR_SB_G1:
12411
0
    case R_ARM_LDR_SB_G2:
12412
0
      {
12413
0
  bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12414
0
  bfd_vma pc = input_section->output_section->vma
12415
0
         + input_section->output_offset + rel->r_offset;
12416
  /* sb is the origin of the *segment* containing the symbol.  */
12417
0
  bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12418
0
  bfd_vma residual;
12419
0
  bfd_signed_vma signed_value;
12420
0
  int group = 0;
12421
12422
  /* Determine which groups of bits to calculate.  */
12423
0
  switch (r_type)
12424
0
    {
12425
0
    case R_ARM_LDR_PC_G0:
12426
0
    case R_ARM_LDR_SB_G0:
12427
0
      group = 0;
12428
0
      break;
12429
12430
0
    case R_ARM_LDR_PC_G1:
12431
0
    case R_ARM_LDR_SB_G1:
12432
0
      group = 1;
12433
0
      break;
12434
12435
0
    case R_ARM_LDR_PC_G2:
12436
0
    case R_ARM_LDR_SB_G2:
12437
0
      group = 2;
12438
0
      break;
12439
12440
0
    default:
12441
0
      abort ();
12442
0
    }
12443
12444
  /* If REL, extract the addend from the insn.  If RELA, it will
12445
     have already been fetched for us.  */
12446
0
  if (globals->use_rel)
12447
0
    {
12448
0
      int negative = (insn & (1 << 23)) ? 1 : -1;
12449
0
      signed_addend = negative * (insn & 0xfff);
12450
0
    }
12451
12452
  /* Compute the value (X) to go in the place.  */
12453
0
  if (r_type == R_ARM_LDR_PC_G0
12454
0
      || r_type == R_ARM_LDR_PC_G1
12455
0
      || r_type == R_ARM_LDR_PC_G2)
12456
    /* PC relative.  */
12457
0
    signed_value = value - pc + signed_addend;
12458
0
  else
12459
    /* Section base relative.  */
12460
0
    signed_value = value - sb + signed_addend;
12461
12462
  /* Calculate the value of the relevant G_{n-1} to obtain
12463
     the residual at that stage.  */
12464
0
  calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12465
0
            group - 1, &residual);
12466
12467
  /* Check for overflow.  */
12468
0
  if (residual >= 0x1000)
12469
0
    {
12470
0
      _bfd_error_handler
12471
        /* xgettext:c-format */
12472
0
        (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12473
0
     "splitting %#" PRIx64 " for group relocation %s"),
12474
0
         input_bfd, input_section, (uint64_t) rel->r_offset,
12475
0
         (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12476
0
         howto->name);
12477
0
      return bfd_reloc_overflow;
12478
0
    }
12479
12480
  /* Mask out the value and U bit.  */
12481
0
  insn &= 0xff7ff000;
12482
12483
  /* Set the U bit if the value to go in the place is non-negative.  */
12484
0
  if (signed_value >= 0)
12485
0
    insn |= 1 << 23;
12486
12487
  /* Encode the offset.  */
12488
0
  insn |= residual;
12489
12490
0
  bfd_put_32 (input_bfd, insn, hit_data);
12491
0
      }
12492
0
      return bfd_reloc_ok;
12493
12494
0
    case R_ARM_LDRS_PC_G0:
12495
0
    case R_ARM_LDRS_PC_G1:
12496
0
    case R_ARM_LDRS_PC_G2:
12497
0
    case R_ARM_LDRS_SB_G0:
12498
0
    case R_ARM_LDRS_SB_G1:
12499
0
    case R_ARM_LDRS_SB_G2:
12500
0
      {
12501
0
  bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12502
0
  bfd_vma pc = input_section->output_section->vma
12503
0
         + input_section->output_offset + rel->r_offset;
12504
  /* sb is the origin of the *segment* containing the symbol.  */
12505
0
  bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12506
0
  bfd_vma residual;
12507
0
  bfd_signed_vma signed_value;
12508
0
  int group = 0;
12509
12510
  /* Determine which groups of bits to calculate.  */
12511
0
  switch (r_type)
12512
0
    {
12513
0
    case R_ARM_LDRS_PC_G0:
12514
0
    case R_ARM_LDRS_SB_G0:
12515
0
      group = 0;
12516
0
      break;
12517
12518
0
    case R_ARM_LDRS_PC_G1:
12519
0
    case R_ARM_LDRS_SB_G1:
12520
0
      group = 1;
12521
0
      break;
12522
12523
0
    case R_ARM_LDRS_PC_G2:
12524
0
    case R_ARM_LDRS_SB_G2:
12525
0
      group = 2;
12526
0
      break;
12527
12528
0
    default:
12529
0
      abort ();
12530
0
    }
12531
12532
  /* If REL, extract the addend from the insn.  If RELA, it will
12533
     have already been fetched for us.  */
12534
0
  if (globals->use_rel)
12535
0
    {
12536
0
      int negative = (insn & (1 << 23)) ? 1 : -1;
12537
0
      signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
12538
0
    }
12539
12540
  /* Compute the value (X) to go in the place.  */
12541
0
  if (r_type == R_ARM_LDRS_PC_G0
12542
0
      || r_type == R_ARM_LDRS_PC_G1
12543
0
      || r_type == R_ARM_LDRS_PC_G2)
12544
    /* PC relative.  */
12545
0
    signed_value = value - pc + signed_addend;
12546
0
  else
12547
    /* Section base relative.  */
12548
0
    signed_value = value - sb + signed_addend;
12549
12550
  /* Calculate the value of the relevant G_{n-1} to obtain
12551
     the residual at that stage.  */
12552
0
  calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12553
0
            group - 1, &residual);
12554
12555
  /* Check for overflow.  */
12556
0
  if (residual >= 0x100)
12557
0
    {
12558
0
      _bfd_error_handler
12559
        /* xgettext:c-format */
12560
0
        (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12561
0
     "splitting %#" PRIx64 " for group relocation %s"),
12562
0
         input_bfd, input_section, (uint64_t) rel->r_offset,
12563
0
         (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12564
0
         howto->name);
12565
0
      return bfd_reloc_overflow;
12566
0
    }
12567
12568
  /* Mask out the value and U bit.  */
12569
0
  insn &= 0xff7ff0f0;
12570
12571
  /* Set the U bit if the value to go in the place is non-negative.  */
12572
0
  if (signed_value >= 0)
12573
0
    insn |= 1 << 23;
12574
12575
  /* Encode the offset.  */
12576
0
  insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
12577
12578
0
  bfd_put_32 (input_bfd, insn, hit_data);
12579
0
      }
12580
0
      return bfd_reloc_ok;
12581
12582
0
    case R_ARM_LDC_PC_G0:
12583
0
    case R_ARM_LDC_PC_G1:
12584
0
    case R_ARM_LDC_PC_G2:
12585
0
    case R_ARM_LDC_SB_G0:
12586
0
    case R_ARM_LDC_SB_G1:
12587
0
    case R_ARM_LDC_SB_G2:
12588
0
      {
12589
0
  bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12590
0
  bfd_vma pc = input_section->output_section->vma
12591
0
         + input_section->output_offset + rel->r_offset;
12592
  /* sb is the origin of the *segment* containing the symbol.  */
12593
0
  bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12594
0
  bfd_vma residual;
12595
0
  bfd_signed_vma signed_value;
12596
0
  int group = 0;
12597
12598
  /* Determine which groups of bits to calculate.  */
12599
0
  switch (r_type)
12600
0
    {
12601
0
    case R_ARM_LDC_PC_G0:
12602
0
    case R_ARM_LDC_SB_G0:
12603
0
      group = 0;
12604
0
      break;
12605
12606
0
    case R_ARM_LDC_PC_G1:
12607
0
    case R_ARM_LDC_SB_G1:
12608
0
      group = 1;
12609
0
      break;
12610
12611
0
    case R_ARM_LDC_PC_G2:
12612
0
    case R_ARM_LDC_SB_G2:
12613
0
      group = 2;
12614
0
      break;
12615
12616
0
    default:
12617
0
      abort ();
12618
0
    }
12619
12620
  /* If REL, extract the addend from the insn.  If RELA, it will
12621
     have already been fetched for us.  */
12622
0
  if (globals->use_rel)
12623
0
    {
12624
0
      int negative = (insn & (1 << 23)) ? 1 : -1;
12625
0
      signed_addend = negative * ((insn & 0xff) << 2);
12626
0
    }
12627
12628
  /* Compute the value (X) to go in the place.  */
12629
0
  if (r_type == R_ARM_LDC_PC_G0
12630
0
      || r_type == R_ARM_LDC_PC_G1
12631
0
      || r_type == R_ARM_LDC_PC_G2)
12632
    /* PC relative.  */
12633
0
    signed_value = value - pc + signed_addend;
12634
0
  else
12635
    /* Section base relative.  */
12636
0
    signed_value = value - sb + signed_addend;
12637
12638
  /* Calculate the value of the relevant G_{n-1} to obtain
12639
     the residual at that stage.  */
12640
0
  calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12641
0
            group - 1, &residual);
12642
12643
  /* Check for overflow.  (The absolute value to go in the place must be
12644
     divisible by four and, after having been divided by four, must
12645
     fit in eight bits.)  */
12646
0
  if ((residual & 0x3) != 0 || residual >= 0x400)
12647
0
    {
12648
0
      _bfd_error_handler
12649
        /* xgettext:c-format */
12650
0
        (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12651
0
     "splitting %#" PRIx64 " for group relocation %s"),
12652
0
         input_bfd, input_section, (uint64_t) rel->r_offset,
12653
0
         (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12654
0
         howto->name);
12655
0
      return bfd_reloc_overflow;
12656
0
    }
12657
12658
  /* Mask out the value and U bit.  */
12659
0
  insn &= 0xff7fff00;
12660
12661
  /* Set the U bit if the value to go in the place is non-negative.  */
12662
0
  if (signed_value >= 0)
12663
0
    insn |= 1 << 23;
12664
12665
  /* Encode the offset.  */
12666
0
  insn |= residual >> 2;
12667
12668
0
  bfd_put_32 (input_bfd, insn, hit_data);
12669
0
      }
12670
0
      return bfd_reloc_ok;
12671
12672
0
    case R_ARM_THM_ALU_ABS_G0_NC:
12673
0
    case R_ARM_THM_ALU_ABS_G1_NC:
12674
0
    case R_ARM_THM_ALU_ABS_G2_NC:
12675
0
    case R_ARM_THM_ALU_ABS_G3_NC:
12676
0
  {
12677
0
      const int shift_array[4] = {0, 8, 16, 24};
12678
0
      bfd_vma insn = bfd_get_16 (input_bfd, hit_data);
12679
0
      bfd_vma addr = value;
12680
0
      int shift = shift_array[r_type - R_ARM_THM_ALU_ABS_G0_NC];
12681
12682
      /* Compute address.  */
12683
0
      if (globals->use_rel)
12684
0
    signed_addend = insn & 0xff;
12685
0
      addr += signed_addend;
12686
0
      if (branch_type == ST_BRANCH_TO_THUMB)
12687
0
    addr |= 1;
12688
      /* Clean imm8 insn.  */
12689
0
      insn &= 0xff00;
12690
      /* And update with correct part of address.  */
12691
0
      insn |= (addr >> shift) & 0xff;
12692
      /* Update insn.  */
12693
0
      bfd_put_16 (input_bfd, insn, hit_data);
12694
0
  }
12695
12696
0
  *unresolved_reloc_p = false;
12697
0
  return bfd_reloc_ok;
12698
12699
0
    case R_ARM_GOTOFFFUNCDESC:
12700
0
      {
12701
0
  if (h == NULL)
12702
0
    {
12703
0
      struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts (input_bfd);
12704
0
      int dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12705
12706
0
      if (r_symndx >= elf32_arm_num_entries (input_bfd))
12707
0
        {
12708
0
    * error_message = _("local symbol index too big");
12709
0
    return bfd_reloc_dangerous;
12710
0
        }
12711
12712
0
      int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1;
12713
0
      bfd_vma addr = dynreloc_value - sym_sec->output_section->vma;
12714
0
      bfd_vma seg = -1;
12715
12716
0
      if (bfd_link_pic (info) && dynindx == 0)
12717
0
        {
12718
0
    * error_message = _("no dynamic index information available");
12719
0
    return bfd_reloc_dangerous;
12720
0
        }
12721
12722
      /* Resolve relocation.  */
12723
0
      bfd_put_32 (output_bfd, (offset + sgot->output_offset)
12724
0
           , contents + rel->r_offset);
12725
      /* Emit R_ARM_FUNCDESC_VALUE or two fixups on funcdesc if
12726
         not done yet.  */
12727
0
      arm_elf_fill_funcdesc (output_bfd, info,
12728
0
           &local_fdpic_cnts[r_symndx].funcdesc_offset,
12729
0
           dynindx, offset, addr, dynreloc_value, seg);
12730
0
    }
12731
0
  else
12732
0
    {
12733
0
      int dynindx;
12734
0
      int offset = eh->fdpic_cnts.funcdesc_offset & ~1;
12735
0
      bfd_vma addr;
12736
0
      bfd_vma seg = -1;
12737
12738
      /* For static binaries, sym_sec can be null.  */
12739
0
      if (sym_sec)
12740
0
        {
12741
0
    dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12742
0
    addr = dynreloc_value - sym_sec->output_section->vma;
12743
0
        }
12744
0
      else
12745
0
        {
12746
0
    dynindx = 0;
12747
0
    addr = 0;
12748
0
        }
12749
12750
0
      if (bfd_link_pic (info) && dynindx == 0)
12751
0
        {
12752
0
    * error_message = _("no dynamic index information available");
12753
0
    return bfd_reloc_dangerous;
12754
0
        }
12755
12756
      /* This case cannot occur since funcdesc is allocated by
12757
         the dynamic loader so we cannot resolve the relocation.  */
12758
0
      if (h->dynindx != -1)
12759
0
        {
12760
0
    * error_message = _("invalid dynamic index");
12761
0
    return bfd_reloc_dangerous;
12762
0
        }
12763
12764
      /* Resolve relocation.  */
12765
0
      bfd_put_32 (output_bfd, (offset + sgot->output_offset),
12766
0
            contents + rel->r_offset);
12767
      /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12768
0
      arm_elf_fill_funcdesc (output_bfd, info,
12769
0
           &eh->fdpic_cnts.funcdesc_offset,
12770
0
           dynindx, offset, addr, dynreloc_value, seg);
12771
0
    }
12772
0
      }
12773
0
      *unresolved_reloc_p = false;
12774
0
      return bfd_reloc_ok;
12775
12776
0
    case R_ARM_GOTFUNCDESC:
12777
0
      {
12778
0
  if (h != NULL)
12779
0
    {
12780
0
      Elf_Internal_Rela outrel;
12781
12782
      /* Resolve relocation.  */
12783
0
      bfd_put_32 (output_bfd, ((eh->fdpic_cnts.gotfuncdesc_offset & ~1)
12784
0
             + sgot->output_offset),
12785
0
      contents + rel->r_offset);
12786
      /* Add funcdesc and associated R_ARM_FUNCDESC_VALUE.  */
12787
0
      if (h->dynindx == -1)
12788
0
        {
12789
0
    int dynindx;
12790
0
    int offset = eh->fdpic_cnts.funcdesc_offset & ~1;
12791
0
    bfd_vma addr;
12792
0
    bfd_vma seg = -1;
12793
12794
    /* For static binaries sym_sec can be null.  */
12795
0
    if (sym_sec)
12796
0
      {
12797
0
        dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12798
0
        addr = dynreloc_value - sym_sec->output_section->vma;
12799
0
      }
12800
0
    else
12801
0
      {
12802
0
        dynindx = 0;
12803
0
        addr = 0;
12804
0
      }
12805
12806
    /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12807
0
    arm_elf_fill_funcdesc (output_bfd, info,
12808
0
               &eh->fdpic_cnts.funcdesc_offset,
12809
0
               dynindx, offset, addr, dynreloc_value, seg);
12810
0
        }
12811
12812
      /* Add a dynamic relocation on GOT entry if not already done.  */
12813
0
      if ((eh->fdpic_cnts.gotfuncdesc_offset & 1) == 0)
12814
0
        {
12815
0
    if (h->dynindx == -1)
12816
0
      {
12817
0
        outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
12818
0
        if (h->root.type == bfd_link_hash_undefweak)
12819
0
          bfd_put_32 (output_bfd, 0, sgot->contents
12820
0
          + (eh->fdpic_cnts.gotfuncdesc_offset & ~1));
12821
0
        else
12822
0
          bfd_put_32 (output_bfd, sgot->output_section->vma
12823
0
          + sgot->output_offset
12824
0
          + (eh->fdpic_cnts.funcdesc_offset & ~1),
12825
0
          sgot->contents
12826
0
          + (eh->fdpic_cnts.gotfuncdesc_offset & ~1));
12827
0
      }
12828
0
    else
12829
0
      {
12830
0
        outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_FUNCDESC);
12831
0
      }
12832
0
    outrel.r_offset = sgot->output_section->vma
12833
0
      + sgot->output_offset
12834
0
      + (eh->fdpic_cnts.gotfuncdesc_offset & ~1);
12835
0
    outrel.r_addend = 0;
12836
0
    if (h->dynindx == -1 && !bfd_link_pic (info))
12837
0
      if (h->root.type == bfd_link_hash_undefweak)
12838
0
        arm_elf_add_rofixup (output_bfd, globals->srofixup, -1);
12839
0
      else
12840
0
        arm_elf_add_rofixup (output_bfd, globals->srofixup,
12841
0
           outrel.r_offset);
12842
0
    else
12843
0
      elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12844
0
    eh->fdpic_cnts.gotfuncdesc_offset |= 1;
12845
0
        }
12846
0
    }
12847
0
  else
12848
0
    {
12849
      /* Such relocation on static function should not have been
12850
         emitted by the compiler.  */
12851
0
      return bfd_reloc_notsupported;
12852
0
    }
12853
0
      }
12854
0
      *unresolved_reloc_p = false;
12855
0
      return bfd_reloc_ok;
12856
12857
0
    case R_ARM_FUNCDESC:
12858
0
      {
12859
0
  if (h == NULL)
12860
0
    {
12861
0
      struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts (input_bfd);
12862
0
      Elf_Internal_Rela outrel;
12863
0
      int dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12864
12865
0
      if (r_symndx >= elf32_arm_num_entries (input_bfd))
12866
0
        {
12867
0
    * error_message = _("local symbol index too big");
12868
0
    return bfd_reloc_dangerous;
12869
0
        }
12870
12871
0
      int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1;
12872
0
      bfd_vma addr = dynreloc_value - sym_sec->output_section->vma;
12873
0
      bfd_vma seg = -1;
12874
12875
0
      if (bfd_link_pic (info) && dynindx == 0)
12876
0
        {
12877
0
    * error_message = _("dynamic index information not available");
12878
0
    return bfd_reloc_dangerous;
12879
0
        }
12880
12881
      /* Replace static FUNCDESC relocation with a
12882
         R_ARM_RELATIVE dynamic relocation or with a rofixup for
12883
         executable.  */
12884
0
      outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
12885
0
      outrel.r_offset = input_section->output_section->vma
12886
0
        + input_section->output_offset + rel->r_offset;
12887
0
      outrel.r_addend = 0;
12888
0
      if (bfd_link_pic (info))
12889
0
        elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12890
0
      else
12891
0
        arm_elf_add_rofixup (output_bfd, globals->srofixup, outrel.r_offset);
12892
12893
0
      bfd_put_32 (input_bfd, sgot->output_section->vma
12894
0
      + sgot->output_offset + offset, hit_data);
12895
12896
      /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12897
0
      arm_elf_fill_funcdesc (output_bfd, info,
12898
0
           &local_fdpic_cnts[r_symndx].funcdesc_offset,
12899
0
           dynindx, offset, addr, dynreloc_value, seg);
12900
0
    }
12901
0
  else
12902
0
    {
12903
0
      if (h->dynindx == -1)
12904
0
        {
12905
0
    int dynindx;
12906
0
    int offset = eh->fdpic_cnts.funcdesc_offset & ~1;
12907
0
    bfd_vma addr;
12908
0
    bfd_vma seg = -1;
12909
0
    Elf_Internal_Rela outrel;
12910
12911
    /* For static binaries sym_sec can be null.  */
12912
0
    if (sym_sec)
12913
0
      {
12914
0
        dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12915
0
        addr = dynreloc_value - sym_sec->output_section->vma;
12916
0
      }
12917
0
    else
12918
0
      {
12919
0
        dynindx = 0;
12920
0
        addr = 0;
12921
0
      }
12922
12923
0
    if (bfd_link_pic (info) && dynindx == 0)
12924
0
      abort ();
12925
12926
    /* Replace static FUNCDESC relocation with a
12927
       R_ARM_RELATIVE dynamic relocation.  */
12928
0
    outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
12929
0
    outrel.r_offset = input_section->output_section->vma
12930
0
      + input_section->output_offset + rel->r_offset;
12931
0
    outrel.r_addend = 0;
12932
0
    if (bfd_link_pic (info))
12933
0
      elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12934
0
    else
12935
0
      arm_elf_add_rofixup (output_bfd, globals->srofixup, outrel.r_offset);
12936
12937
0
    bfd_put_32 (input_bfd, sgot->output_section->vma
12938
0
          + sgot->output_offset + offset, hit_data);
12939
12940
    /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12941
0
    arm_elf_fill_funcdesc (output_bfd, info,
12942
0
               &eh->fdpic_cnts.funcdesc_offset,
12943
0
               dynindx, offset, addr, dynreloc_value, seg);
12944
0
        }
12945
0
      else
12946
0
        {
12947
0
    Elf_Internal_Rela outrel;
12948
12949
    /* Add a dynamic relocation.  */
12950
0
    outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_FUNCDESC);
12951
0
    outrel.r_offset = input_section->output_section->vma
12952
0
      + input_section->output_offset + rel->r_offset;
12953
0
    outrel.r_addend = 0;
12954
0
    elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12955
0
        }
12956
0
    }
12957
0
      }
12958
0
      *unresolved_reloc_p = false;
12959
0
      return bfd_reloc_ok;
12960
12961
0
    case R_ARM_THM_BF16:
12962
0
      {
12963
0
  bfd_vma relocation;
12964
0
  bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
12965
0
  bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
12966
12967
0
  if (globals->use_rel)
12968
0
    {
12969
0
      bfd_vma immA  = (upper_insn & 0x001f);
12970
0
      bfd_vma immB  = (lower_insn & 0x07fe) >> 1;
12971
0
      bfd_vma immC  = (lower_insn & 0x0800) >> 11;
12972
0
      addend  = (immA << 12);
12973
0
      addend |= (immB << 2);
12974
0
      addend |= (immC << 1);
12975
0
      addend |= 1;
12976
      /* Sign extend.  */
12977
0
      signed_addend = (addend & 0x10000) ? addend - (1 << 17) : addend;
12978
0
    }
12979
12980
0
  relocation  = value + signed_addend;
12981
0
  relocation -= (input_section->output_section->vma
12982
0
           + input_section->output_offset
12983
0
           + rel->r_offset);
12984
12985
  /* Put RELOCATION back into the insn.  */
12986
0
  {
12987
0
    bfd_vma immA = (relocation & 0x0001f000) >> 12;
12988
0
    bfd_vma immB = (relocation & 0x00000ffc) >> 2;
12989
0
    bfd_vma immC = (relocation & 0x00000002) >> 1;
12990
12991
0
    upper_insn = (upper_insn & 0xffe0) | immA;
12992
0
    lower_insn = (lower_insn & 0xf001) | (immC << 11) | (immB << 1);
12993
0
  }
12994
12995
  /* Put the relocated value back in the object file:  */
12996
0
  bfd_put_16 (input_bfd, upper_insn, hit_data);
12997
0
  bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
12998
12999
0
  return bfd_reloc_ok;
13000
0
      }
13001
13002
0
    case R_ARM_THM_BF12:
13003
0
      {
13004
0
  bfd_vma relocation;
13005
0
  bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
13006
0
  bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
13007
13008
0
  if (globals->use_rel)
13009
0
    {
13010
0
      bfd_vma immA  = (upper_insn & 0x0001);
13011
0
      bfd_vma immB  = (lower_insn & 0x07fe) >> 1;
13012
0
      bfd_vma immC  = (lower_insn & 0x0800) >> 11;
13013
0
      addend  = (immA << 12);
13014
0
      addend |= (immB << 2);
13015
0
      addend |= (immC << 1);
13016
0
      addend |= 1;
13017
      /* Sign extend.  */
13018
0
      addend = (addend & 0x1000) ? addend - (1 << 13) : addend;
13019
0
      signed_addend = addend;
13020
0
    }
13021
13022
0
  relocation  = value + signed_addend;
13023
0
  relocation -= (input_section->output_section->vma
13024
0
           + input_section->output_offset
13025
0
           + rel->r_offset);
13026
13027
  /* Put RELOCATION back into the insn.  */
13028
0
  {
13029
0
    bfd_vma immA = (relocation & 0x00001000) >> 12;
13030
0
    bfd_vma immB = (relocation & 0x00000ffc) >> 2;
13031
0
    bfd_vma immC = (relocation & 0x00000002) >> 1;
13032
13033
0
    upper_insn = (upper_insn & 0xfffe) | immA;
13034
0
    lower_insn = (lower_insn & 0xf001) | (immC << 11) | (immB << 1);
13035
0
  }
13036
13037
  /* Put the relocated value back in the object file:  */
13038
0
  bfd_put_16 (input_bfd, upper_insn, hit_data);
13039
0
  bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
13040
13041
0
  return bfd_reloc_ok;
13042
0
      }
13043
13044
0
    case R_ARM_THM_BF18:
13045
0
      {
13046
0
  bfd_vma relocation;
13047
0
  bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
13048
0
  bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
13049
13050
0
  if (globals->use_rel)
13051
0
    {
13052
0
      bfd_vma immA  = (upper_insn & 0x007f);
13053
0
      bfd_vma immB  = (lower_insn & 0x07fe) >> 1;
13054
0
      bfd_vma immC  = (lower_insn & 0x0800) >> 11;
13055
0
      addend  = (immA << 12);
13056
0
      addend |= (immB << 2);
13057
0
      addend |= (immC << 1);
13058
0
      addend |= 1;
13059
      /* Sign extend.  */
13060
0
      addend = (addend & 0x40000) ? addend - (1 << 19) : addend;
13061
0
      signed_addend = addend;
13062
0
    }
13063
13064
0
  relocation  = value + signed_addend;
13065
0
  relocation -= (input_section->output_section->vma
13066
0
           + input_section->output_offset
13067
0
           + rel->r_offset);
13068
13069
  /* Put RELOCATION back into the insn.  */
13070
0
  {
13071
0
    bfd_vma immA = (relocation & 0x0007f000) >> 12;
13072
0
    bfd_vma immB = (relocation & 0x00000ffc) >> 2;
13073
0
    bfd_vma immC = (relocation & 0x00000002) >> 1;
13074
13075
0
    upper_insn = (upper_insn & 0xff80) | immA;
13076
0
    lower_insn = (lower_insn & 0xf001) | (immC << 11) | (immB << 1);
13077
0
  }
13078
13079
  /* Put the relocated value back in the object file:  */
13080
0
  bfd_put_16 (input_bfd, upper_insn, hit_data);
13081
0
  bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
13082
13083
0
  return bfd_reloc_ok;
13084
0
      }
13085
13086
0
    default:
13087
0
      return bfd_reloc_notsupported;
13088
0
    }
13089
0
}
13090
13091
/* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
13092
static void
13093
arm_add_to_rel (bfd *      abfd,
13094
    bfd_byte *     address,
13095
    reloc_howto_type * howto,
13096
    bfd_signed_vma     increment)
13097
0
{
13098
0
  bfd_signed_vma addend;
13099
13100
0
  if (howto->type == R_ARM_THM_CALL
13101
0
      || howto->type == R_ARM_THM_JUMP24)
13102
0
    {
13103
0
      int upper_insn, lower_insn;
13104
0
      int upper, lower;
13105
13106
0
      upper_insn = bfd_get_16 (abfd, address);
13107
0
      lower_insn = bfd_get_16 (abfd, address + 2);
13108
0
      upper = upper_insn & 0x7ff;
13109
0
      lower = lower_insn & 0x7ff;
13110
13111
0
      addend = (upper << 12) | (lower << 1);
13112
0
      addend += increment;
13113
0
      addend >>= 1;
13114
13115
0
      upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
13116
0
      lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
13117
13118
0
      bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
13119
0
      bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
13120
0
    }
13121
0
  else
13122
0
    {
13123
0
      bfd_vma      contents;
13124
13125
0
      contents = bfd_get_32 (abfd, address);
13126
13127
      /* Get the (signed) value from the instruction.  */
13128
0
      addend = contents & howto->src_mask;
13129
0
      if (addend & ((howto->src_mask + 1) >> 1))
13130
0
  {
13131
0
    bfd_signed_vma mask;
13132
13133
0
    mask = -1;
13134
0
    mask &= ~ howto->src_mask;
13135
0
    addend |= mask;
13136
0
  }
13137
13138
      /* Add in the increment, (which is a byte value).  */
13139
0
      switch (howto->type)
13140
0
  {
13141
0
  default:
13142
0
    addend += increment;
13143
0
    break;
13144
13145
0
  case R_ARM_PC24:
13146
0
  case R_ARM_PLT32:
13147
0
  case R_ARM_CALL:
13148
0
  case R_ARM_JUMP24:
13149
0
    addend *= bfd_get_reloc_size (howto);
13150
0
    addend += increment;
13151
13152
    /* Should we check for overflow here ?  */
13153
13154
    /* Drop any undesired bits.  */
13155
0
    addend >>= howto->rightshift;
13156
0
    break;
13157
0
  }
13158
13159
0
      contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
13160
13161
0
      bfd_put_32 (abfd, contents, address);
13162
0
    }
13163
0
}
13164
13165
#define IS_ARM_TLS_RELOC(R_TYPE)  \
13166
0
  ((R_TYPE) == R_ARM_TLS_GD32    \
13167
0
   || (R_TYPE) == R_ARM_TLS_GD32_FDPIC  \
13168
0
   || (R_TYPE) == R_ARM_TLS_LDO32  \
13169
0
   || (R_TYPE) == R_ARM_TLS_LDM32  \
13170
0
   || (R_TYPE) == R_ARM_TLS_LDM32_FDPIC  \
13171
0
   || (R_TYPE) == R_ARM_TLS_DTPOFF32  \
13172
0
   || (R_TYPE) == R_ARM_TLS_DTPMOD32  \
13173
0
   || (R_TYPE) == R_ARM_TLS_TPOFF32  \
13174
0
   || (R_TYPE) == R_ARM_TLS_LE32  \
13175
0
   || (R_TYPE) == R_ARM_TLS_IE32  \
13176
0
   || (R_TYPE) == R_ARM_TLS_IE32_FDPIC  \
13177
0
   || IS_ARM_TLS_GNU_RELOC (R_TYPE))
13178
13179
/* Specific set of relocations for the gnu tls dialect.  */
13180
#define IS_ARM_TLS_GNU_RELOC(R_TYPE)  \
13181
0
  ((R_TYPE) == R_ARM_TLS_GOTDESC  \
13182
0
   || (R_TYPE) == R_ARM_TLS_CALL  \
13183
0
   || (R_TYPE) == R_ARM_THM_TLS_CALL  \
13184
0
   || (R_TYPE) == R_ARM_TLS_DESCSEQ  \
13185
0
   || (R_TYPE) == R_ARM_THM_TLS_DESCSEQ)
13186
13187
/* Relocate an ARM ELF section.  */
13188
13189
static int
13190
elf32_arm_relocate_section (bfd *      output_bfd,
13191
          struct bfd_link_info * info,
13192
          bfd *      input_bfd,
13193
          asection *       input_section,
13194
          bfd_byte *       contents,
13195
          Elf_Internal_Rela *    relocs,
13196
          Elf_Internal_Sym *     local_syms,
13197
          asection **      local_sections)
13198
0
{
13199
0
  Elf_Internal_Shdr *symtab_hdr;
13200
0
  struct elf_link_hash_entry **sym_hashes;
13201
0
  Elf_Internal_Rela *rel;
13202
0
  Elf_Internal_Rela *relend;
13203
0
  const char *name;
13204
0
  struct elf32_arm_link_hash_table * globals;
13205
13206
0
  globals = elf32_arm_hash_table (info);
13207
0
  if (globals == NULL)
13208
0
    return false;
13209
13210
0
  symtab_hdr = & elf_symtab_hdr (input_bfd);
13211
0
  sym_hashes = elf_sym_hashes (input_bfd);
13212
13213
0
  rel = relocs;
13214
0
  relend = relocs + input_section->reloc_count;
13215
0
  for (; rel < relend; rel++)
13216
0
    {
13217
0
      int        r_type;
13218
0
      reloc_howto_type *     howto;
13219
0
      unsigned long      r_symndx;
13220
0
      Elf_Internal_Sym *     sym;
13221
0
      asection *       sec;
13222
0
      struct elf_link_hash_entry * h;
13223
0
      bfd_vma        relocation;
13224
0
      bfd_reloc_status_type    r;
13225
0
      arelent        bfd_reloc;
13226
0
      char         sym_type;
13227
0
      bool         unresolved_reloc = false;
13228
0
      char *error_message = NULL;
13229
13230
0
      r_symndx = ELF32_R_SYM (rel->r_info);
13231
0
      r_type   = ELF32_R_TYPE (rel->r_info);
13232
0
      r_type   = arm_real_reloc_type (globals, r_type);
13233
13234
0
      if (   r_type == R_ARM_GNU_VTENTRY
13235
0
    || r_type == R_ARM_GNU_VTINHERIT)
13236
0
  continue;
13237
13238
0
      howto = bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
13239
13240
0
      if (howto == NULL)
13241
0
  return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
13242
13243
0
      h = NULL;
13244
0
      sym = NULL;
13245
0
      sec = NULL;
13246
13247
0
      if (r_symndx < symtab_hdr->sh_info)
13248
0
  {
13249
0
    sym = local_syms + r_symndx;
13250
0
    sym_type = ELF32_ST_TYPE (sym->st_info);
13251
0
    sec = local_sections[r_symndx];
13252
13253
    /* An object file might have a reference to a local
13254
       undefined symbol.  This is a daft object file, but we
13255
       should at least do something about it.  V4BX & NONE
13256
       relocations do not use the symbol and are explicitly
13257
       allowed to use the undefined symbol, so allow those.
13258
       Likewise for relocations against STN_UNDEF.  */
13259
0
    if (r_type != R_ARM_V4BX
13260
0
        && r_type != R_ARM_NONE
13261
0
        && r_symndx != STN_UNDEF
13262
0
        && bfd_is_und_section (sec)
13263
0
        && ELF_ST_BIND (sym->st_info) != STB_WEAK)
13264
0
      (*info->callbacks->undefined_symbol)
13265
0
        (info, bfd_elf_string_from_elf_section
13266
0
         (input_bfd, symtab_hdr->sh_link, sym->st_name),
13267
0
         input_bfd, input_section,
13268
0
         rel->r_offset, true);
13269
13270
0
    if (globals->use_rel)
13271
0
      {
13272
0
        relocation = (sec->output_section->vma
13273
0
          + sec->output_offset
13274
0
          + sym->st_value);
13275
0
        if (!bfd_link_relocatable (info)
13276
0
      && (sec->flags & SEC_MERGE)
13277
0
      && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13278
0
    {
13279
0
      asection *msec;
13280
0
      bfd_vma addend, value;
13281
13282
0
      switch (r_type)
13283
0
        {
13284
0
        case R_ARM_MOVW_ABS_NC:
13285
0
        case R_ARM_MOVT_ABS:
13286
0
          value = bfd_get_32 (input_bfd, contents + rel->r_offset);
13287
0
          addend = ((value & 0xf0000) >> 4) | (value & 0xfff);
13288
0
          addend = (addend ^ 0x8000) - 0x8000;
13289
0
          break;
13290
13291
0
        case R_ARM_THM_MOVW_ABS_NC:
13292
0
        case R_ARM_THM_MOVT_ABS:
13293
0
          value = bfd_get_16 (input_bfd, contents + rel->r_offset)
13294
0
            << 16;
13295
0
          value |= bfd_get_16 (input_bfd,
13296
0
             contents + rel->r_offset + 2);
13297
0
          addend = ((value & 0xf7000) >> 4) | (value & 0xff)
13298
0
             | ((value & 0x04000000) >> 15);
13299
0
          addend = (addend ^ 0x8000) - 0x8000;
13300
0
          break;
13301
13302
0
        default:
13303
0
          if (howto->rightshift
13304
0
        || (howto->src_mask & (howto->src_mask + 1)))
13305
0
      {
13306
0
        _bfd_error_handler
13307
          /* xgettext:c-format */
13308
0
          (_("%pB(%pA+%#" PRIx64 "): "
13309
0
             "%s relocation against SEC_MERGE section"),
13310
0
           input_bfd, input_section,
13311
0
           (uint64_t) rel->r_offset, howto->name);
13312
0
        return false;
13313
0
      }
13314
13315
0
          value = bfd_get_32 (input_bfd, contents + rel->r_offset);
13316
13317
          /* Get the (signed) value from the instruction.  */
13318
0
          addend = value & howto->src_mask;
13319
0
          if (addend & ((howto->src_mask + 1) >> 1))
13320
0
      {
13321
0
        bfd_signed_vma mask;
13322
13323
0
        mask = -1;
13324
0
        mask &= ~ howto->src_mask;
13325
0
        addend |= mask;
13326
0
      }
13327
0
          break;
13328
0
        }
13329
13330
0
      msec = sec;
13331
0
      addend =
13332
0
        _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
13333
0
        - relocation;
13334
0
      addend += msec->output_section->vma + msec->output_offset;
13335
13336
      /* Cases here must match those in the preceding
13337
         switch statement.  */
13338
0
      switch (r_type)
13339
0
        {
13340
0
        case R_ARM_MOVW_ABS_NC:
13341
0
        case R_ARM_MOVT_ABS:
13342
0
          value = (value & 0xfff0f000) | ((addend & 0xf000) << 4)
13343
0
            | (addend & 0xfff);
13344
0
          bfd_put_32 (input_bfd, value, contents + rel->r_offset);
13345
0
          break;
13346
13347
0
        case R_ARM_THM_MOVW_ABS_NC:
13348
0
        case R_ARM_THM_MOVT_ABS:
13349
0
          value = (value & 0xfbf08f00) | ((addend & 0xf700) << 4)
13350
0
            | (addend & 0xff) | ((addend & 0x0800) << 15);
13351
0
          bfd_put_16 (input_bfd, value >> 16,
13352
0
          contents + rel->r_offset);
13353
0
          bfd_put_16 (input_bfd, value,
13354
0
          contents + rel->r_offset + 2);
13355
0
          break;
13356
13357
0
        default:
13358
0
          value = (value & ~ howto->dst_mask)
13359
0
            | (addend & howto->dst_mask);
13360
0
          bfd_put_32 (input_bfd, value, contents + rel->r_offset);
13361
0
          break;
13362
0
        }
13363
0
    }
13364
0
      }
13365
0
    else
13366
0
      relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
13367
0
  }
13368
0
      else
13369
0
  {
13370
0
    bool warned, ignored;
13371
13372
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13373
0
           r_symndx, symtab_hdr, sym_hashes,
13374
0
           h, sec, relocation,
13375
0
           unresolved_reloc, warned, ignored);
13376
13377
0
    sym_type = h->type;
13378
0
  }
13379
13380
0
      if (sec != NULL && discarded_section (sec))
13381
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
13382
0
           rel, 1, relend, howto, 0, contents);
13383
13384
0
      if (bfd_link_relocatable (info))
13385
0
  {
13386
    /* This is a relocatable link.  We don't have to change
13387
       anything, unless the reloc is against a section symbol,
13388
       in which case we have to adjust according to where the
13389
       section symbol winds up in the output section.  */
13390
0
    if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13391
0
      {
13392
0
        if (globals->use_rel)
13393
0
    arm_add_to_rel (input_bfd, contents + rel->r_offset,
13394
0
        howto, (bfd_signed_vma) sec->output_offset);
13395
0
        else
13396
0
    rel->r_addend += sec->output_offset;
13397
0
      }
13398
0
    continue;
13399
0
  }
13400
13401
0
      if (h != NULL)
13402
0
  name = h->root.root.string;
13403
0
      else
13404
0
  {
13405
0
    name = (bfd_elf_string_from_elf_section
13406
0
      (input_bfd, symtab_hdr->sh_link, sym->st_name));
13407
0
    if (name == NULL || *name == '\0')
13408
0
      name = bfd_section_name (sec);
13409
0
  }
13410
13411
0
      if (r_symndx != STN_UNDEF
13412
0
    && r_type != R_ARM_NONE
13413
0
    && (h == NULL
13414
0
        || h->root.type == bfd_link_hash_defined
13415
0
        || h->root.type == bfd_link_hash_defweak)
13416
0
    && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
13417
0
  {
13418
0
    _bfd_error_handler
13419
0
      ((sym_type == STT_TLS
13420
        /* xgettext:c-format */
13421
0
        ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
13422
        /* xgettext:c-format */
13423
0
        : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
13424
0
       input_bfd,
13425
0
       input_section,
13426
0
       (uint64_t) rel->r_offset,
13427
0
       howto->name,
13428
0
       name);
13429
0
  }
13430
13431
      /* We call elf32_arm_final_link_relocate unless we're completely
13432
   done, i.e., the relaxation produced the final output we want,
13433
   and we won't let anybody mess with it. Also, we have to do
13434
   addend adjustments in case of a R_ARM_TLS_GOTDESC relocation
13435
   both in relaxed and non-relaxed cases.  */
13436
0
      if ((elf32_arm_tls_transition (info, r_type, h) != (unsigned)r_type)
13437
0
    || (IS_ARM_TLS_GNU_RELOC (r_type)
13438
0
        && !((h ? elf32_arm_hash_entry (h)->tls_type :
13439
0
        elf32_arm_local_got_tls_type (input_bfd)[r_symndx])
13440
0
       & GOT_TLS_GDESC)))
13441
0
  {
13442
0
    r = elf32_arm_tls_relax (globals, input_bfd, input_section,
13443
0
           contents, rel, h == NULL);
13444
    /* This may have been marked unresolved because it came from
13445
       a shared library.  But we've just dealt with that.  */
13446
0
    unresolved_reloc = 0;
13447
0
  }
13448
0
      else
13449
0
  r = bfd_reloc_continue;
13450
13451
0
      if (r == bfd_reloc_continue)
13452
0
  {
13453
0
    unsigned char branch_type =
13454
0
      h ? ARM_GET_SYM_BRANCH_TYPE (h->target_internal)
13455
0
        : ARM_GET_SYM_BRANCH_TYPE (sym->st_target_internal);
13456
13457
0
    r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
13458
0
               input_section, contents, rel,
13459
0
               relocation, info, sec, name,
13460
0
               sym_type, branch_type, h,
13461
0
               &unresolved_reloc,
13462
0
               &error_message);
13463
0
  }
13464
13465
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
13466
   because such sections are not SEC_ALLOC and thus ld.so will
13467
   not process them.  */
13468
0
      if (unresolved_reloc
13469
0
    && !((input_section->flags & SEC_DEBUGGING) != 0
13470
0
         && h->def_dynamic)
13471
0
    && _bfd_elf_section_offset (output_bfd, info, input_section,
13472
0
              rel->r_offset) != (bfd_vma) -1)
13473
0
  {
13474
0
    _bfd_error_handler
13475
      /* xgettext:c-format */
13476
0
      (_("%pB(%pA+%#" PRIx64 "): "
13477
0
         "unresolvable %s relocation against symbol `%s'"),
13478
0
       input_bfd,
13479
0
       input_section,
13480
0
       (uint64_t) rel->r_offset,
13481
0
       howto->name,
13482
0
       h->root.root.string);
13483
0
    return false;
13484
0
  }
13485
13486
0
      if (r != bfd_reloc_ok)
13487
0
  {
13488
0
    switch (r)
13489
0
      {
13490
0
      case bfd_reloc_overflow:
13491
        /* If the overflowing reloc was to an undefined symbol,
13492
     we have already printed one error message and there
13493
     is no point complaining again.  */
13494
0
        if (!h || h->root.type != bfd_link_hash_undefined)
13495
0
    (*info->callbacks->reloc_overflow)
13496
0
      (info, (h ? &h->root : NULL), name, howto->name,
13497
0
       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
13498
0
        break;
13499
13500
0
      case bfd_reloc_undefined:
13501
0
        (*info->callbacks->undefined_symbol)
13502
0
    (info, name, input_bfd, input_section, rel->r_offset, true);
13503
0
        break;
13504
13505
0
      case bfd_reloc_outofrange:
13506
0
        error_message = _("out of range");
13507
0
        goto common_error;
13508
13509
0
      case bfd_reloc_notsupported:
13510
0
        error_message = _("unsupported relocation");
13511
0
        goto common_error;
13512
13513
0
      case bfd_reloc_dangerous:
13514
        /* error_message should already be set.  */
13515
0
        goto common_error;
13516
13517
0
      default:
13518
0
        error_message = _("unknown error");
13519
        /* Fall through.  */
13520
13521
0
      common_error:
13522
0
        BFD_ASSERT (error_message != NULL);
13523
0
        (*info->callbacks->reloc_dangerous)
13524
0
    (info, error_message, input_bfd, input_section, rel->r_offset);
13525
0
        break;
13526
0
      }
13527
0
  }
13528
0
    }
13529
13530
0
  return true;
13531
0
}
13532
13533
/* Add a new unwind edit to the list described by HEAD, TAIL.  If TINDEX is zero,
13534
   adds the edit to the start of the list.  (The list must be built in order of
13535
   ascending TINDEX: the function's callers are primarily responsible for
13536
   maintaining that condition).  */
13537
13538
static void
13539
add_unwind_table_edit (arm_unwind_table_edit **head,
13540
           arm_unwind_table_edit **tail,
13541
           arm_unwind_edit_type type,
13542
           asection *linked_section,
13543
           unsigned int tindex)
13544
0
{
13545
0
  arm_unwind_table_edit *new_edit = (arm_unwind_table_edit *)
13546
0
      xmalloc (sizeof (arm_unwind_table_edit));
13547
13548
0
  new_edit->type = type;
13549
0
  new_edit->linked_section = linked_section;
13550
0
  new_edit->index = tindex;
13551
13552
0
  if (tindex > 0)
13553
0
    {
13554
0
      new_edit->next = NULL;
13555
13556
0
      if (*tail)
13557
0
  (*tail)->next = new_edit;
13558
13559
0
      (*tail) = new_edit;
13560
13561
0
      if (!*head)
13562
0
  (*head) = new_edit;
13563
0
    }
13564
0
  else
13565
0
    {
13566
0
      new_edit->next = *head;
13567
13568
0
      if (!*tail)
13569
0
  *tail = new_edit;
13570
13571
0
      *head = new_edit;
13572
0
    }
13573
0
}
13574
13575
static _arm_elf_section_data *get_arm_elf_section_data (asection *);
13576
13577
/* Increase the size of EXIDX_SEC by ADJUST bytes.  ADJUST mau be negative.  */
13578
13579
static void
13580
adjust_exidx_size (asection *exidx_sec, int adjust)
13581
0
{
13582
0
  asection *out_sec;
13583
13584
0
  if (!exidx_sec->rawsize)
13585
0
    exidx_sec->rawsize = exidx_sec->size;
13586
13587
0
  bfd_set_section_size (exidx_sec, exidx_sec->size + adjust);
13588
0
  out_sec = exidx_sec->output_section;
13589
  /* Adjust size of output section.  */
13590
0
  bfd_set_section_size (out_sec, out_sec->size + adjust);
13591
0
}
13592
13593
/* Insert an EXIDX_CANTUNWIND marker at the end of a section.  */
13594
13595
static void
13596
insert_cantunwind_after (asection *text_sec, asection *exidx_sec)
13597
0
{
13598
0
  struct _arm_elf_section_data *exidx_arm_data;
13599
13600
0
  exidx_arm_data = get_arm_elf_section_data (exidx_sec);
13601
0
  add_unwind_table_edit
13602
0
    (&exidx_arm_data->u.exidx.unwind_edit_list,
13603
0
     &exidx_arm_data->u.exidx.unwind_edit_tail,
13604
0
     INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX);
13605
13606
0
  exidx_arm_data->additional_reloc_count++;
13607
13608
0
  adjust_exidx_size (exidx_sec, 8);
13609
0
}
13610
13611
/* Scan .ARM.exidx tables, and create a list describing edits which should be
13612
   made to those tables, such that:
13613
13614
     1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries.
13615
     2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind
13616
  codes which have been inlined into the index).
13617
13618
   If MERGE_EXIDX_ENTRIES is false, duplicate entries are not merged.
13619
13620
   The edits are applied when the tables are written
13621
   (in elf32_arm_write_section).  */
13622
13623
bool
13624
elf32_arm_fix_exidx_coverage (asection **text_section_order,
13625
            unsigned int num_text_sections,
13626
            struct bfd_link_info *info,
13627
            bool merge_exidx_entries)
13628
0
{
13629
0
  bfd *inp;
13630
0
  unsigned int last_second_word = 0, i;
13631
0
  asection *last_exidx_sec = NULL;
13632
0
  asection *last_text_sec = NULL;
13633
0
  int last_unwind_type = -1;
13634
13635
  /* Walk over all EXIDX sections, and create backlinks from the corrsponding
13636
     text sections.  */
13637
0
  for (inp = info->input_bfds; inp != NULL; inp = inp->link.next)
13638
0
    {
13639
0
      asection *sec;
13640
13641
0
      for (sec = inp->sections; sec != NULL; sec = sec->next)
13642
0
  {
13643
0
    struct bfd_elf_section_data *elf_sec = elf_section_data (sec);
13644
0
    Elf_Internal_Shdr *hdr = &elf_sec->this_hdr;
13645
13646
0
    if (!hdr || hdr->sh_type != SHT_ARM_EXIDX)
13647
0
      continue;
13648
13649
0
    if (elf_sec->linked_to)
13650
0
      {
13651
0
        Elf_Internal_Shdr *linked_hdr
13652
0
    = &elf_section_data (elf_sec->linked_to)->this_hdr;
13653
0
        struct _arm_elf_section_data *linked_sec_arm_data
13654
0
    = get_arm_elf_section_data (linked_hdr->bfd_section);
13655
13656
0
        if (linked_sec_arm_data == NULL)
13657
0
    continue;
13658
13659
        /* Link this .ARM.exidx section back from the text section it
13660
     describes.  */
13661
0
        linked_sec_arm_data->u.text.arm_exidx_sec = sec;
13662
0
      }
13663
0
  }
13664
0
    }
13665
13666
  /* Walk all text sections in order of increasing VMA.  Eilminate duplicate
13667
     index table entries (EXIDX_CANTUNWIND and inlined unwind opcodes),
13668
     and add EXIDX_CANTUNWIND entries for sections with no unwind table data.  */
13669
13670
0
  for (i = 0; i < num_text_sections; i++)
13671
0
    {
13672
0
      asection *sec = text_section_order[i];
13673
0
      asection *exidx_sec;
13674
0
      struct _arm_elf_section_data *arm_data = get_arm_elf_section_data (sec);
13675
0
      struct _arm_elf_section_data *exidx_arm_data;
13676
0
      bfd_byte *contents = NULL;
13677
0
      int deleted_exidx_bytes = 0;
13678
0
      bfd_vma j;
13679
0
      arm_unwind_table_edit *unwind_edit_head = NULL;
13680
0
      arm_unwind_table_edit *unwind_edit_tail = NULL;
13681
0
      Elf_Internal_Shdr *hdr;
13682
0
      bfd *ibfd;
13683
13684
0
      if (arm_data == NULL)
13685
0
  continue;
13686
13687
0
      exidx_sec = arm_data->u.text.arm_exidx_sec;
13688
0
      if (exidx_sec == NULL)
13689
0
  {
13690
    /* Section has no unwind data.  */
13691
0
    if (last_unwind_type == 0 || !last_exidx_sec)
13692
0
      continue;
13693
13694
    /* Ignore zero sized sections.  */
13695
0
    if (sec->size == 0)
13696
0
      continue;
13697
13698
0
    insert_cantunwind_after (last_text_sec, last_exidx_sec);
13699
0
    last_unwind_type = 0;
13700
0
    continue;
13701
0
  }
13702
13703
      /* Skip /DISCARD/ sections.  */
13704
0
      if (bfd_is_abs_section (exidx_sec->output_section))
13705
0
  continue;
13706
13707
0
      hdr = &elf_section_data (exidx_sec)->this_hdr;
13708
0
      if (hdr->sh_type != SHT_ARM_EXIDX)
13709
0
  continue;
13710
13711
0
      exidx_arm_data = get_arm_elf_section_data (exidx_sec);
13712
0
      if (exidx_arm_data == NULL)
13713
0
  continue;
13714
13715
0
      ibfd = exidx_sec->owner;
13716
13717
0
      if (hdr->contents != NULL)
13718
0
  contents = hdr->contents;
13719
0
      else if (! bfd_malloc_and_get_section (ibfd, exidx_sec, &contents))
13720
  /* An error?  */
13721
0
  continue;
13722
13723
0
      if (last_unwind_type > 0)
13724
0
  {
13725
0
    unsigned int first_word = bfd_get_32 (ibfd, contents);
13726
    /* Add cantunwind if first unwind item does not match section
13727
       start.  */
13728
0
    if (first_word != sec->vma)
13729
0
      {
13730
0
        insert_cantunwind_after (last_text_sec, last_exidx_sec);
13731
0
        last_unwind_type = 0;
13732
0
      }
13733
0
  }
13734
13735
0
      for (j = 0; j < hdr->sh_size; j += 8)
13736
0
  {
13737
0
    unsigned int second_word = bfd_get_32 (ibfd, contents + j + 4);
13738
0
    int unwind_type;
13739
0
    int elide = 0;
13740
13741
    /* An EXIDX_CANTUNWIND entry.  */
13742
0
    if (second_word == 1)
13743
0
      {
13744
0
        if (last_unwind_type == 0)
13745
0
    elide = 1;
13746
0
        unwind_type = 0;
13747
0
      }
13748
    /* Inlined unwinding data.  Merge if equal to previous.  */
13749
0
    else if ((second_word & 0x80000000) != 0)
13750
0
      {
13751
0
        if (merge_exidx_entries
13752
0
       && last_second_word == second_word && last_unwind_type == 1)
13753
0
    elide = 1;
13754
0
        unwind_type = 1;
13755
0
        last_second_word = second_word;
13756
0
      }
13757
    /* Normal table entry.  In theory we could merge these too,
13758
       but duplicate entries are likely to be much less common.  */
13759
0
    else
13760
0
      unwind_type = 2;
13761
13762
0
    if (elide && !bfd_link_relocatable (info))
13763
0
      {
13764
0
        add_unwind_table_edit (&unwind_edit_head, &unwind_edit_tail,
13765
0
             DELETE_EXIDX_ENTRY, NULL, j / 8);
13766
13767
0
        deleted_exidx_bytes += 8;
13768
0
      }
13769
13770
0
    last_unwind_type = unwind_type;
13771
0
  }
13772
13773
      /* Free contents if we allocated it ourselves.  */
13774
0
      if (contents != hdr->contents)
13775
0
  free (contents);
13776
13777
      /* Record edits to be applied later (in elf32_arm_write_section).  */
13778
0
      exidx_arm_data->u.exidx.unwind_edit_list = unwind_edit_head;
13779
0
      exidx_arm_data->u.exidx.unwind_edit_tail = unwind_edit_tail;
13780
13781
0
      if (deleted_exidx_bytes > 0)
13782
0
  adjust_exidx_size (exidx_sec, - deleted_exidx_bytes);
13783
13784
0
      last_exidx_sec = exidx_sec;
13785
0
      last_text_sec = sec;
13786
0
    }
13787
13788
  /* Add terminating CANTUNWIND entry.  */
13789
0
  if (!bfd_link_relocatable (info) && last_exidx_sec
13790
0
      && last_unwind_type != 0)
13791
0
    insert_cantunwind_after (last_text_sec, last_exidx_sec);
13792
13793
0
  return true;
13794
0
}
13795
13796
static bool
13797
elf32_arm_output_glue_section (struct bfd_link_info *info, bfd *obfd,
13798
             bfd *ibfd, const char *name)
13799
0
{
13800
0
  asection *sec, *osec;
13801
13802
0
  sec = bfd_get_linker_section (ibfd, name);
13803
0
  if (sec == NULL || (sec->flags & SEC_EXCLUDE) != 0)
13804
0
    return true;
13805
13806
0
  osec = sec->output_section;
13807
0
  if (elf32_arm_write_section (obfd, info, sec, sec->contents))
13808
0
    return true;
13809
13810
0
  if (! bfd_set_section_contents (obfd, osec, sec->contents,
13811
0
          sec->output_offset, sec->size))
13812
0
    return false;
13813
13814
0
  return true;
13815
0
}
13816
13817
static bool
13818
elf32_arm_final_link (bfd *abfd, struct bfd_link_info *info)
13819
0
{
13820
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
13821
0
  asection *sec, *osec;
13822
13823
0
  if (globals == NULL)
13824
0
    return false;
13825
13826
  /* Invoke the regular ELF backend linker to do all the work.  */
13827
0
  if (!bfd_elf_final_link (abfd, info))
13828
0
    return false;
13829
13830
  /* Process stub sections (eg BE8 encoding, ...).  */
13831
0
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
13832
0
  unsigned int i;
13833
0
  for (i=0; i<htab->top_id; i++)
13834
0
    {
13835
0
      sec = htab->stub_group[i].stub_sec;
13836
      /* Only process it once, in its link_sec slot.  */
13837
0
      if (sec && i == htab->stub_group[i].link_sec->id)
13838
0
  {
13839
0
    osec = sec->output_section;
13840
0
    elf32_arm_write_section (abfd, info, sec, sec->contents);
13841
0
    if (! bfd_set_section_contents (abfd, osec, sec->contents,
13842
0
            sec->output_offset, sec->size))
13843
0
      return false;
13844
0
  }
13845
0
    }
13846
13847
  /* Write out any glue sections now that we have created all the
13848
     stubs.  */
13849
0
  if (globals->bfd_of_glue_owner != NULL)
13850
0
    {
13851
0
      if (! elf32_arm_output_glue_section (info, abfd,
13852
0
             globals->bfd_of_glue_owner,
13853
0
             ARM2THUMB_GLUE_SECTION_NAME))
13854
0
  return false;
13855
13856
0
      if (! elf32_arm_output_glue_section (info, abfd,
13857
0
             globals->bfd_of_glue_owner,
13858
0
             THUMB2ARM_GLUE_SECTION_NAME))
13859
0
  return false;
13860
13861
0
      if (! elf32_arm_output_glue_section (info, abfd,
13862
0
             globals->bfd_of_glue_owner,
13863
0
             VFP11_ERRATUM_VENEER_SECTION_NAME))
13864
0
  return false;
13865
13866
0
      if (! elf32_arm_output_glue_section (info, abfd,
13867
0
             globals->bfd_of_glue_owner,
13868
0
             STM32L4XX_ERRATUM_VENEER_SECTION_NAME))
13869
0
  return false;
13870
13871
0
      if (! elf32_arm_output_glue_section (info, abfd,
13872
0
             globals->bfd_of_glue_owner,
13873
0
             ARM_BX_GLUE_SECTION_NAME))
13874
0
  return false;
13875
0
    }
13876
13877
0
  return true;
13878
0
}
13879
13880
/* Return a best guess for the machine number based on the attributes.  */
13881
13882
static unsigned int
13883
bfd_arm_get_mach_from_attributes (bfd * abfd)
13884
6.83k
{
13885
6.83k
  int arch = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, Tag_CPU_arch);
13886
13887
6.83k
  switch (arch)
13888
6.83k
    {
13889
6.79k
    case TAG_CPU_ARCH_PRE_V4: return bfd_mach_arm_3M;
13890
0
    case TAG_CPU_ARCH_V4: return bfd_mach_arm_4;
13891
0
    case TAG_CPU_ARCH_V4T: return bfd_mach_arm_4T;
13892
0
    case TAG_CPU_ARCH_V5T: return bfd_mach_arm_5T;
13893
13894
0
    case TAG_CPU_ARCH_V5TE:
13895
0
      {
13896
0
  char * name;
13897
13898
0
  BFD_ASSERT (Tag_CPU_name < NUM_KNOWN_OBJ_ATTRIBUTES);
13899
0
  name = elf_known_obj_attributes (abfd) [OBJ_ATTR_PROC][Tag_CPU_name].s;
13900
13901
0
  if (name)
13902
0
    {
13903
0
      if (strcmp (name, "IWMMXT2") == 0)
13904
0
        return bfd_mach_arm_iWMMXt2;
13905
13906
0
      if (strcmp (name, "IWMMXT") == 0)
13907
0
        return bfd_mach_arm_iWMMXt;
13908
13909
0
      if (strcmp (name, "XSCALE") == 0)
13910
0
        {
13911
0
    int wmmx;
13912
13913
0
    BFD_ASSERT (Tag_WMMX_arch < NUM_KNOWN_OBJ_ATTRIBUTES);
13914
0
    wmmx = elf_known_obj_attributes (abfd) [OBJ_ATTR_PROC][Tag_WMMX_arch].i;
13915
0
    switch (wmmx)
13916
0
      {
13917
0
      case 1: return bfd_mach_arm_iWMMXt;
13918
0
      case 2: return bfd_mach_arm_iWMMXt2;
13919
0
      default: return bfd_mach_arm_XScale;
13920
0
      }
13921
0
        }
13922
0
    }
13923
13924
0
  return bfd_mach_arm_5TE;
13925
0
      }
13926
13927
0
    case TAG_CPU_ARCH_V5TEJ:
13928
0
  return bfd_mach_arm_5TEJ;
13929
40
    case TAG_CPU_ARCH_V6:
13930
40
  return bfd_mach_arm_6;
13931
0
    case TAG_CPU_ARCH_V6KZ:
13932
0
  return bfd_mach_arm_6KZ;
13933
0
    case TAG_CPU_ARCH_V6T2:
13934
0
  return bfd_mach_arm_6T2;
13935
0
    case TAG_CPU_ARCH_V6K:
13936
0
  return bfd_mach_arm_6K;
13937
0
    case TAG_CPU_ARCH_V7:
13938
0
  return bfd_mach_arm_7;
13939
0
    case TAG_CPU_ARCH_V6_M:
13940
0
  return bfd_mach_arm_6M;
13941
0
    case TAG_CPU_ARCH_V6S_M:
13942
0
  return bfd_mach_arm_6SM;
13943
0
    case TAG_CPU_ARCH_V7E_M:
13944
0
  return bfd_mach_arm_7EM;
13945
0
    case TAG_CPU_ARCH_V8:
13946
0
  return bfd_mach_arm_8;
13947
0
    case TAG_CPU_ARCH_V8R:
13948
0
  return bfd_mach_arm_8R;
13949
0
    case TAG_CPU_ARCH_V8M_BASE:
13950
0
  return bfd_mach_arm_8M_BASE;
13951
0
    case TAG_CPU_ARCH_V8M_MAIN:
13952
0
  return bfd_mach_arm_8M_MAIN;
13953
0
    case TAG_CPU_ARCH_V8_1M_MAIN:
13954
0
  return bfd_mach_arm_8_1M_MAIN;
13955
0
    case TAG_CPU_ARCH_V9:
13956
0
  return bfd_mach_arm_9;
13957
13958
0
    default:
13959
      /* Force entry to be added for any new known Tag_CPU_arch value.  */
13960
0
      BFD_ASSERT (arch > MAX_TAG_CPU_ARCH);
13961
13962
      /* Unknown Tag_CPU_arch value.  */
13963
0
      return bfd_mach_arm_unknown;
13964
6.83k
    }
13965
6.83k
}
13966
13967
/* Set the right machine number.  */
13968
13969
static bool
13970
elf32_arm_object_p (bfd *abfd)
13971
6.83k
{
13972
6.83k
  unsigned int mach;
13973
13974
6.83k
  mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
13975
13976
6.83k
  if (mach == bfd_mach_arm_unknown)
13977
6.83k
    mach = bfd_arm_get_mach_from_attributes (abfd);
13978
13979
6.83k
  bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
13980
6.83k
  return true;
13981
6.83k
}
13982
13983
/* Function to keep ARM specific flags in the ELF header.  */
13984
13985
static bool
13986
elf32_arm_set_private_flags (bfd *abfd, flagword flags)
13987
0
{
13988
0
  if (elf_flags_init (abfd)
13989
0
      && elf_elfheader (abfd)->e_flags != flags)
13990
0
    {
13991
0
      if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
13992
0
  {
13993
0
    if (flags & EF_ARM_INTERWORK)
13994
0
      _bfd_error_handler
13995
0
        (_("warning: not setting interworking flag of %pB since it has already been specified as non-interworking"),
13996
0
         abfd);
13997
0
    else
13998
0
      _bfd_error_handler
13999
0
        (_("warning: clearing the interworking flag of %pB due to outside request"),
14000
0
         abfd);
14001
0
  }
14002
0
    }
14003
0
  else
14004
0
    {
14005
0
      elf_elfheader (abfd)->e_flags = flags;
14006
0
      elf_flags_init (abfd) = true;
14007
0
    }
14008
14009
0
  return true;
14010
0
}
14011
14012
/* Copy backend specific data from one object module to another.  */
14013
14014
static bool
14015
elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
14016
2
{
14017
2
  flagword in_flags;
14018
2
  flagword out_flags;
14019
14020
2
  if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
14021
0
    return true;
14022
14023
2
  in_flags  = elf_elfheader (ibfd)->e_flags;
14024
2
  out_flags = elf_elfheader (obfd)->e_flags;
14025
14026
2
  if (elf_flags_init (obfd)
14027
2
      && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
14028
2
      && in_flags != out_flags)
14029
0
    {
14030
      /* Cannot mix APCS26 and APCS32 code.  */
14031
0
      if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
14032
0
  return false;
14033
14034
      /* Cannot mix float APCS and non-float APCS code.  */
14035
0
      if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
14036
0
  return false;
14037
14038
      /* If the src and dest have different interworking flags
14039
   then turn off the interworking bit.  */
14040
0
      if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
14041
0
  {
14042
0
    if (out_flags & EF_ARM_INTERWORK)
14043
0
      _bfd_error_handler
14044
0
        (_("warning: clearing the interworking flag of %pB because non-interworking code in %pB has been linked with it"),
14045
0
         obfd, ibfd);
14046
14047
0
    in_flags &= ~EF_ARM_INTERWORK;
14048
0
  }
14049
14050
      /* Likewise for PIC, though don't warn for this case.  */
14051
0
      if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
14052
0
  in_flags &= ~EF_ARM_PIC;
14053
0
    }
14054
14055
2
  elf_elfheader (obfd)->e_flags = in_flags;
14056
2
  elf_flags_init (obfd) = true;
14057
14058
2
  return _bfd_elf_copy_private_bfd_data (ibfd, obfd);
14059
2
}
14060
14061
/* Values for Tag_ABI_PCS_R9_use.  */
14062
enum
14063
{
14064
  AEABI_R9_V6,
14065
  AEABI_R9_SB,
14066
  AEABI_R9_TLS,
14067
  AEABI_R9_unused
14068
};
14069
14070
/* Values for Tag_ABI_PCS_RW_data.  */
14071
enum
14072
{
14073
  AEABI_PCS_RW_data_absolute,
14074
  AEABI_PCS_RW_data_PCrel,
14075
  AEABI_PCS_RW_data_SBrel,
14076
  AEABI_PCS_RW_data_unused
14077
};
14078
14079
/* Values for Tag_ABI_enum_size.  */
14080
enum
14081
{
14082
  AEABI_enum_unused,
14083
  AEABI_enum_short,
14084
  AEABI_enum_wide,
14085
  AEABI_enum_forced_wide
14086
};
14087
14088
/* Determine whether an object attribute tag takes an integer, a
14089
   string or both.  */
14090
14091
static int
14092
elf32_arm_obj_attrs_arg_type (int tag)
14093
1.27k
{
14094
1.27k
  if (tag == Tag_compatibility)
14095
0
    return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
14096
1.27k
  else if (tag == Tag_nodefaults)
14097
0
    return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_NO_DEFAULT;
14098
1.27k
  else if (tag == Tag_CPU_raw_name || tag == Tag_CPU_name)
14099
80
    return ATTR_TYPE_FLAG_STR_VAL;
14100
1.19k
  else if (tag < 32)
14101
1.12k
    return ATTR_TYPE_FLAG_INT_VAL;
14102
76
  else
14103
76
    return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
14104
1.27k
}
14105
14106
/* The ABI defines that Tag_conformance should be emitted first, and that
14107
   Tag_nodefaults should be second (if either is defined).  This sets those
14108
   two positions, and bumps up the position of all the remaining tags to
14109
   compensate.  */
14110
static int
14111
elf32_arm_obj_attrs_order (int num)
14112
0
{
14113
0
  if (num == LEAST_KNOWN_OBJ_ATTRIBUTE)
14114
0
    return Tag_conformance;
14115
0
  if (num == LEAST_KNOWN_OBJ_ATTRIBUTE + 1)
14116
0
    return Tag_nodefaults;
14117
0
  if ((num - 2) < Tag_nodefaults)
14118
0
    return num - 2;
14119
0
  if ((num - 1) < Tag_conformance)
14120
0
    return num - 1;
14121
0
  return num;
14122
0
}
14123
14124
/* Attribute numbers >=64 (mod 128) can be safely ignored.  */
14125
static bool
14126
elf32_arm_obj_attrs_handle_unknown (bfd *abfd, int tag)
14127
0
{
14128
0
  if ((tag & 127) < 64)
14129
0
    {
14130
0
      _bfd_error_handler
14131
0
  (_("%pB: unknown mandatory EABI object attribute %d"),
14132
0
   abfd, tag);
14133
0
      bfd_set_error (bfd_error_bad_value);
14134
0
      return false;
14135
0
    }
14136
0
  else
14137
0
    {
14138
0
      _bfd_error_handler
14139
0
  (_("warning: %pB: unknown EABI object attribute %d"),
14140
0
   abfd, tag);
14141
0
      return true;
14142
0
    }
14143
0
}
14144
14145
/* Read the architecture from the Tag_also_compatible_with attribute, if any.
14146
   Returns -1 if no architecture could be read.  */
14147
14148
static int
14149
get_secondary_compatible_arch (bfd *abfd)
14150
0
{
14151
0
  obj_attribute *attr =
14152
0
    &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
14153
14154
  /* Note: the tag and its argument below are uleb128 values, though
14155
     currently-defined values fit in one byte for each.  */
14156
0
  if (attr->s
14157
0
      && attr->s[0] == Tag_CPU_arch
14158
0
      && (attr->s[1] & 128) != 128
14159
0
      && attr->s[2] == 0)
14160
0
   return attr->s[1];
14161
14162
  /* This tag is "safely ignorable", so don't complain if it looks funny.  */
14163
0
  return -1;
14164
0
}
14165
14166
/* Set, or unset, the architecture of the Tag_also_compatible_with attribute.
14167
   The tag is removed if ARCH is -1.  */
14168
14169
static void
14170
set_secondary_compatible_arch (bfd *abfd, int arch)
14171
0
{
14172
0
  obj_attribute *attr =
14173
0
    &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
14174
14175
0
  if (arch == -1)
14176
0
    {
14177
0
      attr->s = NULL;
14178
0
      return;
14179
0
    }
14180
14181
  /* Note: the tag and its argument below are uleb128 values, though
14182
     currently-defined values fit in one byte for each.  */
14183
0
  if (!attr->s)
14184
0
    attr->s = (char *) bfd_alloc (abfd, 3);
14185
0
  attr->s[0] = Tag_CPU_arch;
14186
0
  attr->s[1] = arch;
14187
0
  attr->s[2] = '\0';
14188
0
}
14189
14190
/* Combine two values for Tag_CPU_arch, taking secondary compatibility tags
14191
   into account.  */
14192
14193
static int
14194
tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out,
14195
          int newtag, int secondary_compat, const char* name_table[])
14196
0
{
14197
0
#define T(X) TAG_CPU_ARCH_##X
14198
0
  int tagl, tagh, result;
14199
0
  const int v6t2[] =
14200
0
    {
14201
0
      T(V6T2),   /* PRE_V4.  */
14202
0
      T(V6T2),   /* V4.  */
14203
0
      T(V6T2),   /* V4T.  */
14204
0
      T(V6T2),   /* V5T.  */
14205
0
      T(V6T2),   /* V5TE.  */
14206
0
      T(V6T2),   /* V5TEJ.  */
14207
0
      T(V6T2),   /* V6.  */
14208
0
      T(V7),     /* V6KZ.  */
14209
0
      T(V6T2)    /* V6T2.  */
14210
0
    };
14211
0
  const int v6k[] =
14212
0
    {
14213
0
      T(V6K),    /* PRE_V4.  */
14214
0
      T(V6K),    /* V4.  */
14215
0
      T(V6K),    /* V4T.  */
14216
0
      T(V6K),    /* V5T.  */
14217
0
      T(V6K),    /* V5TE.  */
14218
0
      T(V6K),    /* V5TEJ.  */
14219
0
      T(V6K),    /* V6.  */
14220
0
      T(V6KZ),   /* V6KZ.  */
14221
0
      T(V7),     /* V6T2.  */
14222
0
      T(V6K)     /* V6K.  */
14223
0
    };
14224
0
  const int v7[] =
14225
0
    {
14226
0
      T(V7),     /* PRE_V4.  */
14227
0
      T(V7),     /* V4.  */
14228
0
      T(V7),     /* V4T.  */
14229
0
      T(V7),     /* V5T.  */
14230
0
      T(V7),     /* V5TE.  */
14231
0
      T(V7),     /* V5TEJ.  */
14232
0
      T(V7),     /* V6.  */
14233
0
      T(V7),     /* V6KZ.  */
14234
0
      T(V7),     /* V6T2.  */
14235
0
      T(V7),     /* V6K.  */
14236
0
      T(V7)      /* V7.  */
14237
0
    };
14238
0
  const int v6_m[] =
14239
0
    {
14240
0
      -1,  /* PRE_V4.  */
14241
0
      -1,  /* V4.  */
14242
0
      T(V6K),    /* V4T.  */
14243
0
      T(V6K),    /* V5T.  */
14244
0
      T(V6K),    /* V5TE.  */
14245
0
      T(V6K),    /* V5TEJ.  */
14246
0
      T(V6K),    /* V6.  */
14247
0
      T(V6KZ),   /* V6KZ.  */
14248
0
      T(V7),     /* V6T2.  */
14249
0
      T(V6K),    /* V6K.  */
14250
0
      T(V7),     /* V7.  */
14251
0
      T(V6_M)    /* V6_M.  */
14252
0
    };
14253
0
  const int v6s_m[] =
14254
0
    {
14255
0
      -1,  /* PRE_V4.  */
14256
0
      -1,  /* V4.  */
14257
0
      T(V6K),    /* V4T.  */
14258
0
      T(V6K),    /* V5T.  */
14259
0
      T(V6K),    /* V5TE.  */
14260
0
      T(V6K),    /* V5TEJ.  */
14261
0
      T(V6K),    /* V6.  */
14262
0
      T(V6KZ),   /* V6KZ.  */
14263
0
      T(V7),     /* V6T2.  */
14264
0
      T(V6K),    /* V6K.  */
14265
0
      T(V7),     /* V7.  */
14266
0
      T(V6S_M),  /* V6_M.  */
14267
0
      T(V6S_M)   /* V6S_M.  */
14268
0
    };
14269
0
  const int v7e_m[] =
14270
0
    {
14271
0
      -1,  /* PRE_V4.  */
14272
0
      -1,  /* V4.  */
14273
0
      T(V7E_M),  /* V4T.  */
14274
0
      T(V7E_M),  /* V5T.  */
14275
0
      T(V7E_M),  /* V5TE.  */
14276
0
      T(V7E_M),  /* V5TEJ.  */
14277
0
      T(V7E_M),  /* V6.  */
14278
0
      T(V7E_M),  /* V6KZ.  */
14279
0
      T(V7E_M),  /* V6T2.  */
14280
0
      T(V7E_M),  /* V6K.  */
14281
0
      T(V7E_M),  /* V7.  */
14282
0
      T(V7E_M),  /* V6_M.  */
14283
0
      T(V7E_M),  /* V6S_M.  */
14284
0
      T(V7E_M)   /* V7E_M.  */
14285
0
    };
14286
0
  const int v8[] =
14287
0
    {
14288
0
      T(V8),   /* PRE_V4.  */
14289
0
      T(V8),   /* V4.  */
14290
0
      T(V8),   /* V4T.  */
14291
0
      T(V8),   /* V5T.  */
14292
0
      T(V8),   /* V5TE.  */
14293
0
      T(V8),   /* V5TEJ.  */
14294
0
      T(V8),   /* V6.  */
14295
0
      T(V8),   /* V6KZ.  */
14296
0
      T(V8),   /* V6T2.  */
14297
0
      T(V8),   /* V6K.  */
14298
0
      T(V8),   /* V7.  */
14299
0
      T(V8),   /* V6_M.  */
14300
0
      T(V8),   /* V6S_M.  */
14301
0
      T(V8),   /* V7E_M.  */
14302
0
      T(V8),   /* V8.  */
14303
0
      T(V8),   /* V8-R.  */
14304
0
      T(V8),   /* V8-M.BASE.  */
14305
0
      T(V8),   /* V8-M.MAIN.  */
14306
0
      T(V8),   /* V8.1.  */
14307
0
      T(V8),   /* V8.2.  */
14308
0
      T(V8),   /* V8.3.  */
14309
0
      T(V8),   /* V8.1-M.MAIN.  */
14310
0
    };
14311
0
  const int v8r[] =
14312
0
    {
14313
0
      T(V8R),    /* PRE_V4.  */
14314
0
      T(V8R),    /* V4.  */
14315
0
      T(V8R),    /* V4T.  */
14316
0
      T(V8R),    /* V5T.  */
14317
0
      T(V8R),    /* V5TE.  */
14318
0
      T(V8R),    /* V5TEJ.  */
14319
0
      T(V8R),    /* V6.  */
14320
0
      T(V8R),    /* V6KZ.  */
14321
0
      T(V8R),    /* V6T2.  */
14322
0
      T(V8R),    /* V6K.  */
14323
0
      T(V8R),    /* V7.  */
14324
0
      T(V8R),    /* V6_M.  */
14325
0
      T(V8R),    /* V6S_M.  */
14326
0
      T(V8R),    /* V7E_M.  */
14327
0
      T(V8),   /* V8.  */
14328
0
      T(V8R),    /* V8R.  */
14329
0
    };
14330
0
  const int v8m_baseline[] =
14331
0
    {
14332
0
      -1,   /* PRE_V4.  */
14333
0
      -1,   /* V4.  */
14334
0
      -1,   /* V4T.  */
14335
0
      -1,   /* V5T.  */
14336
0
      -1,   /* V5TE.  */
14337
0
      -1,   /* V5TEJ.  */
14338
0
      -1,   /* V6.  */
14339
0
      -1,   /* V6KZ.  */
14340
0
      -1,   /* V6T2.  */
14341
0
      -1,   /* V6K.  */
14342
0
      -1,   /* V7.  */
14343
0
      T(V8M_BASE), /* V6_M.  */
14344
0
      T(V8M_BASE), /* V6S_M.  */
14345
0
      -1,   /* V7E_M.  */
14346
0
      -1,   /* V8.  */
14347
0
      -1,   /* V8R.  */
14348
0
      T(V8M_BASE)  /* V8-M BASELINE.  */
14349
0
    };
14350
0
  const int v8m_mainline[] =
14351
0
    {
14352
0
      -1,   /* PRE_V4.  */
14353
0
      -1,   /* V4.  */
14354
0
      -1,   /* V4T.  */
14355
0
      -1,   /* V5T.  */
14356
0
      -1,   /* V5TE.  */
14357
0
      -1,   /* V5TEJ.  */
14358
0
      -1,   /* V6.  */
14359
0
      -1,   /* V6KZ.  */
14360
0
      -1,   /* V6T2.  */
14361
0
      -1,   /* V6K.  */
14362
0
      T(V8M_MAIN), /* V7.  */
14363
0
      T(V8M_MAIN), /* V6_M.  */
14364
0
      T(V8M_MAIN), /* V6S_M.  */
14365
0
      T(V8M_MAIN), /* V7E_M.  */
14366
0
      -1,   /* V8.  */
14367
0
      -1,   /* V8R.  */
14368
0
      T(V8M_MAIN), /* V8-M BASELINE.  */
14369
0
      T(V8M_MAIN)  /* V8-M MAINLINE.  */
14370
0
    };
14371
0
  const int v8_1m_mainline[] =
14372
0
    {
14373
0
      -1,   /* PRE_V4.  */
14374
0
      -1,   /* V4.  */
14375
0
      -1,   /* V4T.  */
14376
0
      -1,   /* V5T.  */
14377
0
      -1,   /* V5TE.  */
14378
0
      -1,   /* V5TEJ.  */
14379
0
      -1,   /* V6.  */
14380
0
      -1,   /* V6KZ.  */
14381
0
      -1,   /* V6T2.  */
14382
0
      -1,   /* V6K.  */
14383
0
      T(V8_1M_MAIN), /* V7.  */
14384
0
      T(V8_1M_MAIN), /* V6_M.  */
14385
0
      T(V8_1M_MAIN), /* V6S_M.  */
14386
0
      T(V8_1M_MAIN), /* V7E_M.  */
14387
0
      -1,   /* V8.  */
14388
0
      -1,   /* V8R.  */
14389
0
      T(V8_1M_MAIN), /* V8-M BASELINE.  */
14390
0
      T(V8_1M_MAIN), /* V8-M MAINLINE.  */
14391
0
      -1,   /* Unused (18).  */
14392
0
      -1,   /* Unused (19).  */
14393
0
      -1,   /* Unused (20).  */
14394
0
      T(V8_1M_MAIN)  /* V8.1-M MAINLINE.  */
14395
0
    };
14396
0
  const int v9[] =
14397
0
    {
14398
0
      T(V9),   /* PRE_V4.  */
14399
0
      T(V9),   /* V4.  */
14400
0
      T(V9),   /* V4T.  */
14401
0
      T(V9),   /* V5T.  */
14402
0
      T(V9),   /* V5TE.  */
14403
0
      T(V9),   /* V5TEJ.  */
14404
0
      T(V9),   /* V6.  */
14405
0
      T(V9),   /* V6KZ.  */
14406
0
      T(V9),   /* V6T2.  */
14407
0
      T(V9),   /* V6K.  */
14408
0
      T(V9),   /* V7.  */
14409
0
      T(V9),   /* V6_M.  */
14410
0
      T(V9),   /* V6S_M.  */
14411
0
      T(V9),   /* V7E_M.  */
14412
0
      T(V9),   /* V8.  */
14413
0
      T(V9),   /* V8-R.  */
14414
0
      T(V9),   /* V8-M.BASE.  */
14415
0
      T(V9),   /* V8-M.MAIN.  */
14416
0
      T(V9),   /* V8.1.  */
14417
0
      T(V9),   /* V8.2.  */
14418
0
      T(V9),   /* V8.3.  */
14419
0
      T(V9),   /* V8.1-M.MAIN.  */
14420
0
      T(V9),   /* V9.  */
14421
0
     };
14422
0
  const int v4t_plus_v6_m[] =
14423
0
    {
14424
0
      -1,   /* PRE_V4.  */
14425
0
      -1,   /* V4.  */
14426
0
      T(V4T),    /* V4T.  */
14427
0
      T(V5T),    /* V5T.  */
14428
0
      T(V5TE),   /* V5TE.  */
14429
0
      T(V5TEJ),    /* V5TEJ.  */
14430
0
      T(V6),   /* V6.  */
14431
0
      T(V6KZ),   /* V6KZ.  */
14432
0
      T(V6T2),   /* V6T2.  */
14433
0
      T(V6K),    /* V6K.  */
14434
0
      T(V7),   /* V7.  */
14435
0
      T(V6_M),   /* V6_M.  */
14436
0
      T(V6S_M),    /* V6S_M.  */
14437
0
      T(V7E_M),    /* V7E_M.  */
14438
0
      T(V8),   /* V8.  */
14439
0
      -1,   /* V8R.  */
14440
0
      T(V8M_BASE), /* V8-M BASELINE.  */
14441
0
      T(V8M_MAIN), /* V8-M MAINLINE.  */
14442
0
      -1,   /* Unused (18).  */
14443
0
      -1,   /* Unused (19).  */
14444
0
      -1,   /* Unused (20).  */
14445
0
      T(V8_1M_MAIN), /* V8.1-M MAINLINE.  */
14446
0
      T(V9),   /* V9.  */
14447
0
      T(V4T_PLUS_V6_M) /* V4T plus V6_M.  */
14448
0
    };
14449
0
  const int *comb[] =
14450
0
    {
14451
0
      v6t2,
14452
0
      v6k,
14453
0
      v7,
14454
0
      v6_m,
14455
0
      v6s_m,
14456
0
      v7e_m,
14457
0
      v8,
14458
0
      v8r,
14459
0
      v8m_baseline,
14460
0
      v8m_mainline,
14461
0
      NULL,
14462
0
      NULL,
14463
0
      NULL,
14464
0
      v8_1m_mainline,
14465
0
      v9,
14466
      /* Pseudo-architecture.  */
14467
0
      v4t_plus_v6_m
14468
0
    };
14469
14470
  /* Check we've not got a higher architecture than we know about.  */
14471
14472
0
  if (oldtag > MAX_TAG_CPU_ARCH || newtag > MAX_TAG_CPU_ARCH)
14473
0
    {
14474
0
      _bfd_error_handler (_("error: %pB: unknown CPU architecture"), ibfd);
14475
0
      return -1;
14476
0
    }
14477
14478
  /* Override old tag if we have a Tag_also_compatible_with on the output.  */
14479
14480
0
  if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
14481
0
      || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
14482
0
    oldtag = T(V4T_PLUS_V6_M);
14483
14484
  /* And override the new tag if we have a Tag_also_compatible_with on the
14485
     input.  */
14486
14487
0
  if ((newtag == T(V6_M) && secondary_compat == T(V4T))
14488
0
      || (newtag == T(V4T) && secondary_compat == T(V6_M)))
14489
0
    newtag = T(V4T_PLUS_V6_M);
14490
14491
0
  tagl = (oldtag < newtag) ? oldtag : newtag;
14492
0
  result = tagh = (oldtag > newtag) ? oldtag : newtag;
14493
14494
  /* Architectures before V6KZ add features monotonically.  */
14495
0
  if (tagh <= TAG_CPU_ARCH_V6KZ)
14496
0
    return result;
14497
14498
0
  result = comb[tagh - T(V6T2)] ? comb[tagh - T(V6T2)][tagl] : -1;
14499
14500
  /* Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
14501
     as the canonical version.  */
14502
0
  if (result == T(V4T_PLUS_V6_M))
14503
0
    {
14504
0
      result = T(V4T);
14505
0
      *secondary_compat_out = T(V6_M);
14506
0
    }
14507
0
  else
14508
0
    *secondary_compat_out = -1;
14509
14510
0
  if (result == -1)
14511
0
    {
14512
0
      _bfd_error_handler (_("error: conflicting CPU architectures %s vs %s in %pB"),
14513
0
        name_table[oldtag], name_table[newtag], ibfd);
14514
0
      return -1;
14515
0
    }
14516
14517
0
  return result;
14518
0
#undef T
14519
0
}
14520
14521
/* Query attributes object to see if integer divide instructions may be
14522
   present in an object.  */
14523
static bool
14524
elf32_arm_attributes_accept_div (const obj_attribute *attr)
14525
0
{
14526
0
  int arch = attr[Tag_CPU_arch].i;
14527
0
  int profile = attr[Tag_CPU_arch_profile].i;
14528
14529
0
  switch (attr[Tag_DIV_use].i)
14530
0
    {
14531
0
    case 0:
14532
      /* Integer divide allowed if instruction contained in archetecture.  */
14533
0
      if (arch == TAG_CPU_ARCH_V7 && (profile == 'R' || profile == 'M'))
14534
0
  return true;
14535
0
      else if (arch >= TAG_CPU_ARCH_V7E_M)
14536
0
  return true;
14537
0
      else
14538
0
  return false;
14539
14540
0
    case 1:
14541
      /* Integer divide explicitly prohibited.  */
14542
0
      return false;
14543
14544
0
    default:
14545
      /* Unrecognised case - treat as allowing divide everywhere.  */
14546
0
    case 2:
14547
      /* Integer divide allowed in ARM state.  */
14548
0
      return true;
14549
0
    }
14550
0
}
14551
14552
/* Query attributes object to see if integer divide instructions are
14553
   forbidden to be in the object.  This is not the inverse of
14554
   elf32_arm_attributes_accept_div.  */
14555
static bool
14556
elf32_arm_attributes_forbid_div (const obj_attribute *attr)
14557
0
{
14558
0
  return attr[Tag_DIV_use].i == 1;
14559
0
}
14560
14561
/* Merge EABI object attributes from IBFD into OBFD.  Raise an error if there
14562
   are conflicting attributes.  */
14563
14564
static bool
14565
elf32_arm_merge_eabi_attributes (bfd *ibfd, struct bfd_link_info *info)
14566
0
{
14567
0
  bfd *obfd = info->output_bfd;
14568
0
  obj_attribute *in_attr;
14569
0
  obj_attribute *out_attr;
14570
  /* Some tags have 0 = don't care, 1 = strong requirement,
14571
     2 = weak requirement.  */
14572
0
  static const int order_021[3] = {0, 2, 1};
14573
0
  int i;
14574
0
  bool result = true;
14575
0
  const char *sec_name = get_elf_backend_data (ibfd)->obj_attrs_section;
14576
14577
  /* Skip the linker stubs file.  This preserves previous behavior
14578
     of accepting unknown attributes in the first input file - but
14579
     is that a bug?  */
14580
0
  if (ibfd->flags & BFD_LINKER_CREATED)
14581
0
    return true;
14582
14583
  /* Skip any input that hasn't attribute section.
14584
     This enables to link object files without attribute section with
14585
     any others.  */
14586
0
  if (bfd_get_section_by_name (ibfd, sec_name) == NULL)
14587
0
    return true;
14588
14589
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
14590
0
    {
14591
      /* This is the first object.  Copy the attributes.  */
14592
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
14593
14594
0
      out_attr = elf_known_obj_attributes_proc (obfd);
14595
14596
      /* Use the Tag_null value to indicate the attributes have been
14597
   initialized.  */
14598
0
      out_attr[0].i = 1;
14599
14600
      /* We do not output objects with Tag_MPextension_use_legacy - we move
14601
   the attribute's value to Tag_MPextension_use.  */
14602
0
      if (out_attr[Tag_MPextension_use_legacy].i != 0)
14603
0
  {
14604
0
    if (out_attr[Tag_MPextension_use].i != 0
14605
0
        && out_attr[Tag_MPextension_use_legacy].i
14606
0
    != out_attr[Tag_MPextension_use].i)
14607
0
      {
14608
0
        _bfd_error_handler
14609
0
    (_("Error: %pB has both the current and legacy "
14610
0
       "Tag_MPextension_use attributes"), ibfd);
14611
0
        result = false;
14612
0
      }
14613
14614
0
    out_attr[Tag_MPextension_use] =
14615
0
      out_attr[Tag_MPextension_use_legacy];
14616
0
    out_attr[Tag_MPextension_use_legacy].type = 0;
14617
0
    out_attr[Tag_MPextension_use_legacy].i = 0;
14618
0
  }
14619
14620
      /* PR 28859 and 28848:  Handle the case where the first input file,
14621
   eg crti.o, has a Tag_ABI_HardFP_use of 3 but no Tag_FP_arch set.
14622
   Using Tag_ABI_HardFP_use in this way is deprecated, so reset the
14623
   attribute to zero.
14624
   FIXME: Should we handle other non-zero values of Tag_ABI_HardFO_use ? */
14625
0
      if (out_attr[Tag_ABI_HardFP_use].i == 3 && out_attr[Tag_FP_arch].i == 0)
14626
0
  out_attr[Tag_ABI_HardFP_use].i = 0;
14627
14628
0
      return result;
14629
0
    }
14630
14631
0
  in_attr = elf_known_obj_attributes_proc (ibfd);
14632
0
  out_attr = elf_known_obj_attributes_proc (obfd);
14633
  /* This needs to happen before Tag_ABI_FP_number_model is merged.  */
14634
0
  if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
14635
0
    {
14636
      /* Ignore mismatches if the object doesn't use floating point or is
14637
   floating point ABI independent.  */
14638
0
      if (out_attr[Tag_ABI_FP_number_model].i == AEABI_FP_number_model_none
14639
0
    || (in_attr[Tag_ABI_FP_number_model].i != AEABI_FP_number_model_none
14640
0
        && out_attr[Tag_ABI_VFP_args].i == AEABI_VFP_args_compatible))
14641
0
  out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
14642
0
      else if (in_attr[Tag_ABI_FP_number_model].i != AEABI_FP_number_model_none
14643
0
         && in_attr[Tag_ABI_VFP_args].i != AEABI_VFP_args_compatible)
14644
0
  {
14645
0
    _bfd_error_handler
14646
0
      (_("error: %pB uses VFP register arguments, %pB does not"),
14647
0
       in_attr[Tag_ABI_VFP_args].i ? ibfd : obfd,
14648
0
       in_attr[Tag_ABI_VFP_args].i ? obfd : ibfd);
14649
0
    result = false;
14650
0
  }
14651
0
    }
14652
14653
0
  for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
14654
0
    {
14655
      /* Merge this attribute with existing attributes.  */
14656
0
      switch (i)
14657
0
  {
14658
0
  case Tag_CPU_raw_name:
14659
0
  case Tag_CPU_name:
14660
    /* These are merged after Tag_CPU_arch.  */
14661
0
    break;
14662
14663
0
  case Tag_ABI_optimization_goals:
14664
0
  case Tag_ABI_FP_optimization_goals:
14665
    /* Use the first value seen.  */
14666
0
    break;
14667
14668
0
  case Tag_CPU_arch:
14669
0
    {
14670
0
      int secondary_compat = -1, secondary_compat_out = -1;
14671
0
      unsigned int saved_out_attr = out_attr[i].i;
14672
0
      int arch_attr;
14673
0
      static const char *name_table[] =
14674
0
        {
14675
    /* These aren't real CPU names, but we can't guess
14676
       that from the architecture version alone.  */
14677
0
    "Pre v4",
14678
0
    "ARM v4",
14679
0
    "ARM v4T",
14680
0
    "ARM v5T",
14681
0
    "ARM v5TE",
14682
0
    "ARM v5TEJ",
14683
0
    "ARM v6",
14684
0
    "ARM v6KZ",
14685
0
    "ARM v6T2",
14686
0
    "ARM v6K",
14687
0
    "ARM v7",
14688
0
    "ARM v6-M",
14689
0
    "ARM v6S-M",
14690
0
    "ARM v7E-M",
14691
0
    "ARM v8",
14692
0
    "ARM v8-R",
14693
0
    "ARM v8-M.baseline",
14694
0
    "ARM v8-M.mainline",
14695
0
    "ARM v8.1-A",
14696
0
    "ARM v8.2-A",
14697
0
    "ARM v8.3-A",
14698
0
    "ARM v8.1-M.mainline",
14699
0
    "ARM v9",
14700
0
      };
14701
14702
      /* Merge Tag_CPU_arch and Tag_also_compatible_with.  */
14703
0
      secondary_compat = get_secondary_compatible_arch (ibfd);
14704
0
      secondary_compat_out = get_secondary_compatible_arch (obfd);
14705
0
      arch_attr = tag_cpu_arch_combine (ibfd, out_attr[i].i,
14706
0
                &secondary_compat_out,
14707
0
                in_attr[i].i,
14708
0
                secondary_compat,
14709
0
                name_table);
14710
14711
      /* Return with error if failed to merge.  */
14712
0
      if (arch_attr == -1)
14713
0
        return false;
14714
14715
0
      out_attr[i].i = arch_attr;
14716
14717
0
      set_secondary_compatible_arch (obfd, secondary_compat_out);
14718
14719
      /* Merge Tag_CPU_name and Tag_CPU_raw_name.  */
14720
0
      if (out_attr[i].i == saved_out_attr)
14721
0
        ; /* Leave the names alone.  */
14722
0
      else if (out_attr[i].i == in_attr[i].i)
14723
0
        {
14724
    /* The output architecture has been changed to match the
14725
       input architecture.  Use the input names.  */
14726
0
    out_attr[Tag_CPU_name].s = in_attr[Tag_CPU_name].s
14727
0
      ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_name].s)
14728
0
      : NULL;
14729
0
    out_attr[Tag_CPU_raw_name].s = in_attr[Tag_CPU_raw_name].s
14730
0
      ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_raw_name].s)
14731
0
      : NULL;
14732
0
        }
14733
0
      else
14734
0
        {
14735
0
    out_attr[Tag_CPU_name].s = NULL;
14736
0
    out_attr[Tag_CPU_raw_name].s = NULL;
14737
0
        }
14738
14739
      /* If we still don't have a value for Tag_CPU_name,
14740
         make one up now.  Tag_CPU_raw_name remains blank.  */
14741
0
      if (out_attr[Tag_CPU_name].s == NULL
14742
0
    && out_attr[i].i < ARRAY_SIZE (name_table))
14743
0
        out_attr[Tag_CPU_name].s =
14744
0
    _bfd_elf_attr_strdup (obfd, name_table[out_attr[i].i]);
14745
0
    }
14746
0
    break;
14747
14748
0
  case Tag_ARM_ISA_use:
14749
0
  case Tag_THUMB_ISA_use:
14750
0
  case Tag_WMMX_arch:
14751
0
  case Tag_Advanced_SIMD_arch:
14752
    /* ??? Do Advanced_SIMD (NEON) and WMMX conflict?  */
14753
0
  case Tag_ABI_FP_rounding:
14754
0
  case Tag_ABI_FP_exceptions:
14755
0
  case Tag_ABI_FP_user_exceptions:
14756
0
  case Tag_ABI_FP_number_model:
14757
0
  case Tag_FP_HP_extension:
14758
0
  case Tag_CPU_unaligned_access:
14759
0
  case Tag_T2EE_use:
14760
0
  case Tag_MPextension_use:
14761
0
  case Tag_MVE_arch:
14762
0
  case Tag_PAC_extension:
14763
0
  case Tag_BTI_extension:
14764
0
  case Tag_BTI_use:
14765
0
  case Tag_PACRET_use:
14766
    /* Use the largest value specified.  */
14767
0
    if (in_attr[i].i > out_attr[i].i)
14768
0
      out_attr[i].i = in_attr[i].i;
14769
0
    break;
14770
14771
0
  case Tag_ABI_align_preserved:
14772
0
  case Tag_ABI_PCS_RO_data:
14773
    /* Use the smallest value specified.  */
14774
0
    if (in_attr[i].i < out_attr[i].i)
14775
0
      out_attr[i].i = in_attr[i].i;
14776
0
    break;
14777
14778
0
  case Tag_ABI_align_needed:
14779
0
    if ((in_attr[i].i > 0 || out_attr[i].i > 0)
14780
0
        && (in_attr[Tag_ABI_align_preserved].i == 0
14781
0
      || out_attr[Tag_ABI_align_preserved].i == 0))
14782
0
      {
14783
        /* This error message should be enabled once all non-conformant
14784
     binaries in the toolchain have had the attributes set
14785
     properly.
14786
        _bfd_error_handler
14787
    (_("error: %pB: 8-byte data alignment conflicts with %pB"),
14788
     obfd, ibfd);
14789
        result = false; */
14790
0
      }
14791
    /* Fall through.  */
14792
0
  case Tag_ABI_FP_denormal:
14793
0
  case Tag_ABI_PCS_GOT_use:
14794
    /* Use the "greatest" from the sequence 0, 2, 1, or the largest
14795
       value if greater than 2 (for future-proofing).  */
14796
0
    if ((in_attr[i].i > 2 && in_attr[i].i > out_attr[i].i)
14797
0
        || (in_attr[i].i <= 2 && out_attr[i].i <= 2
14798
0
      && order_021[in_attr[i].i] > order_021[out_attr[i].i]))
14799
0
      out_attr[i].i = in_attr[i].i;
14800
0
    break;
14801
14802
0
  case Tag_Virtualization_use:
14803
    /* The virtualization tag effectively stores two bits of
14804
       information: the intended use of TrustZone (in bit 0), and the
14805
       intended use of Virtualization (in bit 1).  */
14806
0
    if (out_attr[i].i == 0)
14807
0
      out_attr[i].i = in_attr[i].i;
14808
0
    else if (in_attr[i].i != 0
14809
0
       && in_attr[i].i != out_attr[i].i)
14810
0
      {
14811
0
        if (in_attr[i].i <= 3 && out_attr[i].i <= 3)
14812
0
    out_attr[i].i = 3;
14813
0
        else
14814
0
    {
14815
0
      _bfd_error_handler
14816
0
        (_("error: %pB: unable to merge virtualization attributes "
14817
0
           "with %pB"),
14818
0
         obfd, ibfd);
14819
0
      result = false;
14820
0
    }
14821
0
      }
14822
0
    break;
14823
14824
0
  case Tag_CPU_arch_profile:
14825
0
    if (out_attr[i].i != in_attr[i].i)
14826
0
      {
14827
        /* 0 will merge with anything.
14828
     'A' and 'S' merge to 'A'.
14829
     'R' and 'S' merge to 'R'.
14830
     'M' and 'A|R|S' is an error.  */
14831
0
        if (out_attr[i].i == 0
14832
0
      || (out_attr[i].i == 'S'
14833
0
          && (in_attr[i].i == 'A' || in_attr[i].i == 'R')))
14834
0
    out_attr[i].i = in_attr[i].i;
14835
0
        else if (in_attr[i].i == 0
14836
0
           || (in_attr[i].i == 'S'
14837
0
         && (out_attr[i].i == 'A' || out_attr[i].i == 'R')))
14838
0
    ; /* Do nothing.  */
14839
0
        else
14840
0
    {
14841
0
      _bfd_error_handler
14842
0
        (_("error: %pB: conflicting architecture profiles %c/%c"),
14843
0
         ibfd,
14844
0
         in_attr[i].i ? in_attr[i].i : '0',
14845
0
         out_attr[i].i ? out_attr[i].i : '0');
14846
0
      result = false;
14847
0
    }
14848
0
      }
14849
0
    break;
14850
14851
0
  case Tag_DSP_extension:
14852
    /* No need to change output value if any of:
14853
       - pre (<=) ARMv5T input architecture (do not have DSP)
14854
       - M input profile not ARMv7E-M and do not have DSP.  */
14855
0
    if (in_attr[Tag_CPU_arch].i <= 3
14856
0
        || (in_attr[Tag_CPU_arch_profile].i == 'M'
14857
0
      && in_attr[Tag_CPU_arch].i != 13
14858
0
      && in_attr[i].i == 0))
14859
0
      ; /* Do nothing.  */
14860
    /* Output value should be 0 if DSP part of architecture, ie.
14861
       - post (>=) ARMv5te architecture output
14862
       - A, R or S profile output or ARMv7E-M output architecture.  */
14863
0
    else if (out_attr[Tag_CPU_arch].i >= 4
14864
0
       && (out_attr[Tag_CPU_arch_profile].i == 'A'
14865
0
           || out_attr[Tag_CPU_arch_profile].i == 'R'
14866
0
           || out_attr[Tag_CPU_arch_profile].i == 'S'
14867
0
           || out_attr[Tag_CPU_arch].i == 13))
14868
0
      out_attr[i].i = 0;
14869
    /* Otherwise, DSP instructions are added and not part of output
14870
       architecture.  */
14871
0
    else
14872
0
      out_attr[i].i = 1;
14873
0
    break;
14874
14875
0
  case Tag_FP_arch:
14876
0
      {
14877
        /* Tag_ABI_HardFP_use is handled along with Tag_FP_arch since
14878
     the meaning of Tag_ABI_HardFP_use depends on Tag_FP_arch
14879
     when it's 0.  It might mean absence of FP hardware if
14880
     Tag_FP_arch is zero.  */
14881
14882
0
#define VFP_VERSION_COUNT 9
14883
0
        static const struct
14884
0
        {
14885
0
      int ver;
14886
0
      int regs;
14887
0
        } vfp_versions[VFP_VERSION_COUNT] =
14888
0
    {
14889
0
      {0, 0},
14890
0
      {1, 16},
14891
0
      {2, 16},
14892
0
      {3, 32},
14893
0
      {3, 16},
14894
0
      {4, 32},
14895
0
      {4, 16},
14896
0
      {8, 32},
14897
0
      {8, 16}
14898
0
    };
14899
0
        int ver;
14900
0
        int regs;
14901
0
        int newval;
14902
14903
        /* If the output has no requirement about FP hardware,
14904
     follow the requirement of the input.  */
14905
0
        if (out_attr[i].i == 0)
14906
0
    {
14907
      /* This assert is still reasonable, we shouldn't
14908
         produce the suspicious build attribute
14909
         combination (See below for in_attr).  */
14910
0
      BFD_ASSERT (out_attr[Tag_ABI_HardFP_use].i == 0);
14911
0
      out_attr[i].i = in_attr[i].i;
14912
0
      out_attr[Tag_ABI_HardFP_use].i
14913
0
        = in_attr[Tag_ABI_HardFP_use].i;
14914
0
      break;
14915
0
    }
14916
        /* If the input has no requirement about FP hardware, do
14917
     nothing.  */
14918
0
        else if (in_attr[i].i == 0)
14919
0
    {
14920
      /* We used to assert that Tag_ABI_HardFP_use was
14921
         zero here, but we should never assert when
14922
         consuming an object file that has suspicious
14923
         build attributes.  The single precision variant
14924
         of 'no FP architecture' is still 'no FP
14925
         architecture', so we just ignore the tag in this
14926
         case.  */
14927
0
      break;
14928
0
    }
14929
14930
        /* Both the input and the output have nonzero Tag_FP_arch.
14931
     So Tag_ABI_HardFP_use is implied by Tag_FP_arch when it's zero.  */
14932
14933
        /* If both the input and the output have zero Tag_ABI_HardFP_use,
14934
     do nothing.  */
14935
0
        if (in_attr[Tag_ABI_HardFP_use].i == 0
14936
0
      && out_attr[Tag_ABI_HardFP_use].i == 0)
14937
0
    ;
14938
        /* If the input and the output have different Tag_ABI_HardFP_use,
14939
     the combination of them is 0 (implied by Tag_FP_arch).  */
14940
0
        else if (in_attr[Tag_ABI_HardFP_use].i
14941
0
           != out_attr[Tag_ABI_HardFP_use].i)
14942
0
    out_attr[Tag_ABI_HardFP_use].i = 0;
14943
14944
        /* Now we can handle Tag_FP_arch.  */
14945
14946
        /* Values of VFP_VERSION_COUNT or more aren't defined, so just
14947
     pick the biggest.  */
14948
0
        if (in_attr[i].i >= VFP_VERSION_COUNT
14949
0
      && in_attr[i].i > out_attr[i].i)
14950
0
    {
14951
0
      out_attr[i] = in_attr[i];
14952
0
      break;
14953
0
    }
14954
        /* The output uses the superset of input features
14955
     (ISA version) and registers.  */
14956
0
        ver = vfp_versions[in_attr[i].i].ver;
14957
0
        if (ver < vfp_versions[out_attr[i].i].ver)
14958
0
    ver = vfp_versions[out_attr[i].i].ver;
14959
0
        regs = vfp_versions[in_attr[i].i].regs;
14960
0
        if (regs < vfp_versions[out_attr[i].i].regs)
14961
0
    regs = vfp_versions[out_attr[i].i].regs;
14962
        /* This assumes all possible supersets are also a valid
14963
     options.  */
14964
0
        for (newval = VFP_VERSION_COUNT - 1; newval > 0; newval--)
14965
0
    {
14966
0
      if (regs == vfp_versions[newval].regs
14967
0
          && ver == vfp_versions[newval].ver)
14968
0
        break;
14969
0
    }
14970
0
        out_attr[i].i = newval;
14971
0
      }
14972
0
    break;
14973
0
  case Tag_PCS_config:
14974
0
    if (out_attr[i].i == 0)
14975
0
      out_attr[i].i = in_attr[i].i;
14976
0
    else if (in_attr[i].i != 0 && out_attr[i].i != in_attr[i].i)
14977
0
      {
14978
        /* It's sometimes ok to mix different configs, so this is only
14979
     a warning.  */
14980
0
        _bfd_error_handler
14981
0
    (_("warning: %pB: conflicting platform configuration"), ibfd);
14982
0
      }
14983
0
    break;
14984
0
  case Tag_ABI_PCS_R9_use:
14985
0
    if (in_attr[i].i != out_attr[i].i
14986
0
        && out_attr[i].i != AEABI_R9_unused
14987
0
        && in_attr[i].i != AEABI_R9_unused)
14988
0
      {
14989
0
        _bfd_error_handler
14990
0
    (_("error: %pB: conflicting use of R9"), ibfd);
14991
0
        result = false;
14992
0
      }
14993
0
    if (out_attr[i].i == AEABI_R9_unused)
14994
0
      out_attr[i].i = in_attr[i].i;
14995
0
    break;
14996
0
  case Tag_ABI_PCS_RW_data:
14997
0
    if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
14998
0
        && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
14999
0
        && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
15000
0
      {
15001
0
        _bfd_error_handler
15002
0
    (_("error: %pB: SB relative addressing conflicts with use of R9"),
15003
0
     ibfd);
15004
0
        result = false;
15005
0
      }
15006
    /* Use the smallest value specified.  */
15007
0
    if (in_attr[i].i < out_attr[i].i)
15008
0
      out_attr[i].i = in_attr[i].i;
15009
0
    break;
15010
0
  case Tag_ABI_PCS_wchar_t:
15011
0
    if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i
15012
0
        && !elf_arm_tdata (obfd)->no_wchar_size_warning)
15013
0
      {
15014
0
        _bfd_error_handler
15015
0
    (_("warning: %pB uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"),
15016
0
     ibfd, in_attr[i].i, out_attr[i].i);
15017
0
      }
15018
0
    else if (in_attr[i].i && !out_attr[i].i)
15019
0
      out_attr[i].i = in_attr[i].i;
15020
0
    break;
15021
0
  case Tag_ABI_enum_size:
15022
0
    if (in_attr[i].i != AEABI_enum_unused)
15023
0
      {
15024
0
        if (out_attr[i].i == AEABI_enum_unused
15025
0
      || out_attr[i].i == AEABI_enum_forced_wide)
15026
0
    {
15027
      /* The existing object is compatible with anything.
15028
         Use whatever requirements the new object has.  */
15029
0
      out_attr[i].i = in_attr[i].i;
15030
0
    }
15031
0
        else if (in_attr[i].i != AEABI_enum_forced_wide
15032
0
           && out_attr[i].i != in_attr[i].i
15033
0
           && !elf_arm_tdata (obfd)->no_enum_size_warning)
15034
0
    {
15035
0
      static const char *aeabi_enum_names[] =
15036
0
        { "", "variable-size", "32-bit", "" };
15037
0
      const char *in_name =
15038
0
        in_attr[i].i < ARRAY_SIZE (aeabi_enum_names)
15039
0
        ? aeabi_enum_names[in_attr[i].i]
15040
0
        : "<unknown>";
15041
0
      const char *out_name =
15042
0
        out_attr[i].i < ARRAY_SIZE (aeabi_enum_names)
15043
0
        ? aeabi_enum_names[out_attr[i].i]
15044
0
        : "<unknown>";
15045
0
      _bfd_error_handler
15046
0
        (_("warning: %pB uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
15047
0
         ibfd, in_name, out_name);
15048
0
    }
15049
0
      }
15050
0
    break;
15051
0
  case Tag_ABI_VFP_args:
15052
    /* Aready done.  */
15053
0
    break;
15054
0
  case Tag_ABI_WMMX_args:
15055
0
    if (in_attr[i].i != out_attr[i].i)
15056
0
      {
15057
0
        _bfd_error_handler
15058
0
    (_("error: %pB uses iWMMXt register arguments, %pB does not"),
15059
0
     ibfd, obfd);
15060
0
        result = false;
15061
0
      }
15062
0
    break;
15063
0
  case Tag_compatibility:
15064
    /* Merged in target-independent code.  */
15065
0
    break;
15066
0
  case Tag_ABI_HardFP_use:
15067
    /* This is handled along with Tag_FP_arch.  */
15068
0
    break;
15069
0
  case Tag_ABI_FP_16bit_format:
15070
0
    if (in_attr[i].i != 0 && out_attr[i].i != 0)
15071
0
      {
15072
0
        if (in_attr[i].i != out_attr[i].i)
15073
0
    {
15074
0
      _bfd_error_handler
15075
0
        (_("error: fp16 format mismatch between %pB and %pB"),
15076
0
         ibfd, obfd);
15077
0
      result = false;
15078
0
    }
15079
0
      }
15080
0
    if (in_attr[i].i != 0)
15081
0
      out_attr[i].i = in_attr[i].i;
15082
0
    break;
15083
15084
0
  case Tag_DIV_use:
15085
    /* A value of zero on input means that the divide instruction may
15086
       be used if available in the base architecture as specified via
15087
       Tag_CPU_arch and Tag_CPU_arch_profile.  A value of 1 means that
15088
       the user did not want divide instructions.  A value of 2
15089
       explicitly means that divide instructions were allowed in ARM
15090
       and Thumb state.  */
15091
0
    if (in_attr[i].i == out_attr[i].i)
15092
0
      /* Do nothing.  */ ;
15093
0
    else if (elf32_arm_attributes_forbid_div (in_attr)
15094
0
       && !elf32_arm_attributes_accept_div (out_attr))
15095
0
      out_attr[i].i = 1;
15096
0
    else if (elf32_arm_attributes_forbid_div (out_attr)
15097
0
       && elf32_arm_attributes_accept_div (in_attr))
15098
0
      out_attr[i].i = in_attr[i].i;
15099
0
    else if (in_attr[i].i == 2)
15100
0
      out_attr[i].i = in_attr[i].i;
15101
0
    break;
15102
15103
0
  case Tag_MPextension_use_legacy:
15104
    /* We don't output objects with Tag_MPextension_use_legacy - we
15105
       move the value to Tag_MPextension_use.  */
15106
0
    if (in_attr[i].i != 0 && in_attr[Tag_MPextension_use].i != 0)
15107
0
      {
15108
0
        if (in_attr[Tag_MPextension_use].i != in_attr[i].i)
15109
0
    {
15110
0
      _bfd_error_handler
15111
0
        (_("%pB has both the current and legacy "
15112
0
           "Tag_MPextension_use attributes"),
15113
0
         ibfd);
15114
0
      result = false;
15115
0
    }
15116
0
      }
15117
15118
0
    if (in_attr[i].i > out_attr[Tag_MPextension_use].i)
15119
0
      out_attr[Tag_MPextension_use] = in_attr[i];
15120
15121
0
    break;
15122
15123
0
  case Tag_nodefaults:
15124
    /* This tag is set if it exists, but the value is unused (and is
15125
       typically zero).  We don't actually need to do anything here -
15126
       the merge happens automatically when the type flags are merged
15127
       below.  */
15128
0
    break;
15129
0
  case Tag_also_compatible_with:
15130
    /* Already done in Tag_CPU_arch.  */
15131
0
    break;
15132
0
  case Tag_conformance:
15133
    /* Keep the attribute if it matches.  Throw it away otherwise.
15134
       No attribute means no claim to conform.  */
15135
0
    if (!in_attr[i].s || !out_attr[i].s
15136
0
        || strcmp (in_attr[i].s, out_attr[i].s) != 0)
15137
0
      out_attr[i].s = NULL;
15138
0
    break;
15139
15140
0
  default:
15141
0
    result
15142
0
      = result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
15143
0
  }
15144
15145
      /* If out_attr was copied from in_attr then it won't have a type yet.  */
15146
0
      if (in_attr[i].type && !out_attr[i].type)
15147
0
  out_attr[i].type = in_attr[i].type;
15148
0
    }
15149
15150
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
15151
0
  if (!_bfd_elf_merge_object_attributes (ibfd, info))
15152
0
    return false;
15153
15154
  /* Check for any attributes not known on ARM.  */
15155
0
  result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
15156
15157
0
  return result;
15158
0
}
15159
15160
15161
/* Return TRUE if the two EABI versions are incompatible.  */
15162
15163
static bool
15164
elf32_arm_versions_compatible (unsigned iver, unsigned over)
15165
0
{
15166
  /* v4 and v5 are the same spec before and after it was released,
15167
     so allow mixing them.  */
15168
0
  if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
15169
0
      || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
15170
0
    return true;
15171
15172
0
  return (iver == over);
15173
0
}
15174
15175
/* Merge backend specific data from an object file to the output
15176
   object file when linking.  */
15177
15178
static bool
15179
elf32_arm_merge_private_bfd_data (bfd *, struct bfd_link_info *);
15180
15181
/* Display the flags field.  */
15182
15183
static bool
15184
elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
15185
362
{
15186
362
  FILE * file = (FILE *) ptr;
15187
362
  unsigned long flags;
15188
15189
362
  BFD_ASSERT (abfd != NULL && ptr != NULL);
15190
15191
  /* Print normal ELF private data.  */
15192
362
  _bfd_elf_print_private_bfd_data (abfd, ptr);
15193
15194
362
  flags = elf_elfheader (abfd)->e_flags;
15195
  /* Ignore init flag - it may not be set, despite the flags field
15196
     containing valid data.  */
15197
15198
362
  fprintf (file, _("private flags = 0x%lx:"), elf_elfheader (abfd)->e_flags);
15199
15200
362
  switch (EF_ARM_EABI_VERSION (flags))
15201
362
    {
15202
305
    case EF_ARM_EABI_UNKNOWN:
15203
      /* The following flag bits are GNU extensions and not part of the
15204
   official ARM ELF extended ABI.  Hence they are only decoded if
15205
   the EABI version is not set.  */
15206
305
      if (flags & EF_ARM_INTERWORK)
15207
24
  fprintf (file, _(" [interworking enabled]"));
15208
15209
305
      if (flags & EF_ARM_APCS_26)
15210
24
  fprintf (file, " [APCS-26]");
15211
281
      else
15212
281
  fprintf (file, " [APCS-32]");
15213
15214
305
      if (flags & EF_ARM_VFP_FLOAT)
15215
2
  fprintf (file, _(" [VFP float format]"));
15216
303
      else
15217
303
  fprintf (file, _(" [FPA float format]"));
15218
15219
305
      if (flags & EF_ARM_APCS_FLOAT)
15220
24
  fprintf (file, _(" [floats passed in float registers]"));
15221
15222
305
      if (flags & EF_ARM_PIC)
15223
24
  fprintf (file, _(" [position independent]"));
15224
15225
305
      if (flags & EF_ARM_NEW_ABI)
15226
22
  fprintf (file, _(" [new ABI]"));
15227
15228
305
      if (flags & EF_ARM_OLD_ABI)
15229
279
  fprintf (file, _(" [old ABI]"));
15230
15231
305
      if (flags & EF_ARM_SOFT_FLOAT)
15232
2
  fprintf (file, _(" [software FP]"));
15233
15234
305
      flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
15235
305
     | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
15236
305
     | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT);
15237
305
      break;
15238
15239
3
    case EF_ARM_EABI_VER1:
15240
3
      fprintf (file, _(" [Version1 EABI]"));
15241
15242
3
      if (flags & EF_ARM_SYMSARESORTED)
15243
2
  fprintf (file, _(" [sorted symbol table]"));
15244
1
      else
15245
1
  fprintf (file, _(" [unsorted symbol table]"));
15246
15247
3
      flags &= ~ EF_ARM_SYMSARESORTED;
15248
3
      break;
15249
15250
3
    case EF_ARM_EABI_VER2:
15251
3
      fprintf (file, _(" [Version2 EABI]"));
15252
15253
3
      if (flags & EF_ARM_SYMSARESORTED)
15254
1
  fprintf (file, _(" [sorted symbol table]"));
15255
2
      else
15256
2
  fprintf (file, _(" [unsorted symbol table]"));
15257
15258
3
      if (flags & EF_ARM_DYNSYMSUSESEGIDX)
15259
1
  fprintf (file, _(" [dynamic symbols use segment index]"));
15260
15261
3
      if (flags & EF_ARM_MAPSYMSFIRST)
15262
1
  fprintf (file, _(" [mapping symbols precede others]"));
15263
15264
3
      flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
15265
3
     | EF_ARM_MAPSYMSFIRST);
15266
3
      break;
15267
15268
6
    case EF_ARM_EABI_VER3:
15269
6
      fprintf (file, _(" [Version3 EABI]"));
15270
6
      break;
15271
15272
19
    case EF_ARM_EABI_VER4:
15273
19
      fprintf (file, _(" [Version4 EABI]"));
15274
19
      goto eabi;
15275
15276
14
    case EF_ARM_EABI_VER5:
15277
14
      fprintf (file, _(" [Version5 EABI]"));
15278
15279
14
      if (flags & EF_ARM_ABI_FLOAT_SOFT)
15280
2
  fprintf (file, _(" [soft-float ABI]"));
15281
15282
14
      if (flags & EF_ARM_ABI_FLOAT_HARD)
15283
1
  fprintf (file, _(" [hard-float ABI]"));
15284
15285
14
      flags &= ~(EF_ARM_ABI_FLOAT_SOFT | EF_ARM_ABI_FLOAT_HARD);
15286
15287
33
    eabi:
15288
33
      if (flags & EF_ARM_BE8)
15289
2
  fprintf (file, _(" [BE8]"));
15290
15291
33
      if (flags & EF_ARM_LE8)
15292
2
  fprintf (file, _(" [LE8]"));
15293
15294
33
      flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
15295
33
      break;
15296
15297
12
    default:
15298
12
      fprintf (file, _(" <EABI version unrecognised>"));
15299
12
      break;
15300
362
    }
15301
15302
362
  flags &= ~ EF_ARM_EABIMASK;
15303
15304
362
  if (flags & EF_ARM_RELEXEC)
15305
29
    fprintf (file, _(" [relocatable executable]"));
15306
15307
362
  if (flags & EF_ARM_PIC)
15308
4
    fprintf (file, _(" [position independent]"));
15309
15310
362
  if (elf_elfheader (abfd)->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC)
15311
0
    fprintf (file, _(" [FDPIC ABI supplement]"));
15312
15313
362
  flags &= ~ (EF_ARM_RELEXEC | EF_ARM_PIC);
15314
15315
362
  if (flags)
15316
356
    fprintf (file, _(" <Unrecognised flag bits set>"));
15317
15318
362
  fputc ('\n', file);
15319
15320
362
  return true;
15321
362
}
15322
15323
static int
15324
elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
15325
0
{
15326
0
  switch (ELF_ST_TYPE (elf_sym->st_info))
15327
0
    {
15328
0
    case STT_ARM_TFUNC:
15329
0
      return ELF_ST_TYPE (elf_sym->st_info);
15330
15331
0
    case STT_ARM_16BIT:
15332
      /* If the symbol is not an object, return the STT_ARM_16BIT flag.
15333
   This allows us to distinguish between data used by Thumb instructions
15334
   and non-data (which is probably code) inside Thumb regions of an
15335
   executable.  */
15336
0
      if (type != STT_OBJECT && type != STT_TLS)
15337
0
  return ELF_ST_TYPE (elf_sym->st_info);
15338
0
      break;
15339
15340
0
    default:
15341
0
      break;
15342
0
    }
15343
15344
0
  return type;
15345
0
}
15346
15347
static asection *
15348
elf32_arm_gc_mark_hook (asection *sec,
15349
      struct bfd_link_info *info,
15350
      Elf_Internal_Rela *rel,
15351
      struct elf_link_hash_entry *h,
15352
      Elf_Internal_Sym *sym)
15353
0
{
15354
0
  if (h != NULL)
15355
0
    switch (ELF32_R_TYPE (rel->r_info))
15356
0
      {
15357
0
      case R_ARM_GNU_VTINHERIT:
15358
0
      case R_ARM_GNU_VTENTRY:
15359
0
  return NULL;
15360
0
      }
15361
15362
0
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
15363
0
}
15364
15365
/* Look through the relocs for a section during the first phase.  */
15366
15367
static bool
15368
elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
15369
      asection *sec, const Elf_Internal_Rela *relocs)
15370
0
{
15371
0
  Elf_Internal_Shdr *symtab_hdr;
15372
0
  struct elf_link_hash_entry **sym_hashes;
15373
0
  const Elf_Internal_Rela *rel;
15374
0
  const Elf_Internal_Rela *rel_end;
15375
0
  bfd *dynobj;
15376
0
  asection *sreloc;
15377
0
  struct elf32_arm_link_hash_table *htab;
15378
0
  bool call_reloc_p;
15379
0
  bool may_become_dynamic_p;
15380
0
  bool may_need_local_target_p;
15381
0
  unsigned long nsyms;
15382
15383
0
  if (bfd_link_relocatable (info))
15384
0
    return true;
15385
15386
0
  BFD_ASSERT (is_arm_elf (abfd));
15387
15388
0
  htab = elf32_arm_hash_table (info);
15389
0
  if (htab == NULL)
15390
0
    return false;
15391
15392
0
  sreloc = NULL;
15393
15394
0
  if (htab->root.dynobj == NULL)
15395
0
    htab->root.dynobj = abfd;
15396
0
  if (!create_ifunc_sections (info))
15397
0
    return false;
15398
15399
0
  dynobj = htab->root.dynobj;
15400
15401
0
  symtab_hdr = & elf_symtab_hdr (abfd);
15402
0
  sym_hashes = elf_sym_hashes (abfd);
15403
0
  nsyms = NUM_SHDR_ENTRIES (symtab_hdr);
15404
15405
0
  rel_end = relocs + sec->reloc_count;
15406
0
  for (rel = relocs; rel < rel_end; rel++)
15407
0
    {
15408
0
      Elf_Internal_Sym *isym;
15409
0
      struct elf_link_hash_entry *h;
15410
0
      struct elf32_arm_link_hash_entry *eh;
15411
0
      unsigned int r_symndx;
15412
0
      int r_type;
15413
15414
0
      r_symndx = ELF32_R_SYM (rel->r_info);
15415
0
      r_type = ELF32_R_TYPE (rel->r_info);
15416
0
      r_type = arm_real_reloc_type (htab, r_type);
15417
15418
0
      if (r_symndx >= nsyms
15419
    /* PR 9934: It is possible to have relocations that do not
15420
       refer to symbols, thus it is also possible to have an
15421
       object file containing relocations but no symbol table.  */
15422
0
    && (r_symndx > STN_UNDEF || nsyms > 0))
15423
0
  {
15424
0
    _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd,
15425
0
            r_symndx);
15426
0
    return false;
15427
0
  }
15428
15429
0
      h = NULL;
15430
0
      isym = NULL;
15431
0
      if (nsyms > 0)
15432
0
  {
15433
0
    if (r_symndx < symtab_hdr->sh_info)
15434
0
      {
15435
        /* A local symbol.  */
15436
0
        isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
15437
0
              abfd, r_symndx);
15438
0
        if (isym == NULL)
15439
0
    return false;
15440
0
      }
15441
0
    else
15442
0
      {
15443
0
        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
15444
0
        while (h->root.type == bfd_link_hash_indirect
15445
0
         || h->root.type == bfd_link_hash_warning)
15446
0
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
15447
0
      }
15448
0
  }
15449
15450
0
      eh = (struct elf32_arm_link_hash_entry *) h;
15451
15452
0
      call_reloc_p = false;
15453
0
      may_become_dynamic_p = false;
15454
0
      may_need_local_target_p = false;
15455
15456
      /* Could be done earlier, if h were already available.  */
15457
0
      r_type = elf32_arm_tls_transition (info, r_type, h);
15458
0
      switch (r_type)
15459
0
  {
15460
0
  case R_ARM_GOTOFFFUNCDESC:
15461
0
    {
15462
0
      if (h == NULL)
15463
0
        {
15464
0
    if (!elf32_arm_allocate_local_sym_info (abfd))
15465
0
      return false;
15466
0
    if (r_symndx >= elf32_arm_num_entries (abfd))
15467
0
      return false;
15468
0
    elf32_arm_local_fdpic_cnts (abfd) [r_symndx].gotofffuncdesc_cnt += 1;
15469
0
    elf32_arm_local_fdpic_cnts (abfd) [r_symndx].funcdesc_offset = -1;
15470
0
        }
15471
0
      else
15472
0
        {
15473
0
    eh->fdpic_cnts.gotofffuncdesc_cnt++;
15474
0
        }
15475
0
    }
15476
0
    break;
15477
15478
0
  case R_ARM_GOTFUNCDESC:
15479
0
    {
15480
0
      if (h == NULL)
15481
0
        {
15482
    /* Such a relocation is not supposed to be generated
15483
       by gcc on a static function.  */
15484
    /* Anyway if needed it could be handled.  */
15485
0
    return false;
15486
0
        }
15487
0
      else
15488
0
        {
15489
0
    eh->fdpic_cnts.gotfuncdesc_cnt++;
15490
0
        }
15491
0
    }
15492
0
    break;
15493
15494
0
  case R_ARM_FUNCDESC:
15495
0
    {
15496
0
      if (h == NULL)
15497
0
        {
15498
0
    if (!elf32_arm_allocate_local_sym_info (abfd))
15499
0
      return false;
15500
0
    if (r_symndx >= elf32_arm_num_entries (abfd))
15501
0
      return false;
15502
0
    elf32_arm_local_fdpic_cnts (abfd) [r_symndx].funcdesc_cnt += 1;
15503
0
    elf32_arm_local_fdpic_cnts (abfd) [r_symndx].funcdesc_offset = -1;
15504
0
        }
15505
0
      else
15506
0
        {
15507
0
    eh->fdpic_cnts.funcdesc_cnt++;
15508
0
        }
15509
0
    }
15510
0
    break;
15511
15512
0
    case R_ARM_GOT32:
15513
0
    case R_ARM_GOT_PREL:
15514
0
    case R_ARM_TLS_GD32:
15515
0
    case R_ARM_TLS_GD32_FDPIC:
15516
0
    case R_ARM_TLS_IE32:
15517
0
    case R_ARM_TLS_IE32_FDPIC:
15518
0
    case R_ARM_TLS_GOTDESC:
15519
0
    case R_ARM_TLS_DESCSEQ:
15520
0
    case R_ARM_THM_TLS_DESCSEQ:
15521
0
    case R_ARM_TLS_CALL:
15522
0
    case R_ARM_THM_TLS_CALL:
15523
      /* This symbol requires a global offset table entry.  */
15524
0
      {
15525
0
        int tls_type, old_tls_type;
15526
15527
0
        switch (r_type)
15528
0
    {
15529
0
    case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
15530
0
    case R_ARM_TLS_GD32_FDPIC: tls_type = GOT_TLS_GD; break;
15531
15532
0
    case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
15533
0
    case R_ARM_TLS_IE32_FDPIC: tls_type = GOT_TLS_IE; break;
15534
15535
0
    case R_ARM_TLS_GOTDESC:
15536
0
    case R_ARM_TLS_CALL: case R_ARM_THM_TLS_CALL:
15537
0
    case R_ARM_TLS_DESCSEQ: case R_ARM_THM_TLS_DESCSEQ:
15538
0
      tls_type = GOT_TLS_GDESC; break;
15539
15540
0
    default: tls_type = GOT_NORMAL; break;
15541
0
    }
15542
15543
0
        if (!bfd_link_executable (info) && (tls_type & GOT_TLS_IE))
15544
0
    info->flags |= DF_STATIC_TLS;
15545
15546
0
        if (h != NULL)
15547
0
    {
15548
0
      h->got.refcount++;
15549
0
      old_tls_type = elf32_arm_hash_entry (h)->tls_type;
15550
0
    }
15551
0
        else
15552
0
    {
15553
      /* This is a global offset table entry for a local symbol.  */
15554
0
      if (!elf32_arm_allocate_local_sym_info (abfd))
15555
0
        return false;
15556
0
      if (r_symndx >= elf32_arm_num_entries (abfd))
15557
0
        {
15558
0
          _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd,
15559
0
            r_symndx);
15560
0
          return false;
15561
0
        }
15562
15563
0
      elf_local_got_refcounts (abfd)[r_symndx] += 1;
15564
0
      old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
15565
0
    }
15566
15567
        /* If a variable is accessed with both tls methods, two
15568
     slots may be created.  */
15569
0
        if (GOT_TLS_GD_ANY_P (old_tls_type)
15570
0
      && GOT_TLS_GD_ANY_P (tls_type))
15571
0
    tls_type |= old_tls_type;
15572
15573
        /* We will already have issued an error message if there
15574
     is a TLS/non-TLS mismatch, based on the symbol
15575
     type.  So just combine any TLS types needed.  */
15576
0
        if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
15577
0
      && tls_type != GOT_NORMAL)
15578
0
    tls_type |= old_tls_type;
15579
15580
        /* If the symbol is accessed in both IE and GDESC
15581
     method, we're able to relax. Turn off the GDESC flag,
15582
     without messing up with any other kind of tls types
15583
     that may be involved.  */
15584
0
        if ((tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_GDESC))
15585
0
    tls_type &= ~GOT_TLS_GDESC;
15586
15587
0
        if (old_tls_type != tls_type)
15588
0
    {
15589
0
      if (h != NULL)
15590
0
        elf32_arm_hash_entry (h)->tls_type = tls_type;
15591
0
      else
15592
0
        elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
15593
0
    }
15594
0
      }
15595
      /* Fall through.  */
15596
15597
0
    case R_ARM_TLS_LDM32:
15598
0
    case R_ARM_TLS_LDM32_FDPIC:
15599
0
      if (r_type == R_ARM_TLS_LDM32 || r_type == R_ARM_TLS_LDM32_FDPIC)
15600
0
    htab->tls_ldm_got.refcount++;
15601
      /* Fall through.  */
15602
15603
0
    case R_ARM_GOTOFF32:
15604
0
    case R_ARM_GOTPC:
15605
0
      if (htab->root.sgot == NULL
15606
0
    && !create_got_section (htab->root.dynobj, info))
15607
0
        return false;
15608
0
      break;
15609
15610
0
    case R_ARM_PC24:
15611
0
    case R_ARM_PLT32:
15612
0
    case R_ARM_CALL:
15613
0
    case R_ARM_JUMP24:
15614
0
    case R_ARM_PREL31:
15615
0
    case R_ARM_THM_CALL:
15616
0
    case R_ARM_THM_JUMP24:
15617
0
    case R_ARM_THM_JUMP19:
15618
0
      call_reloc_p = true;
15619
0
      may_need_local_target_p = true;
15620
0
      break;
15621
15622
0
    case R_ARM_ABS12:
15623
      /* VxWorks uses dynamic R_ARM_ABS12 relocations for
15624
         ldr __GOTT_INDEX__ offsets.  */
15625
0
      if (htab->root.target_os != is_vxworks)
15626
0
        {
15627
0
    may_need_local_target_p = true;
15628
0
    break;
15629
0
        }
15630
0
      else goto jump_over;
15631
15632
      /* Fall through.  */
15633
15634
0
    case R_ARM_MOVW_ABS_NC:
15635
0
    case R_ARM_MOVT_ABS:
15636
0
    case R_ARM_THM_MOVW_ABS_NC:
15637
0
    case R_ARM_THM_MOVT_ABS:
15638
0
      if (bfd_link_pic (info))
15639
0
        {
15640
0
    _bfd_error_handler
15641
0
      (_("%pB: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
15642
0
       abfd, elf32_arm_howto_table_1[r_type].name,
15643
0
       (h) ? h->root.root.string : "a local symbol");
15644
0
    bfd_set_error (bfd_error_bad_value);
15645
0
    return false;
15646
0
        }
15647
15648
      /* Fall through.  */
15649
0
    case R_ARM_ABS32:
15650
0
    case R_ARM_ABS32_NOI:
15651
0
  jump_over:
15652
0
      if (h != NULL && bfd_link_executable (info))
15653
0
        {
15654
0
    h->pointer_equality_needed = 1;
15655
0
        }
15656
      /* Fall through.  */
15657
0
    case R_ARM_REL32:
15658
0
    case R_ARM_REL32_NOI:
15659
0
    case R_ARM_MOVW_PREL_NC:
15660
0
    case R_ARM_MOVT_PREL:
15661
0
    case R_ARM_THM_MOVW_PREL_NC:
15662
0
    case R_ARM_THM_MOVT_PREL:
15663
15664
      /* Should the interworking branches be listed here?  */
15665
0
      if ((bfd_link_pic (info)
15666
0
     || htab->fdpic_p)
15667
0
    && (sec->flags & SEC_ALLOC) != 0)
15668
0
        {
15669
0
    if (h == NULL
15670
0
        && elf32_arm_howto_from_type (r_type)->pc_relative)
15671
0
      {
15672
        /* In shared libraries and relocatable executables,
15673
           we treat local relative references as calls;
15674
           see the related SYMBOL_CALLS_LOCAL code in
15675
           allocate_dynrelocs.  */
15676
0
        call_reloc_p = true;
15677
0
        may_need_local_target_p = true;
15678
0
      }
15679
0
    else
15680
      /* We are creating a shared library or relocatable
15681
         executable, and this is a reloc against a global symbol,
15682
         or a non-PC-relative reloc against a local symbol.
15683
         We may need to copy the reloc into the output.  */
15684
0
      may_become_dynamic_p = true;
15685
0
        }
15686
0
      else
15687
0
        may_need_local_target_p = true;
15688
0
      break;
15689
15690
  /* This relocation describes the C++ object vtable hierarchy.
15691
     Reconstruct it for later use during GC.  */
15692
0
  case R_ARM_GNU_VTINHERIT:
15693
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
15694
0
      return false;
15695
0
    break;
15696
15697
  /* This relocation describes which C++ vtable entries are actually
15698
     used.  Record for later use during GC.  */
15699
0
  case R_ARM_GNU_VTENTRY:
15700
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
15701
0
      return false;
15702
0
    break;
15703
0
  }
15704
15705
0
      if (h != NULL)
15706
0
  {
15707
0
    if (call_reloc_p)
15708
      /* We may need a .plt entry if the function this reloc
15709
         refers to is in a different object, regardless of the
15710
         symbol's type.  We can't tell for sure yet, because
15711
         something later might force the symbol local.  */
15712
0
      h->needs_plt = 1;
15713
0
    else if (may_need_local_target_p)
15714
      /* If this reloc is in a read-only section, we might
15715
         need a copy reloc.  We can't check reliably at this
15716
         stage whether the section is read-only, as input
15717
         sections have not yet been mapped to output sections.
15718
         Tentatively set the flag for now, and correct in
15719
         adjust_dynamic_symbol.  */
15720
0
      h->non_got_ref = 1;
15721
0
  }
15722
15723
0
      if (may_need_local_target_p
15724
0
    && (h != NULL || ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC))
15725
0
  {
15726
0
    union gotplt_union *root_plt;
15727
0
    struct arm_plt_info *arm_plt;
15728
0
    struct arm_local_iplt_info *local_iplt;
15729
15730
0
    if (h != NULL)
15731
0
      {
15732
0
        root_plt = &h->plt;
15733
0
        arm_plt = &eh->plt;
15734
0
      }
15735
0
    else
15736
0
      {
15737
0
        local_iplt = elf32_arm_create_local_iplt (abfd, r_symndx);
15738
0
        if (local_iplt == NULL)
15739
0
    return false;
15740
0
        root_plt = &local_iplt->root;
15741
0
        arm_plt = &local_iplt->arm;
15742
0
      }
15743
15744
    /* If the symbol is a function that doesn't bind locally,
15745
       this relocation will need a PLT entry.  */
15746
0
    if (root_plt->refcount != -1)
15747
0
      root_plt->refcount += 1;
15748
15749
0
    if (!call_reloc_p)
15750
0
      arm_plt->noncall_refcount++;
15751
15752
    /* It's too early to use htab->use_blx here, so we have to
15753
       record possible blx references separately from
15754
       relocs that definitely need a thumb stub.  */
15755
15756
0
    if (r_type == R_ARM_THM_CALL)
15757
0
      arm_plt->maybe_thumb_refcount += 1;
15758
15759
0
    if (r_type == R_ARM_THM_JUMP24
15760
0
        || r_type == R_ARM_THM_JUMP19)
15761
0
      arm_plt->thumb_refcount += 1;
15762
0
  }
15763
15764
0
      if (may_become_dynamic_p)
15765
0
  {
15766
0
    struct elf_dyn_relocs *p, **head;
15767
15768
    /* Create a reloc section in dynobj.  */
15769
0
    if (sreloc == NULL)
15770
0
      {
15771
0
        sreloc = _bfd_elf_make_dynamic_reloc_section
15772
0
    (sec, dynobj, 2, abfd, ! htab->use_rel);
15773
15774
0
        if (sreloc == NULL)
15775
0
    return false;
15776
0
      }
15777
15778
    /* If this is a global symbol, count the number of
15779
       relocations we need for this symbol.  */
15780
0
    if (h != NULL)
15781
0
      head = &h->dyn_relocs;
15782
0
    else
15783
0
      {
15784
0
        head = elf32_arm_get_local_dynreloc_list (abfd, r_symndx, isym);
15785
0
        if (head == NULL)
15786
0
    return false;
15787
0
      }
15788
15789
0
    p = *head;
15790
0
    if (p == NULL || p->sec != sec)
15791
0
      {
15792
0
        size_t amt = sizeof *p;
15793
15794
0
        p = (struct elf_dyn_relocs *) bfd_alloc (htab->root.dynobj, amt);
15795
0
        if (p == NULL)
15796
0
    return false;
15797
0
        p->next = *head;
15798
0
        *head = p;
15799
0
        p->sec = sec;
15800
0
        p->count = 0;
15801
0
        p->pc_count = 0;
15802
0
      }
15803
15804
0
    if (elf32_arm_howto_from_type (r_type)->pc_relative)
15805
0
      p->pc_count += 1;
15806
0
    p->count += 1;
15807
0
    if (h == NULL && htab->fdpic_p && !bfd_link_pic (info)
15808
0
        && r_type != R_ARM_ABS32 && r_type != R_ARM_ABS32_NOI)
15809
0
      {
15810
        /* Here we only support R_ARM_ABS32 and R_ARM_ABS32_NOI
15811
     that will become rofixup.  */
15812
        /* This is due to the fact that we suppose all will become rofixup.  */
15813
0
        _bfd_error_handler
15814
0
    (_("FDPIC does not yet support %s relocation"
15815
0
       " to become dynamic for executable"),
15816
0
     elf32_arm_howto_table_1[r_type].name);
15817
0
        abort ();
15818
0
      }
15819
0
  }
15820
0
    }
15821
15822
0
  return true;
15823
0
}
15824
15825
static void
15826
elf32_arm_update_relocs (asection *o,
15827
       struct bfd_elf_section_reloc_data *reldata)
15828
0
{
15829
0
  void (*swap_in) (bfd *, const bfd_byte *, Elf_Internal_Rela *);
15830
0
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
15831
0
  const struct elf_backend_data *bed;
15832
0
  _arm_elf_section_data *eado;
15833
0
  struct bfd_link_order *p;
15834
0
  bfd_byte *erela_head, *erela;
15835
0
  Elf_Internal_Rela *irela_head, *irela;
15836
0
  Elf_Internal_Shdr *rel_hdr;
15837
0
  bfd *abfd;
15838
0
  unsigned int count;
15839
15840
0
  eado = get_arm_elf_section_data (o);
15841
15842
0
  if (!eado || eado->elf.this_hdr.sh_type != SHT_ARM_EXIDX)
15843
0
    return;
15844
15845
0
  abfd = o->owner;
15846
0
  bed = get_elf_backend_data (abfd);
15847
0
  rel_hdr = reldata->hdr;
15848
15849
0
  if (rel_hdr->sh_entsize == bed->s->sizeof_rel)
15850
0
    {
15851
0
      swap_in = bed->s->swap_reloc_in;
15852
0
      swap_out = bed->s->swap_reloc_out;
15853
0
    }
15854
0
  else if (rel_hdr->sh_entsize == bed->s->sizeof_rela)
15855
0
    {
15856
0
      swap_in = bed->s->swap_reloca_in;
15857
0
      swap_out = bed->s->swap_reloca_out;
15858
0
    }
15859
0
  else
15860
0
    abort ();
15861
15862
0
  erela_head = rel_hdr->contents;
15863
0
  irela_head = (Elf_Internal_Rela *) bfd_zmalloc
15864
0
    ((NUM_SHDR_ENTRIES (rel_hdr) + 1) * sizeof (*irela_head));
15865
15866
0
  erela = erela_head;
15867
0
  irela = irela_head;
15868
0
  count = 0;
15869
15870
0
  for (p = o->map_head.link_order; p; p = p->next)
15871
0
    {
15872
0
      if (p->type == bfd_section_reloc_link_order
15873
0
    || p->type == bfd_symbol_reloc_link_order)
15874
0
  {
15875
0
    (*swap_in) (abfd, erela, irela);
15876
0
    erela += rel_hdr->sh_entsize;
15877
0
    irela++;
15878
0
    count++;
15879
0
  }
15880
0
      else if (p->type == bfd_indirect_link_order)
15881
0
  {
15882
0
    struct bfd_elf_section_reloc_data *input_reldata;
15883
0
    arm_unwind_table_edit *edit_list, *edit_tail;
15884
0
    _arm_elf_section_data *eadi;
15885
0
    bfd_size_type j;
15886
0
    bfd_vma offset;
15887
0
    asection *i;
15888
15889
0
    i = p->u.indirect.section;
15890
15891
0
    eadi = get_arm_elf_section_data (i);
15892
0
    edit_list = eadi->u.exidx.unwind_edit_list;
15893
0
    edit_tail = eadi->u.exidx.unwind_edit_tail;
15894
0
    offset = i->output_offset;
15895
15896
0
    if (eadi->elf.rel.hdr &&
15897
0
        eadi->elf.rel.hdr->sh_entsize == rel_hdr->sh_entsize)
15898
0
      input_reldata = &eadi->elf.rel;
15899
0
    else if (eadi->elf.rela.hdr &&
15900
0
       eadi->elf.rela.hdr->sh_entsize == rel_hdr->sh_entsize)
15901
0
      input_reldata = &eadi->elf.rela;
15902
0
    else
15903
0
      abort ();
15904
15905
0
    if (edit_list)
15906
0
      {
15907
0
        for (j = 0; j < NUM_SHDR_ENTRIES (input_reldata->hdr); j++)
15908
0
    {
15909
0
      arm_unwind_table_edit *edit_node, *edit_next;
15910
0
      bfd_vma bias;
15911
0
      bfd_vma reloc_index;
15912
15913
0
      (*swap_in) (abfd, erela, irela);
15914
0
      reloc_index = (irela->r_offset - offset) / 8;
15915
15916
0
      bias = 0;
15917
0
      edit_node = edit_list;
15918
0
      for (edit_next = edit_list;
15919
0
           edit_next && edit_next->index <= reloc_index;
15920
0
           edit_next = edit_node->next)
15921
0
        {
15922
0
          bias++;
15923
0
          edit_node = edit_next;
15924
0
        }
15925
15926
0
      if (edit_node->type != DELETE_EXIDX_ENTRY
15927
0
          || edit_node->index != reloc_index)
15928
0
        {
15929
0
          irela->r_offset -= bias * 8;
15930
0
          irela++;
15931
0
          count++;
15932
0
        }
15933
15934
0
      erela += rel_hdr->sh_entsize;
15935
0
    }
15936
15937
0
        if (edit_tail->type == INSERT_EXIDX_CANTUNWIND_AT_END)
15938
0
    {
15939
      /* New relocation entity.  */
15940
0
      asection *text_sec = edit_tail->linked_section;
15941
0
      asection *text_out = text_sec->output_section;
15942
0
      bfd_vma exidx_offset = offset + i->size - 8;
15943
15944
0
      irela->r_addend = 0;
15945
0
      irela->r_offset = exidx_offset;
15946
0
      irela->r_info = ELF32_R_INFO
15947
0
        (text_out->target_index, R_ARM_PREL31);
15948
0
      irela++;
15949
0
      count++;
15950
0
    }
15951
0
      }
15952
0
    else
15953
0
      {
15954
0
        for (j = 0; j < NUM_SHDR_ENTRIES (input_reldata->hdr); j++)
15955
0
    {
15956
0
      (*swap_in) (abfd, erela, irela);
15957
0
      erela += rel_hdr->sh_entsize;
15958
0
      irela++;
15959
0
    }
15960
15961
0
        count += NUM_SHDR_ENTRIES (input_reldata->hdr);
15962
0
      }
15963
0
  }
15964
0
    }
15965
15966
0
  reldata->count = count;
15967
0
  rel_hdr->sh_size = count * rel_hdr->sh_entsize;
15968
15969
0
  erela = erela_head;
15970
0
  irela = irela_head;
15971
0
  while (count > 0)
15972
0
    {
15973
0
      (*swap_out) (abfd, irela, erela);
15974
0
      erela += rel_hdr->sh_entsize;
15975
0
      irela++;
15976
0
      count--;
15977
0
    }
15978
15979
0
  free (irela_head);
15980
15981
  /* Hashes are no longer valid.  */
15982
0
  free (reldata->hashes);
15983
0
  reldata->hashes = NULL;
15984
0
}
15985
15986
/* Unwinding tables are not referenced directly.  This pass marks them as
15987
   required if the corresponding code section is marked.  Similarly, ARMv8-M
15988
   secure entry functions can only be referenced by SG veneers which are
15989
   created after the GC process. They need to be marked in case they reside in
15990
   their own section (as would be the case if code was compiled with
15991
   -ffunction-sections).  */
15992
15993
static bool
15994
elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
15995
          elf_gc_mark_hook_fn gc_mark_hook)
15996
0
{
15997
0
  bfd *sub;
15998
0
  Elf_Internal_Shdr **elf_shdrp;
15999
0
  asection *cmse_sec;
16000
0
  obj_attribute *out_attr;
16001
0
  Elf_Internal_Shdr *symtab_hdr;
16002
0
  unsigned i, sym_count, ext_start;
16003
0
  const struct elf_backend_data *bed;
16004
0
  struct elf_link_hash_entry **sym_hashes;
16005
0
  struct elf32_arm_link_hash_entry *cmse_hash;
16006
0
  bool again, is_v8m, first_bfd_browse = true;
16007
0
  bool extra_marks_added = false;
16008
0
  asection *isec;
16009
16010
0
  _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
16011
16012
0
  out_attr = elf_known_obj_attributes_proc (info->output_bfd);
16013
0
  is_v8m = out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V8M_BASE
16014
0
     && out_attr[Tag_CPU_arch_profile].i == 'M';
16015
16016
  /* Marking EH data may cause additional code sections to be marked,
16017
     requiring multiple passes.  */
16018
0
  again = true;
16019
0
  while (again)
16020
0
    {
16021
0
      again = false;
16022
0
      for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
16023
0
  {
16024
0
    asection *o;
16025
16026
0
    if (! is_arm_elf (sub))
16027
0
      continue;
16028
16029
0
    elf_shdrp = elf_elfsections (sub);
16030
0
    for (o = sub->sections; o != NULL; o = o->next)
16031
0
      {
16032
0
        Elf_Internal_Shdr *hdr;
16033
16034
0
        hdr = &elf_section_data (o)->this_hdr;
16035
0
        if (hdr->sh_type == SHT_ARM_EXIDX
16036
0
      && hdr->sh_link
16037
0
      && hdr->sh_link < elf_numsections (sub)
16038
0
      && !o->gc_mark
16039
0
      && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
16040
0
    {
16041
0
      again = true;
16042
0
      if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
16043
0
        return false;
16044
0
    }
16045
0
      }
16046
16047
    /* Mark section holding ARMv8-M secure entry functions.  We mark all
16048
       of them so no need for a second browsing.  */
16049
0
    if (is_v8m && first_bfd_browse)
16050
0
      {
16051
0
        bool debug_sec_need_to_be_marked = false;
16052
16053
0
        sym_hashes = elf_sym_hashes (sub);
16054
0
        bed = get_elf_backend_data (sub);
16055
0
        symtab_hdr = &elf_tdata (sub)->symtab_hdr;
16056
0
        sym_count = symtab_hdr->sh_size / bed->s->sizeof_sym;
16057
0
        ext_start = symtab_hdr->sh_info;
16058
16059
        /* Scan symbols.  */
16060
0
        for (i = ext_start; i < sym_count; i++)
16061
0
    {
16062
0
      cmse_hash = elf32_arm_hash_entry (sym_hashes[i - ext_start]);
16063
0
      if (cmse_hash == NULL)
16064
0
        continue;
16065
16066
      /* Assume it is a special symbol.  If not, cmse_scan will
16067
         warn about it and user can do something about it.  */
16068
0
      if (startswith (cmse_hash->root.root.root.string,
16069
0
          CMSE_PREFIX))
16070
0
        {
16071
0
          cmse_sec = cmse_hash->root.root.u.def.section;
16072
0
          if (!cmse_sec->gc_mark
16073
0
        && !_bfd_elf_gc_mark (info, cmse_sec, gc_mark_hook))
16074
0
      return false;
16075
          /* The debug sections related to these secure entry
16076
       functions are marked on enabling below flag.  */
16077
0
          debug_sec_need_to_be_marked = true;
16078
0
        }
16079
0
    }
16080
16081
0
        if (debug_sec_need_to_be_marked)
16082
0
    {
16083
      /* Looping over all the sections of the object file containing
16084
         Armv8-M secure entry functions and marking all the debug
16085
         sections.  */
16086
0
      for (isec = sub->sections; isec != NULL; isec = isec->next)
16087
0
        {
16088
          /* If not a debug sections, skip it.  */
16089
0
          if (!isec->gc_mark && (isec->flags & SEC_DEBUGGING))
16090
0
      {
16091
0
        isec->gc_mark = 1;
16092
0
        extra_marks_added = true;
16093
0
      }
16094
0
        }
16095
0
      debug_sec_need_to_be_marked = false;
16096
0
    }
16097
0
      }
16098
0
  }
16099
16100
0
      first_bfd_browse = false;
16101
0
    }
16102
16103
  /* PR 30354: If we have added extra marks then make sure that any
16104
     dependencies of the newly marked sections are also marked.  */
16105
0
  if (extra_marks_added)
16106
0
    _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
16107
16108
0
  return true;
16109
0
}
16110
16111
/* Treat mapping symbols as special target symbols.  */
16112
16113
static bool
16114
elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
16115
0
{
16116
0
  return bfd_is_arm_special_symbol_name (sym->name,
16117
0
           BFD_ARM_SPECIAL_SYM_TYPE_ANY);
16118
0
}
16119
16120
/* If the ELF symbol SYM might be a function in SEC, return the
16121
   function size and set *CODE_OFF to the function's entry point,
16122
   otherwise return zero.  */
16123
16124
static bfd_size_type
16125
elf32_arm_maybe_function_sym (const asymbol *sym, asection *sec,
16126
            bfd_vma *code_off)
16127
0
{
16128
0
  bfd_size_type size;
16129
0
  elf_symbol_type * elf_sym = (elf_symbol_type *) sym;
16130
16131
0
  if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
16132
0
         | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
16133
0
      || sym->section != sec)
16134
0
    return 0;
16135
16136
0
  size = (sym->flags & BSF_SYNTHETIC) ? 0 : elf_sym->internal_elf_sym.st_size;
16137
16138
0
  if (!(sym->flags & BSF_SYNTHETIC))
16139
0
    switch (ELF_ST_TYPE (elf_sym->internal_elf_sym.st_info))
16140
0
      {
16141
0
  case STT_NOTYPE:
16142
    /* Ignore symbols created by the annobin plugin for gcc and clang.
16143
       These symbols are hidden, local, notype and have a size of 0.  */
16144
0
    if (size == 0
16145
0
        && sym->flags & BSF_LOCAL
16146
0
        && ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other) == STV_HIDDEN)
16147
0
      return 0;
16148
    /* Fall through.  */
16149
0
  case STT_FUNC:
16150
0
  case STT_ARM_TFUNC:
16151
    /* FIXME: Allow STT_GNU_IFUNC as well ?  */
16152
0
    break;
16153
0
  default:
16154
0
    return 0;
16155
0
      }
16156
16157
0
  if ((sym->flags & BSF_LOCAL)
16158
0
      && bfd_is_arm_special_symbol_name (sym->name,
16159
0
           BFD_ARM_SPECIAL_SYM_TYPE_ANY))
16160
0
    return 0;
16161
16162
0
  *code_off = sym->value;
16163
16164
  /* Do not return 0 for the function's size.  */
16165
0
  return size ? size : 1;
16166
16167
0
}
16168
16169
static bool
16170
elf32_arm_find_inliner_info (bfd *      abfd,
16171
           const char **  filename_ptr,
16172
           const char **  functionname_ptr,
16173
           unsigned int * line_ptr)
16174
0
{
16175
0
  bool found;
16176
0
  found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
16177
0
           functionname_ptr, line_ptr,
16178
0
           & elf_tdata (abfd)->dwarf2_find_line_info);
16179
0
  return found;
16180
0
}
16181
16182
/* Adjust a symbol defined by a dynamic object and referenced by a
16183
   regular object.  The current definition is in some section of the
16184
   dynamic object, but we're not including those sections.  We have to
16185
   change the definition to something the rest of the link can
16186
   understand.  */
16187
16188
static bool
16189
elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
16190
         struct elf_link_hash_entry * h)
16191
0
{
16192
0
  bfd * dynobj;
16193
0
  asection *s, *srel;
16194
0
  struct elf32_arm_link_hash_entry * eh;
16195
0
  struct elf32_arm_link_hash_table *globals;
16196
16197
0
  globals = elf32_arm_hash_table (info);
16198
0
  if (globals == NULL)
16199
0
    return false;
16200
16201
0
  dynobj = elf_hash_table (info)->dynobj;
16202
16203
  /* Make sure we know what is going on here.  */
16204
0
  BFD_ASSERT (dynobj != NULL
16205
0
        && (h->needs_plt
16206
0
      || h->type == STT_GNU_IFUNC
16207
0
      || h->is_weakalias
16208
0
      || (h->def_dynamic
16209
0
          && h->ref_regular
16210
0
          && !h->def_regular)));
16211
16212
0
  eh = (struct elf32_arm_link_hash_entry *) h;
16213
16214
  /* If this is a function, put it in the procedure linkage table.  We
16215
     will fill in the contents of the procedure linkage table later,
16216
     when we know the address of the .got section.  */
16217
0
  if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
16218
0
    {
16219
      /* Calls to STT_GNU_IFUNC symbols always use a PLT, even if the
16220
   symbol binds locally.  */
16221
0
      if (h->plt.refcount <= 0
16222
0
    || (h->type != STT_GNU_IFUNC
16223
0
        && (SYMBOL_CALLS_LOCAL (info, h)
16224
0
      || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
16225
0
          && h->root.type == bfd_link_hash_undefweak))))
16226
0
  {
16227
    /* This case can occur if we saw a PLT32 reloc in an input
16228
       file, but the symbol was never referred to by a dynamic
16229
       object, or if all references were garbage collected.  In
16230
       such a case, we don't actually need to build a procedure
16231
       linkage table, and we can just do a PC24 reloc instead.  */
16232
0
    h->plt.offset = (bfd_vma) -1;
16233
0
    eh->plt.thumb_refcount = 0;
16234
0
    eh->plt.maybe_thumb_refcount = 0;
16235
0
    eh->plt.noncall_refcount = 0;
16236
0
    h->needs_plt = 0;
16237
0
  }
16238
16239
0
      return true;
16240
0
    }
16241
0
  else
16242
0
    {
16243
      /* It's possible that we incorrectly decided a .plt reloc was
16244
   needed for an R_ARM_PC24 or similar reloc to a non-function sym
16245
   in check_relocs.  We can't decide accurately between function
16246
   and non-function syms in check-relocs; Objects loaded later in
16247
   the link may change h->type.  So fix it now.  */
16248
0
      h->plt.offset = (bfd_vma) -1;
16249
0
      eh->plt.thumb_refcount = 0;
16250
0
      eh->plt.maybe_thumb_refcount = 0;
16251
0
      eh->plt.noncall_refcount = 0;
16252
0
    }
16253
16254
  /* If this is a weak symbol, and there is a real definition, the
16255
     processor independent code will have arranged for us to see the
16256
     real definition first, and we can just use the same value.  */
16257
0
  if (h->is_weakalias)
16258
0
    {
16259
0
      struct elf_link_hash_entry *def = weakdef (h);
16260
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
16261
0
      h->root.u.def.section = def->root.u.def.section;
16262
0
      h->root.u.def.value = def->root.u.def.value;
16263
0
      return true;
16264
0
    }
16265
16266
  /* If there are no non-GOT references, we do not need a copy
16267
     relocation.  */
16268
0
  if (!h->non_got_ref)
16269
0
    return true;
16270
16271
  /* This is a reference to a symbol defined by a dynamic object which
16272
     is not a function.  */
16273
16274
  /* If we are creating a shared library, we must presume that the
16275
     only references to the symbol are via the global offset table.
16276
     For such cases we need not do anything here; the relocations will
16277
     be handled correctly by relocate_section.  */
16278
0
  if (bfd_link_pic (info))
16279
0
    return true;
16280
16281
  /* We must allocate the symbol in our .dynbss section, which will
16282
     become part of the .bss section of the executable.  There will be
16283
     an entry for this symbol in the .dynsym section.  The dynamic
16284
     object will contain position independent code, so all references
16285
     from the dynamic object to this symbol will go through the global
16286
     offset table.  The dynamic linker will use the .dynsym entry to
16287
     determine the address it must put in the global offset table, so
16288
     both the dynamic object and the regular object will refer to the
16289
     same memory location for the variable.  */
16290
  /* If allowed, we must generate a R_ARM_COPY reloc to tell the dynamic
16291
     linker to copy the initial value out of the dynamic object and into
16292
     the runtime process image.  We need to remember the offset into the
16293
     .rel(a).bss section we are going to use.  */
16294
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
16295
0
    {
16296
0
      s = globals->root.sdynrelro;
16297
0
      srel = globals->root.sreldynrelro;
16298
0
    }
16299
0
  else
16300
0
    {
16301
0
      s = globals->root.sdynbss;
16302
0
      srel = globals->root.srelbss;
16303
0
    }
16304
0
  if (info->nocopyreloc == 0
16305
0
      && (h->root.u.def.section->flags & SEC_ALLOC) != 0
16306
0
      && h->size != 0)
16307
0
    {
16308
0
      elf32_arm_allocate_dynrelocs (info, srel, 1);
16309
0
      h->needs_copy = 1;
16310
0
    }
16311
16312
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
16313
0
}
16314
16315
/* Allocate space in .plt, .got and associated reloc sections for
16316
   dynamic relocs.  */
16317
16318
static bool
16319
allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
16320
0
{
16321
0
  struct bfd_link_info *info;
16322
0
  struct elf32_arm_link_hash_table *htab;
16323
0
  struct elf32_arm_link_hash_entry *eh;
16324
0
  struct elf_dyn_relocs *p;
16325
16326
0
  if (h->root.type == bfd_link_hash_indirect)
16327
0
    return true;
16328
16329
0
  eh = (struct elf32_arm_link_hash_entry *) h;
16330
16331
0
  info = (struct bfd_link_info *) inf;
16332
0
  htab = elf32_arm_hash_table (info);
16333
0
  if (htab == NULL)
16334
0
    return false;
16335
16336
0
  if ((htab->root.dynamic_sections_created || h->type == STT_GNU_IFUNC)
16337
0
      && h->plt.refcount > 0)
16338
0
    {
16339
      /* Make sure this symbol is output as a dynamic symbol.
16340
   Undefined weak syms won't yet be marked as dynamic.  */
16341
0
      if (h->dynindx == -1 && !h->forced_local
16342
0
    && h->root.type == bfd_link_hash_undefweak)
16343
0
  {
16344
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
16345
0
      return false;
16346
0
  }
16347
16348
      /* If the call in the PLT entry binds locally, the associated
16349
   GOT entry should use an R_ARM_IRELATIVE relocation instead of
16350
   the usual R_ARM_JUMP_SLOT.  Put it in the .iplt section rather
16351
   than the .plt section.  */
16352
0
      if (h->type == STT_GNU_IFUNC && SYMBOL_CALLS_LOCAL (info, h))
16353
0
  {
16354
0
    eh->is_iplt = 1;
16355
0
    if (eh->plt.noncall_refcount == 0
16356
0
        && SYMBOL_REFERENCES_LOCAL (info, h))
16357
      /* All non-call references can be resolved directly.
16358
         This means that they can (and in some cases, must)
16359
         resolve directly to the run-time target, rather than
16360
         to the PLT.  That in turns means that any .got entry
16361
         would be equal to the .igot.plt entry, so there's
16362
         no point having both.  */
16363
0
      h->got.refcount = 0;
16364
0
  }
16365
16366
0
      if (bfd_link_pic (info)
16367
0
    || eh->is_iplt
16368
0
    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
16369
0
  {
16370
0
    elf32_arm_allocate_plt_entry (info, eh->is_iplt, &h->plt, &eh->plt);
16371
16372
    /* If this symbol is not defined in a regular file, and we are
16373
       not generating a shared library, then set the symbol to this
16374
       location in the .plt.  This is required to make function
16375
       pointers compare as equal between the normal executable and
16376
       the shared library.  */
16377
0
    if (! bfd_link_pic (info)
16378
0
        && !h->def_regular)
16379
0
      {
16380
0
        h->root.u.def.section = htab->root.splt;
16381
0
        h->root.u.def.value = h->plt.offset;
16382
16383
        /* Make sure the function is not marked as Thumb, in case
16384
     it is the target of an ABS32 relocation, which will
16385
     point to the PLT entry.  */
16386
0
        ARM_SET_SYM_BRANCH_TYPE (h->target_internal, ST_BRANCH_TO_ARM);
16387
0
      }
16388
16389
    /* VxWorks executables have a second set of relocations for
16390
       each PLT entry.  They go in a separate relocation section,
16391
       which is processed by the kernel loader.  */
16392
0
    if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
16393
0
      {
16394
        /* There is a relocation for the initial PLT entry:
16395
     an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_.  */
16396
0
        if (h->plt.offset == htab->plt_header_size)
16397
0
    elf32_arm_allocate_dynrelocs (info, htab->srelplt2, 1);
16398
16399
        /* There are two extra relocations for each subsequent
16400
     PLT entry: an R_ARM_32 relocation for the GOT entry,
16401
     and an R_ARM_32 relocation for the PLT entry.  */
16402
0
        elf32_arm_allocate_dynrelocs (info, htab->srelplt2, 2);
16403
0
      }
16404
0
  }
16405
0
      else
16406
0
  {
16407
0
    h->plt.offset = (bfd_vma) -1;
16408
0
    h->needs_plt = 0;
16409
0
  }
16410
0
    }
16411
0
  else
16412
0
    {
16413
0
      h->plt.offset = (bfd_vma) -1;
16414
0
      h->needs_plt = 0;
16415
0
    }
16416
16417
0
  eh = (struct elf32_arm_link_hash_entry *) h;
16418
0
  eh->tlsdesc_got = (bfd_vma) -1;
16419
16420
0
  if (h->got.refcount > 0)
16421
0
    {
16422
0
      asection *s;
16423
0
      bool dyn;
16424
0
      int tls_type = elf32_arm_hash_entry (h)->tls_type;
16425
0
      int indx;
16426
16427
      /* Make sure this symbol is output as a dynamic symbol.
16428
   Undefined weak syms won't yet be marked as dynamic.  */
16429
0
      if (htab->root.dynamic_sections_created
16430
0
    && h->dynindx == -1
16431
0
    && !h->forced_local
16432
0
    && h->root.type == bfd_link_hash_undefweak)
16433
0
  {
16434
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
16435
0
      return false;
16436
0
  }
16437
16438
0
      s = htab->root.sgot;
16439
0
      h->got.offset = s->size;
16440
16441
0
      if (tls_type == GOT_UNKNOWN)
16442
0
  abort ();
16443
16444
0
      if (tls_type == GOT_NORMAL)
16445
  /* Non-TLS symbols need one GOT slot.  */
16446
0
  s->size += 4;
16447
0
      else
16448
0
  {
16449
0
    if (tls_type & GOT_TLS_GDESC)
16450
0
      {
16451
        /* R_ARM_TLS_DESC needs 2 GOT slots.  */
16452
0
        eh->tlsdesc_got
16453
0
    = (htab->root.sgotplt->size
16454
0
       - elf32_arm_compute_jump_table_size (htab));
16455
0
        htab->root.sgotplt->size += 8;
16456
0
        h->got.offset = (bfd_vma) -2;
16457
        /* plt.got_offset needs to know there's a TLS_DESC
16458
     reloc in the middle of .got.plt.  */
16459
0
        htab->num_tls_desc++;
16460
0
      }
16461
16462
0
    if (tls_type & GOT_TLS_GD)
16463
0
      {
16464
        /* R_ARM_TLS_GD32 and R_ARM_TLS_GD32_FDPIC need two
16465
     consecutive GOT slots.  If the symbol is both GD
16466
     and GDESC, got.offset may have been
16467
     overwritten.  */
16468
0
        h->got.offset = s->size;
16469
0
        s->size += 8;
16470
0
      }
16471
16472
0
    if (tls_type & GOT_TLS_IE)
16473
      /* R_ARM_TLS_IE32/R_ARM_TLS_IE32_FDPIC need one GOT
16474
         slot.  */
16475
0
      s->size += 4;
16476
0
  }
16477
16478
0
      dyn = htab->root.dynamic_sections_created;
16479
16480
0
      indx = 0;
16481
0
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
16482
0
    && (!bfd_link_pic (info)
16483
0
        || !SYMBOL_REFERENCES_LOCAL (info, h)))
16484
0
  indx = h->dynindx;
16485
16486
0
      if (tls_type != GOT_NORMAL
16487
0
    && (bfd_link_dll (info) || indx != 0)
16488
0
    && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
16489
0
        || h->root.type != bfd_link_hash_undefweak))
16490
0
  {
16491
0
    if (tls_type & GOT_TLS_IE)
16492
0
      elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16493
16494
0
    if (tls_type & GOT_TLS_GD)
16495
0
      elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16496
16497
0
    if (tls_type & GOT_TLS_GDESC)
16498
0
      {
16499
0
        elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
16500
        /* GDESC needs a trampoline to jump to.  */
16501
0
        htab->tls_trampoline = -1;
16502
0
      }
16503
16504
    /* Only GD needs it.  GDESC just emits one relocation per
16505
       2 entries.  */
16506
0
    if ((tls_type & GOT_TLS_GD) && indx != 0)
16507
0
      elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16508
0
  }
16509
0
      else if (((indx != -1) || htab->fdpic_p)
16510
0
         && !SYMBOL_REFERENCES_LOCAL (info, h))
16511
0
  {
16512
0
    if (htab->root.dynamic_sections_created)
16513
      /* Reserve room for the GOT entry's R_ARM_GLOB_DAT relocation.  */
16514
0
      elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16515
0
  }
16516
0
      else if (h->type == STT_GNU_IFUNC
16517
0
         && eh->plt.noncall_refcount == 0)
16518
  /* No non-call references resolve the STT_GNU_IFUNC's PLT entry;
16519
     they all resolve dynamically instead.  Reserve room for the
16520
     GOT entry's R_ARM_IRELATIVE relocation.  */
16521
0
  elf32_arm_allocate_irelocs (info, htab->root.srelgot, 1);
16522
0
      else if (bfd_link_pic (info)
16523
0
         && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
16524
  /* Reserve room for the GOT entry's R_ARM_RELATIVE relocation.  */
16525
0
  elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16526
0
      else if (htab->fdpic_p && tls_type == GOT_NORMAL)
16527
  /* Reserve room for rofixup for FDPIC executable.  */
16528
  /* TLS relocs do not need space since they are completely
16529
     resolved.  */
16530
0
  htab->srofixup->size += 4;
16531
0
    }
16532
0
  else
16533
0
    h->got.offset = (bfd_vma) -1;
16534
16535
  /* FDPIC support.  */
16536
0
  if (eh->fdpic_cnts.gotofffuncdesc_cnt > 0)
16537
0
    {
16538
      /* Symbol musn't be exported.  */
16539
0
      if (h->dynindx != -1)
16540
0
  abort ();
16541
16542
      /* We only allocate one function descriptor with its associated
16543
   relocation.  */
16544
0
      if (eh->fdpic_cnts.funcdesc_offset == -1)
16545
0
  {
16546
0
    asection *s = htab->root.sgot;
16547
16548
0
    eh->fdpic_cnts.funcdesc_offset = s->size;
16549
0
    s->size += 8;
16550
    /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16551
0
    if (bfd_link_pic (info))
16552
0
      elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16553
0
    else
16554
0
      htab->srofixup->size += 8;
16555
0
  }
16556
0
    }
16557
16558
0
  if (eh->fdpic_cnts.gotfuncdesc_cnt > 0)
16559
0
    {
16560
0
      asection *s = htab->root.sgot;
16561
16562
0
      if (htab->root.dynamic_sections_created && h->dynindx == -1
16563
0
    && !h->forced_local)
16564
0
  if (! bfd_elf_link_record_dynamic_symbol (info, h))
16565
0
    return false;
16566
16567
0
      if (h->dynindx == -1)
16568
0
  {
16569
    /* We only allocate one function descriptor with its
16570
       associated relocation.  */
16571
0
    if (eh->fdpic_cnts.funcdesc_offset == -1)
16572
0
      {
16573
16574
0
        eh->fdpic_cnts.funcdesc_offset = s->size;
16575
0
        s->size += 8;
16576
        /* We will add an R_ARM_FUNCDESC_VALUE relocation or two
16577
     rofixups.  */
16578
0
        if (bfd_link_pic (info))
16579
0
    elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16580
0
        else
16581
0
    htab->srofixup->size += 8;
16582
0
      }
16583
0
  }
16584
16585
      /* Add one entry into the GOT and a R_ARM_FUNCDESC or
16586
   R_ARM_RELATIVE/rofixup relocation on it.  */
16587
0
      eh->fdpic_cnts.gotfuncdesc_offset = s->size;
16588
0
      s->size += 4;
16589
0
      if (h->dynindx == -1 && !bfd_link_pic (info))
16590
0
  htab->srofixup->size += 4;
16591
0
      else
16592
0
  elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16593
0
    }
16594
16595
0
  if (eh->fdpic_cnts.funcdesc_cnt > 0)
16596
0
    {
16597
0
      if (htab->root.dynamic_sections_created && h->dynindx == -1
16598
0
    && !h->forced_local)
16599
0
  if (! bfd_elf_link_record_dynamic_symbol (info, h))
16600
0
    return false;
16601
16602
0
      if (h->dynindx == -1)
16603
0
  {
16604
    /* We only allocate one function descriptor with its
16605
       associated relocation.  */
16606
0
    if (eh->fdpic_cnts.funcdesc_offset == -1)
16607
0
      {
16608
0
        asection *s = htab->root.sgot;
16609
16610
0
        eh->fdpic_cnts.funcdesc_offset = s->size;
16611
0
        s->size += 8;
16612
        /* We will add an R_ARM_FUNCDESC_VALUE relocation or two
16613
     rofixups.  */
16614
0
        if (bfd_link_pic (info))
16615
0
    elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16616
0
        else
16617
0
    htab->srofixup->size += 8;
16618
0
      }
16619
0
  }
16620
0
      if (h->dynindx == -1 && !bfd_link_pic (info))
16621
0
  {
16622
    /* For FDPIC executable we replace R_ARM_RELATIVE with a rofixup.  */
16623
0
    htab->srofixup->size += 4 * eh->fdpic_cnts.funcdesc_cnt;
16624
0
  }
16625
0
      else
16626
0
  {
16627
    /* Will need one dynamic reloc per reference. will be either
16628
       R_ARM_FUNCDESC or R_ARM_RELATIVE for hidden symbols.  */
16629
0
    elf32_arm_allocate_dynrelocs (info, htab->root.srelgot,
16630
0
          eh->fdpic_cnts.funcdesc_cnt);
16631
0
  }
16632
0
    }
16633
16634
  /* Allocate stubs for exported Thumb functions on v4t.  */
16635
0
  if (!htab->use_blx && h->dynindx != -1
16636
0
      && h->def_regular
16637
0
      && ARM_GET_SYM_BRANCH_TYPE (h->target_internal) == ST_BRANCH_TO_THUMB
16638
0
      && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
16639
0
    {
16640
0
      struct elf_link_hash_entry * th;
16641
0
      struct bfd_link_hash_entry * bh;
16642
0
      struct elf_link_hash_entry * myh;
16643
0
      char name[1024];
16644
0
      asection *s;
16645
0
      bh = NULL;
16646
      /* Create a new symbol to regist the real location of the function.  */
16647
0
      s = h->root.u.def.section;
16648
0
      sprintf (name, "__real_%s", h->root.root.string);
16649
0
      _bfd_generic_link_add_one_symbol (info, s->owner,
16650
0
          name, BSF_GLOBAL, s,
16651
0
          h->root.u.def.value,
16652
0
          NULL, true, false, &bh);
16653
16654
0
      myh = (struct elf_link_hash_entry *) bh;
16655
0
      myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
16656
0
      myh->forced_local = 1;
16657
0
      ARM_SET_SYM_BRANCH_TYPE (myh->target_internal, ST_BRANCH_TO_THUMB);
16658
0
      eh->export_glue = myh;
16659
0
      th = record_arm_to_thumb_glue (info, h);
16660
      /* Point the symbol at the stub.  */
16661
0
      h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
16662
0
      ARM_SET_SYM_BRANCH_TYPE (h->target_internal, ST_BRANCH_TO_ARM);
16663
0
      h->root.u.def.section = th->root.u.def.section;
16664
0
      h->root.u.def.value = th->root.u.def.value & ~1;
16665
0
    }
16666
16667
0
  if (h->dyn_relocs == NULL)
16668
0
    return true;
16669
16670
  /* In the shared -Bsymbolic case, discard space allocated for
16671
     dynamic pc-relative relocs against symbols which turn out to be
16672
     defined in regular objects.  For the normal shared case, discard
16673
     space for pc-relative relocs that have become local due to symbol
16674
     visibility changes.  */
16675
16676
0
  if (bfd_link_pic (info)
16677
0
      || htab->fdpic_p)
16678
0
    {
16679
      /* Relocs that use pc_count are PC-relative forms, which will appear
16680
   on something like ".long foo - ." or "movw REG, foo - .".  We want
16681
   calls to protected symbols to resolve directly to the function
16682
   rather than going via the plt.  If people want function pointer
16683
   comparisons to work as expected then they should avoid writing
16684
   assembly like ".long foo - .".  */
16685
0
      if (SYMBOL_CALLS_LOCAL (info, h))
16686
0
  {
16687
0
    struct elf_dyn_relocs **pp;
16688
16689
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
16690
0
      {
16691
0
        p->count -= p->pc_count;
16692
0
        p->pc_count = 0;
16693
0
        if (p->count == 0)
16694
0
    *pp = p->next;
16695
0
        else
16696
0
    pp = &p->next;
16697
0
      }
16698
0
  }
16699
16700
0
      if (htab->root.target_os == is_vxworks)
16701
0
  {
16702
0
    struct elf_dyn_relocs **pp;
16703
16704
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
16705
0
      {
16706
0
        if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
16707
0
    *pp = p->next;
16708
0
        else
16709
0
    pp = &p->next;
16710
0
      }
16711
0
  }
16712
16713
      /* Also discard relocs on undefined weak syms with non-default
16714
   visibility.  */
16715
0
      if (h->dyn_relocs != NULL
16716
0
    && h->root.type == bfd_link_hash_undefweak)
16717
0
  {
16718
0
    if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
16719
0
        || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
16720
0
      h->dyn_relocs = NULL;
16721
16722
    /* Make sure undefined weak symbols are output as a dynamic
16723
       symbol in PIEs.  */
16724
0
    else if (htab->root.dynamic_sections_created && h->dynindx == -1
16725
0
       && !h->forced_local)
16726
0
      {
16727
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
16728
0
    return false;
16729
0
      }
16730
0
  }
16731
0
    }
16732
0
  else
16733
0
    {
16734
      /* For the non-shared case, discard space for relocs against
16735
   symbols which turn out to need copy relocs or are not
16736
   dynamic.  */
16737
16738
0
      if (!h->non_got_ref
16739
0
    && ((h->def_dynamic
16740
0
         && !h->def_regular)
16741
0
        || (htab->root.dynamic_sections_created
16742
0
      && (h->root.type == bfd_link_hash_undefweak
16743
0
          || h->root.type == bfd_link_hash_undefined))))
16744
0
  {
16745
    /* Make sure this symbol is output as a dynamic symbol.
16746
       Undefined weak syms won't yet be marked as dynamic.  */
16747
0
    if (h->dynindx == -1 && !h->forced_local
16748
0
        && h->root.type == bfd_link_hash_undefweak)
16749
0
      {
16750
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
16751
0
    return false;
16752
0
      }
16753
16754
    /* If that succeeded, we know we'll be keeping all the
16755
       relocs.  */
16756
0
    if (h->dynindx != -1)
16757
0
      goto keep;
16758
0
  }
16759
16760
0
      h->dyn_relocs = NULL;
16761
16762
0
    keep: ;
16763
0
    }
16764
16765
  /* Finally, allocate space.  */
16766
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
16767
0
    {
16768
0
      asection *sreloc = elf_section_data (p->sec)->sreloc;
16769
16770
0
      if (h->type == STT_GNU_IFUNC
16771
0
    && eh->plt.noncall_refcount == 0
16772
0
    && SYMBOL_REFERENCES_LOCAL (info, h))
16773
0
  elf32_arm_allocate_irelocs (info, sreloc, p->count);
16774
0
      else if (h->dynindx != -1
16775
0
         && (!bfd_link_pic (info) || !info->symbolic || !h->def_regular))
16776
0
  elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
16777
0
      else if (htab->fdpic_p && !bfd_link_pic (info))
16778
0
  htab->srofixup->size += 4 * p->count;
16779
0
      else
16780
0
  elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
16781
0
    }
16782
16783
0
  return true;
16784
0
}
16785
16786
void
16787
bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
16788
         int byteswap_code)
16789
0
{
16790
0
  struct elf32_arm_link_hash_table *globals;
16791
16792
0
  globals = elf32_arm_hash_table (info);
16793
0
  if (globals == NULL)
16794
0
    return;
16795
16796
0
  globals->byteswap_code = byteswap_code;
16797
0
}
16798
16799
/* Set the sizes of the dynamic sections.  */
16800
16801
static bool
16802
elf32_arm_late_size_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
16803
            struct bfd_link_info * info)
16804
0
{
16805
0
  bfd * dynobj;
16806
0
  asection * s;
16807
0
  bool relocs;
16808
0
  bfd *ibfd;
16809
0
  struct elf32_arm_link_hash_table *htab;
16810
16811
0
  htab = elf32_arm_hash_table (info);
16812
0
  if (htab == NULL)
16813
0
    return false;
16814
16815
0
  dynobj = elf_hash_table (info)->dynobj;
16816
0
  if (dynobj == NULL)
16817
0
    return true;
16818
16819
0
  check_use_blx (htab);
16820
16821
0
  if (elf_hash_table (info)->dynamic_sections_created)
16822
0
    {
16823
      /* Set the contents of the .interp section to the interpreter.  */
16824
0
      if (bfd_link_executable (info) && !info->nointerp)
16825
0
  {
16826
0
    s = bfd_get_linker_section (dynobj, ".interp");
16827
0
    BFD_ASSERT (s != NULL);
16828
0
    s->size = sizeof ELF_DYNAMIC_INTERPRETER;
16829
0
    s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
16830
0
    s->alloced = 1;
16831
0
  }
16832
0
    }
16833
16834
  /* Set up .got offsets for local syms, and space for local dynamic
16835
     relocs.  */
16836
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
16837
0
    {
16838
0
      bfd_signed_vma *local_got;
16839
0
      bfd_signed_vma *end_local_got;
16840
0
      struct arm_local_iplt_info **local_iplt_ptr, *local_iplt;
16841
0
      char *local_tls_type;
16842
0
      bfd_vma *local_tlsdesc_gotent;
16843
0
      bfd_size_type locsymcount;
16844
0
      Elf_Internal_Shdr *symtab_hdr;
16845
0
      asection *srel;
16846
0
      unsigned int symndx;
16847
0
      struct fdpic_local *local_fdpic_cnts;
16848
16849
0
      if (! is_arm_elf (ibfd))
16850
0
  continue;
16851
16852
0
      for (s = ibfd->sections; s != NULL; s = s->next)
16853
0
  {
16854
0
    struct elf_dyn_relocs *p;
16855
16856
0
    for (p = (struct elf_dyn_relocs *)
16857
0
       elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
16858
0
      {
16859
0
        if (!bfd_is_abs_section (p->sec)
16860
0
      && bfd_is_abs_section (p->sec->output_section))
16861
0
    {
16862
      /* Input section has been discarded, either because
16863
         it is a copy of a linkonce section or due to
16864
         linker script /DISCARD/, so we'll be discarding
16865
         the relocs too.  */
16866
0
    }
16867
0
        else if (htab->root.target_os == is_vxworks
16868
0
           && strcmp (p->sec->output_section->name,
16869
0
          ".tls_vars") == 0)
16870
0
    {
16871
      /* Relocations in vxworks .tls_vars sections are
16872
         handled specially by the loader.  */
16873
0
    }
16874
0
        else if (p->count != 0)
16875
0
    {
16876
0
      srel = elf_section_data (p->sec)->sreloc;
16877
0
      if (htab->fdpic_p && !bfd_link_pic (info))
16878
0
        htab->srofixup->size += 4 * p->count;
16879
0
      else
16880
0
        elf32_arm_allocate_dynrelocs (info, srel, p->count);
16881
0
      if ((p->sec->output_section->flags & SEC_READONLY) != 0)
16882
0
        info->flags |= DF_TEXTREL;
16883
0
    }
16884
0
      }
16885
0
  }
16886
16887
0
      local_got = elf_local_got_refcounts (ibfd);
16888
0
      if (local_got == NULL)
16889
0
  continue;
16890
16891
0
      symtab_hdr = & elf_symtab_hdr (ibfd);
16892
0
      locsymcount = symtab_hdr->sh_info;
16893
0
      end_local_got = local_got + locsymcount;
16894
0
      local_iplt_ptr = elf32_arm_local_iplt (ibfd);
16895
0
      local_tls_type = elf32_arm_local_got_tls_type (ibfd);
16896
0
      local_tlsdesc_gotent = elf32_arm_local_tlsdesc_gotent (ibfd);
16897
0
      local_fdpic_cnts = elf32_arm_local_fdpic_cnts (ibfd);
16898
0
      symndx = 0;
16899
0
      s = htab->root.sgot;
16900
0
      srel = htab->root.srelgot;
16901
0
      for (; local_got < end_local_got;
16902
0
     ++local_got, ++local_iplt_ptr, ++local_tls_type,
16903
0
     ++local_tlsdesc_gotent, ++symndx, ++local_fdpic_cnts)
16904
0
  {
16905
0
    if (symndx >= elf32_arm_num_entries (ibfd))
16906
0
      return false;
16907
16908
0
    *local_tlsdesc_gotent = (bfd_vma) -1;
16909
0
    local_iplt = *local_iplt_ptr;
16910
16911
    /* FDPIC support.  */
16912
0
    if (local_fdpic_cnts->gotofffuncdesc_cnt > 0)
16913
0
      {
16914
0
        if (local_fdpic_cnts->funcdesc_offset == -1)
16915
0
    {
16916
0
      local_fdpic_cnts->funcdesc_offset = s->size;
16917
0
      s->size += 8;
16918
16919
      /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16920
0
      if (bfd_link_pic (info))
16921
0
        elf32_arm_allocate_dynrelocs (info, srel, 1);
16922
0
      else
16923
0
        htab->srofixup->size += 8;
16924
0
    }
16925
0
      }
16926
16927
0
    if (local_fdpic_cnts->funcdesc_cnt > 0)
16928
0
      {
16929
0
        if (local_fdpic_cnts->funcdesc_offset == -1)
16930
0
    {
16931
0
      local_fdpic_cnts->funcdesc_offset = s->size;
16932
0
      s->size += 8;
16933
16934
      /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16935
0
      if (bfd_link_pic (info))
16936
0
        elf32_arm_allocate_dynrelocs (info, srel, 1);
16937
0
      else
16938
0
        htab->srofixup->size += 8;
16939
0
    }
16940
16941
        /* We will add n R_ARM_RELATIVE relocations or n rofixups.  */
16942
0
        if (bfd_link_pic (info))
16943
0
    elf32_arm_allocate_dynrelocs (info, srel, local_fdpic_cnts->funcdesc_cnt);
16944
0
        else
16945
0
    htab->srofixup->size += 4 * local_fdpic_cnts->funcdesc_cnt;
16946
0
      }
16947
16948
0
    if (local_iplt != NULL)
16949
0
      {
16950
0
        struct elf_dyn_relocs *p;
16951
16952
0
        if (local_iplt->root.refcount > 0)
16953
0
    {
16954
0
      elf32_arm_allocate_plt_entry (info, true,
16955
0
            &local_iplt->root,
16956
0
            &local_iplt->arm);
16957
0
      if (local_iplt->arm.noncall_refcount == 0)
16958
        /* All references to the PLT are calls, so all
16959
           non-call references can resolve directly to the
16960
           run-time target.  This means that the .got entry
16961
           would be the same as the .igot.plt entry, so there's
16962
           no point creating both.  */
16963
0
        *local_got = 0;
16964
0
    }
16965
0
        else
16966
0
    {
16967
0
      BFD_ASSERT (local_iplt->arm.noncall_refcount == 0);
16968
0
      local_iplt->root.offset = (bfd_vma) -1;
16969
0
    }
16970
16971
0
        for (p = local_iplt->dyn_relocs; p != NULL; p = p->next)
16972
0
    {
16973
0
      asection *psrel;
16974
16975
0
      psrel = elf_section_data (p->sec)->sreloc;
16976
0
      if (local_iplt->arm.noncall_refcount == 0)
16977
0
        elf32_arm_allocate_irelocs (info, psrel, p->count);
16978
0
      else
16979
0
        elf32_arm_allocate_dynrelocs (info, psrel, p->count);
16980
0
    }
16981
0
      }
16982
0
    if (*local_got > 0)
16983
0
      {
16984
0
        Elf_Internal_Sym *isym;
16985
16986
0
        *local_got = s->size;
16987
0
        if (*local_tls_type & GOT_TLS_GD)
16988
    /* TLS_GD relocs need an 8-byte structure in the GOT.  */
16989
0
    s->size += 8;
16990
0
        if (*local_tls_type & GOT_TLS_GDESC)
16991
0
    {
16992
0
      *local_tlsdesc_gotent = htab->root.sgotplt->size
16993
0
        - elf32_arm_compute_jump_table_size (htab);
16994
0
      htab->root.sgotplt->size += 8;
16995
0
      *local_got = (bfd_vma) -2;
16996
      /* plt.got_offset needs to know there's a TLS_DESC
16997
         reloc in the middle of .got.plt.  */
16998
0
      htab->num_tls_desc++;
16999
0
    }
17000
0
        if (*local_tls_type & GOT_TLS_IE)
17001
0
    s->size += 4;
17002
17003
0
        if (*local_tls_type & GOT_NORMAL)
17004
0
    {
17005
      /* If the symbol is both GD and GDESC, *local_got
17006
         may have been overwritten.  */
17007
0
      *local_got = s->size;
17008
0
      s->size += 4;
17009
0
    }
17010
17011
0
        isym = bfd_sym_from_r_symndx (&htab->root.sym_cache, ibfd,
17012
0
              symndx);
17013
0
        if (isym == NULL)
17014
0
    return false;
17015
17016
        /* If all references to an STT_GNU_IFUNC PLT are calls,
17017
     then all non-call references, including this GOT entry,
17018
     resolve directly to the run-time target.  */
17019
0
        if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
17020
0
      && (local_iplt == NULL
17021
0
          || local_iplt->arm.noncall_refcount == 0))
17022
0
    elf32_arm_allocate_irelocs (info, srel, 1);
17023
0
        else if (bfd_link_pic (info) || output_bfd->flags & DYNAMIC || htab->fdpic_p)
17024
0
    {
17025
0
      if ((bfd_link_pic (info) && !(*local_tls_type & GOT_TLS_GDESC)))
17026
0
        elf32_arm_allocate_dynrelocs (info, srel, 1);
17027
0
      else if (htab->fdpic_p && *local_tls_type & GOT_NORMAL)
17028
0
        htab->srofixup->size += 4;
17029
17030
0
      if ((bfd_link_pic (info) || htab->fdpic_p)
17031
0
          && *local_tls_type & GOT_TLS_GDESC)
17032
0
        {
17033
0
          elf32_arm_allocate_dynrelocs (info,
17034
0
                htab->root.srelplt, 1);
17035
0
          htab->tls_trampoline = -1;
17036
0
        }
17037
0
    }
17038
0
      }
17039
0
    else
17040
0
      *local_got = (bfd_vma) -1;
17041
0
  }
17042
0
    }
17043
17044
0
  if (htab->tls_ldm_got.refcount > 0)
17045
0
    {
17046
      /* Allocate two GOT entries and one dynamic relocation (if necessary)
17047
   for R_ARM_TLS_LDM32/R_ARM_TLS_LDM32_FDPIC relocations.  */
17048
0
      htab->tls_ldm_got.offset = htab->root.sgot->size;
17049
0
      htab->root.sgot->size += 8;
17050
0
      if (bfd_link_pic (info))
17051
0
  elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
17052
0
    }
17053
0
  else
17054
0
    htab->tls_ldm_got.offset = -1;
17055
17056
  /* At the very end of the .rofixup section is a pointer to the GOT,
17057
     reserve space for it. */
17058
0
  if (htab->fdpic_p && htab->srofixup != NULL)
17059
0
    htab->srofixup->size += 4;
17060
17061
  /* Allocate global sym .plt and .got entries, and space for global
17062
     sym dynamic relocs.  */
17063
0
  elf_link_hash_traverse (& htab->root, allocate_dynrelocs_for_symbol, info);
17064
17065
  /* Here we rummage through the found bfds to collect glue information.  */
17066
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
17067
0
    {
17068
0
      if (! is_arm_elf (ibfd))
17069
0
  continue;
17070
17071
      /* Initialise mapping tables for code/data.  */
17072
0
      bfd_elf32_arm_init_maps (ibfd);
17073
17074
0
      if (!bfd_elf32_arm_process_before_allocation (ibfd, info)
17075
0
    || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info)
17076
0
    || !bfd_elf32_arm_stm32l4xx_erratum_scan (ibfd, info))
17077
0
  _bfd_error_handler (_("errors encountered processing file %pB"), ibfd);
17078
0
    }
17079
17080
  /* Allocate space for the glue sections now that we've sized them.  */
17081
0
  bfd_elf32_arm_allocate_interworking_sections (info);
17082
17083
  /* For every jump slot reserved in the sgotplt, reloc_count is
17084
     incremented.  However, when we reserve space for TLS descriptors,
17085
     it's not incremented, so in order to compute the space reserved
17086
     for them, it suffices to multiply the reloc count by the jump
17087
     slot size.  */
17088
0
  if (htab->root.srelplt)
17089
0
    htab->sgotplt_jump_table_size = elf32_arm_compute_jump_table_size (htab);
17090
17091
0
  if (htab->tls_trampoline)
17092
0
    {
17093
0
      if (htab->root.splt->size == 0)
17094
0
  htab->root.splt->size += htab->plt_header_size;
17095
17096
0
      htab->tls_trampoline = htab->root.splt->size;
17097
0
      htab->root.splt->size += htab->plt_entry_size;
17098
17099
      /* If we're not using lazy TLS relocations, don't generate the
17100
   PLT and GOT entries they require.  */
17101
0
      if ((info->flags & DF_BIND_NOW))
17102
0
  htab->root.tlsdesc_plt = 0;
17103
0
      else
17104
0
  {
17105
0
    htab->root.tlsdesc_got = htab->root.sgot->size;
17106
0
    htab->root.sgot->size += 4;
17107
17108
0
    htab->root.tlsdesc_plt = htab->root.splt->size;
17109
0
    htab->root.splt->size += 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline);
17110
0
  }
17111
0
    }
17112
17113
  /* The check_relocs and adjust_dynamic_symbol entry points have
17114
     determined the sizes of the various dynamic sections.  Allocate
17115
     memory for them.  */
17116
0
  relocs = false;
17117
0
  for (s = dynobj->sections; s != NULL; s = s->next)
17118
0
    {
17119
0
      const char * name;
17120
17121
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
17122
0
  continue;
17123
17124
      /* It's OK to base decisions on the section name, because none
17125
   of the dynobj section names depend upon the input files.  */
17126
0
      name = bfd_section_name (s);
17127
17128
0
      if (s == htab->root.splt)
17129
0
  {
17130
    /* Remember whether there is a PLT.  */
17131
0
    ;
17132
0
  }
17133
0
      else if (startswith (name, ".rel"))
17134
0
  {
17135
0
    if (s->size != 0)
17136
0
      {
17137
        /* Remember whether there are any reloc sections other
17138
     than .rel(a).plt and .rela.plt.unloaded.  */
17139
0
        if (s != htab->root.srelplt && s != htab->srelplt2)
17140
0
    relocs = true;
17141
17142
        /* We use the reloc_count field as a counter if we need
17143
     to copy relocs into the output file.  */
17144
0
        s->reloc_count = 0;
17145
0
      }
17146
0
  }
17147
0
      else if (s != htab->root.sgot
17148
0
         && s != htab->root.sgotplt
17149
0
         && s != htab->root.iplt
17150
0
         && s != htab->root.igotplt
17151
0
         && s != htab->root.sdynbss
17152
0
         && s != htab->root.sdynrelro
17153
0
         && s != htab->srofixup)
17154
0
  {
17155
    /* It's not one of our sections, so don't allocate space.  */
17156
0
    continue;
17157
0
  }
17158
17159
0
      if (s->size == 0)
17160
0
  {
17161
    /* If we don't need this section, strip it from the
17162
       output file.  This is mostly to handle .rel(a).bss and
17163
       .rel(a).plt.  We must create both sections in
17164
       create_dynamic_sections, because they must be created
17165
       before the linker maps input sections to output
17166
       sections.  The linker does that before
17167
       adjust_dynamic_symbol is called, and it is that
17168
       function which decides whether anything needs to go
17169
       into these sections.  */
17170
0
    s->flags |= SEC_EXCLUDE;
17171
0
    continue;
17172
0
  }
17173
17174
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
17175
0
  continue;
17176
17177
      /* Allocate memory for the section contents.  */
17178
0
      s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
17179
0
      if (s->contents == NULL)
17180
0
  return false;
17181
0
      s->alloced = 1;
17182
0
    }
17183
17184
0
  return _bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
17185
0
              relocs);
17186
0
}
17187
17188
/* Size sections even though they're not dynamic.  We use it to setup
17189
   _TLS_MODULE_BASE_, if needed.  */
17190
17191
static bool
17192
elf32_arm_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
17193
0
{
17194
0
  asection *tls_sec;
17195
0
  struct elf32_arm_link_hash_table *htab;
17196
17197
0
  htab = elf32_arm_hash_table (info);
17198
17199
0
  if (bfd_link_relocatable (info))
17200
0
    return true;
17201
17202
0
  tls_sec = elf_hash_table (info)->tls_sec;
17203
17204
0
  if (tls_sec)
17205
0
    {
17206
0
      struct elf_link_hash_entry *tlsbase;
17207
17208
0
      tlsbase = elf_link_hash_lookup
17209
0
  (elf_hash_table (info), "_TLS_MODULE_BASE_", true, true, false);
17210
17211
0
      if (tlsbase)
17212
0
  {
17213
0
    struct bfd_link_hash_entry *bh = NULL;
17214
0
    const struct elf_backend_data *bed
17215
0
      = get_elf_backend_data (output_bfd);
17216
17217
0
    if (!(_bfd_generic_link_add_one_symbol
17218
0
    (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
17219
0
     tls_sec, 0, NULL, false,
17220
0
     bed->collect, &bh)))
17221
0
      return false;
17222
17223
0
    tlsbase->type = STT_TLS;
17224
0
    tlsbase = (struct elf_link_hash_entry *)bh;
17225
0
    tlsbase->def_regular = 1;
17226
0
    tlsbase->other = STV_HIDDEN;
17227
0
    (*bed->elf_backend_hide_symbol) (info, tlsbase, true);
17228
0
  }
17229
0
    }
17230
17231
0
  if (htab->fdpic_p && !bfd_link_relocatable (info)
17232
0
      && !bfd_elf_stack_segment_size (output_bfd, info,
17233
0
              "__stacksize", DEFAULT_STACK_SIZE))
17234
0
    return false;
17235
17236
0
  return true;
17237
0
}
17238
17239
/* Finish up dynamic symbol handling.  We set the contents of various
17240
   dynamic sections here.  */
17241
17242
static bool
17243
elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
17244
         struct bfd_link_info * info,
17245
         struct elf_link_hash_entry * h,
17246
         Elf_Internal_Sym * sym)
17247
0
{
17248
0
  struct elf32_arm_link_hash_table *htab;
17249
0
  struct elf32_arm_link_hash_entry *eh;
17250
17251
0
  htab = elf32_arm_hash_table (info);
17252
17253
0
  eh = (struct elf32_arm_link_hash_entry *) h;
17254
17255
0
  if (h->plt.offset != (bfd_vma) -1)
17256
0
    {
17257
0
      if (!eh->is_iplt)
17258
0
  {
17259
0
    BFD_ASSERT (h->dynindx != -1);
17260
0
    if (! elf32_arm_populate_plt_entry (output_bfd, info, &h->plt, &eh->plt,
17261
0
                h->dynindx, 0))
17262
0
      return false;
17263
0
  }
17264
17265
0
      if (!h->def_regular)
17266
0
  {
17267
    /* Mark the symbol as undefined, rather than as defined in
17268
       the .plt section.  */
17269
0
    sym->st_shndx = SHN_UNDEF;
17270
    /* If the symbol is weak we need to clear the value.
17271
       Otherwise, the PLT entry would provide a definition for
17272
       the symbol even if the symbol wasn't defined anywhere,
17273
       and so the symbol would never be NULL.  Leave the value if
17274
       there were any relocations where pointer equality matters
17275
       (this is a clue for the dynamic linker, to make function
17276
       pointer comparisons work between an application and shared
17277
       library).  */
17278
0
    if (!h->ref_regular_nonweak || !h->pointer_equality_needed)
17279
0
      sym->st_value = 0;
17280
0
  }
17281
0
      else if (eh->is_iplt && eh->plt.noncall_refcount != 0)
17282
0
  {
17283
    /* At least one non-call relocation references this .iplt entry,
17284
       so the .iplt entry is the function's canonical address.  */
17285
0
    sym->st_info = ELF_ST_INFO (ELF_ST_BIND (sym->st_info), STT_FUNC);
17286
0
    ARM_SET_SYM_BRANCH_TYPE (sym->st_target_internal, ST_BRANCH_TO_ARM);
17287
0
    sym->st_shndx = (_bfd_elf_section_from_bfd_section
17288
0
         (output_bfd, htab->root.iplt->output_section));
17289
0
    sym->st_value = (h->plt.offset
17290
0
         + htab->root.iplt->output_section->vma
17291
0
         + htab->root.iplt->output_offset);
17292
0
  }
17293
0
    }
17294
17295
0
  if (h->needs_copy)
17296
0
    {
17297
0
      asection * s;
17298
0
      Elf_Internal_Rela rel;
17299
17300
      /* This symbol needs a copy reloc.  Set it up.  */
17301
0
      BFD_ASSERT (h->dynindx != -1
17302
0
      && (h->root.type == bfd_link_hash_defined
17303
0
          || h->root.type == bfd_link_hash_defweak));
17304
17305
0
      rel.r_addend = 0;
17306
0
      rel.r_offset = (h->root.u.def.value
17307
0
          + h->root.u.def.section->output_section->vma
17308
0
          + h->root.u.def.section->output_offset);
17309
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
17310
0
      if (h->root.u.def.section == htab->root.sdynrelro)
17311
0
  s = htab->root.sreldynrelro;
17312
0
      else
17313
0
  s = htab->root.srelbss;
17314
0
      elf32_arm_add_dynreloc (output_bfd, info, s, &rel);
17315
0
    }
17316
17317
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
17318
     and for FDPIC, the _GLOBAL_OFFSET_TABLE_ symbol is not absolute:
17319
     it is relative to the ".got" section.  */
17320
0
  if (h == htab->root.hdynamic
17321
0
      || (!htab->fdpic_p
17322
0
    && htab->root.target_os != is_vxworks
17323
0
    && h == htab->root.hgot))
17324
0
    sym->st_shndx = SHN_ABS;
17325
17326
0
  return true;
17327
0
}
17328
17329
static void
17330
arm_put_trampoline (struct elf32_arm_link_hash_table *htab, bfd *output_bfd,
17331
        void *contents,
17332
        const unsigned long *template, unsigned count)
17333
0
{
17334
0
  unsigned ix;
17335
17336
0
  for (ix = 0; ix != count; ix++)
17337
0
    {
17338
0
      unsigned long insn = template[ix];
17339
17340
      /* Emit mov pc,rx if bx is not permitted.  */
17341
0
      if (htab->fix_v4bx == 1 && (insn & 0x0ffffff0) == 0x012fff10)
17342
0
  insn = (insn & 0xf000000f) | 0x01a0f000;
17343
0
      put_arm_insn (htab, output_bfd, insn, (char *)contents + ix*4);
17344
0
    }
17345
0
}
17346
17347
/* Install the special first PLT entry for elf32-arm-nacl.  Unlike
17348
   other variants, NaCl needs this entry in a static executable's
17349
   .iplt too.  When we're handling that case, GOT_DISPLACEMENT is
17350
   zero.  For .iplt really only the last bundle is useful, and .iplt
17351
   could have a shorter first entry, with each individual PLT entry's
17352
   relative branch calculated differently so it targets the last
17353
   bundle instead of the instruction before it (labelled .Lplt_tail
17354
   above).  But it's simpler to keep the size and layout of PLT0
17355
   consistent with the dynamic case, at the cost of some dead code at
17356
   the start of .iplt and the one dead store to the stack at the start
17357
   of .Lplt_tail.  */
17358
static void
17359
arm_nacl_put_plt0 (struct elf32_arm_link_hash_table *htab, bfd *output_bfd,
17360
       asection *plt, bfd_vma got_displacement)
17361
0
{
17362
0
  unsigned int i;
17363
17364
0
  put_arm_insn (htab, output_bfd,
17365
0
    elf32_arm_nacl_plt0_entry[0]
17366
0
    | arm_movw_immediate (got_displacement),
17367
0
    plt->contents + 0);
17368
0
  put_arm_insn (htab, output_bfd,
17369
0
    elf32_arm_nacl_plt0_entry[1]
17370
0
    | arm_movt_immediate (got_displacement),
17371
0
    plt->contents + 4);
17372
17373
0
  for (i = 2; i < ARRAY_SIZE (elf32_arm_nacl_plt0_entry); ++i)
17374
0
    put_arm_insn (htab, output_bfd,
17375
0
      elf32_arm_nacl_plt0_entry[i],
17376
0
      plt->contents + (i * 4));
17377
0
}
17378
17379
/* Finish up the dynamic sections.  */
17380
17381
static bool
17382
elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
17383
0
{
17384
0
  bfd * dynobj;
17385
0
  asection * sgot;
17386
0
  asection * sdyn;
17387
0
  struct elf32_arm_link_hash_table *htab;
17388
17389
0
  htab = elf32_arm_hash_table (info);
17390
0
  if (htab == NULL)
17391
0
    return false;
17392
17393
0
  dynobj = elf_hash_table (info)->dynobj;
17394
17395
0
  sgot = htab->root.sgotplt;
17396
  /* A broken linker script might have discarded the dynamic sections.
17397
     Catch this here so that we do not seg-fault later on.  */
17398
0
  if (sgot != NULL && bfd_is_abs_section (sgot->output_section))
17399
0
    return false;
17400
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
17401
17402
0
  if (elf_hash_table (info)->dynamic_sections_created)
17403
0
    {
17404
0
      asection *splt;
17405
0
      Elf32_External_Dyn *dyncon, *dynconend;
17406
17407
0
      splt = htab->root.splt;
17408
0
      BFD_ASSERT (splt != NULL && sdyn != NULL);
17409
0
      BFD_ASSERT (sgot != NULL);
17410
17411
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
17412
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
17413
17414
0
      for (; dyncon < dynconend; dyncon++)
17415
0
  {
17416
0
    Elf_Internal_Dyn dyn;
17417
0
    const char * name;
17418
0
    asection * s;
17419
17420
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
17421
17422
0
    switch (dyn.d_tag)
17423
0
      {
17424
0
      default:
17425
0
        if (htab->root.target_os == is_vxworks
17426
0
      && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
17427
0
    bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17428
0
        break;
17429
17430
0
      case DT_HASH:
17431
0
      case DT_STRTAB:
17432
0
      case DT_SYMTAB:
17433
0
      case DT_VERSYM:
17434
0
      case DT_VERDEF:
17435
0
      case DT_VERNEED:
17436
0
        break;
17437
17438
0
      case DT_PLTGOT:
17439
0
        name = ".got.plt";
17440
0
        goto get_vma;
17441
0
      case DT_JMPREL:
17442
0
        name = RELOC_SECTION (htab, ".plt");
17443
0
      get_vma:
17444
0
        s = bfd_get_linker_section (dynobj, name);
17445
0
        if (s == NULL)
17446
0
    {
17447
0
      _bfd_error_handler
17448
0
        (_("could not find section %s"), name);
17449
0
      bfd_set_error (bfd_error_invalid_operation);
17450
0
      return false;
17451
0
    }
17452
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
17453
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17454
0
        break;
17455
17456
0
      case DT_PLTRELSZ:
17457
0
        s = htab->root.srelplt;
17458
0
        BFD_ASSERT (s != NULL);
17459
0
        dyn.d_un.d_val = s->size;
17460
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17461
0
        break;
17462
17463
0
      case DT_RELSZ:
17464
0
      case DT_RELASZ:
17465
0
      case DT_REL:
17466
0
      case DT_RELA:
17467
0
        break;
17468
17469
0
      case DT_TLSDESC_PLT:
17470
0
        s = htab->root.splt;
17471
0
        dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
17472
0
        + htab->root.tlsdesc_plt);
17473
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17474
0
        break;
17475
17476
0
      case DT_TLSDESC_GOT:
17477
0
        s = htab->root.sgot;
17478
0
        dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
17479
0
        + htab->root.tlsdesc_got);
17480
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17481
0
        break;
17482
17483
        /* Set the bottom bit of DT_INIT/FINI if the
17484
     corresponding function is Thumb.  */
17485
0
      case DT_INIT:
17486
0
        name = info->init_function;
17487
0
        goto get_sym;
17488
0
      case DT_FINI:
17489
0
        name = info->fini_function;
17490
0
      get_sym:
17491
        /* If it wasn't set by elf_bfd_final_link
17492
     then there is nothing to adjust.  */
17493
0
        if (dyn.d_un.d_val != 0)
17494
0
    {
17495
0
      struct elf_link_hash_entry * eh;
17496
17497
0
      eh = elf_link_hash_lookup (elf_hash_table (info), name,
17498
0
               false, false, true);
17499
0
      if (eh != NULL
17500
0
          && ARM_GET_SYM_BRANCH_TYPE (eh->target_internal)
17501
0
       == ST_BRANCH_TO_THUMB)
17502
0
        {
17503
0
          dyn.d_un.d_val |= 1;
17504
0
          bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17505
0
        }
17506
0
    }
17507
0
        break;
17508
0
      }
17509
0
  }
17510
17511
      /* Fill in the first entry in the procedure linkage table.  */
17512
0
      if (splt->size > 0 && htab->plt_header_size)
17513
0
  {
17514
0
    const bfd_vma *plt0_entry;
17515
0
    bfd_vma got_address, plt_address, got_displacement;
17516
17517
    /* Calculate the addresses of the GOT and PLT.  */
17518
0
    got_address = sgot->output_section->vma + sgot->output_offset;
17519
0
    plt_address = splt->output_section->vma + splt->output_offset;
17520
17521
0
    if (htab->root.target_os == is_vxworks)
17522
0
      {
17523
        /* The VxWorks GOT is relocated by the dynamic linker.
17524
     Therefore, we must emit relocations rather than simply
17525
     computing the values now.  */
17526
0
        Elf_Internal_Rela rel;
17527
17528
0
        plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
17529
0
        put_arm_insn (htab, output_bfd, plt0_entry[0],
17530
0
          splt->contents + 0);
17531
0
        put_arm_insn (htab, output_bfd, plt0_entry[1],
17532
0
          splt->contents + 4);
17533
0
        put_arm_insn (htab, output_bfd, plt0_entry[2],
17534
0
          splt->contents + 8);
17535
0
        bfd_put_32 (output_bfd, got_address, splt->contents + 12);
17536
17537
        /* Generate a relocation for _GLOBAL_OFFSET_TABLE_.  */
17538
0
        rel.r_offset = plt_address + 12;
17539
0
        rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
17540
0
        rel.r_addend = 0;
17541
0
        SWAP_RELOC_OUT (htab) (output_bfd, &rel,
17542
0
             htab->srelplt2->contents);
17543
0
      }
17544
0
    else if (htab->root.target_os == is_nacl)
17545
0
      arm_nacl_put_plt0 (htab, output_bfd, splt,
17546
0
             got_address + 8 - (plt_address + 16));
17547
0
    else if (using_thumb_only (htab))
17548
0
      {
17549
0
        got_displacement = got_address - (plt_address + 12);
17550
17551
0
        plt0_entry = elf32_thumb2_plt0_entry;
17552
0
        put_arm_insn (htab, output_bfd, plt0_entry[0],
17553
0
          splt->contents + 0);
17554
0
        put_arm_insn (htab, output_bfd, plt0_entry[1],
17555
0
          splt->contents + 4);
17556
0
        put_arm_insn (htab, output_bfd, plt0_entry[2],
17557
0
          splt->contents + 8);
17558
17559
0
        bfd_put_32 (output_bfd, got_displacement, splt->contents + 12);
17560
0
      }
17561
0
    else
17562
0
      {
17563
0
        got_displacement = got_address - (plt_address + 16);
17564
17565
0
        plt0_entry = elf32_arm_plt0_entry;
17566
0
        put_arm_insn (htab, output_bfd, plt0_entry[0],
17567
0
          splt->contents + 0);
17568
0
        put_arm_insn (htab, output_bfd, plt0_entry[1],
17569
0
          splt->contents + 4);
17570
0
        put_arm_insn (htab, output_bfd, plt0_entry[2],
17571
0
          splt->contents + 8);
17572
0
        put_arm_insn (htab, output_bfd, plt0_entry[3],
17573
0
          splt->contents + 12);
17574
17575
#ifdef FOUR_WORD_PLT
17576
        /* The displacement value goes in the otherwise-unused
17577
     last word of the second entry.  */
17578
        bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
17579
#else
17580
0
        bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
17581
0
#endif
17582
0
      }
17583
0
  }
17584
17585
      /* UnixWare sets the entsize of .plt to 4, although that doesn't
17586
   really seem like the right value.  */
17587
0
      if (splt->output_section->owner == output_bfd)
17588
0
  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
17589
17590
0
      if (htab->root.tlsdesc_plt)
17591
0
  {
17592
0
    bfd_vma got_address
17593
0
      = sgot->output_section->vma + sgot->output_offset;
17594
0
    bfd_vma gotplt_address = (htab->root.sgot->output_section->vma
17595
0
            + htab->root.sgot->output_offset);
17596
0
    bfd_vma plt_address
17597
0
      = splt->output_section->vma + splt->output_offset;
17598
17599
0
    arm_put_trampoline (htab, output_bfd,
17600
0
            splt->contents + htab->root.tlsdesc_plt,
17601
0
            dl_tlsdesc_lazy_trampoline, 6);
17602
17603
0
    bfd_put_32 (output_bfd,
17604
0
          gotplt_address + htab->root.tlsdesc_got
17605
0
          - (plt_address + htab->root.tlsdesc_plt)
17606
0
          - dl_tlsdesc_lazy_trampoline[6],
17607
0
          splt->contents + htab->root.tlsdesc_plt + 24);
17608
0
    bfd_put_32 (output_bfd,
17609
0
          got_address - (plt_address + htab->root.tlsdesc_plt)
17610
0
          - dl_tlsdesc_lazy_trampoline[7],
17611
0
          splt->contents + htab->root.tlsdesc_plt + 24 + 4);
17612
0
  }
17613
17614
0
      if (htab->tls_trampoline)
17615
0
  {
17616
0
    arm_put_trampoline (htab, output_bfd,
17617
0
            splt->contents + htab->tls_trampoline,
17618
0
            tls_trampoline, 3);
17619
#ifdef FOUR_WORD_PLT
17620
    bfd_put_32 (output_bfd, 0x00000000,
17621
          splt->contents + htab->tls_trampoline + 12);
17622
#endif
17623
0
  }
17624
17625
0
      if (htab->root.target_os == is_vxworks
17626
0
    && !bfd_link_pic (info)
17627
0
    && htab->root.splt->size > 0)
17628
0
  {
17629
    /* Correct the .rel(a).plt.unloaded relocations.  They will have
17630
       incorrect symbol indexes.  */
17631
0
    int num_plts;
17632
0
    unsigned char *p;
17633
17634
0
    num_plts = ((htab->root.splt->size - htab->plt_header_size)
17635
0
          / htab->plt_entry_size);
17636
0
    p = htab->srelplt2->contents + RELOC_SIZE (htab);
17637
17638
0
    for (; num_plts; num_plts--)
17639
0
      {
17640
0
        Elf_Internal_Rela rel;
17641
17642
0
        SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
17643
0
        rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
17644
0
        SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
17645
0
        p += RELOC_SIZE (htab);
17646
17647
0
        SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
17648
0
        rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
17649
0
        SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
17650
0
        p += RELOC_SIZE (htab);
17651
0
      }
17652
0
  }
17653
0
    }
17654
17655
0
  if (htab->root.target_os == is_nacl
17656
0
      && htab->root.iplt != NULL
17657
0
      && htab->root.iplt->size > 0)
17658
    /* NaCl uses a special first entry in .iplt too.  */
17659
0
    arm_nacl_put_plt0 (htab, output_bfd, htab->root.iplt, 0);
17660
17661
  /* Fill in the first three entries in the global offset table.  */
17662
0
  if (sgot)
17663
0
    {
17664
0
      if (sgot->size > 0)
17665
0
  {
17666
0
    if (sdyn == NULL)
17667
0
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
17668
0
    else
17669
0
      bfd_put_32 (output_bfd,
17670
0
      sdyn->output_section->vma + sdyn->output_offset,
17671
0
      sgot->contents);
17672
0
    bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
17673
0
    bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
17674
0
  }
17675
17676
0
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
17677
0
    }
17678
17679
  /* At the very end of the .rofixup section is a pointer to the GOT.  */
17680
0
  if (htab->fdpic_p && htab->srofixup != NULL)
17681
0
    {
17682
0
      struct elf_link_hash_entry *hgot = htab->root.hgot;
17683
17684
0
      bfd_vma got_value = hgot->root.u.def.value
17685
0
  + hgot->root.u.def.section->output_section->vma
17686
0
  + hgot->root.u.def.section->output_offset;
17687
17688
0
      arm_elf_add_rofixup (output_bfd, htab->srofixup, got_value);
17689
17690
      /* Make sure we allocated and generated the same number of fixups.  */
17691
0
      BFD_ASSERT (htab->srofixup->reloc_count * 4 == htab->srofixup->size);
17692
0
    }
17693
17694
0
  return true;
17695
0
}
17696
17697
static bool
17698
elf32_arm_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
17699
2
{
17700
2
  Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
17701
2
  struct elf32_arm_link_hash_table *globals;
17702
2
  struct elf_segment_map *m;
17703
17704
2
  if (!_bfd_elf_init_file_header (abfd, link_info))
17705
0
    return false;
17706
17707
2
  i_ehdrp = elf_elfheader (abfd);
17708
17709
2
  if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
17710
1
    i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
17711
2
  i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
17712
17713
2
  if (link_info)
17714
0
    {
17715
0
      globals = elf32_arm_hash_table (link_info);
17716
0
      if (globals != NULL && globals->byteswap_code)
17717
0
  i_ehdrp->e_flags |= EF_ARM_BE8;
17718
17719
0
      if (globals->fdpic_p)
17720
0
  i_ehdrp->e_ident[EI_OSABI] |= ELFOSABI_ARM_FDPIC;
17721
0
    }
17722
17723
2
  if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_VER5
17724
2
      && ((i_ehdrp->e_type == ET_DYN) || (i_ehdrp->e_type == ET_EXEC)))
17725
1
    {
17726
1
      int abi = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, Tag_ABI_VFP_args);
17727
1
      if (abi == AEABI_VFP_args_vfp)
17728
1
  i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_HARD;
17729
0
      else
17730
0
  i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_SOFT;
17731
1
    }
17732
17733
  /* Scan segment to set p_flags attribute if it contains only sections with
17734
     SHF_ARM_PURECODE flag.  */
17735
10
  for (m = elf_seg_map (abfd); m != NULL; m = m->next)
17736
8
    {
17737
8
      unsigned int j;
17738
17739
8
      if (m->count == 0)
17740
2
  continue;
17741
6
      for (j = 0; j < m->count; j++)
17742
6
  {
17743
6
    if (!(elf_section_flags (m->sections[j]) & SHF_ARM_PURECODE))
17744
6
      break;
17745
6
  }
17746
6
      if (j == m->count)
17747
0
  {
17748
0
    m->p_flags = PF_X;
17749
0
    m->p_flags_valid = 1;
17750
0
  }
17751
6
    }
17752
2
  return true;
17753
2
}
17754
17755
static enum elf_reloc_type_class
17756
elf32_arm_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
17757
          const asection *rel_sec ATTRIBUTE_UNUSED,
17758
          const Elf_Internal_Rela *rela)
17759
0
{
17760
0
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
17761
17762
0
  if (htab->root.dynsym != NULL
17763
0
      && htab->root.dynsym->contents != NULL)
17764
0
    {
17765
      /* Check relocation against STT_GNU_IFUNC symbol if there are
17766
   dynamic symbols.  */
17767
0
      bfd *abfd = info->output_bfd;
17768
0
      const struct elf_backend_data *bed = get_elf_backend_data (abfd);
17769
0
      unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
17770
0
      if (r_symndx != STN_UNDEF)
17771
0
  {
17772
0
    Elf_Internal_Sym sym;
17773
0
    if (!bed->s->swap_symbol_in (abfd,
17774
0
               (htab->root.dynsym->contents
17775
0
          + r_symndx * bed->s->sizeof_sym),
17776
0
               0, &sym))
17777
0
      {
17778
        /* xgettext:c-format */
17779
0
        _bfd_error_handler (_("%pB symbol number %lu references"
17780
0
            " nonexistent SHT_SYMTAB_SHNDX section"),
17781
0
          abfd, r_symndx);
17782
        /* Ideally an error class should be returned here.  */
17783
0
      }
17784
0
    else if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
17785
0
      return reloc_class_ifunc;
17786
0
  }
17787
0
    }
17788
17789
0
  switch ((int) ELF32_R_TYPE (rela->r_info))
17790
0
    {
17791
0
    case R_ARM_RELATIVE:
17792
0
      return reloc_class_relative;
17793
0
    case R_ARM_JUMP_SLOT:
17794
0
      return reloc_class_plt;
17795
0
    case R_ARM_COPY:
17796
0
      return reloc_class_copy;
17797
0
    case R_ARM_IRELATIVE:
17798
0
      return reloc_class_ifunc;
17799
0
    default:
17800
0
      return reloc_class_normal;
17801
0
    }
17802
0
}
17803
17804
static void
17805
arm_final_write_processing (bfd *abfd)
17806
2
{
17807
2
  bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
17808
2
}
17809
17810
static bool
17811
elf32_arm_final_write_processing (bfd *abfd)
17812
2
{
17813
2
  arm_final_write_processing (abfd);
17814
2
  return _bfd_elf_final_write_processing (abfd);
17815
2
}
17816
17817
/* Return TRUE if this is an unwinding table entry.  */
17818
17819
static bool
17820
is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
17821
26
{
17822
26
  return (startswith (name, ELF_STRING_ARM_unwind)
17823
26
    || startswith (name, ELF_STRING_ARM_unwind_once));
17824
26
}
17825
17826
17827
/* Set the type and flags for an ARM section.  We do this by
17828
   the section name, which is a hack, but ought to work.  */
17829
17830
static bool
17831
elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
17832
26
{
17833
26
  const char * name;
17834
17835
26
  name = bfd_section_name (sec);
17836
17837
26
  if (is_arm_elf_unwind_section_name (abfd, name))
17838
1
    {
17839
1
      hdr->sh_type = SHT_ARM_EXIDX;
17840
1
      hdr->sh_flags |= SHF_LINK_ORDER;
17841
1
    }
17842
17843
26
  if (sec->flags & SEC_ELF_PURECODE)
17844
0
    hdr->sh_flags |= SHF_ARM_PURECODE;
17845
17846
26
  return true;
17847
26
}
17848
17849
/* Handle an ARM specific section when reading an object file.  This is
17850
   called when bfd_section_from_shdr finds a section with an unknown
17851
   type.  */
17852
17853
static bool
17854
elf32_arm_section_from_shdr (bfd *abfd,
17855
           Elf_Internal_Shdr * hdr,
17856
           const char *name,
17857
           int shindex)
17858
6.59k
{
17859
  /* There ought to be a place to keep ELF backend specific flags, but
17860
     at the moment there isn't one.  We just keep track of the
17861
     sections by their name, instead.  Fortunately, the ABI gives
17862
     names for all the ARM specific sections, so we will probably get
17863
     away with this.  */
17864
6.59k
  switch (hdr->sh_type)
17865
6.59k
    {
17866
44
    case SHT_ARM_EXIDX:
17867
44
    case SHT_ARM_PREEMPTMAP:
17868
44
    case SHT_ARM_ATTRIBUTES:
17869
44
      break;
17870
17871
6.54k
    default:
17872
6.54k
      return false;
17873
6.59k
    }
17874
17875
44
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
17876
0
    return false;
17877
17878
44
  return true;
17879
44
}
17880
17881
static _arm_elf_section_data *
17882
get_arm_elf_section_data (asection * sec)
17883
0
{
17884
0
  if (sec && sec->owner && is_arm_elf (sec->owner))
17885
0
    return elf32_arm_section_data (sec);
17886
0
  else
17887
0
    return NULL;
17888
0
}
17889
17890
typedef struct
17891
{
17892
  void *flaginfo;
17893
  struct bfd_link_info *info;
17894
  asection *sec;
17895
  int sec_shndx;
17896
  int (*func) (void *, const char *, Elf_Internal_Sym *,
17897
         asection *, struct elf_link_hash_entry *);
17898
} output_arch_syminfo;
17899
17900
enum map_symbol_type
17901
{
17902
  ARM_MAP_ARM,
17903
  ARM_MAP_THUMB,
17904
  ARM_MAP_DATA
17905
};
17906
17907
17908
/* Output a single mapping symbol.  */
17909
17910
static bool
17911
elf32_arm_output_map_sym (output_arch_syminfo *osi,
17912
        enum map_symbol_type type,
17913
        bfd_vma offset)
17914
0
{
17915
0
  static const char *names[3] = {"$a", "$t", "$d"};
17916
0
  Elf_Internal_Sym sym;
17917
17918
0
  sym.st_value = osi->sec->output_section->vma
17919
0
     + osi->sec->output_offset
17920
0
     + offset;
17921
0
  sym.st_size = 0;
17922
0
  sym.st_other = 0;
17923
0
  sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
17924
0
  sym.st_shndx = osi->sec_shndx;
17925
0
  sym.st_target_internal = ST_BRANCH_TO_ARM;
17926
0
  elf32_arm_section_map_add (osi->sec, names[type][1], offset);
17927
0
  return osi->func (osi->flaginfo, names[type], &sym, osi->sec, NULL) == 1;
17928
0
}
17929
17930
/* Output mapping symbols for the PLT entry described by ROOT_PLT and ARM_PLT.
17931
   IS_IPLT_ENTRY_P says whether the PLT is in .iplt rather than .plt.  */
17932
17933
static bool
17934
elf32_arm_output_plt_map_1 (output_arch_syminfo *osi,
17935
          bool is_iplt_entry_p,
17936
          union gotplt_union *root_plt,
17937
          struct arm_plt_info *arm_plt)
17938
0
{
17939
0
  struct elf32_arm_link_hash_table *htab;
17940
0
  bfd_vma addr, plt_header_size;
17941
17942
0
  if (root_plt->offset == (bfd_vma) -1)
17943
0
    return true;
17944
17945
0
  htab = elf32_arm_hash_table (osi->info);
17946
0
  if (htab == NULL)
17947
0
    return false;
17948
17949
0
  if (is_iplt_entry_p)
17950
0
    {
17951
0
      osi->sec = htab->root.iplt;
17952
0
      plt_header_size = 0;
17953
0
    }
17954
0
  else
17955
0
    {
17956
0
      osi->sec = htab->root.splt;
17957
0
      plt_header_size = htab->plt_header_size;
17958
0
    }
17959
0
  osi->sec_shndx = (_bfd_elf_section_from_bfd_section
17960
0
        (osi->info->output_bfd, osi->sec->output_section));
17961
17962
0
  addr = root_plt->offset & -2;
17963
0
  if (htab->root.target_os == is_vxworks)
17964
0
    {
17965
0
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
17966
0
  return false;
17967
0
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
17968
0
  return false;
17969
0
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 12))
17970
0
  return false;
17971
0
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
17972
0
  return false;
17973
0
    }
17974
0
  else if (htab->root.target_os == is_nacl)
17975
0
    {
17976
0
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
17977
0
  return false;
17978
0
    }
17979
0
  else if (htab->fdpic_p)
17980
0
    {
17981
0
      enum map_symbol_type type = using_thumb_only (htab)
17982
0
  ? ARM_MAP_THUMB
17983
0
  : ARM_MAP_ARM;
17984
17985
0
      if (elf32_arm_plt_needs_thumb_stub_p (osi->info, arm_plt))
17986
0
  if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
17987
0
    return false;
17988
0
      if (!elf32_arm_output_map_sym (osi, type, addr))
17989
0
  return false;
17990
0
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16))
17991
0
  return false;
17992
0
      if (htab->plt_entry_size == 4 * ARRAY_SIZE (elf32_arm_fdpic_plt_entry))
17993
0
  if (!elf32_arm_output_map_sym (osi, type, addr + 24))
17994
0
    return false;
17995
0
    }
17996
0
  else if (using_thumb_only (htab))
17997
0
    {
17998
0
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
17999
0
  return false;
18000
0
    }
18001
0
  else
18002
0
    {
18003
0
      bool thumb_stub_p;
18004
18005
0
      thumb_stub_p = elf32_arm_plt_needs_thumb_stub_p (osi->info, arm_plt);
18006
0
      if (thumb_stub_p)
18007
0
  {
18008
0
    if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
18009
0
      return false;
18010
0
  }
18011
#ifdef FOUR_WORD_PLT
18012
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
18013
  return false;
18014
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
18015
  return false;
18016
#else
18017
      /* A three-word PLT with no Thumb thunk contains only Arm code,
18018
   so only need to output a mapping symbol for the first PLT entry and
18019
   entries with thumb thunks.  */
18020
0
      if (thumb_stub_p || addr == plt_header_size)
18021
0
  {
18022
0
    if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
18023
0
      return false;
18024
0
  }
18025
0
#endif
18026
0
    }
18027
18028
0
  return true;
18029
0
}
18030
18031
/* Output mapping symbols for PLT entries associated with H.  */
18032
18033
static bool
18034
elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
18035
0
{
18036
0
  output_arch_syminfo *osi = (output_arch_syminfo *) inf;
18037
0
  struct elf32_arm_link_hash_entry *eh;
18038
18039
0
  if (h->root.type == bfd_link_hash_indirect)
18040
0
    return true;
18041
18042
0
  if (h->root.type == bfd_link_hash_warning)
18043
    /* When warning symbols are created, they **replace** the "real"
18044
       entry in the hash table, thus we never get to see the real
18045
       symbol in a hash traversal.  So look at it now.  */
18046
0
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
18047
18048
0
  eh = (struct elf32_arm_link_hash_entry *) h;
18049
0
  return elf32_arm_output_plt_map_1 (osi, SYMBOL_CALLS_LOCAL (osi->info, h),
18050
0
             &h->plt, &eh->plt);
18051
0
}
18052
18053
/* Bind a veneered symbol to its veneer identified by its hash entry
18054
   STUB_ENTRY.  The veneered location thus loose its symbol.  */
18055
18056
static void
18057
arm_stub_claim_sym (struct elf32_arm_stub_hash_entry *stub_entry)
18058
0
{
18059
0
  struct elf32_arm_link_hash_entry *hash = stub_entry->h;
18060
18061
0
  BFD_ASSERT (hash);
18062
0
  hash->root.root.u.def.section = stub_entry->stub_sec;
18063
0
  hash->root.root.u.def.value = stub_entry->stub_offset;
18064
0
  hash->root.size = stub_entry->stub_size;
18065
0
}
18066
18067
/* Output a single local symbol for a generated stub.  */
18068
18069
static bool
18070
elf32_arm_output_stub_sym (output_arch_syminfo *osi, const char *name,
18071
         bfd_vma offset, bfd_vma size)
18072
0
{
18073
0
  Elf_Internal_Sym sym;
18074
18075
0
  sym.st_value = osi->sec->output_section->vma
18076
0
     + osi->sec->output_offset
18077
0
     + offset;
18078
0
  sym.st_size = size;
18079
0
  sym.st_other = 0;
18080
0
  sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
18081
0
  sym.st_shndx = osi->sec_shndx;
18082
0
  sym.st_target_internal = ST_BRANCH_TO_ARM;
18083
0
  return osi->func (osi->flaginfo, name, &sym, osi->sec, NULL) == 1;
18084
0
}
18085
18086
static bool
18087
arm_map_one_stub (struct bfd_hash_entry * gen_entry,
18088
      void * in_arg)
18089
0
{
18090
0
  struct elf32_arm_stub_hash_entry *stub_entry;
18091
0
  asection *stub_sec;
18092
0
  bfd_vma addr;
18093
0
  char *stub_name;
18094
0
  output_arch_syminfo *osi;
18095
0
  const insn_sequence *template_sequence;
18096
0
  enum stub_insn_type prev_type;
18097
0
  int size;
18098
0
  int i;
18099
0
  enum map_symbol_type sym_type;
18100
18101
  /* Massage our args to the form they really have.  */
18102
0
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
18103
0
  osi = (output_arch_syminfo *) in_arg;
18104
18105
0
  stub_sec = stub_entry->stub_sec;
18106
18107
  /* Ensure this stub is attached to the current section being
18108
     processed.  */
18109
0
  if (stub_sec != osi->sec)
18110
0
    return true;
18111
18112
0
  addr = (bfd_vma) stub_entry->stub_offset;
18113
0
  template_sequence = stub_entry->stub_template;
18114
18115
0
  if (arm_stub_sym_claimed (stub_entry->stub_type))
18116
0
    arm_stub_claim_sym (stub_entry);
18117
0
  else
18118
0
    {
18119
0
      stub_name = stub_entry->output_name;
18120
0
      switch (template_sequence[0].type)
18121
0
  {
18122
0
  case ARM_TYPE:
18123
0
    if (!elf32_arm_output_stub_sym (osi, stub_name, addr,
18124
0
            stub_entry->stub_size))
18125
0
      return false;
18126
0
    break;
18127
0
  case THUMB16_TYPE:
18128
0
  case THUMB32_TYPE:
18129
0
    if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1,
18130
0
            stub_entry->stub_size))
18131
0
      return false;
18132
0
    break;
18133
0
  default:
18134
0
    BFD_FAIL ();
18135
0
    return 0;
18136
0
  }
18137
0
    }
18138
18139
0
  prev_type = DATA_TYPE;
18140
0
  size = 0;
18141
0
  for (i = 0; i < stub_entry->stub_template_size; i++)
18142
0
    {
18143
0
      switch (template_sequence[i].type)
18144
0
  {
18145
0
  case ARM_TYPE:
18146
0
    sym_type = ARM_MAP_ARM;
18147
0
    break;
18148
18149
0
  case THUMB16_TYPE:
18150
0
  case THUMB32_TYPE:
18151
0
    sym_type = ARM_MAP_THUMB;
18152
0
    break;
18153
18154
0
  case DATA_TYPE:
18155
0
    sym_type = ARM_MAP_DATA;
18156
0
    break;
18157
18158
0
  default:
18159
0
    BFD_FAIL ();
18160
0
    return false;
18161
0
  }
18162
18163
0
      if (template_sequence[i].type != prev_type)
18164
0
  {
18165
0
    prev_type = template_sequence[i].type;
18166
0
    if (!elf32_arm_output_map_sym (osi, sym_type, addr + size))
18167
0
      return false;
18168
0
  }
18169
18170
0
      switch (template_sequence[i].type)
18171
0
  {
18172
0
  case ARM_TYPE:
18173
0
  case THUMB32_TYPE:
18174
0
    size += 4;
18175
0
    break;
18176
18177
0
  case THUMB16_TYPE:
18178
0
    size += 2;
18179
0
    break;
18180
18181
0
  case DATA_TYPE:
18182
0
    size += 4;
18183
0
    break;
18184
18185
0
  default:
18186
0
    BFD_FAIL ();
18187
0
    return false;
18188
0
  }
18189
0
    }
18190
18191
0
  return true;
18192
0
}
18193
18194
/* Output mapping symbols for linker generated sections,
18195
   and for those data-only sections that do not have a
18196
   $d.  */
18197
18198
static bool
18199
elf32_arm_output_arch_local_syms (bfd *output_bfd,
18200
          struct bfd_link_info *info,
18201
          void *flaginfo,
18202
          int (*func) (void *, const char *,
18203
                 Elf_Internal_Sym *,
18204
                 asection *,
18205
                 struct elf_link_hash_entry *))
18206
0
{
18207
0
  output_arch_syminfo osi;
18208
0
  struct elf32_arm_link_hash_table *htab;
18209
0
  bfd_vma offset;
18210
0
  bfd_size_type size;
18211
0
  bfd *input_bfd;
18212
18213
0
  if (info->strip == strip_all
18214
0
      && !info->emitrelocations
18215
0
      && !bfd_link_relocatable (info))
18216
0
    return true;
18217
18218
0
  htab = elf32_arm_hash_table (info);
18219
0
  if (htab == NULL)
18220
0
    return false;
18221
18222
0
  check_use_blx (htab);
18223
18224
0
  osi.flaginfo = flaginfo;
18225
0
  osi.info = info;
18226
0
  osi.func = func;
18227
18228
  /* Add a $d mapping symbol to data-only sections that
18229
     don't have any mapping symbol.  This may result in (harmless) redundant
18230
     mapping symbols.  */
18231
0
  for (input_bfd = info->input_bfds;
18232
0
       input_bfd != NULL;
18233
0
       input_bfd = input_bfd->link.next)
18234
0
    {
18235
0
      if ((input_bfd->flags & (BFD_LINKER_CREATED | HAS_SYMS)) == HAS_SYMS)
18236
0
  for (osi.sec = input_bfd->sections;
18237
0
       osi.sec != NULL;
18238
0
       osi.sec = osi.sec->next)
18239
0
    {
18240
0
      if (osi.sec->output_section != NULL
18241
0
    && ((osi.sec->output_section->flags & (SEC_ALLOC | SEC_CODE))
18242
0
        != 0)
18243
0
    && (osi.sec->flags & (SEC_HAS_CONTENTS | SEC_LINKER_CREATED))
18244
0
       == SEC_HAS_CONTENTS
18245
0
    && get_arm_elf_section_data (osi.sec) != NULL
18246
0
    && get_arm_elf_section_data (osi.sec)->mapcount == 0
18247
0
    && osi.sec->size > 0
18248
0
    && (osi.sec->flags & SEC_EXCLUDE) == 0)
18249
0
        {
18250
0
    osi.sec_shndx = _bfd_elf_section_from_bfd_section
18251
0
      (output_bfd, osi.sec->output_section);
18252
0
    if (osi.sec_shndx != (int)SHN_BAD)
18253
0
      elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 0);
18254
0
        }
18255
0
    }
18256
0
    }
18257
18258
  /* ARM->Thumb glue.  */
18259
0
  if (htab->arm_glue_size > 0)
18260
0
    {
18261
0
      osi.sec = bfd_get_linker_section (htab->bfd_of_glue_owner,
18262
0
          ARM2THUMB_GLUE_SECTION_NAME);
18263
18264
0
      osi.sec_shndx = _bfd_elf_section_from_bfd_section
18265
0
    (output_bfd, osi.sec->output_section);
18266
0
      if (bfd_link_pic (info)
18267
0
    || htab->pic_veneer)
18268
0
  size = ARM2THUMB_PIC_GLUE_SIZE;
18269
0
      else if (htab->use_blx)
18270
0
  size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
18271
0
      else
18272
0
  size = ARM2THUMB_STATIC_GLUE_SIZE;
18273
18274
0
      for (offset = 0; offset < htab->arm_glue_size; offset += size)
18275
0
  {
18276
0
    elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset);
18277
0
    elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, offset + size - 4);
18278
0
  }
18279
0
    }
18280
18281
  /* Thumb->ARM glue.  */
18282
0
  if (htab->thumb_glue_size > 0)
18283
0
    {
18284
0
      osi.sec = bfd_get_linker_section (htab->bfd_of_glue_owner,
18285
0
          THUMB2ARM_GLUE_SECTION_NAME);
18286
18287
0
      osi.sec_shndx = _bfd_elf_section_from_bfd_section
18288
0
    (output_bfd, osi.sec->output_section);
18289
0
      size = THUMB2ARM_GLUE_SIZE;
18290
18291
0
      for (offset = 0; offset < htab->thumb_glue_size; offset += size)
18292
0
  {
18293
0
    elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, offset);
18294
0
    elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset + 4);
18295
0
  }
18296
0
    }
18297
18298
  /* ARMv4 BX veneers.  */
18299
0
  if (htab->bx_glue_size > 0)
18300
0
    {
18301
0
      osi.sec = bfd_get_linker_section (htab->bfd_of_glue_owner,
18302
0
          ARM_BX_GLUE_SECTION_NAME);
18303
18304
0
      osi.sec_shndx = _bfd_elf_section_from_bfd_section
18305
0
    (output_bfd, osi.sec->output_section);
18306
18307
0
      elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0);
18308
0
    }
18309
18310
  /* Long calls stubs.  */
18311
0
  if (htab->stub_bfd && htab->stub_bfd->sections)
18312
0
    {
18313
0
      asection* stub_sec;
18314
18315
0
      for (stub_sec = htab->stub_bfd->sections;
18316
0
     stub_sec != NULL;
18317
0
     stub_sec = stub_sec->next)
18318
0
  {
18319
    /* Ignore non-stub sections.  */
18320
0
    if (!strstr (stub_sec->name, STUB_SUFFIX))
18321
0
      continue;
18322
18323
0
    osi.sec = stub_sec;
18324
18325
0
    osi.sec_shndx = _bfd_elf_section_from_bfd_section
18326
0
      (output_bfd, osi.sec->output_section);
18327
18328
0
    bfd_hash_traverse (&htab->stub_hash_table, arm_map_one_stub, &osi);
18329
0
  }
18330
0
    }
18331
18332
  /* Finally, output mapping symbols for the PLT.  */
18333
0
  if (htab->root.splt && htab->root.splt->size > 0)
18334
0
    {
18335
0
      osi.sec = htab->root.splt;
18336
0
      osi.sec_shndx = (_bfd_elf_section_from_bfd_section
18337
0
           (output_bfd, osi.sec->output_section));
18338
18339
      /* Output mapping symbols for the plt header.  */
18340
0
      if (htab->root.target_os == is_vxworks)
18341
0
  {
18342
    /* VxWorks shared libraries have no PLT header.  */
18343
0
    if (!bfd_link_pic (info))
18344
0
      {
18345
0
        if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18346
0
    return false;
18347
0
        if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
18348
0
    return false;
18349
0
      }
18350
0
  }
18351
0
      else if (htab->root.target_os == is_nacl)
18352
0
  {
18353
0
    if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18354
0
      return false;
18355
0
  }
18356
0
      else if (using_thumb_only (htab) && !htab->fdpic_p)
18357
0
  {
18358
0
    if (!elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, 0))
18359
0
      return false;
18360
0
    if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
18361
0
      return false;
18362
0
    if (!elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, 16))
18363
0
      return false;
18364
0
  }
18365
0
      else if (!htab->fdpic_p)
18366
0
  {
18367
0
    if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18368
0
      return false;
18369
0
#ifndef FOUR_WORD_PLT
18370
0
    if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 16))
18371
0
      return false;
18372
0
#endif
18373
0
  }
18374
0
    }
18375
0
  if (htab->root.target_os == is_nacl
18376
0
      && htab->root.iplt
18377
0
      && htab->root.iplt->size > 0)
18378
0
    {
18379
      /* NaCl uses a special first entry in .iplt too.  */
18380
0
      osi.sec = htab->root.iplt;
18381
0
      osi.sec_shndx = (_bfd_elf_section_from_bfd_section
18382
0
           (output_bfd, osi.sec->output_section));
18383
0
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18384
0
  return false;
18385
0
    }
18386
0
  if ((htab->root.splt && htab->root.splt->size > 0)
18387
0
      || (htab->root.iplt && htab->root.iplt->size > 0))
18388
0
    {
18389
0
      elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, &osi);
18390
0
      for (input_bfd = info->input_bfds;
18391
0
     input_bfd != NULL;
18392
0
     input_bfd = input_bfd->link.next)
18393
0
  {
18394
0
    struct arm_local_iplt_info **local_iplt;
18395
0
    unsigned int i, num_syms;
18396
18397
0
    if (!is_arm_elf (input_bfd))
18398
0
      continue;
18399
18400
0
    local_iplt = elf32_arm_local_iplt (input_bfd);
18401
0
    if (local_iplt != NULL)
18402
0
      {
18403
0
        num_syms = elf_symtab_hdr (input_bfd).sh_info;
18404
0
        if (num_syms > elf32_arm_num_entries (input_bfd))
18405
0
    {
18406
0
      _bfd_error_handler (_("\
18407
0
%pB: Number of symbols in input file has increased from %lu to %u\n"),
18408
0
              input_bfd,
18409
0
              (unsigned long) elf32_arm_num_entries (input_bfd),
18410
0
              num_syms);
18411
0
      return false;
18412
0
    }
18413
0
        for (i = 0; i < num_syms; i++)
18414
0
    if (local_iplt[i] != NULL
18415
0
        && !elf32_arm_output_plt_map_1 (&osi, true,
18416
0
                &local_iplt[i]->root,
18417
0
                &local_iplt[i]->arm))
18418
0
      return false;
18419
0
      }
18420
0
  }
18421
0
    }
18422
0
  if (htab->root.tlsdesc_plt != 0)
18423
0
    {
18424
      /* Mapping symbols for the lazy tls trampoline.  */
18425
0
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM,
18426
0
             htab->root.tlsdesc_plt))
18427
0
  return false;
18428
18429
0
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA,
18430
0
             htab->root.tlsdesc_plt + 24))
18431
0
  return false;
18432
0
    }
18433
0
  if (htab->tls_trampoline != 0)
18434
0
    {
18435
      /* Mapping symbols for the tls trampoline.  */
18436
0
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, htab->tls_trampoline))
18437
0
  return false;
18438
#ifdef FOUR_WORD_PLT
18439
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA,
18440
             htab->tls_trampoline + 12))
18441
  return false;
18442
#endif
18443
0
    }
18444
18445
0
  return true;
18446
0
}
18447
18448
/* Filter normal symbols of CMSE entry functions of ABFD to include in
18449
   the import library.  All SYMCOUNT symbols of ABFD can be examined
18450
   from their pointers in SYMS.  Pointers of symbols to keep should be
18451
   stored continuously at the beginning of that array.
18452
18453
   Returns the number of symbols to keep.  */
18454
18455
static unsigned int
18456
elf32_arm_filter_cmse_symbols (bfd *abfd ATTRIBUTE_UNUSED,
18457
             struct bfd_link_info *info,
18458
             asymbol **syms, long symcount)
18459
0
{
18460
0
  size_t maxnamelen;
18461
0
  char *cmse_name;
18462
0
  long src_count, dst_count = 0;
18463
0
  struct elf32_arm_link_hash_table *htab;
18464
18465
0
  htab = elf32_arm_hash_table (info);
18466
0
  if (!htab->stub_bfd || !htab->stub_bfd->sections)
18467
0
    symcount = 0;
18468
18469
0
  maxnamelen = 128;
18470
0
  cmse_name = (char *) bfd_malloc (maxnamelen);
18471
0
  BFD_ASSERT (cmse_name);
18472
18473
0
  for (src_count = 0; src_count < symcount; src_count++)
18474
0
    {
18475
0
      struct elf32_arm_link_hash_entry *cmse_hash;
18476
0
      asymbol *sym;
18477
0
      flagword flags;
18478
0
      char *name;
18479
0
      size_t namelen;
18480
18481
0
      sym = syms[src_count];
18482
0
      flags = sym->flags;
18483
0
      name = (char *) bfd_asymbol_name (sym);
18484
18485
0
      if ((flags & BSF_FUNCTION) != BSF_FUNCTION)
18486
0
  continue;
18487
0
      if (!(flags & (BSF_GLOBAL | BSF_WEAK)))
18488
0
  continue;
18489
18490
0
      namelen = strlen (name) + sizeof (CMSE_PREFIX) + 1;
18491
0
      if (namelen > maxnamelen)
18492
0
  {
18493
0
    cmse_name = (char *)
18494
0
      bfd_realloc (cmse_name, namelen);
18495
0
    maxnamelen = namelen;
18496
0
  }
18497
0
      snprintf (cmse_name, maxnamelen, "%s%s", CMSE_PREFIX, name);
18498
0
      cmse_hash = (struct elf32_arm_link_hash_entry *)
18499
0
  elf_link_hash_lookup (&(htab)->root, cmse_name, false, false, true);
18500
18501
0
      if (!cmse_hash
18502
0
    || (cmse_hash->root.root.type != bfd_link_hash_defined
18503
0
        && cmse_hash->root.root.type != bfd_link_hash_defweak)
18504
0
    || cmse_hash->root.type != STT_FUNC)
18505
0
  continue;
18506
18507
0
      syms[dst_count++] = sym;
18508
0
    }
18509
0
  free (cmse_name);
18510
18511
0
  syms[dst_count] = NULL;
18512
18513
0
  return dst_count;
18514
0
}
18515
18516
/* Filter symbols of ABFD to include in the import library.  All
18517
   SYMCOUNT symbols of ABFD can be examined from their pointers in
18518
   SYMS.  Pointers of symbols to keep should be stored continuously at
18519
   the beginning of that array.
18520
18521
   Returns the number of symbols to keep.  */
18522
18523
static unsigned int
18524
elf32_arm_filter_implib_symbols (bfd *abfd ATTRIBUTE_UNUSED,
18525
         struct bfd_link_info *info,
18526
         asymbol **syms, long symcount)
18527
0
{
18528
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
18529
18530
  /* Requirement 8 of "ARM v8-M Security Extensions: Requirements on
18531
     Development Tools" (ARM-ECM-0359818) mandates Secure Gateway import
18532
     library to be a relocatable object file.  */
18533
0
  BFD_ASSERT (!(bfd_get_file_flags (info->out_implib_bfd) & EXEC_P));
18534
0
  if (globals->cmse_implib)
18535
0
    return elf32_arm_filter_cmse_symbols (abfd, info, syms, symcount);
18536
0
  else
18537
0
    return _bfd_elf_filter_global_symbols (abfd, info, syms, symcount);
18538
0
}
18539
18540
/* Allocate target specific section data.  */
18541
18542
static bool
18543
elf32_arm_new_section_hook (bfd *abfd, asection *sec)
18544
14.3k
{
18545
14.3k
  _arm_elf_section_data *sdata = bfd_zalloc (abfd, sizeof (*sdata));
18546
14.3k
  if (sdata == NULL)
18547
0
    return false;
18548
14.3k
  sec->used_by_bfd = sdata;
18549
18550
14.3k
  return _bfd_elf_new_section_hook (abfd, sec);
18551
14.3k
}
18552
18553
18554
/* Used to order a list of mapping symbols by address.  */
18555
18556
static int
18557
elf32_arm_compare_mapping (const void * a, const void * b)
18558
0
{
18559
0
  const elf32_arm_section_map *amap = (const elf32_arm_section_map *) a;
18560
0
  const elf32_arm_section_map *bmap = (const elf32_arm_section_map *) b;
18561
18562
0
  if (amap->vma > bmap->vma)
18563
0
    return 1;
18564
0
  else if (amap->vma < bmap->vma)
18565
0
    return -1;
18566
0
  else if (amap->type > bmap->type)
18567
    /* Ensure results do not depend on the host qsort for objects with
18568
       multiple mapping symbols at the same address by sorting on type
18569
       after vma.  */
18570
0
    return 1;
18571
0
  else if (amap->type < bmap->type)
18572
0
    return -1;
18573
0
  else
18574
0
    return 0;
18575
0
}
18576
18577
/* Add OFFSET to lower 31 bits of ADDR, leaving other bits unmodified.  */
18578
18579
static unsigned long
18580
offset_prel31 (unsigned long addr, bfd_vma offset)
18581
0
{
18582
0
  return (addr & ~0x7ffffffful) | ((addr + offset) & 0x7ffffffful);
18583
0
}
18584
18585
/* Copy an .ARM.exidx table entry, adding OFFSET to (applied) PREL31
18586
   relocations.  */
18587
18588
static void
18589
copy_exidx_entry (bfd *output_bfd, bfd_byte *to, bfd_byte *from, bfd_vma offset)
18590
0
{
18591
0
  unsigned long first_word = bfd_get_32 (output_bfd, from);
18592
0
  unsigned long second_word = bfd_get_32 (output_bfd, from + 4);
18593
18594
  /* High bit of first word is supposed to be zero.  */
18595
0
  if ((first_word & 0x80000000ul) == 0)
18596
0
    first_word = offset_prel31 (first_word, offset);
18597
18598
  /* If the high bit of the first word is clear, and the bit pattern is not 0x1
18599
     (EXIDX_CANTUNWIND), this is an offset to an .ARM.extab entry.  */
18600
0
  if ((second_word != 0x1) && ((second_word & 0x80000000ul) == 0))
18601
0
    second_word = offset_prel31 (second_word, offset);
18602
18603
0
  bfd_put_32 (output_bfd, first_word, to);
18604
0
  bfd_put_32 (output_bfd, second_word, to + 4);
18605
0
}
18606
18607
/* Data for make_branch_to_a8_stub().  */
18608
18609
struct a8_branch_to_stub_data
18610
{
18611
  asection *writing_section;
18612
  bfd_byte *contents;
18613
};
18614
18615
18616
/* Helper to insert branches to Cortex-A8 erratum stubs in the right
18617
   places for a particular section.  */
18618
18619
static bool
18620
make_branch_to_a8_stub (struct bfd_hash_entry *gen_entry,
18621
           void *in_arg)
18622
0
{
18623
0
  struct elf32_arm_stub_hash_entry *stub_entry;
18624
0
  struct a8_branch_to_stub_data *data;
18625
0
  bfd_byte *contents;
18626
0
  unsigned long branch_insn;
18627
0
  bfd_vma veneered_insn_loc, veneer_entry_loc;
18628
0
  bfd_signed_vma branch_offset;
18629
0
  bfd *abfd;
18630
0
  unsigned int loc;
18631
18632
0
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
18633
0
  data = (struct a8_branch_to_stub_data *) in_arg;
18634
18635
0
  if (stub_entry->target_section != data->writing_section
18636
0
      || stub_entry->stub_type < arm_stub_a8_veneer_lwm)
18637
0
    return true;
18638
18639
0
  contents = data->contents;
18640
18641
  /* We use target_section as Cortex-A8 erratum workaround stubs are only
18642
     generated when both source and target are in the same section.  */
18643
0
  veneered_insn_loc = stub_entry->target_section->output_section->vma
18644
0
          + stub_entry->target_section->output_offset
18645
0
          + stub_entry->source_value;
18646
18647
0
  veneer_entry_loc = stub_entry->stub_sec->output_section->vma
18648
0
         + stub_entry->stub_sec->output_offset
18649
0
         + stub_entry->stub_offset;
18650
18651
0
  if (stub_entry->stub_type == arm_stub_a8_veneer_blx)
18652
0
    veneered_insn_loc &= ~3u;
18653
18654
0
  branch_offset = veneer_entry_loc - veneered_insn_loc - 4;
18655
18656
0
  abfd = stub_entry->target_section->owner;
18657
0
  loc = stub_entry->source_value;
18658
18659
  /* We attempt to avoid this condition by setting stubs_always_after_branch
18660
     in elf32_arm_size_stubs if we've enabled the Cortex-A8 erratum workaround.
18661
     This check is just to be on the safe side...  */
18662
0
  if ((veneered_insn_loc & ~0xfff) == (veneer_entry_loc & ~0xfff))
18663
0
    {
18664
0
      _bfd_error_handler (_("%pB: error: Cortex-A8 erratum stub is "
18665
0
          "allocated in unsafe location"), abfd);
18666
0
      return false;
18667
0
    }
18668
18669
0
  switch (stub_entry->stub_type)
18670
0
    {
18671
0
    case arm_stub_a8_veneer_b:
18672
0
    case arm_stub_a8_veneer_b_cond:
18673
0
      branch_insn = 0xf0009000;
18674
0
      goto jump24;
18675
18676
0
    case arm_stub_a8_veneer_blx:
18677
0
      branch_insn = 0xf000e800;
18678
0
      goto jump24;
18679
18680
0
    case arm_stub_a8_veneer_bl:
18681
0
      {
18682
0
  unsigned int i1, j1, i2, j2, s;
18683
18684
0
  branch_insn = 0xf000d000;
18685
18686
0
      jump24:
18687
0
  if (branch_offset < -16777216 || branch_offset > 16777214)
18688
0
    {
18689
      /* There's not much we can do apart from complain if this
18690
         happens.  */
18691
0
      _bfd_error_handler (_("%pB: error: Cortex-A8 erratum stub out "
18692
0
          "of range (input file too large)"), abfd);
18693
0
      return false;
18694
0
    }
18695
18696
  /* i1 = not(j1 eor s), so:
18697
     not i1 = j1 eor s
18698
     j1 = (not i1) eor s.  */
18699
18700
0
  branch_insn |= (branch_offset >> 1) & 0x7ff;
18701
0
  branch_insn |= ((branch_offset >> 12) & 0x3ff) << 16;
18702
0
  i2 = (branch_offset >> 22) & 1;
18703
0
  i1 = (branch_offset >> 23) & 1;
18704
0
  s = (branch_offset >> 24) & 1;
18705
0
  j1 = (!i1) ^ s;
18706
0
  j2 = (!i2) ^ s;
18707
0
  branch_insn |= j2 << 11;
18708
0
  branch_insn |= j1 << 13;
18709
0
  branch_insn |= s << 26;
18710
0
      }
18711
0
      break;
18712
18713
0
    default:
18714
0
      BFD_FAIL ();
18715
0
      return false;
18716
0
    }
18717
18718
0
  bfd_put_16 (abfd, (branch_insn >> 16) & 0xffff, &contents[loc]);
18719
0
  bfd_put_16 (abfd, branch_insn & 0xffff, &contents[loc + 2]);
18720
18721
0
  return true;
18722
0
}
18723
18724
/* Beginning of stm32l4xx work-around.  */
18725
18726
/* Functions encoding instructions necessary for the emission of the
18727
   fix-stm32l4xx-629360.
18728
   Encoding is extracted from the
18729
   ARM (C) Architecture Reference Manual
18730
   ARMv7-A and ARMv7-R edition
18731
   ARM DDI 0406C.b (ID072512).  */
18732
18733
static inline bfd_vma
18734
create_instruction_branch_absolute (int branch_offset)
18735
0
{
18736
  /* A8.8.18 B (A8-334)
18737
     B target_address (Encoding T4).  */
18738
  /* 1111 - 0Sii - iiii - iiii - 10J1 - Jiii - iiii - iiii.  */
18739
  /* jump offset is:  S:I1:I2:imm10:imm11:0.  */
18740
  /* with : I1 = NOT (J1 EOR S) I2 = NOT (J2 EOR S).  */
18741
18742
0
  int s = ((branch_offset & 0x1000000) >> 24);
18743
0
  int j1 = s ^ !((branch_offset & 0x800000) >> 23);
18744
0
  int j2 = s ^ !((branch_offset & 0x400000) >> 22);
18745
18746
0
  if (branch_offset < -(1 << 24) || branch_offset >= (1 << 24))
18747
0
    BFD_ASSERT (0 && "Error: branch out of range.  Cannot create branch.");
18748
18749
0
  bfd_vma patched_inst = 0xf0009000
18750
0
    | s << 26 /* S.  */
18751
0
    | (((unsigned long) (branch_offset) >> 12) & 0x3ff) << 16 /* imm10.  */
18752
0
    | j1 << 13 /* J1.  */
18753
0
    | j2 << 11 /* J2.  */
18754
0
    | (((unsigned long) (branch_offset) >> 1) & 0x7ff); /* imm11.  */
18755
18756
0
  return patched_inst;
18757
0
}
18758
18759
static inline bfd_vma
18760
create_instruction_ldmia (int base_reg, int wback, int reg_mask)
18761
0
{
18762
  /* A8.8.57 LDM/LDMIA/LDMFD (A8-396)
18763
     LDMIA Rn!, {Ra, Rb, Rc, ...} (Encoding T2).  */
18764
0
  bfd_vma patched_inst = 0xe8900000
18765
0
    | (/*W=*/wback << 21)
18766
0
    | (base_reg << 16)
18767
0
    | (reg_mask & 0x0000ffff);
18768
18769
0
  return patched_inst;
18770
0
}
18771
18772
static inline bfd_vma
18773
create_instruction_ldmdb (int base_reg, int wback, int reg_mask)
18774
0
{
18775
  /* A8.8.60 LDMDB/LDMEA (A8-402)
18776
     LDMDB Rn!, {Ra, Rb, Rc, ...} (Encoding T1).  */
18777
0
  bfd_vma patched_inst = 0xe9100000
18778
0
    | (/*W=*/wback << 21)
18779
0
    | (base_reg << 16)
18780
0
    | (reg_mask & 0x0000ffff);
18781
18782
0
  return patched_inst;
18783
0
}
18784
18785
static inline bfd_vma
18786
create_instruction_mov (int target_reg, int source_reg)
18787
0
{
18788
  /* A8.8.103 MOV (register) (A8-486)
18789
     MOV Rd, Rm (Encoding T1).  */
18790
0
  bfd_vma patched_inst = 0x4600
18791
0
    | (target_reg & 0x7)
18792
0
    | ((target_reg & 0x8) >> 3) << 7
18793
0
    | (source_reg << 3);
18794
18795
0
  return patched_inst;
18796
0
}
18797
18798
static inline bfd_vma
18799
create_instruction_sub (int target_reg, int source_reg, int value)
18800
0
{
18801
  /* A8.8.221 SUB (immediate) (A8-708)
18802
     SUB Rd, Rn, #value (Encoding T3).  */
18803
0
  bfd_vma patched_inst = 0xf1a00000
18804
0
    | (target_reg << 8)
18805
0
    | (source_reg << 16)
18806
0
    | (/*S=*/0 << 20)
18807
0
    | ((value & 0x800) >> 11) << 26
18808
0
    | ((value & 0x700) >>  8) << 12
18809
0
    | (value & 0x0ff);
18810
18811
0
  return patched_inst;
18812
0
}
18813
18814
static inline bfd_vma
18815
create_instruction_vldmia (int base_reg, int is_dp, int wback, int num_words,
18816
         int first_reg)
18817
0
{
18818
  /* A8.8.332 VLDM (A8-922)
18819
     VLMD{MODE} Rn{!}, {list} (Encoding T1 or T2).  */
18820
0
  bfd_vma patched_inst = (is_dp ? 0xec900b00 : 0xec900a00)
18821
0
    | (/*W=*/wback << 21)
18822
0
    | (base_reg << 16)
18823
0
    | (num_words & 0x000000ff)
18824
0
    | (((unsigned)first_reg >> 1) & 0x0000000f) << 12
18825
0
    | (first_reg & 0x00000001) << 22;
18826
18827
0
  return patched_inst;
18828
0
}
18829
18830
static inline bfd_vma
18831
create_instruction_vldmdb (int base_reg, int is_dp, int num_words,
18832
         int first_reg)
18833
0
{
18834
  /* A8.8.332 VLDM (A8-922)
18835
     VLMD{MODE} Rn!, {} (Encoding T1 or T2).  */
18836
0
  bfd_vma patched_inst = (is_dp ? 0xed300b00 : 0xed300a00)
18837
0
    | (base_reg << 16)
18838
0
    | (num_words & 0x000000ff)
18839
0
    | (((unsigned)first_reg >>1 ) & 0x0000000f) << 12
18840
0
    | (first_reg & 0x00000001) << 22;
18841
18842
0
  return patched_inst;
18843
0
}
18844
18845
static inline bfd_vma
18846
create_instruction_udf_w (int value)
18847
0
{
18848
  /* A8.8.247 UDF (A8-758)
18849
     Undefined (Encoding T2).  */
18850
0
  bfd_vma patched_inst = 0xf7f0a000
18851
0
    | (value & 0x00000fff)
18852
0
    | (value & 0x000f0000) << 16;
18853
18854
0
  return patched_inst;
18855
0
}
18856
18857
static inline bfd_vma
18858
create_instruction_udf (int value)
18859
0
{
18860
  /* A8.8.247 UDF (A8-758)
18861
     Undefined (Encoding T1).  */
18862
0
  bfd_vma patched_inst = 0xde00
18863
0
    | (value & 0xff);
18864
18865
0
  return patched_inst;
18866
0
}
18867
18868
/* Functions writing an instruction in memory, returning the next
18869
   memory position to write to.  */
18870
18871
static inline bfd_byte *
18872
push_thumb2_insn32 (struct elf32_arm_link_hash_table * htab,
18873
        bfd * output_bfd, bfd_byte *pt, insn32 insn)
18874
0
{
18875
0
  put_thumb2_insn (htab, output_bfd, insn, pt);
18876
0
  return pt + 4;
18877
0
}
18878
18879
static inline bfd_byte *
18880
push_thumb2_insn16 (struct elf32_arm_link_hash_table * htab,
18881
        bfd * output_bfd, bfd_byte *pt, insn32 insn)
18882
0
{
18883
0
  put_thumb_insn (htab, output_bfd, insn, pt);
18884
0
  return pt + 2;
18885
0
}
18886
18887
/* Function filling up a region in memory with T1 and T2 UDFs taking
18888
   care of alignment.  */
18889
18890
static bfd_byte *
18891
stm32l4xx_fill_stub_udf (struct elf32_arm_link_hash_table * htab,
18892
       bfd *       output_bfd,
18893
       const bfd_byte * const  base_stub_contents,
18894
       bfd_byte * const  from_stub_contents,
18895
       const bfd_byte * const  end_stub_contents)
18896
0
{
18897
0
  bfd_byte *current_stub_contents = from_stub_contents;
18898
18899
  /* Fill the remaining of the stub with deterministic contents : UDF
18900
     instructions.
18901
     Check if realignment is needed on modulo 4 frontier using T1, to
18902
     further use T2.  */
18903
0
  if ((current_stub_contents < end_stub_contents)
18904
0
      && !((current_stub_contents - base_stub_contents) % 2)
18905
0
      && ((current_stub_contents - base_stub_contents) % 4))
18906
0
    current_stub_contents =
18907
0
      push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
18908
0
        create_instruction_udf (0));
18909
18910
0
  for (; current_stub_contents < end_stub_contents;)
18911
0
    current_stub_contents =
18912
0
      push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18913
0
        create_instruction_udf_w (0));
18914
18915
0
  return current_stub_contents;
18916
0
}
18917
18918
/* Functions writing the stream of instructions equivalent to the
18919
   derived sequence for ldmia, ldmdb, vldm respectively.  */
18920
18921
static void
18922
stm32l4xx_create_replacing_stub_ldmia (struct elf32_arm_link_hash_table * htab,
18923
               bfd * output_bfd,
18924
               const insn32 initial_insn,
18925
               const bfd_byte *const initial_insn_addr,
18926
               bfd_byte *const base_stub_contents)
18927
0
{
18928
0
  int wback = (initial_insn & 0x00200000) >> 21;
18929
0
  int ri, rn = (initial_insn & 0x000F0000) >> 16;
18930
0
  int insn_all_registers = initial_insn & 0x0000ffff;
18931
0
  int insn_low_registers, insn_high_registers;
18932
0
  int usable_register_mask;
18933
0
  int nb_registers = elf32_arm_popcount (insn_all_registers);
18934
0
  int restore_pc = (insn_all_registers & (1 << 15)) ? 1 : 0;
18935
0
  int restore_rn = (insn_all_registers & (1 << rn)) ? 1 : 0;
18936
0
  bfd_byte *current_stub_contents = base_stub_contents;
18937
18938
0
  BFD_ASSERT (is_thumb2_ldmia (initial_insn));
18939
18940
  /* In BFD_ARM_STM32L4XX_FIX_ALL mode we may have to deal with
18941
     smaller than 8 registers load sequences that do not cause the
18942
     hardware issue.  */
18943
0
  if (nb_registers <= 8)
18944
0
    {
18945
      /* UNTOUCHED : LDMIA Rn{!}, {R-all-register-list}.  */
18946
0
      current_stub_contents =
18947
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18948
0
          initial_insn);
18949
18950
      /* B initial_insn_addr+4.  */
18951
0
      if (!restore_pc)
18952
0
  current_stub_contents =
18953
0
    push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18954
0
            create_instruction_branch_absolute
18955
0
            (initial_insn_addr - current_stub_contents));
18956
18957
      /* Fill the remaining of the stub with deterministic contents.  */
18958
0
      current_stub_contents =
18959
0
  stm32l4xx_fill_stub_udf (htab, output_bfd,
18960
0
         base_stub_contents, current_stub_contents,
18961
0
         base_stub_contents +
18962
0
         STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
18963
18964
0
      return;
18965
0
    }
18966
18967
  /* - reg_list[13] == 0.  */
18968
0
  BFD_ASSERT ((insn_all_registers & (1 << 13))==0);
18969
18970
  /* - reg_list[14] & reg_list[15] != 1.  */
18971
0
  BFD_ASSERT ((insn_all_registers & 0xC000) != 0xC000);
18972
18973
  /* - if (wback==1) reg_list[rn] == 0.  */
18974
0
  BFD_ASSERT (!wback || !restore_rn);
18975
18976
  /* - nb_registers > 8.  */
18977
0
  BFD_ASSERT (elf32_arm_popcount (insn_all_registers) > 8);
18978
18979
  /* At this point, LDMxx initial insn loads between 9 and 14 registers.  */
18980
18981
  /* In the following algorithm, we split this wide LDM using 2 LDM insns:
18982
    - One with the 7 lowest registers (register mask 0x007F)
18983
      This LDM will finally contain between 2 and 7 registers
18984
    - One with the 7 highest registers (register mask 0xDF80)
18985
      This ldm will finally contain between 2 and 7 registers.  */
18986
0
  insn_low_registers = insn_all_registers & 0x007F;
18987
0
  insn_high_registers = insn_all_registers & 0xDF80;
18988
18989
  /* A spare register may be needed during this veneer to temporarily
18990
     handle the base register.  This register will be restored with the
18991
     last LDM operation.
18992
     The usable register may be any general purpose register (that
18993
     excludes PC, SP, LR : register mask is 0x1FFF).  */
18994
0
  usable_register_mask = 0x1FFF;
18995
18996
  /* Generate the stub function.  */
18997
0
  if (wback)
18998
0
    {
18999
      /* LDMIA Rn!, {R-low-register-list} : (Encoding T2).  */
19000
0
      current_stub_contents =
19001
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19002
0
          create_instruction_ldmia
19003
0
          (rn, /*wback=*/1, insn_low_registers));
19004
19005
      /* LDMIA Rn!, {R-high-register-list} : (Encoding T2).  */
19006
0
      current_stub_contents =
19007
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19008
0
          create_instruction_ldmia
19009
0
          (rn, /*wback=*/1, insn_high_registers));
19010
0
      if (!restore_pc)
19011
0
  {
19012
    /* B initial_insn_addr+4.  */
19013
0
    current_stub_contents =
19014
0
      push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19015
0
        create_instruction_branch_absolute
19016
0
        (initial_insn_addr - current_stub_contents));
19017
0
       }
19018
0
    }
19019
0
  else /* if (!wback).  */
19020
0
    {
19021
0
      ri = rn;
19022
19023
      /* If Rn is not part of the high-register-list, move it there.  */
19024
0
      if (!(insn_high_registers & (1 << rn)))
19025
0
  {
19026
    /* Choose a Ri in the high-register-list that will be restored.  */
19027
0
    ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
19028
19029
    /* MOV Ri, Rn.  */
19030
0
    current_stub_contents =
19031
0
      push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
19032
0
        create_instruction_mov (ri, rn));
19033
0
  }
19034
19035
      /* LDMIA Ri!, {R-low-register-list} : (Encoding T2).  */
19036
0
      current_stub_contents =
19037
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19038
0
          create_instruction_ldmia
19039
0
          (ri, /*wback=*/1, insn_low_registers));
19040
19041
      /* LDMIA Ri, {R-high-register-list} : (Encoding T2).  */
19042
0
      current_stub_contents =
19043
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19044
0
          create_instruction_ldmia
19045
0
          (ri, /*wback=*/0, insn_high_registers));
19046
19047
0
      if (!restore_pc)
19048
0
  {
19049
    /* B initial_insn_addr+4.  */
19050
0
    current_stub_contents =
19051
0
      push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19052
0
        create_instruction_branch_absolute
19053
0
        (initial_insn_addr - current_stub_contents));
19054
0
  }
19055
0
    }
19056
19057
  /* Fill the remaining of the stub with deterministic contents.  */
19058
0
  current_stub_contents =
19059
0
    stm32l4xx_fill_stub_udf (htab, output_bfd,
19060
0
           base_stub_contents, current_stub_contents,
19061
0
           base_stub_contents +
19062
0
           STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
19063
0
}
19064
19065
static void
19066
stm32l4xx_create_replacing_stub_ldmdb (struct elf32_arm_link_hash_table * htab,
19067
               bfd * output_bfd,
19068
               const insn32 initial_insn,
19069
               const bfd_byte *const initial_insn_addr,
19070
               bfd_byte *const base_stub_contents)
19071
0
{
19072
0
  int wback = (initial_insn & 0x00200000) >> 21;
19073
0
  int ri, rn = (initial_insn & 0x000f0000) >> 16;
19074
0
  int insn_all_registers = initial_insn & 0x0000ffff;
19075
0
  int insn_low_registers, insn_high_registers;
19076
0
  int usable_register_mask;
19077
0
  int restore_pc = (insn_all_registers & (1 << 15)) ? 1 : 0;
19078
0
  int restore_rn = (insn_all_registers & (1 << rn)) ? 1 : 0;
19079
0
  int nb_registers = elf32_arm_popcount (insn_all_registers);
19080
0
  bfd_byte *current_stub_contents = base_stub_contents;
19081
19082
0
  BFD_ASSERT (is_thumb2_ldmdb (initial_insn));
19083
19084
  /* In BFD_ARM_STM32L4XX_FIX_ALL mode we may have to deal with
19085
     smaller than 8 registers load sequences that do not cause the
19086
     hardware issue.  */
19087
0
  if (nb_registers <= 8)
19088
0
    {
19089
      /* UNTOUCHED : LDMIA Rn{!}, {R-all-register-list}.  */
19090
0
      current_stub_contents =
19091
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19092
0
          initial_insn);
19093
19094
      /* B initial_insn_addr+4.  */
19095
0
      current_stub_contents =
19096
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19097
0
          create_instruction_branch_absolute
19098
0
          (initial_insn_addr - current_stub_contents));
19099
19100
      /* Fill the remaining of the stub with deterministic contents.  */
19101
0
      current_stub_contents =
19102
0
  stm32l4xx_fill_stub_udf (htab, output_bfd,
19103
0
         base_stub_contents, current_stub_contents,
19104
0
         base_stub_contents +
19105
0
         STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
19106
19107
0
      return;
19108
0
    }
19109
19110
  /* - reg_list[13] == 0.  */
19111
0
  BFD_ASSERT ((insn_all_registers & (1 << 13)) == 0);
19112
19113
  /* - reg_list[14] & reg_list[15] != 1.  */
19114
0
  BFD_ASSERT ((insn_all_registers & 0xC000) != 0xC000);
19115
19116
  /* - if (wback==1) reg_list[rn] == 0.  */
19117
0
  BFD_ASSERT (!wback || !restore_rn);
19118
19119
  /* - nb_registers > 8.  */
19120
0
  BFD_ASSERT (elf32_arm_popcount (insn_all_registers) > 8);
19121
19122
  /* At this point, LDMxx initial insn loads between 9 and 14 registers.  */
19123
19124
  /* In the following algorithm, we split this wide LDM using 2 LDM insn:
19125
    - One with the 7 lowest registers (register mask 0x007F)
19126
      This LDM will finally contain between 2 and 7 registers
19127
    - One with the 7 highest registers (register mask 0xDF80)
19128
      This ldm will finally contain between 2 and 7 registers.  */
19129
0
  insn_low_registers = insn_all_registers & 0x007F;
19130
0
  insn_high_registers = insn_all_registers & 0xDF80;
19131
19132
  /* A spare register may be needed during this veneer to temporarily
19133
     handle the base register.  This register will be restored with
19134
     the last LDM operation.
19135
     The usable register may be any general purpose register (that excludes
19136
     PC, SP, LR : register mask is 0x1FFF).  */
19137
0
  usable_register_mask = 0x1FFF;
19138
19139
  /* Generate the stub function.  */
19140
0
  if (!wback && !restore_pc && !restore_rn)
19141
0
    {
19142
      /* Choose a Ri in the low-register-list that will be restored.  */
19143
0
      ri = ctz (insn_low_registers & usable_register_mask & ~(1 << rn));
19144
19145
      /* MOV Ri, Rn.  */
19146
0
      current_stub_contents =
19147
0
  push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
19148
0
          create_instruction_mov (ri, rn));
19149
19150
      /* LDMDB Ri!, {R-high-register-list}.  */
19151
0
      current_stub_contents =
19152
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19153
0
          create_instruction_ldmdb
19154
0
          (ri, /*wback=*/1, insn_high_registers));
19155
19156
      /* LDMDB Ri, {R-low-register-list}.  */
19157
0
      current_stub_contents =
19158
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19159
0
          create_instruction_ldmdb
19160
0
          (ri, /*wback=*/0, insn_low_registers));
19161
19162
      /* B initial_insn_addr+4.  */
19163
0
      current_stub_contents =
19164
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19165
0
          create_instruction_branch_absolute
19166
0
          (initial_insn_addr - current_stub_contents));
19167
0
    }
19168
0
  else if (wback && !restore_pc && !restore_rn)
19169
0
    {
19170
      /* LDMDB Rn!, {R-high-register-list}.  */
19171
0
      current_stub_contents =
19172
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19173
0
          create_instruction_ldmdb
19174
0
          (rn, /*wback=*/1, insn_high_registers));
19175
19176
      /* LDMDB Rn!, {R-low-register-list}.  */
19177
0
      current_stub_contents =
19178
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19179
0
          create_instruction_ldmdb
19180
0
          (rn, /*wback=*/1, insn_low_registers));
19181
19182
      /* B initial_insn_addr+4.  */
19183
0
      current_stub_contents =
19184
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19185
0
          create_instruction_branch_absolute
19186
0
          (initial_insn_addr - current_stub_contents));
19187
0
    }
19188
0
  else if (!wback && restore_pc && !restore_rn)
19189
0
    {
19190
      /* Choose a Ri in the high-register-list that will be restored.  */
19191
0
      ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
19192
19193
      /* SUB Ri, Rn, #(4*nb_registers).  */
19194
0
      current_stub_contents =
19195
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19196
0
          create_instruction_sub (ri, rn, (4 * nb_registers)));
19197
19198
      /* LDMIA Ri!, {R-low-register-list}.  */
19199
0
      current_stub_contents =
19200
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19201
0
          create_instruction_ldmia
19202
0
          (ri, /*wback=*/1, insn_low_registers));
19203
19204
      /* LDMIA Ri, {R-high-register-list}.  */
19205
0
      current_stub_contents =
19206
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19207
0
          create_instruction_ldmia
19208
0
          (ri, /*wback=*/0, insn_high_registers));
19209
0
    }
19210
0
  else if (wback && restore_pc && !restore_rn)
19211
0
    {
19212
      /* Choose a Ri in the high-register-list that will be restored.  */
19213
0
      ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
19214
19215
      /* SUB Rn, Rn, #(4*nb_registers)  */
19216
0
      current_stub_contents =
19217
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19218
0
          create_instruction_sub (rn, rn, (4 * nb_registers)));
19219
19220
      /* MOV Ri, Rn.  */
19221
0
      current_stub_contents =
19222
0
  push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
19223
0
          create_instruction_mov (ri, rn));
19224
19225
      /* LDMIA Ri!, {R-low-register-list}.  */
19226
0
      current_stub_contents =
19227
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19228
0
          create_instruction_ldmia
19229
0
          (ri, /*wback=*/1, insn_low_registers));
19230
19231
      /* LDMIA Ri, {R-high-register-list}.  */
19232
0
      current_stub_contents =
19233
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19234
0
          create_instruction_ldmia
19235
0
          (ri, /*wback=*/0, insn_high_registers));
19236
0
    }
19237
0
  else if (!wback && !restore_pc && restore_rn)
19238
0
    {
19239
0
      ri = rn;
19240
0
      if (!(insn_low_registers & (1 << rn)))
19241
0
  {
19242
    /* Choose a Ri in the low-register-list that will be restored.  */
19243
0
    ri = ctz (insn_low_registers & usable_register_mask & ~(1 << rn));
19244
19245
    /* MOV Ri, Rn.  */
19246
0
    current_stub_contents =
19247
0
      push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
19248
0
        create_instruction_mov (ri, rn));
19249
0
  }
19250
19251
      /* LDMDB Ri!, {R-high-register-list}.  */
19252
0
      current_stub_contents =
19253
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19254
0
          create_instruction_ldmdb
19255
0
          (ri, /*wback=*/1, insn_high_registers));
19256
19257
      /* LDMDB Ri, {R-low-register-list}.  */
19258
0
      current_stub_contents =
19259
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19260
0
          create_instruction_ldmdb
19261
0
          (ri, /*wback=*/0, insn_low_registers));
19262
19263
      /* B initial_insn_addr+4.  */
19264
0
      current_stub_contents =
19265
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19266
0
          create_instruction_branch_absolute
19267
0
          (initial_insn_addr - current_stub_contents));
19268
0
    }
19269
0
  else if (!wback && restore_pc && restore_rn)
19270
0
    {
19271
0
      ri = rn;
19272
0
      if (!(insn_high_registers & (1 << rn)))
19273
0
  {
19274
    /* Choose a Ri in the high-register-list that will be restored.  */
19275
0
    ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
19276
0
  }
19277
19278
      /* SUB Ri, Rn, #(4*nb_registers).  */
19279
0
      current_stub_contents =
19280
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19281
0
          create_instruction_sub (ri, rn, (4 * nb_registers)));
19282
19283
      /* LDMIA Ri!, {R-low-register-list}.  */
19284
0
      current_stub_contents =
19285
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19286
0
          create_instruction_ldmia
19287
0
          (ri, /*wback=*/1, insn_low_registers));
19288
19289
      /* LDMIA Ri, {R-high-register-list}.  */
19290
0
      current_stub_contents =
19291
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19292
0
          create_instruction_ldmia
19293
0
          (ri, /*wback=*/0, insn_high_registers));
19294
0
    }
19295
0
  else if (wback && restore_rn)
19296
0
    {
19297
      /* The assembler should not have accepted to encode this.  */
19298
0
      BFD_ASSERT (0 && "Cannot patch an instruction that has an "
19299
0
  "undefined behavior.\n");
19300
0
    }
19301
19302
  /* Fill the remaining of the stub with deterministic contents.  */
19303
0
  current_stub_contents =
19304
0
    stm32l4xx_fill_stub_udf (htab, output_bfd,
19305
0
           base_stub_contents, current_stub_contents,
19306
0
           base_stub_contents +
19307
0
           STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
19308
19309
0
}
19310
19311
static void
19312
stm32l4xx_create_replacing_stub_vldm (struct elf32_arm_link_hash_table * htab,
19313
              bfd * output_bfd,
19314
              const insn32 initial_insn,
19315
              const bfd_byte *const initial_insn_addr,
19316
              bfd_byte *const base_stub_contents)
19317
0
{
19318
0
  int num_words = initial_insn & 0xff;
19319
0
  bfd_byte *current_stub_contents = base_stub_contents;
19320
19321
0
  BFD_ASSERT (is_thumb2_vldm (initial_insn));
19322
19323
  /* In BFD_ARM_STM32L4XX_FIX_ALL mode we may have to deal with
19324
     smaller than 8 words load sequences that do not cause the
19325
     hardware issue.  */
19326
0
  if (num_words <= 8)
19327
0
    {
19328
      /* Untouched instruction.  */
19329
0
      current_stub_contents =
19330
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19331
0
          initial_insn);
19332
19333
      /* B initial_insn_addr+4.  */
19334
0
      current_stub_contents =
19335
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19336
0
          create_instruction_branch_absolute
19337
0
          (initial_insn_addr - current_stub_contents));
19338
0
    }
19339
0
  else
19340
0
    {
19341
0
      bool is_dp = /* DP encoding.  */
19342
0
  (initial_insn & 0xfe100f00) == 0xec100b00;
19343
0
      bool is_ia_nobang = /* (IA without !).  */
19344
0
  (((initial_insn << 7) >> 28) & 0xd) == 0x4;
19345
0
      bool is_ia_bang = /* (IA with !) - includes VPOP.  */
19346
0
  (((initial_insn << 7) >> 28) & 0xd) == 0x5;
19347
0
      bool is_db_bang = /* (DB with !).  */
19348
0
  (((initial_insn << 7) >> 28) & 0xd) == 0x9;
19349
0
      int base_reg = ((unsigned int) initial_insn << 12) >> 28;
19350
      /* d = UInt (Vd:D);.  */
19351
0
      int first_reg = ((((unsigned int) initial_insn << 16) >> 28) << 1)
19352
0
  | (((unsigned int)initial_insn << 9) >> 31);
19353
19354
      /* Compute the number of 8-words chunks needed to split.  */
19355
0
      int chunks = (num_words % 8) ? (num_words / 8 + 1) : (num_words / 8);
19356
0
      int chunk;
19357
19358
      /* The test coverage has been done assuming the following
19359
   hypothesis that exactly one of the previous is_ predicates is
19360
   true.  */
19361
0
      BFD_ASSERT (    (is_ia_nobang ^ is_ia_bang ^ is_db_bang)
19362
0
      && !(is_ia_nobang & is_ia_bang & is_db_bang));
19363
19364
      /* We treat the cutting of the words in one pass for all
19365
   cases, then we emit the adjustments:
19366
19367
   vldm rx, {...}
19368
   -> vldm rx!, {8_words_or_less} for each needed 8_word
19369
   -> sub rx, rx, #size (list)
19370
19371
   vldm rx!, {...}
19372
   -> vldm rx!, {8_words_or_less} for each needed 8_word
19373
   This also handles vpop instruction (when rx is sp)
19374
19375
   vldmd rx!, {...}
19376
   -> vldmb rx!, {8_words_or_less} for each needed 8_word.  */
19377
0
      for (chunk = 0; chunk < chunks; ++chunk)
19378
0
  {
19379
0
    bfd_vma new_insn = 0;
19380
19381
0
    if (is_ia_nobang || is_ia_bang)
19382
0
      {
19383
0
        new_insn = create_instruction_vldmia
19384
0
    (base_reg,
19385
0
     is_dp,
19386
0
     /*wback= .  */1,
19387
0
     chunks - (chunk + 1) ?
19388
0
     8 : num_words - chunk * 8,
19389
0
     first_reg + chunk * 8);
19390
0
      }
19391
0
    else if (is_db_bang)
19392
0
      {
19393
0
        new_insn = create_instruction_vldmdb
19394
0
    (base_reg,
19395
0
     is_dp,
19396
0
     chunks - (chunk + 1) ?
19397
0
     8 : num_words - chunk * 8,
19398
0
     first_reg + chunk * 8);
19399
0
      }
19400
19401
0
    if (new_insn)
19402
0
      current_stub_contents =
19403
0
        push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19404
0
          new_insn);
19405
0
  }
19406
19407
      /* Only this case requires the base register compensation
19408
   subtract.  */
19409
0
      if (is_ia_nobang)
19410
0
  {
19411
0
    current_stub_contents =
19412
0
      push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19413
0
        create_instruction_sub
19414
0
        (base_reg, base_reg, 4*num_words));
19415
0
  }
19416
19417
      /* B initial_insn_addr+4.  */
19418
0
      current_stub_contents =
19419
0
  push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19420
0
          create_instruction_branch_absolute
19421
0
          (initial_insn_addr - current_stub_contents));
19422
0
    }
19423
19424
  /* Fill the remaining of the stub with deterministic contents.  */
19425
0
  current_stub_contents =
19426
0
    stm32l4xx_fill_stub_udf (htab, output_bfd,
19427
0
           base_stub_contents, current_stub_contents,
19428
0
           base_stub_contents +
19429
0
           STM32L4XX_ERRATUM_VLDM_VENEER_SIZE);
19430
0
}
19431
19432
static void
19433
stm32l4xx_create_replacing_stub (struct elf32_arm_link_hash_table * htab,
19434
         bfd * output_bfd,
19435
         const insn32 wrong_insn,
19436
         const bfd_byte *const wrong_insn_addr,
19437
         bfd_byte *const stub_contents)
19438
0
{
19439
0
  if (is_thumb2_ldmia (wrong_insn))
19440
0
    stm32l4xx_create_replacing_stub_ldmia (htab, output_bfd,
19441
0
             wrong_insn, wrong_insn_addr,
19442
0
             stub_contents);
19443
0
  else if (is_thumb2_ldmdb (wrong_insn))
19444
0
    stm32l4xx_create_replacing_stub_ldmdb (htab, output_bfd,
19445
0
             wrong_insn, wrong_insn_addr,
19446
0
             stub_contents);
19447
0
  else if (is_thumb2_vldm (wrong_insn))
19448
0
    stm32l4xx_create_replacing_stub_vldm (htab, output_bfd,
19449
0
            wrong_insn, wrong_insn_addr,
19450
0
            stub_contents);
19451
0
}
19452
19453
/* End of stm32l4xx work-around.  */
19454
19455
19456
/* Do code byteswapping.  Return FALSE afterwards so that the section is
19457
   written out as normal.  */
19458
19459
static bool
19460
elf32_arm_write_section (bfd *output_bfd,
19461
       struct bfd_link_info *link_info,
19462
       asection *sec,
19463
       bfd_byte *contents)
19464
0
{
19465
0
  unsigned int mapcount, errcount;
19466
0
  _arm_elf_section_data *arm_data;
19467
0
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
19468
0
  elf32_arm_section_map *map;
19469
0
  elf32_vfp11_erratum_list *errnode;
19470
0
  elf32_stm32l4xx_erratum_list *stm32l4xx_errnode;
19471
0
  bfd_vma ptr;
19472
0
  bfd_vma end;
19473
0
  bfd_vma offset = sec->output_section->vma + sec->output_offset;
19474
0
  bfd_byte tmp;
19475
0
  unsigned int i;
19476
19477
0
  if (globals == NULL)
19478
0
    return false;
19479
19480
  /* If this section has not been allocated an _arm_elf_section_data
19481
     structure then we cannot record anything.  */
19482
0
  arm_data = get_arm_elf_section_data (sec);
19483
0
  if (arm_data == NULL)
19484
0
    return false;
19485
19486
0
  mapcount = arm_data->mapcount;
19487
0
  map = arm_data->map;
19488
0
  errcount = arm_data->erratumcount;
19489
19490
0
  if (errcount != 0)
19491
0
    {
19492
0
      unsigned int endianflip = bfd_big_endian (output_bfd) ? 3 : 0;
19493
19494
0
      for (errnode = arm_data->erratumlist; errnode != 0;
19495
0
     errnode = errnode->next)
19496
0
  {
19497
0
    bfd_vma target = errnode->vma - offset;
19498
19499
0
    switch (errnode->type)
19500
0
      {
19501
0
      case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
19502
0
        {
19503
0
    bfd_vma branch_to_veneer;
19504
    /* Original condition code of instruction, plus bit mask for
19505
       ARM B instruction.  */
19506
0
    unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000)
19507
0
          | 0x0a000000;
19508
19509
    /* The instruction is before the label.  */
19510
0
    target -= 4;
19511
19512
    /* Above offset included in -4 below.  */
19513
0
    branch_to_veneer = errnode->u.b.veneer->vma
19514
0
           - errnode->vma - 4;
19515
19516
0
    if ((signed) branch_to_veneer < -(1 << 25)
19517
0
        || (signed) branch_to_veneer >= (1 << 25))
19518
0
      _bfd_error_handler (_("%pB: error: VFP11 veneer out of "
19519
0
          "range"), output_bfd);
19520
19521
0
    insn |= (branch_to_veneer >> 2) & 0xffffff;
19522
0
    contents[endianflip ^ target] = insn & 0xff;
19523
0
    contents[endianflip ^ (target + 1)] = (insn >> 8) & 0xff;
19524
0
    contents[endianflip ^ (target + 2)] = (insn >> 16) & 0xff;
19525
0
    contents[endianflip ^ (target + 3)] = (insn >> 24) & 0xff;
19526
0
        }
19527
0
        break;
19528
19529
0
      case VFP11_ERRATUM_ARM_VENEER:
19530
0
        {
19531
0
    bfd_vma branch_from_veneer;
19532
0
    unsigned int insn;
19533
19534
    /* Take size of veneer into account.  */
19535
0
    branch_from_veneer = errnode->u.v.branch->vma
19536
0
             - errnode->vma - 12;
19537
19538
0
    if ((signed) branch_from_veneer < -(1 << 25)
19539
0
        || (signed) branch_from_veneer >= (1 << 25))
19540
0
      _bfd_error_handler (_("%pB: error: VFP11 veneer out of "
19541
0
          "range"), output_bfd);
19542
19543
    /* Original instruction.  */
19544
0
    insn = errnode->u.v.branch->u.b.vfp_insn;
19545
0
    contents[endianflip ^ target] = insn & 0xff;
19546
0
    contents[endianflip ^ (target + 1)] = (insn >> 8) & 0xff;
19547
0
    contents[endianflip ^ (target + 2)] = (insn >> 16) & 0xff;
19548
0
    contents[endianflip ^ (target + 3)] = (insn >> 24) & 0xff;
19549
19550
    /* Branch back to insn after original insn.  */
19551
0
    insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff);
19552
0
    contents[endianflip ^ (target + 4)] = insn & 0xff;
19553
0
    contents[endianflip ^ (target + 5)] = (insn >> 8) & 0xff;
19554
0
    contents[endianflip ^ (target + 6)] = (insn >> 16) & 0xff;
19555
0
    contents[endianflip ^ (target + 7)] = (insn >> 24) & 0xff;
19556
0
        }
19557
0
        break;
19558
19559
0
      default:
19560
0
        abort ();
19561
0
      }
19562
0
  }
19563
0
    }
19564
19565
0
  if (arm_data->stm32l4xx_erratumcount != 0)
19566
0
    {
19567
0
      for (stm32l4xx_errnode = arm_data->stm32l4xx_erratumlist;
19568
0
     stm32l4xx_errnode != 0;
19569
0
     stm32l4xx_errnode = stm32l4xx_errnode->next)
19570
0
  {
19571
0
    bfd_vma target = stm32l4xx_errnode->vma - offset;
19572
19573
0
    switch (stm32l4xx_errnode->type)
19574
0
      {
19575
0
      case STM32L4XX_ERRATUM_BRANCH_TO_VENEER:
19576
0
        {
19577
0
    unsigned int insn;
19578
0
    bfd_vma branch_to_veneer =
19579
0
      stm32l4xx_errnode->u.b.veneer->vma - stm32l4xx_errnode->vma;
19580
19581
0
    if ((signed) branch_to_veneer < -(1 << 24)
19582
0
        || (signed) branch_to_veneer >= (1 << 24))
19583
0
      {
19584
0
        bfd_vma out_of_range =
19585
0
          ((signed) branch_to_veneer < -(1 << 24)) ?
19586
0
          - branch_to_veneer - (1 << 24) :
19587
0
          ((signed) branch_to_veneer >= (1 << 24)) ?
19588
0
          branch_to_veneer - (1 << 24) : 0;
19589
19590
0
        _bfd_error_handler
19591
0
          (_("%pB(%#" PRIx64 "): error: "
19592
0
       "cannot create STM32L4XX veneer; "
19593
0
       "jump out of range by %" PRId64 " bytes; "
19594
0
       "cannot encode branch instruction"),
19595
0
           output_bfd,
19596
0
           (uint64_t) (stm32l4xx_errnode->vma - 4),
19597
0
           (int64_t) out_of_range);
19598
0
        continue;
19599
0
      }
19600
19601
0
    insn = create_instruction_branch_absolute
19602
0
      (stm32l4xx_errnode->u.b.veneer->vma - stm32l4xx_errnode->vma);
19603
19604
    /* The instruction is before the label.  */
19605
0
    target -= 4;
19606
19607
0
    put_thumb2_insn (globals, output_bfd,
19608
0
         (bfd_vma) insn, contents + target);
19609
0
        }
19610
0
        break;
19611
19612
0
      case STM32L4XX_ERRATUM_VENEER:
19613
0
        {
19614
0
    bfd_byte * veneer;
19615
0
    bfd_byte * veneer_r;
19616
0
    unsigned int insn;
19617
19618
0
    veneer = contents + target;
19619
0
    veneer_r = veneer
19620
0
      + stm32l4xx_errnode->u.b.veneer->vma
19621
0
      - stm32l4xx_errnode->vma - 4;
19622
19623
0
    if ((signed) (veneer_r - veneer -
19624
0
            STM32L4XX_ERRATUM_VLDM_VENEER_SIZE >
19625
0
            STM32L4XX_ERRATUM_LDM_VENEER_SIZE ?
19626
0
            STM32L4XX_ERRATUM_VLDM_VENEER_SIZE :
19627
0
            STM32L4XX_ERRATUM_LDM_VENEER_SIZE) < -(1 << 24)
19628
0
        || (signed) (veneer_r - veneer) >= (1 << 24))
19629
0
      {
19630
0
        _bfd_error_handler (_("%pB: error: cannot create STM32L4XX "
19631
0
            "veneer"), output_bfd);
19632
0
         continue;
19633
0
      }
19634
19635
    /* Original instruction.  */
19636
0
    insn = stm32l4xx_errnode->u.v.branch->u.b.insn;
19637
19638
0
    stm32l4xx_create_replacing_stub
19639
0
      (globals, output_bfd, insn, (void*)veneer_r, (void*)veneer);
19640
0
        }
19641
0
        break;
19642
19643
0
      default:
19644
0
        abort ();
19645
0
      }
19646
0
  }
19647
0
    }
19648
19649
0
  if (arm_data->elf.this_hdr.sh_type == SHT_ARM_EXIDX)
19650
0
    {
19651
0
      arm_unwind_table_edit *edit_node
19652
0
  = arm_data->u.exidx.unwind_edit_list;
19653
      /* Now, sec->size is the size of the section we will write.  The original
19654
   size (before we merged duplicate entries and inserted EXIDX_CANTUNWIND
19655
   markers) was sec->rawsize.  (This isn't the case if we perform no
19656
   edits, then rawsize will be zero and we should use size).  */
19657
0
      bfd_byte *edited_contents = (bfd_byte *) bfd_malloc (sec->size);
19658
0
      unsigned int input_size = sec->rawsize ? sec->rawsize : sec->size;
19659
0
      unsigned int in_index, out_index;
19660
0
      bfd_vma add_to_offsets = 0;
19661
19662
0
      if (edited_contents == NULL)
19663
0
  return false;
19664
0
      for (in_index = 0, out_index = 0; in_index * 8 < input_size || edit_node;)
19665
0
  {
19666
0
    if (edit_node)
19667
0
      {
19668
0
        unsigned int edit_index = edit_node->index;
19669
19670
0
        if (in_index < edit_index && in_index * 8 < input_size)
19671
0
    {
19672
0
      copy_exidx_entry (output_bfd, edited_contents + out_index * 8,
19673
0
            contents + in_index * 8, add_to_offsets);
19674
0
      out_index++;
19675
0
      in_index++;
19676
0
    }
19677
0
        else if (in_index == edit_index
19678
0
           || (in_index * 8 >= input_size
19679
0
         && edit_index == UINT_MAX))
19680
0
    {
19681
0
      switch (edit_node->type)
19682
0
        {
19683
0
        case DELETE_EXIDX_ENTRY:
19684
0
          in_index++;
19685
0
          add_to_offsets += 8;
19686
0
          break;
19687
19688
0
        case INSERT_EXIDX_CANTUNWIND_AT_END:
19689
0
          {
19690
0
      asection *text_sec = edit_node->linked_section;
19691
0
      bfd_vma text_offset = text_sec->output_section->vma
19692
0
                + text_sec->output_offset
19693
0
                + text_sec->size;
19694
0
      bfd_vma exidx_offset = offset + out_index * 8;
19695
0
      unsigned long prel31_offset;
19696
19697
      /* Note: this is meant to be equivalent to an
19698
         R_ARM_PREL31 relocation.  These synthetic
19699
         EXIDX_CANTUNWIND markers are not relocated by the
19700
         usual BFD method.  */
19701
0
      prel31_offset = (text_offset - exidx_offset)
19702
0
          & 0x7ffffffful;
19703
0
      if (bfd_link_relocatable (link_info))
19704
0
        {
19705
          /* Here relocation for new EXIDX_CANTUNWIND is
19706
             created, so there is no need to
19707
             adjust offset by hand.  */
19708
0
          prel31_offset = text_sec->output_offset
19709
0
              + text_sec->size;
19710
0
        }
19711
19712
      /* First address we can't unwind.  */
19713
0
      bfd_put_32 (output_bfd, prel31_offset,
19714
0
            &edited_contents[out_index * 8]);
19715
19716
      /* Code for EXIDX_CANTUNWIND.  */
19717
0
      bfd_put_32 (output_bfd, 0x1,
19718
0
            &edited_contents[out_index * 8 + 4]);
19719
19720
0
      out_index++;
19721
0
      add_to_offsets -= 8;
19722
0
          }
19723
0
          break;
19724
0
        }
19725
19726
0
      edit_node = edit_node->next;
19727
0
    }
19728
0
      }
19729
0
    else
19730
0
      {
19731
        /* No more edits, copy remaining entries verbatim.  */
19732
0
        copy_exidx_entry (output_bfd, edited_contents + out_index * 8,
19733
0
        contents + in_index * 8, add_to_offsets);
19734
0
        out_index++;
19735
0
        in_index++;
19736
0
      }
19737
0
  }
19738
19739
0
      if (!(sec->flags & SEC_EXCLUDE) && !(sec->flags & SEC_NEVER_LOAD))
19740
0
  bfd_set_section_contents (output_bfd, sec->output_section,
19741
0
          edited_contents,
19742
0
          (file_ptr) sec->output_offset, sec->size);
19743
19744
0
      return true;
19745
0
    }
19746
19747
  /* Fix code to point to Cortex-A8 erratum stubs.  */
19748
0
  if (globals->fix_cortex_a8)
19749
0
    {
19750
0
      struct a8_branch_to_stub_data data;
19751
19752
0
      data.writing_section = sec;
19753
0
      data.contents = contents;
19754
19755
0
      bfd_hash_traverse (& globals->stub_hash_table, make_branch_to_a8_stub,
19756
0
       & data);
19757
0
    }
19758
19759
0
  if (mapcount == 0)
19760
0
    return false;
19761
19762
0
  if (globals->byteswap_code)
19763
0
    {
19764
0
      qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
19765
19766
0
      ptr = map[0].vma;
19767
0
      for (i = 0; i < mapcount; i++)
19768
0
  {
19769
0
    if (i == mapcount - 1)
19770
0
      end = sec->size;
19771
0
    else
19772
0
      end = map[i + 1].vma;
19773
19774
0
    switch (map[i].type)
19775
0
      {
19776
0
      case 'a':
19777
        /* Byte swap code words.  */
19778
0
        while (ptr + 3 < end)
19779
0
    {
19780
0
      tmp = contents[ptr];
19781
0
      contents[ptr] = contents[ptr + 3];
19782
0
      contents[ptr + 3] = tmp;
19783
0
      tmp = contents[ptr + 1];
19784
0
      contents[ptr + 1] = contents[ptr + 2];
19785
0
      contents[ptr + 2] = tmp;
19786
0
      ptr += 4;
19787
0
    }
19788
0
        break;
19789
19790
0
      case 't':
19791
        /* Byte swap code halfwords.  */
19792
0
        while (ptr + 1 < end)
19793
0
    {
19794
0
      tmp = contents[ptr];
19795
0
      contents[ptr] = contents[ptr + 1];
19796
0
      contents[ptr + 1] = tmp;
19797
0
      ptr += 2;
19798
0
    }
19799
0
        break;
19800
19801
0
      case 'd':
19802
        /* Leave data alone.  */
19803
0
        break;
19804
0
      }
19805
0
    ptr = end;
19806
0
  }
19807
0
    }
19808
19809
0
  free (map);
19810
0
  arm_data->mapcount = -1;
19811
0
  arm_data->mapsize = 0;
19812
0
  arm_data->map = NULL;
19813
19814
0
  return false;
19815
0
}
19816
19817
/* Mangle thumb function symbols as we read them in.  */
19818
19819
static bool
19820
elf32_arm_swap_symbol_in (bfd * abfd,
19821
        const void *psrc,
19822
        const void *pshn,
19823
        Elf_Internal_Sym *dst)
19824
2.37k
{
19825
2.37k
  if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
19826
2
    return false;
19827
2.37k
  dst->st_target_internal = ST_BRANCH_TO_ARM;
19828
19829
  /* New EABI objects mark thumb function symbols by setting the low bit of
19830
     the address.  */
19831
2.37k
  if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
19832
2.37k
      || ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
19833
1.07k
    {
19834
1.07k
      if (dst->st_value & 1)
19835
3
  {
19836
3
    dst->st_value &= ~(bfd_vma) 1;
19837
3
    ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal,
19838
3
           ST_BRANCH_TO_THUMB);
19839
3
  }
19840
1.07k
      else
19841
1.07k
  ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_TO_ARM);
19842
1.07k
    }
19843
1.29k
  else if (ELF_ST_TYPE (dst->st_info) == STT_ARM_TFUNC)
19844
2
    {
19845
2
      dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_FUNC);
19846
2
      ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_TO_THUMB);
19847
2
    }
19848
1.29k
  else if (ELF_ST_TYPE (dst->st_info) == STT_SECTION)
19849
9
    ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_LONG);
19850
1.28k
  else
19851
1.28k
    ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_UNKNOWN);
19852
19853
2.37k
  return true;
19854
2.37k
}
19855
19856
19857
/* Mangle thumb function symbols as we write them out.  */
19858
19859
static void
19860
elf32_arm_swap_symbol_out (bfd *abfd,
19861
         const Elf_Internal_Sym *src,
19862
         void *cdst,
19863
         void *shndx)
19864
0
{
19865
0
  Elf_Internal_Sym newsym;
19866
19867
  /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
19868
     of the address set, as per the new EABI.  We do this unconditionally
19869
     because objcopy does not set the elf header flags until after
19870
     it writes out the symbol table.  */
19871
0
  if (ARM_GET_SYM_BRANCH_TYPE (src->st_target_internal) == ST_BRANCH_TO_THUMB)
19872
0
    {
19873
0
      newsym = *src;
19874
0
      if (ELF_ST_TYPE (src->st_info) != STT_GNU_IFUNC)
19875
0
  newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
19876
0
      if (newsym.st_shndx != SHN_UNDEF)
19877
0
  {
19878
    /* Do this only for defined symbols. At link type, the static
19879
       linker will simulate the work of dynamic linker of resolving
19880
       symbols and will carry over the thumbness of found symbols to
19881
       the output symbol table. It's not clear how it happens, but
19882
       the thumbness of undefined symbols can well be different at
19883
       runtime, and writing '1' for them will be confusing for users
19884
       and possibly for dynamic linker itself.
19885
    */
19886
0
    newsym.st_value |= 1;
19887
0
  }
19888
19889
0
      src = &newsym;
19890
0
    }
19891
0
  bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
19892
0
}
19893
19894
/* Add the PT_ARM_EXIDX program header.  */
19895
19896
static bool
19897
elf32_arm_modify_segment_map (bfd *abfd,
19898
            struct bfd_link_info *info ATTRIBUTE_UNUSED)
19899
2
{
19900
2
  struct elf_segment_map *m;
19901
2
  asection *sec;
19902
19903
2
  sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
19904
2
  if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
19905
1
    {
19906
      /* If there is already a PT_ARM_EXIDX header, then we do not
19907
   want to add another one.  This situation arises when running
19908
   "strip"; the input binary already has the header.  */
19909
1
      m = elf_seg_map (abfd);
19910
1
      while (m && m->p_type != PT_ARM_EXIDX)
19911
0
  m = m->next;
19912
1
      if (!m)
19913
0
  {
19914
0
    m = (struct elf_segment_map *)
19915
0
        bfd_zalloc (abfd, sizeof (struct elf_segment_map));
19916
0
    if (m == NULL)
19917
0
      return false;
19918
0
    m->p_type = PT_ARM_EXIDX;
19919
0
    m->count = 1;
19920
0
    m->sections[0] = sec;
19921
19922
0
    m->next = elf_seg_map (abfd);
19923
0
    elf_seg_map (abfd) = m;
19924
0
  }
19925
1
    }
19926
19927
2
  return true;
19928
2
}
19929
19930
/* We may add a PT_ARM_EXIDX program header.  */
19931
19932
static int
19933
elf32_arm_additional_program_headers (bfd *abfd,
19934
              struct bfd_link_info *info ATTRIBUTE_UNUSED)
19935
0
{
19936
0
  asection *sec;
19937
19938
0
  sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
19939
0
  if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
19940
0
    return 1;
19941
0
  else
19942
0
    return 0;
19943
0
}
19944
19945
/* Hook called by the linker routine which adds symbols from an object
19946
   file.  */
19947
19948
static bool
19949
elf32_arm_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
19950
         Elf_Internal_Sym *sym, const char **namep,
19951
         flagword *flagsp, asection **secp, bfd_vma *valp)
19952
0
{
19953
0
  if (elf32_arm_hash_table (info) == NULL)
19954
0
    return false;
19955
19956
0
  if (elf32_arm_hash_table (info)->root.target_os == is_vxworks
19957
0
      && !elf_vxworks_add_symbol_hook (abfd, info, sym, namep,
19958
0
               flagsp, secp, valp))
19959
0
    return false;
19960
19961
0
  return true;
19962
0
}
19963
19964
/* We use this to override swap_symbol_in and swap_symbol_out.  */
19965
const struct elf_size_info elf32_arm_size_info =
19966
{
19967
  sizeof (Elf32_External_Ehdr),
19968
  sizeof (Elf32_External_Phdr),
19969
  sizeof (Elf32_External_Shdr),
19970
  sizeof (Elf32_External_Rel),
19971
  sizeof (Elf32_External_Rela),
19972
  sizeof (Elf32_External_Sym),
19973
  sizeof (Elf32_External_Dyn),
19974
  sizeof (Elf_External_Note),
19975
  4,
19976
  1,
19977
  32, 2,
19978
  ELFCLASS32, EV_CURRENT,
19979
  bfd_elf32_write_out_phdrs,
19980
  bfd_elf32_write_shdrs_and_ehdr,
19981
  bfd_elf32_checksum_contents,
19982
  bfd_elf32_write_relocs,
19983
  elf32_arm_swap_symbol_in,
19984
  elf32_arm_swap_symbol_out,
19985
  bfd_elf32_slurp_reloc_table,
19986
  bfd_elf32_slurp_symbol_table,
19987
  bfd_elf32_swap_dyn_in,
19988
  bfd_elf32_swap_dyn_out,
19989
  bfd_elf32_swap_reloc_in,
19990
  bfd_elf32_swap_reloc_out,
19991
  bfd_elf32_swap_reloca_in,
19992
  bfd_elf32_swap_reloca_out
19993
};
19994
19995
static bfd_vma
19996
read_code32 (const bfd *abfd, const bfd_byte *addr)
19997
886
{
19998
  /* V7 BE8 code is always little endian.  */
19999
886
  if ((elf_elfheader (abfd)->e_flags & EF_ARM_BE8) != 0)
20000
0
    return bfd_getl32 (addr);
20001
20002
886
  return bfd_get_32 (abfd, addr);
20003
886
}
20004
20005
static bfd_vma
20006
read_code16 (const bfd *abfd, const bfd_byte *addr)
20007
440
{
20008
  /* V7 BE8 code is always little endian.  */
20009
440
  if ((elf_elfheader (abfd)->e_flags & EF_ARM_BE8) != 0)
20010
0
    return bfd_getl16 (addr);
20011
20012
440
  return bfd_get_16 (abfd, addr);
20013
440
}
20014
20015
/* Return size of plt0 entry starting at ADDR
20016
   or (bfd_vma) -1 if size can not be determined.  */
20017
20018
static bfd_vma
20019
elf32_arm_plt0_size (const bfd *abfd, const bfd_byte *addr,
20020
         bfd_size_type data_size)
20021
4
{
20022
4
  bfd_vma first_word;
20023
4
  bfd_vma plt0_size;
20024
20025
4
  if (data_size < 4)
20026
0
    return (bfd_vma) -1;
20027
20028
4
  first_word = read_code32 (abfd, addr);
20029
20030
4
  if (first_word == elf32_arm_plt0_entry[0])
20031
4
    plt0_size = 4 * ARRAY_SIZE (elf32_arm_plt0_entry);
20032
0
  else if (first_word == elf32_thumb2_plt0_entry[0])
20033
0
    plt0_size = 4 * ARRAY_SIZE (elf32_thumb2_plt0_entry);
20034
0
  else
20035
    /* We don't yet handle this PLT format.  */
20036
0
    return (bfd_vma) -1;
20037
20038
4
  return plt0_size;
20039
4
}
20040
20041
/* Return size of plt entry starting at offset OFFSET
20042
   of plt section located at address START
20043
   or (bfd_vma) -1 if size can not be determined.  */
20044
20045
static bfd_vma
20046
elf32_arm_plt_size (const bfd *abfd, const bfd_byte *start, bfd_vma offset,
20047
        bfd_size_type data_size)
20048
442
{
20049
442
  bfd_vma first_insn;
20050
442
  bfd_vma plt_size = 0;
20051
20052
  /* PLT entry size if fixed on Thumb-only platforms.  */
20053
442
  if (read_code32 (abfd, start) == elf32_thumb2_plt0_entry[0])
20054
0
    return 4 * ARRAY_SIZE (elf32_thumb2_plt_entry);
20055
20056
  /* Respect Thumb stub if necessary.  */
20057
442
  if (offset + 2 > data_size)
20058
2
    return (bfd_vma) -1;
20059
440
  if (read_code16 (abfd, start + offset) == elf32_arm_plt_thumb_stub[0])
20060
0
    {
20061
0
      plt_size += 2 * ARRAY_SIZE (elf32_arm_plt_thumb_stub);
20062
0
    }
20063
20064
  /* Strip immediate from first add.  */
20065
440
  if (offset + plt_size + 4 > data_size)
20066
0
    return (bfd_vma) -1;
20067
440
  first_insn = read_code32 (abfd, start + offset + plt_size) & 0xffffff00;
20068
20069
#ifdef FOUR_WORD_PLT
20070
  if (first_insn == elf32_arm_plt_entry[0])
20071
    plt_size += 4 * ARRAY_SIZE (elf32_arm_plt_entry);
20072
#else
20073
440
  if (first_insn == elf32_arm_plt_entry_long[0])
20074
0
    plt_size += 4 * ARRAY_SIZE (elf32_arm_plt_entry_long);
20075
440
  else if (first_insn == elf32_arm_plt_entry_short[0])
20076
440
    plt_size += 4 * ARRAY_SIZE (elf32_arm_plt_entry_short);
20077
0
#endif
20078
0
  else
20079
    /* We don't yet handle this PLT format.  */
20080
0
    return (bfd_vma) -1;
20081
20082
440
  return plt_size;
20083
440
}
20084
20085
/* Implementation is shamelessly borrowed from _bfd_elf_get_synthetic_symtab.  */
20086
20087
static long
20088
elf32_arm_get_synthetic_symtab (bfd *abfd,
20089
             long symcount ATTRIBUTE_UNUSED,
20090
             asymbol **syms ATTRIBUTE_UNUSED,
20091
             long dynsymcount,
20092
             asymbol **dynsyms,
20093
             asymbol **ret)
20094
337
{
20095
337
  asection *relplt;
20096
337
  asymbol *s;
20097
337
  arelent *p;
20098
337
  long count, i, n;
20099
337
  size_t size;
20100
337
  Elf_Internal_Shdr *hdr;
20101
337
  char *names;
20102
337
  asection *plt;
20103
337
  bfd_vma offset;
20104
337
  bfd_byte *data;
20105
20106
337
  *ret = NULL;
20107
20108
337
  if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
20109
333
    return 0;
20110
20111
4
  if (dynsymcount <= 0)
20112
0
    return 0;
20113
20114
4
  relplt = bfd_get_section_by_name (abfd, ".rel.plt");
20115
4
  if (relplt == NULL)
20116
0
    return 0;
20117
20118
4
  hdr = &elf_section_data (relplt)->this_hdr;
20119
4
  if (hdr->sh_link != elf_dynsymtab (abfd)
20120
4
      || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
20121
0
    return 0;
20122
20123
4
  plt = bfd_get_section_by_name (abfd, ".plt");
20124
4
  if (plt == NULL)
20125
0
    return 0;
20126
20127
4
  if (!elf32_arm_size_info.slurp_reloc_table (abfd, relplt, dynsyms, true))
20128
0
    return -1;
20129
20130
4
  data = NULL;
20131
4
  if (!bfd_get_full_section_contents (abfd, plt, &data))
20132
0
    return -1;
20133
20134
4
  count = NUM_SHDR_ENTRIES (hdr);
20135
4
  size = count * sizeof (asymbol);
20136
4
  p = relplt->relocation;
20137
448
  for (i = 0; i < count; i++, p += elf32_arm_size_info.int_rels_per_ext_rel)
20138
444
    {
20139
444
      size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
20140
444
      if (p->addend != 0)
20141
0
  size += sizeof ("+0x") - 1 + 8;
20142
444
    }
20143
20144
4
  offset = elf32_arm_plt0_size (abfd, data, plt->size);
20145
4
  if (offset == (bfd_vma) -1
20146
4
      || (s = *ret = (asymbol *) bfd_malloc (size)) == NULL)
20147
0
    {
20148
0
      free (data);
20149
0
      return -1;
20150
0
    }
20151
20152
4
  names = (char *) (s + count);
20153
4
  p = relplt->relocation;
20154
4
  n = 0;
20155
444
  for (i = 0; i < count; i++, p += elf32_arm_size_info.int_rels_per_ext_rel)
20156
442
    {
20157
442
      size_t len;
20158
20159
442
      bfd_vma plt_size = elf32_arm_plt_size (abfd, data, offset, plt->size);
20160
442
      if (plt_size == (bfd_vma) -1)
20161
2
  break;
20162
20163
440
      *s = **p->sym_ptr_ptr;
20164
      /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
20165
   we are defining a symbol, ensure one of them is set.  */
20166
440
      if ((s->flags & BSF_LOCAL) == 0)
20167
440
  s->flags |= BSF_GLOBAL;
20168
440
      s->flags |= BSF_SYNTHETIC;
20169
440
      s->section = plt;
20170
440
      s->value = offset;
20171
440
      s->name = names;
20172
440
      s->udata.p = NULL;
20173
440
      len = strlen ((*p->sym_ptr_ptr)->name);
20174
440
      memcpy (names, (*p->sym_ptr_ptr)->name, len);
20175
440
      names += len;
20176
440
      if (p->addend != 0)
20177
0
  {
20178
0
    char buf[30], *a;
20179
20180
0
    memcpy (names, "+0x", sizeof ("+0x") - 1);
20181
0
    names += sizeof ("+0x") - 1;
20182
0
    bfd_sprintf_vma (abfd, buf, p->addend);
20183
0
    for (a = buf; *a == '0'; ++a)
20184
0
      ;
20185
0
    len = strlen (a);
20186
0
    memcpy (names, a, len);
20187
0
    names += len;
20188
0
  }
20189
440
      memcpy (names, "@plt", sizeof ("@plt"));
20190
440
      names += sizeof ("@plt");
20191
440
      ++s, ++n;
20192
440
      offset += plt_size;
20193
440
    }
20194
20195
4
  free (data);
20196
4
  return n;
20197
4
}
20198
20199
static bool
20200
elf32_arm_section_flags (const Elf_Internal_Shdr *hdr)
20201
8.01k
{
20202
8.01k
  if (hdr->sh_flags & SHF_ARM_PURECODE)
20203
1.44k
    hdr->bfd_section->flags |= SEC_ELF_PURECODE;
20204
8.01k
  return true;
20205
8.01k
}
20206
20207
static flagword
20208
elf32_arm_lookup_section_flags (char *flag_name)
20209
0
{
20210
0
  if (!strcmp (flag_name, "SHF_ARM_PURECODE"))
20211
0
    return SHF_ARM_PURECODE;
20212
20213
0
  return SEC_NO_FLAGS;
20214
0
}
20215
20216
static unsigned int
20217
elf32_arm_count_additional_relocs (asection *sec)
20218
0
{
20219
0
  struct _arm_elf_section_data *arm_data;
20220
0
  arm_data = get_arm_elf_section_data (sec);
20221
20222
0
  return arm_data == NULL ? 0 : arm_data->additional_reloc_count;
20223
0
}
20224
20225
/* Called to set the sh_flags, sh_link and sh_info fields of OSECTION which
20226
   has a type >= SHT_LOOS.  Returns TRUE if these fields were initialised
20227
   FALSE otherwise.  ISECTION is the best guess matching section from the
20228
   input bfd IBFD, but it might be NULL.  */
20229
20230
static bool
20231
elf32_arm_copy_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
20232
               bfd *obfd ATTRIBUTE_UNUSED,
20233
               const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
20234
               Elf_Internal_Shdr *osection)
20235
6
{
20236
6
  switch (osection->sh_type)
20237
6
    {
20238
1
    case SHT_ARM_EXIDX:
20239
1
      {
20240
1
  Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
20241
1
  Elf_Internal_Shdr **iheaders = elf_elfsections (ibfd);
20242
1
  unsigned i = 0;
20243
20244
1
  osection->sh_flags = SHF_ALLOC | SHF_LINK_ORDER;
20245
1
  osection->sh_info = 0;
20246
20247
  /* The sh_link field must be set to the text section associated with
20248
     this index section.  Unfortunately the ARM EHABI does not specify
20249
     exactly how to determine this association.  Our caller does try
20250
     to match up OSECTION with its corresponding input section however
20251
     so that is a good first guess.  */
20252
1
  if (isection != NULL
20253
1
      && osection->bfd_section != NULL
20254
1
      && isection->bfd_section != NULL
20255
1
      && isection->bfd_section->output_section != NULL
20256
1
      && isection->bfd_section->output_section == osection->bfd_section
20257
1
      && iheaders != NULL
20258
1
      && isection->sh_link > 0
20259
1
      && isection->sh_link < elf_numsections (ibfd)
20260
1
      && iheaders[isection->sh_link]->bfd_section != NULL
20261
1
      && iheaders[isection->sh_link]->bfd_section->output_section != NULL
20262
1
      )
20263
1
    {
20264
15
      for (i = elf_numsections (obfd); i-- > 0;)
20265
15
        if (oheaders[i]->bfd_section
20266
15
      == iheaders[isection->sh_link]->bfd_section->output_section)
20267
1
    break;
20268
1
    }
20269
20270
1
  if (i == 0)
20271
0
    {
20272
      /* Failing that we have to find a matching section ourselves.  If
20273
         we had the output section name available we could compare that
20274
         with input section names.  Unfortunately we don't.  So instead
20275
         we use a simple heuristic and look for the nearest executable
20276
         section before this one.  */
20277
0
      for (i = elf_numsections (obfd); i-- > 0;)
20278
0
        if (oheaders[i] == osection)
20279
0
    break;
20280
0
      if (i == 0)
20281
0
        break;
20282
20283
0
      while (i-- > 0)
20284
0
        if (oheaders[i]->sh_type == SHT_PROGBITS
20285
0
      && (oheaders[i]->sh_flags & (SHF_ALLOC | SHF_EXECINSTR))
20286
0
      == (SHF_ALLOC | SHF_EXECINSTR))
20287
0
    break;
20288
0
    }
20289
20290
1
  if (i)
20291
1
    {
20292
1
      osection->sh_link = i;
20293
      /* If the text section was part of a group
20294
         then the index section should be too.  */
20295
1
      if (oheaders[i]->sh_flags & SHF_GROUP)
20296
0
        osection->sh_flags |= SHF_GROUP;
20297
1
      return true;
20298
1
    }
20299
1
      }
20300
0
      break;
20301
20302
0
    case SHT_ARM_PREEMPTMAP:
20303
0
      osection->sh_flags = SHF_ALLOC;
20304
0
      break;
20305
20306
2
    case SHT_ARM_ATTRIBUTES:
20307
2
    case SHT_ARM_DEBUGOVERLAY:
20308
2
    case SHT_ARM_OVERLAYSECTION:
20309
5
    default:
20310
5
      break;
20311
6
    }
20312
20313
5
  return false;
20314
6
}
20315
20316
/* Returns TRUE if NAME is an ARM mapping symbol.
20317
   Traditionally the symbols $a, $d and $t have been used.
20318
   The ARM ELF standard also defines $x (for A64 code).  It also allows a
20319
   period initiated suffix to be added to the symbol: "$[adtx]\.[:sym_char]+".
20320
   Other tools might also produce $b (Thumb BL), $f, $p, $m and $v, but we do
20321
   not support them here.  $t.x indicates the start of ThumbEE instructions.  */
20322
20323
static bool
20324
is_arm_mapping_symbol (const char * name)
20325
399
{
20326
399
  return name != NULL /* Paranoia.  */
20327
399
    && name[0] == '$' /* Note: if objcopy --prefix-symbols has been used then
20328
       the mapping symbols could have acquired a prefix.
20329
       We do not support this here, since such symbols no
20330
       longer conform to the ARM ELF ABI.  */
20331
399
    && (name[1] == 'a' || name[1] == 'd' || name[1] == 't' || name[1] == 'x')
20332
399
    && (name[2] == 0 || name[2] == '.');
20333
  /* FIXME: Strictly speaking the symbol is only a valid mapping symbol if
20334
     any characters that follow the period are legal characters for the body
20335
     of a symbol's name.  For now we just assume that this is the case.  */
20336
399
}
20337
20338
/* Make sure that mapping symbols in object files are not removed via the
20339
   "strip --strip-unneeded" tool.  These symbols are needed in order to
20340
   correctly generate interworking veneers, and for byte swapping code
20341
   regions.  Once an object file has been linked, it is safe to remove the
20342
   symbols as they will no longer be needed.  */
20343
20344
static void
20345
elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym)
20346
1.06k
{
20347
1.06k
  if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
20348
1.06k
      && sym->section != bfd_abs_section_ptr
20349
1.06k
      && is_arm_mapping_symbol (sym->name))
20350
0
    sym->flags |= BSF_KEEP;
20351
1.06k
}
20352
20353
#undef  elf_backend_copy_special_section_fields
20354
#define elf_backend_copy_special_section_fields elf32_arm_copy_special_section_fields
20355
20356
#define ELF_ARCH      bfd_arch_arm
20357
#define ELF_TARGET_ID     ARM_ELF_DATA
20358
#define ELF_MACHINE_CODE    EM_ARM
20359
#define ELF_MAXPAGESIZE     0x1000
20360
#define ELF_COMMONPAGESIZE    0x1000
20361
20362
#define bfd_elf32_mkobject      elf32_arm_mkobject
20363
20364
#define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
20365
#define bfd_elf32_bfd_merge_private_bfd_data  elf32_arm_merge_private_bfd_data
20366
#define bfd_elf32_bfd_set_private_flags   elf32_arm_set_private_flags
20367
#define bfd_elf32_bfd_print_private_bfd_data  elf32_arm_print_private_bfd_data
20368
#define bfd_elf32_bfd_link_hash_table_create  elf32_arm_link_hash_table_create
20369
#define bfd_elf32_bfd_reloc_type_lookup   elf32_arm_reloc_type_lookup
20370
#define bfd_elf32_bfd_reloc_name_lookup   elf32_arm_reloc_name_lookup
20371
#define bfd_elf32_find_inliner_info   elf32_arm_find_inliner_info
20372
#define bfd_elf32_new_section_hook    elf32_arm_new_section_hook
20373
#define bfd_elf32_bfd_is_target_special_symbol  elf32_arm_is_target_special_symbol
20374
#define bfd_elf32_bfd_final_link    elf32_arm_final_link
20375
#define bfd_elf32_get_synthetic_symtab  elf32_arm_get_synthetic_symtab
20376
20377
#define elf_backend_get_symbol_type   elf32_arm_get_symbol_type
20378
#define elf_backend_maybe_function_sym    elf32_arm_maybe_function_sym
20379
#define elf_backend_gc_mark_hook    elf32_arm_gc_mark_hook
20380
#define elf_backend_gc_mark_extra_sections  elf32_arm_gc_mark_extra_sections
20381
#define elf_backend_check_relocs    elf32_arm_check_relocs
20382
#define elf_backend_update_relocs   elf32_arm_update_relocs
20383
#define elf_backend_relocate_section    elf32_arm_relocate_section
20384
#define elf_backend_write_section   elf32_arm_write_section
20385
#define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
20386
#define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
20387
#define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
20388
#define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
20389
#define elf_backend_late_size_sections    elf32_arm_late_size_sections
20390
#define elf_backend_early_size_sections   elf32_arm_early_size_sections
20391
#define elf_backend_init_index_section    _bfd_elf_init_2_index_sections
20392
#define elf_backend_init_file_header    elf32_arm_init_file_header
20393
#define elf_backend_reloc_type_class    elf32_arm_reloc_type_class
20394
#define elf_backend_object_p      elf32_arm_object_p
20395
#define elf_backend_fake_sections   elf32_arm_fake_sections
20396
#define elf_backend_section_from_shdr   elf32_arm_section_from_shdr
20397
#define elf_backend_final_write_processing  elf32_arm_final_write_processing
20398
#define elf_backend_copy_indirect_symbol  elf32_arm_copy_indirect_symbol
20399
#define elf_backend_size_info     elf32_arm_size_info
20400
#define elf_backend_modify_segment_map    elf32_arm_modify_segment_map
20401
#define elf_backend_additional_program_headers  elf32_arm_additional_program_headers
20402
#define elf_backend_output_arch_local_syms  elf32_arm_output_arch_local_syms
20403
#define elf_backend_filter_implib_symbols elf32_arm_filter_implib_symbols
20404
#define elf_backend_begin_write_processing  elf32_arm_begin_write_processing
20405
#define elf_backend_add_symbol_hook   elf32_arm_add_symbol_hook
20406
#define elf_backend_count_additional_relocs elf32_arm_count_additional_relocs
20407
#define elf_backend_symbol_processing   elf32_arm_backend_symbol_processing
20408
20409
#define elf_backend_can_refcount       1
20410
#define elf_backend_can_gc_sections    1
20411
#define elf_backend_plt_readonly       1
20412
#define elf_backend_want_got_plt       1
20413
#define elf_backend_want_plt_sym       0
20414
#define elf_backend_want_dynrelro      1
20415
#define elf_backend_may_use_rel_p      1
20416
#define elf_backend_may_use_rela_p     0
20417
#define elf_backend_default_use_rela_p 0
20418
#define elf_backend_dtrel_excludes_plt 1
20419
20420
#define elf_backend_got_header_size 12
20421
#define elf_backend_extern_protected_data 0
20422
20423
#undef  elf_backend_obj_attrs_vendor
20424
#define elf_backend_obj_attrs_vendor    "aeabi"
20425
#undef  elf_backend_obj_attrs_section
20426
#define elf_backend_obj_attrs_section   ".ARM.attributes"
20427
#undef  elf_backend_obj_attrs_arg_type
20428
#define elf_backend_obj_attrs_arg_type    elf32_arm_obj_attrs_arg_type
20429
#undef  elf_backend_obj_attrs_section_type
20430
#define elf_backend_obj_attrs_section_type  SHT_ARM_ATTRIBUTES
20431
#define elf_backend_obj_attrs_order   elf32_arm_obj_attrs_order
20432
#define elf_backend_obj_attrs_handle_unknown  elf32_arm_obj_attrs_handle_unknown
20433
20434
#undef  elf_backend_section_flags
20435
#define elf_backend_section_flags   elf32_arm_section_flags
20436
#undef  elf_backend_lookup_section_flags_hook
20437
#define elf_backend_lookup_section_flags_hook elf32_arm_lookup_section_flags
20438
20439
#define elf_backend_linux_prpsinfo32_ugid16 true
20440
20441
#include "elf32-target.h"
20442
20443
/* Native Client targets.  */
20444
20445
#undef  TARGET_LITTLE_SYM
20446
#define TARGET_LITTLE_SYM   arm_elf32_nacl_le_vec
20447
#undef  TARGET_LITTLE_NAME
20448
#define TARGET_LITTLE_NAME    "elf32-littlearm-nacl"
20449
#undef  TARGET_BIG_SYM
20450
#define TARGET_BIG_SYM      arm_elf32_nacl_be_vec
20451
#undef  TARGET_BIG_NAME
20452
#define TARGET_BIG_NAME     "elf32-bigarm-nacl"
20453
20454
/* Like elf32_arm_link_hash_table_create -- but overrides
20455
   appropriately for NaCl.  */
20456
20457
static struct bfd_link_hash_table *
20458
elf32_arm_nacl_link_hash_table_create (bfd *abfd)
20459
0
{
20460
0
  struct bfd_link_hash_table *ret;
20461
20462
0
  ret = elf32_arm_link_hash_table_create (abfd);
20463
0
  if (ret)
20464
0
    {
20465
0
      struct elf32_arm_link_hash_table *htab
20466
0
  = (struct elf32_arm_link_hash_table *) ret;
20467
20468
0
      htab->plt_header_size = 4 * ARRAY_SIZE (elf32_arm_nacl_plt0_entry);
20469
0
      htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_nacl_plt_entry);
20470
0
    }
20471
0
  return ret;
20472
0
}
20473
20474
/* Since NaCl doesn't use the ARM-specific unwind format, we don't
20475
   really need to use elf32_arm_modify_segment_map.  But we do it
20476
   anyway just to reduce gratuitous differences with the stock ARM backend.  */
20477
20478
static bool
20479
elf32_arm_nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
20480
0
{
20481
0
  return (elf32_arm_modify_segment_map (abfd, info)
20482
0
    && nacl_modify_segment_map (abfd, info));
20483
0
}
20484
20485
static bool
20486
elf32_arm_nacl_final_write_processing (bfd *abfd)
20487
0
{
20488
0
  arm_final_write_processing (abfd);
20489
0
  return nacl_final_write_processing (abfd);
20490
0
}
20491
20492
static bfd_vma
20493
elf32_arm_nacl_plt_sym_val (bfd_vma i, const asection *plt,
20494
          const arelent *rel ATTRIBUTE_UNUSED)
20495
0
{
20496
0
  return plt->vma
20497
0
    + 4 * (ARRAY_SIZE (elf32_arm_nacl_plt0_entry) +
20498
0
     i * ARRAY_SIZE (elf32_arm_nacl_plt_entry));
20499
0
}
20500
20501
#undef  elf32_bed
20502
#define elf32_bed       elf32_arm_nacl_bed
20503
#undef  bfd_elf32_bfd_link_hash_table_create
20504
#define bfd_elf32_bfd_link_hash_table_create  \
20505
  elf32_arm_nacl_link_hash_table_create
20506
#undef  elf_backend_plt_alignment
20507
#define elf_backend_plt_alignment   4
20508
#undef  elf_backend_modify_segment_map
20509
#define elf_backend_modify_segment_map    elf32_arm_nacl_modify_segment_map
20510
#undef  elf_backend_modify_headers
20511
#define elf_backend_modify_headers    nacl_modify_headers
20512
#undef  elf_backend_final_write_processing
20513
#define elf_backend_final_write_processing  elf32_arm_nacl_final_write_processing
20514
#undef bfd_elf32_get_synthetic_symtab
20515
#undef  elf_backend_plt_sym_val
20516
#define elf_backend_plt_sym_val     elf32_arm_nacl_plt_sym_val
20517
#undef  elf_backend_copy_special_section_fields
20518
20519
#undef  ELF_MINPAGESIZE
20520
#undef  ELF_COMMONPAGESIZE
20521
20522
#undef ELF_TARGET_OS
20523
#define ELF_TARGET_OS       is_nacl
20524
20525
#include "elf32-target.h"
20526
20527
/* Reset to defaults.  */
20528
#undef  elf_backend_plt_alignment
20529
#undef  elf_backend_modify_segment_map
20530
#define elf_backend_modify_segment_map    elf32_arm_modify_segment_map
20531
#undef  elf_backend_modify_headers
20532
#undef  elf_backend_final_write_processing
20533
#define elf_backend_final_write_processing  elf32_arm_final_write_processing
20534
#undef  ELF_MINPAGESIZE
20535
#undef  ELF_COMMONPAGESIZE
20536
#define ELF_COMMONPAGESIZE    0x1000
20537
20538
20539
/* FDPIC Targets.  */
20540
20541
#undef  TARGET_LITTLE_SYM
20542
#define TARGET_LITTLE_SYM   arm_elf32_fdpic_le_vec
20543
#undef  TARGET_LITTLE_NAME
20544
#define TARGET_LITTLE_NAME    "elf32-littlearm-fdpic"
20545
#undef  TARGET_BIG_SYM
20546
#define TARGET_BIG_SYM      arm_elf32_fdpic_be_vec
20547
#undef  TARGET_BIG_NAME
20548
#define TARGET_BIG_NAME     "elf32-bigarm-fdpic"
20549
#undef elf_match_priority
20550
#define elf_match_priority    128
20551
#undef ELF_OSABI
20552
#define ELF_OSABI   ELFOSABI_ARM_FDPIC
20553
20554
/* Like elf32_arm_link_hash_table_create -- but overrides
20555
   appropriately for FDPIC.  */
20556
20557
static struct bfd_link_hash_table *
20558
elf32_arm_fdpic_link_hash_table_create (bfd *abfd)
20559
0
{
20560
0
  struct bfd_link_hash_table *ret;
20561
20562
0
  ret = elf32_arm_link_hash_table_create (abfd);
20563
0
  if (ret)
20564
0
    {
20565
0
      struct elf32_arm_link_hash_table *htab = (struct elf32_arm_link_hash_table *) ret;
20566
20567
0
      htab->fdpic_p = 1;
20568
0
    }
20569
0
  return ret;
20570
0
}
20571
20572
/* We need dynamic symbols for every section, since segments can
20573
   relocate independently.  */
20574
static bool
20575
elf32_arm_fdpic_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
20576
            struct bfd_link_info *info
20577
            ATTRIBUTE_UNUSED,
20578
            asection *p ATTRIBUTE_UNUSED)
20579
0
{
20580
0
  switch (elf_section_data (p)->this_hdr.sh_type)
20581
0
    {
20582
0
    case SHT_PROGBITS:
20583
0
    case SHT_NOBITS:
20584
      /* If sh_type is yet undecided, assume it could be
20585
   SHT_PROGBITS/SHT_NOBITS.  */
20586
0
    case SHT_NULL:
20587
0
      return false;
20588
20589
      /* There shouldn't be section relative relocations
20590
   against any other section.  */
20591
0
    default:
20592
0
      return true;
20593
0
    }
20594
0
}
20595
20596
#undef  elf32_bed
20597
#define elf32_bed       elf32_arm_fdpic_bed
20598
20599
#undef  bfd_elf32_bfd_link_hash_table_create
20600
#define bfd_elf32_bfd_link_hash_table_create  elf32_arm_fdpic_link_hash_table_create
20601
20602
#undef elf_backend_omit_section_dynsym
20603
#define elf_backend_omit_section_dynsym   elf32_arm_fdpic_omit_section_dynsym
20604
20605
#undef ELF_TARGET_OS
20606
20607
#include "elf32-target.h"
20608
20609
#undef elf_match_priority
20610
#undef ELF_OSABI
20611
#undef elf_backend_omit_section_dynsym
20612
20613
/* VxWorks Targets.  */
20614
20615
#undef  TARGET_LITTLE_SYM
20616
#define TARGET_LITTLE_SYM   arm_elf32_vxworks_le_vec
20617
#undef  TARGET_LITTLE_NAME
20618
#define TARGET_LITTLE_NAME    "elf32-littlearm-vxworks"
20619
#undef  TARGET_BIG_SYM
20620
#define TARGET_BIG_SYM      arm_elf32_vxworks_be_vec
20621
#undef  TARGET_BIG_NAME
20622
#define TARGET_BIG_NAME     "elf32-bigarm-vxworks"
20623
20624
/* Like elf32_arm_link_hash_table_create -- but overrides
20625
   appropriately for VxWorks.  */
20626
20627
static struct bfd_link_hash_table *
20628
elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
20629
0
{
20630
0
  struct bfd_link_hash_table *ret;
20631
20632
0
  ret = elf32_arm_link_hash_table_create (abfd);
20633
0
  if (ret)
20634
0
    {
20635
0
      struct elf32_arm_link_hash_table *htab
20636
0
  = (struct elf32_arm_link_hash_table *) ret;
20637
0
      htab->use_rel = 0;
20638
0
    }
20639
0
  return ret;
20640
0
}
20641
20642
static bool
20643
elf32_arm_vxworks_final_write_processing (bfd *abfd)
20644
0
{
20645
0
  arm_final_write_processing (abfd);
20646
0
  return elf_vxworks_final_write_processing (abfd);
20647
0
}
20648
20649
#undef  elf32_bed
20650
#define elf32_bed elf32_arm_vxworks_bed
20651
20652
#undef  bfd_elf32_bfd_link_hash_table_create
20653
#define bfd_elf32_bfd_link_hash_table_create  elf32_arm_vxworks_link_hash_table_create
20654
#undef  elf_backend_final_write_processing
20655
#define elf_backend_final_write_processing  elf32_arm_vxworks_final_write_processing
20656
#undef  elf_backend_emit_relocs
20657
#define elf_backend_emit_relocs     elf_vxworks_emit_relocs
20658
20659
#undef  elf_backend_may_use_rel_p
20660
#define elf_backend_may_use_rel_p 0
20661
#undef  elf_backend_may_use_rela_p
20662
#define elf_backend_may_use_rela_p  1
20663
#undef  elf_backend_default_use_rela_p
20664
#define elf_backend_default_use_rela_p  1
20665
#undef  elf_backend_want_plt_sym
20666
#define elf_backend_want_plt_sym  1
20667
#undef  ELF_MAXPAGESIZE
20668
#define ELF_MAXPAGESIZE     0x1000
20669
#undef ELF_TARGET_OS
20670
#define ELF_TARGET_OS     is_vxworks
20671
20672
#include "elf32-target.h"
20673
20674
20675
/* Merge backend specific data from an object file to the output
20676
   object file when linking.  */
20677
20678
static bool
20679
elf32_arm_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
20680
0
{
20681
0
  bfd *obfd = info->output_bfd;
20682
0
  flagword out_flags;
20683
0
  flagword in_flags;
20684
0
  bool flags_compatible = true;
20685
0
  asection *sec;
20686
20687
  /* Check if we have the same endianness.  */
20688
0
  if (! _bfd_generic_verify_endian_match (ibfd, info))
20689
0
    return false;
20690
20691
0
  if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
20692
0
    return true;
20693
20694
0
  if (!elf32_arm_merge_eabi_attributes (ibfd, info))
20695
0
    return false;
20696
20697
  /* The input BFD must have had its flags initialised.  */
20698
  /* The following seems bogus to me -- The flags are initialized in
20699
     the assembler but I don't think an elf_flags_init field is
20700
     written into the object.  */
20701
  /* BFD_ASSERT (elf_flags_init (ibfd)); */
20702
20703
0
  in_flags  = elf_elfheader (ibfd)->e_flags;
20704
0
  out_flags = elf_elfheader (obfd)->e_flags;
20705
20706
  /* In theory there is no reason why we couldn't handle this.  However
20707
     in practice it isn't even close to working and there is no real
20708
     reason to want it.  */
20709
0
  if (EF_ARM_EABI_VERSION (in_flags) >= EF_ARM_EABI_VER4
20710
0
      && !(ibfd->flags & DYNAMIC)
20711
0
      && (in_flags & EF_ARM_BE8))
20712
0
    {
20713
0
      _bfd_error_handler (_("error: %pB is already in final BE8 format"),
20714
0
        ibfd);
20715
0
      return false;
20716
0
    }
20717
20718
0
  if (!elf_flags_init (obfd))
20719
0
    {
20720
      /* If the input has no flags set, then do not set the output flags.
20721
   This will allow future bfds to determine the desired output flags.
20722
   If no input bfds have any flags set, then neither will the output bfd.
20723
20724
   Note - we used to restrict this test to when the input architecture
20725
   variant was the default variant, but this does not allow for
20726
   linker scripts which override the default.  See PR 28910 for an
20727
   example.  */
20728
0
      if (in_flags == 0)
20729
0
  return true;
20730
      
20731
0
      elf_flags_init (obfd) = true;
20732
0
      elf_elfheader (obfd)->e_flags = in_flags;
20733
20734
0
      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
20735
0
    && bfd_get_arch_info (obfd)->the_default)
20736
0
  return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
20737
20738
0
      return true;
20739
0
    }
20740
20741
  /* Determine what should happen if the input ARM architecture
20742
     does not match the output ARM architecture.  */
20743
0
  if (! bfd_arm_merge_machines (ibfd, obfd))
20744
0
    return false;
20745
20746
  /* Identical flags must be compatible.  */
20747
0
  if (in_flags == out_flags)
20748
0
    return true;
20749
20750
  /* Check to see if the input BFD actually contains any sections.  If
20751
     not, its flags may not have been initialised either, but it
20752
     cannot actually cause any incompatiblity.  Do not short-circuit
20753
     dynamic objects; their section list may be emptied by
20754
    elf_link_add_object_symbols.
20755
20756
    Also check to see if there are no code sections in the input.
20757
    In this case there is no need to check for code specific flags.
20758
    XXX - do we need to worry about floating-point format compatability
20759
    in data sections ?  */
20760
0
  if (!(ibfd->flags & DYNAMIC))
20761
0
    {
20762
0
      bool null_input_bfd = true;
20763
0
      bool only_data_sections = true;
20764
20765
0
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
20766
0
  {
20767
    /* Ignore synthetic glue sections.  */
20768
0
    if (strcmp (sec->name, ".glue_7")
20769
0
        && strcmp (sec->name, ".glue_7t"))
20770
0
      {
20771
0
        if ((bfd_section_flags (sec)
20772
0
       & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
20773
0
      == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
20774
0
    only_data_sections = false;
20775
20776
0
        null_input_bfd = false;
20777
0
        break;
20778
0
      }
20779
0
  }
20780
20781
0
      if (null_input_bfd || only_data_sections)
20782
0
  return true;
20783
0
    }
20784
20785
  /* Complain about various flag mismatches.  */
20786
0
  if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
20787
0
              EF_ARM_EABI_VERSION (out_flags)))
20788
0
    {
20789
0
      _bfd_error_handler
20790
0
  (_("error: source object %pB has EABI version %d, but target %pB has EABI version %d"),
20791
0
   ibfd, (in_flags & EF_ARM_EABIMASK) >> 24,
20792
0
   obfd, (out_flags & EF_ARM_EABIMASK) >> 24);
20793
0
      return false;
20794
0
    }
20795
20796
  /* Not sure what needs to be checked for EABI versions >= 1.  */
20797
  /* VxWorks libraries do not use these flags.  */
20798
0
  if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
20799
0
      && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
20800
0
      && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
20801
0
    {
20802
0
      if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
20803
0
  {
20804
0
    _bfd_error_handler
20805
0
      (_("error: %pB is compiled for APCS-%d, whereas target %pB uses APCS-%d"),
20806
0
       ibfd, in_flags & EF_ARM_APCS_26 ? 26 : 32,
20807
0
       obfd, out_flags & EF_ARM_APCS_26 ? 26 : 32);
20808
0
    flags_compatible = false;
20809
0
  }
20810
20811
0
      if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
20812
0
  {
20813
0
    if (in_flags & EF_ARM_APCS_FLOAT)
20814
0
      _bfd_error_handler
20815
0
        (_("error: %pB passes floats in float registers, whereas %pB passes them in integer registers"),
20816
0
         ibfd, obfd);
20817
0
    else
20818
0
      _bfd_error_handler
20819
0
        (_("error: %pB passes floats in integer registers, whereas %pB passes them in float registers"),
20820
0
         ibfd, obfd);
20821
20822
0
    flags_compatible = false;
20823
0
  }
20824
20825
0
      if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
20826
0
  {
20827
0
    if (in_flags & EF_ARM_VFP_FLOAT)
20828
0
      _bfd_error_handler
20829
0
        (_("error: %pB uses %s instructions, whereas %pB does not"),
20830
0
         ibfd, "VFP", obfd);
20831
0
    else
20832
0
      _bfd_error_handler
20833
0
        (_("error: %pB uses %s instructions, whereas %pB does not"),
20834
0
         ibfd, "FPA", obfd);
20835
20836
0
    flags_compatible = false;
20837
0
  }
20838
20839
0
#ifdef EF_ARM_SOFT_FLOAT
20840
0
      if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
20841
0
  {
20842
    /* We can allow interworking between code that is VFP format
20843
       layout, and uses either soft float or integer regs for
20844
       passing floating point arguments and results.  We already
20845
       know that the APCS_FLOAT flags match; similarly for VFP
20846
       flags.  */
20847
0
    if ((in_flags & EF_ARM_APCS_FLOAT) != 0
20848
0
        || (in_flags & EF_ARM_VFP_FLOAT) == 0)
20849
0
      {
20850
0
        if (in_flags & EF_ARM_SOFT_FLOAT)
20851
0
    _bfd_error_handler
20852
0
      (_("error: %pB uses software FP, whereas %pB uses hardware FP"),
20853
0
       ibfd, obfd);
20854
0
        else
20855
0
    _bfd_error_handler
20856
0
      (_("error: %pB uses hardware FP, whereas %pB uses software FP"),
20857
0
       ibfd, obfd);
20858
20859
0
        flags_compatible = false;
20860
0
      }
20861
0
  }
20862
0
#endif
20863
20864
      /* Interworking mismatch is only a warning.  */
20865
0
      if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
20866
0
  {
20867
0
    if (in_flags & EF_ARM_INTERWORK)
20868
0
      {
20869
0
        _bfd_error_handler
20870
0
    (_("warning: %pB supports interworking, whereas %pB does not"),
20871
0
     ibfd, obfd);
20872
0
      }
20873
0
    else
20874
0
      {
20875
0
        _bfd_error_handler
20876
0
    (_("warning: %pB does not support interworking, whereas %pB does"),
20877
0
     ibfd, obfd);
20878
0
      }
20879
0
  }
20880
0
    }
20881
20882
0
  return flags_compatible;
20883
0
}