OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-arm.c] - Blame information for rev 163

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 khays
/* 32-bit ELF support for ARM
2
   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3
   2008, 2009, 2010, 2011  Free Software Foundation, Inc.
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
#include "sysdep.h"
23
#include <limits.h>
24
 
25
#include "bfd.h"
26
#include "libiberty.h"
27
#include "libbfd.h"
28
#include "elf-bfd.h"
29
#include "elf-vxworks.h"
30
#include "elf/arm.h"
31
 
32
/* Return the relocation section associated with NAME.  HTAB is the
33
   bfd's elf32_arm_link_hash_entry.  */
34
#define RELOC_SECTION(HTAB, NAME) \
35
  ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
36
 
37
/* Return size of a relocation entry.  HTAB is the bfd's
38
   elf32_arm_link_hash_entry.  */
39
#define RELOC_SIZE(HTAB) \
40
  ((HTAB)->use_rel \
41
   ? sizeof (Elf32_External_Rel) \
42
   : sizeof (Elf32_External_Rela))
43
 
44
/* Return function to swap relocations in.  HTAB is the bfd's
45
   elf32_arm_link_hash_entry.  */
46
#define SWAP_RELOC_IN(HTAB) \
47
  ((HTAB)->use_rel \
48
   ? bfd_elf32_swap_reloc_in \
49
   : bfd_elf32_swap_reloca_in)
50
 
51
/* Return function to swap relocations out.  HTAB is the bfd's
52
   elf32_arm_link_hash_entry.  */
53
#define SWAP_RELOC_OUT(HTAB) \
54
  ((HTAB)->use_rel \
55
   ? bfd_elf32_swap_reloc_out \
56
   : bfd_elf32_swap_reloca_out)
57
 
58
#define elf_info_to_howto               0
59
#define elf_info_to_howto_rel           elf32_arm_info_to_howto
60
 
61
#define ARM_ELF_ABI_VERSION             0
62
#define ARM_ELF_OS_ABI_VERSION          ELFOSABI_ARM
63
 
64
static bfd_boolean elf32_arm_write_section (bfd *output_bfd,
65
                                            struct bfd_link_info *link_info,
66
                                            asection *sec,
67
                                            bfd_byte *contents);
68
 
69
/* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
70
   R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
71
   in that slot.  */
72
 
73
static reloc_howto_type elf32_arm_howto_table_1[] =
74
{
75
  /* No relocation.  */
76
  HOWTO (R_ARM_NONE,            /* type */
77
         0,                      /* rightshift */
78
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
79
         0,                      /* bitsize */
80
         FALSE,                 /* pc_relative */
81
         0,                      /* bitpos */
82
         complain_overflow_dont,/* complain_on_overflow */
83
         bfd_elf_generic_reloc, /* special_function */
84
         "R_ARM_NONE",          /* name */
85
         FALSE,                 /* partial_inplace */
86
         0,                      /* src_mask */
87
         0,                      /* dst_mask */
88
         FALSE),                /* pcrel_offset */
89
 
90
  HOWTO (R_ARM_PC24,            /* type */
91
         2,                     /* rightshift */
92
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
93
         24,                    /* bitsize */
94
         TRUE,                  /* pc_relative */
95
         0,                      /* bitpos */
96
         complain_overflow_signed,/* complain_on_overflow */
97
         bfd_elf_generic_reloc, /* special_function */
98
         "R_ARM_PC24",          /* name */
99
         FALSE,                 /* partial_inplace */
100
         0x00ffffff,            /* src_mask */
101
         0x00ffffff,            /* dst_mask */
102
         TRUE),                 /* pcrel_offset */
103
 
104
  /* 32 bit absolute */
105
  HOWTO (R_ARM_ABS32,           /* type */
106
         0,                      /* rightshift */
107
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
108
         32,                    /* bitsize */
109
         FALSE,                 /* pc_relative */
110
         0,                      /* bitpos */
111
         complain_overflow_bitfield,/* complain_on_overflow */
112
         bfd_elf_generic_reloc, /* special_function */
113
         "R_ARM_ABS32",         /* name */
114
         FALSE,                 /* partial_inplace */
115
         0xffffffff,            /* src_mask */
116
         0xffffffff,            /* dst_mask */
117
         FALSE),                /* pcrel_offset */
118
 
119
  /* standard 32bit pc-relative reloc */
120
  HOWTO (R_ARM_REL32,           /* type */
121
         0,                      /* rightshift */
122
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
123
         32,                    /* bitsize */
124
         TRUE,                  /* pc_relative */
125
         0,                      /* bitpos */
126
         complain_overflow_bitfield,/* complain_on_overflow */
127
         bfd_elf_generic_reloc, /* special_function */
128
         "R_ARM_REL32",         /* name */
129
         FALSE,                 /* partial_inplace */
130
         0xffffffff,            /* src_mask */
131
         0xffffffff,            /* dst_mask */
132
         TRUE),                 /* pcrel_offset */
133
 
134
  /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
135
  HOWTO (R_ARM_LDR_PC_G0,       /* type */
136
         0,                      /* rightshift */
137
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
138
         32,                    /* bitsize */
139
         TRUE,                  /* pc_relative */
140
         0,                      /* bitpos */
141
         complain_overflow_dont,/* complain_on_overflow */
142
         bfd_elf_generic_reloc, /* special_function */
143
         "R_ARM_LDR_PC_G0",     /* name */
144
         FALSE,                 /* partial_inplace */
145
         0xffffffff,            /* src_mask */
146
         0xffffffff,            /* dst_mask */
147
         TRUE),                 /* pcrel_offset */
148
 
149
   /* 16 bit absolute */
150
  HOWTO (R_ARM_ABS16,           /* type */
151
         0,                      /* rightshift */
152
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
153
         16,                    /* bitsize */
154
         FALSE,                 /* pc_relative */
155
         0,                      /* bitpos */
156
         complain_overflow_bitfield,/* complain_on_overflow */
157
         bfd_elf_generic_reloc, /* special_function */
158
         "R_ARM_ABS16",         /* name */
159
         FALSE,                 /* partial_inplace */
160
         0x0000ffff,            /* src_mask */
161
         0x0000ffff,            /* dst_mask */
162
         FALSE),                /* pcrel_offset */
163
 
164
  /* 12 bit absolute */
165
  HOWTO (R_ARM_ABS12,           /* type */
166
         0,                      /* rightshift */
167
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
168
         12,                    /* bitsize */
169
         FALSE,                 /* pc_relative */
170
         0,                      /* bitpos */
171
         complain_overflow_bitfield,/* complain_on_overflow */
172
         bfd_elf_generic_reloc, /* special_function */
173
         "R_ARM_ABS12",         /* name */
174
         FALSE,                 /* partial_inplace */
175
         0x00000fff,            /* src_mask */
176
         0x00000fff,            /* dst_mask */
177
         FALSE),                /* pcrel_offset */
178
 
179
  HOWTO (R_ARM_THM_ABS5,        /* type */
180
         6,                     /* rightshift */
181
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
182
         5,                     /* bitsize */
183
         FALSE,                 /* pc_relative */
184
         0,                      /* bitpos */
185
         complain_overflow_bitfield,/* complain_on_overflow */
186
         bfd_elf_generic_reloc, /* special_function */
187
         "R_ARM_THM_ABS5",      /* name */
188
         FALSE,                 /* partial_inplace */
189
         0x000007e0,            /* src_mask */
190
         0x000007e0,            /* dst_mask */
191
         FALSE),                /* pcrel_offset */
192
 
193
  /* 8 bit absolute */
194
  HOWTO (R_ARM_ABS8,            /* type */
195
         0,                      /* rightshift */
196
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
197
         8,                     /* bitsize */
198
         FALSE,                 /* pc_relative */
199
         0,                      /* bitpos */
200
         complain_overflow_bitfield,/* complain_on_overflow */
201
         bfd_elf_generic_reloc, /* special_function */
202
         "R_ARM_ABS8",          /* name */
203
         FALSE,                 /* partial_inplace */
204
         0x000000ff,            /* src_mask */
205
         0x000000ff,            /* dst_mask */
206
         FALSE),                /* pcrel_offset */
207
 
208
  HOWTO (R_ARM_SBREL32,         /* type */
209
         0,                      /* rightshift */
210
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
211
         32,                    /* bitsize */
212
         FALSE,                 /* pc_relative */
213
         0,                      /* bitpos */
214
         complain_overflow_dont,/* complain_on_overflow */
215
         bfd_elf_generic_reloc, /* special_function */
216
         "R_ARM_SBREL32",       /* name */
217
         FALSE,                 /* partial_inplace */
218
         0xffffffff,            /* src_mask */
219
         0xffffffff,            /* dst_mask */
220
         FALSE),                /* pcrel_offset */
221
 
222
  HOWTO (R_ARM_THM_CALL,        /* type */
223
         1,                     /* rightshift */
224
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
225
         24,                    /* bitsize */
226
         TRUE,                  /* pc_relative */
227
         0,                      /* bitpos */
228
         complain_overflow_signed,/* complain_on_overflow */
229
         bfd_elf_generic_reloc, /* special_function */
230
         "R_ARM_THM_CALL",      /* name */
231
         FALSE,                 /* partial_inplace */
232 161 khays
         0x07ff2fff,            /* src_mask */
233
         0x07ff2fff,            /* dst_mask */
234 14 khays
         TRUE),                 /* pcrel_offset */
235
 
236
  HOWTO (R_ARM_THM_PC8,         /* type */
237
         1,                     /* rightshift */
238
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
239
         8,                     /* bitsize */
240
         TRUE,                  /* pc_relative */
241
         0,                      /* bitpos */
242
         complain_overflow_signed,/* complain_on_overflow */
243
         bfd_elf_generic_reloc, /* special_function */
244
         "R_ARM_THM_PC8",       /* name */
245
         FALSE,                 /* partial_inplace */
246
         0x000000ff,            /* src_mask */
247
         0x000000ff,            /* dst_mask */
248
         TRUE),                 /* pcrel_offset */
249
 
250
  HOWTO (R_ARM_BREL_ADJ,        /* type */
251
         1,                     /* rightshift */
252
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
253
         32,                    /* bitsize */
254
         FALSE,                 /* pc_relative */
255
         0,                      /* bitpos */
256
         complain_overflow_signed,/* complain_on_overflow */
257
         bfd_elf_generic_reloc, /* special_function */
258
         "R_ARM_BREL_ADJ",      /* name */
259
         FALSE,                 /* partial_inplace */
260
         0xffffffff,            /* src_mask */
261
         0xffffffff,            /* dst_mask */
262
         FALSE),                /* pcrel_offset */
263
 
264
  HOWTO (R_ARM_TLS_DESC,        /* type */
265
         0,                      /* rightshift */
266
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
267
         32,                    /* bitsize */
268
         FALSE,                 /* pc_relative */
269
         0,                      /* bitpos */
270
         complain_overflow_bitfield,/* complain_on_overflow */
271
         bfd_elf_generic_reloc, /* special_function */
272
         "R_ARM_TLS_DESC",      /* name */
273
         FALSE,                 /* partial_inplace */
274
         0xffffffff,            /* src_mask */
275
         0xffffffff,            /* dst_mask */
276
         FALSE),                /* pcrel_offset */
277
 
278
  HOWTO (R_ARM_THM_SWI8,        /* type */
279
         0,                      /* rightshift */
280
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
281
         0,                      /* bitsize */
282
         FALSE,                 /* pc_relative */
283
         0,                      /* bitpos */
284
         complain_overflow_signed,/* complain_on_overflow */
285
         bfd_elf_generic_reloc, /* special_function */
286
         "R_ARM_SWI8",          /* name */
287
         FALSE,                 /* partial_inplace */
288
         0x00000000,            /* src_mask */
289
         0x00000000,            /* dst_mask */
290
         FALSE),                /* pcrel_offset */
291
 
292
  /* BLX instruction for the ARM.  */
293
  HOWTO (R_ARM_XPC25,           /* type */
294
         2,                     /* rightshift */
295
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
296 161 khays
         24,                    /* bitsize */
297 14 khays
         TRUE,                  /* pc_relative */
298
         0,                      /* bitpos */
299
         complain_overflow_signed,/* complain_on_overflow */
300
         bfd_elf_generic_reloc, /* special_function */
301
         "R_ARM_XPC25",         /* name */
302
         FALSE,                 /* partial_inplace */
303
         0x00ffffff,            /* src_mask */
304
         0x00ffffff,            /* dst_mask */
305
         TRUE),                 /* pcrel_offset */
306
 
307
  /* BLX instruction for the Thumb.  */
308
  HOWTO (R_ARM_THM_XPC22,       /* type */
309
         2,                     /* rightshift */
310
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
311 161 khays
         24,                    /* bitsize */
312 14 khays
         TRUE,                  /* pc_relative */
313
         0,                      /* bitpos */
314
         complain_overflow_signed,/* complain_on_overflow */
315
         bfd_elf_generic_reloc, /* special_function */
316
         "R_ARM_THM_XPC22",     /* name */
317
         FALSE,                 /* partial_inplace */
318 161 khays
         0x07ff2fff,            /* src_mask */
319
         0x07ff2fff,            /* dst_mask */
320 14 khays
         TRUE),                 /* pcrel_offset */
321
 
322
  /* Dynamic TLS relocations.  */
323
 
324
  HOWTO (R_ARM_TLS_DTPMOD32,    /* type */
325
         0,                     /* rightshift */
326
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
327
         32,                    /* bitsize */
328
         FALSE,                 /* pc_relative */
329
         0,                     /* bitpos */
330
         complain_overflow_bitfield,/* complain_on_overflow */
331
         bfd_elf_generic_reloc, /* special_function */
332
         "R_ARM_TLS_DTPMOD32",  /* name */
333
         TRUE,                  /* partial_inplace */
334
         0xffffffff,            /* src_mask */
335
         0xffffffff,            /* dst_mask */
336
         FALSE),                /* pcrel_offset */
337
 
338
  HOWTO (R_ARM_TLS_DTPOFF32,    /* type */
339
         0,                     /* rightshift */
340
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
341
         32,                    /* bitsize */
342
         FALSE,                 /* pc_relative */
343
         0,                     /* bitpos */
344
         complain_overflow_bitfield,/* complain_on_overflow */
345
         bfd_elf_generic_reloc, /* special_function */
346
         "R_ARM_TLS_DTPOFF32",  /* name */
347
         TRUE,                  /* partial_inplace */
348
         0xffffffff,            /* src_mask */
349
         0xffffffff,            /* dst_mask */
350
         FALSE),                /* pcrel_offset */
351
 
352
  HOWTO (R_ARM_TLS_TPOFF32,     /* type */
353
         0,                     /* rightshift */
354
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
355
         32,                    /* bitsize */
356
         FALSE,                 /* pc_relative */
357
         0,                     /* bitpos */
358
         complain_overflow_bitfield,/* complain_on_overflow */
359
         bfd_elf_generic_reloc, /* special_function */
360
         "R_ARM_TLS_TPOFF32",   /* name */
361
         TRUE,                  /* partial_inplace */
362
         0xffffffff,            /* src_mask */
363
         0xffffffff,            /* dst_mask */
364
         FALSE),                /* pcrel_offset */
365
 
366
  /* Relocs used in ARM Linux */
367
 
368
  HOWTO (R_ARM_COPY,            /* type */
369
         0,                     /* rightshift */
370
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
371
         32,                    /* bitsize */
372
         FALSE,                 /* pc_relative */
373
         0,                     /* bitpos */
374
         complain_overflow_bitfield,/* complain_on_overflow */
375
         bfd_elf_generic_reloc, /* special_function */
376
         "R_ARM_COPY",          /* name */
377
         TRUE,                  /* partial_inplace */
378
         0xffffffff,            /* src_mask */
379
         0xffffffff,            /* dst_mask */
380
         FALSE),                /* pcrel_offset */
381
 
382
  HOWTO (R_ARM_GLOB_DAT,        /* type */
383
         0,                     /* rightshift */
384
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
385
         32,                    /* bitsize */
386
         FALSE,                 /* pc_relative */
387
         0,                     /* bitpos */
388
         complain_overflow_bitfield,/* complain_on_overflow */
389
         bfd_elf_generic_reloc, /* special_function */
390
         "R_ARM_GLOB_DAT",      /* name */
391
         TRUE,                  /* partial_inplace */
392
         0xffffffff,            /* src_mask */
393
         0xffffffff,            /* dst_mask */
394
         FALSE),                /* pcrel_offset */
395
 
396
  HOWTO (R_ARM_JUMP_SLOT,       /* type */
397
         0,                     /* rightshift */
398
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
399
         32,                    /* bitsize */
400
         FALSE,                 /* pc_relative */
401
         0,                     /* bitpos */
402
         complain_overflow_bitfield,/* complain_on_overflow */
403
         bfd_elf_generic_reloc, /* special_function */
404
         "R_ARM_JUMP_SLOT",     /* name */
405
         TRUE,                  /* partial_inplace */
406
         0xffffffff,            /* src_mask */
407
         0xffffffff,            /* dst_mask */
408
         FALSE),                /* pcrel_offset */
409
 
410
  HOWTO (R_ARM_RELATIVE,        /* type */
411
         0,                     /* rightshift */
412
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
413
         32,                    /* bitsize */
414
         FALSE,                 /* pc_relative */
415
         0,                     /* bitpos */
416
         complain_overflow_bitfield,/* complain_on_overflow */
417
         bfd_elf_generic_reloc, /* special_function */
418
         "R_ARM_RELATIVE",      /* name */
419
         TRUE,                  /* partial_inplace */
420
         0xffffffff,            /* src_mask */
421
         0xffffffff,            /* dst_mask */
422
         FALSE),                /* pcrel_offset */
423
 
424
  HOWTO (R_ARM_GOTOFF32,        /* type */
425
         0,                     /* rightshift */
426
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
427
         32,                    /* bitsize */
428
         FALSE,                 /* pc_relative */
429
         0,                     /* bitpos */
430
         complain_overflow_bitfield,/* complain_on_overflow */
431
         bfd_elf_generic_reloc, /* special_function */
432
         "R_ARM_GOTOFF32",      /* name */
433
         TRUE,                  /* partial_inplace */
434
         0xffffffff,            /* src_mask */
435
         0xffffffff,            /* dst_mask */
436
         FALSE),                /* pcrel_offset */
437
 
438
  HOWTO (R_ARM_GOTPC,           /* type */
439
         0,                     /* rightshift */
440
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
441
         32,                    /* bitsize */
442
         TRUE,                  /* pc_relative */
443
         0,                     /* bitpos */
444
         complain_overflow_bitfield,/* complain_on_overflow */
445
         bfd_elf_generic_reloc, /* special_function */
446
         "R_ARM_GOTPC",         /* name */
447
         TRUE,                  /* partial_inplace */
448
         0xffffffff,            /* src_mask */
449
         0xffffffff,            /* dst_mask */
450
         TRUE),                 /* pcrel_offset */
451
 
452
  HOWTO (R_ARM_GOT32,           /* type */
453
         0,                     /* rightshift */
454
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
455
         32,                    /* bitsize */
456
         FALSE,                 /* pc_relative */
457
         0,                     /* bitpos */
458
         complain_overflow_bitfield,/* complain_on_overflow */
459
         bfd_elf_generic_reloc, /* special_function */
460
         "R_ARM_GOT32",         /* name */
461
         TRUE,                  /* partial_inplace */
462
         0xffffffff,            /* src_mask */
463
         0xffffffff,            /* dst_mask */
464
         FALSE),                /* pcrel_offset */
465
 
466
  HOWTO (R_ARM_PLT32,           /* type */
467
         2,                     /* rightshift */
468
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
469
         24,                    /* bitsize */
470
         TRUE,                  /* pc_relative */
471
         0,                     /* bitpos */
472
         complain_overflow_bitfield,/* complain_on_overflow */
473
         bfd_elf_generic_reloc, /* special_function */
474
         "R_ARM_PLT32",         /* name */
475
         FALSE,                 /* partial_inplace */
476
         0x00ffffff,            /* src_mask */
477
         0x00ffffff,            /* dst_mask */
478
         TRUE),                 /* pcrel_offset */
479
 
480
  HOWTO (R_ARM_CALL,            /* type */
481
         2,                     /* rightshift */
482
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
483
         24,                    /* bitsize */
484
         TRUE,                  /* pc_relative */
485
         0,                      /* bitpos */
486
         complain_overflow_signed,/* complain_on_overflow */
487
         bfd_elf_generic_reloc, /* special_function */
488
         "R_ARM_CALL",          /* name */
489
         FALSE,                 /* partial_inplace */
490
         0x00ffffff,            /* src_mask */
491
         0x00ffffff,            /* dst_mask */
492
         TRUE),                 /* pcrel_offset */
493
 
494
  HOWTO (R_ARM_JUMP24,          /* type */
495
         2,                     /* rightshift */
496
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
497
         24,                    /* bitsize */
498
         TRUE,                  /* pc_relative */
499
         0,                      /* bitpos */
500
         complain_overflow_signed,/* complain_on_overflow */
501
         bfd_elf_generic_reloc, /* special_function */
502
         "R_ARM_JUMP24",        /* name */
503
         FALSE,                 /* partial_inplace */
504
         0x00ffffff,            /* src_mask */
505
         0x00ffffff,            /* dst_mask */
506
         TRUE),                 /* pcrel_offset */
507
 
508
  HOWTO (R_ARM_THM_JUMP24,      /* type */
509
         1,                     /* rightshift */
510
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
511
         24,                    /* bitsize */
512
         TRUE,                  /* pc_relative */
513
         0,                      /* bitpos */
514
         complain_overflow_signed,/* complain_on_overflow */
515
         bfd_elf_generic_reloc, /* special_function */
516
         "R_ARM_THM_JUMP24",    /* name */
517
         FALSE,                 /* partial_inplace */
518
         0x07ff2fff,            /* src_mask */
519
         0x07ff2fff,            /* dst_mask */
520
         TRUE),                 /* pcrel_offset */
521
 
522
  HOWTO (R_ARM_BASE_ABS,        /* type */
523
         0,                      /* rightshift */
524
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
525
         32,                    /* bitsize */
526
         FALSE,                 /* pc_relative */
527
         0,                      /* bitpos */
528
         complain_overflow_dont,/* complain_on_overflow */
529
         bfd_elf_generic_reloc, /* special_function */
530
         "R_ARM_BASE_ABS",      /* name */
531
         FALSE,                 /* partial_inplace */
532
         0xffffffff,            /* src_mask */
533
         0xffffffff,            /* dst_mask */
534
         FALSE),                /* pcrel_offset */
535
 
536
  HOWTO (R_ARM_ALU_PCREL7_0,    /* type */
537
         0,                      /* rightshift */
538
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
539
         12,                    /* bitsize */
540
         TRUE,                  /* pc_relative */
541
         0,                      /* bitpos */
542
         complain_overflow_dont,/* complain_on_overflow */
543
         bfd_elf_generic_reloc, /* special_function */
544
         "R_ARM_ALU_PCREL_7_0", /* name */
545
         FALSE,                 /* partial_inplace */
546
         0x00000fff,            /* src_mask */
547
         0x00000fff,            /* dst_mask */
548
         TRUE),                 /* pcrel_offset */
549
 
550
  HOWTO (R_ARM_ALU_PCREL15_8,   /* type */
551
         0,                      /* rightshift */
552
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
553
         12,                    /* bitsize */
554
         TRUE,                  /* pc_relative */
555
         8,                     /* bitpos */
556
         complain_overflow_dont,/* complain_on_overflow */
557
         bfd_elf_generic_reloc, /* special_function */
558
         "R_ARM_ALU_PCREL_15_8",/* name */
559
         FALSE,                 /* partial_inplace */
560
         0x00000fff,            /* src_mask */
561
         0x00000fff,            /* dst_mask */
562
         TRUE),                 /* pcrel_offset */
563
 
564
  HOWTO (R_ARM_ALU_PCREL23_15,  /* type */
565
         0,                      /* rightshift */
566
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
567
         12,                    /* bitsize */
568
         TRUE,                  /* pc_relative */
569
         16,                    /* bitpos */
570
         complain_overflow_dont,/* complain_on_overflow */
571
         bfd_elf_generic_reloc, /* special_function */
572
         "R_ARM_ALU_PCREL_23_15",/* name */
573
         FALSE,                 /* partial_inplace */
574
         0x00000fff,            /* src_mask */
575
         0x00000fff,            /* dst_mask */
576
         TRUE),                 /* pcrel_offset */
577
 
578
  HOWTO (R_ARM_LDR_SBREL_11_0,  /* type */
579
         0,                      /* rightshift */
580
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
581
         12,                    /* bitsize */
582
         FALSE,                 /* pc_relative */
583
         0,                      /* bitpos */
584
         complain_overflow_dont,/* complain_on_overflow */
585
         bfd_elf_generic_reloc, /* special_function */
586
         "R_ARM_LDR_SBREL_11_0",/* name */
587
         FALSE,                 /* partial_inplace */
588
         0x00000fff,            /* src_mask */
589
         0x00000fff,            /* dst_mask */
590
         FALSE),                /* pcrel_offset */
591
 
592
  HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
593
         0,                      /* rightshift */
594
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
595
         8,                     /* bitsize */
596
         FALSE,                 /* pc_relative */
597
         12,                    /* bitpos */
598
         complain_overflow_dont,/* complain_on_overflow */
599
         bfd_elf_generic_reloc, /* special_function */
600
         "R_ARM_ALU_SBREL_19_12",/* name */
601
         FALSE,                 /* partial_inplace */
602
         0x000ff000,            /* src_mask */
603
         0x000ff000,            /* dst_mask */
604
         FALSE),                /* pcrel_offset */
605
 
606
  HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
607
         0,                      /* rightshift */
608
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
609
         8,                     /* bitsize */
610
         FALSE,                 /* pc_relative */
611
         20,                    /* bitpos */
612
         complain_overflow_dont,/* complain_on_overflow */
613
         bfd_elf_generic_reloc, /* special_function */
614
         "R_ARM_ALU_SBREL_27_20",/* name */
615
         FALSE,                 /* partial_inplace */
616
         0x0ff00000,            /* src_mask */
617
         0x0ff00000,            /* dst_mask */
618
         FALSE),                /* pcrel_offset */
619
 
620
  HOWTO (R_ARM_TARGET1,         /* type */
621
         0,                      /* rightshift */
622
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
623
         32,                    /* bitsize */
624
         FALSE,                 /* pc_relative */
625
         0,                      /* bitpos */
626
         complain_overflow_dont,/* complain_on_overflow */
627
         bfd_elf_generic_reloc, /* special_function */
628
         "R_ARM_TARGET1",       /* name */
629
         FALSE,                 /* partial_inplace */
630
         0xffffffff,            /* src_mask */
631
         0xffffffff,            /* dst_mask */
632
         FALSE),                /* pcrel_offset */
633
 
634
  HOWTO (R_ARM_ROSEGREL32,      /* type */
635
         0,                      /* rightshift */
636
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
637
         32,                    /* bitsize */
638
         FALSE,                 /* pc_relative */
639
         0,                      /* bitpos */
640
         complain_overflow_dont,/* complain_on_overflow */
641
         bfd_elf_generic_reloc, /* special_function */
642
         "R_ARM_ROSEGREL32",    /* name */
643
         FALSE,                 /* partial_inplace */
644
         0xffffffff,            /* src_mask */
645
         0xffffffff,            /* dst_mask */
646
         FALSE),                /* pcrel_offset */
647
 
648
  HOWTO (R_ARM_V4BX,            /* type */
649
         0,                      /* rightshift */
650
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
651
         32,                    /* bitsize */
652
         FALSE,                 /* pc_relative */
653
         0,                      /* bitpos */
654
         complain_overflow_dont,/* complain_on_overflow */
655
         bfd_elf_generic_reloc, /* special_function */
656
         "R_ARM_V4BX",          /* name */
657
         FALSE,                 /* partial_inplace */
658
         0xffffffff,            /* src_mask */
659
         0xffffffff,            /* dst_mask */
660
         FALSE),                /* pcrel_offset */
661
 
662
  HOWTO (R_ARM_TARGET2,         /* type */
663
         0,                      /* rightshift */
664
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
665
         32,                    /* bitsize */
666
         FALSE,                 /* pc_relative */
667
         0,                      /* bitpos */
668
         complain_overflow_signed,/* complain_on_overflow */
669
         bfd_elf_generic_reloc, /* special_function */
670
         "R_ARM_TARGET2",       /* name */
671
         FALSE,                 /* partial_inplace */
672
         0xffffffff,            /* src_mask */
673
         0xffffffff,            /* dst_mask */
674
         TRUE),                 /* pcrel_offset */
675
 
676
  HOWTO (R_ARM_PREL31,          /* type */
677
         0,                      /* rightshift */
678
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
679
         31,                    /* bitsize */
680
         TRUE,                  /* pc_relative */
681
         0,                      /* bitpos */
682
         complain_overflow_signed,/* complain_on_overflow */
683
         bfd_elf_generic_reloc, /* special_function */
684
         "R_ARM_PREL31",        /* name */
685
         FALSE,                 /* partial_inplace */
686
         0x7fffffff,            /* src_mask */
687
         0x7fffffff,            /* dst_mask */
688
         TRUE),                 /* pcrel_offset */
689
 
690
  HOWTO (R_ARM_MOVW_ABS_NC,     /* type */
691
         0,                      /* rightshift */
692
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
693
         16,                    /* bitsize */
694
         FALSE,                 /* pc_relative */
695
         0,                      /* bitpos */
696
         complain_overflow_dont,/* complain_on_overflow */
697
         bfd_elf_generic_reloc, /* special_function */
698
         "R_ARM_MOVW_ABS_NC",   /* name */
699
         FALSE,                 /* partial_inplace */
700
         0x000f0fff,            /* src_mask */
701
         0x000f0fff,            /* dst_mask */
702
         FALSE),                /* pcrel_offset */
703
 
704
  HOWTO (R_ARM_MOVT_ABS,        /* type */
705
         0,                      /* rightshift */
706
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
707
         16,                    /* bitsize */
708
         FALSE,                 /* pc_relative */
709
         0,                      /* bitpos */
710
         complain_overflow_bitfield,/* complain_on_overflow */
711
         bfd_elf_generic_reloc, /* special_function */
712
         "R_ARM_MOVT_ABS",      /* name */
713
         FALSE,                 /* partial_inplace */
714
         0x000f0fff,            /* src_mask */
715
         0x000f0fff,            /* dst_mask */
716
         FALSE),                /* pcrel_offset */
717
 
718
  HOWTO (R_ARM_MOVW_PREL_NC,    /* type */
719
         0,                      /* rightshift */
720
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
721
         16,                    /* bitsize */
722
         TRUE,                  /* pc_relative */
723
         0,                      /* bitpos */
724
         complain_overflow_dont,/* complain_on_overflow */
725
         bfd_elf_generic_reloc, /* special_function */
726
         "R_ARM_MOVW_PREL_NC",  /* name */
727
         FALSE,                 /* partial_inplace */
728
         0x000f0fff,            /* src_mask */
729
         0x000f0fff,            /* dst_mask */
730
         TRUE),                 /* pcrel_offset */
731
 
732
  HOWTO (R_ARM_MOVT_PREL,       /* type */
733
         0,                      /* rightshift */
734
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
735
         16,                    /* bitsize */
736
         TRUE,                  /* pc_relative */
737
         0,                      /* bitpos */
738
         complain_overflow_bitfield,/* complain_on_overflow */
739
         bfd_elf_generic_reloc, /* special_function */
740
         "R_ARM_MOVT_PREL",     /* name */
741
         FALSE,                 /* partial_inplace */
742
         0x000f0fff,            /* src_mask */
743
         0x000f0fff,            /* dst_mask */
744
         TRUE),                 /* pcrel_offset */
745
 
746
  HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
747
         0,                      /* rightshift */
748
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
749
         16,                    /* bitsize */
750
         FALSE,                 /* pc_relative */
751
         0,                      /* bitpos */
752
         complain_overflow_dont,/* complain_on_overflow */
753
         bfd_elf_generic_reloc, /* special_function */
754
         "R_ARM_THM_MOVW_ABS_NC",/* name */
755
         FALSE,                 /* partial_inplace */
756
         0x040f70ff,            /* src_mask */
757
         0x040f70ff,            /* dst_mask */
758
         FALSE),                /* pcrel_offset */
759
 
760
  HOWTO (R_ARM_THM_MOVT_ABS,    /* type */
761
         0,                      /* rightshift */
762
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
763
         16,                    /* bitsize */
764
         FALSE,                 /* pc_relative */
765
         0,                      /* bitpos */
766
         complain_overflow_bitfield,/* complain_on_overflow */
767
         bfd_elf_generic_reloc, /* special_function */
768
         "R_ARM_THM_MOVT_ABS",  /* name */
769
         FALSE,                 /* partial_inplace */
770
         0x040f70ff,            /* src_mask */
771
         0x040f70ff,            /* dst_mask */
772
         FALSE),                /* pcrel_offset */
773
 
774
  HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
775
         0,                      /* rightshift */
776
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
777
         16,                    /* bitsize */
778
         TRUE,                  /* pc_relative */
779
         0,                      /* bitpos */
780
         complain_overflow_dont,/* complain_on_overflow */
781
         bfd_elf_generic_reloc, /* special_function */
782
         "R_ARM_THM_MOVW_PREL_NC",/* name */
783
         FALSE,                 /* partial_inplace */
784
         0x040f70ff,            /* src_mask */
785
         0x040f70ff,            /* dst_mask */
786
         TRUE),                 /* pcrel_offset */
787
 
788
  HOWTO (R_ARM_THM_MOVT_PREL,   /* type */
789
         0,                      /* rightshift */
790
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
791
         16,                    /* bitsize */
792
         TRUE,                  /* pc_relative */
793
         0,                      /* bitpos */
794
         complain_overflow_bitfield,/* complain_on_overflow */
795
         bfd_elf_generic_reloc, /* special_function */
796
         "R_ARM_THM_MOVT_PREL", /* name */
797
         FALSE,                 /* partial_inplace */
798
         0x040f70ff,            /* src_mask */
799
         0x040f70ff,            /* dst_mask */
800
         TRUE),                 /* pcrel_offset */
801
 
802
  HOWTO (R_ARM_THM_JUMP19,      /* type */
803
         1,                     /* rightshift */
804
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
805
         19,                    /* bitsize */
806
         TRUE,                  /* pc_relative */
807
         0,                      /* bitpos */
808
         complain_overflow_signed,/* complain_on_overflow */
809
         bfd_elf_generic_reloc, /* special_function */
810
         "R_ARM_THM_JUMP19",    /* name */
811
         FALSE,                 /* partial_inplace */
812
         0x043f2fff,            /* src_mask */
813
         0x043f2fff,            /* dst_mask */
814
         TRUE),                 /* pcrel_offset */
815
 
816
  HOWTO (R_ARM_THM_JUMP6,       /* type */
817
         1,                     /* rightshift */
818
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
819
         6,                     /* bitsize */
820
         TRUE,                  /* pc_relative */
821
         0,                      /* bitpos */
822
         complain_overflow_unsigned,/* complain_on_overflow */
823
         bfd_elf_generic_reloc, /* special_function */
824
         "R_ARM_THM_JUMP6",     /* name */
825
         FALSE,                 /* partial_inplace */
826
         0x02f8,                /* src_mask */
827
         0x02f8,                /* dst_mask */
828
         TRUE),                 /* pcrel_offset */
829
 
830
  /* These are declared as 13-bit signed relocations because we can
831
     address -4095 .. 4095(base) by altering ADDW to SUBW or vice
832
     versa.  */
833
  HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
834
         0,                      /* rightshift */
835
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
836
         13,                    /* bitsize */
837
         TRUE,                  /* pc_relative */
838
         0,                      /* bitpos */
839
         complain_overflow_dont,/* complain_on_overflow */
840
         bfd_elf_generic_reloc, /* special_function */
841
         "R_ARM_THM_ALU_PREL_11_0",/* name */
842
         FALSE,                 /* partial_inplace */
843
         0xffffffff,            /* src_mask */
844
         0xffffffff,            /* dst_mask */
845
         TRUE),                 /* pcrel_offset */
846
 
847
  HOWTO (R_ARM_THM_PC12,        /* type */
848
         0,                      /* rightshift */
849
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
850
         13,                    /* bitsize */
851
         TRUE,                  /* pc_relative */
852
         0,                      /* bitpos */
853
         complain_overflow_dont,/* complain_on_overflow */
854
         bfd_elf_generic_reloc, /* special_function */
855
         "R_ARM_THM_PC12",      /* name */
856
         FALSE,                 /* partial_inplace */
857
         0xffffffff,            /* src_mask */
858
         0xffffffff,            /* dst_mask */
859
         TRUE),                 /* pcrel_offset */
860
 
861
  HOWTO (R_ARM_ABS32_NOI,       /* type */
862
         0,                      /* rightshift */
863
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
864
         32,                    /* bitsize */
865
         FALSE,                 /* pc_relative */
866
         0,                      /* bitpos */
867
         complain_overflow_dont,/* complain_on_overflow */
868
         bfd_elf_generic_reloc, /* special_function */
869
         "R_ARM_ABS32_NOI",     /* name */
870
         FALSE,                 /* partial_inplace */
871
         0xffffffff,            /* src_mask */
872
         0xffffffff,            /* dst_mask */
873
         FALSE),                /* pcrel_offset */
874
 
875
  HOWTO (R_ARM_REL32_NOI,       /* type */
876
         0,                      /* rightshift */
877
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
878
         32,                    /* bitsize */
879
         TRUE,                  /* pc_relative */
880
         0,                      /* bitpos */
881
         complain_overflow_dont,/* complain_on_overflow */
882
         bfd_elf_generic_reloc, /* special_function */
883
         "R_ARM_REL32_NOI",     /* name */
884
         FALSE,                 /* partial_inplace */
885
         0xffffffff,            /* src_mask */
886
         0xffffffff,            /* dst_mask */
887
         FALSE),                /* pcrel_offset */
888
 
889
  /* Group relocations.  */
890
 
891
  HOWTO (R_ARM_ALU_PC_G0_NC,    /* type */
892
         0,                      /* rightshift */
893
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
894
         32,                    /* bitsize */
895
         TRUE,                  /* pc_relative */
896
         0,                      /* bitpos */
897
         complain_overflow_dont,/* complain_on_overflow */
898
         bfd_elf_generic_reloc, /* special_function */
899
         "R_ARM_ALU_PC_G0_NC",  /* name */
900
         FALSE,                 /* partial_inplace */
901
         0xffffffff,            /* src_mask */
902
         0xffffffff,            /* dst_mask */
903
         TRUE),                 /* pcrel_offset */
904
 
905
  HOWTO (R_ARM_ALU_PC_G0,       /* type */
906
         0,                      /* rightshift */
907
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
908
         32,                    /* bitsize */
909
         TRUE,                  /* pc_relative */
910
         0,                      /* bitpos */
911
         complain_overflow_dont,/* complain_on_overflow */
912
         bfd_elf_generic_reloc, /* special_function */
913
         "R_ARM_ALU_PC_G0",     /* name */
914
         FALSE,                 /* partial_inplace */
915
         0xffffffff,            /* src_mask */
916
         0xffffffff,            /* dst_mask */
917
         TRUE),                 /* pcrel_offset */
918
 
919
  HOWTO (R_ARM_ALU_PC_G1_NC,    /* type */
920
         0,                      /* rightshift */
921
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
922
         32,                    /* bitsize */
923
         TRUE,                  /* pc_relative */
924
         0,                      /* bitpos */
925
         complain_overflow_dont,/* complain_on_overflow */
926
         bfd_elf_generic_reloc, /* special_function */
927
         "R_ARM_ALU_PC_G1_NC",  /* name */
928
         FALSE,                 /* partial_inplace */
929
         0xffffffff,            /* src_mask */
930
         0xffffffff,            /* dst_mask */
931
         TRUE),                 /* pcrel_offset */
932
 
933
  HOWTO (R_ARM_ALU_PC_G1,       /* type */
934
         0,                      /* rightshift */
935
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
936
         32,                    /* bitsize */
937
         TRUE,                  /* pc_relative */
938
         0,                      /* bitpos */
939
         complain_overflow_dont,/* complain_on_overflow */
940
         bfd_elf_generic_reloc, /* special_function */
941
         "R_ARM_ALU_PC_G1",     /* name */
942
         FALSE,                 /* partial_inplace */
943
         0xffffffff,            /* src_mask */
944
         0xffffffff,            /* dst_mask */
945
         TRUE),                 /* pcrel_offset */
946
 
947
  HOWTO (R_ARM_ALU_PC_G2,       /* type */
948
         0,                      /* rightshift */
949
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
950
         32,                    /* bitsize */
951
         TRUE,                  /* pc_relative */
952
         0,                      /* bitpos */
953
         complain_overflow_dont,/* complain_on_overflow */
954
         bfd_elf_generic_reloc, /* special_function */
955
         "R_ARM_ALU_PC_G2",     /* name */
956
         FALSE,                 /* partial_inplace */
957
         0xffffffff,            /* src_mask */
958
         0xffffffff,            /* dst_mask */
959
         TRUE),                 /* pcrel_offset */
960
 
961
  HOWTO (R_ARM_LDR_PC_G1,       /* type */
962
         0,                      /* rightshift */
963
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
964
         32,                    /* bitsize */
965
         TRUE,                  /* pc_relative */
966
         0,                      /* bitpos */
967
         complain_overflow_dont,/* complain_on_overflow */
968
         bfd_elf_generic_reloc, /* special_function */
969
         "R_ARM_LDR_PC_G1",     /* name */
970
         FALSE,                 /* partial_inplace */
971
         0xffffffff,            /* src_mask */
972
         0xffffffff,            /* dst_mask */
973
         TRUE),                 /* pcrel_offset */
974
 
975
  HOWTO (R_ARM_LDR_PC_G2,       /* type */
976
         0,                      /* rightshift */
977
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
978
         32,                    /* bitsize */
979
         TRUE,                  /* pc_relative */
980
         0,                      /* bitpos */
981
         complain_overflow_dont,/* complain_on_overflow */
982
         bfd_elf_generic_reloc, /* special_function */
983
         "R_ARM_LDR_PC_G2",     /* name */
984
         FALSE,                 /* partial_inplace */
985
         0xffffffff,            /* src_mask */
986
         0xffffffff,            /* dst_mask */
987
         TRUE),                 /* pcrel_offset */
988
 
989
  HOWTO (R_ARM_LDRS_PC_G0,      /* type */
990
         0,                      /* rightshift */
991
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
992
         32,                    /* bitsize */
993
         TRUE,                  /* pc_relative */
994
         0,                      /* bitpos */
995
         complain_overflow_dont,/* complain_on_overflow */
996
         bfd_elf_generic_reloc, /* special_function */
997
         "R_ARM_LDRS_PC_G0",    /* name */
998
         FALSE,                 /* partial_inplace */
999
         0xffffffff,            /* src_mask */
1000
         0xffffffff,            /* dst_mask */
1001
         TRUE),                 /* pcrel_offset */
1002
 
1003
  HOWTO (R_ARM_LDRS_PC_G1,      /* type */
1004
         0,                      /* rightshift */
1005
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1006
         32,                    /* bitsize */
1007
         TRUE,                  /* pc_relative */
1008
         0,                      /* bitpos */
1009
         complain_overflow_dont,/* complain_on_overflow */
1010
         bfd_elf_generic_reloc, /* special_function */
1011
         "R_ARM_LDRS_PC_G1",    /* name */
1012
         FALSE,                 /* partial_inplace */
1013
         0xffffffff,            /* src_mask */
1014
         0xffffffff,            /* dst_mask */
1015
         TRUE),                 /* pcrel_offset */
1016
 
1017
  HOWTO (R_ARM_LDRS_PC_G2,      /* type */
1018
         0,                      /* rightshift */
1019
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1020
         32,                    /* bitsize */
1021
         TRUE,                  /* pc_relative */
1022
         0,                      /* bitpos */
1023
         complain_overflow_dont,/* complain_on_overflow */
1024
         bfd_elf_generic_reloc, /* special_function */
1025
         "R_ARM_LDRS_PC_G2",    /* name */
1026
         FALSE,                 /* partial_inplace */
1027
         0xffffffff,            /* src_mask */
1028
         0xffffffff,            /* dst_mask */
1029
         TRUE),                 /* pcrel_offset */
1030
 
1031
  HOWTO (R_ARM_LDC_PC_G0,       /* type */
1032
         0,                      /* rightshift */
1033
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1034
         32,                    /* bitsize */
1035
         TRUE,                  /* pc_relative */
1036
         0,                      /* bitpos */
1037
         complain_overflow_dont,/* complain_on_overflow */
1038
         bfd_elf_generic_reloc, /* special_function */
1039
         "R_ARM_LDC_PC_G0",     /* name */
1040
         FALSE,                 /* partial_inplace */
1041
         0xffffffff,            /* src_mask */
1042
         0xffffffff,            /* dst_mask */
1043
         TRUE),                 /* pcrel_offset */
1044
 
1045
  HOWTO (R_ARM_LDC_PC_G1,       /* type */
1046
         0,                      /* rightshift */
1047
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1048
         32,                    /* bitsize */
1049
         TRUE,                  /* pc_relative */
1050
         0,                      /* bitpos */
1051
         complain_overflow_dont,/* complain_on_overflow */
1052
         bfd_elf_generic_reloc, /* special_function */
1053
         "R_ARM_LDC_PC_G1",     /* name */
1054
         FALSE,                 /* partial_inplace */
1055
         0xffffffff,            /* src_mask */
1056
         0xffffffff,            /* dst_mask */
1057
         TRUE),                 /* pcrel_offset */
1058
 
1059
  HOWTO (R_ARM_LDC_PC_G2,       /* type */
1060
         0,                      /* rightshift */
1061
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1062
         32,                    /* bitsize */
1063
         TRUE,                  /* pc_relative */
1064
         0,                      /* bitpos */
1065
         complain_overflow_dont,/* complain_on_overflow */
1066
         bfd_elf_generic_reloc, /* special_function */
1067
         "R_ARM_LDC_PC_G2",     /* name */
1068
         FALSE,                 /* partial_inplace */
1069
         0xffffffff,            /* src_mask */
1070
         0xffffffff,            /* dst_mask */
1071
         TRUE),                 /* pcrel_offset */
1072
 
1073
  HOWTO (R_ARM_ALU_SB_G0_NC,    /* type */
1074
         0,                      /* rightshift */
1075
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1076
         32,                    /* bitsize */
1077
         TRUE,                  /* pc_relative */
1078
         0,                      /* bitpos */
1079
         complain_overflow_dont,/* complain_on_overflow */
1080
         bfd_elf_generic_reloc, /* special_function */
1081
         "R_ARM_ALU_SB_G0_NC",  /* name */
1082
         FALSE,                 /* partial_inplace */
1083
         0xffffffff,            /* src_mask */
1084
         0xffffffff,            /* dst_mask */
1085
         TRUE),                 /* pcrel_offset */
1086
 
1087
  HOWTO (R_ARM_ALU_SB_G0,       /* type */
1088
         0,                      /* rightshift */
1089
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1090
         32,                    /* bitsize */
1091
         TRUE,                  /* pc_relative */
1092
         0,                      /* bitpos */
1093
         complain_overflow_dont,/* complain_on_overflow */
1094
         bfd_elf_generic_reloc, /* special_function */
1095
         "R_ARM_ALU_SB_G0",     /* name */
1096
         FALSE,                 /* partial_inplace */
1097
         0xffffffff,            /* src_mask */
1098
         0xffffffff,            /* dst_mask */
1099
         TRUE),                 /* pcrel_offset */
1100
 
1101
  HOWTO (R_ARM_ALU_SB_G1_NC,    /* type */
1102
         0,                      /* rightshift */
1103
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1104
         32,                    /* bitsize */
1105
         TRUE,                  /* pc_relative */
1106
         0,                      /* bitpos */
1107
         complain_overflow_dont,/* complain_on_overflow */
1108
         bfd_elf_generic_reloc, /* special_function */
1109
         "R_ARM_ALU_SB_G1_NC",  /* name */
1110
         FALSE,                 /* partial_inplace */
1111
         0xffffffff,            /* src_mask */
1112
         0xffffffff,            /* dst_mask */
1113
         TRUE),                 /* pcrel_offset */
1114
 
1115
  HOWTO (R_ARM_ALU_SB_G1,       /* type */
1116
         0,                      /* rightshift */
1117
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1118
         32,                    /* bitsize */
1119
         TRUE,                  /* pc_relative */
1120
         0,                      /* bitpos */
1121
         complain_overflow_dont,/* complain_on_overflow */
1122
         bfd_elf_generic_reloc, /* special_function */
1123
         "R_ARM_ALU_SB_G1",     /* name */
1124
         FALSE,                 /* partial_inplace */
1125
         0xffffffff,            /* src_mask */
1126
         0xffffffff,            /* dst_mask */
1127
         TRUE),                 /* pcrel_offset */
1128
 
1129
  HOWTO (R_ARM_ALU_SB_G2,       /* type */
1130
         0,                      /* rightshift */
1131
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1132
         32,                    /* bitsize */
1133
         TRUE,                  /* pc_relative */
1134
         0,                      /* bitpos */
1135
         complain_overflow_dont,/* complain_on_overflow */
1136
         bfd_elf_generic_reloc, /* special_function */
1137
         "R_ARM_ALU_SB_G2",     /* name */
1138
         FALSE,                 /* partial_inplace */
1139
         0xffffffff,            /* src_mask */
1140
         0xffffffff,            /* dst_mask */
1141
         TRUE),                 /* pcrel_offset */
1142
 
1143
  HOWTO (R_ARM_LDR_SB_G0,       /* type */
1144
         0,                      /* rightshift */
1145
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1146
         32,                    /* bitsize */
1147
         TRUE,                  /* pc_relative */
1148
         0,                      /* bitpos */
1149
         complain_overflow_dont,/* complain_on_overflow */
1150
         bfd_elf_generic_reloc, /* special_function */
1151
         "R_ARM_LDR_SB_G0",     /* name */
1152
         FALSE,                 /* partial_inplace */
1153
         0xffffffff,            /* src_mask */
1154
         0xffffffff,            /* dst_mask */
1155
         TRUE),                 /* pcrel_offset */
1156
 
1157
  HOWTO (R_ARM_LDR_SB_G1,       /* type */
1158
         0,                      /* rightshift */
1159
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1160
         32,                    /* bitsize */
1161
         TRUE,                  /* pc_relative */
1162
         0,                      /* bitpos */
1163
         complain_overflow_dont,/* complain_on_overflow */
1164
         bfd_elf_generic_reloc, /* special_function */
1165
         "R_ARM_LDR_SB_G1",     /* name */
1166
         FALSE,                 /* partial_inplace */
1167
         0xffffffff,            /* src_mask */
1168
         0xffffffff,            /* dst_mask */
1169
         TRUE),                 /* pcrel_offset */
1170
 
1171
  HOWTO (R_ARM_LDR_SB_G2,       /* type */
1172
         0,                      /* rightshift */
1173
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1174
         32,                    /* bitsize */
1175
         TRUE,                  /* pc_relative */
1176
         0,                      /* bitpos */
1177
         complain_overflow_dont,/* complain_on_overflow */
1178
         bfd_elf_generic_reloc, /* special_function */
1179
         "R_ARM_LDR_SB_G2",     /* name */
1180
         FALSE,                 /* partial_inplace */
1181
         0xffffffff,            /* src_mask */
1182
         0xffffffff,            /* dst_mask */
1183
         TRUE),                 /* pcrel_offset */
1184
 
1185
  HOWTO (R_ARM_LDRS_SB_G0,      /* type */
1186
         0,                      /* rightshift */
1187
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1188
         32,                    /* bitsize */
1189
         TRUE,                  /* pc_relative */
1190
         0,                      /* bitpos */
1191
         complain_overflow_dont,/* complain_on_overflow */
1192
         bfd_elf_generic_reloc, /* special_function */
1193
         "R_ARM_LDRS_SB_G0",    /* name */
1194
         FALSE,                 /* partial_inplace */
1195
         0xffffffff,            /* src_mask */
1196
         0xffffffff,            /* dst_mask */
1197
         TRUE),                 /* pcrel_offset */
1198
 
1199
  HOWTO (R_ARM_LDRS_SB_G1,      /* type */
1200
         0,                      /* rightshift */
1201
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1202
         32,                    /* bitsize */
1203
         TRUE,                  /* pc_relative */
1204
         0,                      /* bitpos */
1205
         complain_overflow_dont,/* complain_on_overflow */
1206
         bfd_elf_generic_reloc, /* special_function */
1207
         "R_ARM_LDRS_SB_G1",    /* name */
1208
         FALSE,                 /* partial_inplace */
1209
         0xffffffff,            /* src_mask */
1210
         0xffffffff,            /* dst_mask */
1211
         TRUE),                 /* pcrel_offset */
1212
 
1213
  HOWTO (R_ARM_LDRS_SB_G2,      /* type */
1214
         0,                      /* rightshift */
1215
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1216
         32,                    /* bitsize */
1217
         TRUE,                  /* pc_relative */
1218
         0,                      /* bitpos */
1219
         complain_overflow_dont,/* complain_on_overflow */
1220
         bfd_elf_generic_reloc, /* special_function */
1221
         "R_ARM_LDRS_SB_G2",    /* name */
1222
         FALSE,                 /* partial_inplace */
1223
         0xffffffff,            /* src_mask */
1224
         0xffffffff,            /* dst_mask */
1225
         TRUE),                 /* pcrel_offset */
1226
 
1227
  HOWTO (R_ARM_LDC_SB_G0,       /* type */
1228
         0,                      /* rightshift */
1229
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1230
         32,                    /* bitsize */
1231
         TRUE,                  /* pc_relative */
1232
         0,                      /* bitpos */
1233
         complain_overflow_dont,/* complain_on_overflow */
1234
         bfd_elf_generic_reloc, /* special_function */
1235
         "R_ARM_LDC_SB_G0",     /* name */
1236
         FALSE,                 /* partial_inplace */
1237
         0xffffffff,            /* src_mask */
1238
         0xffffffff,            /* dst_mask */
1239
         TRUE),                 /* pcrel_offset */
1240
 
1241
  HOWTO (R_ARM_LDC_SB_G1,       /* type */
1242
         0,                      /* rightshift */
1243
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1244
         32,                    /* bitsize */
1245
         TRUE,                  /* pc_relative */
1246
         0,                      /* bitpos */
1247
         complain_overflow_dont,/* complain_on_overflow */
1248
         bfd_elf_generic_reloc, /* special_function */
1249
         "R_ARM_LDC_SB_G1",     /* name */
1250
         FALSE,                 /* partial_inplace */
1251
         0xffffffff,            /* src_mask */
1252
         0xffffffff,            /* dst_mask */
1253
         TRUE),                 /* pcrel_offset */
1254
 
1255
  HOWTO (R_ARM_LDC_SB_G2,       /* type */
1256
         0,                      /* rightshift */
1257
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1258
         32,                    /* bitsize */
1259
         TRUE,                  /* pc_relative */
1260
         0,                      /* bitpos */
1261
         complain_overflow_dont,/* complain_on_overflow */
1262
         bfd_elf_generic_reloc, /* special_function */
1263
         "R_ARM_LDC_SB_G2",     /* name */
1264
         FALSE,                 /* partial_inplace */
1265
         0xffffffff,            /* src_mask */
1266
         0xffffffff,            /* dst_mask */
1267
         TRUE),                 /* pcrel_offset */
1268
 
1269
  /* End of group relocations.  */
1270
 
1271
  HOWTO (R_ARM_MOVW_BREL_NC,    /* type */
1272
         0,                      /* rightshift */
1273
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1274
         16,                    /* bitsize */
1275
         FALSE,                 /* pc_relative */
1276
         0,                      /* bitpos */
1277
         complain_overflow_dont,/* complain_on_overflow */
1278
         bfd_elf_generic_reloc, /* special_function */
1279
         "R_ARM_MOVW_BREL_NC",  /* name */
1280
         FALSE,                 /* partial_inplace */
1281
         0x0000ffff,            /* src_mask */
1282
         0x0000ffff,            /* dst_mask */
1283
         FALSE),                /* pcrel_offset */
1284
 
1285
  HOWTO (R_ARM_MOVT_BREL,       /* type */
1286
         0,                      /* rightshift */
1287
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1288
         16,                    /* bitsize */
1289
         FALSE,                 /* pc_relative */
1290
         0,                      /* bitpos */
1291
         complain_overflow_bitfield,/* complain_on_overflow */
1292
         bfd_elf_generic_reloc, /* special_function */
1293
         "R_ARM_MOVT_BREL",     /* name */
1294
         FALSE,                 /* partial_inplace */
1295
         0x0000ffff,            /* src_mask */
1296
         0x0000ffff,            /* dst_mask */
1297
         FALSE),                /* pcrel_offset */
1298
 
1299
  HOWTO (R_ARM_MOVW_BREL,       /* type */
1300
         0,                      /* rightshift */
1301
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1302
         16,                    /* bitsize */
1303
         FALSE,                 /* pc_relative */
1304
         0,                      /* bitpos */
1305
         complain_overflow_dont,/* complain_on_overflow */
1306
         bfd_elf_generic_reloc, /* special_function */
1307
         "R_ARM_MOVW_BREL",     /* name */
1308
         FALSE,                 /* partial_inplace */
1309
         0x0000ffff,            /* src_mask */
1310
         0x0000ffff,            /* dst_mask */
1311
         FALSE),                /* pcrel_offset */
1312
 
1313
  HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
1314
         0,                      /* rightshift */
1315
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1316
         16,                    /* bitsize */
1317
         FALSE,                 /* pc_relative */
1318
         0,                      /* bitpos */
1319
         complain_overflow_dont,/* complain_on_overflow */
1320
         bfd_elf_generic_reloc, /* special_function */
1321
         "R_ARM_THM_MOVW_BREL_NC",/* name */
1322
         FALSE,                 /* partial_inplace */
1323
         0x040f70ff,            /* src_mask */
1324
         0x040f70ff,            /* dst_mask */
1325
         FALSE),                /* pcrel_offset */
1326
 
1327
  HOWTO (R_ARM_THM_MOVT_BREL,   /* type */
1328
         0,                      /* rightshift */
1329
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1330
         16,                    /* bitsize */
1331
         FALSE,                 /* pc_relative */
1332
         0,                      /* bitpos */
1333
         complain_overflow_bitfield,/* complain_on_overflow */
1334
         bfd_elf_generic_reloc, /* special_function */
1335
         "R_ARM_THM_MOVT_BREL", /* name */
1336
         FALSE,                 /* partial_inplace */
1337
         0x040f70ff,            /* src_mask */
1338
         0x040f70ff,            /* dst_mask */
1339
         FALSE),                /* pcrel_offset */
1340
 
1341
  HOWTO (R_ARM_THM_MOVW_BREL,   /* type */
1342
         0,                      /* rightshift */
1343
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1344
         16,                    /* bitsize */
1345
         FALSE,                 /* pc_relative */
1346
         0,                      /* bitpos */
1347
         complain_overflow_dont,/* complain_on_overflow */
1348
         bfd_elf_generic_reloc, /* special_function */
1349
         "R_ARM_THM_MOVW_BREL", /* name */
1350
         FALSE,                 /* partial_inplace */
1351
         0x040f70ff,            /* src_mask */
1352
         0x040f70ff,            /* dst_mask */
1353
         FALSE),                /* pcrel_offset */
1354
 
1355
  HOWTO (R_ARM_TLS_GOTDESC,     /* type */
1356
         0,                      /* rightshift */
1357
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1358
         32,                    /* bitsize */
1359
         FALSE,                 /* pc_relative */
1360
         0,                      /* bitpos */
1361
         complain_overflow_bitfield,/* complain_on_overflow */
1362
         NULL,                  /* special_function */
1363
         "R_ARM_TLS_GOTDESC",   /* name */
1364
         TRUE,                  /* partial_inplace */
1365
         0xffffffff,            /* src_mask */
1366
         0xffffffff,            /* dst_mask */
1367
         FALSE),                /* pcrel_offset */
1368
 
1369
  HOWTO (R_ARM_TLS_CALL,        /* type */
1370
         0,                      /* rightshift */
1371
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1372
         24,                    /* bitsize */
1373
         FALSE,                 /* pc_relative */
1374
         0,                      /* bitpos */
1375
         complain_overflow_dont,/* complain_on_overflow */
1376
         bfd_elf_generic_reloc, /* special_function */
1377
         "R_ARM_TLS_CALL",      /* name */
1378
         FALSE,                 /* partial_inplace */
1379
         0x00ffffff,            /* src_mask */
1380
         0x00ffffff,            /* dst_mask */
1381
         FALSE),                /* pcrel_offset */
1382
 
1383
  HOWTO (R_ARM_TLS_DESCSEQ,     /* type */
1384
         0,                      /* rightshift */
1385
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1386
         0,                      /* bitsize */
1387
         FALSE,                 /* pc_relative */
1388
         0,                      /* bitpos */
1389
         complain_overflow_bitfield,/* complain_on_overflow */
1390
         bfd_elf_generic_reloc, /* special_function */
1391
         "R_ARM_TLS_DESCSEQ",   /* name */
1392
         FALSE,                 /* partial_inplace */
1393
         0x00000000,            /* src_mask */
1394
         0x00000000,            /* dst_mask */
1395
         FALSE),                /* pcrel_offset */
1396
 
1397
  HOWTO (R_ARM_THM_TLS_CALL,    /* type */
1398
         0,                      /* rightshift */
1399
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1400
         24,                    /* bitsize */
1401
         FALSE,                 /* pc_relative */
1402
         0,                      /* bitpos */
1403
         complain_overflow_dont,/* complain_on_overflow */
1404
         bfd_elf_generic_reloc, /* special_function */
1405
         "R_ARM_THM_TLS_CALL",  /* name */
1406
         FALSE,                 /* partial_inplace */
1407
         0x07ff07ff,            /* src_mask */
1408
         0x07ff07ff,            /* dst_mask */
1409
         FALSE),                /* pcrel_offset */
1410
 
1411
  HOWTO (R_ARM_PLT32_ABS,       /* type */
1412
         0,                      /* rightshift */
1413
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1414
         32,                    /* bitsize */
1415
         FALSE,                 /* pc_relative */
1416
         0,                      /* bitpos */
1417
         complain_overflow_dont,/* complain_on_overflow */
1418
         bfd_elf_generic_reloc, /* special_function */
1419
         "R_ARM_PLT32_ABS",     /* name */
1420
         FALSE,                 /* partial_inplace */
1421
         0xffffffff,            /* src_mask */
1422
         0xffffffff,            /* dst_mask */
1423
         FALSE),                /* pcrel_offset */
1424
 
1425
  HOWTO (R_ARM_GOT_ABS,         /* type */
1426
         0,                      /* rightshift */
1427
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1428
         32,                    /* bitsize */
1429
         FALSE,                 /* pc_relative */
1430
         0,                      /* bitpos */
1431
         complain_overflow_dont,/* complain_on_overflow */
1432
         bfd_elf_generic_reloc, /* special_function */
1433
         "R_ARM_GOT_ABS",       /* name */
1434
         FALSE,                 /* partial_inplace */
1435
         0xffffffff,            /* src_mask */
1436
         0xffffffff,            /* dst_mask */
1437
         FALSE),                        /* pcrel_offset */
1438
 
1439
  HOWTO (R_ARM_GOT_PREL,        /* type */
1440
         0,                      /* rightshift */
1441
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1442
         32,                    /* bitsize */
1443
         TRUE,                  /* pc_relative */
1444
         0,                      /* bitpos */
1445
         complain_overflow_dont,        /* complain_on_overflow */
1446
         bfd_elf_generic_reloc, /* special_function */
1447
         "R_ARM_GOT_PREL",      /* name */
1448
         FALSE,                 /* partial_inplace */
1449
         0xffffffff,            /* src_mask */
1450
         0xffffffff,            /* dst_mask */
1451
         TRUE),                 /* pcrel_offset */
1452
 
1453
  HOWTO (R_ARM_GOT_BREL12,      /* type */
1454
         0,                      /* rightshift */
1455
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1456
         12,                    /* bitsize */
1457
         FALSE,                 /* pc_relative */
1458
         0,                      /* bitpos */
1459
         complain_overflow_bitfield,/* complain_on_overflow */
1460
         bfd_elf_generic_reloc, /* special_function */
1461
         "R_ARM_GOT_BREL12",    /* name */
1462
         FALSE,                 /* partial_inplace */
1463
         0x00000fff,            /* src_mask */
1464
         0x00000fff,            /* dst_mask */
1465
         FALSE),                /* pcrel_offset */
1466
 
1467
  HOWTO (R_ARM_GOTOFF12,        /* type */
1468
         0,                      /* rightshift */
1469
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1470
         12,                    /* bitsize */
1471
         FALSE,                 /* pc_relative */
1472
         0,                      /* bitpos */
1473
         complain_overflow_bitfield,/* complain_on_overflow */
1474
         bfd_elf_generic_reloc, /* special_function */
1475
         "R_ARM_GOTOFF12",      /* name */
1476
         FALSE,                 /* partial_inplace */
1477
         0x00000fff,            /* src_mask */
1478
         0x00000fff,            /* dst_mask */
1479
         FALSE),                /* pcrel_offset */
1480
 
1481
  EMPTY_HOWTO (R_ARM_GOTRELAX),  /* reserved for future GOT-load optimizations */
1482
 
1483
  /* GNU extension to record C++ vtable member usage */
1484
  HOWTO (R_ARM_GNU_VTENTRY,     /* type */
1485
         0,                     /* rightshift */
1486
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1487
         0,                     /* bitsize */
1488
         FALSE,                 /* pc_relative */
1489
         0,                     /* bitpos */
1490
         complain_overflow_dont, /* complain_on_overflow */
1491
         _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
1492
         "R_ARM_GNU_VTENTRY",   /* name */
1493
         FALSE,                 /* partial_inplace */
1494
         0,                     /* src_mask */
1495
         0,                     /* dst_mask */
1496
         FALSE),                /* pcrel_offset */
1497
 
1498
  /* GNU extension to record C++ vtable hierarchy */
1499
  HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1500
         0,                     /* rightshift */
1501
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1502
         0,                     /* bitsize */
1503
         FALSE,                 /* pc_relative */
1504
         0,                     /* bitpos */
1505
         complain_overflow_dont, /* complain_on_overflow */
1506
         NULL,                  /* special_function */
1507
         "R_ARM_GNU_VTINHERIT", /* name */
1508
         FALSE,                 /* partial_inplace */
1509
         0,                     /* src_mask */
1510
         0,                     /* dst_mask */
1511
         FALSE),                /* pcrel_offset */
1512
 
1513
  HOWTO (R_ARM_THM_JUMP11,      /* type */
1514
         1,                     /* rightshift */
1515
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1516
         11,                    /* bitsize */
1517
         TRUE,                  /* pc_relative */
1518
         0,                      /* bitpos */
1519
         complain_overflow_signed,      /* complain_on_overflow */
1520
         bfd_elf_generic_reloc, /* special_function */
1521
         "R_ARM_THM_JUMP11",    /* name */
1522
         FALSE,                 /* partial_inplace */
1523
         0x000007ff,            /* src_mask */
1524
         0x000007ff,            /* dst_mask */
1525
         TRUE),                 /* pcrel_offset */
1526
 
1527
  HOWTO (R_ARM_THM_JUMP8,       /* type */
1528
         1,                     /* rightshift */
1529
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1530
         8,                     /* bitsize */
1531
         TRUE,                  /* pc_relative */
1532
         0,                      /* bitpos */
1533
         complain_overflow_signed,      /* complain_on_overflow */
1534
         bfd_elf_generic_reloc, /* special_function */
1535
         "R_ARM_THM_JUMP8",     /* name */
1536
         FALSE,                 /* partial_inplace */
1537
         0x000000ff,            /* src_mask */
1538
         0x000000ff,            /* dst_mask */
1539
         TRUE),                 /* pcrel_offset */
1540
 
1541
  /* TLS relocations */
1542
  HOWTO (R_ARM_TLS_GD32,        /* type */
1543
         0,                     /* rightshift */
1544
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1545
         32,                    /* bitsize */
1546
         FALSE,                 /* pc_relative */
1547
         0,                     /* bitpos */
1548
         complain_overflow_bitfield,/* complain_on_overflow */
1549
         NULL,                  /* special_function */
1550
         "R_ARM_TLS_GD32",      /* name */
1551
         TRUE,                  /* partial_inplace */
1552
         0xffffffff,            /* src_mask */
1553
         0xffffffff,            /* dst_mask */
1554
         FALSE),                /* pcrel_offset */
1555
 
1556
  HOWTO (R_ARM_TLS_LDM32,       /* type */
1557
         0,                     /* rightshift */
1558
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1559
         32,                    /* bitsize */
1560
         FALSE,                 /* pc_relative */
1561
         0,                     /* bitpos */
1562
         complain_overflow_bitfield,/* complain_on_overflow */
1563
         bfd_elf_generic_reloc, /* special_function */
1564
         "R_ARM_TLS_LDM32",     /* name */
1565
         TRUE,                  /* partial_inplace */
1566
         0xffffffff,            /* src_mask */
1567
         0xffffffff,            /* dst_mask */
1568
         FALSE),                /* pcrel_offset */
1569
 
1570
  HOWTO (R_ARM_TLS_LDO32,       /* type */
1571
         0,                     /* rightshift */
1572
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1573
         32,                    /* bitsize */
1574
         FALSE,                 /* pc_relative */
1575
         0,                     /* bitpos */
1576
         complain_overflow_bitfield,/* complain_on_overflow */
1577
         bfd_elf_generic_reloc, /* special_function */
1578
         "R_ARM_TLS_LDO32",     /* name */
1579
         TRUE,                  /* partial_inplace */
1580
         0xffffffff,            /* src_mask */
1581
         0xffffffff,            /* dst_mask */
1582
         FALSE),                /* pcrel_offset */
1583
 
1584
  HOWTO (R_ARM_TLS_IE32,        /* type */
1585
         0,                     /* rightshift */
1586
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1587
         32,                    /* bitsize */
1588
         FALSE,                  /* pc_relative */
1589
         0,                     /* bitpos */
1590
         complain_overflow_bitfield,/* complain_on_overflow */
1591
         NULL,                  /* special_function */
1592
         "R_ARM_TLS_IE32",      /* name */
1593
         TRUE,                  /* partial_inplace */
1594
         0xffffffff,            /* src_mask */
1595
         0xffffffff,            /* dst_mask */
1596
         FALSE),                /* pcrel_offset */
1597
 
1598
  HOWTO (R_ARM_TLS_LE32,        /* type */
1599
         0,                     /* rightshift */
1600
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1601
         32,                    /* bitsize */
1602
         FALSE,                 /* pc_relative */
1603
         0,                     /* bitpos */
1604
         complain_overflow_bitfield,/* complain_on_overflow */
1605
         bfd_elf_generic_reloc, /* special_function */
1606
         "R_ARM_TLS_LE32",      /* name */
1607
         TRUE,                  /* partial_inplace */
1608
         0xffffffff,            /* src_mask */
1609
         0xffffffff,            /* dst_mask */
1610
         FALSE),                /* pcrel_offset */
1611
 
1612
  HOWTO (R_ARM_TLS_LDO12,       /* type */
1613
         0,                      /* rightshift */
1614
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1615
         12,                    /* bitsize */
1616
         FALSE,                 /* pc_relative */
1617
         0,                      /* bitpos */
1618
         complain_overflow_bitfield,/* complain_on_overflow */
1619
         bfd_elf_generic_reloc, /* special_function */
1620
         "R_ARM_TLS_LDO12",     /* name */
1621
         FALSE,                 /* partial_inplace */
1622
         0x00000fff,            /* src_mask */
1623
         0x00000fff,            /* dst_mask */
1624
         FALSE),                /* pcrel_offset */
1625
 
1626
  HOWTO (R_ARM_TLS_LE12,        /* type */
1627
         0,                      /* rightshift */
1628
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1629
         12,                    /* bitsize */
1630
         FALSE,                 /* pc_relative */
1631
         0,                      /* bitpos */
1632
         complain_overflow_bitfield,/* complain_on_overflow */
1633
         bfd_elf_generic_reloc, /* special_function */
1634
         "R_ARM_TLS_LE12",      /* name */
1635
         FALSE,                 /* partial_inplace */
1636
         0x00000fff,            /* src_mask */
1637
         0x00000fff,            /* dst_mask */
1638
         FALSE),                /* pcrel_offset */
1639
 
1640
  HOWTO (R_ARM_TLS_IE12GP,      /* type */
1641
         0,                      /* rightshift */
1642
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1643
         12,                    /* bitsize */
1644
         FALSE,                 /* pc_relative */
1645
         0,                      /* bitpos */
1646
         complain_overflow_bitfield,/* complain_on_overflow */
1647
         bfd_elf_generic_reloc, /* special_function */
1648
         "R_ARM_TLS_IE12GP",    /* name */
1649
         FALSE,                 /* partial_inplace */
1650
         0x00000fff,            /* src_mask */
1651
         0x00000fff,            /* dst_mask */
1652
         FALSE),                /* pcrel_offset */
1653
 
1654
  /* 112-127 private relocations.  */
1655
  EMPTY_HOWTO (112),
1656
  EMPTY_HOWTO (113),
1657
  EMPTY_HOWTO (114),
1658
  EMPTY_HOWTO (115),
1659
  EMPTY_HOWTO (116),
1660
  EMPTY_HOWTO (117),
1661
  EMPTY_HOWTO (118),
1662
  EMPTY_HOWTO (119),
1663
  EMPTY_HOWTO (120),
1664
  EMPTY_HOWTO (121),
1665
  EMPTY_HOWTO (122),
1666
  EMPTY_HOWTO (123),
1667
  EMPTY_HOWTO (124),
1668
  EMPTY_HOWTO (125),
1669
  EMPTY_HOWTO (126),
1670
  EMPTY_HOWTO (127),
1671
 
1672
  /* R_ARM_ME_TOO, obsolete.  */
1673
  EMPTY_HOWTO (128),
1674
 
1675
  HOWTO (R_ARM_THM_TLS_DESCSEQ, /* type */
1676
         0,                      /* rightshift */
1677
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1678
         0,                      /* bitsize */
1679
         FALSE,                 /* pc_relative */
1680
         0,                      /* bitpos */
1681
         complain_overflow_bitfield,/* complain_on_overflow */
1682
         bfd_elf_generic_reloc, /* special_function */
1683
         "R_ARM_THM_TLS_DESCSEQ",/* name */
1684
         FALSE,                 /* partial_inplace */
1685
         0x00000000,            /* src_mask */
1686
         0x00000000,            /* dst_mask */
1687
         FALSE),                /* pcrel_offset */
1688
};
1689
 
1690
/* 160 onwards: */
1691
static reloc_howto_type elf32_arm_howto_table_2[1] =
1692
{
1693
  HOWTO (R_ARM_IRELATIVE,       /* type */
1694
         0,                     /* rightshift */
1695
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1696
         32,                    /* bitsize */
1697
         FALSE,                 /* pc_relative */
1698
         0,                     /* bitpos */
1699
         complain_overflow_bitfield,/* complain_on_overflow */
1700
         bfd_elf_generic_reloc, /* special_function */
1701
         "R_ARM_IRELATIVE",     /* name */
1702
         TRUE,                  /* partial_inplace */
1703
         0xffffffff,            /* src_mask */
1704
         0xffffffff,            /* dst_mask */
1705
         FALSE)                 /* pcrel_offset */
1706
};
1707
 
1708
/* 249-255 extended, currently unused, relocations:  */
1709
static reloc_howto_type elf32_arm_howto_table_3[4] =
1710
{
1711
  HOWTO (R_ARM_RREL32,          /* type */
1712
         0,                      /* rightshift */
1713
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1714
         0,                      /* bitsize */
1715
         FALSE,                 /* pc_relative */
1716
         0,                      /* bitpos */
1717
         complain_overflow_dont,/* complain_on_overflow */
1718
         bfd_elf_generic_reloc, /* special_function */
1719
         "R_ARM_RREL32",        /* name */
1720
         FALSE,                 /* partial_inplace */
1721
         0,                      /* src_mask */
1722
         0,                      /* dst_mask */
1723
         FALSE),                /* pcrel_offset */
1724
 
1725
  HOWTO (R_ARM_RABS32,          /* type */
1726
         0,                      /* rightshift */
1727
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1728
         0,                      /* bitsize */
1729
         FALSE,                 /* pc_relative */
1730
         0,                      /* bitpos */
1731
         complain_overflow_dont,/* complain_on_overflow */
1732
         bfd_elf_generic_reloc, /* special_function */
1733
         "R_ARM_RABS32",        /* name */
1734
         FALSE,                 /* partial_inplace */
1735
         0,                      /* src_mask */
1736
         0,                      /* dst_mask */
1737
         FALSE),                /* pcrel_offset */
1738
 
1739
  HOWTO (R_ARM_RPC24,           /* type */
1740
         0,                      /* rightshift */
1741
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1742
         0,                      /* bitsize */
1743
         FALSE,                 /* pc_relative */
1744
         0,                      /* bitpos */
1745
         complain_overflow_dont,/* complain_on_overflow */
1746
         bfd_elf_generic_reloc, /* special_function */
1747
         "R_ARM_RPC24",         /* name */
1748
         FALSE,                 /* partial_inplace */
1749
         0,                      /* src_mask */
1750
         0,                      /* dst_mask */
1751
         FALSE),                /* pcrel_offset */
1752
 
1753
  HOWTO (R_ARM_RBASE,           /* type */
1754
         0,                      /* rightshift */
1755
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1756
         0,                      /* bitsize */
1757
         FALSE,                 /* pc_relative */
1758
         0,                      /* bitpos */
1759
         complain_overflow_dont,/* complain_on_overflow */
1760
         bfd_elf_generic_reloc, /* special_function */
1761
         "R_ARM_RBASE",         /* name */
1762
         FALSE,                 /* partial_inplace */
1763
         0,                      /* src_mask */
1764
         0,                      /* dst_mask */
1765
         FALSE)                 /* pcrel_offset */
1766
};
1767
 
1768
static reloc_howto_type *
1769
elf32_arm_howto_from_type (unsigned int r_type)
1770
{
1771
  if (r_type < ARRAY_SIZE (elf32_arm_howto_table_1))
1772
    return &elf32_arm_howto_table_1[r_type];
1773
 
1774
  if (r_type == R_ARM_IRELATIVE)
1775
    return &elf32_arm_howto_table_2[r_type - R_ARM_IRELATIVE];
1776
 
1777
  if (r_type >= R_ARM_RREL32
1778
      && r_type < R_ARM_RREL32 + ARRAY_SIZE (elf32_arm_howto_table_3))
1779
    return &elf32_arm_howto_table_3[r_type - R_ARM_RREL32];
1780
 
1781
  return NULL;
1782
}
1783
 
1784
static void
1785
elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
1786
                         Elf_Internal_Rela * elf_reloc)
1787
{
1788
  unsigned int r_type;
1789
 
1790
  r_type = ELF32_R_TYPE (elf_reloc->r_info);
1791
  bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
1792
}
1793
 
1794
struct elf32_arm_reloc_map
1795
  {
1796
    bfd_reloc_code_real_type  bfd_reloc_val;
1797
    unsigned char             elf_reloc_val;
1798
  };
1799
 
1800
/* All entries in this list must also be present in elf32_arm_howto_table.  */
1801
static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1802
  {
1803
    {BFD_RELOC_NONE,                 R_ARM_NONE},
1804
    {BFD_RELOC_ARM_PCREL_BRANCH,     R_ARM_PC24},
1805
    {BFD_RELOC_ARM_PCREL_CALL,       R_ARM_CALL},
1806
    {BFD_RELOC_ARM_PCREL_JUMP,       R_ARM_JUMP24},
1807
    {BFD_RELOC_ARM_PCREL_BLX,        R_ARM_XPC25},
1808
    {BFD_RELOC_THUMB_PCREL_BLX,      R_ARM_THM_XPC22},
1809
    {BFD_RELOC_32,                   R_ARM_ABS32},
1810
    {BFD_RELOC_32_PCREL,             R_ARM_REL32},
1811
    {BFD_RELOC_8,                    R_ARM_ABS8},
1812
    {BFD_RELOC_16,                   R_ARM_ABS16},
1813
    {BFD_RELOC_ARM_OFFSET_IMM,       R_ARM_ABS12},
1814
    {BFD_RELOC_ARM_THUMB_OFFSET,     R_ARM_THM_ABS5},
1815
    {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1816
    {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1817
    {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1818
    {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1819
    {BFD_RELOC_THUMB_PCREL_BRANCH9,  R_ARM_THM_JUMP8},
1820
    {BFD_RELOC_THUMB_PCREL_BRANCH7,  R_ARM_THM_JUMP6},
1821
    {BFD_RELOC_ARM_GLOB_DAT,         R_ARM_GLOB_DAT},
1822
    {BFD_RELOC_ARM_JUMP_SLOT,        R_ARM_JUMP_SLOT},
1823
    {BFD_RELOC_ARM_RELATIVE,         R_ARM_RELATIVE},
1824
    {BFD_RELOC_ARM_GOTOFF,           R_ARM_GOTOFF32},
1825
    {BFD_RELOC_ARM_GOTPC,            R_ARM_GOTPC},
1826
    {BFD_RELOC_ARM_GOT_PREL,         R_ARM_GOT_PREL},
1827
    {BFD_RELOC_ARM_GOT32,            R_ARM_GOT32},
1828
    {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1829
    {BFD_RELOC_ARM_TARGET1,          R_ARM_TARGET1},
1830
    {BFD_RELOC_ARM_ROSEGREL32,       R_ARM_ROSEGREL32},
1831
    {BFD_RELOC_ARM_SBREL32,          R_ARM_SBREL32},
1832
    {BFD_RELOC_ARM_PREL31,           R_ARM_PREL31},
1833
    {BFD_RELOC_ARM_TARGET2,          R_ARM_TARGET2},
1834
    {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1835
    {BFD_RELOC_ARM_TLS_GOTDESC,      R_ARM_TLS_GOTDESC},
1836
    {BFD_RELOC_ARM_TLS_CALL,         R_ARM_TLS_CALL},
1837
    {BFD_RELOC_ARM_THM_TLS_CALL,     R_ARM_THM_TLS_CALL},
1838
    {BFD_RELOC_ARM_TLS_DESCSEQ,      R_ARM_TLS_DESCSEQ},
1839
    {BFD_RELOC_ARM_THM_TLS_DESCSEQ,  R_ARM_THM_TLS_DESCSEQ},
1840
    {BFD_RELOC_ARM_TLS_DESC,         R_ARM_TLS_DESC},
1841
    {BFD_RELOC_ARM_TLS_GD32,         R_ARM_TLS_GD32},
1842
    {BFD_RELOC_ARM_TLS_LDO32,        R_ARM_TLS_LDO32},
1843
    {BFD_RELOC_ARM_TLS_LDM32,        R_ARM_TLS_LDM32},
1844
    {BFD_RELOC_ARM_TLS_DTPMOD32,     R_ARM_TLS_DTPMOD32},
1845
    {BFD_RELOC_ARM_TLS_DTPOFF32,     R_ARM_TLS_DTPOFF32},
1846
    {BFD_RELOC_ARM_TLS_TPOFF32,      R_ARM_TLS_TPOFF32},
1847
    {BFD_RELOC_ARM_TLS_IE32,         R_ARM_TLS_IE32},
1848
    {BFD_RELOC_ARM_TLS_LE32,         R_ARM_TLS_LE32},
1849
    {BFD_RELOC_ARM_IRELATIVE,        R_ARM_IRELATIVE},
1850
    {BFD_RELOC_VTABLE_INHERIT,       R_ARM_GNU_VTINHERIT},
1851
    {BFD_RELOC_VTABLE_ENTRY,         R_ARM_GNU_VTENTRY},
1852
    {BFD_RELOC_ARM_MOVW,             R_ARM_MOVW_ABS_NC},
1853
    {BFD_RELOC_ARM_MOVT,             R_ARM_MOVT_ABS},
1854
    {BFD_RELOC_ARM_MOVW_PCREL,       R_ARM_MOVW_PREL_NC},
1855
    {BFD_RELOC_ARM_MOVT_PCREL,       R_ARM_MOVT_PREL},
1856
    {BFD_RELOC_ARM_THUMB_MOVW,       R_ARM_THM_MOVW_ABS_NC},
1857
    {BFD_RELOC_ARM_THUMB_MOVT,       R_ARM_THM_MOVT_ABS},
1858
    {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
1859
    {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
1860
    {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
1861
    {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
1862
    {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
1863
    {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
1864
    {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
1865
    {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
1866
    {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
1867
    {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
1868
    {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
1869
    {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
1870
    {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
1871
    {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
1872
    {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
1873
    {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
1874
    {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
1875
    {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
1876
    {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
1877
    {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
1878
    {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
1879
    {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
1880
    {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
1881
    {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
1882
    {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
1883
    {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
1884
    {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
1885
    {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
1886
    {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
1887
    {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2},
1888
    {BFD_RELOC_ARM_V4BX,             R_ARM_V4BX}
1889
  };
1890
 
1891
static reloc_howto_type *
1892
elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1893
                             bfd_reloc_code_real_type code)
1894
{
1895
  unsigned int i;
1896
 
1897
  for (i = 0; i < ARRAY_SIZE (elf32_arm_reloc_map); i ++)
1898
    if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
1899
      return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
1900
 
1901
  return NULL;
1902
}
1903
 
1904
static reloc_howto_type *
1905
elf32_arm_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1906
                             const char *r_name)
1907
{
1908
  unsigned int i;
1909
 
1910
  for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_1); i++)
1911
    if (elf32_arm_howto_table_1[i].name != NULL
1912
        && strcasecmp (elf32_arm_howto_table_1[i].name, r_name) == 0)
1913
      return &elf32_arm_howto_table_1[i];
1914
 
1915
  for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_2); i++)
1916
    if (elf32_arm_howto_table_2[i].name != NULL
1917
        && strcasecmp (elf32_arm_howto_table_2[i].name, r_name) == 0)
1918
      return &elf32_arm_howto_table_2[i];
1919
 
1920
  for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_3); i++)
1921
    if (elf32_arm_howto_table_3[i].name != NULL
1922
        && strcasecmp (elf32_arm_howto_table_3[i].name, r_name) == 0)
1923
      return &elf32_arm_howto_table_3[i];
1924
 
1925
  return NULL;
1926
}
1927
 
1928
/* Support for core dump NOTE sections.  */
1929
 
1930
static bfd_boolean
1931
elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1932
{
1933
  int offset;
1934
  size_t size;
1935
 
1936
  switch (note->descsz)
1937
    {
1938
      default:
1939
        return FALSE;
1940
 
1941
      case 148:         /* Linux/ARM 32-bit.  */
1942
        /* pr_cursig */
1943
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1944
 
1945
        /* pr_pid */
1946
        elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
1947
 
1948
        /* pr_reg */
1949
        offset = 72;
1950
        size = 72;
1951
 
1952
        break;
1953
    }
1954
 
1955
  /* Make a ".reg/999" section.  */
1956
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1957
                                          size, note->descpos + offset);
1958
}
1959
 
1960
static bfd_boolean
1961
elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1962
{
1963
  switch (note->descsz)
1964
    {
1965
      default:
1966
        return FALSE;
1967
 
1968
      case 124:         /* Linux/ARM elf_prpsinfo.  */
1969
        elf_tdata (abfd)->core_program
1970
         = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1971
        elf_tdata (abfd)->core_command
1972
         = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1973
    }
1974
 
1975
  /* Note that for some reason, a spurious space is tacked
1976
     onto the end of the args in some (at least one anyway)
1977
     implementations, so strip it off if it exists.  */
1978
  {
1979
    char *command = elf_tdata (abfd)->core_command;
1980
    int n = strlen (command);
1981
 
1982
    if (0 < n && command[n - 1] == ' ')
1983
      command[n - 1] = '\0';
1984
  }
1985
 
1986
  return TRUE;
1987
}
1988
 
1989
#define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vec
1990
#define TARGET_LITTLE_NAME              "elf32-littlearm"
1991
#define TARGET_BIG_SYM                  bfd_elf32_bigarm_vec
1992
#define TARGET_BIG_NAME                 "elf32-bigarm"
1993
 
1994
#define elf_backend_grok_prstatus       elf32_arm_nabi_grok_prstatus
1995
#define elf_backend_grok_psinfo         elf32_arm_nabi_grok_psinfo
1996
 
1997
typedef unsigned long int insn32;
1998
typedef unsigned short int insn16;
1999
 
2000
/* In lieu of proper flags, assume all EABIv4 or later objects are
2001
   interworkable.  */
2002
#define INTERWORK_FLAG(abfd)  \
2003
  (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
2004
  || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK) \
2005
  || ((abfd)->flags & BFD_LINKER_CREATED))
2006
 
2007
/* The linker script knows the section names for placement.
2008
   The entry_names are used to do simple name mangling on the stubs.
2009
   Given a function name, and its type, the stub can be found. The
2010
   name can be changed. The only requirement is the %s be present.  */
2011
#define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
2012
#define THUMB2ARM_GLUE_ENTRY_NAME   "__%s_from_thumb"
2013
 
2014
#define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
2015
#define ARM2THUMB_GLUE_ENTRY_NAME   "__%s_from_arm"
2016
 
2017
#define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
2018
#define VFP11_ERRATUM_VENEER_ENTRY_NAME   "__vfp11_veneer_%x"
2019
 
2020
#define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
2021
#define ARM_BX_GLUE_ENTRY_NAME   "__bx_r%d"
2022
 
2023
#define STUB_ENTRY_NAME   "__%s_veneer"
2024
 
2025
/* The name of the dynamic interpreter.  This is put in the .interp
2026
   section.  */
2027
#define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
2028
 
2029
static const unsigned long tls_trampoline [] =
2030
  {
2031
    0xe08e0000,         /* add r0, lr, r0 */
2032
    0xe5901004,         /* ldr r1, [r0,#4] */
2033
    0xe12fff11,         /* bx  r1 */
2034
  };
2035
 
2036
static const unsigned long dl_tlsdesc_lazy_trampoline [] =
2037
  {
2038
    0xe52d2004, /*      push    {r2}                    */
2039
    0xe59f200c, /*      ldr     r2, [pc, #3f - . - 8]   */
2040
    0xe59f100c, /*      ldr     r1, [pc, #4f - . - 8]   */
2041
    0xe79f2002, /* 1:   ldr     r2, [pc, r2]            */
2042
    0xe081100f, /* 2:   add     r1, pc                  */
2043
    0xe12fff12, /*      bx      r2                      */
2044
    0x00000014, /* 3:   .word  _GLOBAL_OFFSET_TABLE_ - 1b - 8
2045
                                + dl_tlsdesc_lazy_resolver(GOT)   */
2046
    0x00000018, /* 4:   .word  _GLOBAL_OFFSET_TABLE_ - 2b - 8 */
2047
  };
2048
 
2049
#ifdef FOUR_WORD_PLT
2050
 
2051
/* The first entry in a procedure linkage table looks like
2052
   this.  It is set up so that any shared library function that is
2053
   called before the relocation has been set up calls the dynamic
2054
   linker first.  */
2055
static const bfd_vma elf32_arm_plt0_entry [] =
2056
  {
2057
    0xe52de004,         /* str   lr, [sp, #-4]! */
2058
    0xe59fe010,         /* ldr   lr, [pc, #16]  */
2059
    0xe08fe00e,         /* add   lr, pc, lr     */
2060
    0xe5bef008,         /* ldr   pc, [lr, #8]!  */
2061
  };
2062
 
2063
/* Subsequent entries in a procedure linkage table look like
2064
   this.  */
2065
static const bfd_vma elf32_arm_plt_entry [] =
2066
  {
2067
    0xe28fc600,         /* add   ip, pc, #NN    */
2068
    0xe28cca00,         /* add   ip, ip, #NN    */
2069
    0xe5bcf000,         /* ldr   pc, [ip, #NN]! */
2070
    0x00000000,         /* unused               */
2071
  };
2072
 
2073
#else
2074
 
2075
/* The first entry in a procedure linkage table looks like
2076
   this.  It is set up so that any shared library function that is
2077
   called before the relocation has been set up calls the dynamic
2078
   linker first.  */
2079
static const bfd_vma elf32_arm_plt0_entry [] =
2080
  {
2081
    0xe52de004,         /* str   lr, [sp, #-4]! */
2082
    0xe59fe004,         /* ldr   lr, [pc, #4]   */
2083
    0xe08fe00e,         /* add   lr, pc, lr     */
2084
    0xe5bef008,         /* ldr   pc, [lr, #8]!  */
2085
    0x00000000,         /* &GOT[0] - .          */
2086
  };
2087
 
2088
/* Subsequent entries in a procedure linkage table look like
2089
   this.  */
2090
static const bfd_vma elf32_arm_plt_entry [] =
2091
  {
2092
    0xe28fc600,         /* add   ip, pc, #0xNN00000 */
2093
    0xe28cca00,         /* add   ip, ip, #0xNN000   */
2094
    0xe5bcf000,         /* ldr   pc, [ip, #0xNNN]!  */
2095
  };
2096
 
2097
#endif
2098
 
2099
/* The format of the first entry in the procedure linkage table
2100
   for a VxWorks executable.  */
2101
static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
2102
  {
2103
    0xe52dc008,         /* str    ip,[sp,#-8]!                  */
2104
    0xe59fc000,         /* ldr    ip,[pc]                       */
2105
    0xe59cf008,         /* ldr    pc,[ip,#8]                    */
2106
    0x00000000,         /* .long  _GLOBAL_OFFSET_TABLE_         */
2107
  };
2108
 
2109
/* The format of subsequent entries in a VxWorks executable.  */
2110
static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
2111
  {
2112
    0xe59fc000,         /* ldr    ip,[pc]                       */
2113
    0xe59cf000,         /* ldr    pc,[ip]                       */
2114
    0x00000000,         /* .long  @got                          */
2115
    0xe59fc000,         /* ldr    ip,[pc]                       */
2116
    0xea000000,         /* b      _PLT                          */
2117
    0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)  */
2118
  };
2119
 
2120
/* The format of entries in a VxWorks shared library.  */
2121
static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
2122
  {
2123
    0xe59fc000,         /* ldr    ip,[pc]                       */
2124
    0xe79cf009,         /* ldr    pc,[ip,r9]                    */
2125
    0x00000000,         /* .long  @got                          */
2126
    0xe59fc000,         /* ldr    ip,[pc]                       */
2127
    0xe599f008,         /* ldr    pc,[r9,#8]                    */
2128
    0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)  */
2129
  };
2130
 
2131
/* An initial stub used if the PLT entry is referenced from Thumb code.  */
2132
#define PLT_THUMB_STUB_SIZE 4
2133
static const bfd_vma elf32_arm_plt_thumb_stub [] =
2134
  {
2135
    0x4778,             /* bx pc */
2136
    0x46c0              /* nop   */
2137
  };
2138
 
2139
/* The entries in a PLT when using a DLL-based target with multiple
2140
   address spaces.  */
2141
static const bfd_vma elf32_arm_symbian_plt_entry [] =
2142
  {
2143
    0xe51ff004,         /* ldr   pc, [pc, #-4] */
2144
    0x00000000,         /* dcd   R_ARM_GLOB_DAT(X) */
2145
  };
2146
 
2147
#define ARM_MAX_FWD_BRANCH_OFFSET  ((((1 << 23) - 1) << 2) + 8)
2148
#define ARM_MAX_BWD_BRANCH_OFFSET  ((-((1 << 23) << 2)) + 8)
2149
#define THM_MAX_FWD_BRANCH_OFFSET  ((1 << 22) -2 + 4)
2150
#define THM_MAX_BWD_BRANCH_OFFSET  (-(1 << 22) + 4)
2151
#define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4)
2152
#define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
2153
 
2154
enum stub_insn_type
2155
  {
2156
    THUMB16_TYPE = 1,
2157
    THUMB32_TYPE,
2158
    ARM_TYPE,
2159
    DATA_TYPE
2160
  };
2161
 
2162
#define THUMB16_INSN(X)         {(X), THUMB16_TYPE, R_ARM_NONE, 0}
2163
/* A bit of a hack.  A Thumb conditional branch, in which the proper condition
2164
   is inserted in arm_build_one_stub().  */
2165
#define THUMB16_BCOND_INSN(X)   {(X), THUMB16_TYPE, R_ARM_NONE, 1}
2166
#define THUMB32_INSN(X)         {(X), THUMB32_TYPE, R_ARM_NONE, 0}
2167
#define THUMB32_B_INSN(X, Z)    {(X), THUMB32_TYPE, R_ARM_THM_JUMP24, (Z)}
2168
#define ARM_INSN(X)             {(X), ARM_TYPE, R_ARM_NONE, 0}
2169
#define ARM_REL_INSN(X, Z)      {(X), ARM_TYPE, R_ARM_JUMP24, (Z)}
2170
#define DATA_WORD(X,Y,Z)        {(X), DATA_TYPE, (Y), (Z)}
2171
 
2172
typedef struct
2173
{
2174
  bfd_vma data;
2175
  enum stub_insn_type type;
2176
  unsigned int r_type;
2177
  int reloc_addend;
2178
}  insn_sequence;
2179
 
2180
/* Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2181
   to reach the stub if necessary.  */
2182
static const insn_sequence elf32_arm_stub_long_branch_any_any[] =
2183
  {
2184
    ARM_INSN(0xe51ff004),            /* ldr   pc, [pc, #-4] */
2185
    DATA_WORD(0, R_ARM_ABS32, 0),    /* dcd   R_ARM_ABS32(X) */
2186
  };
2187
 
2188
/* V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
2189
   available.  */
2190
static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb[] =
2191
  {
2192
    ARM_INSN(0xe59fc000),            /* ldr   ip, [pc, #0] */
2193
    ARM_INSN(0xe12fff1c),            /* bx    ip */
2194
    DATA_WORD(0, R_ARM_ABS32, 0),    /* dcd   R_ARM_ABS32(X) */
2195
  };
2196
 
2197
/* Thumb -> Thumb long branch stub. Used on M-profile architectures.  */
2198
static const insn_sequence elf32_arm_stub_long_branch_thumb_only[] =
2199
  {
2200
    THUMB16_INSN(0xb401),             /* push {r0} */
2201
    THUMB16_INSN(0x4802),             /* ldr  r0, [pc, #8] */
2202
    THUMB16_INSN(0x4684),             /* mov  ip, r0 */
2203
    THUMB16_INSN(0xbc01),             /* pop  {r0} */
2204
    THUMB16_INSN(0x4760),             /* bx   ip */
2205
    THUMB16_INSN(0xbf00),             /* nop */
2206
    DATA_WORD(0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(X) */
2207
  };
2208
 
2209
/* V4T Thumb -> Thumb long branch stub. Using the stack is not
2210
   allowed.  */
2211
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
2212
  {
2213
    THUMB16_INSN(0x4778),             /* bx   pc */
2214
    THUMB16_INSN(0x46c0),             /* nop */
2215
    ARM_INSN(0xe59fc000),             /* ldr  ip, [pc, #0] */
2216
    ARM_INSN(0xe12fff1c),             /* bx   ip */
2217
    DATA_WORD(0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(X) */
2218
  };
2219
 
2220
/* V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
2221
   available.  */
2222
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm[] =
2223
  {
2224
    THUMB16_INSN(0x4778),             /* bx   pc */
2225
    THUMB16_INSN(0x46c0),             /* nop   */
2226
    ARM_INSN(0xe51ff004),             /* ldr   pc, [pc, #-4] */
2227
    DATA_WORD(0, R_ARM_ABS32, 0),     /* dcd   R_ARM_ABS32(X) */
2228
  };
2229
 
2230
/* V4T Thumb -> ARM short branch stub. Shorter variant of the above
2231
   one, when the destination is close enough.  */
2232
static const insn_sequence elf32_arm_stub_short_branch_v4t_thumb_arm[] =
2233
  {
2234
    THUMB16_INSN(0x4778),             /* bx   pc */
2235
    THUMB16_INSN(0x46c0),             /* nop   */
2236
    ARM_REL_INSN(0xea000000, -8),     /* b    (X-8) */
2237
  };
2238
 
2239
/* ARM/Thumb -> ARM long branch stub, PIC.  On V5T and above, use
2240
   blx to reach the stub if necessary.  */
2241
static const insn_sequence elf32_arm_stub_long_branch_any_arm_pic[] =
2242
  {
2243
    ARM_INSN(0xe59fc000),             /* ldr   ip, [pc] */
2244
    ARM_INSN(0xe08ff00c),             /* add   pc, pc, ip */
2245
    DATA_WORD(0, R_ARM_REL32, -4),    /* dcd   R_ARM_REL32(X-4) */
2246
  };
2247
 
2248
/* ARM/Thumb -> Thumb long branch stub, PIC.  On V5T and above, use
2249
   blx to reach the stub if necessary.  We can not add into pc;
2250
   it is not guaranteed to mode switch (different in ARMv6 and
2251
   ARMv7).  */
2252
static const insn_sequence elf32_arm_stub_long_branch_any_thumb_pic[] =
2253
  {
2254
    ARM_INSN(0xe59fc004),             /* ldr   ip, [pc, #4] */
2255
    ARM_INSN(0xe08fc00c),             /* add   ip, pc, ip */
2256
    ARM_INSN(0xe12fff1c),             /* bx    ip */
2257
    DATA_WORD(0, R_ARM_REL32, 0),     /* dcd   R_ARM_REL32(X) */
2258
  };
2259
 
2260
/* V4T ARM -> ARM long branch stub, PIC.  */
2261
static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
2262
  {
2263
    ARM_INSN(0xe59fc004),             /* ldr   ip, [pc, #4] */
2264
    ARM_INSN(0xe08fc00c),             /* add   ip, pc, ip */
2265
    ARM_INSN(0xe12fff1c),             /* bx    ip */
2266
    DATA_WORD(0, R_ARM_REL32, 0),     /* dcd   R_ARM_REL32(X) */
2267
  };
2268
 
2269
/* V4T Thumb -> ARM long branch stub, PIC.  */
2270
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
2271
  {
2272
    THUMB16_INSN(0x4778),             /* bx   pc */
2273
    THUMB16_INSN(0x46c0),             /* nop  */
2274
    ARM_INSN(0xe59fc000),             /* ldr  ip, [pc, #0] */
2275
    ARM_INSN(0xe08cf00f),             /* add  pc, ip, pc */
2276
    DATA_WORD(0, R_ARM_REL32, -4),     /* dcd  R_ARM_REL32(X) */
2277
  };
2278
 
2279
/* Thumb -> Thumb long branch stub, PIC. Used on M-profile
2280
   architectures.  */
2281
static const insn_sequence elf32_arm_stub_long_branch_thumb_only_pic[] =
2282
  {
2283
    THUMB16_INSN(0xb401),             /* push {r0} */
2284
    THUMB16_INSN(0x4802),             /* ldr  r0, [pc, #8] */
2285
    THUMB16_INSN(0x46fc),             /* mov  ip, pc */
2286
    THUMB16_INSN(0x4484),             /* add  ip, r0 */
2287
    THUMB16_INSN(0xbc01),             /* pop  {r0} */
2288
    THUMB16_INSN(0x4760),             /* bx   ip */
2289
    DATA_WORD(0, R_ARM_REL32, 4),     /* dcd  R_ARM_REL32(X) */
2290
  };
2291
 
2292
/* V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
2293
   allowed.  */
2294
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
2295
  {
2296
    THUMB16_INSN(0x4778),             /* bx   pc */
2297
    THUMB16_INSN(0x46c0),             /* nop */
2298
    ARM_INSN(0xe59fc004),             /* ldr  ip, [pc, #4] */
2299
    ARM_INSN(0xe08fc00c),             /* add   ip, pc, ip */
2300
    ARM_INSN(0xe12fff1c),             /* bx   ip */
2301
    DATA_WORD(0, R_ARM_REL32, 0),     /* dcd  R_ARM_REL32(X) */
2302
  };
2303
 
2304
/* Thumb2/ARM -> TLS trampoline.  Lowest common denominator, which is a
2305
   long PIC stub.  We can use r1 as a scratch -- and cannot use ip.  */
2306
static const insn_sequence elf32_arm_stub_long_branch_any_tls_pic[] =
2307
{
2308
    ARM_INSN(0xe59f1000),             /* ldr   r1, [pc] */
2309
    ARM_INSN(0xe08ff001),             /* add   pc, pc, r1 */
2310
    DATA_WORD(0, R_ARM_REL32, -4),    /* dcd   R_ARM_REL32(X-4) */
2311
};
2312
 
2313
/* V4T Thumb -> TLS trampoline.  lowest common denominator, which is a
2314
   long PIC stub.  We can use r1 as a scratch -- and cannot use ip.  */
2315
static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_tls_pic[] =
2316
{
2317
    THUMB16_INSN(0x4778),             /* bx   pc */
2318
    THUMB16_INSN(0x46c0),             /* nop */
2319
    ARM_INSN(0xe59f1000),             /* ldr  r1, [pc, #0] */
2320
    ARM_INSN(0xe081f00f),             /* add  pc, r1, pc */
2321
    DATA_WORD(0, R_ARM_REL32, -4),    /* dcd  R_ARM_REL32(X) */
2322
};
2323
 
2324
/* Cortex-A8 erratum-workaround stubs.  */
2325
 
2326
/* Stub used for conditional branches (which may be beyond +/-1MB away, so we
2327
   can't use a conditional branch to reach this stub).  */
2328
 
2329
static const insn_sequence elf32_arm_stub_a8_veneer_b_cond[] =
2330
  {
2331
    THUMB16_BCOND_INSN(0xd001),         /* b<cond>.n true.  */
2332
    THUMB32_B_INSN(0xf000b800, -4),     /* b.w insn_after_original_branch.  */
2333
    THUMB32_B_INSN(0xf000b800, -4)      /* true: b.w original_branch_dest.  */
2334
  };
2335
 
2336
/* Stub used for b.w and bl.w instructions.  */
2337
 
2338
static const insn_sequence elf32_arm_stub_a8_veneer_b[] =
2339
  {
2340
    THUMB32_B_INSN(0xf000b800, -4)      /* b.w original_branch_dest.  */
2341
  };
2342
 
2343
static const insn_sequence elf32_arm_stub_a8_veneer_bl[] =
2344
  {
2345
    THUMB32_B_INSN(0xf000b800, -4)      /* b.w original_branch_dest.  */
2346
  };
2347
 
2348
/* Stub used for Thumb-2 blx.w instructions.  We modified the original blx.w
2349
   instruction (which switches to ARM mode) to point to this stub.  Jump to the
2350
   real destination using an ARM-mode branch.  */
2351
 
2352
static const insn_sequence elf32_arm_stub_a8_veneer_blx[] =
2353
  {
2354
    ARM_REL_INSN(0xea000000, -8)        /* b original_branch_dest.  */
2355
  };
2356
 
2357 163 khays
/* For each section group there can be a specially created linker section
2358
   to hold the stubs for that group.  The name of the stub section is based
2359
   upon the name of another section within that group with the suffix below
2360
   applied.
2361 14 khays
 
2362 163 khays
   PR 13049: STUB_SUFFIX used to be ".stub", but this allowed the user to
2363
   create what appeared to be a linker stub section when it actually
2364
   contained user code/data.  For example, consider this fragment:
2365
 
2366
     const char * stubborn_problems[] = { "np" };
2367
 
2368
   If this is compiled with "-fPIC -fdata-sections" then gcc produces a
2369
   section called:
2370
 
2371
     .data.rel.local.stubborn_problems
2372
 
2373
   This then causes problems in arm32_arm_build_stubs() as it triggers:
2374
 
2375
      // Ignore non-stub sections.
2376
      if (!strstr (stub_sec->name, STUB_SUFFIX))
2377
        continue;
2378
 
2379
   And so the section would be ignored instead of being processed.  Hence
2380
   the change in definition of STUB_SUFFIX to a name that cannot be a valid
2381
   C identifier.  */
2382
#define STUB_SUFFIX ".__stub"
2383
 
2384 14 khays
/* One entry per long/short branch stub defined above.  */
2385
#define DEF_STUBS \
2386
  DEF_STUB(long_branch_any_any) \
2387
  DEF_STUB(long_branch_v4t_arm_thumb) \
2388
  DEF_STUB(long_branch_thumb_only) \
2389
  DEF_STUB(long_branch_v4t_thumb_thumb) \
2390
  DEF_STUB(long_branch_v4t_thumb_arm) \
2391
  DEF_STUB(short_branch_v4t_thumb_arm) \
2392
  DEF_STUB(long_branch_any_arm_pic) \
2393
  DEF_STUB(long_branch_any_thumb_pic) \
2394
  DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
2395
  DEF_STUB(long_branch_v4t_arm_thumb_pic) \
2396
  DEF_STUB(long_branch_v4t_thumb_arm_pic) \
2397
  DEF_STUB(long_branch_thumb_only_pic) \
2398
  DEF_STUB(long_branch_any_tls_pic) \
2399
  DEF_STUB(long_branch_v4t_thumb_tls_pic) \
2400
  DEF_STUB(a8_veneer_b_cond) \
2401
  DEF_STUB(a8_veneer_b) \
2402
  DEF_STUB(a8_veneer_bl) \
2403
  DEF_STUB(a8_veneer_blx)
2404
 
2405
#define DEF_STUB(x) arm_stub_##x,
2406
enum elf32_arm_stub_type {
2407
  arm_stub_none,
2408
  DEF_STUBS
2409
  /* Note the first a8_veneer type */
2410
  arm_stub_a8_veneer_lwm = arm_stub_a8_veneer_b_cond
2411
};
2412
#undef DEF_STUB
2413
 
2414
typedef struct
2415
{
2416
  const insn_sequence* template_sequence;
2417
  int template_size;
2418
} stub_def;
2419
 
2420
#define DEF_STUB(x) {elf32_arm_stub_##x, ARRAY_SIZE(elf32_arm_stub_##x)},
2421
static const stub_def stub_definitions[] = {
2422
  {NULL, 0},
2423
  DEF_STUBS
2424
};
2425
 
2426
struct elf32_arm_stub_hash_entry
2427
{
2428
  /* Base hash table entry structure.  */
2429
  struct bfd_hash_entry root;
2430
 
2431
  /* The stub section.  */
2432
  asection *stub_sec;
2433
 
2434
  /* Offset within stub_sec of the beginning of this stub.  */
2435
  bfd_vma stub_offset;
2436
 
2437
  /* Given the symbol's value and its section we can determine its final
2438
     value when building the stubs (so the stub knows where to jump).  */
2439
  bfd_vma target_value;
2440
  asection *target_section;
2441
 
2442
  /* Offset to apply to relocation referencing target_value.  */
2443
  bfd_vma target_addend;
2444
 
2445
  /* The instruction which caused this stub to be generated (only valid for
2446
     Cortex-A8 erratum workaround stubs at present).  */
2447
  unsigned long orig_insn;
2448
 
2449
  /* The stub type.  */
2450
  enum elf32_arm_stub_type stub_type;
2451
  /* Its encoding size in bytes.  */
2452
  int stub_size;
2453
  /* Its template.  */
2454
  const insn_sequence *stub_template;
2455
  /* The size of the template (number of entries).  */
2456
  int stub_template_size;
2457
 
2458
  /* The symbol table entry, if any, that this was derived from.  */
2459
  struct elf32_arm_link_hash_entry *h;
2460
 
2461
  /* Type of branch.  */
2462
  enum arm_st_branch_type branch_type;
2463
 
2464
  /* Where this stub is being called from, or, in the case of combined
2465
     stub sections, the first input section in the group.  */
2466
  asection *id_sec;
2467
 
2468
  /* The name for the local symbol at the start of this stub.  The
2469
     stub name in the hash table has to be unique; this does not, so
2470
     it can be friendlier.  */
2471
  char *output_name;
2472
};
2473
 
2474
/* Used to build a map of a section.  This is required for mixed-endian
2475
   code/data.  */
2476
 
2477
typedef struct elf32_elf_section_map
2478
{
2479
  bfd_vma vma;
2480
  char type;
2481
}
2482
elf32_arm_section_map;
2483
 
2484
/* Information about a VFP11 erratum veneer, or a branch to such a veneer.  */
2485
 
2486
typedef enum
2487
{
2488
  VFP11_ERRATUM_BRANCH_TO_ARM_VENEER,
2489
  VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER,
2490
  VFP11_ERRATUM_ARM_VENEER,
2491
  VFP11_ERRATUM_THUMB_VENEER
2492
}
2493
elf32_vfp11_erratum_type;
2494
 
2495
typedef struct elf32_vfp11_erratum_list
2496
{
2497
  struct elf32_vfp11_erratum_list *next;
2498
  bfd_vma vma;
2499
  union
2500
  {
2501
    struct
2502
    {
2503
      struct elf32_vfp11_erratum_list *veneer;
2504
      unsigned int vfp_insn;
2505
    } b;
2506
    struct
2507
    {
2508
      struct elf32_vfp11_erratum_list *branch;
2509
      unsigned int id;
2510
    } v;
2511
  } u;
2512
  elf32_vfp11_erratum_type type;
2513
}
2514
elf32_vfp11_erratum_list;
2515
 
2516
typedef enum
2517
{
2518
  DELETE_EXIDX_ENTRY,
2519
  INSERT_EXIDX_CANTUNWIND_AT_END
2520
}
2521
arm_unwind_edit_type;
2522
 
2523
/* A (sorted) list of edits to apply to an unwind table.  */
2524
typedef struct arm_unwind_table_edit
2525
{
2526
  arm_unwind_edit_type type;
2527
  /* Note: we sometimes want to insert an unwind entry corresponding to a
2528
     section different from the one we're currently writing out, so record the
2529
     (text) section this edit relates to here.  */
2530
  asection *linked_section;
2531
  unsigned int index;
2532
  struct arm_unwind_table_edit *next;
2533
}
2534
arm_unwind_table_edit;
2535
 
2536
typedef struct _arm_elf_section_data
2537
{
2538
  /* Information about mapping symbols.  */
2539
  struct bfd_elf_section_data elf;
2540
  unsigned int mapcount;
2541
  unsigned int mapsize;
2542
  elf32_arm_section_map *map;
2543
  /* Information about CPU errata.  */
2544
  unsigned int erratumcount;
2545
  elf32_vfp11_erratum_list *erratumlist;
2546
  /* Information about unwind tables.  */
2547
  union
2548
  {
2549
    /* Unwind info attached to a text section.  */
2550
    struct
2551
    {
2552
      asection *arm_exidx_sec;
2553
    } text;
2554
 
2555
    /* Unwind info attached to an .ARM.exidx section.  */
2556
    struct
2557
    {
2558
      arm_unwind_table_edit *unwind_edit_list;
2559
      arm_unwind_table_edit *unwind_edit_tail;
2560
    } exidx;
2561
  } u;
2562
}
2563
_arm_elf_section_data;
2564
 
2565
#define elf32_arm_section_data(sec) \
2566
  ((_arm_elf_section_data *) elf_section_data (sec))
2567
 
2568
/* A fix which might be required for Cortex-A8 Thumb-2 branch/TLB erratum.
2569
   These fixes are subject to a relaxation procedure (in elf32_arm_size_stubs),
2570
   so may be created multiple times: we use an array of these entries whilst
2571
   relaxing which we can refresh easily, then create stubs for each potentially
2572
   erratum-triggering instruction once we've settled on a solution.  */
2573
 
2574
struct a8_erratum_fix {
2575
  bfd *input_bfd;
2576
  asection *section;
2577
  bfd_vma offset;
2578
  bfd_vma addend;
2579
  unsigned long orig_insn;
2580
  char *stub_name;
2581
  enum elf32_arm_stub_type stub_type;
2582
  enum arm_st_branch_type branch_type;
2583
};
2584
 
2585
/* A table of relocs applied to branches which might trigger Cortex-A8
2586
   erratum.  */
2587
 
2588
struct a8_erratum_reloc {
2589
  bfd_vma from;
2590
  bfd_vma destination;
2591
  struct elf32_arm_link_hash_entry *hash;
2592
  const char *sym_name;
2593
  unsigned int r_type;
2594
  enum arm_st_branch_type branch_type;
2595
  bfd_boolean non_a8_stub;
2596
};
2597
 
2598
/* The size of the thread control block.  */
2599
#define TCB_SIZE        8
2600
 
2601
/* ARM-specific information about a PLT entry, over and above the usual
2602
   gotplt_union.  */
2603
struct arm_plt_info {
2604
  /* We reference count Thumb references to a PLT entry separately,
2605
     so that we can emit the Thumb trampoline only if needed.  */
2606
  bfd_signed_vma thumb_refcount;
2607
 
2608
  /* Some references from Thumb code may be eliminated by BL->BLX
2609
     conversion, so record them separately.  */
2610
  bfd_signed_vma maybe_thumb_refcount;
2611
 
2612
  /* How many of the recorded PLT accesses were from non-call relocations.
2613
     This information is useful when deciding whether anything takes the
2614
     address of an STT_GNU_IFUNC PLT.  A value of 0 means that all
2615
     non-call references to the function should resolve directly to the
2616
     real runtime target.  */
2617
  unsigned int noncall_refcount;
2618
 
2619
  /* Since PLT entries have variable size if the Thumb prologue is
2620
     used, we need to record the index into .got.plt instead of
2621
     recomputing it from the PLT offset.  */
2622
  bfd_signed_vma got_offset;
2623
};
2624
 
2625
/* Information about an .iplt entry for a local STT_GNU_IFUNC symbol.  */
2626
struct arm_local_iplt_info {
2627
  /* The information that is usually found in the generic ELF part of
2628
     the hash table entry.  */
2629
  union gotplt_union root;
2630
 
2631
  /* The information that is usually found in the ARM-specific part of
2632
     the hash table entry.  */
2633
  struct arm_plt_info arm;
2634
 
2635
  /* A list of all potential dynamic relocations against this symbol.  */
2636
  struct elf_dyn_relocs *dyn_relocs;
2637
};
2638
 
2639
struct elf_arm_obj_tdata
2640
{
2641
  struct elf_obj_tdata root;
2642
 
2643
  /* tls_type for each local got entry.  */
2644
  char *local_got_tls_type;
2645
 
2646
  /* GOTPLT entries for TLS descriptors.  */
2647
  bfd_vma *local_tlsdesc_gotent;
2648
 
2649
  /* Information for local symbols that need entries in .iplt.  */
2650
  struct arm_local_iplt_info **local_iplt;
2651
 
2652
  /* Zero to warn when linking objects with incompatible enum sizes.  */
2653
  int no_enum_size_warning;
2654
 
2655
  /* Zero to warn when linking objects with incompatible wchar_t sizes.  */
2656
  int no_wchar_size_warning;
2657
};
2658
 
2659
#define elf_arm_tdata(bfd) \
2660
  ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
2661
 
2662
#define elf32_arm_local_got_tls_type(bfd) \
2663
  (elf_arm_tdata (bfd)->local_got_tls_type)
2664
 
2665
#define elf32_arm_local_tlsdesc_gotent(bfd) \
2666
  (elf_arm_tdata (bfd)->local_tlsdesc_gotent)
2667
 
2668
#define elf32_arm_local_iplt(bfd) \
2669
  (elf_arm_tdata (bfd)->local_iplt)
2670
 
2671
#define is_arm_elf(bfd) \
2672
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2673
   && elf_tdata (bfd) != NULL \
2674
   && elf_object_id (bfd) == ARM_ELF_DATA)
2675
 
2676
static bfd_boolean
2677
elf32_arm_mkobject (bfd *abfd)
2678
{
2679
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_arm_obj_tdata),
2680
                                  ARM_ELF_DATA);
2681
}
2682
 
2683
#define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2684
 
2685
/* Arm ELF linker hash entry.  */
2686
struct elf32_arm_link_hash_entry
2687
  {
2688
    struct elf_link_hash_entry root;
2689
 
2690
    /* Track dynamic relocs copied for this symbol.  */
2691
    struct elf_dyn_relocs *dyn_relocs;
2692
 
2693
    /* ARM-specific PLT information.  */
2694
    struct arm_plt_info plt;
2695
 
2696
#define GOT_UNKNOWN     0
2697
#define GOT_NORMAL      1
2698
#define GOT_TLS_GD      2
2699
#define GOT_TLS_IE      4
2700
#define GOT_TLS_GDESC   8
2701
#define GOT_TLS_GD_ANY_P(type)  ((type & GOT_TLS_GD) || (type & GOT_TLS_GDESC))
2702
    unsigned int tls_type : 8;
2703
 
2704
    /* True if the symbol's PLT entry is in .iplt rather than .plt.  */
2705
    unsigned int is_iplt : 1;
2706
 
2707
    unsigned int unused : 23;
2708
 
2709
    /* Offset of the GOTPLT entry reserved for the TLS descriptor,
2710
       starting at the end of the jump table.  */
2711
    bfd_vma tlsdesc_got;
2712
 
2713
    /* The symbol marking the real symbol location for exported thumb
2714
       symbols with Arm stubs.  */
2715
    struct elf_link_hash_entry *export_glue;
2716
 
2717
   /* A pointer to the most recently used stub hash entry against this
2718
     symbol.  */
2719
    struct elf32_arm_stub_hash_entry *stub_cache;
2720
  };
2721
 
2722
/* Traverse an arm ELF linker hash table.  */
2723
#define elf32_arm_link_hash_traverse(table, func, info)                 \
2724
  (elf_link_hash_traverse                                               \
2725
   (&(table)->root,                                                     \
2726
    (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),    \
2727
    (info)))
2728
 
2729
/* Get the ARM elf linker hash table from a link_info structure.  */
2730
#define elf32_arm_hash_table(info) \
2731
  (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \
2732
  == ARM_ELF_DATA ? ((struct elf32_arm_link_hash_table *) ((info)->hash)) : NULL)
2733
 
2734
#define arm_stub_hash_lookup(table, string, create, copy) \
2735
  ((struct elf32_arm_stub_hash_entry *) \
2736
   bfd_hash_lookup ((table), (string), (create), (copy)))
2737
 
2738
/* Array to keep track of which stub sections have been created, and
2739
   information on stub grouping.  */
2740
struct map_stub
2741
{
2742
  /* This is the section to which stubs in the group will be
2743
     attached.  */
2744
  asection *link_sec;
2745
  /* The stub section.  */
2746
  asection *stub_sec;
2747
};
2748
 
2749
#define elf32_arm_compute_jump_table_size(htab) \
2750
  ((htab)->next_tls_desc_index * 4)
2751
 
2752
/* ARM ELF linker hash table.  */
2753
struct elf32_arm_link_hash_table
2754
{
2755
  /* The main hash table.  */
2756
  struct elf_link_hash_table root;
2757
 
2758
  /* The size in bytes of the section containing the Thumb-to-ARM glue.  */
2759
  bfd_size_type thumb_glue_size;
2760
 
2761
  /* The size in bytes of the section containing the ARM-to-Thumb glue.  */
2762
  bfd_size_type arm_glue_size;
2763
 
2764
  /* The size in bytes of section containing the ARMv4 BX veneers.  */
2765
  bfd_size_type bx_glue_size;
2766
 
2767
  /* Offsets of ARMv4 BX veneers.  Bit1 set if present, and Bit0 set when
2768
     veneer has been populated.  */
2769
  bfd_vma bx_glue_offset[15];
2770
 
2771
  /* The size in bytes of the section containing glue for VFP11 erratum
2772
     veneers.  */
2773
  bfd_size_type vfp11_erratum_glue_size;
2774
 
2775
  /* A table of fix locations for Cortex-A8 Thumb-2 branch/TLB erratum.  This
2776
     holds Cortex-A8 erratum fix locations between elf32_arm_size_stubs() and
2777
     elf32_arm_write_section().  */
2778
  struct a8_erratum_fix *a8_erratum_fixes;
2779
  unsigned int num_a8_erratum_fixes;
2780
 
2781
  /* An arbitrary input BFD chosen to hold the glue sections.  */
2782
  bfd * bfd_of_glue_owner;
2783
 
2784
  /* Nonzero to output a BE8 image.  */
2785
  int byteswap_code;
2786
 
2787
  /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2788
     Nonzero if R_ARM_TARGET1 means R_ARM_REL32.  */
2789
  int target1_is_rel;
2790
 
2791
  /* The relocation to use for R_ARM_TARGET2 relocations.  */
2792
  int target2_reloc;
2793
 
2794
  /* 0 = Ignore R_ARM_V4BX.
2795
     1 = Convert BX to MOV PC.
2796
     2 = Generate v4 interworing stubs.  */
2797
  int fix_v4bx;
2798
 
2799
  /* Whether we should fix the Cortex-A8 Thumb-2 branch/TLB erratum.  */
2800
  int fix_cortex_a8;
2801
 
2802 161 khays
  /* Whether we should fix the ARM1176 BLX immediate issue.  */
2803
  int fix_arm1176;
2804
 
2805 14 khays
  /* Nonzero if the ARM/Thumb BLX instructions are available for use.  */
2806
  int use_blx;
2807
 
2808
  /* What sort of code sequences we should look for which may trigger the
2809
     VFP11 denorm erratum.  */
2810
  bfd_arm_vfp11_fix vfp11_fix;
2811
 
2812
  /* Global counter for the number of fixes we have emitted.  */
2813
  int num_vfp11_fixes;
2814
 
2815
  /* Nonzero to force PIC branch veneers.  */
2816
  int pic_veneer;
2817
 
2818
  /* The number of bytes in the initial entry in the PLT.  */
2819
  bfd_size_type plt_header_size;
2820
 
2821
  /* The number of bytes in the subsequent PLT etries.  */
2822
  bfd_size_type plt_entry_size;
2823
 
2824
  /* True if the target system is VxWorks.  */
2825
  int vxworks_p;
2826
 
2827
  /* True if the target system is Symbian OS.  */
2828
  int symbian_p;
2829
 
2830
  /* True if the target uses REL relocations.  */
2831
  int use_rel;
2832
 
2833
  /* The index of the next unused R_ARM_TLS_DESC slot in .rel.plt.  */
2834
  bfd_vma next_tls_desc_index;
2835
 
2836
  /* How many R_ARM_TLS_DESC relocations were generated so far.  */
2837
  bfd_vma num_tls_desc;
2838
 
2839
  /* Short-cuts to get to dynamic linker sections.  */
2840
  asection *sdynbss;
2841
  asection *srelbss;
2842
 
2843
  /* The (unloaded but important) VxWorks .rela.plt.unloaded section.  */
2844
  asection *srelplt2;
2845
 
2846
  /* The offset into splt of the PLT entry for the TLS descriptor
2847
     resolver.  Special values are 0, if not necessary (or not found
2848
     to be necessary yet), and -1 if needed but not determined
2849
     yet.  */
2850
  bfd_vma dt_tlsdesc_plt;
2851
 
2852
  /* The offset into sgot of the GOT entry used by the PLT entry
2853
     above.  */
2854
  bfd_vma dt_tlsdesc_got;
2855
 
2856
  /* Offset in .plt section of tls_arm_trampoline.  */
2857
  bfd_vma tls_trampoline;
2858
 
2859
  /* Data for R_ARM_TLS_LDM32 relocations.  */
2860
  union
2861
  {
2862
    bfd_signed_vma refcount;
2863
    bfd_vma offset;
2864
  } tls_ldm_got;
2865
 
2866
  /* Small local sym cache.  */
2867
  struct sym_cache sym_cache;
2868
 
2869
  /* For convenience in allocate_dynrelocs.  */
2870
  bfd * obfd;
2871
 
2872
  /* The amount of space used by the reserved portion of the sgotplt
2873
     section, plus whatever space is used by the jump slots.  */
2874
  bfd_vma sgotplt_jump_table_size;
2875
 
2876
  /* The stub hash table.  */
2877
  struct bfd_hash_table stub_hash_table;
2878
 
2879
  /* Linker stub bfd.  */
2880
  bfd *stub_bfd;
2881
 
2882
  /* Linker call-backs.  */
2883
  asection * (*add_stub_section) (const char *, asection *);
2884
  void (*layout_sections_again) (void);
2885
 
2886
  /* Array to keep track of which stub sections have been created, and
2887
     information on stub grouping.  */
2888
  struct map_stub *stub_group;
2889
 
2890
  /* Number of elements in stub_group.  */
2891
  int top_id;
2892
 
2893
  /* Assorted information used by elf32_arm_size_stubs.  */
2894
  unsigned int bfd_count;
2895
  int top_index;
2896
  asection **input_list;
2897
};
2898
 
2899
/* Create an entry in an ARM ELF linker hash table.  */
2900
 
2901
static struct bfd_hash_entry *
2902
elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
2903
                             struct bfd_hash_table * table,
2904
                             const char * string)
2905
{
2906
  struct elf32_arm_link_hash_entry * ret =
2907
    (struct elf32_arm_link_hash_entry *) entry;
2908
 
2909
  /* Allocate the structure if it has not already been allocated by a
2910
     subclass.  */
2911
  if (ret == NULL)
2912
    ret = (struct elf32_arm_link_hash_entry *)
2913
        bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
2914
  if (ret == NULL)
2915
    return (struct bfd_hash_entry *) ret;
2916
 
2917
  /* Call the allocation method of the superclass.  */
2918
  ret = ((struct elf32_arm_link_hash_entry *)
2919
         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2920
                                     table, string));
2921
  if (ret != NULL)
2922
    {
2923
      ret->dyn_relocs = NULL;
2924
      ret->tls_type = GOT_UNKNOWN;
2925
      ret->tlsdesc_got = (bfd_vma) -1;
2926
      ret->plt.thumb_refcount = 0;
2927
      ret->plt.maybe_thumb_refcount = 0;
2928
      ret->plt.noncall_refcount = 0;
2929
      ret->plt.got_offset = -1;
2930
      ret->is_iplt = FALSE;
2931
      ret->export_glue = NULL;
2932
 
2933
      ret->stub_cache = NULL;
2934
    }
2935
 
2936
  return (struct bfd_hash_entry *) ret;
2937
}
2938
 
2939
/* Ensure that we have allocated bookkeeping structures for ABFD's local
2940
   symbols.  */
2941
 
2942
static bfd_boolean
2943
elf32_arm_allocate_local_sym_info (bfd *abfd)
2944
{
2945
  if (elf_local_got_refcounts (abfd) == NULL)
2946
    {
2947
      bfd_size_type num_syms;
2948
      bfd_size_type size;
2949
      char *data;
2950
 
2951
      num_syms = elf_tdata (abfd)->symtab_hdr.sh_info;
2952
      size = num_syms * (sizeof (bfd_signed_vma)
2953
                         + sizeof (struct arm_local_iplt_info *)
2954
                         + sizeof (bfd_vma)
2955
                         + sizeof (char));
2956
      data = bfd_zalloc (abfd, size);
2957
      if (data == NULL)
2958
        return FALSE;
2959
 
2960
      elf_local_got_refcounts (abfd) = (bfd_signed_vma *) data;
2961
      data += num_syms * sizeof (bfd_signed_vma);
2962
 
2963
      elf32_arm_local_iplt (abfd) = (struct arm_local_iplt_info **) data;
2964
      data += num_syms * sizeof (struct arm_local_iplt_info *);
2965
 
2966
      elf32_arm_local_tlsdesc_gotent (abfd) = (bfd_vma *) data;
2967
      data += num_syms * sizeof (bfd_vma);
2968
 
2969
      elf32_arm_local_got_tls_type (abfd) = data;
2970
    }
2971
  return TRUE;
2972
}
2973
 
2974
/* Return the .iplt information for local symbol R_SYMNDX, which belongs
2975
   to input bfd ABFD.  Create the information if it doesn't already exist.
2976
   Return null if an allocation fails.  */
2977
 
2978
static struct arm_local_iplt_info *
2979
elf32_arm_create_local_iplt (bfd *abfd, unsigned long r_symndx)
2980
{
2981
  struct arm_local_iplt_info **ptr;
2982
 
2983
  if (!elf32_arm_allocate_local_sym_info (abfd))
2984
    return NULL;
2985
 
2986
  BFD_ASSERT (r_symndx < elf_tdata (abfd)->symtab_hdr.sh_info);
2987
  ptr = &elf32_arm_local_iplt (abfd)[r_symndx];
2988
  if (*ptr == NULL)
2989
    *ptr = bfd_zalloc (abfd, sizeof (**ptr));
2990
  return *ptr;
2991
}
2992
 
2993
/* Try to obtain PLT information for the symbol with index R_SYMNDX
2994
   in ABFD's symbol table.  If the symbol is global, H points to its
2995
   hash table entry, otherwise H is null.
2996
 
2997
   Return true if the symbol does have PLT information.  When returning
2998
   true, point *ROOT_PLT at the target-independent reference count/offset
2999
   union and *ARM_PLT at the ARM-specific information.  */
3000
 
3001
static bfd_boolean
3002
elf32_arm_get_plt_info (bfd *abfd, struct elf32_arm_link_hash_entry *h,
3003
                        unsigned long r_symndx, union gotplt_union **root_plt,
3004
                        struct arm_plt_info **arm_plt)
3005
{
3006
  struct arm_local_iplt_info *local_iplt;
3007
 
3008
  if (h != NULL)
3009
    {
3010
      *root_plt = &h->root.plt;
3011
      *arm_plt = &h->plt;
3012
      return TRUE;
3013
    }
3014
 
3015
  if (elf32_arm_local_iplt (abfd) == NULL)
3016
    return FALSE;
3017
 
3018
  local_iplt = elf32_arm_local_iplt (abfd)[r_symndx];
3019
  if (local_iplt == NULL)
3020
    return FALSE;
3021
 
3022
  *root_plt = &local_iplt->root;
3023
  *arm_plt = &local_iplt->arm;
3024
  return TRUE;
3025
}
3026
 
3027
/* Return true if the PLT described by ARM_PLT requires a Thumb stub
3028
   before it.  */
3029
 
3030
static bfd_boolean
3031
elf32_arm_plt_needs_thumb_stub_p (struct bfd_link_info *info,
3032
                                  struct arm_plt_info *arm_plt)
3033
{
3034
  struct elf32_arm_link_hash_table *htab;
3035
 
3036
  htab = elf32_arm_hash_table (info);
3037
  return (arm_plt->thumb_refcount != 0
3038
          || (!htab->use_blx && arm_plt->maybe_thumb_refcount != 0));
3039
}
3040
 
3041
/* Return a pointer to the head of the dynamic reloc list that should
3042
   be used for local symbol ISYM, which is symbol number R_SYMNDX in
3043
   ABFD's symbol table.  Return null if an error occurs.  */
3044
 
3045
static struct elf_dyn_relocs **
3046
elf32_arm_get_local_dynreloc_list (bfd *abfd, unsigned long r_symndx,
3047
                                   Elf_Internal_Sym *isym)
3048
{
3049
  if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3050
    {
3051
      struct arm_local_iplt_info *local_iplt;
3052
 
3053
      local_iplt = elf32_arm_create_local_iplt (abfd, r_symndx);
3054
      if (local_iplt == NULL)
3055
        return NULL;
3056
      return &local_iplt->dyn_relocs;
3057
    }
3058
  else
3059
    {
3060
      /* Track dynamic relocs needed for local syms too.
3061
         We really need local syms available to do this
3062
         easily.  Oh well.  */
3063
      asection *s;
3064
      void *vpp;
3065
 
3066
      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3067
      if (s == NULL)
3068
        abort ();
3069
 
3070
      vpp = &elf_section_data (s)->local_dynrel;
3071
      return (struct elf_dyn_relocs **) vpp;
3072
    }
3073
}
3074
 
3075
/* Initialize an entry in the stub hash table.  */
3076
 
3077
static struct bfd_hash_entry *
3078
stub_hash_newfunc (struct bfd_hash_entry *entry,
3079
                   struct bfd_hash_table *table,
3080
                   const char *string)
3081
{
3082
  /* Allocate the structure if it has not already been allocated by a
3083
     subclass.  */
3084
  if (entry == NULL)
3085
    {
3086
      entry = (struct bfd_hash_entry *)
3087
          bfd_hash_allocate (table, sizeof (struct elf32_arm_stub_hash_entry));
3088
      if (entry == NULL)
3089
        return entry;
3090
    }
3091
 
3092
  /* Call the allocation method of the superclass.  */
3093
  entry = bfd_hash_newfunc (entry, table, string);
3094
  if (entry != NULL)
3095
    {
3096
      struct elf32_arm_stub_hash_entry *eh;
3097
 
3098
      /* Initialize the local fields.  */
3099
      eh = (struct elf32_arm_stub_hash_entry *) entry;
3100
      eh->stub_sec = NULL;
3101
      eh->stub_offset = 0;
3102
      eh->target_value = 0;
3103
      eh->target_section = NULL;
3104
      eh->target_addend = 0;
3105
      eh->orig_insn = 0;
3106
      eh->stub_type = arm_stub_none;
3107
      eh->stub_size = 0;
3108
      eh->stub_template = NULL;
3109
      eh->stub_template_size = 0;
3110
      eh->h = NULL;
3111
      eh->id_sec = NULL;
3112
      eh->output_name = NULL;
3113
    }
3114
 
3115
  return entry;
3116
}
3117
 
3118
/* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
3119
   shortcuts to them in our hash table.  */
3120
 
3121
static bfd_boolean
3122
create_got_section (bfd *dynobj, struct bfd_link_info *info)
3123
{
3124
  struct elf32_arm_link_hash_table *htab;
3125
 
3126
  htab = elf32_arm_hash_table (info);
3127
  if (htab == NULL)
3128
    return FALSE;
3129
 
3130
  /* BPABI objects never have a GOT, or associated sections.  */
3131
  if (htab->symbian_p)
3132
    return TRUE;
3133
 
3134
  if (! _bfd_elf_create_got_section (dynobj, info))
3135
    return FALSE;
3136
 
3137
  return TRUE;
3138
}
3139
 
3140
/* Create the .iplt, .rel(a).iplt and .igot.plt sections.  */
3141
 
3142
static bfd_boolean
3143
create_ifunc_sections (struct bfd_link_info *info)
3144
{
3145
  struct elf32_arm_link_hash_table *htab;
3146
  const struct elf_backend_data *bed;
3147
  bfd *dynobj;
3148
  asection *s;
3149
  flagword flags;
3150
 
3151
  htab = elf32_arm_hash_table (info);
3152
  dynobj = htab->root.dynobj;
3153
  bed = get_elf_backend_data (dynobj);
3154
  flags = bed->dynamic_sec_flags;
3155
 
3156
  if (htab->root.iplt == NULL)
3157
    {
3158
      s = bfd_make_section_with_flags (dynobj, ".iplt",
3159
                                       flags | SEC_READONLY | SEC_CODE);
3160
      if (s == NULL
3161
          || !bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3162
        return FALSE;
3163
      htab->root.iplt = s;
3164
    }
3165
 
3166
  if (htab->root.irelplt == NULL)
3167
    {
3168
      s = bfd_make_section_with_flags (dynobj, RELOC_SECTION (htab, ".iplt"),
3169
                                       flags | SEC_READONLY);
3170
      if (s == NULL
3171
          || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
3172
        return FALSE;
3173
      htab->root.irelplt = s;
3174
    }
3175
 
3176
  if (htab->root.igotplt == NULL)
3177
    {
3178
      s = bfd_make_section_with_flags (dynobj, ".igot.plt", flags);
3179
      if (s == NULL
3180
          || !bfd_set_section_alignment (dynobj, s, bed->s->log_file_align))
3181
        return FALSE;
3182
      htab->root.igotplt = s;
3183
    }
3184
  return TRUE;
3185
}
3186
 
3187
/* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
3188
   .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
3189
   hash table.  */
3190
 
3191
static bfd_boolean
3192
elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3193
{
3194
  struct elf32_arm_link_hash_table *htab;
3195
 
3196
  htab = elf32_arm_hash_table (info);
3197
  if (htab == NULL)
3198
    return FALSE;
3199
 
3200
  if (!htab->root.sgot && !create_got_section (dynobj, info))
3201
    return FALSE;
3202
 
3203
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3204
    return FALSE;
3205
 
3206
  htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
3207
  if (!info->shared)
3208
    htab->srelbss = bfd_get_section_by_name (dynobj,
3209
                                             RELOC_SECTION (htab, ".bss"));
3210
 
3211
  if (htab->vxworks_p)
3212
    {
3213
      if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
3214
        return FALSE;
3215
 
3216
      if (info->shared)
3217
        {
3218
          htab->plt_header_size = 0;
3219
          htab->plt_entry_size
3220
            = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
3221
        }
3222
      else
3223
        {
3224
          htab->plt_header_size
3225
            = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
3226
          htab->plt_entry_size
3227
            = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
3228
        }
3229
    }
3230
 
3231
  if (!htab->root.splt
3232
      || !htab->root.srelplt
3233
      || !htab->sdynbss
3234
      || (!info->shared && !htab->srelbss))
3235
    abort ();
3236
 
3237
  return TRUE;
3238
}
3239
 
3240
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
3241
 
3242
static void
3243
elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
3244
                                struct elf_link_hash_entry *dir,
3245
                                struct elf_link_hash_entry *ind)
3246
{
3247
  struct elf32_arm_link_hash_entry *edir, *eind;
3248
 
3249
  edir = (struct elf32_arm_link_hash_entry *) dir;
3250
  eind = (struct elf32_arm_link_hash_entry *) ind;
3251
 
3252
  if (eind->dyn_relocs != NULL)
3253
    {
3254
      if (edir->dyn_relocs != NULL)
3255
        {
3256
          struct elf_dyn_relocs **pp;
3257
          struct elf_dyn_relocs *p;
3258
 
3259
          /* Add reloc counts against the indirect sym to the direct sym
3260
             list.  Merge any entries against the same section.  */
3261
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3262
            {
3263
              struct elf_dyn_relocs *q;
3264
 
3265
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
3266
                if (q->sec == p->sec)
3267
                  {
3268
                    q->pc_count += p->pc_count;
3269
                    q->count += p->count;
3270
                    *pp = p->next;
3271
                    break;
3272
                  }
3273
              if (q == NULL)
3274
                pp = &p->next;
3275
            }
3276
          *pp = edir->dyn_relocs;
3277
        }
3278
 
3279
      edir->dyn_relocs = eind->dyn_relocs;
3280
      eind->dyn_relocs = NULL;
3281
    }
3282
 
3283
  if (ind->root.type == bfd_link_hash_indirect)
3284
    {
3285
      /* Copy over PLT info.  */
3286
      edir->plt.thumb_refcount += eind->plt.thumb_refcount;
3287
      eind->plt.thumb_refcount = 0;
3288
      edir->plt.maybe_thumb_refcount += eind->plt.maybe_thumb_refcount;
3289
      eind->plt.maybe_thumb_refcount = 0;
3290
      edir->plt.noncall_refcount += eind->plt.noncall_refcount;
3291
      eind->plt.noncall_refcount = 0;
3292
 
3293
      /* We should only allocate a function to .iplt once the final
3294
         symbol information is known.  */
3295
      BFD_ASSERT (!eind->is_iplt);
3296
 
3297
      if (dir->got.refcount <= 0)
3298
        {
3299
          edir->tls_type = eind->tls_type;
3300
          eind->tls_type = GOT_UNKNOWN;
3301
        }
3302
    }
3303
 
3304
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3305
}
3306
 
3307
/* Create an ARM elf linker hash table.  */
3308
 
3309
static struct bfd_link_hash_table *
3310
elf32_arm_link_hash_table_create (bfd *abfd)
3311
{
3312
  struct elf32_arm_link_hash_table *ret;
3313
  bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
3314
 
3315
  ret = (struct elf32_arm_link_hash_table *) bfd_malloc (amt);
3316
  if (ret == NULL)
3317
    return NULL;
3318
 
3319
  if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
3320
                                      elf32_arm_link_hash_newfunc,
3321
                                      sizeof (struct elf32_arm_link_hash_entry),
3322
                                      ARM_ELF_DATA))
3323
    {
3324
      free (ret);
3325
      return NULL;
3326
    }
3327
 
3328
  ret->sdynbss = NULL;
3329
  ret->srelbss = NULL;
3330
  ret->srelplt2 = NULL;
3331
  ret->dt_tlsdesc_plt = 0;
3332
  ret->dt_tlsdesc_got = 0;
3333
  ret->tls_trampoline = 0;
3334
  ret->next_tls_desc_index = 0;
3335
  ret->num_tls_desc = 0;
3336
  ret->thumb_glue_size = 0;
3337
  ret->arm_glue_size = 0;
3338
  ret->bx_glue_size = 0;
3339
  memset (ret->bx_glue_offset, 0, sizeof (ret->bx_glue_offset));
3340
  ret->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
3341
  ret->vfp11_erratum_glue_size = 0;
3342
  ret->num_vfp11_fixes = 0;
3343
  ret->fix_cortex_a8 = 0;
3344 161 khays
  ret->fix_arm1176 = 0;
3345 14 khays
  ret->bfd_of_glue_owner = NULL;
3346
  ret->byteswap_code = 0;
3347
  ret->target1_is_rel = 0;
3348
  ret->target2_reloc = R_ARM_NONE;
3349
#ifdef FOUR_WORD_PLT
3350
  ret->plt_header_size = 16;
3351
  ret->plt_entry_size = 16;
3352
#else
3353
  ret->plt_header_size = 20;
3354
  ret->plt_entry_size = 12;
3355
#endif
3356
  ret->fix_v4bx = 0;
3357
  ret->use_blx = 0;
3358
  ret->vxworks_p = 0;
3359
  ret->symbian_p = 0;
3360
  ret->use_rel = 1;
3361
  ret->sym_cache.abfd = NULL;
3362
  ret->obfd = abfd;
3363
  ret->tls_ldm_got.refcount = 0;
3364
  ret->stub_bfd = NULL;
3365
  ret->add_stub_section = NULL;
3366
  ret->layout_sections_again = NULL;
3367
  ret->stub_group = NULL;
3368
  ret->top_id = 0;
3369
  ret->bfd_count = 0;
3370
  ret->top_index = 0;
3371
  ret->input_list = NULL;
3372
 
3373
  if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
3374
                            sizeof (struct elf32_arm_stub_hash_entry)))
3375
    {
3376
      free (ret);
3377
      return NULL;
3378
    }
3379
 
3380
  return &ret->root.root;
3381
}
3382
 
3383
/* Free the derived linker hash table.  */
3384
 
3385
static void
3386
elf32_arm_hash_table_free (struct bfd_link_hash_table *hash)
3387
{
3388
  struct elf32_arm_link_hash_table *ret
3389
    = (struct elf32_arm_link_hash_table *) hash;
3390
 
3391
  bfd_hash_table_free (&ret->stub_hash_table);
3392
  _bfd_generic_link_hash_table_free (hash);
3393
}
3394
 
3395
/* Determine if we're dealing with a Thumb only architecture.  */
3396
 
3397
static bfd_boolean
3398
using_thumb_only (struct elf32_arm_link_hash_table *globals)
3399
{
3400
  int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3401
                                       Tag_CPU_arch);
3402
  int profile;
3403
 
3404
  if (arch == TAG_CPU_ARCH_V6_M || arch == TAG_CPU_ARCH_V6S_M)
3405
    return TRUE;
3406
 
3407
  if (arch != TAG_CPU_ARCH_V7 && arch != TAG_CPU_ARCH_V7E_M)
3408
    return FALSE;
3409
 
3410
  profile = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3411
                                      Tag_CPU_arch_profile);
3412
 
3413
  return profile == 'M';
3414
}
3415
 
3416
/* Determine if we're dealing with a Thumb-2 object.  */
3417
 
3418
static bfd_boolean
3419
using_thumb2 (struct elf32_arm_link_hash_table *globals)
3420
{
3421
  int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3422
                                       Tag_CPU_arch);
3423
  return arch == TAG_CPU_ARCH_V6T2 || arch >= TAG_CPU_ARCH_V7;
3424
}
3425
 
3426
/* Determine what kind of NOPs are available.  */
3427
 
3428
static bfd_boolean
3429
arch_has_arm_nop (struct elf32_arm_link_hash_table *globals)
3430
{
3431
  const int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3432
                                             Tag_CPU_arch);
3433
  return arch == TAG_CPU_ARCH_V6T2
3434
         || arch == TAG_CPU_ARCH_V6K
3435
         || arch == TAG_CPU_ARCH_V7
3436
         || arch == TAG_CPU_ARCH_V7E_M;
3437
}
3438
 
3439
static bfd_boolean
3440
arch_has_thumb2_nop (struct elf32_arm_link_hash_table *globals)
3441
{
3442
  const int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3443
                                             Tag_CPU_arch);
3444
  return (arch == TAG_CPU_ARCH_V6T2 || arch == TAG_CPU_ARCH_V7
3445
          || arch == TAG_CPU_ARCH_V7E_M);
3446
}
3447
 
3448
static bfd_boolean
3449
arm_stub_is_thumb (enum elf32_arm_stub_type stub_type)
3450
{
3451
  switch (stub_type)
3452
    {
3453
    case arm_stub_long_branch_thumb_only:
3454
    case arm_stub_long_branch_v4t_thumb_arm:
3455
    case arm_stub_short_branch_v4t_thumb_arm:
3456
    case arm_stub_long_branch_v4t_thumb_arm_pic:
3457
    case arm_stub_long_branch_v4t_thumb_tls_pic:
3458
    case arm_stub_long_branch_thumb_only_pic:
3459
      return TRUE;
3460
    case arm_stub_none:
3461
      BFD_FAIL ();
3462
      return FALSE;
3463
      break;
3464
    default:
3465
      return FALSE;
3466
    }
3467
}
3468
 
3469
/* Determine the type of stub needed, if any, for a call.  */
3470
 
3471
static enum elf32_arm_stub_type
3472
arm_type_of_stub (struct bfd_link_info *info,
3473
                  asection *input_sec,
3474
                  const Elf_Internal_Rela *rel,
3475
                  unsigned char st_type,
3476
                  enum arm_st_branch_type *actual_branch_type,
3477
                  struct elf32_arm_link_hash_entry *hash,
3478
                  bfd_vma destination,
3479
                  asection *sym_sec,
3480
                  bfd *input_bfd,
3481
                  const char *name)
3482
{
3483
  bfd_vma location;
3484
  bfd_signed_vma branch_offset;
3485
  unsigned int r_type;
3486
  struct elf32_arm_link_hash_table * globals;
3487
  int thumb2;
3488
  int thumb_only;
3489
  enum elf32_arm_stub_type stub_type = arm_stub_none;
3490
  int use_plt = 0;
3491
  enum arm_st_branch_type branch_type = *actual_branch_type;
3492
  union gotplt_union *root_plt;
3493
  struct arm_plt_info *arm_plt;
3494
 
3495
  if (branch_type == ST_BRANCH_LONG)
3496
    return stub_type;
3497
 
3498
  globals = elf32_arm_hash_table (info);
3499
  if (globals == NULL)
3500
    return stub_type;
3501
 
3502
  thumb_only = using_thumb_only (globals);
3503
 
3504
  thumb2 = using_thumb2 (globals);
3505
 
3506
  /* Determine where the call point is.  */
3507
  location = (input_sec->output_offset
3508
              + input_sec->output_section->vma
3509
              + rel->r_offset);
3510
 
3511
  r_type = ELF32_R_TYPE (rel->r_info);
3512
 
3513
  /* For TLS call relocs, it is the caller's responsibility to provide
3514
     the address of the appropriate trampoline.  */
3515
  if (r_type != R_ARM_TLS_CALL
3516
      && r_type != R_ARM_THM_TLS_CALL
3517
      && elf32_arm_get_plt_info (input_bfd, hash, ELF32_R_SYM (rel->r_info),
3518
                                 &root_plt, &arm_plt)
3519
      && root_plt->offset != (bfd_vma) -1)
3520
    {
3521
      asection *splt;
3522
 
3523
      if (hash == NULL || hash->is_iplt)
3524
        splt = globals->root.iplt;
3525
      else
3526
        splt = globals->root.splt;
3527
      if (splt != NULL)
3528
        {
3529
          use_plt = 1;
3530
 
3531
          /* Note when dealing with PLT entries: the main PLT stub is in
3532
             ARM mode, so if the branch is in Thumb mode, another
3533
             Thumb->ARM stub will be inserted later just before the ARM
3534
             PLT stub. We don't take this extra distance into account
3535
             here, because if a long branch stub is needed, we'll add a
3536
             Thumb->Arm one and branch directly to the ARM PLT entry
3537
             because it avoids spreading offset corrections in several
3538
             places.  */
3539
 
3540
          destination = (splt->output_section->vma
3541
                         + splt->output_offset
3542
                         + root_plt->offset);
3543
          st_type = STT_FUNC;
3544
          branch_type = ST_BRANCH_TO_ARM;
3545
        }
3546
    }
3547
  /* Calls to STT_GNU_IFUNC symbols should go through a PLT.  */
3548
  BFD_ASSERT (st_type != STT_GNU_IFUNC);
3549
 
3550
  branch_offset = (bfd_signed_vma)(destination - location);
3551
 
3552
  if (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24
3553
      || r_type == R_ARM_THM_TLS_CALL)
3554
    {
3555
      /* Handle cases where:
3556
         - this call goes too far (different Thumb/Thumb2 max
3557
           distance)
3558
         - it's a Thumb->Arm call and blx is not available, or it's a
3559
           Thumb->Arm branch (not bl). A stub is needed in this case,
3560
           but only if this call is not through a PLT entry. Indeed,
3561
           PLT stubs handle mode switching already.
3562
      */
3563
      if ((!thumb2
3564
            && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
3565
                || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
3566
          || (thumb2
3567
              && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
3568
                  || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
3569
          || (branch_type == ST_BRANCH_TO_ARM
3570
              && (((r_type == R_ARM_THM_CALL
3571
                    || r_type == R_ARM_THM_TLS_CALL) && !globals->use_blx)
3572
                  || (r_type == R_ARM_THM_JUMP24))
3573
              && !use_plt))
3574
        {
3575
          if (branch_type == ST_BRANCH_TO_THUMB)
3576
            {
3577
              /* Thumb to thumb.  */
3578
              if (!thumb_only)
3579
                {
3580
                  stub_type = (info->shared | globals->pic_veneer)
3581
                    /* PIC stubs.  */
3582
                    ? ((globals->use_blx
3583 163 khays
                        && (r_type == R_ARM_THM_CALL))
3584 14 khays
                       /* V5T and above. Stub starts with ARM code, so
3585
                          we must be able to switch mode before
3586
                          reaching it, which is only possible for 'bl'
3587
                          (ie R_ARM_THM_CALL relocation).  */
3588
                       ? arm_stub_long_branch_any_thumb_pic
3589
                       /* On V4T, use Thumb code only.  */
3590
                       : arm_stub_long_branch_v4t_thumb_thumb_pic)
3591
 
3592
                    /* non-PIC stubs.  */
3593
                    : ((globals->use_blx
3594 163 khays
                        && (r_type == R_ARM_THM_CALL))
3595 14 khays
                       /* V5T and above.  */
3596
                       ? arm_stub_long_branch_any_any
3597
                       /* V4T.  */
3598
                       : arm_stub_long_branch_v4t_thumb_thumb);
3599
                }
3600
              else
3601
                {
3602
                  stub_type = (info->shared | globals->pic_veneer)
3603
                    /* PIC stub.  */
3604
                    ? arm_stub_long_branch_thumb_only_pic
3605
                    /* non-PIC stub.  */
3606
                    : arm_stub_long_branch_thumb_only;
3607
                }
3608
            }
3609
          else
3610
            {
3611
              /* Thumb to arm.  */
3612
              if (sym_sec != NULL
3613
                  && sym_sec->owner != NULL
3614
                  && !INTERWORK_FLAG (sym_sec->owner))
3615
                {
3616
                  (*_bfd_error_handler)
3617
                    (_("%B(%s): warning: interworking not enabled.\n"
3618
                       "  first occurrence: %B: Thumb call to ARM"),
3619
                     sym_sec->owner, input_bfd, name);
3620
                }
3621
 
3622
              stub_type =
3623
                (info->shared | globals->pic_veneer)
3624
                /* PIC stubs.  */
3625
                ? (r_type == R_ARM_THM_TLS_CALL
3626
                   /* TLS PIC stubs */
3627
                   ? (globals->use_blx ? arm_stub_long_branch_any_tls_pic
3628
                      : arm_stub_long_branch_v4t_thumb_tls_pic)
3629
                   : ((globals->use_blx && r_type == R_ARM_THM_CALL)
3630
                      /* V5T PIC and above.  */
3631
                      ? arm_stub_long_branch_any_arm_pic
3632
                      /* V4T PIC stub.  */
3633
                      : arm_stub_long_branch_v4t_thumb_arm_pic))
3634
 
3635
                /* non-PIC stubs.  */
3636
                : ((globals->use_blx && r_type == R_ARM_THM_CALL)
3637
                   /* V5T and above.  */
3638
                   ? arm_stub_long_branch_any_any
3639
                   /* V4T.  */
3640
                   : arm_stub_long_branch_v4t_thumb_arm);
3641
 
3642
              /* Handle v4t short branches.  */
3643
              if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
3644
                  && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
3645
                  && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
3646
                stub_type = arm_stub_short_branch_v4t_thumb_arm;
3647
            }
3648
        }
3649
    }
3650
  else if (r_type == R_ARM_CALL
3651
           || r_type == R_ARM_JUMP24
3652
           || r_type == R_ARM_PLT32
3653
           || r_type == R_ARM_TLS_CALL)
3654
    {
3655
      if (branch_type == ST_BRANCH_TO_THUMB)
3656
        {
3657
          /* Arm to thumb.  */
3658
 
3659
          if (sym_sec != NULL
3660
              && sym_sec->owner != NULL
3661
              && !INTERWORK_FLAG (sym_sec->owner))
3662
            {
3663
              (*_bfd_error_handler)
3664
                (_("%B(%s): warning: interworking not enabled.\n"
3665
                   "  first occurrence: %B: ARM call to Thumb"),
3666
                 sym_sec->owner, input_bfd, name);
3667
            }
3668
 
3669
          /* We have an extra 2-bytes reach because of
3670
             the mode change (bit 24 (H) of BLX encoding).  */
3671
          if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
3672
              || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
3673
              || (r_type == R_ARM_CALL && !globals->use_blx)
3674
              || (r_type == R_ARM_JUMP24)
3675
              || (r_type == R_ARM_PLT32))
3676
            {
3677
              stub_type = (info->shared | globals->pic_veneer)
3678
                /* PIC stubs.  */
3679
                ? ((globals->use_blx)
3680
                   /* V5T and above.  */
3681
                   ? arm_stub_long_branch_any_thumb_pic
3682
                   /* V4T stub.  */
3683
                   : arm_stub_long_branch_v4t_arm_thumb_pic)
3684
 
3685
                /* non-PIC stubs.  */
3686
                : ((globals->use_blx)
3687
                   /* V5T and above.  */
3688
                   ? arm_stub_long_branch_any_any
3689
                   /* V4T.  */
3690
                   : arm_stub_long_branch_v4t_arm_thumb);
3691
            }
3692
        }
3693
      else
3694
        {
3695
          /* Arm to arm.  */
3696
          if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
3697
              || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
3698
            {
3699
              stub_type =
3700
                (info->shared | globals->pic_veneer)
3701
                /* PIC stubs.  */
3702
                ? (r_type == R_ARM_TLS_CALL
3703
                   /* TLS PIC Stub */
3704
                   ? arm_stub_long_branch_any_tls_pic
3705
                   : arm_stub_long_branch_any_arm_pic)
3706
                /* non-PIC stubs.  */
3707
                : arm_stub_long_branch_any_any;
3708
            }
3709
        }
3710
    }
3711
 
3712
  /* If a stub is needed, record the actual destination type.  */
3713
  if (stub_type != arm_stub_none)
3714
    *actual_branch_type = branch_type;
3715
 
3716
  return stub_type;
3717
}
3718
 
3719
/* Build a name for an entry in the stub hash table.  */
3720
 
3721
static char *
3722
elf32_arm_stub_name (const asection *input_section,
3723
                     const asection *sym_sec,
3724
                     const struct elf32_arm_link_hash_entry *hash,
3725
                     const Elf_Internal_Rela *rel,
3726
                     enum elf32_arm_stub_type stub_type)
3727
{
3728
  char *stub_name;
3729
  bfd_size_type len;
3730
 
3731
  if (hash)
3732
    {
3733
      len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 8 + 1 + 2 + 1;
3734
      stub_name = (char *) bfd_malloc (len);
3735
      if (stub_name != NULL)
3736
        sprintf (stub_name, "%08x_%s+%x_%d",
3737
                 input_section->id & 0xffffffff,
3738
                 hash->root.root.root.string,
3739
                 (int) rel->r_addend & 0xffffffff,
3740
                 (int) stub_type);
3741
    }
3742
  else
3743
    {
3744
      len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1 + 2 + 1;
3745
      stub_name = (char *) bfd_malloc (len);
3746
      if (stub_name != NULL)
3747
        sprintf (stub_name, "%08x_%x:%x+%x_%d",
3748
                 input_section->id & 0xffffffff,
3749
                 sym_sec->id & 0xffffffff,
3750
                 ELF32_R_TYPE (rel->r_info) == R_ARM_TLS_CALL
3751
                 || ELF32_R_TYPE (rel->r_info) == R_ARM_THM_TLS_CALL
3752
                 ? 0 : (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
3753
                 (int) rel->r_addend & 0xffffffff,
3754
                 (int) stub_type);
3755
    }
3756
 
3757
  return stub_name;
3758
}
3759
 
3760
/* Look up an entry in the stub hash.  Stub entries are cached because
3761
   creating the stub name takes a bit of time.  */
3762
 
3763
static struct elf32_arm_stub_hash_entry *
3764
elf32_arm_get_stub_entry (const asection *input_section,
3765
                          const asection *sym_sec,
3766
                          struct elf_link_hash_entry *hash,
3767
                          const Elf_Internal_Rela *rel,
3768
                          struct elf32_arm_link_hash_table *htab,
3769
                          enum elf32_arm_stub_type stub_type)
3770
{
3771
  struct elf32_arm_stub_hash_entry *stub_entry;
3772
  struct elf32_arm_link_hash_entry *h = (struct elf32_arm_link_hash_entry *) hash;
3773
  const asection *id_sec;
3774
 
3775
  if ((input_section->flags & SEC_CODE) == 0)
3776
    return NULL;
3777
 
3778
  /* If this input section is part of a group of sections sharing one
3779
     stub section, then use the id of the first section in the group.
3780
     Stub names need to include a section id, as there may well be
3781
     more than one stub used to reach say, printf, and we need to
3782
     distinguish between them.  */
3783
  id_sec = htab->stub_group[input_section->id].link_sec;
3784
 
3785
  if (h != NULL && h->stub_cache != NULL
3786
      && h->stub_cache->h == h
3787
      && h->stub_cache->id_sec == id_sec
3788
      && h->stub_cache->stub_type == stub_type)
3789
    {
3790
      stub_entry = h->stub_cache;
3791
    }
3792
  else
3793
    {
3794
      char *stub_name;
3795
 
3796
      stub_name = elf32_arm_stub_name (id_sec, sym_sec, h, rel, stub_type);
3797
      if (stub_name == NULL)
3798
        return NULL;
3799
 
3800
      stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
3801
                                        stub_name, FALSE, FALSE);
3802
      if (h != NULL)
3803
        h->stub_cache = stub_entry;
3804
 
3805
      free (stub_name);
3806
    }
3807
 
3808
  return stub_entry;
3809
}
3810
 
3811
/* Find or create a stub section.  Returns a pointer to the stub section, and
3812
   the section to which the stub section will be attached (in *LINK_SEC_P).
3813
   LINK_SEC_P may be NULL.  */
3814
 
3815
static asection *
3816
elf32_arm_create_or_find_stub_sec (asection **link_sec_p, asection *section,
3817
                                   struct elf32_arm_link_hash_table *htab)
3818
{
3819
  asection *link_sec;
3820
  asection *stub_sec;
3821
 
3822
  link_sec = htab->stub_group[section->id].link_sec;
3823 163 khays
  BFD_ASSERT (link_sec != NULL);
3824 14 khays
  stub_sec = htab->stub_group[section->id].stub_sec;
3825 163 khays
 
3826 14 khays
  if (stub_sec == NULL)
3827
    {
3828
      stub_sec = htab->stub_group[link_sec->id].stub_sec;
3829
      if (stub_sec == NULL)
3830
        {
3831
          size_t namelen;
3832
          bfd_size_type len;
3833
          char *s_name;
3834
 
3835
          namelen = strlen (link_sec->name);
3836
          len = namelen + sizeof (STUB_SUFFIX);
3837
          s_name = (char *) bfd_alloc (htab->stub_bfd, len);
3838
          if (s_name == NULL)
3839
            return NULL;
3840
 
3841
          memcpy (s_name, link_sec->name, namelen);
3842
          memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3843
          stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3844
          if (stub_sec == NULL)
3845
            return NULL;
3846
          htab->stub_group[link_sec->id].stub_sec = stub_sec;
3847
        }
3848
      htab->stub_group[section->id].stub_sec = stub_sec;
3849
    }
3850
 
3851
  if (link_sec_p)
3852
    *link_sec_p = link_sec;
3853
 
3854
  return stub_sec;
3855
}
3856
 
3857
/* Add a new stub entry to the stub hash.  Not all fields of the new
3858
   stub entry are initialised.  */
3859
 
3860
static struct elf32_arm_stub_hash_entry *
3861
elf32_arm_add_stub (const char *stub_name,
3862
                    asection *section,
3863
                    struct elf32_arm_link_hash_table *htab)
3864
{
3865
  asection *link_sec;
3866
  asection *stub_sec;
3867
  struct elf32_arm_stub_hash_entry *stub_entry;
3868
 
3869
  stub_sec = elf32_arm_create_or_find_stub_sec (&link_sec, section, htab);
3870
  if (stub_sec == NULL)
3871
    return NULL;
3872
 
3873
  /* Enter this entry into the linker stub hash table.  */
3874
  stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3875
                                     TRUE, FALSE);
3876
  if (stub_entry == NULL)
3877
    {
3878
      (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
3879
                             section->owner,
3880
                             stub_name);
3881
      return NULL;
3882
    }
3883
 
3884
  stub_entry->stub_sec = stub_sec;
3885
  stub_entry->stub_offset = 0;
3886
  stub_entry->id_sec = link_sec;
3887
 
3888
  return stub_entry;
3889
}
3890
 
3891
/* Store an Arm insn into an output section not processed by
3892
   elf32_arm_write_section.  */
3893
 
3894
static void
3895
put_arm_insn (struct elf32_arm_link_hash_table * htab,
3896
              bfd * output_bfd, bfd_vma val, void * ptr)
3897
{
3898
  if (htab->byteswap_code != bfd_little_endian (output_bfd))
3899
    bfd_putl32 (val, ptr);
3900
  else
3901
    bfd_putb32 (val, ptr);
3902
}
3903
 
3904
/* Store a 16-bit Thumb insn into an output section not processed by
3905
   elf32_arm_write_section.  */
3906
 
3907
static void
3908
put_thumb_insn (struct elf32_arm_link_hash_table * htab,
3909
                bfd * output_bfd, bfd_vma val, void * ptr)
3910
{
3911
  if (htab->byteswap_code != bfd_little_endian (output_bfd))
3912
    bfd_putl16 (val, ptr);
3913
  else
3914
    bfd_putb16 (val, ptr);
3915
}
3916
 
3917
/* If it's possible to change R_TYPE to a more efficient access
3918
   model, return the new reloc type.  */
3919
 
3920
static unsigned
3921
elf32_arm_tls_transition (struct bfd_link_info *info, int r_type,
3922
                          struct elf_link_hash_entry *h)
3923
{
3924
  int is_local = (h == NULL);
3925
 
3926
  if (info->shared || (h && h->root.type == bfd_link_hash_undefweak))
3927
    return r_type;
3928
 
3929
  /* We do not support relaxations for Old TLS models.  */
3930
  switch (r_type)
3931
    {
3932
    case R_ARM_TLS_GOTDESC:
3933
    case R_ARM_TLS_CALL:
3934
    case R_ARM_THM_TLS_CALL:
3935
    case R_ARM_TLS_DESCSEQ:
3936
    case R_ARM_THM_TLS_DESCSEQ:
3937
      return is_local ? R_ARM_TLS_LE32 : R_ARM_TLS_IE32;
3938
    }
3939
 
3940
  return r_type;
3941
}
3942
 
3943
static bfd_reloc_status_type elf32_arm_final_link_relocate
3944
  (reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *,
3945
   Elf_Internal_Rela *, bfd_vma, struct bfd_link_info *, asection *,
3946
   const char *, unsigned char, enum arm_st_branch_type,
3947
   struct elf_link_hash_entry *, bfd_boolean *, char **);
3948
 
3949
static unsigned int
3950
arm_stub_required_alignment (enum elf32_arm_stub_type stub_type)
3951
{
3952
  switch (stub_type)
3953
    {
3954
    case arm_stub_a8_veneer_b_cond:
3955
    case arm_stub_a8_veneer_b:
3956
    case arm_stub_a8_veneer_bl:
3957
      return 2;
3958
 
3959
    case arm_stub_long_branch_any_any:
3960
    case arm_stub_long_branch_v4t_arm_thumb:
3961
    case arm_stub_long_branch_thumb_only:
3962
    case arm_stub_long_branch_v4t_thumb_thumb:
3963
    case arm_stub_long_branch_v4t_thumb_arm:
3964
    case arm_stub_short_branch_v4t_thumb_arm:
3965
    case arm_stub_long_branch_any_arm_pic:
3966
    case arm_stub_long_branch_any_thumb_pic:
3967
    case arm_stub_long_branch_v4t_thumb_thumb_pic:
3968
    case arm_stub_long_branch_v4t_arm_thumb_pic:
3969
    case arm_stub_long_branch_v4t_thumb_arm_pic:
3970
    case arm_stub_long_branch_thumb_only_pic:
3971
    case arm_stub_long_branch_any_tls_pic:
3972
    case arm_stub_long_branch_v4t_thumb_tls_pic:
3973
    case arm_stub_a8_veneer_blx:
3974
      return 4;
3975
 
3976
    default:
3977
      abort ();  /* Should be unreachable.  */
3978
    }
3979
}
3980
 
3981
static bfd_boolean
3982
arm_build_one_stub (struct bfd_hash_entry *gen_entry,
3983
                    void * in_arg)
3984
{
3985
#define MAXRELOCS 2
3986
  struct elf32_arm_stub_hash_entry *stub_entry;
3987
  struct elf32_arm_link_hash_table *globals;
3988
  struct bfd_link_info *info;
3989
  asection *stub_sec;
3990
  bfd *stub_bfd;
3991
  bfd_byte *loc;
3992
  bfd_vma sym_value;
3993
  int template_size;
3994
  int size;
3995
  const insn_sequence *template_sequence;
3996
  int i;
3997
  int stub_reloc_idx[MAXRELOCS] = {-1, -1};
3998
  int stub_reloc_offset[MAXRELOCS] = {0, 0};
3999
  int nrelocs = 0;
4000
 
4001
  /* Massage our args to the form they really have.  */
4002
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
4003
  info = (struct bfd_link_info *) in_arg;
4004
 
4005
  globals = elf32_arm_hash_table (info);
4006
  if (globals == NULL)
4007
    return FALSE;
4008
 
4009
  stub_sec = stub_entry->stub_sec;
4010
 
4011
  if ((globals->fix_cortex_a8 < 0)
4012
      != (arm_stub_required_alignment (stub_entry->stub_type) == 2))
4013
    /* We have to do less-strictly-aligned fixes last.  */
4014
    return TRUE;
4015
 
4016
  /* Make a note of the offset within the stubs for this entry.  */
4017
  stub_entry->stub_offset = stub_sec->size;
4018
  loc = stub_sec->contents + stub_entry->stub_offset;
4019
 
4020
  stub_bfd = stub_sec->owner;
4021
 
4022
  /* This is the address of the stub destination.  */
4023
  sym_value = (stub_entry->target_value
4024
               + stub_entry->target_section->output_offset
4025
               + stub_entry->target_section->output_section->vma);
4026
 
4027
  template_sequence = stub_entry->stub_template;
4028
  template_size = stub_entry->stub_template_size;
4029
 
4030
  size = 0;
4031
  for (i = 0; i < template_size; i++)
4032
    {
4033
      switch (template_sequence[i].type)
4034
        {
4035
        case THUMB16_TYPE:
4036
          {
4037
            bfd_vma data = (bfd_vma) template_sequence[i].data;
4038
            if (template_sequence[i].reloc_addend != 0)
4039
              {
4040
                /* We've borrowed the reloc_addend field to mean we should
4041
                   insert a condition code into this (Thumb-1 branch)
4042
                   instruction.  See THUMB16_BCOND_INSN.  */
4043
                BFD_ASSERT ((data & 0xff00) == 0xd000);
4044
                data |= ((stub_entry->orig_insn >> 22) & 0xf) << 8;
4045
              }
4046
            bfd_put_16 (stub_bfd, data, loc + size);
4047
            size += 2;
4048
          }
4049
          break;
4050
 
4051
        case THUMB32_TYPE:
4052
          bfd_put_16 (stub_bfd,
4053
                      (template_sequence[i].data >> 16) & 0xffff,
4054
                      loc + size);
4055
          bfd_put_16 (stub_bfd, template_sequence[i].data & 0xffff,
4056
                      loc + size + 2);
4057
          if (template_sequence[i].r_type != R_ARM_NONE)
4058
            {
4059
              stub_reloc_idx[nrelocs] = i;
4060
              stub_reloc_offset[nrelocs++] = size;
4061
            }
4062
          size += 4;
4063
          break;
4064
 
4065
        case ARM_TYPE:
4066
          bfd_put_32 (stub_bfd, template_sequence[i].data,
4067
                      loc + size);
4068
          /* Handle cases where the target is encoded within the
4069
             instruction.  */
4070
          if (template_sequence[i].r_type == R_ARM_JUMP24)
4071
            {
4072
              stub_reloc_idx[nrelocs] = i;
4073
              stub_reloc_offset[nrelocs++] = size;
4074
            }
4075
          size += 4;
4076
          break;
4077
 
4078
        case DATA_TYPE:
4079
          bfd_put_32 (stub_bfd, template_sequence[i].data, loc + size);
4080
          stub_reloc_idx[nrelocs] = i;
4081
          stub_reloc_offset[nrelocs++] = size;
4082
          size += 4;
4083
          break;
4084
 
4085
        default:
4086
          BFD_FAIL ();
4087
          return FALSE;
4088
        }
4089
    }
4090
 
4091
  stub_sec->size += size;
4092
 
4093
  /* Stub size has already been computed in arm_size_one_stub. Check
4094
     consistency.  */
4095
  BFD_ASSERT (size == stub_entry->stub_size);
4096
 
4097
  /* Destination is Thumb. Force bit 0 to 1 to reflect this.  */
4098
  if (stub_entry->branch_type == ST_BRANCH_TO_THUMB)
4099
    sym_value |= 1;
4100
 
4101
  /* Assume there is at least one and at most MAXRELOCS entries to relocate
4102
     in each stub.  */
4103
  BFD_ASSERT (nrelocs != 0 && nrelocs <= MAXRELOCS);
4104
 
4105
  for (i = 0; i < nrelocs; i++)
4106
    if (template_sequence[stub_reloc_idx[i]].r_type == R_ARM_THM_JUMP24
4107
        || template_sequence[stub_reloc_idx[i]].r_type == R_ARM_THM_JUMP19
4108
        || template_sequence[stub_reloc_idx[i]].r_type == R_ARM_THM_CALL
4109
        || template_sequence[stub_reloc_idx[i]].r_type == R_ARM_THM_XPC22)
4110
      {
4111
        Elf_Internal_Rela rel;
4112
        bfd_boolean unresolved_reloc;
4113
        char *error_message;
4114
        enum arm_st_branch_type branch_type
4115
          = (template_sequence[stub_reloc_idx[i]].r_type != R_ARM_THM_XPC22
4116
             ? ST_BRANCH_TO_THUMB : ST_BRANCH_TO_ARM);
4117
        bfd_vma points_to = sym_value + stub_entry->target_addend;
4118
 
4119
        rel.r_offset = stub_entry->stub_offset + stub_reloc_offset[i];
4120
        rel.r_info = ELF32_R_INFO (0,
4121
                                   template_sequence[stub_reloc_idx[i]].r_type);
4122
        rel.r_addend = template_sequence[stub_reloc_idx[i]].reloc_addend;
4123
 
4124
        if (stub_entry->stub_type == arm_stub_a8_veneer_b_cond && i == 0)
4125
          /* The first relocation in the elf32_arm_stub_a8_veneer_b_cond[]
4126
             template should refer back to the instruction after the original
4127
             branch.  */
4128
          points_to = sym_value;
4129
 
4130
        /* There may be unintended consequences if this is not true.  */
4131
        BFD_ASSERT (stub_entry->h == NULL);
4132
 
4133
        /* Note: _bfd_final_link_relocate doesn't handle these relocations
4134
           properly.  We should probably use this function unconditionally,
4135
           rather than only for certain relocations listed in the enclosing
4136
           conditional, for the sake of consistency.  */
4137
        elf32_arm_final_link_relocate (elf32_arm_howto_from_type
4138
            (template_sequence[stub_reloc_idx[i]].r_type),
4139
          stub_bfd, info->output_bfd, stub_sec, stub_sec->contents, &rel,
4140
          points_to, info, stub_entry->target_section, "", STT_FUNC,
4141
          branch_type, (struct elf_link_hash_entry *) stub_entry->h,
4142
          &unresolved_reloc, &error_message);
4143
      }
4144
    else
4145
      {
4146
        Elf_Internal_Rela rel;
4147
        bfd_boolean unresolved_reloc;
4148
        char *error_message;
4149
        bfd_vma points_to = sym_value + stub_entry->target_addend
4150
          + template_sequence[stub_reloc_idx[i]].reloc_addend;
4151
 
4152
        rel.r_offset = stub_entry->stub_offset + stub_reloc_offset[i];
4153
        rel.r_info = ELF32_R_INFO (0,
4154
                                   template_sequence[stub_reloc_idx[i]].r_type);
4155
        rel.r_addend = 0;
4156
 
4157
        elf32_arm_final_link_relocate (elf32_arm_howto_from_type
4158
            (template_sequence[stub_reloc_idx[i]].r_type),
4159
          stub_bfd, info->output_bfd, stub_sec, stub_sec->contents, &rel,
4160
          points_to, info, stub_entry->target_section, "", STT_FUNC,
4161
          stub_entry->branch_type,
4162
          (struct elf_link_hash_entry *) stub_entry->h, &unresolved_reloc,
4163
          &error_message);
4164
      }
4165
 
4166
  return TRUE;
4167
#undef MAXRELOCS
4168
}
4169
 
4170
/* Calculate the template, template size and instruction size for a stub.
4171
   Return value is the instruction size.  */
4172
 
4173
static unsigned int
4174
find_stub_size_and_template (enum elf32_arm_stub_type stub_type,
4175
                             const insn_sequence **stub_template,
4176
                             int *stub_template_size)
4177
{
4178
  const insn_sequence *template_sequence = NULL;
4179
  int template_size = 0, i;
4180
  unsigned int size;
4181
 
4182
  template_sequence = stub_definitions[stub_type].template_sequence;
4183
  if (stub_template)
4184
    *stub_template = template_sequence;
4185
 
4186
  template_size = stub_definitions[stub_type].template_size;
4187
  if (stub_template_size)
4188
    *stub_template_size = template_size;
4189
 
4190
  size = 0;
4191
  for (i = 0; i < template_size; i++)
4192
    {
4193
      switch (template_sequence[i].type)
4194
        {
4195
        case THUMB16_TYPE:
4196
          size += 2;
4197
          break;
4198
 
4199
        case ARM_TYPE:
4200
        case THUMB32_TYPE:
4201
        case DATA_TYPE:
4202
          size += 4;
4203
          break;
4204
 
4205
        default:
4206
          BFD_FAIL ();
4207
          return 0;
4208
        }
4209
    }
4210
 
4211
  return size;
4212
}
4213
 
4214
/* As above, but don't actually build the stub.  Just bump offset so
4215
   we know stub section sizes.  */
4216
 
4217
static bfd_boolean
4218
arm_size_one_stub (struct bfd_hash_entry *gen_entry,
4219
                   void *in_arg ATTRIBUTE_UNUSED)
4220
{
4221
  struct elf32_arm_stub_hash_entry *stub_entry;
4222
  const insn_sequence *template_sequence;
4223
  int template_size, size;
4224
 
4225
  /* Massage our args to the form they really have.  */
4226
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
4227
 
4228
  BFD_ASSERT((stub_entry->stub_type > arm_stub_none)
4229
             && stub_entry->stub_type < ARRAY_SIZE(stub_definitions));
4230
 
4231
  size = find_stub_size_and_template (stub_entry->stub_type, &template_sequence,
4232
                                      &template_size);
4233
 
4234
  stub_entry->stub_size = size;
4235
  stub_entry->stub_template = template_sequence;
4236
  stub_entry->stub_template_size = template_size;
4237
 
4238
  size = (size + 7) & ~7;
4239
  stub_entry->stub_sec->size += size;
4240
 
4241
  return TRUE;
4242
}
4243
 
4244
/* External entry points for sizing and building linker stubs.  */
4245
 
4246
/* Set up various things so that we can make a list of input sections
4247
   for each output section included in the link.  Returns -1 on error,
4248
 
4249
 
4250
int
4251
elf32_arm_setup_section_lists (bfd *output_bfd,
4252
                               struct bfd_link_info *info)
4253
{
4254
  bfd *input_bfd;
4255
  unsigned int bfd_count;
4256
  int top_id, top_index;
4257
  asection *section;
4258
  asection **input_list, **list;
4259
  bfd_size_type amt;
4260
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
4261
 
4262
  if (htab == NULL)
4263
    return 0;
4264
  if (! is_elf_hash_table (htab))
4265
    return 0;
4266
 
4267
  /* Count the number of input BFDs and find the top input section id.  */
4268
  for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
4269
       input_bfd != NULL;
4270
       input_bfd = input_bfd->link_next)
4271
    {
4272
      bfd_count += 1;
4273
      for (section = input_bfd->sections;
4274
           section != NULL;
4275
           section = section->next)
4276
        {
4277
          if (top_id < section->id)
4278
            top_id = section->id;
4279
        }
4280
    }
4281
  htab->bfd_count = bfd_count;
4282
 
4283
  amt = sizeof (struct map_stub) * (top_id + 1);
4284
  htab->stub_group = (struct map_stub *) bfd_zmalloc (amt);
4285
  if (htab->stub_group == NULL)
4286
    return -1;
4287
  htab->top_id = top_id;
4288
 
4289
  /* We can't use output_bfd->section_count here to find the top output
4290
     section index as some sections may have been removed, and
4291
     _bfd_strip_section_from_output doesn't renumber the indices.  */
4292
  for (section = output_bfd->sections, top_index = 0;
4293
       section != NULL;
4294
       section = section->next)
4295
    {
4296
      if (top_index < section->index)
4297
        top_index = section->index;
4298
    }
4299
 
4300
  htab->top_index = top_index;
4301
  amt = sizeof (asection *) * (top_index + 1);
4302
  input_list = (asection **) bfd_malloc (amt);
4303
  htab->input_list = input_list;
4304
  if (input_list == NULL)
4305
    return -1;
4306
 
4307
  /* For sections we aren't interested in, mark their entries with a
4308
     value we can check later.  */
4309
  list = input_list + top_index;
4310
  do
4311
    *list = bfd_abs_section_ptr;
4312
  while (list-- != input_list);
4313
 
4314
  for (section = output_bfd->sections;
4315
       section != NULL;
4316
       section = section->next)
4317
    {
4318
      if ((section->flags & SEC_CODE) != 0)
4319
        input_list[section->index] = NULL;
4320
    }
4321
 
4322
  return 1;
4323
}
4324
 
4325
/* The linker repeatedly calls this function for each input section,
4326
   in the order that input sections are linked into output sections.
4327
   Build lists of input sections to determine groupings between which
4328
   we may insert linker stubs.  */
4329
 
4330
void
4331
elf32_arm_next_input_section (struct bfd_link_info *info,
4332
                              asection *isec)
4333
{
4334
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
4335
 
4336
  if (htab == NULL)
4337
    return;
4338
 
4339
  if (isec->output_section->index <= htab->top_index)
4340
    {
4341
      asection **list = htab->input_list + isec->output_section->index;
4342
 
4343
      if (*list != bfd_abs_section_ptr && (isec->flags & SEC_CODE) != 0)
4344
        {
4345
          /* Steal the link_sec pointer for our list.  */
4346
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
4347
          /* This happens to make the list in reverse order,
4348
             which we reverse later.  */
4349
          PREV_SEC (isec) = *list;
4350
          *list = isec;
4351
        }
4352
    }
4353
}
4354
 
4355
/* See whether we can group stub sections together.  Grouping stub
4356
   sections may result in fewer stubs.  More importantly, we need to
4357
   put all .init* and .fini* stubs at the end of the .init or
4358
   .fini output sections respectively, because glibc splits the
4359
   _init and _fini functions into multiple parts.  Putting a stub in
4360
   the middle of a function is not a good idea.  */
4361
 
4362
static void
4363
group_sections (struct elf32_arm_link_hash_table *htab,
4364
                bfd_size_type stub_group_size,
4365
                bfd_boolean stubs_always_after_branch)
4366
{
4367
  asection **list = htab->input_list;
4368
 
4369
  do
4370
    {
4371
      asection *tail = *list;
4372
      asection *head;
4373
 
4374
      if (tail == bfd_abs_section_ptr)
4375
        continue;
4376
 
4377
      /* Reverse the list: we must avoid placing stubs at the
4378
         beginning of the section because the beginning of the text
4379
         section may be required for an interrupt vector in bare metal
4380
         code.  */
4381
#define NEXT_SEC PREV_SEC
4382
      head = NULL;
4383
      while (tail != NULL)
4384
        {
4385
          /* Pop from tail.  */
4386
          asection *item = tail;
4387
          tail = PREV_SEC (item);
4388
 
4389
          /* Push on head.  */
4390
          NEXT_SEC (item) = head;
4391
          head = item;
4392
        }
4393
 
4394
      while (head != NULL)
4395
        {
4396
          asection *curr;
4397
          asection *next;
4398
          bfd_vma stub_group_start = head->output_offset;
4399
          bfd_vma end_of_next;
4400
 
4401
          curr = head;
4402
          while (NEXT_SEC (curr) != NULL)
4403
            {
4404
              next = NEXT_SEC (curr);
4405
              end_of_next = next->output_offset + next->size;
4406
              if (end_of_next - stub_group_start >= stub_group_size)
4407
                /* End of NEXT is too far from start, so stop.  */
4408
                break;
4409
              /* Add NEXT to the group.  */
4410
              curr = next;
4411
            }
4412
 
4413
          /* OK, the size from the start to the start of CURR is less
4414
             than stub_group_size and thus can be handled by one stub
4415
             section.  (Or the head section is itself larger than
4416
             stub_group_size, in which case we may be toast.)
4417
             We should really be keeping track of the total size of
4418
             stubs added here, as stubs contribute to the final output
4419
             section size.  */
4420
          do
4421
            {
4422
              next = NEXT_SEC (head);
4423
              /* Set up this stub group.  */
4424
              htab->stub_group[head->id].link_sec = curr;
4425
            }
4426
          while (head != curr && (head = next) != NULL);
4427
 
4428
          /* But wait, there's more!  Input sections up to stub_group_size
4429
             bytes after the stub section can be handled by it too.  */
4430
          if (!stubs_always_after_branch)
4431
            {
4432
              stub_group_start = curr->output_offset + curr->size;
4433
 
4434
              while (next != NULL)
4435
                {
4436
                  end_of_next = next->output_offset + next->size;
4437
                  if (end_of_next - stub_group_start >= stub_group_size)
4438
                    /* End of NEXT is too far from stubs, so stop.  */
4439
                    break;
4440
                  /* Add NEXT to the stub group.  */
4441
                  head = next;
4442
                  next = NEXT_SEC (head);
4443
                  htab->stub_group[head->id].link_sec = curr;
4444
                }
4445
            }
4446
          head = next;
4447
        }
4448
    }
4449
  while (list++ != htab->input_list + htab->top_index);
4450
 
4451
  free (htab->input_list);
4452
#undef PREV_SEC
4453
#undef NEXT_SEC
4454
}
4455
 
4456
/* Comparison function for sorting/searching relocations relating to Cortex-A8
4457
   erratum fix.  */
4458
 
4459
static int
4460
a8_reloc_compare (const void *a, const void *b)
4461
{
4462
  const struct a8_erratum_reloc *ra = (const struct a8_erratum_reloc *) a;
4463
  const struct a8_erratum_reloc *rb = (const struct a8_erratum_reloc *) b;
4464
 
4465
  if (ra->from < rb->from)
4466
    return -1;
4467
  else if (ra->from > rb->from)
4468
    return 1;
4469
  else
4470
    return 0;
4471
}
4472
 
4473
static struct elf_link_hash_entry *find_thumb_glue (struct bfd_link_info *,
4474
                                                    const char *, char **);
4475
 
4476
/* Helper function to scan code for sequences which might trigger the Cortex-A8
4477
   branch/TLB erratum.  Fill in the table described by A8_FIXES_P,
4478
   NUM_A8_FIXES_P, A8_FIX_TABLE_SIZE_P.  Returns true if an error occurs, false
4479
   otherwise.  */
4480
 
4481
static bfd_boolean
4482
cortex_a8_erratum_scan (bfd *input_bfd,
4483
                        struct bfd_link_info *info,
4484
                        struct a8_erratum_fix **a8_fixes_p,
4485
                        unsigned int *num_a8_fixes_p,
4486
                        unsigned int *a8_fix_table_size_p,
4487
                        struct a8_erratum_reloc *a8_relocs,
4488
                        unsigned int num_a8_relocs,
4489
                        unsigned prev_num_a8_fixes,
4490
                        bfd_boolean *stub_changed_p)
4491
{
4492
  asection *section;
4493
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
4494
  struct a8_erratum_fix *a8_fixes = *a8_fixes_p;
4495
  unsigned int num_a8_fixes = *num_a8_fixes_p;
4496
  unsigned int a8_fix_table_size = *a8_fix_table_size_p;
4497
 
4498
  if (htab == NULL)
4499
    return FALSE;
4500
 
4501
  for (section = input_bfd->sections;
4502
       section != NULL;
4503
       section = section->next)
4504
    {
4505
      bfd_byte *contents = NULL;
4506
      struct _arm_elf_section_data *sec_data;
4507
      unsigned int span;
4508
      bfd_vma base_vma;
4509
 
4510
      if (elf_section_type (section) != SHT_PROGBITS
4511
          || (elf_section_flags (section) & SHF_EXECINSTR) == 0
4512
          || (section->flags & SEC_EXCLUDE) != 0
4513
          || (section->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
4514
          || (section->output_section == bfd_abs_section_ptr))
4515
        continue;
4516
 
4517
      base_vma = section->output_section->vma + section->output_offset;
4518
 
4519
      if (elf_section_data (section)->this_hdr.contents != NULL)
4520
        contents = elf_section_data (section)->this_hdr.contents;
4521
      else if (! bfd_malloc_and_get_section (input_bfd, section, &contents))
4522
        return TRUE;
4523
 
4524
      sec_data = elf32_arm_section_data (section);
4525
 
4526
      for (span = 0; span < sec_data->mapcount; span++)
4527
        {
4528
          unsigned int span_start = sec_data->map[span].vma;
4529
          unsigned int span_end = (span == sec_data->mapcount - 1)
4530
            ? section->size : sec_data->map[span + 1].vma;
4531
          unsigned int i;
4532
          char span_type = sec_data->map[span].type;
4533
          bfd_boolean last_was_32bit = FALSE, last_was_branch = FALSE;
4534
 
4535
          if (span_type != 't')
4536
            continue;
4537
 
4538
          /* Span is entirely within a single 4KB region: skip scanning.  */
4539
          if (((base_vma + span_start) & ~0xfff)
4540
              == ((base_vma + span_end) & ~0xfff))
4541
            continue;
4542
 
4543
          /* Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
4544
 
4545
               * The opcode is BLX.W, BL.W, B.W, Bcc.W
4546
               * The branch target is in the same 4KB region as the
4547
                 first half of the branch.
4548
               * The instruction before the branch is a 32-bit
4549
                 length non-branch instruction.  */
4550
          for (i = span_start; i < span_end;)
4551
            {
4552
              unsigned int insn = bfd_getl16 (&contents[i]);
4553
              bfd_boolean insn_32bit = FALSE, is_blx = FALSE, is_b = FALSE;
4554
              bfd_boolean is_bl = FALSE, is_bcc = FALSE, is_32bit_branch;
4555
 
4556
              if ((insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000)
4557
                insn_32bit = TRUE;
4558
 
4559
              if (insn_32bit)
4560
                {
4561
                  /* Load the rest of the insn (in manual-friendly order).  */
4562
                  insn = (insn << 16) | bfd_getl16 (&contents[i + 2]);
4563
 
4564
                  /* Encoding T4: B<c>.W.  */
4565
                  is_b = (insn & 0xf800d000) == 0xf0009000;
4566
                  /* Encoding T1: BL<c>.W.  */
4567
                  is_bl = (insn & 0xf800d000) == 0xf000d000;
4568
                  /* Encoding T2: BLX<c>.W.  */
4569
                  is_blx = (insn & 0xf800d000) == 0xf000c000;
4570
                  /* Encoding T3: B<c>.W (not permitted in IT block).  */
4571
                  is_bcc = (insn & 0xf800d000) == 0xf0008000
4572
                           && (insn & 0x07f00000) != 0x03800000;
4573
                }
4574
 
4575
              is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
4576
 
4577
              if (((base_vma + i) & 0xfff) == 0xffe
4578
                  && insn_32bit
4579
                  && is_32bit_branch
4580
                  && last_was_32bit
4581
                  && ! last_was_branch)
4582
                {
4583
                  bfd_signed_vma offset = 0;
4584
                  bfd_boolean force_target_arm = FALSE;
4585
                  bfd_boolean force_target_thumb = FALSE;
4586
                  bfd_vma target;
4587
                  enum elf32_arm_stub_type stub_type = arm_stub_none;
4588
                  struct a8_erratum_reloc key, *found;
4589
                  bfd_boolean use_plt = FALSE;
4590
 
4591
                  key.from = base_vma + i;
4592
                  found = (struct a8_erratum_reloc *)
4593
                      bsearch (&key, a8_relocs, num_a8_relocs,
4594
                               sizeof (struct a8_erratum_reloc),
4595
                               &a8_reloc_compare);
4596
 
4597
                  if (found)
4598
                    {
4599
                      char *error_message = NULL;
4600
                      struct elf_link_hash_entry *entry;
4601
 
4602
                      /* We don't care about the error returned from this
4603
                         function, only if there is glue or not.  */
4604
                      entry = find_thumb_glue (info, found->sym_name,
4605
                                               &error_message);
4606
 
4607
                      if (entry)
4608
                        found->non_a8_stub = TRUE;
4609
 
4610
                      /* Keep a simpler condition, for the sake of clarity.  */
4611
                      if (htab->root.splt != NULL && found->hash != NULL
4612
                          && found->hash->root.plt.offset != (bfd_vma) -1)
4613
                        use_plt = TRUE;
4614
 
4615
                      if (found->r_type == R_ARM_THM_CALL)
4616
                        {
4617
                          if (found->branch_type == ST_BRANCH_TO_ARM
4618
                              || use_plt)
4619
                            force_target_arm = TRUE;
4620
                          else
4621
                            force_target_thumb = TRUE;
4622
                        }
4623
                    }
4624
 
4625
                  /* Check if we have an offending branch instruction.  */
4626
 
4627
                  if (found && found->non_a8_stub)
4628
                    /* We've already made a stub for this instruction, e.g.
4629
                       it's a long branch or a Thumb->ARM stub.  Assume that
4630
                       stub will suffice to work around the A8 erratum (see
4631
                       setting of always_after_branch above).  */
4632
                    ;
4633
                  else if (is_bcc)
4634
                    {
4635
                      offset = (insn & 0x7ff) << 1;
4636
                      offset |= (insn & 0x3f0000) >> 4;
4637
                      offset |= (insn & 0x2000) ? 0x40000 : 0;
4638
                      offset |= (insn & 0x800) ? 0x80000 : 0;
4639
                      offset |= (insn & 0x4000000) ? 0x100000 : 0;
4640
                      if (offset & 0x100000)
4641
                        offset |= ~ ((bfd_signed_vma) 0xfffff);
4642
                      stub_type = arm_stub_a8_veneer_b_cond;
4643
                    }
4644
                  else if (is_b || is_bl || is_blx)
4645
                    {
4646
                      int s = (insn & 0x4000000) != 0;
4647
                      int j1 = (insn & 0x2000) != 0;
4648
                      int j2 = (insn & 0x800) != 0;
4649
                      int i1 = !(j1 ^ s);
4650
                      int i2 = !(j2 ^ s);
4651
 
4652
                      offset = (insn & 0x7ff) << 1;
4653
                      offset |= (insn & 0x3ff0000) >> 4;
4654
                      offset |= i2 << 22;
4655
                      offset |= i1 << 23;
4656
                      offset |= s << 24;
4657
                      if (offset & 0x1000000)
4658
                        offset |= ~ ((bfd_signed_vma) 0xffffff);
4659
 
4660
                      if (is_blx)
4661
                        offset &= ~ ((bfd_signed_vma) 3);
4662
 
4663
                      stub_type = is_blx ? arm_stub_a8_veneer_blx :
4664
                        is_bl ? arm_stub_a8_veneer_bl : arm_stub_a8_veneer_b;
4665
                    }
4666
 
4667
                  if (stub_type != arm_stub_none)
4668
                    {
4669
                      bfd_vma pc_for_insn = base_vma + i + 4;
4670
 
4671
                      /* The original instruction is a BL, but the target is
4672
                         an ARM instruction.  If we were not making a stub,
4673
                         the BL would have been converted to a BLX.  Use the
4674
                         BLX stub instead in that case.  */
4675
                      if (htab->use_blx && force_target_arm
4676
                          && stub_type == arm_stub_a8_veneer_bl)
4677
                        {
4678
                          stub_type = arm_stub_a8_veneer_blx;
4679
                          is_blx = TRUE;
4680
                          is_bl = FALSE;
4681
                        }
4682
                      /* Conversely, if the original instruction was
4683
                         BLX but the target is Thumb mode, use the BL
4684
                         stub.  */
4685
                      else if (force_target_thumb
4686
                               && stub_type == arm_stub_a8_veneer_blx)
4687
                        {
4688
                          stub_type = arm_stub_a8_veneer_bl;
4689
                          is_blx = FALSE;
4690
                          is_bl = TRUE;
4691
                        }
4692
 
4693
                      if (is_blx)
4694
                        pc_for_insn &= ~ ((bfd_vma) 3);
4695
 
4696
                      /* If we found a relocation, use the proper destination,
4697
                         not the offset in the (unrelocated) instruction.
4698
                         Note this is always done if we switched the stub type
4699
                         above.  */
4700
                      if (found)
4701
                        offset =
4702
                          (bfd_signed_vma) (found->destination - pc_for_insn);
4703
 
4704
                      /* If the stub will use a Thumb-mode branch to a
4705
                         PLT target, redirect it to the preceding Thumb
4706
                         entry point.  */
4707
                      if (stub_type != arm_stub_a8_veneer_blx && use_plt)
4708
                        offset -= PLT_THUMB_STUB_SIZE;
4709
 
4710
                      target = pc_for_insn + offset;
4711
 
4712
                      /* The BLX stub is ARM-mode code.  Adjust the offset to
4713
                         take the different PC value (+8 instead of +4) into
4714
                         account.  */
4715
                      if (stub_type == arm_stub_a8_veneer_blx)
4716
                        offset += 4;
4717
 
4718
                      if (((base_vma + i) & ~0xfff) == (target & ~0xfff))
4719
                        {
4720
                          char *stub_name = NULL;
4721
 
4722
                          if (num_a8_fixes == a8_fix_table_size)
4723
                            {
4724
                              a8_fix_table_size *= 2;
4725
                              a8_fixes = (struct a8_erratum_fix *)
4726
                                  bfd_realloc (a8_fixes,
4727
                                               sizeof (struct a8_erratum_fix)
4728
                                               * a8_fix_table_size);
4729
                            }
4730
 
4731
                          if (num_a8_fixes < prev_num_a8_fixes)
4732
                            {
4733
                              /* If we're doing a subsequent scan,
4734
                                 check if we've found the same fix as
4735
                                 before, and try and reuse the stub
4736
                                 name.  */
4737
                              stub_name = a8_fixes[num_a8_fixes].stub_name;
4738
                              if ((a8_fixes[num_a8_fixes].section != section)
4739
                                  || (a8_fixes[num_a8_fixes].offset != i))
4740
                                {
4741
                                  free (stub_name);
4742
                                  stub_name = NULL;
4743
                                  *stub_changed_p = TRUE;
4744
                                }
4745
                            }
4746
 
4747
                          if (!stub_name)
4748
                            {
4749
                              stub_name = (char *) bfd_malloc (8 + 1 + 8 + 1);
4750
                              if (stub_name != NULL)
4751
                                sprintf (stub_name, "%x:%x", section->id, i);
4752
                            }
4753
 
4754
                          a8_fixes[num_a8_fixes].input_bfd = input_bfd;
4755
                          a8_fixes[num_a8_fixes].section = section;
4756
                          a8_fixes[num_a8_fixes].offset = i;
4757
                          a8_fixes[num_a8_fixes].addend = offset;
4758
                          a8_fixes[num_a8_fixes].orig_insn = insn;
4759
                          a8_fixes[num_a8_fixes].stub_name = stub_name;
4760
                          a8_fixes[num_a8_fixes].stub_type = stub_type;
4761
                          a8_fixes[num_a8_fixes].branch_type =
4762
                            is_blx ? ST_BRANCH_TO_ARM : ST_BRANCH_TO_THUMB;
4763
 
4764
                          num_a8_fixes++;
4765
                        }
4766
                    }
4767
                }
4768
 
4769
              i += insn_32bit ? 4 : 2;
4770
              last_was_32bit = insn_32bit;
4771
              last_was_branch = is_32bit_branch;
4772
            }
4773
        }
4774
 
4775
      if (elf_section_data (section)->this_hdr.contents == NULL)
4776
        free (contents);
4777
    }
4778
 
4779
  *a8_fixes_p = a8_fixes;
4780
  *num_a8_fixes_p = num_a8_fixes;
4781
  *a8_fix_table_size_p = a8_fix_table_size;
4782
 
4783
  return FALSE;
4784
}
4785
 
4786
/* Determine and set the size of the stub section for a final link.
4787
 
4788
   The basic idea here is to examine all the relocations looking for
4789
   PC-relative calls to a target that is unreachable with a "bl"
4790
   instruction.  */
4791
 
4792
bfd_boolean
4793
elf32_arm_size_stubs (bfd *output_bfd,
4794
                      bfd *stub_bfd,
4795
                      struct bfd_link_info *info,
4796
                      bfd_signed_vma group_size,
4797
                      asection * (*add_stub_section) (const char *, asection *),
4798
                      void (*layout_sections_again) (void))
4799
{
4800
  bfd_size_type stub_group_size;
4801
  bfd_boolean stubs_always_after_branch;
4802
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
4803
  struct a8_erratum_fix *a8_fixes = NULL;
4804
  unsigned int num_a8_fixes = 0, a8_fix_table_size = 10;
4805
  struct a8_erratum_reloc *a8_relocs = NULL;
4806
  unsigned int num_a8_relocs = 0, a8_reloc_table_size = 10, i;
4807
 
4808
  if (htab == NULL)
4809
    return FALSE;
4810
 
4811
  if (htab->fix_cortex_a8)
4812
    {
4813
      a8_fixes = (struct a8_erratum_fix *)
4814
          bfd_zmalloc (sizeof (struct a8_erratum_fix) * a8_fix_table_size);
4815
      a8_relocs = (struct a8_erratum_reloc *)
4816
          bfd_zmalloc (sizeof (struct a8_erratum_reloc) * a8_reloc_table_size);
4817
    }
4818
 
4819
  /* Propagate mach to stub bfd, because it may not have been
4820
     finalized when we created stub_bfd.  */
4821
  bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
4822
                     bfd_get_mach (output_bfd));
4823
 
4824
  /* Stash our params away.  */
4825
  htab->stub_bfd = stub_bfd;
4826
  htab->add_stub_section = add_stub_section;
4827
  htab->layout_sections_again = layout_sections_again;
4828
  stubs_always_after_branch = group_size < 0;
4829
 
4830
  /* The Cortex-A8 erratum fix depends on stubs not being in the same 4K page
4831
     as the first half of a 32-bit branch straddling two 4K pages.  This is a
4832
     crude way of enforcing that.  */
4833
  if (htab->fix_cortex_a8)
4834
    stubs_always_after_branch = 1;
4835
 
4836
  if (group_size < 0)
4837
    stub_group_size = -group_size;
4838
  else
4839
    stub_group_size = group_size;
4840
 
4841
  if (stub_group_size == 1)
4842
    {
4843
      /* Default values.  */
4844
      /* Thumb branch range is +-4MB has to be used as the default
4845
         maximum size (a given section can contain both ARM and Thumb
4846
         code, so the worst case has to be taken into account).
4847
 
4848
         This value is 24K less than that, which allows for 2025
4849
         12-byte stubs.  If we exceed that, then we will fail to link.
4850
         The user will have to relink with an explicit group size
4851
         option.  */
4852
      stub_group_size = 4170000;
4853
    }
4854
 
4855
  group_sections (htab, stub_group_size, stubs_always_after_branch);
4856
 
4857
  /* If we're applying the cortex A8 fix, we need to determine the
4858
     program header size now, because we cannot change it later --
4859
     that could alter section placements.  Notice the A8 erratum fix
4860
     ends up requiring the section addresses to remain unchanged
4861
     modulo the page size.  That's something we cannot represent
4862
     inside BFD, and we don't want to force the section alignment to
4863
     be the page size.  */
4864
  if (htab->fix_cortex_a8)
4865
    (*htab->layout_sections_again) ();
4866
 
4867
  while (1)
4868
    {
4869
      bfd *input_bfd;
4870
      unsigned int bfd_indx;
4871
      asection *stub_sec;
4872
      bfd_boolean stub_changed = FALSE;
4873
      unsigned prev_num_a8_fixes = num_a8_fixes;
4874
 
4875
      num_a8_fixes = 0;
4876
      for (input_bfd = info->input_bfds, bfd_indx = 0;
4877
           input_bfd != NULL;
4878
           input_bfd = input_bfd->link_next, bfd_indx++)
4879
        {
4880
          Elf_Internal_Shdr *symtab_hdr;
4881
          asection *section;
4882
          Elf_Internal_Sym *local_syms = NULL;
4883
 
4884
          num_a8_relocs = 0;
4885
 
4886
          /* We'll need the symbol table in a second.  */
4887
          symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4888
          if (symtab_hdr->sh_info == 0)
4889
            continue;
4890
 
4891
          /* Walk over each section attached to the input bfd.  */
4892
          for (section = input_bfd->sections;
4893
               section != NULL;
4894
               section = section->next)
4895
            {
4896
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
4897
 
4898
              /* If there aren't any relocs, then there's nothing more
4899
                 to do.  */
4900
              if ((section->flags & SEC_RELOC) == 0
4901
                  || section->reloc_count == 0
4902
                  || (section->flags & SEC_CODE) == 0)
4903
                continue;
4904
 
4905
              /* If this section is a link-once section that will be
4906
                 discarded, then don't create any stubs.  */
4907
              if (section->output_section == NULL
4908
                  || section->output_section->owner != output_bfd)
4909
                continue;
4910
 
4911
              /* Get the relocs.  */
4912
              internal_relocs
4913
                = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
4914
                                             NULL, info->keep_memory);
4915
              if (internal_relocs == NULL)
4916
                goto error_ret_free_local;
4917
 
4918
              /* Now examine each relocation.  */
4919
              irela = internal_relocs;
4920
              irelaend = irela + section->reloc_count;
4921
              for (; irela < irelaend; irela++)
4922
                {
4923
                  unsigned int r_type, r_indx;
4924
                  enum elf32_arm_stub_type stub_type;
4925
                  struct elf32_arm_stub_hash_entry *stub_entry;
4926
                  asection *sym_sec;
4927
                  bfd_vma sym_value;
4928
                  bfd_vma destination;
4929
                  struct elf32_arm_link_hash_entry *hash;
4930
                  const char *sym_name;
4931
                  char *stub_name;
4932
                  const asection *id_sec;
4933
                  unsigned char st_type;
4934
                  enum arm_st_branch_type branch_type;
4935
                  bfd_boolean created_stub = FALSE;
4936
 
4937
                  r_type = ELF32_R_TYPE (irela->r_info);
4938
                  r_indx = ELF32_R_SYM (irela->r_info);
4939
 
4940
                  if (r_type >= (unsigned int) R_ARM_max)
4941
                    {
4942
                      bfd_set_error (bfd_error_bad_value);
4943
                    error_ret_free_internal:
4944
                      if (elf_section_data (section)->relocs == NULL)
4945
                        free (internal_relocs);
4946
                      goto error_ret_free_local;
4947
                    }
4948
 
4949
                  hash = NULL;
4950
                  if (r_indx >= symtab_hdr->sh_info)
4951
                    hash = elf32_arm_hash_entry
4952
                      (elf_sym_hashes (input_bfd)
4953
                       [r_indx - symtab_hdr->sh_info]);
4954
 
4955
                  /* Only look for stubs on branch instructions, or
4956
                     non-relaxed TLSCALL  */
4957
                  if ((r_type != (unsigned int) R_ARM_CALL)
4958
                      && (r_type != (unsigned int) R_ARM_THM_CALL)
4959
                      && (r_type != (unsigned int) R_ARM_JUMP24)
4960
                      && (r_type != (unsigned int) R_ARM_THM_JUMP19)
4961
                      && (r_type != (unsigned int) R_ARM_THM_XPC22)
4962
                      && (r_type != (unsigned int) R_ARM_THM_JUMP24)
4963
                      && (r_type != (unsigned int) R_ARM_PLT32)
4964
                      && !((r_type == (unsigned int) R_ARM_TLS_CALL
4965
                            || r_type == (unsigned int) R_ARM_THM_TLS_CALL)
4966
                           && r_type == elf32_arm_tls_transition
4967
                               (info, r_type, &hash->root)
4968
                           && ((hash ? hash->tls_type
4969
                                : (elf32_arm_local_got_tls_type
4970
                                   (input_bfd)[r_indx]))
4971
                               & GOT_TLS_GDESC) != 0))
4972
                    continue;
4973
 
4974
                  /* Now determine the call target, its name, value,
4975
                     section.  */
4976
                  sym_sec = NULL;
4977
                  sym_value = 0;
4978
                  destination = 0;
4979
                  sym_name = NULL;
4980
 
4981
                  if (r_type == (unsigned int) R_ARM_TLS_CALL
4982
                      || r_type == (unsigned int) R_ARM_THM_TLS_CALL)
4983
                    {
4984
                      /* A non-relaxed TLS call.  The target is the
4985
                         plt-resident trampoline and nothing to do
4986
                         with the symbol.  */
4987
                      BFD_ASSERT (htab->tls_trampoline > 0);
4988
                      sym_sec = htab->root.splt;
4989
                      sym_value = htab->tls_trampoline;
4990
                      hash = 0;
4991
                      st_type = STT_FUNC;
4992
                      branch_type = ST_BRANCH_TO_ARM;
4993
                    }
4994
                  else if (!hash)
4995
                    {
4996
                      /* It's a local symbol.  */
4997
                      Elf_Internal_Sym *sym;
4998
 
4999
                      if (local_syms == NULL)
5000
                        {
5001
                          local_syms
5002
                            = (Elf_Internal_Sym *) symtab_hdr->contents;
5003
                          if (local_syms == NULL)
5004
                            local_syms
5005
                              = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
5006
                                                      symtab_hdr->sh_info, 0,
5007
                                                      NULL, NULL, NULL);
5008
                          if (local_syms == NULL)
5009
                            goto error_ret_free_internal;
5010
                        }
5011
 
5012
                      sym = local_syms + r_indx;
5013
                      if (sym->st_shndx == SHN_UNDEF)
5014
                        sym_sec = bfd_und_section_ptr;
5015
                      else if (sym->st_shndx == SHN_ABS)
5016
                        sym_sec = bfd_abs_section_ptr;
5017
                      else if (sym->st_shndx == SHN_COMMON)
5018
                        sym_sec = bfd_com_section_ptr;
5019
                      else
5020
                        sym_sec =
5021
                          bfd_section_from_elf_index (input_bfd, sym->st_shndx);
5022
 
5023
                      if (!sym_sec)
5024
                        /* This is an undefined symbol.  It can never
5025
                           be resolved. */
5026
                        continue;
5027
 
5028
                      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
5029
                        sym_value = sym->st_value;
5030
                      destination = (sym_value + irela->r_addend
5031
                                     + sym_sec->output_offset
5032
                                     + sym_sec->output_section->vma);
5033
                      st_type = ELF_ST_TYPE (sym->st_info);
5034
                      branch_type = ARM_SYM_BRANCH_TYPE (sym);
5035
                      sym_name
5036
                        = bfd_elf_string_from_elf_section (input_bfd,
5037
                                                           symtab_hdr->sh_link,
5038
                                                           sym->st_name);
5039
                    }
5040
                  else
5041
                    {
5042
                      /* It's an external symbol.  */
5043
                      while (hash->root.root.type == bfd_link_hash_indirect
5044
                             || hash->root.root.type == bfd_link_hash_warning)
5045
                        hash = ((struct elf32_arm_link_hash_entry *)
5046
                                hash->root.root.u.i.link);
5047
 
5048
                      if (hash->root.root.type == bfd_link_hash_defined
5049
                          || hash->root.root.type == bfd_link_hash_defweak)
5050
                        {
5051
                          sym_sec = hash->root.root.u.def.section;
5052
                          sym_value = hash->root.root.u.def.value;
5053
 
5054
                          struct elf32_arm_link_hash_table *globals =
5055
                                                  elf32_arm_hash_table (info);
5056
 
5057
                          /* For a destination in a shared library,
5058
                             use the PLT stub as target address to
5059
                             decide whether a branch stub is
5060
                             needed.  */
5061
                          if (globals != NULL
5062
                              && globals->root.splt != NULL
5063
                              && hash != NULL
5064
                              && hash->root.plt.offset != (bfd_vma) -1)
5065
                            {
5066
                              sym_sec = globals->root.splt;
5067
                              sym_value = hash->root.plt.offset;
5068
                              if (sym_sec->output_section != NULL)
5069
                                destination = (sym_value
5070
                                               + sym_sec->output_offset
5071
                                               + sym_sec->output_section->vma);
5072
                            }
5073
                          else if (sym_sec->output_section != NULL)
5074
                            destination = (sym_value + irela->r_addend
5075
                                           + sym_sec->output_offset
5076
                                           + sym_sec->output_section->vma);
5077
                        }
5078
                      else if ((hash->root.root.type == bfd_link_hash_undefined)
5079
                               || (hash->root.root.type == bfd_link_hash_undefweak))
5080
                        {
5081
                          /* For a shared library, use the PLT stub as
5082
                             target address to decide whether a long
5083
                             branch stub is needed.
5084
                             For absolute code, they cannot be handled.  */
5085
                          struct elf32_arm_link_hash_table *globals =
5086
                            elf32_arm_hash_table (info);
5087
 
5088
                          if (globals != NULL
5089
                              && globals->root.splt != NULL
5090
                              && hash != NULL
5091
                              && hash->root.plt.offset != (bfd_vma) -1)
5092
                            {
5093
                              sym_sec = globals->root.splt;
5094
                              sym_value = hash->root.plt.offset;
5095
                              if (sym_sec->output_section != NULL)
5096
                                destination = (sym_value
5097
                                               + sym_sec->output_offset
5098
                                               + sym_sec->output_section->vma);
5099
                            }
5100
                          else
5101
                            continue;
5102
                        }
5103
                      else
5104
                        {
5105
                          bfd_set_error (bfd_error_bad_value);
5106
                          goto error_ret_free_internal;
5107
                        }
5108
                      st_type = hash->root.type;
5109
                      branch_type = hash->root.target_internal;
5110
                      sym_name = hash->root.root.root.string;
5111
                    }
5112
 
5113
                  do
5114
                    {
5115
                      /* Determine what (if any) linker stub is needed.  */
5116
                      stub_type = arm_type_of_stub (info, section, irela,
5117
                                                    st_type, &branch_type,
5118
                                                    hash, destination, sym_sec,
5119
                                                    input_bfd, sym_name);
5120
                      if (stub_type == arm_stub_none)
5121
                        break;
5122
 
5123
                      /* Support for grouping stub sections.  */
5124
                      id_sec = htab->stub_group[section->id].link_sec;
5125
 
5126
                      /* Get the name of this stub.  */
5127
                      stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash,
5128
                                                       irela, stub_type);
5129
                      if (!stub_name)
5130
                        goto error_ret_free_internal;
5131
 
5132
                      /* We've either created a stub for this reloc already,
5133
                         or we are about to.  */
5134
                      created_stub = TRUE;
5135
 
5136
                      stub_entry = arm_stub_hash_lookup
5137
                                     (&htab->stub_hash_table, stub_name,
5138
                                      FALSE, FALSE);
5139
                      if (stub_entry != NULL)
5140
                        {
5141
                          /* The proper stub has already been created.  */
5142
                          free (stub_name);
5143
                          stub_entry->target_value = sym_value;
5144
                          break;
5145
                        }
5146
 
5147
                      stub_entry = elf32_arm_add_stub (stub_name, section,
5148
                                                       htab);
5149
                      if (stub_entry == NULL)
5150
                        {
5151
                          free (stub_name);
5152
                          goto error_ret_free_internal;
5153
                        }
5154
 
5155
                      stub_entry->target_value = sym_value;
5156
                      stub_entry->target_section = sym_sec;
5157
                      stub_entry->stub_type = stub_type;
5158
                      stub_entry->h = hash;
5159
                      stub_entry->branch_type = branch_type;
5160
 
5161
                      if (sym_name == NULL)
5162
                        sym_name = "unnamed";
5163
                      stub_entry->output_name = (char *)
5164
                          bfd_alloc (htab->stub_bfd,
5165
                                     sizeof (THUMB2ARM_GLUE_ENTRY_NAME)
5166
                                     + strlen (sym_name));
5167
                      if (stub_entry->output_name == NULL)
5168
                        {
5169
                          free (stub_name);
5170
                          goto error_ret_free_internal;
5171
                        }
5172
 
5173
                      /* For historical reasons, use the existing names for
5174
                         ARM-to-Thumb and Thumb-to-ARM stubs.  */
5175
                      if ((r_type == (unsigned int) R_ARM_THM_CALL
5176
                           || r_type == (unsigned int) R_ARM_THM_JUMP24)
5177
                          && branch_type == ST_BRANCH_TO_ARM)
5178
                        sprintf (stub_entry->output_name,
5179
                                 THUMB2ARM_GLUE_ENTRY_NAME, sym_name);
5180
                      else if ((r_type == (unsigned int) R_ARM_CALL
5181
                               || r_type == (unsigned int) R_ARM_JUMP24)
5182
                               && branch_type == ST_BRANCH_TO_THUMB)
5183
                        sprintf (stub_entry->output_name,
5184
                                 ARM2THUMB_GLUE_ENTRY_NAME, sym_name);
5185
                      else
5186
                        sprintf (stub_entry->output_name, STUB_ENTRY_NAME,
5187
                                 sym_name);
5188
 
5189
                      stub_changed = TRUE;
5190
                    }
5191
                  while (0);
5192
 
5193
                  /* Look for relocations which might trigger Cortex-A8
5194
                     erratum.  */
5195
                  if (htab->fix_cortex_a8
5196
                      && (r_type == (unsigned int) R_ARM_THM_JUMP24
5197
                          || r_type == (unsigned int) R_ARM_THM_JUMP19
5198
                          || r_type == (unsigned int) R_ARM_THM_CALL
5199
                          || r_type == (unsigned int) R_ARM_THM_XPC22))
5200
                    {
5201
                      bfd_vma from = section->output_section->vma
5202
                                     + section->output_offset
5203
                                     + irela->r_offset;
5204
 
5205
                      if ((from & 0xfff) == 0xffe)
5206
                        {
5207
                          /* Found a candidate.  Note we haven't checked the
5208
                             destination is within 4K here: if we do so (and
5209
                             don't create an entry in a8_relocs) we can't tell
5210
                             that a branch should have been relocated when
5211
                             scanning later.  */
5212
                          if (num_a8_relocs == a8_reloc_table_size)
5213
                            {
5214
                              a8_reloc_table_size *= 2;
5215
                              a8_relocs = (struct a8_erratum_reloc *)
5216
                                  bfd_realloc (a8_relocs,
5217
                                               sizeof (struct a8_erratum_reloc)
5218
                                               * a8_reloc_table_size);
5219
                            }
5220
 
5221
                          a8_relocs[num_a8_relocs].from = from;
5222
                          a8_relocs[num_a8_relocs].destination = destination;
5223
                          a8_relocs[num_a8_relocs].r_type = r_type;
5224
                          a8_relocs[num_a8_relocs].branch_type = branch_type;
5225
                          a8_relocs[num_a8_relocs].sym_name = sym_name;
5226
                          a8_relocs[num_a8_relocs].non_a8_stub = created_stub;
5227
                          a8_relocs[num_a8_relocs].hash = hash;
5228
 
5229
                          num_a8_relocs++;
5230
                        }
5231
                    }
5232
                }
5233
 
5234
              /* We're done with the internal relocs, free them.  */
5235
              if (elf_section_data (section)->relocs == NULL)
5236
                free (internal_relocs);
5237
            }
5238
 
5239
          if (htab->fix_cortex_a8)
5240
            {
5241
              /* Sort relocs which might apply to Cortex-A8 erratum.  */
5242
              qsort (a8_relocs, num_a8_relocs,
5243
                     sizeof (struct a8_erratum_reloc),
5244
                     &a8_reloc_compare);
5245
 
5246
              /* Scan for branches which might trigger Cortex-A8 erratum.  */
5247
              if (cortex_a8_erratum_scan (input_bfd, info, &a8_fixes,
5248
                                          &num_a8_fixes, &a8_fix_table_size,
5249
                                          a8_relocs, num_a8_relocs,
5250
                                          prev_num_a8_fixes, &stub_changed)
5251
                  != 0)
5252
                goto error_ret_free_local;
5253
            }
5254
        }
5255
 
5256
      if (prev_num_a8_fixes != num_a8_fixes)
5257
        stub_changed = TRUE;
5258
 
5259
      if (!stub_changed)
5260
        break;
5261
 
5262
      /* OK, we've added some stubs.  Find out the new size of the
5263
         stub sections.  */
5264
      for (stub_sec = htab->stub_bfd->sections;
5265
           stub_sec != NULL;
5266
           stub_sec = stub_sec->next)
5267
        {
5268
          /* Ignore non-stub sections.  */
5269
          if (!strstr (stub_sec->name, STUB_SUFFIX))
5270
            continue;
5271
 
5272
          stub_sec->size = 0;
5273
        }
5274
 
5275
      bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
5276
 
5277
      /* Add Cortex-A8 erratum veneers to stub section sizes too.  */
5278
      if (htab->fix_cortex_a8)
5279
        for (i = 0; i < num_a8_fixes; i++)
5280
          {
5281
            stub_sec = elf32_arm_create_or_find_stub_sec (NULL,
5282
                         a8_fixes[i].section, htab);
5283
 
5284
            if (stub_sec == NULL)
5285
              goto error_ret_free_local;
5286
 
5287
            stub_sec->size
5288
              += find_stub_size_and_template (a8_fixes[i].stub_type, NULL,
5289
                                              NULL);
5290
          }
5291
 
5292
 
5293
      /* Ask the linker to do its stuff.  */
5294
      (*htab->layout_sections_again) ();
5295
    }
5296
 
5297
  /* Add stubs for Cortex-A8 erratum fixes now.  */
5298
  if (htab->fix_cortex_a8)
5299
    {
5300
      for (i = 0; i < num_a8_fixes; i++)
5301
        {
5302
          struct elf32_arm_stub_hash_entry *stub_entry;
5303
          char *stub_name = a8_fixes[i].stub_name;
5304
          asection *section = a8_fixes[i].section;
5305
          unsigned int section_id = a8_fixes[i].section->id;
5306
          asection *link_sec = htab->stub_group[section_id].link_sec;
5307
          asection *stub_sec = htab->stub_group[section_id].stub_sec;
5308
          const insn_sequence *template_sequence;
5309
          int template_size, size = 0;
5310
 
5311
          stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
5312
                                             TRUE, FALSE);
5313
          if (stub_entry == NULL)
5314
            {
5315
              (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
5316
                                     section->owner,
5317
                                     stub_name);
5318
              return FALSE;
5319
            }
5320
 
5321
          stub_entry->stub_sec = stub_sec;
5322
          stub_entry->stub_offset = 0;
5323
          stub_entry->id_sec = link_sec;
5324
          stub_entry->stub_type = a8_fixes[i].stub_type;
5325
          stub_entry->target_section = a8_fixes[i].section;
5326
          stub_entry->target_value = a8_fixes[i].offset;
5327
          stub_entry->target_addend = a8_fixes[i].addend;
5328
          stub_entry->orig_insn = a8_fixes[i].orig_insn;
5329
          stub_entry->branch_type = a8_fixes[i].branch_type;
5330
 
5331
          size = find_stub_size_and_template (a8_fixes[i].stub_type,
5332
                                              &template_sequence,
5333
                                              &template_size);
5334
 
5335
          stub_entry->stub_size = size;
5336
          stub_entry->stub_template = template_sequence;
5337
          stub_entry->stub_template_size = template_size;
5338
        }
5339
 
5340
      /* Stash the Cortex-A8 erratum fix array for use later in
5341
         elf32_arm_write_section().  */
5342
      htab->a8_erratum_fixes = a8_fixes;
5343
      htab->num_a8_erratum_fixes = num_a8_fixes;
5344
    }
5345
  else
5346
    {
5347
      htab->a8_erratum_fixes = NULL;
5348
      htab->num_a8_erratum_fixes = 0;
5349
    }
5350
  return TRUE;
5351
 
5352
 error_ret_free_local:
5353
  return FALSE;
5354
}
5355
 
5356
/* Build all the stubs associated with the current output file.  The
5357
   stubs are kept in a hash table attached to the main linker hash
5358
   table.  We also set up the .plt entries for statically linked PIC
5359
   functions here.  This function is called via arm_elf_finish in the
5360
   linker.  */
5361
 
5362
bfd_boolean
5363
elf32_arm_build_stubs (struct bfd_link_info *info)
5364
{
5365
  asection *stub_sec;
5366
  struct bfd_hash_table *table;
5367
  struct elf32_arm_link_hash_table *htab;
5368
 
5369
  htab = elf32_arm_hash_table (info);
5370
  if (htab == NULL)
5371
    return FALSE;
5372
 
5373
  for (stub_sec = htab->stub_bfd->sections;
5374
       stub_sec != NULL;
5375
       stub_sec = stub_sec->next)
5376
    {
5377
      bfd_size_type size;
5378
 
5379
      /* Ignore non-stub sections.  */
5380
      if (!strstr (stub_sec->name, STUB_SUFFIX))
5381
        continue;
5382
 
5383
      /* Allocate memory to hold the linker stubs.  */
5384
      size = stub_sec->size;
5385
      stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd, size);
5386
      if (stub_sec->contents == NULL && size != 0)
5387
        return FALSE;
5388
      stub_sec->size = 0;
5389
    }
5390
 
5391
  /* Build the stubs as directed by the stub hash table.  */
5392
  table = &htab->stub_hash_table;
5393
  bfd_hash_traverse (table, arm_build_one_stub, info);
5394
  if (htab->fix_cortex_a8)
5395
    {
5396
      /* Place the cortex a8 stubs last.  */
5397
      htab->fix_cortex_a8 = -1;
5398
      bfd_hash_traverse (table, arm_build_one_stub, info);
5399
    }
5400
 
5401
  return TRUE;
5402
}
5403
 
5404
/* Locate the Thumb encoded calling stub for NAME.  */
5405
 
5406
static struct elf_link_hash_entry *
5407
find_thumb_glue (struct bfd_link_info *link_info,
5408
                 const char *name,
5409
                 char **error_message)
5410
{
5411
  char *tmp_name;
5412
  struct elf_link_hash_entry *hash;
5413
  struct elf32_arm_link_hash_table *hash_table;
5414
 
5415
  /* We need a pointer to the armelf specific hash table.  */
5416
  hash_table = elf32_arm_hash_table (link_info);
5417
  if (hash_table == NULL)
5418
    return NULL;
5419
 
5420
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
5421
                                  + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
5422
 
5423
  BFD_ASSERT (tmp_name);
5424
 
5425
  sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
5426
 
5427
  hash = elf_link_hash_lookup
5428
    (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
5429
 
5430
  if (hash == NULL
5431
      && asprintf (error_message, _("unable to find THUMB glue '%s' for '%s'"),
5432
                   tmp_name, name) == -1)
5433
    *error_message = (char *) bfd_errmsg (bfd_error_system_call);
5434
 
5435
  free (tmp_name);
5436
 
5437
  return hash;
5438
}
5439
 
5440
/* Locate the ARM encoded calling stub for NAME.  */
5441
 
5442
static struct elf_link_hash_entry *
5443
find_arm_glue (struct bfd_link_info *link_info,
5444
               const char *name,
5445
               char **error_message)
5446
{
5447
  char *tmp_name;
5448
  struct elf_link_hash_entry *myh;
5449
  struct elf32_arm_link_hash_table *hash_table;
5450
 
5451
  /* We need a pointer to the elfarm specific hash table.  */
5452
  hash_table = elf32_arm_hash_table (link_info);
5453
  if (hash_table == NULL)
5454
    return NULL;
5455
 
5456
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
5457
                                  + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
5458
 
5459
  BFD_ASSERT (tmp_name);
5460
 
5461
  sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
5462
 
5463
  myh = elf_link_hash_lookup
5464
    (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
5465
 
5466
  if (myh == NULL
5467
      && asprintf (error_message, _("unable to find ARM glue '%s' for '%s'"),
5468
                   tmp_name, name) == -1)
5469
    *error_message = (char *) bfd_errmsg (bfd_error_system_call);
5470
 
5471
  free (tmp_name);
5472
 
5473
  return myh;
5474
}
5475
 
5476
/* ARM->Thumb glue (static images):
5477
 
5478
   .arm
5479
   __func_from_arm:
5480
   ldr r12, __func_addr
5481
   bx  r12
5482
   __func_addr:
5483
   .word func    @ behave as if you saw a ARM_32 reloc.
5484
 
5485
   (v5t static images)
5486
   .arm
5487
   __func_from_arm:
5488
   ldr pc, __func_addr
5489
   __func_addr:
5490
   .word func    @ behave as if you saw a ARM_32 reloc.
5491
 
5492
   (relocatable images)
5493
   .arm
5494
   __func_from_arm:
5495
   ldr r12, __func_offset
5496
   add r12, r12, pc
5497
   bx  r12
5498
   __func_offset:
5499
   .word func - .   */
5500
 
5501
#define ARM2THUMB_STATIC_GLUE_SIZE 12
5502
static const insn32 a2t1_ldr_insn = 0xe59fc000;
5503
static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
5504
static const insn32 a2t3_func_addr_insn = 0x00000001;
5505
 
5506
#define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
5507
static const insn32 a2t1v5_ldr_insn = 0xe51ff004;
5508
static const insn32 a2t2v5_func_addr_insn = 0x00000001;
5509
 
5510
#define ARM2THUMB_PIC_GLUE_SIZE 16
5511
static const insn32 a2t1p_ldr_insn = 0xe59fc004;
5512
static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
5513
static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
5514
 
5515
/* Thumb->ARM:                          Thumb->(non-interworking aware) ARM
5516
 
5517
     .thumb                             .thumb
5518
     .align 2                           .align 2
5519
 __func_from_thumb:                 __func_from_thumb:
5520
     bx pc                              push {r6, lr}
5521
     nop                                ldr  r6, __func_addr
5522
     .arm                               mov  lr, pc
5523
     b func                             bx   r6
5524
                                        .arm
5525
                                    ;; back_to_thumb
5526
                                        ldmia r13! {r6, lr}
5527
                                        bx    lr
5528
                                    __func_addr:
5529
                                        .word        func  */
5530
 
5531
#define THUMB2ARM_GLUE_SIZE 8
5532
static const insn16 t2a1_bx_pc_insn = 0x4778;
5533
static const insn16 t2a2_noop_insn = 0x46c0;
5534
static const insn32 t2a3_b_insn = 0xea000000;
5535
 
5536
#define VFP11_ERRATUM_VENEER_SIZE 8
5537
 
5538
#define ARM_BX_VENEER_SIZE 12
5539
static const insn32 armbx1_tst_insn = 0xe3100001;
5540
static const insn32 armbx2_moveq_insn = 0x01a0f000;
5541
static const insn32 armbx3_bx_insn = 0xe12fff10;
5542
 
5543
#ifndef ELFARM_NABI_C_INCLUDED
5544
static void
5545
arm_allocate_glue_section_space (bfd * abfd, bfd_size_type size, const char * name)
5546
{
5547
  asection * s;
5548
  bfd_byte * contents;
5549
 
5550
  if (size == 0)
5551
    {
5552
      /* Do not include empty glue sections in the output.  */
5553
      if (abfd != NULL)
5554
        {
5555
          s = bfd_get_section_by_name (abfd, name);
5556
          if (s != NULL)
5557
            s->flags |= SEC_EXCLUDE;
5558
        }
5559
      return;
5560
    }
5561
 
5562
  BFD_ASSERT (abfd != NULL);
5563
 
5564
  s = bfd_get_section_by_name (abfd, name);
5565
  BFD_ASSERT (s != NULL);
5566
 
5567
  contents = (bfd_byte *) bfd_alloc (abfd, size);
5568
 
5569
  BFD_ASSERT (s->size == size);
5570
  s->contents = contents;
5571
}
5572
 
5573
bfd_boolean
5574
bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
5575
{
5576
  struct elf32_arm_link_hash_table * globals;
5577
 
5578
  globals = elf32_arm_hash_table (info);
5579
  BFD_ASSERT (globals != NULL);
5580
 
5581
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
5582
                                   globals->arm_glue_size,
5583
                                   ARM2THUMB_GLUE_SECTION_NAME);
5584
 
5585
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
5586
                                   globals->thumb_glue_size,
5587
                                   THUMB2ARM_GLUE_SECTION_NAME);
5588
 
5589
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
5590
                                   globals->vfp11_erratum_glue_size,
5591
                                   VFP11_ERRATUM_VENEER_SECTION_NAME);
5592
 
5593
  arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
5594
                                   globals->bx_glue_size,
5595
                                   ARM_BX_GLUE_SECTION_NAME);
5596
 
5597
  return TRUE;
5598
}
5599
 
5600
/* Allocate space and symbols for calling a Thumb function from Arm mode.
5601
   returns the symbol identifying the stub.  */
5602
 
5603
static struct elf_link_hash_entry *
5604
record_arm_to_thumb_glue (struct bfd_link_info * link_info,
5605
                          struct elf_link_hash_entry * h)
5606
{
5607
  const char * name = h->root.root.string;
5608
  asection * s;
5609
  char * tmp_name;
5610
  struct elf_link_hash_entry * myh;
5611
  struct bfd_link_hash_entry * bh;
5612
  struct elf32_arm_link_hash_table * globals;
5613
  bfd_vma val;
5614
  bfd_size_type size;
5615
 
5616
  globals = elf32_arm_hash_table (link_info);
5617
  BFD_ASSERT (globals != NULL);
5618
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5619
 
5620
  s = bfd_get_section_by_name
5621
    (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
5622
 
5623
  BFD_ASSERT (s != NULL);
5624
 
5625
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
5626
                                  + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
5627
 
5628
  BFD_ASSERT (tmp_name);
5629
 
5630
  sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
5631
 
5632
  myh = elf_link_hash_lookup
5633
    (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
5634
 
5635
  if (myh != NULL)
5636
    {
5637
      /* We've already seen this guy.  */
5638
      free (tmp_name);
5639
      return myh;
5640
    }
5641
 
5642
  /* The only trick here is using hash_table->arm_glue_size as the value.
5643
     Even though the section isn't allocated yet, this is where we will be
5644
     putting it.  The +1 on the value marks that the stub has not been
5645
     output yet - not that it is a Thumb function.  */
5646
  bh = NULL;
5647
  val = globals->arm_glue_size + 1;
5648
  _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
5649
                                    tmp_name, BSF_GLOBAL, s, val,
5650
                                    NULL, TRUE, FALSE, &bh);
5651
 
5652
  myh = (struct elf_link_hash_entry *) bh;
5653
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
5654
  myh->forced_local = 1;
5655
 
5656
  free (tmp_name);
5657
 
5658
  if (link_info->shared || globals->root.is_relocatable_executable
5659
      || globals->pic_veneer)
5660
    size = ARM2THUMB_PIC_GLUE_SIZE;
5661
  else if (globals->use_blx)
5662
    size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
5663
  else
5664
    size = ARM2THUMB_STATIC_GLUE_SIZE;
5665
 
5666
  s->size += size;
5667
  globals->arm_glue_size += size;
5668
 
5669
  return myh;
5670
}
5671
 
5672
/* Allocate space for ARMv4 BX veneers.  */
5673
 
5674
static void
5675
record_arm_bx_glue (struct bfd_link_info * link_info, int reg)
5676
{
5677
  asection * s;
5678
  struct elf32_arm_link_hash_table *globals;
5679
  char *tmp_name;
5680
  struct elf_link_hash_entry *myh;
5681
  struct bfd_link_hash_entry *bh;
5682
  bfd_vma val;
5683
 
5684
  /* BX PC does not need a veneer.  */
5685
  if (reg == 15)
5686
    return;
5687
 
5688
  globals = elf32_arm_hash_table (link_info);
5689
  BFD_ASSERT (globals != NULL);
5690
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5691
 
5692
  /* Check if this veneer has already been allocated.  */
5693
  if (globals->bx_glue_offset[reg])
5694
    return;
5695
 
5696
  s = bfd_get_section_by_name
5697
    (globals->bfd_of_glue_owner, ARM_BX_GLUE_SECTION_NAME);
5698
 
5699
  BFD_ASSERT (s != NULL);
5700
 
5701
  /* Add symbol for veneer.  */
5702
  tmp_name = (char *)
5703
      bfd_malloc ((bfd_size_type) strlen (ARM_BX_GLUE_ENTRY_NAME) + 1);
5704
 
5705
  BFD_ASSERT (tmp_name);
5706
 
5707
  sprintf (tmp_name, ARM_BX_GLUE_ENTRY_NAME, reg);
5708
 
5709
  myh = elf_link_hash_lookup
5710
    (&(globals)->root, tmp_name, FALSE, FALSE, FALSE);
5711
 
5712
  BFD_ASSERT (myh == NULL);
5713
 
5714
  bh = NULL;
5715
  val = globals->bx_glue_size;
5716
  _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
5717
                                    tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
5718
                                    NULL, TRUE, FALSE, &bh);
5719
 
5720
  myh = (struct elf_link_hash_entry *) bh;
5721
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
5722
  myh->forced_local = 1;
5723
 
5724
  s->size += ARM_BX_VENEER_SIZE;
5725
  globals->bx_glue_offset[reg] = globals->bx_glue_size | 2;
5726
  globals->bx_glue_size += ARM_BX_VENEER_SIZE;
5727
}
5728
 
5729
 
5730
/* Add an entry to the code/data map for section SEC.  */
5731
 
5732
static void
5733
elf32_arm_section_map_add (asection *sec, char type, bfd_vma vma)
5734
{
5735
  struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
5736
  unsigned int newidx;
5737
 
5738
  if (sec_data->map == NULL)
5739
    {
5740
      sec_data->map = (elf32_arm_section_map *)
5741
          bfd_malloc (sizeof (elf32_arm_section_map));
5742
      sec_data->mapcount = 0;
5743
      sec_data->mapsize = 1;
5744
    }
5745
 
5746
  newidx = sec_data->mapcount++;
5747
 
5748
  if (sec_data->mapcount > sec_data->mapsize)
5749
    {
5750
      sec_data->mapsize *= 2;
5751
      sec_data->map = (elf32_arm_section_map *)
5752
          bfd_realloc_or_free (sec_data->map, sec_data->mapsize
5753
                               * sizeof (elf32_arm_section_map));
5754
    }
5755
 
5756
  if (sec_data->map)
5757
    {
5758
      sec_data->map[newidx].vma = vma;
5759
      sec_data->map[newidx].type = type;
5760
    }
5761
}
5762
 
5763
 
5764
/* Record information about a VFP11 denorm-erratum veneer.  Only ARM-mode
5765
   veneers are handled for now.  */
5766
 
5767
static bfd_vma
5768
record_vfp11_erratum_veneer (struct bfd_link_info *link_info,
5769
                             elf32_vfp11_erratum_list *branch,
5770
                             bfd *branch_bfd,
5771
                             asection *branch_sec,
5772
                             unsigned int offset)
5773
{
5774
  asection *s;
5775
  struct elf32_arm_link_hash_table *hash_table;
5776
  char *tmp_name;
5777
  struct elf_link_hash_entry *myh;
5778
  struct bfd_link_hash_entry *bh;
5779
  bfd_vma val;
5780
  struct _arm_elf_section_data *sec_data;
5781
  elf32_vfp11_erratum_list *newerr;
5782
 
5783
  hash_table = elf32_arm_hash_table (link_info);
5784
  BFD_ASSERT (hash_table != NULL);
5785
  BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
5786
 
5787
  s = bfd_get_section_by_name
5788
    (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME);
5789
 
5790
  sec_data = elf32_arm_section_data (s);
5791
 
5792
  BFD_ASSERT (s != NULL);
5793
 
5794
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
5795
                                  (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
5796
 
5797
  BFD_ASSERT (tmp_name);
5798
 
5799
  sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
5800
           hash_table->num_vfp11_fixes);
5801
 
5802
  myh = elf_link_hash_lookup
5803
    (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
5804
 
5805
  BFD_ASSERT (myh == NULL);
5806
 
5807
  bh = NULL;
5808
  val = hash_table->vfp11_erratum_glue_size;
5809
  _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
5810
                                    tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
5811
                                    NULL, TRUE, FALSE, &bh);
5812
 
5813
  myh = (struct elf_link_hash_entry *) bh;
5814
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
5815
  myh->forced_local = 1;
5816
 
5817
  /* Link veneer back to calling location.  */
5818
  sec_data->erratumcount += 1;
5819
  newerr = (elf32_vfp11_erratum_list *)
5820
      bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
5821
 
5822
  newerr->type = VFP11_ERRATUM_ARM_VENEER;
5823
  newerr->vma = -1;
5824
  newerr->u.v.branch = branch;
5825
  newerr->u.v.id = hash_table->num_vfp11_fixes;
5826
  branch->u.b.veneer = newerr;
5827
 
5828
  newerr->next = sec_data->erratumlist;
5829
  sec_data->erratumlist = newerr;
5830
 
5831
  /* A symbol for the return from the veneer.  */
5832
  sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
5833
           hash_table->num_vfp11_fixes);
5834
 
5835
  myh = elf_link_hash_lookup
5836
    (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
5837
 
5838
  if (myh != NULL)
5839
    abort ();
5840
 
5841
  bh = NULL;
5842
  val = offset + 4;
5843
  _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
5844
                                    branch_sec, val, NULL, TRUE, FALSE, &bh);
5845
 
5846
  myh = (struct elf_link_hash_entry *) bh;
5847
  myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
5848
  myh->forced_local = 1;
5849
 
5850
  free (tmp_name);
5851
 
5852
  /* Generate a mapping symbol for the veneer section, and explicitly add an
5853
     entry for that symbol to the code/data map for the section.  */
5854
  if (hash_table->vfp11_erratum_glue_size == 0)
5855
    {
5856
      bh = NULL;
5857
      /* FIXME: Creates an ARM symbol.  Thumb mode will need attention if it
5858
         ever requires this erratum fix.  */
5859
      _bfd_generic_link_add_one_symbol (link_info,
5860
                                        hash_table->bfd_of_glue_owner, "$a",
5861
                                        BSF_LOCAL, s, 0, NULL,
5862
                                        TRUE, FALSE, &bh);
5863
 
5864
      myh = (struct elf_link_hash_entry *) bh;
5865
      myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
5866
      myh->forced_local = 1;
5867
 
5868
      /* The elf32_arm_init_maps function only cares about symbols from input
5869
         BFDs.  We must make a note of this generated mapping symbol
5870
         ourselves so that code byteswapping works properly in
5871
         elf32_arm_write_section.  */
5872
      elf32_arm_section_map_add (s, 'a', 0);
5873
    }
5874
 
5875
  s->size += VFP11_ERRATUM_VENEER_SIZE;
5876
  hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE;
5877
  hash_table->num_vfp11_fixes++;
5878
 
5879
  /* The offset of the veneer.  */
5880
  return val;
5881
}
5882
 
5883
#define ARM_GLUE_SECTION_FLAGS \
5884
  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE \
5885
   | SEC_READONLY | SEC_LINKER_CREATED)
5886
 
5887
/* Create a fake section for use by the ARM backend of the linker.  */
5888
 
5889
static bfd_boolean
5890
arm_make_glue_section (bfd * abfd, const char * name)
5891
{
5892
  asection * sec;
5893
 
5894
  sec = bfd_get_section_by_name (abfd, name);
5895
  if (sec != NULL)
5896
    /* Already made.  */
5897
    return TRUE;
5898
 
5899
  sec = bfd_make_section_with_flags (abfd, name, ARM_GLUE_SECTION_FLAGS);
5900
 
5901
  if (sec == NULL
5902
      || !bfd_set_section_alignment (abfd, sec, 2))
5903
    return FALSE;
5904
 
5905
  /* Set the gc mark to prevent the section from being removed by garbage
5906
     collection, despite the fact that no relocs refer to this section.  */
5907
  sec->gc_mark = 1;
5908
 
5909
  return TRUE;
5910
}
5911
 
5912
/* Add the glue sections to ABFD.  This function is called from the
5913
   linker scripts in ld/emultempl/{armelf}.em.  */
5914
 
5915
bfd_boolean
5916
bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
5917
                                        struct bfd_link_info *info)
5918
{
5919
  /* If we are only performing a partial
5920
     link do not bother adding the glue.  */
5921
  if (info->relocatable)
5922
    return TRUE;
5923
 
5924
  return arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
5925
    && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
5926
    && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
5927
    && arm_make_glue_section (abfd, ARM_BX_GLUE_SECTION_NAME);
5928
}
5929
 
5930
/* Select a BFD to be used to hold the sections used by the glue code.
5931
   This function is called from the linker scripts in ld/emultempl/
5932
   {armelf/pe}.em.  */
5933
 
5934
bfd_boolean
5935
bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
5936
{
5937
  struct elf32_arm_link_hash_table *globals;
5938
 
5939
  /* If we are only performing a partial link
5940
     do not bother getting a bfd to hold the glue.  */
5941
  if (info->relocatable)
5942
    return TRUE;
5943
 
5944
  /* Make sure we don't attach the glue sections to a dynamic object.  */
5945
  BFD_ASSERT (!(abfd->flags & DYNAMIC));
5946
 
5947
  globals = elf32_arm_hash_table (info);
5948
  BFD_ASSERT (globals != NULL);
5949
 
5950
  if (globals->bfd_of_glue_owner != NULL)
5951
    return TRUE;
5952
 
5953
  /* Save the bfd for later use.  */
5954
  globals->bfd_of_glue_owner = abfd;
5955
 
5956
  return TRUE;
5957
}
5958
 
5959
static void
5960
check_use_blx (struct elf32_arm_link_hash_table *globals)
5961
{
5962 161 khays
  int cpu_arch;
5963
 
5964
  cpu_arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
5965
                                       Tag_CPU_arch);
5966
 
5967
  if (globals->fix_arm1176)
5968
    {
5969
      if (cpu_arch == TAG_CPU_ARCH_V6T2 || cpu_arch > TAG_CPU_ARCH_V6K)
5970
        globals->use_blx = 1;
5971
    }
5972
  else
5973
    {
5974
      if (cpu_arch > TAG_CPU_ARCH_V4T)
5975
        globals->use_blx = 1;
5976
    }
5977 14 khays
}
5978
 
5979
bfd_boolean
5980
bfd_elf32_arm_process_before_allocation (bfd *abfd,
5981
                                         struct bfd_link_info *link_info)
5982
{
5983
  Elf_Internal_Shdr *symtab_hdr;
5984
  Elf_Internal_Rela *internal_relocs = NULL;
5985
  Elf_Internal_Rela *irel, *irelend;
5986
  bfd_byte *contents = NULL;
5987
 
5988
  asection *sec;
5989
  struct elf32_arm_link_hash_table *globals;
5990
 
5991
  /* If we are only performing a partial link do not bother
5992
     to construct any glue.  */
5993
  if (link_info->relocatable)
5994
    return TRUE;
5995
 
5996
  /* Here we have a bfd that is to be included on the link.  We have a
5997
     hook to do reloc rummaging, before section sizes are nailed down.  */
5998
  globals = elf32_arm_hash_table (link_info);
5999
  BFD_ASSERT (globals != NULL);
6000
 
6001
  check_use_blx (globals);
6002
 
6003
  if (globals->byteswap_code && !bfd_big_endian (abfd))
6004
    {
6005
      _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
6006
                          abfd);
6007
      return FALSE;
6008
    }
6009
 
6010
  /* PR 5398: If we have not decided to include any loadable sections in
6011
     the output then we will not have a glue owner bfd.  This is OK, it
6012
     just means that there is nothing else for us to do here.  */
6013
  if (globals->bfd_of_glue_owner == NULL)
6014
    return TRUE;
6015
 
6016
  /* Rummage around all the relocs and map the glue vectors.  */
6017
  sec = abfd->sections;
6018
 
6019
  if (sec == NULL)
6020
    return TRUE;
6021
 
6022
  for (; sec != NULL; sec = sec->next)
6023
    {
6024
      if (sec->reloc_count == 0)
6025
        continue;
6026
 
6027
      if ((sec->flags & SEC_EXCLUDE) != 0)
6028
        continue;
6029
 
6030
      symtab_hdr = & elf_symtab_hdr (abfd);
6031
 
6032
      /* Load the relocs.  */
6033
      internal_relocs
6034
        = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, FALSE);
6035
 
6036
      if (internal_relocs == NULL)
6037
        goto error_return;
6038
 
6039
      irelend = internal_relocs + sec->reloc_count;
6040
      for (irel = internal_relocs; irel < irelend; irel++)
6041
        {
6042
          long r_type;
6043
          unsigned long r_index;
6044
 
6045
          struct elf_link_hash_entry *h;
6046
 
6047
          r_type = ELF32_R_TYPE (irel->r_info);
6048
          r_index = ELF32_R_SYM (irel->r_info);
6049
 
6050
          /* These are the only relocation types we care about.  */
6051
          if (   r_type != R_ARM_PC24
6052
              && (r_type != R_ARM_V4BX || globals->fix_v4bx < 2))
6053
            continue;
6054
 
6055
          /* Get the section contents if we haven't done so already.  */
6056
          if (contents == NULL)
6057
            {
6058
              /* Get cached copy if it exists.  */
6059
              if (elf_section_data (sec)->this_hdr.contents != NULL)
6060
                contents = elf_section_data (sec)->this_hdr.contents;
6061
              else
6062
                {
6063
                  /* Go get them off disk.  */
6064
                  if (! bfd_malloc_and_get_section (abfd, sec, &contents))
6065
                    goto error_return;
6066
                }
6067
            }
6068
 
6069
          if (r_type == R_ARM_V4BX)
6070
            {
6071
              int reg;
6072
 
6073
              reg = bfd_get_32 (abfd, contents + irel->r_offset) & 0xf;
6074
              record_arm_bx_glue (link_info, reg);
6075
              continue;
6076
            }
6077
 
6078
          /* If the relocation is not against a symbol it cannot concern us.  */
6079
          h = NULL;
6080
 
6081
          /* We don't care about local symbols.  */
6082
          if (r_index < symtab_hdr->sh_info)
6083
            continue;
6084
 
6085
          /* This is an external symbol.  */
6086
          r_index -= symtab_hdr->sh_info;
6087
          h = (struct elf_link_hash_entry *)
6088
            elf_sym_hashes (abfd)[r_index];
6089
 
6090
          /* If the relocation is against a static symbol it must be within
6091
             the current section and so cannot be a cross ARM/Thumb relocation.  */
6092
          if (h == NULL)
6093
            continue;
6094
 
6095
          /* If the call will go through a PLT entry then we do not need
6096
             glue.  */
6097
          if (globals->root.splt != NULL && h->plt.offset != (bfd_vma) -1)
6098
            continue;
6099
 
6100
          switch (r_type)
6101
            {
6102
            case R_ARM_PC24:
6103
              /* This one is a call from arm code.  We need to look up
6104
                 the target of the call.  If it is a thumb target, we
6105
                 insert glue.  */
6106
              if (h->target_internal == ST_BRANCH_TO_THUMB)
6107
                record_arm_to_thumb_glue (link_info, h);
6108
              break;
6109
 
6110
            default:
6111
              abort ();
6112
            }
6113
        }
6114
 
6115
      if (contents != NULL
6116
          && elf_section_data (sec)->this_hdr.contents != contents)
6117
        free (contents);
6118
      contents = NULL;
6119
 
6120
      if (internal_relocs != NULL
6121
          && elf_section_data (sec)->relocs != internal_relocs)
6122
        free (internal_relocs);
6123
      internal_relocs = NULL;
6124
    }
6125
 
6126
  return TRUE;
6127
 
6128
error_return:
6129
  if (contents != NULL
6130
      && elf_section_data (sec)->this_hdr.contents != contents)
6131
    free (contents);
6132
  if (internal_relocs != NULL
6133
      && elf_section_data (sec)->relocs != internal_relocs)
6134
    free (internal_relocs);
6135
 
6136
  return FALSE;
6137
}
6138
#endif
6139
 
6140
 
6141
/* Initialise maps of ARM/Thumb/data for input BFDs.  */
6142
 
6143
void
6144
bfd_elf32_arm_init_maps (bfd *abfd)
6145
{
6146
  Elf_Internal_Sym *isymbuf;
6147
  Elf_Internal_Shdr *hdr;
6148
  unsigned int i, localsyms;
6149
 
6150
  /* PR 7093: Make sure that we are dealing with an arm elf binary.  */
6151
  if (! is_arm_elf (abfd))
6152
    return;
6153
 
6154
  if ((abfd->flags & DYNAMIC) != 0)
6155
    return;
6156
 
6157
  hdr = & elf_symtab_hdr (abfd);
6158
  localsyms = hdr->sh_info;
6159
 
6160
  /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
6161
     should contain the number of local symbols, which should come before any
6162
     global symbols.  Mapping symbols are always local.  */
6163
  isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL,
6164
                                  NULL);
6165
 
6166
  /* No internal symbols read?  Skip this BFD.  */
6167
  if (isymbuf == NULL)
6168
    return;
6169
 
6170
  for (i = 0; i < localsyms; i++)
6171
    {
6172
      Elf_Internal_Sym *isym = &isymbuf[i];
6173
      asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6174
      const char *name;
6175
 
6176
      if (sec != NULL
6177
          && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
6178
        {
6179
          name = bfd_elf_string_from_elf_section (abfd,
6180
            hdr->sh_link, isym->st_name);
6181
 
6182
          if (bfd_is_arm_special_symbol_name (name,
6183
                                              BFD_ARM_SPECIAL_SYM_TYPE_MAP))
6184
            elf32_arm_section_map_add (sec, name[1], isym->st_value);
6185
        }
6186
    }
6187
}
6188
 
6189
 
6190
/* Auto-select enabling of Cortex-A8 erratum fix if the user didn't explicitly
6191
   say what they wanted.  */
6192
 
6193
void
6194
bfd_elf32_arm_set_cortex_a8_fix (bfd *obfd, struct bfd_link_info *link_info)
6195
{
6196
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
6197
  obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
6198
 
6199
  if (globals == NULL)
6200
    return;
6201
 
6202
  if (globals->fix_cortex_a8 == -1)
6203
    {
6204
      /* Turn on Cortex-A8 erratum workaround for ARMv7-A.  */
6205
      if (out_attr[Tag_CPU_arch].i == TAG_CPU_ARCH_V7
6206
          && (out_attr[Tag_CPU_arch_profile].i == 'A'
6207
              || out_attr[Tag_CPU_arch_profile].i == 0))
6208
        globals->fix_cortex_a8 = 1;
6209
      else
6210
        globals->fix_cortex_a8 = 0;
6211
    }
6212
}
6213
 
6214
 
6215
void
6216
bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info)
6217
{
6218
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
6219
  obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
6220
 
6221
  if (globals == NULL)
6222
    return;
6223
  /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix.  */
6224
  if (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V7)
6225
    {
6226
      switch (globals->vfp11_fix)
6227
        {
6228
        case BFD_ARM_VFP11_FIX_DEFAULT:
6229
        case BFD_ARM_VFP11_FIX_NONE:
6230
          globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
6231
          break;
6232
 
6233
        default:
6234
          /* Give a warning, but do as the user requests anyway.  */
6235
          (*_bfd_error_handler) (_("%B: warning: selected VFP11 erratum "
6236
            "workaround is not necessary for target architecture"), obfd);
6237
        }
6238
    }
6239
  else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT)
6240
    /* For earlier architectures, we might need the workaround, but do not
6241
       enable it by default.  If users is running with broken hardware, they
6242
       must enable the erratum fix explicitly.  */
6243
    globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
6244
}
6245
 
6246
 
6247
enum bfd_arm_vfp11_pipe
6248
{
6249
  VFP11_FMAC,
6250
  VFP11_LS,
6251
  VFP11_DS,
6252
  VFP11_BAD
6253
};
6254
 
6255
/* Return a VFP register number.  This is encoded as RX:X for single-precision
6256
   registers, or X:RX for double-precision registers, where RX is the group of
6257
   four bits in the instruction encoding and X is the single extension bit.
6258
   RX and X fields are specified using their lowest (starting) bit.  The return
6259
   value is:
6260
 
6261
     0...31: single-precision registers s0...s31
6262
     32...63: double-precision registers d0...d31.
6263
 
6264
   Although X should be zero for VFP11 (encoding d0...d15 only), we might
6265
   encounter VFP3 instructions, so we allow the full range for DP registers.  */
6266
 
6267
static unsigned int
6268
bfd_arm_vfp11_regno (unsigned int insn, bfd_boolean is_double, unsigned int rx,
6269
                     unsigned int x)
6270
{
6271
  if (is_double)
6272
    return (((insn >> rx) & 0xf) | (((insn >> x) & 1) << 4)) + 32;
6273
  else
6274
    return (((insn >> rx) & 0xf) << 1) | ((insn >> x) & 1);
6275
}
6276
 
6277
/* Set bits in *WMASK according to a register number REG as encoded by
6278
   bfd_arm_vfp11_regno().  Ignore d16-d31.  */
6279
 
6280
static void
6281
bfd_arm_vfp11_write_mask (unsigned int *wmask, unsigned int reg)
6282
{
6283
  if (reg < 32)
6284
    *wmask |= 1 << reg;
6285
  else if (reg < 48)
6286
    *wmask |= 3 << ((reg - 32) * 2);
6287
}
6288
 
6289
/* Return TRUE if WMASK overwrites anything in REGS.  */
6290
 
6291
static bfd_boolean
6292
bfd_arm_vfp11_antidependency (unsigned int wmask, int *regs, int numregs)
6293
{
6294
  int i;
6295
 
6296
  for (i = 0; i < numregs; i++)
6297
    {
6298
      unsigned int reg = regs[i];
6299
 
6300
      if (reg < 32 && (wmask & (1 << reg)) != 0)
6301
        return TRUE;
6302
 
6303
      reg -= 32;
6304
 
6305
      if (reg >= 16)
6306
        continue;
6307
 
6308
      if ((wmask & (3 << (reg * 2))) != 0)
6309
        return TRUE;
6310
    }
6311
 
6312
  return FALSE;
6313
}
6314
 
6315
/* In this function, we're interested in two things: finding input registers
6316
   for VFP data-processing instructions, and finding the set of registers which
6317
   arbitrary VFP instructions may write to.  We use a 32-bit unsigned int to
6318
   hold the written set, so FLDM etc. are easy to deal with (we're only
6319
   interested in 32 SP registers or 16 dp registers, due to the VFP version
6320
   implemented by the chip in question).  DP registers are marked by setting
6321
   both SP registers in the write mask).  */
6322
 
6323
static enum bfd_arm_vfp11_pipe
6324
bfd_arm_vfp11_insn_decode (unsigned int insn, unsigned int *destmask, int *regs,
6325
                           int *numregs)
6326
{
6327
  enum bfd_arm_vfp11_pipe vpipe = VFP11_BAD;
6328
  bfd_boolean is_double = ((insn & 0xf00) == 0xb00) ? 1 : 0;
6329
 
6330
  if ((insn & 0x0f000e10) == 0x0e000a00)  /* A data-processing insn.  */
6331
    {
6332
      unsigned int pqrs;
6333
      unsigned int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
6334
      unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
6335
 
6336
      pqrs = ((insn & 0x00800000) >> 20)
6337
           | ((insn & 0x00300000) >> 19)
6338
           | ((insn & 0x00000040) >> 6);
6339
 
6340
      switch (pqrs)
6341
        {
6342
        case 0: /* fmac[sd].  */
6343
        case 1: /* fnmac[sd].  */
6344
        case 2: /* fmsc[sd].  */
6345
        case 3: /* fnmsc[sd].  */
6346
          vpipe = VFP11_FMAC;
6347
          bfd_arm_vfp11_write_mask (destmask, fd);
6348
          regs[0] = fd;
6349
          regs[1] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);  /* Fn.  */
6350
          regs[2] = fm;
6351
          *numregs = 3;
6352
          break;
6353
 
6354
        case 4: /* fmul[sd].  */
6355
        case 5: /* fnmul[sd].  */
6356
        case 6: /* fadd[sd].  */
6357
        case 7: /* fsub[sd].  */
6358
          vpipe = VFP11_FMAC;
6359
          goto vfp_binop;
6360
 
6361
        case 8: /* fdiv[sd].  */
6362
          vpipe = VFP11_DS;
6363
          vfp_binop:
6364
          bfd_arm_vfp11_write_mask (destmask, fd);
6365
          regs[0] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);   /* Fn.  */
6366
          regs[1] = fm;
6367
          *numregs = 2;
6368
          break;
6369
 
6370
        case 15: /* extended opcode.  */
6371
          {
6372
            unsigned int extn = ((insn >> 15) & 0x1e)
6373
                              | ((insn >> 7) & 1);
6374
 
6375
            switch (extn)
6376
              {
6377
              case 0: /* fcpy[sd].  */
6378
              case 1: /* fabs[sd].  */
6379
              case 2: /* fneg[sd].  */
6380
              case 8: /* fcmp[sd].  */
6381
              case 9: /* fcmpe[sd].  */
6382
              case 10: /* fcmpz[sd].  */
6383
              case 11: /* fcmpez[sd].  */
6384
              case 16: /* fuito[sd].  */
6385
              case 17: /* fsito[sd].  */
6386
              case 24: /* ftoui[sd].  */
6387
              case 25: /* ftouiz[sd].  */
6388
              case 26: /* ftosi[sd].  */
6389
              case 27: /* ftosiz[sd].  */
6390
                /* These instructions will not bounce due to underflow.  */
6391
                *numregs = 0;
6392
                vpipe = VFP11_FMAC;
6393
                break;
6394
 
6395
              case 3: /* fsqrt[sd].  */
6396
                /* fsqrt cannot underflow, but it can (perhaps) overwrite
6397
                   registers to cause the erratum in previous instructions.  */
6398
                bfd_arm_vfp11_write_mask (destmask, fd);
6399
                vpipe = VFP11_DS;
6400
                break;
6401
 
6402
              case 15: /* fcvt{ds,sd}.  */
6403
                {
6404
                  int rnum = 0;
6405
 
6406
                  bfd_arm_vfp11_write_mask (destmask, fd);
6407
 
6408
                  /* Only FCVTSD can underflow.  */
6409
                  if ((insn & 0x100) != 0)
6410
                    regs[rnum++] = fm;
6411
 
6412
                  *numregs = rnum;
6413
 
6414
                  vpipe = VFP11_FMAC;
6415
                }
6416
                break;
6417
 
6418
              default:
6419
                return VFP11_BAD;
6420
              }
6421
          }
6422
          break;
6423
 
6424
        default:
6425
          return VFP11_BAD;
6426
        }
6427
    }
6428
  /* Two-register transfer.  */
6429
  else if ((insn & 0x0fe00ed0) == 0x0c400a10)
6430
    {
6431
      unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
6432
 
6433
      if ((insn & 0x100000) == 0)
6434
        {
6435
          if (is_double)
6436
            bfd_arm_vfp11_write_mask (destmask, fm);
6437
          else
6438
            {
6439
              bfd_arm_vfp11_write_mask (destmask, fm);
6440
              bfd_arm_vfp11_write_mask (destmask, fm + 1);
6441
            }
6442
        }
6443
 
6444
      vpipe = VFP11_LS;
6445
    }
6446
  else if ((insn & 0x0e100e00) == 0x0c100a00)  /* A load insn.  */
6447
    {
6448
      int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
6449
      unsigned int puw = ((insn >> 21) & 0x1) | (((insn >> 23) & 3) << 1);
6450
 
6451
      switch (puw)
6452
        {
6453
        case 0: /* Two-reg transfer.  We should catch these above.  */
6454
          abort ();
6455
 
6456
        case 2: /* fldm[sdx].  */
6457
        case 3:
6458
        case 5:
6459
          {
6460
            unsigned int i, offset = insn & 0xff;
6461
 
6462
            if (is_double)
6463
              offset >>= 1;
6464
 
6465
            for (i = fd; i < fd + offset; i++)
6466
              bfd_arm_vfp11_write_mask (destmask, i);
6467
          }
6468
          break;
6469
 
6470
        case 4: /* fld[sd].  */
6471
        case 6:
6472
          bfd_arm_vfp11_write_mask (destmask, fd);
6473
          break;
6474
 
6475
        default:
6476
          return VFP11_BAD;
6477
        }
6478
 
6479
      vpipe = VFP11_LS;
6480
    }
6481
  /* Single-register transfer. Note L==0.  */
6482
  else if ((insn & 0x0f100e10) == 0x0e000a10)
6483
    {
6484
      unsigned int opcode = (insn >> 21) & 7;
6485
      unsigned int fn = bfd_arm_vfp11_regno (insn, is_double, 16, 7);
6486
 
6487
      switch (opcode)
6488
        {
6489
        case 0: /* fmsr/fmdlr.  */
6490
        case 1: /* fmdhr.  */
6491
          /* Mark fmdhr and fmdlr as writing to the whole of the DP
6492
             destination register.  I don't know if this is exactly right,
6493
             but it is the conservative choice.  */
6494
          bfd_arm_vfp11_write_mask (destmask, fn);
6495
          break;
6496
 
6497
        case 7: /* fmxr.  */
6498
          break;
6499
        }
6500
 
6501
      vpipe = VFP11_LS;
6502
    }
6503
 
6504
  return vpipe;
6505
}
6506
 
6507
 
6508
static int elf32_arm_compare_mapping (const void * a, const void * b);
6509
 
6510
 
6511
/* Look for potentially-troublesome code sequences which might trigger the
6512
   VFP11 denormal/antidependency erratum.  See, e.g., the ARM1136 errata sheet
6513
   (available from ARM) for details of the erratum.  A short version is
6514
   described in ld.texinfo.  */
6515
 
6516
bfd_boolean
6517
bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
6518
{
6519
  asection *sec;
6520
  bfd_byte *contents = NULL;
6521
  int state = 0;
6522
  int regs[3], numregs = 0;
6523
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
6524
  int use_vector = (globals->vfp11_fix == BFD_ARM_VFP11_FIX_VECTOR);
6525
 
6526
  if (globals == NULL)
6527
    return FALSE;
6528
 
6529
  /* We use a simple FSM to match troublesome VFP11 instruction sequences.
6530
     The states transition as follows:
6531
 
6532
 
6533
           A VFP FMAC-pipeline instruction has been seen. Fill
6534
           regs[0]..regs[numregs-1] with its input operands. Remember this
6535
           instruction in 'first_fmac'.
6536
 
6537
       1 -> 2
6538
           Any instruction, except for a VFP instruction which overwrites
6539
           regs[*].
6540
 
6541
       1 -> 3 [ -> 0 ]  or
6542
       2 -> 3 [ -> 0 ]
6543
           A VFP instruction has been seen which overwrites any of regs[*].
6544
           We must make a veneer!  Reset state to 0 before examining next
6545
           instruction.
6546
 
6547
       2 -> 0
6548
           If we fail to match anything in state 2, reset to state 0 and reset
6549
           the instruction pointer to the instruction after 'first_fmac'.
6550
 
6551
     If the VFP11 vector mode is in use, there must be at least two unrelated
6552
     instructions between anti-dependent VFP11 instructions to properly avoid
6553
     triggering the erratum, hence the use of the extra state 1.  */
6554
 
6555
  /* If we are only performing a partial link do not bother
6556
     to construct any glue.  */
6557
  if (link_info->relocatable)
6558
    return TRUE;
6559
 
6560
  /* Skip if this bfd does not correspond to an ELF image.  */
6561
  if (! is_arm_elf (abfd))
6562
    return TRUE;
6563
 
6564
  /* We should have chosen a fix type by the time we get here.  */
6565
  BFD_ASSERT (globals->vfp11_fix != BFD_ARM_VFP11_FIX_DEFAULT);
6566
 
6567
  if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_NONE)
6568
    return TRUE;
6569
 
6570
  /* Skip this BFD if it corresponds to an executable or dynamic object.  */
6571
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
6572
    return TRUE;
6573
 
6574
  for (sec = abfd->sections; sec != NULL; sec = sec->next)
6575
    {
6576
      unsigned int i, span, first_fmac = 0, veneer_of_insn = 0;
6577
      struct _arm_elf_section_data *sec_data;
6578
 
6579
      /* If we don't have executable progbits, we're not interested in this
6580
         section.  Also skip if section is to be excluded.  */
6581
      if (elf_section_type (sec) != SHT_PROGBITS
6582
          || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
6583
          || (sec->flags & SEC_EXCLUDE) != 0
6584
          || sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
6585
          || sec->output_section == bfd_abs_section_ptr
6586
          || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
6587
        continue;
6588
 
6589
      sec_data = elf32_arm_section_data (sec);
6590
 
6591
      if (sec_data->mapcount == 0)
6592
        continue;
6593
 
6594
      if (elf_section_data (sec)->this_hdr.contents != NULL)
6595
        contents = elf_section_data (sec)->this_hdr.contents;
6596
      else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
6597
        goto error_return;
6598
 
6599
      qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
6600
             elf32_arm_compare_mapping);
6601
 
6602
      for (span = 0; span < sec_data->mapcount; span++)
6603
        {
6604
          unsigned int span_start = sec_data->map[span].vma;
6605
          unsigned int span_end = (span == sec_data->mapcount - 1)
6606
                                  ? sec->size : sec_data->map[span + 1].vma;
6607
          char span_type = sec_data->map[span].type;
6608
 
6609
          /* FIXME: Only ARM mode is supported at present.  We may need to
6610
             support Thumb-2 mode also at some point.  */
6611
          if (span_type != 'a')
6612
            continue;
6613
 
6614
          for (i = span_start; i < span_end;)
6615
            {
6616
              unsigned int next_i = i + 4;
6617
              unsigned int insn = bfd_big_endian (abfd)
6618
                ? (contents[i] << 24)
6619
                  | (contents[i + 1] << 16)
6620
                  | (contents[i + 2] << 8)
6621
                  | contents[i + 3]
6622
                : (contents[i + 3] << 24)
6623
                  | (contents[i + 2] << 16)
6624
                  | (contents[i + 1] << 8)
6625
                  | contents[i];
6626
              unsigned int writemask = 0;
6627
              enum bfd_arm_vfp11_pipe vpipe;
6628
 
6629
              switch (state)
6630
                {
6631
                case 0:
6632
                  vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask, regs,
6633
                                                    &numregs);
6634
                  /* I'm assuming the VFP11 erratum can trigger with denorm
6635
                     operands on either the FMAC or the DS pipeline. This might
6636
                     lead to slightly overenthusiastic veneer insertion.  */
6637
                  if (vpipe == VFP11_FMAC || vpipe == VFP11_DS)
6638
                    {
6639
                      state = use_vector ? 1 : 2;
6640
                      first_fmac = i;
6641
                      veneer_of_insn = insn;
6642
                    }
6643
                  break;
6644
 
6645
                case 1:
6646
                  {
6647
                    int other_regs[3], other_numregs;
6648
                    vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
6649
                                                      other_regs,
6650
                                                      &other_numregs);
6651
                    if (vpipe != VFP11_BAD
6652
                        && bfd_arm_vfp11_antidependency (writemask, regs,
6653
                                                         numregs))
6654
                      state = 3;
6655
                    else
6656
                      state = 2;
6657
                  }
6658
                  break;
6659
 
6660
                case 2:
6661
                  {
6662
                    int other_regs[3], other_numregs;
6663
                    vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
6664
                                                      other_regs,
6665
                                                      &other_numregs);
6666
                    if (vpipe != VFP11_BAD
6667
                        && bfd_arm_vfp11_antidependency (writemask, regs,
6668
                                                         numregs))
6669
                      state = 3;
6670
                    else
6671
                      {
6672
                        state = 0;
6673
                        next_i = first_fmac + 4;
6674
                      }
6675
                  }
6676
                  break;
6677
 
6678
                case 3:
6679
                  abort ();  /* Should be unreachable.  */
6680
                }
6681
 
6682
              if (state == 3)
6683
                {
6684
                  elf32_vfp11_erratum_list *newerr =(elf32_vfp11_erratum_list *)
6685
                      bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
6686
 
6687
                  elf32_arm_section_data (sec)->erratumcount += 1;
6688
 
6689
                  newerr->u.b.vfp_insn = veneer_of_insn;
6690
 
6691
                  switch (span_type)
6692
                    {
6693
                    case 'a':
6694
                      newerr->type = VFP11_ERRATUM_BRANCH_TO_ARM_VENEER;
6695
                      break;
6696
 
6697
                    default:
6698
                      abort ();
6699
                    }
6700
 
6701
                  record_vfp11_erratum_veneer (link_info, newerr, abfd, sec,
6702
                                               first_fmac);
6703
 
6704
                  newerr->vma = -1;
6705
 
6706
                  newerr->next = sec_data->erratumlist;
6707
                  sec_data->erratumlist = newerr;
6708
 
6709
                  state = 0;
6710
                }
6711
 
6712
              i = next_i;
6713
            }
6714
        }
6715
 
6716
      if (contents != NULL
6717
          && elf_section_data (sec)->this_hdr.contents != contents)
6718
        free (contents);
6719
      contents = NULL;
6720
    }
6721
 
6722
  return TRUE;
6723
 
6724
error_return:
6725
  if (contents != NULL
6726
      && elf_section_data (sec)->this_hdr.contents != contents)
6727
    free (contents);
6728
 
6729
  return FALSE;
6730
}
6731
 
6732
/* Find virtual-memory addresses for VFP11 erratum veneers and return locations
6733
   after sections have been laid out, using specially-named symbols.  */
6734
 
6735
void
6736
bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd,
6737
                                          struct bfd_link_info *link_info)
6738
{
6739
  asection *sec;
6740
  struct elf32_arm_link_hash_table *globals;
6741
  char *tmp_name;
6742
 
6743
  if (link_info->relocatable)
6744
    return;
6745
 
6746
  /* Skip if this bfd does not correspond to an ELF image.  */
6747
  if (! is_arm_elf (abfd))
6748
    return;
6749
 
6750
  globals = elf32_arm_hash_table (link_info);
6751
  if (globals == NULL)
6752
    return;
6753
 
6754
  tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
6755
                                  (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
6756
 
6757
  for (sec = abfd->sections; sec != NULL; sec = sec->next)
6758
    {
6759
      struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
6760
      elf32_vfp11_erratum_list *errnode = sec_data->erratumlist;
6761
 
6762
      for (; errnode != NULL; errnode = errnode->next)
6763
        {
6764
          struct elf_link_hash_entry *myh;
6765
          bfd_vma vma;
6766
 
6767
          switch (errnode->type)
6768
            {
6769
            case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
6770
            case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER:
6771
              /* Find veneer symbol.  */
6772
              sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
6773
                       errnode->u.b.veneer->u.v.id);
6774
 
6775
              myh = elf_link_hash_lookup
6776
                (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
6777
 
6778
              if (myh == NULL)
6779
                (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
6780
                                         "`%s'"), abfd, tmp_name);
6781
 
6782
              vma = myh->root.u.def.section->output_section->vma
6783
                    + myh->root.u.def.section->output_offset
6784
                    + myh->root.u.def.value;
6785
 
6786
              errnode->u.b.veneer->vma = vma;
6787
              break;
6788
 
6789
            case VFP11_ERRATUM_ARM_VENEER:
6790
            case VFP11_ERRATUM_THUMB_VENEER:
6791
              /* Find return location.  */
6792
              sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
6793
                       errnode->u.v.id);
6794
 
6795
              myh = elf_link_hash_lookup
6796
                (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
6797
 
6798
              if (myh == NULL)
6799
                (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
6800
                                         "`%s'"), abfd, tmp_name);
6801
 
6802
              vma = myh->root.u.def.section->output_section->vma
6803
                    + myh->root.u.def.section->output_offset
6804
                    + myh->root.u.def.value;
6805
 
6806
              errnode->u.v.branch->vma = vma;
6807
              break;
6808
 
6809
            default:
6810
              abort ();
6811
            }
6812
        }
6813
    }
6814
 
6815
  free (tmp_name);
6816
}
6817
 
6818
 
6819
/* Set target relocation values needed during linking.  */
6820
 
6821
void
6822
bfd_elf32_arm_set_target_relocs (struct bfd *output_bfd,
6823
                                 struct bfd_link_info *link_info,
6824
                                 int target1_is_rel,
6825
                                 char * target2_type,
6826
                                 int fix_v4bx,
6827
                                 int use_blx,
6828
                                 bfd_arm_vfp11_fix vfp11_fix,
6829
                                 int no_enum_warn, int no_wchar_warn,
6830 161 khays
                                 int pic_veneer, int fix_cortex_a8,
6831
                                 int fix_arm1176)
6832 14 khays
{
6833
  struct elf32_arm_link_hash_table *globals;
6834
 
6835
  globals = elf32_arm_hash_table (link_info);
6836
  if (globals == NULL)
6837
    return;
6838
 
6839
  globals->target1_is_rel = target1_is_rel;
6840
  if (strcmp (target2_type, "rel") == 0)
6841
    globals->target2_reloc = R_ARM_REL32;
6842
  else if (strcmp (target2_type, "abs") == 0)
6843
    globals->target2_reloc = R_ARM_ABS32;
6844
  else if (strcmp (target2_type, "got-rel") == 0)
6845
    globals->target2_reloc = R_ARM_GOT_PREL;
6846
  else
6847
    {
6848
      _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
6849
                          target2_type);
6850
    }
6851
  globals->fix_v4bx = fix_v4bx;
6852
  globals->use_blx |= use_blx;
6853
  globals->vfp11_fix = vfp11_fix;
6854
  globals->pic_veneer = pic_veneer;
6855
  globals->fix_cortex_a8 = fix_cortex_a8;
6856 161 khays
  globals->fix_arm1176 = fix_arm1176;
6857 14 khays
 
6858
  BFD_ASSERT (is_arm_elf (output_bfd));
6859
  elf_arm_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
6860
  elf_arm_tdata (output_bfd)->no_wchar_size_warning = no_wchar_warn;
6861
}
6862
 
6863
/* Replace the target offset of a Thumb bl or b.w instruction.  */
6864
 
6865
static void
6866
insert_thumb_branch (bfd *abfd, long int offset, bfd_byte *insn)
6867
{
6868
  bfd_vma upper;
6869
  bfd_vma lower;
6870
  int reloc_sign;
6871
 
6872
  BFD_ASSERT ((offset & 1) == 0);
6873
 
6874
  upper = bfd_get_16 (abfd, insn);
6875
  lower = bfd_get_16 (abfd, insn + 2);
6876
  reloc_sign = (offset < 0) ? 1 : 0;
6877
  upper = (upper & ~(bfd_vma) 0x7ff)
6878
          | ((offset >> 12) & 0x3ff)
6879
          | (reloc_sign << 10);
6880
  lower = (lower & ~(bfd_vma) 0x2fff)
6881
          | (((!((offset >> 23) & 1)) ^ reloc_sign) << 13)
6882
          | (((!((offset >> 22) & 1)) ^ reloc_sign) << 11)
6883
          | ((offset >> 1) & 0x7ff);
6884
  bfd_put_16 (abfd, upper, insn);
6885
  bfd_put_16 (abfd, lower, insn + 2);
6886
}
6887
 
6888
/* Thumb code calling an ARM function.  */
6889
 
6890
static int
6891
elf32_thumb_to_arm_stub (struct bfd_link_info * info,
6892
                         const char *           name,
6893
                         bfd *                  input_bfd,
6894
                         bfd *                  output_bfd,
6895
                         asection *             input_section,
6896
                         bfd_byte *             hit_data,
6897
                         asection *             sym_sec,
6898
                         bfd_vma                offset,
6899
                         bfd_signed_vma         addend,
6900
                         bfd_vma                val,
6901
                         char **error_message)
6902
{
6903
  asection * s = 0;
6904
  bfd_vma my_offset;
6905
  long int ret_offset;
6906
  struct elf_link_hash_entry * myh;
6907
  struct elf32_arm_link_hash_table * globals;
6908
 
6909
  myh = find_thumb_glue (info, name, error_message);
6910
  if (myh == NULL)
6911
    return FALSE;
6912
 
6913
  globals = elf32_arm_hash_table (info);
6914
  BFD_ASSERT (globals != NULL);
6915
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
6916
 
6917
  my_offset = myh->root.u.def.value;
6918
 
6919
  s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
6920
                               THUMB2ARM_GLUE_SECTION_NAME);
6921
 
6922
  BFD_ASSERT (s != NULL);
6923
  BFD_ASSERT (s->contents != NULL);
6924
  BFD_ASSERT (s->output_section != NULL);
6925
 
6926
  if ((my_offset & 0x01) == 0x01)
6927
    {
6928
      if (sym_sec != NULL
6929
          && sym_sec->owner != NULL
6930
          && !INTERWORK_FLAG (sym_sec->owner))
6931
        {
6932
          (*_bfd_error_handler)
6933
            (_("%B(%s): warning: interworking not enabled.\n"
6934
               "  first occurrence: %B: thumb call to arm"),
6935
             sym_sec->owner, input_bfd, name);
6936
 
6937
          return FALSE;
6938
        }
6939
 
6940
      --my_offset;
6941
      myh->root.u.def.value = my_offset;
6942
 
6943
      put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
6944
                      s->contents + my_offset);
6945
 
6946
      put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
6947
                      s->contents + my_offset + 2);
6948
 
6949
      ret_offset =
6950
        /* Address of destination of the stub.  */
6951
        ((bfd_signed_vma) val)
6952
        - ((bfd_signed_vma)
6953
           /* Offset from the start of the current section
6954
              to the start of the stubs.  */
6955
           (s->output_offset
6956
            /* Offset of the start of this stub from the start of the stubs.  */
6957
            + my_offset
6958
            /* Address of the start of the current section.  */
6959
            + s->output_section->vma)
6960
           /* The branch instruction is 4 bytes into the stub.  */
6961
           + 4
6962
           /* ARM branches work from the pc of the instruction + 8.  */
6963
           + 8);
6964
 
6965
      put_arm_insn (globals, output_bfd,
6966
                    (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
6967
                    s->contents + my_offset + 4);
6968
    }
6969
 
6970
  BFD_ASSERT (my_offset <= globals->thumb_glue_size);
6971
 
6972
  /* Now go back and fix up the original BL insn to point to here.  */
6973
  ret_offset =
6974
    /* Address of where the stub is located.  */
6975
    (s->output_section->vma + s->output_offset + my_offset)
6976
     /* Address of where the BL is located.  */
6977
    - (input_section->output_section->vma + input_section->output_offset
6978
       + offset)
6979
    /* Addend in the relocation.  */
6980
    - addend
6981
    /* Biassing for PC-relative addressing.  */
6982
    - 8;
6983
 
6984
  insert_thumb_branch (input_bfd, ret_offset, hit_data - input_section->vma);
6985
 
6986
  return TRUE;
6987
}
6988
 
6989
/* Populate an Arm to Thumb stub.  Returns the stub symbol.  */
6990
 
6991
static struct elf_link_hash_entry *
6992
elf32_arm_create_thumb_stub (struct bfd_link_info * info,
6993
                             const char *           name,
6994
                             bfd *                  input_bfd,
6995
                             bfd *                  output_bfd,
6996
                             asection *             sym_sec,
6997
                             bfd_vma                val,
6998
                             asection *             s,
6999
                             char **                error_message)
7000
{
7001
  bfd_vma my_offset;
7002
  long int ret_offset;
7003
  struct elf_link_hash_entry * myh;
7004
  struct elf32_arm_link_hash_table * globals;
7005
 
7006
  myh = find_arm_glue (info, name, error_message);
7007
  if (myh == NULL)
7008
    return NULL;
7009
 
7010
  globals = elf32_arm_hash_table (info);
7011
  BFD_ASSERT (globals != NULL);
7012
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7013
 
7014
  my_offset = myh->root.u.def.value;
7015
 
7016
  if ((my_offset & 0x01) == 0x01)
7017
    {
7018
      if (sym_sec != NULL
7019
          && sym_sec->owner != NULL
7020
          && !INTERWORK_FLAG (sym_sec->owner))
7021
        {
7022
          (*_bfd_error_handler)
7023
            (_("%B(%s): warning: interworking not enabled.\n"
7024
               "  first occurrence: %B: arm call to thumb"),
7025
             sym_sec->owner, input_bfd, name);
7026
        }
7027
 
7028
      --my_offset;
7029
      myh->root.u.def.value = my_offset;
7030
 
7031
      if (info->shared || globals->root.is_relocatable_executable
7032
          || globals->pic_veneer)
7033
        {
7034
          /* For relocatable objects we can't use absolute addresses,
7035
             so construct the address from a relative offset.  */
7036
          /* TODO: If the offset is small it's probably worth
7037
             constructing the address with adds.  */
7038
          put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
7039
                        s->contents + my_offset);
7040
          put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
7041
                        s->contents + my_offset + 4);
7042
          put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
7043
                        s->contents + my_offset + 8);
7044
          /* Adjust the offset by 4 for the position of the add,
7045
             and 8 for the pipeline offset.  */
7046
          ret_offset = (val - (s->output_offset
7047
                               + s->output_section->vma
7048
                               + my_offset + 12))
7049
                       | 1;
7050
          bfd_put_32 (output_bfd, ret_offset,
7051
                      s->contents + my_offset + 12);
7052
        }
7053
      else if (globals->use_blx)
7054
        {
7055
          put_arm_insn (globals, output_bfd, (bfd_vma) a2t1v5_ldr_insn,
7056
                        s->contents + my_offset);
7057
 
7058
          /* It's a thumb address.  Add the low order bit.  */
7059
          bfd_put_32 (output_bfd, val | a2t2v5_func_addr_insn,
7060
                      s->contents + my_offset + 4);
7061
        }
7062
      else
7063
        {
7064
          put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
7065
                        s->contents + my_offset);
7066
 
7067
          put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
7068
                        s->contents + my_offset + 4);
7069
 
7070
          /* It's a thumb address.  Add the low order bit.  */
7071
          bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
7072
                      s->contents + my_offset + 8);
7073
 
7074
          my_offset += 12;
7075
        }
7076
    }
7077
 
7078
  BFD_ASSERT (my_offset <= globals->arm_glue_size);
7079
 
7080
  return myh;
7081
}
7082
 
7083
/* Arm code calling a Thumb function.  */
7084
 
7085
static int
7086
elf32_arm_to_thumb_stub (struct bfd_link_info * info,
7087
                         const char *           name,
7088
                         bfd *                  input_bfd,
7089
                         bfd *                  output_bfd,
7090
                         asection *             input_section,
7091
                         bfd_byte *             hit_data,
7092
                         asection *             sym_sec,
7093
                         bfd_vma                offset,
7094
                         bfd_signed_vma         addend,
7095
                         bfd_vma                val,
7096
                         char **error_message)
7097
{
7098
  unsigned long int tmp;
7099
  bfd_vma my_offset;
7100
  asection * s;
7101
  long int ret_offset;
7102
  struct elf_link_hash_entry * myh;
7103
  struct elf32_arm_link_hash_table * globals;
7104
 
7105
  globals = elf32_arm_hash_table (info);
7106
  BFD_ASSERT (globals != NULL);
7107
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7108
 
7109
  s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
7110
                               ARM2THUMB_GLUE_SECTION_NAME);
7111
  BFD_ASSERT (s != NULL);
7112
  BFD_ASSERT (s->contents != NULL);
7113
  BFD_ASSERT (s->output_section != NULL);
7114
 
7115
  myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
7116
                                     sym_sec, val, s, error_message);
7117
  if (!myh)
7118
    return FALSE;
7119
 
7120
  my_offset = myh->root.u.def.value;
7121
  tmp = bfd_get_32 (input_bfd, hit_data);
7122
  tmp = tmp & 0xFF000000;
7123
 
7124
  /* Somehow these are both 4 too far, so subtract 8.  */
7125
  ret_offset = (s->output_offset
7126
                + my_offset
7127
                + s->output_section->vma
7128
                - (input_section->output_offset
7129
                   + input_section->output_section->vma
7130
                   + offset + addend)
7131
                - 8);
7132
 
7133
  tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
7134
 
7135
  bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
7136
 
7137
  return TRUE;
7138
}
7139
 
7140
/* Populate Arm stub for an exported Thumb function.  */
7141
 
7142
static bfd_boolean
7143
elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
7144
{
7145
  struct bfd_link_info * info = (struct bfd_link_info *) inf;
7146
  asection * s;
7147
  struct elf_link_hash_entry * myh;
7148
  struct elf32_arm_link_hash_entry *eh;
7149
  struct elf32_arm_link_hash_table * globals;
7150
  asection *sec;
7151
  bfd_vma val;
7152
  char *error_message;
7153
 
7154
  eh = elf32_arm_hash_entry (h);
7155
  /* Allocate stubs for exported Thumb functions on v4t.  */
7156
  if (eh->export_glue == NULL)
7157
    return TRUE;
7158
 
7159
  globals = elf32_arm_hash_table (info);
7160
  BFD_ASSERT (globals != NULL);
7161
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7162
 
7163
  s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
7164
                               ARM2THUMB_GLUE_SECTION_NAME);
7165
  BFD_ASSERT (s != NULL);
7166
  BFD_ASSERT (s->contents != NULL);
7167
  BFD_ASSERT (s->output_section != NULL);
7168
 
7169
  sec = eh->export_glue->root.u.def.section;
7170
 
7171
  BFD_ASSERT (sec->output_section != NULL);
7172
 
7173
  val = eh->export_glue->root.u.def.value + sec->output_offset
7174
        + sec->output_section->vma;
7175
 
7176
  myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
7177
                                     h->root.u.def.section->owner,
7178
                                     globals->obfd, sec, val, s,
7179
                                     &error_message);
7180
  BFD_ASSERT (myh);
7181
  return TRUE;
7182
}
7183
 
7184
/* Populate ARMv4 BX veneers.  Returns the absolute adress of the veneer.  */
7185
 
7186
static bfd_vma
7187
elf32_arm_bx_glue (struct bfd_link_info * info, int reg)
7188
{
7189
  bfd_byte *p;
7190
  bfd_vma glue_addr;
7191
  asection *s;
7192
  struct elf32_arm_link_hash_table *globals;
7193
 
7194
  globals = elf32_arm_hash_table (info);
7195
  BFD_ASSERT (globals != NULL);
7196
  BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7197
 
7198
  s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
7199
                               ARM_BX_GLUE_SECTION_NAME);
7200
  BFD_ASSERT (s != NULL);
7201
  BFD_ASSERT (s->contents != NULL);
7202
  BFD_ASSERT (s->output_section != NULL);
7203
 
7204
  BFD_ASSERT (globals->bx_glue_offset[reg] & 2);
7205
 
7206
  glue_addr = globals->bx_glue_offset[reg] & ~(bfd_vma)3;
7207
 
7208
  if ((globals->bx_glue_offset[reg] & 1) == 0)
7209
    {
7210
      p = s->contents + glue_addr;
7211
      bfd_put_32 (globals->obfd, armbx1_tst_insn + (reg << 16), p);
7212
      bfd_put_32 (globals->obfd, armbx2_moveq_insn + reg, p + 4);
7213
      bfd_put_32 (globals->obfd, armbx3_bx_insn + reg, p + 8);
7214
      globals->bx_glue_offset[reg] |= 1;
7215
    }
7216
 
7217
  return glue_addr + s->output_section->vma + s->output_offset;
7218
}
7219
 
7220
/* Generate Arm stubs for exported Thumb symbols.  */
7221
static void
7222
elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
7223
                                  struct bfd_link_info *link_info)
7224
{
7225
  struct elf32_arm_link_hash_table * globals;
7226
 
7227
  if (link_info == NULL)
7228
    /* Ignore this if we are not called by the ELF backend linker.  */
7229
    return;
7230
 
7231
  globals = elf32_arm_hash_table (link_info);
7232
  if (globals == NULL)
7233
    return;
7234
 
7235
  /* If blx is available then exported Thumb symbols are OK and there is
7236
     nothing to do.  */
7237
  if (globals->use_blx)
7238
    return;
7239
 
7240
  elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
7241
                          link_info);
7242
}
7243
 
7244
/* Reserve space for COUNT dynamic relocations in relocation selection
7245
   SRELOC.  */
7246
 
7247
static void
7248
elf32_arm_allocate_dynrelocs (struct bfd_link_info *info, asection *sreloc,
7249
                              bfd_size_type count)
7250
{
7251
  struct elf32_arm_link_hash_table *htab;
7252
 
7253
  htab = elf32_arm_hash_table (info);
7254
  BFD_ASSERT (htab->root.dynamic_sections_created);
7255
  if (sreloc == NULL)
7256
    abort ();
7257
  sreloc->size += RELOC_SIZE (htab) * count;
7258
}
7259
 
7260
/* Reserve space for COUNT R_ARM_IRELATIVE relocations.  If the link is
7261
   dynamic, the relocations should go in SRELOC, otherwise they should
7262
   go in the special .rel.iplt section.  */
7263
 
7264
static void
7265
elf32_arm_allocate_irelocs (struct bfd_link_info *info, asection *sreloc,
7266
                            bfd_size_type count)
7267
{
7268
  struct elf32_arm_link_hash_table *htab;
7269
 
7270
  htab = elf32_arm_hash_table (info);
7271
  if (!htab->root.dynamic_sections_created)
7272
    htab->root.irelplt->size += RELOC_SIZE (htab) * count;
7273
  else
7274
    {
7275
      BFD_ASSERT (sreloc != NULL);
7276
      sreloc->size += RELOC_SIZE (htab) * count;
7277
    }
7278
}
7279
 
7280
/* Add relocation REL to the end of relocation section SRELOC.  */
7281
 
7282
static void
7283
elf32_arm_add_dynreloc (bfd *output_bfd, struct bfd_link_info *info,
7284
                        asection *sreloc, Elf_Internal_Rela *rel)
7285
{
7286
  bfd_byte *loc;
7287
  struct elf32_arm_link_hash_table *htab;
7288
 
7289
  htab = elf32_arm_hash_table (info);
7290
  if (!htab->root.dynamic_sections_created
7291
      && ELF32_R_TYPE (rel->r_info) == R_ARM_IRELATIVE)
7292
    sreloc = htab->root.irelplt;
7293
  if (sreloc == NULL)
7294
    abort ();
7295
  loc = sreloc->contents;
7296
  loc += sreloc->reloc_count++ * RELOC_SIZE (htab);
7297
  if (sreloc->reloc_count * RELOC_SIZE (htab) > sreloc->size)
7298
    abort ();
7299
  SWAP_RELOC_OUT (htab) (output_bfd, rel, loc);
7300
}
7301
 
7302
/* Allocate room for a PLT entry described by ROOT_PLT and ARM_PLT.
7303
   IS_IPLT_ENTRY says whether the entry belongs to .iplt rather than
7304
   to .plt.  */
7305
 
7306
static void
7307
elf32_arm_allocate_plt_entry (struct bfd_link_info *info,
7308
                              bfd_boolean is_iplt_entry,
7309
                              union gotplt_union *root_plt,
7310
                              struct arm_plt_info *arm_plt)
7311
{
7312
  struct elf32_arm_link_hash_table *htab;
7313
  asection *splt;
7314
  asection *sgotplt;
7315
 
7316
  htab = elf32_arm_hash_table (info);
7317
 
7318
  if (is_iplt_entry)
7319
    {
7320
      splt = htab->root.iplt;
7321
      sgotplt = htab->root.igotplt;
7322
 
7323
      /* Allocate room for an R_ARM_IRELATIVE relocation in .rel.iplt.  */
7324
      elf32_arm_allocate_irelocs (info, htab->root.irelplt, 1);
7325
    }
7326
  else
7327
    {
7328
      splt = htab->root.splt;
7329
      sgotplt = htab->root.sgotplt;
7330
 
7331
      /* Allocate room for an R_JUMP_SLOT relocation in .rel.plt.  */
7332
      elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
7333
 
7334
      /* If this is the first .plt entry, make room for the special
7335
         first entry.  */
7336
      if (splt->size == 0)
7337
        splt->size += htab->plt_header_size;
7338
    }
7339
 
7340
  /* Allocate the PLT entry itself, including any leading Thumb stub.  */
7341
  if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
7342
    splt->size += PLT_THUMB_STUB_SIZE;
7343
  root_plt->offset = splt->size;
7344
  splt->size += htab->plt_entry_size;
7345
 
7346
  if (!htab->symbian_p)
7347
    {
7348
      /* We also need to make an entry in the .got.plt section, which
7349
         will be placed in the .got section by the linker script.  */
7350
      arm_plt->got_offset = sgotplt->size - 8 * htab->num_tls_desc;
7351
      sgotplt->size += 4;
7352
    }
7353
}
7354
 
7355
/* Fill in a PLT entry and its associated GOT slot.  If DYNINDX == -1,
7356
   the entry lives in .iplt and resolves to (*SYM_VALUE)().
7357
   Otherwise, DYNINDX is the index of the symbol in the dynamic
7358
   symbol table and SYM_VALUE is undefined.
7359
 
7360
   ROOT_PLT points to the offset of the PLT entry from the start of its
7361
   section (.iplt or .plt).  ARM_PLT points to the symbol's ARM-specific
7362
   bookkeeping information.  */
7363
 
7364
static void
7365
elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
7366
                              union gotplt_union *root_plt,
7367
                              struct arm_plt_info *arm_plt,
7368
                              int dynindx, bfd_vma sym_value)
7369
{
7370
  struct elf32_arm_link_hash_table *htab;
7371
  asection *sgot;
7372
  asection *splt;
7373
  asection *srel;
7374
  bfd_byte *loc;
7375
  bfd_vma plt_index;
7376
  Elf_Internal_Rela rel;
7377
  bfd_vma plt_header_size;
7378
  bfd_vma got_header_size;
7379
 
7380
  htab = elf32_arm_hash_table (info);
7381
 
7382
  /* Pick the appropriate sections and sizes.  */
7383
  if (dynindx == -1)
7384
    {
7385
      splt = htab->root.iplt;
7386
      sgot = htab->root.igotplt;
7387
      srel = htab->root.irelplt;
7388
 
7389
      /* There are no reserved entries in .igot.plt, and no special
7390
         first entry in .iplt.  */
7391
      got_header_size = 0;
7392
      plt_header_size = 0;
7393
    }
7394
  else
7395
    {
7396
      splt = htab->root.splt;
7397
      sgot = htab->root.sgotplt;
7398
      srel = htab->root.srelplt;
7399
 
7400
      got_header_size = get_elf_backend_data (output_bfd)->got_header_size;
7401
      plt_header_size = htab->plt_header_size;
7402
    }
7403
  BFD_ASSERT (splt != NULL && srel != NULL);
7404
 
7405
  /* Fill in the entry in the procedure linkage table.  */
7406
  if (htab->symbian_p)
7407
    {
7408
      BFD_ASSERT (dynindx >= 0);
7409
      put_arm_insn (htab, output_bfd,
7410
                    elf32_arm_symbian_plt_entry[0],
7411
                    splt->contents + root_plt->offset);
7412
      bfd_put_32 (output_bfd,
7413
                  elf32_arm_symbian_plt_entry[1],
7414
                  splt->contents + root_plt->offset + 4);
7415
 
7416
      /* Fill in the entry in the .rel.plt section.  */
7417
      rel.r_offset = (splt->output_section->vma
7418
                      + splt->output_offset
7419
                      + root_plt->offset + 4);
7420
      rel.r_info = ELF32_R_INFO (dynindx, R_ARM_GLOB_DAT);
7421
 
7422
      /* Get the index in the procedure linkage table which
7423
         corresponds to this symbol.  This is the index of this symbol
7424
         in all the symbols for which we are making plt entries.  The
7425
         first entry in the procedure linkage table is reserved.  */
7426
      plt_index = ((root_plt->offset - plt_header_size)
7427
                   / htab->plt_entry_size);
7428
    }
7429
  else
7430
    {
7431
      bfd_vma got_offset, got_address, plt_address;
7432
      bfd_vma got_displacement, initial_got_entry;
7433
      bfd_byte * ptr;
7434
 
7435
      BFD_ASSERT (sgot != NULL);
7436
 
7437
      /* Get the offset into the .(i)got.plt table of the entry that
7438
         corresponds to this function.  */
7439
      got_offset = (arm_plt->got_offset & -2);
7440
 
7441
      /* Get the index in the procedure linkage table which
7442
         corresponds to this symbol.  This is the index of this symbol
7443
         in all the symbols for which we are making plt entries.
7444
         After the reserved .got.plt entries, all symbols appear in
7445
         the same order as in .plt.  */
7446
      plt_index = (got_offset - got_header_size) / 4;
7447
 
7448
      /* Calculate the address of the GOT entry.  */
7449
      got_address = (sgot->output_section->vma
7450
                     + sgot->output_offset
7451
                     + got_offset);
7452
 
7453
      /* ...and the address of the PLT entry.  */
7454
      plt_address = (splt->output_section->vma
7455
                     + splt->output_offset
7456
                     + root_plt->offset);
7457
 
7458
      ptr = splt->contents + root_plt->offset;
7459
      if (htab->vxworks_p && info->shared)
7460
        {
7461
          unsigned int i;
7462
          bfd_vma val;
7463
 
7464
          for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
7465
            {
7466
              val = elf32_arm_vxworks_shared_plt_entry[i];
7467
              if (i == 2)
7468
                val |= got_address - sgot->output_section->vma;
7469
              if (i == 5)
7470
                val |= plt_index * RELOC_SIZE (htab);
7471
              if (i == 2 || i == 5)
7472
                bfd_put_32 (output_bfd, val, ptr);
7473
              else
7474
                put_arm_insn (htab, output_bfd, val, ptr);
7475
            }
7476
        }
7477
      else if (htab->vxworks_p)
7478
        {
7479
          unsigned int i;
7480
          bfd_vma val;
7481
 
7482
          for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
7483
            {
7484
              val = elf32_arm_vxworks_exec_plt_entry[i];
7485
              if (i == 2)
7486
                val |= got_address;
7487
              if (i == 4)
7488
                val |= 0xffffff & -((root_plt->offset + i * 4 + 8) >> 2);
7489
              if (i == 5)
7490
                val |= plt_index * RELOC_SIZE (htab);
7491
              if (i == 2 || i == 5)
7492
                bfd_put_32 (output_bfd, val, ptr);
7493
              else
7494
                put_arm_insn (htab, output_bfd, val, ptr);
7495
            }
7496
 
7497
          loc = (htab->srelplt2->contents
7498
                 + (plt_index * 2 + 1) * RELOC_SIZE (htab));
7499
 
7500
          /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
7501
             referencing the GOT for this PLT entry.  */
7502
          rel.r_offset = plt_address + 8;
7503
          rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
7504
          rel.r_addend = got_offset;
7505
          SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
7506
          loc += RELOC_SIZE (htab);
7507
 
7508
          /* Create the R_ARM_ABS32 relocation referencing the
7509
             beginning of the PLT for this GOT entry.  */
7510
          rel.r_offset = got_address;
7511
          rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
7512
          rel.r_addend = 0;
7513
          SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
7514
        }
7515
      else
7516
        {
7517
          /* Calculate the displacement between the PLT slot and the
7518
             entry in the GOT.  The eight-byte offset accounts for the
7519
             value produced by adding to pc in the first instruction
7520
             of the PLT stub.  */
7521
          got_displacement = got_address - (plt_address + 8);
7522
 
7523
          BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
7524
 
7525
          if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
7526
            {
7527
              put_thumb_insn (htab, output_bfd,
7528
                              elf32_arm_plt_thumb_stub[0], ptr - 4);
7529
              put_thumb_insn (htab, output_bfd,
7530
                              elf32_arm_plt_thumb_stub[1], ptr - 2);
7531
            }
7532
 
7533
          put_arm_insn (htab, output_bfd,
7534
                        elf32_arm_plt_entry[0]
7535
                        | ((got_displacement & 0x0ff00000) >> 20),
7536
                        ptr + 0);
7537
          put_arm_insn (htab, output_bfd,
7538
                        elf32_arm_plt_entry[1]
7539
                        | ((got_displacement & 0x000ff000) >> 12),
7540
                        ptr+ 4);
7541
          put_arm_insn (htab, output_bfd,
7542
                        elf32_arm_plt_entry[2]
7543
                        | (got_displacement & 0x00000fff),
7544
                        ptr + 8);
7545
#ifdef FOUR_WORD_PLT
7546
          bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12);
7547
#endif
7548
        }
7549
 
7550
      /* Fill in the entry in the .rel(a).(i)plt section.  */
7551
      rel.r_offset = got_address;
7552
      rel.r_addend = 0;
7553
      if (dynindx == -1)
7554
        {
7555
          /* .igot.plt entries use IRELATIVE relocations against SYM_VALUE.
7556
             The dynamic linker or static executable then calls SYM_VALUE
7557
             to determine the correct run-time value of the .igot.plt entry.  */
7558
          rel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
7559
          initial_got_entry = sym_value;
7560
        }
7561
      else
7562
        {
7563
          rel.r_info = ELF32_R_INFO (dynindx, R_ARM_JUMP_SLOT);
7564
          initial_got_entry = (splt->output_section->vma
7565
                               + splt->output_offset);
7566
        }
7567
 
7568
      /* Fill in the entry in the global offset table.  */
7569
      bfd_put_32 (output_bfd, initial_got_entry,
7570
                  sgot->contents + got_offset);
7571
    }
7572
 
7573
  loc = srel->contents + plt_index * RELOC_SIZE (htab);
7574
  SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
7575
}
7576
 
7577
/* Some relocations map to different relocations depending on the
7578
   target.  Return the real relocation.  */
7579
 
7580
static int
7581
arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
7582
                     int r_type)
7583
{
7584
  switch (r_type)
7585
    {
7586
    case R_ARM_TARGET1:
7587
      if (globals->target1_is_rel)
7588
        return R_ARM_REL32;
7589
      else
7590
        return R_ARM_ABS32;
7591
 
7592
    case R_ARM_TARGET2:
7593
      return globals->target2_reloc;
7594
 
7595
    default:
7596
      return r_type;
7597
    }
7598
}
7599
 
7600
/* Return the base VMA address which should be subtracted from real addresses
7601
   when resolving @dtpoff relocation.
7602
   This is PT_TLS segment p_vaddr.  */
7603
 
7604
static bfd_vma
7605
dtpoff_base (struct bfd_link_info *info)
7606
{
7607
  /* If tls_sec is NULL, we should have signalled an error already.  */
7608
  if (elf_hash_table (info)->tls_sec == NULL)
7609
    return 0;
7610
  return elf_hash_table (info)->tls_sec->vma;
7611
}
7612
 
7613
/* Return the relocation value for @tpoff relocation
7614
   if STT_TLS virtual address is ADDRESS.  */
7615
 
7616
static bfd_vma
7617
tpoff (struct bfd_link_info *info, bfd_vma address)
7618
{
7619
  struct elf_link_hash_table *htab = elf_hash_table (info);
7620
  bfd_vma base;
7621
 
7622
  /* If tls_sec is NULL, we should have signalled an error already.  */
7623
  if (htab->tls_sec == NULL)
7624
    return 0;
7625
  base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
7626
  return address - htab->tls_sec->vma + base;
7627
}
7628
 
7629
/* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
7630
   VALUE is the relocation value.  */
7631
 
7632
static bfd_reloc_status_type
7633
elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
7634
{
7635
  if (value > 0xfff)
7636
    return bfd_reloc_overflow;
7637
 
7638
  value |= bfd_get_32 (abfd, data) & 0xfffff000;
7639
  bfd_put_32 (abfd, value, data);
7640
  return bfd_reloc_ok;
7641
}
7642
 
7643
/* Handle TLS relaxations.  Relaxing is possible for symbols that use
7644
   R_ARM_GOTDESC, R_ARM_{,THM_}TLS_CALL or
7645
   R_ARM_{,THM_}TLS_DESCSEQ relocations, during a static link.
7646
 
7647
   Return bfd_reloc_ok if we're done, bfd_reloc_continue if the caller
7648
   is to then call final_link_relocate.  Return other values in the
7649
   case of error.
7650
 
7651
   FIXME:When --emit-relocs is in effect, we'll emit relocs describing
7652
   the pre-relaxed code.  It would be nice if the relocs were updated
7653
   to match the optimization.   */
7654
 
7655
static bfd_reloc_status_type
7656
elf32_arm_tls_relax (struct elf32_arm_link_hash_table *globals,
7657
                     bfd *input_bfd, asection *input_sec, bfd_byte *contents,
7658
                     Elf_Internal_Rela *rel, unsigned long is_local)
7659
{
7660
  unsigned long insn;
7661
 
7662
  switch (ELF32_R_TYPE (rel->r_info))
7663
    {
7664
    default:
7665
      return bfd_reloc_notsupported;
7666
 
7667
    case R_ARM_TLS_GOTDESC:
7668
      if (is_local)
7669
        insn = 0;
7670
      else
7671
        {
7672
          insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
7673
          if (insn & 1)
7674
            insn -= 5; /* THUMB */
7675
          else
7676
            insn -= 8; /* ARM */
7677
        }
7678
      bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
7679
      return bfd_reloc_continue;
7680
 
7681
    case R_ARM_THM_TLS_DESCSEQ:
7682
      /* Thumb insn.  */
7683
      insn = bfd_get_16 (input_bfd, contents + rel->r_offset);
7684
      if ((insn & 0xff78) == 0x4478)      /* add rx, pc */
7685
        {
7686
          if (is_local)
7687
            /* nop */
7688
            bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
7689
        }
7690
      else if ((insn & 0xffc0) == 0x6840)  /* ldr rx,[ry,#4] */
7691
        {
7692
          if (is_local)
7693
            /* nop */
7694
            bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
7695
          else
7696
            /* ldr rx,[ry] */
7697
            bfd_put_16 (input_bfd, insn & 0xf83f, contents + rel->r_offset);
7698
        }
7699
      else if ((insn & 0xff87) == 0x4780)  /* blx rx */
7700
        {
7701
          if (is_local)
7702
            /* nop */
7703
            bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
7704
          else
7705
            /* mov r0, rx */
7706
            bfd_put_16 (input_bfd, 0x4600 | (insn & 0x78),
7707
                        contents + rel->r_offset);
7708
        }
7709
      else
7710
        {
7711
          if ((insn & 0xf000) == 0xf000 || (insn & 0xf800) == 0xe800)
7712
            /* It's a 32 bit instruction, fetch the rest of it for
7713
               error generation.  */
7714
            insn = (insn << 16)
7715
              | bfd_get_16 (input_bfd, contents + rel->r_offset + 2);
7716
          (*_bfd_error_handler)
7717
            (_("%B(%A+0x%lx):unexpected Thumb instruction '0x%x' in TLS trampoline"),
7718
             input_bfd, input_sec, (unsigned long)rel->r_offset, insn);
7719
          return bfd_reloc_notsupported;
7720
        }
7721
      break;
7722
 
7723
    case R_ARM_TLS_DESCSEQ:
7724
      /* arm insn.  */
7725
      insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
7726
      if ((insn & 0xffff0ff0) == 0xe08f0000) /* add rx,pc,ry */
7727
        {
7728
          if (is_local)
7729
            /* mov rx, ry */
7730
            bfd_put_32 (input_bfd, 0xe1a00000 | (insn & 0xffff),
7731
                        contents + rel->r_offset);
7732
        }
7733
      else if ((insn & 0xfff00fff) == 0xe5900004) /* ldr rx,[ry,#4]*/
7734
        {
7735
          if (is_local)
7736
            /* nop */
7737
            bfd_put_32 (input_bfd, 0xe1a00000, contents + rel->r_offset);
7738
          else
7739
            /* ldr rx,[ry] */
7740
            bfd_put_32 (input_bfd, insn & 0xfffff000,
7741
                        contents + rel->r_offset);
7742
        }
7743
      else if ((insn & 0xfffffff0) == 0xe12fff30) /* blx rx */
7744
        {
7745
          if (is_local)
7746
            /* nop */
7747
            bfd_put_32 (input_bfd, 0xe1a00000, contents + rel->r_offset);
7748
          else
7749
            /* mov r0, rx */
7750
            bfd_put_32 (input_bfd, 0xe1a00000 | (insn & 0xf),
7751
                        contents + rel->r_offset);
7752
        }
7753
      else
7754
        {
7755
          (*_bfd_error_handler)
7756
            (_("%B(%A+0x%lx):unexpected ARM instruction '0x%x' in TLS trampoline"),
7757
             input_bfd, input_sec, (unsigned long)rel->r_offset, insn);
7758
          return bfd_reloc_notsupported;
7759
        }
7760
      break;
7761
 
7762
    case R_ARM_TLS_CALL:
7763
      /* GD->IE relaxation, turn the instruction into 'nop' or
7764
         'ldr r0, [pc,r0]'  */
7765
      insn = is_local ? 0xe1a00000 : 0xe79f0000;
7766
      bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
7767
      break;
7768
 
7769
    case R_ARM_THM_TLS_CALL:
7770
      /* GD->IE relaxation */
7771
      if (!is_local)
7772
        /* add r0,pc; ldr r0, [r0]  */
7773
        insn = 0x44786800;
7774
      else if (arch_has_thumb2_nop (globals))
7775
        /* nop.w */
7776
        insn = 0xf3af8000;
7777
      else
7778
        /* nop; nop */
7779
        insn = 0xbf00bf00;
7780
 
7781
      bfd_put_16 (input_bfd, insn >> 16, contents + rel->r_offset);
7782
      bfd_put_16 (input_bfd, insn & 0xffff, contents + rel->r_offset + 2);
7783
      break;
7784
    }
7785
  return bfd_reloc_ok;
7786
}
7787
 
7788
/* For a given value of n, calculate the value of G_n as required to
7789
   deal with group relocations.  We return it in the form of an
7790
   encoded constant-and-rotation, together with the final residual.  If n is
7791
   specified as less than zero, then final_residual is filled with the
7792
   input value and no further action is performed.  */
7793
 
7794
static bfd_vma
7795
calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
7796
{
7797
  int current_n;
7798
  bfd_vma g_n;
7799
  bfd_vma encoded_g_n = 0;
7800
  bfd_vma residual = value; /* Also known as Y_n.  */
7801
 
7802
  for (current_n = 0; current_n <= n; current_n++)
7803
    {
7804
      int shift;
7805
 
7806
      /* Calculate which part of the value to mask.  */
7807
      if (residual == 0)
7808
        shift = 0;
7809
      else
7810
        {
7811
          int msb;
7812
 
7813
          /* Determine the most significant bit in the residual and
7814
             align the resulting value to a 2-bit boundary.  */
7815
          for (msb = 30; msb >= 0; msb -= 2)
7816
            if (residual & (3 << msb))
7817
              break;
7818
 
7819
          /* The desired shift is now (msb - 6), or zero, whichever
7820
             is the greater.  */
7821
          shift = msb - 6;
7822
          if (shift < 0)
7823
            shift = 0;
7824
        }
7825
 
7826
      /* Calculate g_n in 32-bit as well as encoded constant+rotation form.  */
7827
      g_n = residual & (0xff << shift);
7828
      encoded_g_n = (g_n >> shift)
7829
                    | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
7830
 
7831
      /* Calculate the residual for the next time around.  */
7832
      residual &= ~g_n;
7833
    }
7834
 
7835
  *final_residual = residual;
7836
 
7837
  return encoded_g_n;
7838
}
7839
 
7840
/* Given an ARM instruction, determine whether it is an ADD or a SUB.
7841
   Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise.  */
7842
 
7843
static int
7844
identify_add_or_sub (bfd_vma insn)
7845
{
7846
  int opcode = insn & 0x1e00000;
7847
 
7848
  if (opcode == 1 << 23) /* ADD */
7849
    return 1;
7850
 
7851
  if (opcode == 1 << 22) /* SUB */
7852
    return -1;
7853
 
7854
  return 0;
7855
}
7856
 
7857
/* Perform a relocation as part of a final link.  */
7858
 
7859
static bfd_reloc_status_type
7860
elf32_arm_final_link_relocate (reloc_howto_type *           howto,
7861
                               bfd *                        input_bfd,
7862
                               bfd *                        output_bfd,
7863
                               asection *                   input_section,
7864
                               bfd_byte *                   contents,
7865
                               Elf_Internal_Rela *          rel,
7866
                               bfd_vma                      value,
7867
                               struct bfd_link_info *       info,
7868
                               asection *                   sym_sec,
7869
                               const char *                 sym_name,
7870
                               unsigned char                st_type,
7871
                               enum arm_st_branch_type      branch_type,
7872
                               struct elf_link_hash_entry * h,
7873
                               bfd_boolean *                unresolved_reloc_p,
7874
                               char **                      error_message)
7875
{
7876
  unsigned long                 r_type = howto->type;
7877
  unsigned long                 r_symndx;
7878
  bfd_byte *                    hit_data = contents + rel->r_offset;
7879
  bfd_vma *                     local_got_offsets;
7880
  bfd_vma *                     local_tlsdesc_gotents;
7881
  asection *                    sgot;
7882
  asection *                    splt;
7883
  asection *                    sreloc = NULL;
7884
  asection *                    srelgot;
7885
  bfd_vma                       addend;
7886
  bfd_signed_vma                signed_addend;
7887
  unsigned char                 dynreloc_st_type;
7888
  bfd_vma                       dynreloc_value;
7889
  struct elf32_arm_link_hash_table * globals;
7890
  struct elf32_arm_link_hash_entry *eh;
7891
  union gotplt_union           *root_plt;
7892
  struct arm_plt_info          *arm_plt;
7893
  bfd_vma                       plt_offset;
7894
  bfd_vma                       gotplt_offset;
7895
  bfd_boolean                   has_iplt_entry;
7896
 
7897
  globals = elf32_arm_hash_table (info);
7898
  if (globals == NULL)
7899
    return bfd_reloc_notsupported;
7900
 
7901
  BFD_ASSERT (is_arm_elf (input_bfd));
7902
 
7903
  /* Some relocation types map to different relocations depending on the
7904
     target.  We pick the right one here.  */
7905
  r_type = arm_real_reloc_type (globals, r_type);
7906
 
7907
  /* It is possible to have linker relaxations on some TLS access
7908
     models.  Update our information here.  */
7909
  r_type = elf32_arm_tls_transition (info, r_type, h);
7910
 
7911
  if (r_type != howto->type)
7912
    howto = elf32_arm_howto_from_type (r_type);
7913
 
7914
  /* If the start address has been set, then set the EF_ARM_HASENTRY
7915
     flag.  Setting this more than once is redundant, but the cost is
7916
     not too high, and it keeps the code simple.
7917
 
7918
     The test is done  here, rather than somewhere else, because the
7919
     start address is only set just before the final link commences.
7920
 
7921
     Note - if the user deliberately sets a start address of 0, the
7922
     flag will not be set.  */
7923
  if (bfd_get_start_address (output_bfd) != 0)
7924
    elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
7925
 
7926
  eh = (struct elf32_arm_link_hash_entry *) h;
7927
  sgot = globals->root.sgot;
7928
  local_got_offsets = elf_local_got_offsets (input_bfd);
7929
  local_tlsdesc_gotents = elf32_arm_local_tlsdesc_gotent (input_bfd);
7930
 
7931
  if (globals->root.dynamic_sections_created)
7932
    srelgot = globals->root.srelgot;
7933
  else
7934
    srelgot = NULL;
7935
 
7936
  r_symndx = ELF32_R_SYM (rel->r_info);
7937
 
7938
  if (globals->use_rel)
7939
    {
7940
      addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
7941
 
7942
      if (addend & ((howto->src_mask + 1) >> 1))
7943
        {
7944
          signed_addend = -1;
7945
          signed_addend &= ~ howto->src_mask;
7946
          signed_addend |= addend;
7947
        }
7948
      else
7949
        signed_addend = addend;
7950
    }
7951
  else
7952
    addend = signed_addend = rel->r_addend;
7953
 
7954
  /* Record the symbol information that should be used in dynamic
7955
     relocations.  */
7956
  dynreloc_st_type = st_type;
7957
  dynreloc_value = value;
7958
  if (branch_type == ST_BRANCH_TO_THUMB)
7959
    dynreloc_value |= 1;
7960
 
7961
  /* Find out whether the symbol has a PLT.  Set ST_VALUE, BRANCH_TYPE and
7962
     VALUE appropriately for relocations that we resolve at link time.  */
7963
  has_iplt_entry = FALSE;
7964
  if (elf32_arm_get_plt_info (input_bfd, eh, r_symndx, &root_plt, &arm_plt)
7965
      && root_plt->offset != (bfd_vma) -1)
7966
    {
7967
      plt_offset = root_plt->offset;
7968
      gotplt_offset = arm_plt->got_offset;
7969
 
7970
      if (h == NULL || eh->is_iplt)
7971
        {
7972
          has_iplt_entry = TRUE;
7973
          splt = globals->root.iplt;
7974
 
7975
          /* Populate .iplt entries here, because not all of them will
7976
             be seen by finish_dynamic_symbol.  The lower bit is set if
7977
             we have already populated the entry.  */
7978
          if (plt_offset & 1)
7979
            plt_offset--;
7980
          else
7981
            {
7982
              elf32_arm_populate_plt_entry (output_bfd, info, root_plt, arm_plt,
7983
                                            -1, dynreloc_value);
7984
              root_plt->offset |= 1;
7985
            }
7986
 
7987
          /* Static relocations always resolve to the .iplt entry.  */
7988
          st_type = STT_FUNC;
7989
          value = (splt->output_section->vma
7990
                   + splt->output_offset
7991
                   + plt_offset);
7992
          branch_type = ST_BRANCH_TO_ARM;
7993
 
7994
          /* If there are non-call relocations that resolve to the .iplt
7995
             entry, then all dynamic ones must too.  */
7996
          if (arm_plt->noncall_refcount != 0)
7997
            {
7998
              dynreloc_st_type = st_type;
7999
              dynreloc_value = value;
8000
            }
8001
        }
8002
      else
8003
        /* We populate the .plt entry in finish_dynamic_symbol.  */
8004
        splt = globals->root.splt;
8005
    }
8006
  else
8007
    {
8008
      splt = NULL;
8009
      plt_offset = (bfd_vma) -1;
8010
      gotplt_offset = (bfd_vma) -1;
8011
    }
8012
 
8013
  switch (r_type)
8014
    {
8015
    case R_ARM_NONE:
8016
      /* We don't need to find a value for this symbol.  It's just a
8017
         marker.  */
8018
      *unresolved_reloc_p = FALSE;
8019
      return bfd_reloc_ok;
8020
 
8021
    case R_ARM_ABS12:
8022
      if (!globals->vxworks_p)
8023
        return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
8024
 
8025
    case R_ARM_PC24:
8026
    case R_ARM_ABS32:
8027
    case R_ARM_ABS32_NOI:
8028
    case R_ARM_REL32:
8029
    case R_ARM_REL32_NOI:
8030
    case R_ARM_CALL:
8031
    case R_ARM_JUMP24:
8032
    case R_ARM_XPC25:
8033
    case R_ARM_PREL31:
8034
    case R_ARM_PLT32:
8035
      /* Handle relocations which should use the PLT entry.  ABS32/REL32
8036
         will use the symbol's value, which may point to a PLT entry, but we
8037
         don't need to handle that here.  If we created a PLT entry, all
8038
         branches in this object should go to it, except if the PLT is too
8039
         far away, in which case a long branch stub should be inserted.  */
8040
      if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
8041
           && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI
8042
           && r_type != R_ARM_CALL
8043
           && r_type != R_ARM_JUMP24
8044
           && r_type != R_ARM_PLT32)
8045
          && plt_offset != (bfd_vma) -1)
8046
        {
8047
          /* If we've created a .plt section, and assigned a PLT entry
8048
             to this function, it must either be a STT_GNU_IFUNC reference
8049
             or not be known to bind locally.  In other cases, we should
8050
             have cleared the PLT entry by now.  */
8051
          BFD_ASSERT (has_iplt_entry || !SYMBOL_CALLS_LOCAL (info, h));
8052
 
8053
          value = (splt->output_section->vma
8054
                   + splt->output_offset
8055
                   + plt_offset);
8056
          *unresolved_reloc_p = FALSE;
8057
          return _bfd_final_link_relocate (howto, input_bfd, input_section,
8058
                                           contents, rel->r_offset, value,
8059
                                           rel->r_addend);
8060
        }
8061
 
8062
      /* When generating a shared object or relocatable executable, these
8063
         relocations are copied into the output file to be resolved at
8064
         run time.  */
8065
      if ((info->shared || globals->root.is_relocatable_executable)
8066
          && (input_section->flags & SEC_ALLOC)
8067
          && !(globals->vxworks_p
8068
               && strcmp (input_section->output_section->name,
8069
                          ".tls_vars") == 0)
8070
          && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
8071
              || !SYMBOL_CALLS_LOCAL (info, h))
8072
          && (!strstr (input_section->name, STUB_SUFFIX))
8073
          && (h == NULL
8074
              || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8075
              || h->root.type != bfd_link_hash_undefweak)
8076
          && r_type != R_ARM_PC24
8077
          && r_type != R_ARM_CALL
8078
          && r_type != R_ARM_JUMP24
8079
          && r_type != R_ARM_PREL31
8080
          && r_type != R_ARM_PLT32)
8081
        {
8082
          Elf_Internal_Rela outrel;
8083
          bfd_boolean skip, relocate;
8084
 
8085
          *unresolved_reloc_p = FALSE;
8086
 
8087
          if (sreloc == NULL && globals->root.dynamic_sections_created)
8088
            {
8089
              sreloc = _bfd_elf_get_dynamic_reloc_section (input_bfd, input_section,
8090
                                                           ! globals->use_rel);
8091
 
8092
              if (sreloc == NULL)
8093
                return bfd_reloc_notsupported;
8094
            }
8095
 
8096
          skip = FALSE;
8097
          relocate = FALSE;
8098
 
8099
          outrel.r_addend = addend;
8100
          outrel.r_offset =
8101
            _bfd_elf_section_offset (output_bfd, info, input_section,
8102
                                     rel->r_offset);
8103
          if (outrel.r_offset == (bfd_vma) -1)
8104
            skip = TRUE;
8105
          else if (outrel.r_offset == (bfd_vma) -2)
8106
            skip = TRUE, relocate = TRUE;
8107
          outrel.r_offset += (input_section->output_section->vma
8108
                              + input_section->output_offset);
8109
 
8110
          if (skip)
8111
            memset (&outrel, 0, sizeof outrel);
8112
          else if (h != NULL
8113
                   && h->dynindx != -1
8114
                   && (!info->shared
8115
                       || !info->symbolic
8116
                       || !h->def_regular))
8117
            outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
8118
          else
8119
            {
8120
              int symbol;
8121
 
8122
              /* This symbol is local, or marked to become local.  */
8123
              BFD_ASSERT (r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI);
8124
              if (globals->symbian_p)
8125
                {
8126
                  asection *osec;
8127
 
8128
                  /* On Symbian OS, the data segment and text segement
8129
                     can be relocated independently.  Therefore, we
8130
                     must indicate the segment to which this
8131
                     relocation is relative.  The BPABI allows us to
8132
                     use any symbol in the right segment; we just use
8133
                     the section symbol as it is convenient.  (We
8134
                     cannot use the symbol given by "h" directly as it
8135
                     will not appear in the dynamic symbol table.)
8136
 
8137
                     Note that the dynamic linker ignores the section
8138
                     symbol value, so we don't subtract osec->vma
8139
                     from the emitted reloc addend.  */
8140
                  if (sym_sec)
8141
                    osec = sym_sec->output_section;
8142
                  else
8143
                    osec = input_section->output_section;
8144
                  symbol = elf_section_data (osec)->dynindx;
8145
                  if (symbol == 0)
8146
                    {
8147
                      struct elf_link_hash_table *htab = elf_hash_table (info);
8148
 
8149
                      if ((osec->flags & SEC_READONLY) == 0
8150
                          && htab->data_index_section != NULL)
8151
                        osec = htab->data_index_section;
8152
                      else
8153
                        osec = htab->text_index_section;
8154
                      symbol = elf_section_data (osec)->dynindx;
8155
                    }
8156
                  BFD_ASSERT (symbol != 0);
8157
                }
8158
              else
8159
                /* On SVR4-ish systems, the dynamic loader cannot
8160
                   relocate the text and data segments independently,
8161
                   so the symbol does not matter.  */
8162
                symbol = 0;
8163
              if (dynreloc_st_type == STT_GNU_IFUNC)
8164
                /* We have an STT_GNU_IFUNC symbol that doesn't resolve
8165
                   to the .iplt entry.  Instead, every non-call reference
8166
                   must use an R_ARM_IRELATIVE relocation to obtain the
8167
                   correct run-time address.  */
8168
                outrel.r_info = ELF32_R_INFO (symbol, R_ARM_IRELATIVE);
8169
              else
8170
                outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
8171
              if (globals->use_rel)
8172
                relocate = TRUE;
8173
              else
8174
                outrel.r_addend += dynreloc_value;
8175
            }
8176
 
8177
          elf32_arm_add_dynreloc (output_bfd, info, sreloc, &outrel);
8178
 
8179
          /* If this reloc is against an external symbol, we do not want to
8180
             fiddle with the addend.  Otherwise, we need to include the symbol
8181
             value so that it becomes an addend for the dynamic reloc.  */
8182
          if (! relocate)
8183
            return bfd_reloc_ok;
8184
 
8185
          return _bfd_final_link_relocate (howto, input_bfd, input_section,
8186
                                           contents, rel->r_offset,
8187
                                           dynreloc_value, (bfd_vma) 0);
8188
        }
8189
      else switch (r_type)
8190
        {
8191
        case R_ARM_ABS12:
8192
          return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
8193
 
8194
        case R_ARM_XPC25:         /* Arm BLX instruction.  */
8195
        case R_ARM_CALL:
8196
        case R_ARM_JUMP24:
8197
        case R_ARM_PC24:          /* Arm B/BL instruction.  */
8198
        case R_ARM_PLT32:
8199
          {
8200
          struct elf32_arm_stub_hash_entry *stub_entry = NULL;
8201
 
8202
          if (r_type == R_ARM_XPC25)
8203
            {
8204
              /* Check for Arm calling Arm function.  */
8205
              /* FIXME: Should we translate the instruction into a BL
8206
                 instruction instead ?  */
8207
              if (branch_type != ST_BRANCH_TO_THUMB)
8208
                (*_bfd_error_handler)
8209
                  (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
8210
                   input_bfd,
8211
                   h ? h->root.root.string : "(local)");
8212
            }
8213
          else if (r_type == R_ARM_PC24)
8214
            {
8215
              /* Check for Arm calling Thumb function.  */
8216
              if (branch_type == ST_BRANCH_TO_THUMB)
8217
                {
8218
                  if (elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
8219
                                               output_bfd, input_section,
8220
                                               hit_data, sym_sec, rel->r_offset,
8221
                                               signed_addend, value,
8222
                                               error_message))
8223
                    return bfd_reloc_ok;
8224
                  else
8225
                    return bfd_reloc_dangerous;
8226
                }
8227
            }
8228
 
8229
          /* Check if a stub has to be inserted because the
8230
             destination is too far or we are changing mode.  */
8231
          if (   r_type == R_ARM_CALL
8232
              || r_type == R_ARM_JUMP24
8233
              || r_type == R_ARM_PLT32)
8234
            {
8235
              enum elf32_arm_stub_type stub_type = arm_stub_none;
8236
              struct elf32_arm_link_hash_entry *hash;
8237
 
8238
              hash = (struct elf32_arm_link_hash_entry *) h;
8239
              stub_type = arm_type_of_stub (info, input_section, rel,
8240
                                            st_type, &branch_type,
8241
                                            hash, value, sym_sec,
8242
                                            input_bfd, sym_name);
8243
 
8244
              if (stub_type != arm_stub_none)
8245
                {
8246
                  /* The target is out of reach, so redirect the
8247
                     branch to the local stub for this function.  */
8248
                  stub_entry = elf32_arm_get_stub_entry (input_section,
8249
                                                         sym_sec, h,
8250
                                                         rel, globals,
8251
                                                         stub_type);
8252 163 khays
                  {
8253
                    if (stub_entry != NULL)
8254
                      value = (stub_entry->stub_offset
8255
                               + stub_entry->stub_sec->output_offset
8256
                               + stub_entry->stub_sec->output_section->vma);
8257
 
8258
                    if (plt_offset != (bfd_vma) -1)
8259
                      *unresolved_reloc_p = FALSE;
8260
                  }
8261 14 khays
                }
8262
              else
8263
                {
8264
                  /* If the call goes through a PLT entry, make sure to
8265
                     check distance to the right destination address.  */
8266
                  if (plt_offset != (bfd_vma) -1)
8267
                    {
8268
                      value = (splt->output_section->vma
8269
                               + splt->output_offset
8270
                               + plt_offset);
8271
                      *unresolved_reloc_p = FALSE;
8272
                      /* The PLT entry is in ARM mode, regardless of the
8273
                         target function.  */
8274
                      branch_type = ST_BRANCH_TO_ARM;
8275
                    }
8276
                }
8277
            }
8278
 
8279
          /* The ARM ELF ABI says that this reloc is computed as: S - P + A
8280
             where:
8281
              S is the address of the symbol in the relocation.
8282
              P is address of the instruction being relocated.
8283
              A is the addend (extracted from the instruction) in bytes.
8284
 
8285
             S is held in 'value'.
8286
             P is the base address of the section containing the
8287
               instruction plus the offset of the reloc into that
8288
               section, ie:
8289
                 (input_section->output_section->vma +
8290
                  input_section->output_offset +
8291
                  rel->r_offset).
8292
             A is the addend, converted into bytes, ie:
8293
                 (signed_addend * 4)
8294
 
8295
             Note: None of these operations have knowledge of the pipeline
8296
             size of the processor, thus it is up to the assembler to
8297
             encode this information into the addend.  */
8298
          value -= (input_section->output_section->vma
8299
                    + input_section->output_offset);
8300
          value -= rel->r_offset;
8301
          if (globals->use_rel)
8302
            value += (signed_addend << howto->size);
8303
          else
8304
            /* RELA addends do not have to be adjusted by howto->size.  */
8305
            value += signed_addend;
8306
 
8307
          signed_addend = value;
8308
          signed_addend >>= howto->rightshift;
8309
 
8310
          /* A branch to an undefined weak symbol is turned into a jump to
8311
             the next instruction unless a PLT entry will be created.
8312
             Do the same for local undefined symbols (but not for STN_UNDEF).
8313
             The jump to the next instruction is optimized as a NOP depending
8314
             on the architecture.  */
8315
          if (h ? (h->root.type == bfd_link_hash_undefweak
8316
                   && plt_offset == (bfd_vma) -1)
8317
              : r_symndx != STN_UNDEF && bfd_is_und_section (sym_sec))
8318
            {
8319
              value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000);
8320
 
8321
              if (arch_has_arm_nop (globals))
8322
                value |= 0x0320f000;
8323
              else
8324
                value |= 0x01a00000; /* Using pre-UAL nop: mov r0, r0.  */
8325
            }
8326
          else
8327
            {
8328
              /* Perform a signed range check.  */
8329
              if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
8330
                  || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
8331
                return bfd_reloc_overflow;
8332
 
8333
              addend = (value & 2);
8334
 
8335
              value = (signed_addend & howto->dst_mask)
8336
                | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
8337
 
8338
              if (r_type == R_ARM_CALL)
8339
                {
8340
                  /* Set the H bit in the BLX instruction.  */
8341
                  if (branch_type == ST_BRANCH_TO_THUMB)
8342
                    {
8343
                      if (addend)
8344
                        value |= (1 << 24);
8345
                      else
8346
                        value &= ~(bfd_vma)(1 << 24);
8347
                    }
8348
 
8349
                  /* Select the correct instruction (BL or BLX).  */
8350
                  /* Only if we are not handling a BL to a stub. In this
8351
                     case, mode switching is performed by the stub.  */
8352
                  if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry)
8353
                    value |= (1 << 28);
8354
                  else if (stub_entry || branch_type != ST_BRANCH_UNKNOWN)
8355
                    {
8356
                      value &= ~(bfd_vma)(1 << 28);
8357
                      value |= (1 << 24);
8358
                    }
8359
                }
8360
            }
8361
          }
8362
          break;
8363
 
8364
        case R_ARM_ABS32:
8365
          value += addend;
8366
          if (branch_type == ST_BRANCH_TO_THUMB)
8367
            value |= 1;
8368
          break;
8369
 
8370
        case R_ARM_ABS32_NOI:
8371
          value += addend;
8372
          break;
8373
 
8374
        case R_ARM_REL32:
8375
          value += addend;
8376
          if (branch_type == ST_BRANCH_TO_THUMB)
8377
            value |= 1;
8378
          value -= (input_section->output_section->vma
8379
                    + input_section->output_offset + rel->r_offset);
8380
          break;
8381
 
8382
        case R_ARM_REL32_NOI:
8383
          value += addend;
8384
          value -= (input_section->output_section->vma
8385
                    + input_section->output_offset + rel->r_offset);
8386
          break;
8387
 
8388
        case R_ARM_PREL31:
8389
          value -= (input_section->output_section->vma
8390
                    + input_section->output_offset + rel->r_offset);
8391
          value += signed_addend;
8392
          if (! h || h->root.type != bfd_link_hash_undefweak)
8393
            {
8394
              /* Check for overflow.  */
8395
              if ((value ^ (value >> 1)) & (1 << 30))
8396
                return bfd_reloc_overflow;
8397
            }
8398
          value &= 0x7fffffff;
8399
          value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
8400
          if (branch_type == ST_BRANCH_TO_THUMB)
8401
            value |= 1;
8402
          break;
8403
        }
8404
 
8405
      bfd_put_32 (input_bfd, value, hit_data);
8406
      return bfd_reloc_ok;
8407
 
8408
    case R_ARM_ABS8:
8409
      value += addend;
8410
 
8411
      /* There is no way to tell whether the user intended to use a signed or
8412
         unsigned addend.  When checking for overflow we accept either,
8413
         as specified by the AAELF.  */
8414
      if ((long) value > 0xff || (long) value < -0x80)
8415
        return bfd_reloc_overflow;
8416
 
8417
      bfd_put_8 (input_bfd, value, hit_data);
8418
      return bfd_reloc_ok;
8419
 
8420
    case R_ARM_ABS16:
8421
      value += addend;
8422
 
8423
      /* See comment for R_ARM_ABS8.  */
8424
      if ((long) value > 0xffff || (long) value < -0x8000)
8425
        return bfd_reloc_overflow;
8426
 
8427
      bfd_put_16 (input_bfd, value, hit_data);
8428
      return bfd_reloc_ok;
8429
 
8430
    case R_ARM_THM_ABS5:
8431
      /* Support ldr and str instructions for the thumb.  */
8432
      if (globals->use_rel)
8433
        {
8434
          /* Need to refetch addend.  */
8435
          addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
8436
          /* ??? Need to determine shift amount from operand size.  */
8437
          addend >>= howto->rightshift;
8438
        }
8439
      value += addend;
8440
 
8441
      /* ??? Isn't value unsigned?  */
8442
      if ((long) value > 0x1f || (long) value < -0x10)
8443
        return bfd_reloc_overflow;
8444
 
8445
      /* ??? Value needs to be properly shifted into place first.  */
8446
      value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
8447
      bfd_put_16 (input_bfd, value, hit_data);
8448
      return bfd_reloc_ok;
8449
 
8450
    case R_ARM_THM_ALU_PREL_11_0:
8451
      /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw).  */
8452
      {
8453
        bfd_vma insn;
8454
        bfd_signed_vma relocation;
8455
 
8456
        insn = (bfd_get_16 (input_bfd, hit_data) << 16)
8457
             | bfd_get_16 (input_bfd, hit_data + 2);
8458
 
8459
        if (globals->use_rel)
8460
          {
8461
            signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
8462
                          | ((insn & (1 << 26)) >> 15);
8463
            if (insn & 0xf00000)
8464
              signed_addend = -signed_addend;
8465
          }
8466
 
8467
        relocation = value + signed_addend;
8468
        relocation -= (input_section->output_section->vma
8469
                       + input_section->output_offset
8470
                       + rel->r_offset);
8471
 
8472
        value = abs (relocation);
8473
 
8474
        if (value >= 0x1000)
8475
          return bfd_reloc_overflow;
8476
 
8477
        insn = (insn & 0xfb0f8f00) | (value & 0xff)
8478
             | ((value & 0x700) << 4)
8479
             | ((value & 0x800) << 15);
8480
        if (relocation < 0)
8481
          insn |= 0xa00000;
8482
 
8483
        bfd_put_16 (input_bfd, insn >> 16, hit_data);
8484
        bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
8485
 
8486
        return bfd_reloc_ok;
8487
      }
8488
 
8489
    case R_ARM_THM_PC8:
8490
      /* PR 10073:  This reloc is not generated by the GNU toolchain,
8491
         but it is supported for compatibility with third party libraries
8492
         generated by other compilers, specifically the ARM/IAR.  */
8493
      {
8494
        bfd_vma insn;
8495
        bfd_signed_vma relocation;
8496
 
8497
        insn = bfd_get_16 (input_bfd, hit_data);
8498
 
8499
        if (globals->use_rel)
8500
          addend = (insn & 0x00ff) << 2;
8501
 
8502
        relocation = value + addend;
8503
        relocation -= (input_section->output_section->vma
8504
                       + input_section->output_offset
8505
                       + rel->r_offset);
8506
 
8507
        value = abs (relocation);
8508
 
8509
        /* We do not check for overflow of this reloc.  Although strictly
8510
           speaking this is incorrect, it appears to be necessary in order
8511
           to work with IAR generated relocs.  Since GCC and GAS do not
8512
           generate R_ARM_THM_PC8 relocs, the lack of a check should not be
8513
           a problem for them.  */
8514
        value &= 0x3fc;
8515
 
8516
        insn = (insn & 0xff00) | (value >> 2);
8517
 
8518
        bfd_put_16 (input_bfd, insn, hit_data);
8519
 
8520
        return bfd_reloc_ok;
8521
      }
8522
 
8523
    case R_ARM_THM_PC12:
8524
      /* Corresponds to: ldr.w reg, [pc, #offset].  */
8525
      {
8526
        bfd_vma insn;
8527
        bfd_signed_vma relocation;
8528
 
8529
        insn = (bfd_get_16 (input_bfd, hit_data) << 16)
8530
             | bfd_get_16 (input_bfd, hit_data + 2);
8531
 
8532
        if (globals->use_rel)
8533
          {
8534
            signed_addend = insn & 0xfff;
8535
            if (!(insn & (1 << 23)))
8536
              signed_addend = -signed_addend;
8537
          }
8538
 
8539
        relocation = value + signed_addend;
8540
        relocation -= (input_section->output_section->vma
8541
                       + input_section->output_offset
8542
                       + rel->r_offset);
8543
 
8544
        value = abs (relocation);
8545
 
8546
        if (value >= 0x1000)
8547
          return bfd_reloc_overflow;
8548
 
8549
        insn = (insn & 0xff7ff000) | value;
8550
        if (relocation >= 0)
8551
          insn |= (1 << 23);
8552
 
8553
        bfd_put_16 (input_bfd, insn >> 16, hit_data);
8554
        bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
8555
 
8556
        return bfd_reloc_ok;
8557
      }
8558
 
8559
    case R_ARM_THM_XPC22:
8560
    case R_ARM_THM_CALL:
8561
    case R_ARM_THM_JUMP24:
8562
      /* Thumb BL (branch long instruction).  */
8563
      {
8564
        bfd_vma relocation;
8565
        bfd_vma reloc_sign;
8566
        bfd_boolean overflow = FALSE;
8567
        bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
8568
        bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
8569
        bfd_signed_vma reloc_signed_max;
8570
        bfd_signed_vma reloc_signed_min;
8571
        bfd_vma check;
8572
        bfd_signed_vma signed_check;
8573
        int bitsize;
8574
        const int thumb2 = using_thumb2 (globals);
8575
 
8576
        /* A branch to an undefined weak symbol is turned into a jump to
8577
           the next instruction unless a PLT entry will be created.
8578
           The jump to the next instruction is optimized as a NOP.W for
8579
           Thumb-2 enabled architectures.  */
8580
        if (h && h->root.type == bfd_link_hash_undefweak
8581
            && plt_offset == (bfd_vma) -1)
8582
          {
8583
            if (arch_has_thumb2_nop (globals))
8584
              {
8585
                bfd_put_16 (input_bfd, 0xf3af, hit_data);
8586
                bfd_put_16 (input_bfd, 0x8000, hit_data + 2);
8587
              }
8588
            else
8589
              {
8590
                bfd_put_16 (input_bfd, 0xe000, hit_data);
8591
                bfd_put_16 (input_bfd, 0xbf00, hit_data + 2);
8592
              }
8593
            return bfd_reloc_ok;
8594
          }
8595
 
8596
        /* Fetch the addend.  We use the Thumb-2 encoding (backwards compatible
8597
           with Thumb-1) involving the J1 and J2 bits.  */
8598
        if (globals->use_rel)
8599
          {
8600
            bfd_vma s = (upper_insn & (1 << 10)) >> 10;
8601
            bfd_vma upper = upper_insn & 0x3ff;
8602
            bfd_vma lower = lower_insn & 0x7ff;
8603
            bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
8604
            bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
8605
            bfd_vma i1 = j1 ^ s ? 0 : 1;
8606
            bfd_vma i2 = j2 ^ s ? 0 : 1;
8607
 
8608
            addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
8609
            /* Sign extend.  */
8610
            addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
8611
 
8612
            signed_addend = addend;
8613
          }
8614
 
8615
        if (r_type == R_ARM_THM_XPC22)
8616
          {
8617
            /* Check for Thumb to Thumb call.  */
8618
            /* FIXME: Should we translate the instruction into a BL
8619
               instruction instead ?  */
8620
            if (branch_type == ST_BRANCH_TO_THUMB)
8621
              (*_bfd_error_handler)
8622
                (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
8623
                 input_bfd,
8624
                 h ? h->root.root.string : "(local)");
8625
          }
8626
        else
8627
          {
8628
            /* If it is not a call to Thumb, assume call to Arm.
8629
               If it is a call relative to a section name, then it is not a
8630
               function call at all, but rather a long jump.  Calls through
8631
               the PLT do not require stubs.  */
8632
            if (branch_type == ST_BRANCH_TO_ARM && plt_offset == (bfd_vma) -1)
8633
              {
8634
                if (globals->use_blx && r_type == R_ARM_THM_CALL)
8635
                  {
8636
                    /* Convert BL to BLX.  */
8637
                    lower_insn = (lower_insn & ~0x1000) | 0x0800;
8638
                  }
8639
                else if ((   r_type != R_ARM_THM_CALL)
8640
                         && (r_type != R_ARM_THM_JUMP24))
8641
                  {
8642
                    if (elf32_thumb_to_arm_stub
8643
                        (info, sym_name, input_bfd, output_bfd, input_section,
8644
                         hit_data, sym_sec, rel->r_offset, signed_addend, value,
8645
                         error_message))
8646
                      return bfd_reloc_ok;
8647
                    else
8648
                      return bfd_reloc_dangerous;
8649
                  }
8650
              }
8651
            else if (branch_type == ST_BRANCH_TO_THUMB
8652
                     && globals->use_blx
8653
                     && r_type == R_ARM_THM_CALL)
8654
              {
8655
                /* Make sure this is a BL.  */
8656
                lower_insn |= 0x1800;
8657
              }
8658
          }
8659
 
8660
        enum elf32_arm_stub_type stub_type = arm_stub_none;
8661
        if (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24)
8662
          {
8663
            /* Check if a stub has to be inserted because the destination
8664
               is too far.  */
8665
            struct elf32_arm_stub_hash_entry *stub_entry;
8666
            struct elf32_arm_link_hash_entry *hash;
8667
 
8668
            hash = (struct elf32_arm_link_hash_entry *) h;
8669
 
8670
            stub_type = arm_type_of_stub (info, input_section, rel,
8671
                                          st_type, &branch_type,
8672
                                          hash, value, sym_sec,
8673
                                          input_bfd, sym_name);
8674
 
8675
            if (stub_type != arm_stub_none)
8676
              {
8677
                /* The target is out of reach or we are changing modes, so
8678
                   redirect the branch to the local stub for this
8679
                   function.  */
8680
                stub_entry = elf32_arm_get_stub_entry (input_section,
8681
                                                       sym_sec, h,
8682
                                                       rel, globals,
8683
                                                       stub_type);
8684
                if (stub_entry != NULL)
8685 163 khays
                  {
8686
                    value = (stub_entry->stub_offset
8687
                             + stub_entry->stub_sec->output_offset
8688
                             + stub_entry->stub_sec->output_section->vma);
8689 14 khays
 
8690 163 khays
                    if (plt_offset != (bfd_vma) -1)
8691
                      *unresolved_reloc_p = FALSE;
8692
                  }
8693
 
8694 14 khays
                /* If this call becomes a call to Arm, force BLX.  */
8695
                if (globals->use_blx && (r_type == R_ARM_THM_CALL))
8696
                  {
8697
                    if ((stub_entry
8698
                         && !arm_stub_is_thumb (stub_entry->stub_type))
8699
                        || branch_type != ST_BRANCH_TO_THUMB)
8700
                      lower_insn = (lower_insn & ~0x1000) | 0x0800;
8701
                  }
8702
              }
8703
          }
8704
 
8705
        /* Handle calls via the PLT.  */
8706
        if (stub_type == arm_stub_none && plt_offset != (bfd_vma) -1)
8707
          {
8708
            value = (splt->output_section->vma
8709
                     + splt->output_offset
8710
                     + plt_offset);
8711
 
8712
            if (globals->use_blx && r_type == R_ARM_THM_CALL)
8713
              {
8714
                /* If the Thumb BLX instruction is available, convert
8715
                   the BL to a BLX instruction to call the ARM-mode
8716
                   PLT entry.  */
8717
                lower_insn = (lower_insn & ~0x1000) | 0x0800;
8718
                branch_type = ST_BRANCH_TO_ARM;
8719
              }
8720
            else
8721
              {
8722
                /* Target the Thumb stub before the ARM PLT entry.  */
8723
                value -= PLT_THUMB_STUB_SIZE;
8724
                branch_type = ST_BRANCH_TO_THUMB;
8725
              }
8726
            *unresolved_reloc_p = FALSE;
8727
          }
8728
 
8729
        relocation = value + signed_addend;
8730
 
8731
        relocation -= (input_section->output_section->vma
8732
                       + input_section->output_offset
8733
                       + rel->r_offset);
8734
 
8735
        check = relocation >> howto->rightshift;
8736
 
8737
        /* If this is a signed value, the rightshift just dropped
8738
           leading 1 bits (assuming twos complement).  */
8739
        if ((bfd_signed_vma) relocation >= 0)
8740
          signed_check = check;
8741
        else
8742
          signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
8743
 
8744
        /* Calculate the permissable maximum and minimum values for
8745
           this relocation according to whether we're relocating for
8746
           Thumb-2 or not.  */
8747
        bitsize = howto->bitsize;
8748
        if (!thumb2)
8749
          bitsize -= 2;
8750
        reloc_signed_max = (1 << (bitsize - 1)) - 1;
8751
        reloc_signed_min = ~reloc_signed_max;
8752
 
8753
        /* Assumes two's complement.  */
8754
        if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
8755
          overflow = TRUE;
8756
 
8757
        if ((lower_insn & 0x5000) == 0x4000)
8758
          /* For a BLX instruction, make sure that the relocation is rounded up
8759
             to a word boundary.  This follows the semantics of the instruction
8760
             which specifies that bit 1 of the target address will come from bit
8761
             1 of the base address.  */
8762
          relocation = (relocation + 2) & ~ 3;
8763
 
8764
        /* Put RELOCATION back into the insn.  Assumes two's complement.
8765
           We use the Thumb-2 encoding, which is safe even if dealing with
8766
           a Thumb-1 instruction by virtue of our overflow check above.  */
8767
        reloc_sign = (signed_check < 0) ? 1 : 0;
8768
        upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
8769
                     | ((relocation >> 12) & 0x3ff)
8770
                     | (reloc_sign << 10);
8771
        lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
8772
                     | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
8773
                     | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
8774
                     | ((relocation >> 1) & 0x7ff);
8775
 
8776
        /* Put the relocated value back in the object file:  */
8777
        bfd_put_16 (input_bfd, upper_insn, hit_data);
8778
        bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
8779
 
8780
        return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
8781
      }
8782
      break;
8783
 
8784
    case R_ARM_THM_JUMP19:
8785
      /* Thumb32 conditional branch instruction.  */
8786
      {
8787
        bfd_vma relocation;
8788
        bfd_boolean overflow = FALSE;
8789
        bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
8790
        bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
8791
        bfd_signed_vma reloc_signed_max = 0xffffe;
8792
        bfd_signed_vma reloc_signed_min = -0x100000;
8793
        bfd_signed_vma signed_check;
8794
 
8795
        /* Need to refetch the addend, reconstruct the top three bits,
8796
           and squish the two 11 bit pieces together.  */
8797
        if (globals->use_rel)
8798
          {
8799
            bfd_vma S     = (upper_insn & 0x0400) >> 10;
8800
            bfd_vma upper = (upper_insn & 0x003f);
8801
            bfd_vma J1    = (lower_insn & 0x2000) >> 13;
8802
            bfd_vma J2    = (lower_insn & 0x0800) >> 11;
8803
            bfd_vma lower = (lower_insn & 0x07ff);
8804
 
8805
            upper |= J1 << 6;
8806
            upper |= J2 << 7;
8807
            upper |= (!S) << 8;
8808
            upper -= 0x0100; /* Sign extend.  */
8809
 
8810
            addend = (upper << 12) | (lower << 1);
8811
            signed_addend = addend;
8812
          }
8813
 
8814
        /* Handle calls via the PLT.  */
8815
        if (plt_offset != (bfd_vma) -1)
8816
          {
8817
            value = (splt->output_section->vma
8818
                     + splt->output_offset
8819
                     + plt_offset);
8820
            /* Target the Thumb stub before the ARM PLT entry.  */
8821
            value -= PLT_THUMB_STUB_SIZE;
8822
            *unresolved_reloc_p = FALSE;
8823
          }
8824
 
8825
        /* ??? Should handle interworking?  GCC might someday try to
8826
           use this for tail calls.  */
8827
 
8828
        relocation = value + signed_addend;
8829
        relocation -= (input_section->output_section->vma
8830
                       + input_section->output_offset
8831
                       + rel->r_offset);
8832
        signed_check = (bfd_signed_vma) relocation;
8833
 
8834
        if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
8835
          overflow = TRUE;
8836
 
8837
        /* Put RELOCATION back into the insn.  */
8838
        {
8839
          bfd_vma S  = (relocation & 0x00100000) >> 20;
8840
          bfd_vma J2 = (relocation & 0x00080000) >> 19;
8841
          bfd_vma J1 = (relocation & 0x00040000) >> 18;
8842
          bfd_vma hi = (relocation & 0x0003f000) >> 12;
8843
          bfd_vma lo = (relocation & 0x00000ffe) >>  1;
8844
 
8845
          upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
8846
          lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
8847
        }
8848
 
8849
        /* Put the relocated value back in the object file:  */
8850
        bfd_put_16 (input_bfd, upper_insn, hit_data);
8851
        bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
8852
 
8853
        return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
8854
      }
8855
 
8856
    case R_ARM_THM_JUMP11:
8857
    case R_ARM_THM_JUMP8:
8858
    case R_ARM_THM_JUMP6:
8859
      /* Thumb B (branch) instruction).  */
8860
      {
8861
        bfd_signed_vma relocation;
8862
        bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
8863
        bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
8864
        bfd_signed_vma signed_check;
8865
 
8866
        /* CZB cannot jump backward.  */
8867
        if (r_type == R_ARM_THM_JUMP6)
8868
          reloc_signed_min = 0;
8869
 
8870
        if (globals->use_rel)
8871
          {
8872
            /* Need to refetch addend.  */
8873
            addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
8874
            if (addend & ((howto->src_mask + 1) >> 1))
8875
              {
8876
                signed_addend = -1;
8877
                signed_addend &= ~ howto->src_mask;
8878
                signed_addend |= addend;
8879
              }
8880
            else
8881
              signed_addend = addend;
8882
            /* The value in the insn has been right shifted.  We need to
8883
               undo this, so that we can perform the address calculation
8884
               in terms of bytes.  */
8885
            signed_addend <<= howto->rightshift;
8886
          }
8887
        relocation = value + signed_addend;
8888
 
8889
        relocation -= (input_section->output_section->vma
8890
                       + input_section->output_offset
8891
                       + rel->r_offset);
8892
 
8893
        relocation >>= howto->rightshift;
8894
        signed_check = relocation;
8895
 
8896
        if (r_type == R_ARM_THM_JUMP6)
8897
          relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
8898
        else
8899
          relocation &= howto->dst_mask;
8900
        relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
8901
 
8902
        bfd_put_16 (input_bfd, relocation, hit_data);
8903
 
8904
        /* Assumes two's complement.  */
8905
        if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
8906
          return bfd_reloc_overflow;
8907
 
8908
        return bfd_reloc_ok;
8909
      }
8910
 
8911
    case R_ARM_ALU_PCREL7_0:
8912
    case R_ARM_ALU_PCREL15_8:
8913
    case R_ARM_ALU_PCREL23_15:
8914
      {
8915
        bfd_vma insn;
8916
        bfd_vma relocation;
8917
 
8918
        insn = bfd_get_32 (input_bfd, hit_data);
8919
        if (globals->use_rel)
8920
          {
8921
            /* Extract the addend.  */
8922
            addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
8923
            signed_addend = addend;
8924
          }
8925
        relocation = value + signed_addend;
8926
 
8927
        relocation -= (input_section->output_section->vma
8928
                       + input_section->output_offset
8929
                       + rel->r_offset);
8930
        insn = (insn & ~0xfff)
8931
               | ((howto->bitpos << 7) & 0xf00)
8932
               | ((relocation >> howto->bitpos) & 0xff);
8933
        bfd_put_32 (input_bfd, value, hit_data);
8934
      }
8935
      return bfd_reloc_ok;
8936
 
8937
    case R_ARM_GNU_VTINHERIT:
8938
    case R_ARM_GNU_VTENTRY:
8939
      return bfd_reloc_ok;
8940
 
8941
    case R_ARM_GOTOFF32:
8942
      /* Relocation is relative to the start of the
8943
         global offset table.  */
8944
 
8945
      BFD_ASSERT (sgot != NULL);
8946
      if (sgot == NULL)
8947
        return bfd_reloc_notsupported;
8948
 
8949
      /* If we are addressing a Thumb function, we need to adjust the
8950
         address by one, so that attempts to call the function pointer will
8951
         correctly interpret it as Thumb code.  */
8952
      if (branch_type == ST_BRANCH_TO_THUMB)
8953
        value += 1;
8954
 
8955
      /* Note that sgot->output_offset is not involved in this
8956
         calculation.  We always want the start of .got.  If we
8957
         define _GLOBAL_OFFSET_TABLE in a different way, as is
8958
         permitted by the ABI, we might have to change this
8959
         calculation.  */
8960
      value -= sgot->output_section->vma;
8961
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
8962
                                       contents, rel->r_offset, value,
8963
                                       rel->r_addend);
8964
 
8965
    case R_ARM_GOTPC:
8966
      /* Use global offset table as symbol value.  */
8967
      BFD_ASSERT (sgot != NULL);
8968
 
8969
      if (sgot == NULL)
8970
        return bfd_reloc_notsupported;
8971
 
8972
      *unresolved_reloc_p = FALSE;
8973
      value = sgot->output_section->vma;
8974
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
8975
                                       contents, rel->r_offset, value,
8976
                                       rel->r_addend);
8977
 
8978
    case R_ARM_GOT32:
8979
    case R_ARM_GOT_PREL:
8980
      /* Relocation is to the entry for this symbol in the
8981
         global offset table.  */
8982
      if (sgot == NULL)
8983
        return bfd_reloc_notsupported;
8984
 
8985
      if (dynreloc_st_type == STT_GNU_IFUNC
8986
          && plt_offset != (bfd_vma) -1
8987
          && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, h)))
8988
        {
8989
          /* We have a relocation against a locally-binding STT_GNU_IFUNC
8990
             symbol, and the relocation resolves directly to the runtime
8991
             target rather than to the .iplt entry.  This means that any
8992
             .got entry would be the same value as the .igot.plt entry,
8993
             so there's no point creating both.  */
8994
          sgot = globals->root.igotplt;
8995
          value = sgot->output_offset + gotplt_offset;
8996
        }
8997
      else if (h != NULL)
8998
        {
8999
          bfd_vma off;
9000
 
9001
          off = h->got.offset;
9002
          BFD_ASSERT (off != (bfd_vma) -1);
9003
          if ((off & 1) != 0)
9004
            {
9005
              /* We have already processsed one GOT relocation against
9006
                 this symbol.  */
9007
              off &= ~1;
9008
              if (globals->root.dynamic_sections_created
9009
                  && !SYMBOL_REFERENCES_LOCAL (info, h))
9010
                *unresolved_reloc_p = FALSE;
9011
            }
9012
          else
9013
            {
9014
              Elf_Internal_Rela outrel;
9015
 
9016
              if (!SYMBOL_REFERENCES_LOCAL (info, h))
9017
                {
9018
                  /* If the symbol doesn't resolve locally in a static
9019
                     object, we have an undefined reference.  If the
9020
                     symbol doesn't resolve locally in a dynamic object,
9021
                     it should be resolved by the dynamic linker.  */
9022
                  if (globals->root.dynamic_sections_created)
9023
                    {
9024
                      outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
9025
                      *unresolved_reloc_p = FALSE;
9026
                    }
9027
                  else
9028
                    outrel.r_info = 0;
9029
                  outrel.r_addend = 0;
9030
                }
9031
              else
9032
                {
9033
                  if (dynreloc_st_type == STT_GNU_IFUNC)
9034
                    outrel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
9035
                  else if (info->shared)
9036
                    outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
9037
                  else
9038
                    outrel.r_info = 0;
9039
                  outrel.r_addend = dynreloc_value;
9040
                }
9041
 
9042
              /* The GOT entry is initialized to zero by default.
9043
                 See if we should install a different value.  */
9044
              if (outrel.r_addend != 0
9045
                  && (outrel.r_info == 0 || globals->use_rel))
9046
                {
9047
                  bfd_put_32 (output_bfd, outrel.r_addend,
9048
                              sgot->contents + off);
9049
                  outrel.r_addend = 0;
9050
                }
9051
 
9052
              if (outrel.r_info != 0)
9053
                {
9054
                  outrel.r_offset = (sgot->output_section->vma
9055
                                     + sgot->output_offset
9056
                                     + off);
9057
                  elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
9058
                }
9059
              h->got.offset |= 1;
9060
            }
9061
          value = sgot->output_offset + off;
9062
        }
9063
      else
9064
        {
9065
          bfd_vma off;
9066
 
9067
          BFD_ASSERT (local_got_offsets != NULL &&
9068
                      local_got_offsets[r_symndx] != (bfd_vma) -1);
9069
 
9070
          off = local_got_offsets[r_symndx];
9071
 
9072
          /* The offset must always be a multiple of 4.  We use the
9073
             least significant bit to record whether we have already
9074
             generated the necessary reloc.  */
9075
          if ((off & 1) != 0)
9076
            off &= ~1;
9077
          else
9078
            {
9079
              if (globals->use_rel)
9080
                bfd_put_32 (output_bfd, dynreloc_value, sgot->contents + off);
9081
 
9082
              if (info->shared || dynreloc_st_type == STT_GNU_IFUNC)
9083
                {
9084
                  Elf_Internal_Rela outrel;
9085
 
9086
                  outrel.r_addend = addend + dynreloc_value;
9087
                  outrel.r_offset = (sgot->output_section->vma
9088
                                     + sgot->output_offset
9089
                                     + off);
9090
                  if (dynreloc_st_type == STT_GNU_IFUNC)
9091
                    outrel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
9092
                  else
9093
                    outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
9094
                  elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
9095
                }
9096
 
9097
              local_got_offsets[r_symndx] |= 1;
9098
            }
9099
 
9100
          value = sgot->output_offset + off;
9101
        }
9102
      if (r_type != R_ARM_GOT32)
9103
        value += sgot->output_section->vma;
9104
 
9105
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
9106
                                       contents, rel->r_offset, value,
9107
                                       rel->r_addend);
9108
 
9109
    case R_ARM_TLS_LDO32:
9110
      value = value - dtpoff_base (info);
9111
 
9112
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
9113
                                       contents, rel->r_offset, value,
9114
                                       rel->r_addend);
9115
 
9116
    case R_ARM_TLS_LDM32:
9117
      {
9118
        bfd_vma off;
9119
 
9120
        if (sgot == NULL)
9121
          abort ();
9122
 
9123
        off = globals->tls_ldm_got.offset;
9124
 
9125
        if ((off & 1) != 0)
9126
          off &= ~1;
9127
        else
9128
          {
9129
            /* If we don't know the module number, create a relocation
9130
               for it.  */
9131
            if (info->shared)
9132
              {
9133
                Elf_Internal_Rela outrel;
9134
 
9135
                if (srelgot == NULL)
9136
                  abort ();
9137
 
9138
                outrel.r_addend = 0;
9139
                outrel.r_offset = (sgot->output_section->vma
9140
                                   + sgot->output_offset + off);
9141
                outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
9142
 
9143
                if (globals->use_rel)
9144
                  bfd_put_32 (output_bfd, outrel.r_addend,
9145
                              sgot->contents + off);
9146
 
9147
                elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
9148
              }
9149
            else
9150
              bfd_put_32 (output_bfd, 1, sgot->contents + off);
9151
 
9152
            globals->tls_ldm_got.offset |= 1;
9153
          }
9154
 
9155
        value = sgot->output_section->vma + sgot->output_offset + off
9156
          - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
9157
 
9158
        return _bfd_final_link_relocate (howto, input_bfd, input_section,
9159
                                         contents, rel->r_offset, value,
9160
                                         rel->r_addend);
9161
      }
9162
 
9163
    case R_ARM_TLS_CALL:
9164
    case R_ARM_THM_TLS_CALL:
9165
    case R_ARM_TLS_GD32:
9166
    case R_ARM_TLS_IE32:
9167
    case R_ARM_TLS_GOTDESC:
9168
    case R_ARM_TLS_DESCSEQ:
9169
    case R_ARM_THM_TLS_DESCSEQ:
9170
      {
9171
        bfd_vma off, offplt;
9172
        int indx = 0;
9173
        char tls_type;
9174
 
9175
        BFD_ASSERT (sgot != NULL);
9176
 
9177
        if (h != NULL)
9178
          {
9179
            bfd_boolean dyn;
9180
            dyn = globals->root.dynamic_sections_created;
9181
            if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
9182
                && (!info->shared
9183
                    || !SYMBOL_REFERENCES_LOCAL (info, h)))
9184
              {
9185
                *unresolved_reloc_p = FALSE;
9186
                indx = h->dynindx;
9187
              }
9188
            off = h->got.offset;
9189
            offplt = elf32_arm_hash_entry (h)->tlsdesc_got;
9190
            tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
9191
          }
9192
        else
9193
          {
9194
            BFD_ASSERT (local_got_offsets != NULL);
9195
            off = local_got_offsets[r_symndx];
9196
            offplt = local_tlsdesc_gotents[r_symndx];
9197
            tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
9198
          }
9199
 
9200
        /* Linker relaxations happens from one of the
9201
           R_ARM_{GOTDESC,CALL,DESCSEQ} relocations to IE or LE.  */
9202
        if (ELF32_R_TYPE(rel->r_info) != r_type)
9203
          tls_type = GOT_TLS_IE;
9204
 
9205
        BFD_ASSERT (tls_type != GOT_UNKNOWN);
9206
 
9207
        if ((off & 1) != 0)
9208
          off &= ~1;
9209
        else
9210
          {
9211
            bfd_boolean need_relocs = FALSE;
9212
            Elf_Internal_Rela outrel;
9213
            int cur_off = off;
9214
 
9215
            /* The GOT entries have not been initialized yet.  Do it
9216
               now, and emit any relocations.  If both an IE GOT and a
9217
               GD GOT are necessary, we emit the GD first.  */
9218
 
9219
            if ((info->shared || indx != 0)
9220
                && (h == NULL
9221
                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9222
                    || h->root.type != bfd_link_hash_undefweak))
9223
              {
9224
                need_relocs = TRUE;
9225
                BFD_ASSERT (srelgot != NULL);
9226
              }
9227
 
9228
            if (tls_type & GOT_TLS_GDESC)
9229
              {
9230
                bfd_byte *loc;
9231
 
9232
                /* We should have relaxed, unless this is an undefined
9233
                   weak symbol.  */
9234
                BFD_ASSERT ((h && (h->root.type == bfd_link_hash_undefweak))
9235
                            || info->shared);
9236
                BFD_ASSERT (globals->sgotplt_jump_table_size + offplt + 8
9237
                            <= globals->root.sgotplt->size);
9238
 
9239
                outrel.r_addend = 0;
9240
                outrel.r_offset = (globals->root.sgotplt->output_section->vma
9241
                                   + globals->root.sgotplt->output_offset
9242
                                   + offplt
9243
                                   + globals->sgotplt_jump_table_size);
9244
 
9245
                outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DESC);
9246
                sreloc = globals->root.srelplt;
9247
                loc = sreloc->contents;
9248
                loc += globals->next_tls_desc_index++ * RELOC_SIZE (globals);
9249
                BFD_ASSERT (loc + RELOC_SIZE (globals)
9250
                           <= sreloc->contents + sreloc->size);
9251
 
9252
                SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
9253
 
9254
                /* For globals, the first word in the relocation gets
9255
                   the relocation index and the top bit set, or zero,
9256
                   if we're binding now.  For locals, it gets the
9257
                   symbol's offset in the tls section.  */
9258
                bfd_put_32 (output_bfd,
9259
                            !h ? value - elf_hash_table (info)->tls_sec->vma
9260
                            : info->flags & DF_BIND_NOW ? 0
9261
                            : 0x80000000 | ELF32_R_SYM (outrel.r_info),
9262
                            globals->root.sgotplt->contents + offplt +
9263
                            globals->sgotplt_jump_table_size);
9264
 
9265
                /* Second word in the relocation is always zero.  */
9266
                bfd_put_32 (output_bfd, 0,
9267
                            globals->root.sgotplt->contents + offplt +
9268
                            globals->sgotplt_jump_table_size + 4);
9269
              }
9270
            if (tls_type & GOT_TLS_GD)
9271
              {
9272
                if (need_relocs)
9273
                  {
9274
                    outrel.r_addend = 0;
9275
                    outrel.r_offset = (sgot->output_section->vma
9276
                                       + sgot->output_offset
9277
                                       + cur_off);
9278
                    outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
9279
 
9280
                    if (globals->use_rel)
9281
                      bfd_put_32 (output_bfd, outrel.r_addend,
9282
                                  sgot->contents + cur_off);
9283
 
9284
                    elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
9285
 
9286
                    if (indx == 0)
9287
                      bfd_put_32 (output_bfd, value - dtpoff_base (info),
9288
                                  sgot->contents + cur_off + 4);
9289
                    else
9290
                      {
9291
                        outrel.r_addend = 0;
9292
                        outrel.r_info = ELF32_R_INFO (indx,
9293
                                                      R_ARM_TLS_DTPOFF32);
9294
                        outrel.r_offset += 4;
9295
 
9296
                        if (globals->use_rel)
9297
                          bfd_put_32 (output_bfd, outrel.r_addend,
9298
                                      sgot->contents + cur_off + 4);
9299
 
9300
                        elf32_arm_add_dynreloc (output_bfd, info,
9301
                                                srelgot, &outrel);
9302
                      }
9303
                  }
9304
                else
9305
                  {
9306
                    /* If we are not emitting relocations for a
9307
                       general dynamic reference, then we must be in a
9308
                       static link or an executable link with the
9309
                       symbol binding locally.  Mark it as belonging
9310
                       to module 1, the executable.  */
9311
                    bfd_put_32 (output_bfd, 1,
9312
                                sgot->contents + cur_off);
9313
                    bfd_put_32 (output_bfd, value - dtpoff_base (info),
9314
                                sgot->contents + cur_off + 4);
9315
                  }
9316
 
9317
                cur_off += 8;
9318
              }
9319
 
9320
            if (tls_type & GOT_TLS_IE)
9321
              {
9322
                if (need_relocs)
9323
                  {
9324
                    if (indx == 0)
9325
                      outrel.r_addend = value - dtpoff_base (info);
9326
                    else
9327
                      outrel.r_addend = 0;
9328
                    outrel.r_offset = (sgot->output_section->vma
9329
                                       + sgot->output_offset
9330
                                       + cur_off);
9331
                    outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
9332
 
9333
                    if (globals->use_rel)
9334
                      bfd_put_32 (output_bfd, outrel.r_addend,
9335
                                  sgot->contents + cur_off);
9336
 
9337
                    elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
9338
                  }
9339
                else
9340
                  bfd_put_32 (output_bfd, tpoff (info, value),
9341
                              sgot->contents + cur_off);
9342
                cur_off += 4;
9343
              }
9344
 
9345
            if (h != NULL)
9346
              h->got.offset |= 1;
9347
            else
9348
              local_got_offsets[r_symndx] |= 1;
9349
          }
9350
 
9351
        if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
9352
          off += 8;
9353
        else if (tls_type & GOT_TLS_GDESC)
9354
          off = offplt;
9355
 
9356
        if (ELF32_R_TYPE(rel->r_info) == R_ARM_TLS_CALL
9357
            || ELF32_R_TYPE(rel->r_info) == R_ARM_THM_TLS_CALL)
9358
          {
9359
            bfd_signed_vma offset;
9360
            /* TLS stubs are arm mode.  The original symbol is a
9361
               data object, so branch_type is bogus.  */
9362
            branch_type = ST_BRANCH_TO_ARM;
9363
            enum elf32_arm_stub_type stub_type
9364
              = arm_type_of_stub (info, input_section, rel,
9365
                                  st_type, &branch_type,
9366
                                  (struct elf32_arm_link_hash_entry *)h,
9367
                                  globals->tls_trampoline, globals->root.splt,
9368
                                  input_bfd, sym_name);
9369
 
9370
            if (stub_type != arm_stub_none)
9371
              {
9372
                struct elf32_arm_stub_hash_entry *stub_entry
9373
                  = elf32_arm_get_stub_entry
9374
                  (input_section, globals->root.splt, 0, rel,
9375
                   globals, stub_type);
9376
                offset = (stub_entry->stub_offset
9377
                          + stub_entry->stub_sec->output_offset
9378
                          + stub_entry->stub_sec->output_section->vma);
9379
              }
9380
            else
9381
              offset = (globals->root.splt->output_section->vma
9382
                        + globals->root.splt->output_offset
9383
                        + globals->tls_trampoline);
9384
 
9385
            if (ELF32_R_TYPE(rel->r_info) == R_ARM_TLS_CALL)
9386
              {
9387
                unsigned long inst;
9388
 
9389
                offset -= (input_section->output_section->vma +
9390
                           input_section->output_offset + rel->r_offset + 8);
9391
 
9392
                inst = offset >> 2;
9393
                inst &= 0x00ffffff;
9394
                value = inst | (globals->use_blx ? 0xfa000000 : 0xeb000000);
9395
              }
9396
            else
9397
              {
9398
                /* Thumb blx encodes the offset in a complicated
9399
                   fashion.  */
9400
                unsigned upper_insn, lower_insn;
9401
                unsigned neg;
9402
 
9403
                offset -= (input_section->output_section->vma +
9404
                           input_section->output_offset
9405
                           + rel->r_offset + 4);
9406
 
9407
                if (stub_type != arm_stub_none
9408
                    && arm_stub_is_thumb (stub_type))
9409
                  {
9410
                    lower_insn = 0xd000;
9411
                  }
9412
                else
9413
                  {
9414
                    lower_insn = 0xc000;
9415
                    /* Round up the offset to a word boundary */
9416
                    offset = (offset + 2) & ~2;
9417
                  }
9418
 
9419
                neg = offset < 0;
9420
                upper_insn = (0xf000
9421
                              | ((offset >> 12) & 0x3ff)
9422
                              | (neg << 10));
9423
                lower_insn |= (((!((offset >> 23) & 1)) ^ neg) << 13)
9424
                              | (((!((offset >> 22) & 1)) ^ neg) << 11)
9425
                              | ((offset >> 1) & 0x7ff);
9426
                bfd_put_16 (input_bfd, upper_insn, hit_data);
9427
                bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
9428
                return bfd_reloc_ok;
9429
              }
9430
          }
9431
        /* These relocations needs special care, as besides the fact
9432
           they point somewhere in .gotplt, the addend must be
9433
           adjusted accordingly depending on the type of instruction
9434
           we refer to */
9435
        else if ((r_type == R_ARM_TLS_GOTDESC) && (tls_type & GOT_TLS_GDESC))
9436
          {
9437
            unsigned long data, insn;
9438
            unsigned thumb;
9439
 
9440
            data = bfd_get_32 (input_bfd, hit_data);
9441
            thumb = data & 1;
9442
            data &= ~1u;
9443
 
9444
            if (thumb)
9445
              {
9446
                insn = bfd_get_16 (input_bfd, contents + rel->r_offset - data);
9447
                if ((insn & 0xf000) == 0xf000 || (insn & 0xf800) == 0xe800)
9448
                  insn = (insn << 16)
9449
                    | bfd_get_16 (input_bfd,
9450
                                  contents + rel->r_offset - data + 2);
9451
                if ((insn & 0xf800c000) == 0xf000c000)
9452
                  /* bl/blx */
9453
                  value = -6;
9454
                else if ((insn & 0xffffff00) == 0x4400)
9455
                  /* add */
9456
                  value = -5;
9457
                else
9458
                  {
9459
                    (*_bfd_error_handler)
9460
                      (_("%B(%A+0x%lx):unexpected Thumb instruction '0x%x' referenced by TLS_GOTDESC"),
9461
                       input_bfd, input_section,
9462
                       (unsigned long)rel->r_offset, insn);
9463
                    return bfd_reloc_notsupported;
9464
                  }
9465
              }
9466
            else
9467
              {
9468
                insn = bfd_get_32 (input_bfd, contents + rel->r_offset - data);
9469
 
9470
                switch (insn >> 24)
9471
                  {
9472
                  case 0xeb:  /* bl */
9473
                  case 0xfa:  /* blx */
9474
                    value = -4;
9475
                    break;
9476
 
9477
                  case 0xe0:    /* add */
9478
                    value = -8;
9479
                    break;
9480
 
9481
                  default:
9482
                    (*_bfd_error_handler)
9483
                      (_("%B(%A+0x%lx):unexpected ARM instruction '0x%x' referenced by TLS_GOTDESC"),
9484
                       input_bfd, input_section,
9485
                       (unsigned long)rel->r_offset, insn);
9486
                    return bfd_reloc_notsupported;
9487
                  }
9488
              }
9489
 
9490
            value += ((globals->root.sgotplt->output_section->vma
9491
                       + globals->root.sgotplt->output_offset + off)
9492
                      - (input_section->output_section->vma
9493
                         + input_section->output_offset
9494
                         + rel->r_offset)
9495
                      + globals->sgotplt_jump_table_size);
9496
          }
9497
        else
9498
          value = ((globals->root.sgot->output_section->vma
9499
                    + globals->root.sgot->output_offset + off)
9500
                   - (input_section->output_section->vma
9501
                      + input_section->output_offset + rel->r_offset));
9502
 
9503
        return _bfd_final_link_relocate (howto, input_bfd, input_section,
9504
                                         contents, rel->r_offset, value,
9505
                                         rel->r_addend);
9506
      }
9507
 
9508
    case R_ARM_TLS_LE32:
9509 161 khays
      if (info->shared && !info->pie)
9510 14 khays
        {
9511
          (*_bfd_error_handler)
9512
            (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
9513
             input_bfd, input_section,
9514
             (long) rel->r_offset, howto->name);
9515
          return (bfd_reloc_status_type) FALSE;
9516
        }
9517
      else
9518
        value = tpoff (info, value);
9519
 
9520
      return _bfd_final_link_relocate (howto, input_bfd, input_section,
9521
                                       contents, rel->r_offset, value,
9522
                                       rel->r_addend);
9523
 
9524
    case R_ARM_V4BX:
9525
      if (globals->fix_v4bx)
9526
        {
9527
          bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
9528
 
9529
          /* Ensure that we have a BX instruction.  */
9530
          BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
9531
 
9532
          if (globals->fix_v4bx == 2 && (insn & 0xf) != 0xf)
9533
            {
9534
              /* Branch to veneer.  */
9535
              bfd_vma glue_addr;
9536
              glue_addr = elf32_arm_bx_glue (info, insn & 0xf);
9537
              glue_addr -= input_section->output_section->vma
9538
                           + input_section->output_offset
9539
                           + rel->r_offset + 8;
9540
              insn = (insn & 0xf0000000) | 0x0a000000
9541
                     | ((glue_addr >> 2) & 0x00ffffff);
9542
            }
9543
          else
9544
            {
9545
              /* Preserve Rm (lowest four bits) and the condition code
9546
                 (highest four bits). Other bits encode MOV PC,Rm.  */
9547
              insn = (insn & 0xf000000f) | 0x01a0f000;
9548
            }
9549
 
9550
          bfd_put_32 (input_bfd, insn, hit_data);
9551
        }
9552
      return bfd_reloc_ok;
9553
 
9554
    case R_ARM_MOVW_ABS_NC:
9555
    case R_ARM_MOVT_ABS:
9556
    case R_ARM_MOVW_PREL_NC:
9557
    case R_ARM_MOVT_PREL:
9558
    /* Until we properly support segment-base-relative addressing then
9559
       we assume the segment base to be zero, as for the group relocations.
9560
       Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
9561
       and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS.  */
9562
    case R_ARM_MOVW_BREL_NC:
9563
    case R_ARM_MOVW_BREL:
9564
    case R_ARM_MOVT_BREL:
9565
      {
9566
        bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
9567
 
9568
        if (globals->use_rel)
9569
          {
9570
            addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
9571
            signed_addend = (addend ^ 0x8000) - 0x8000;
9572
          }
9573
 
9574
        value += signed_addend;
9575
 
9576
        if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
9577
          value -= (input_section->output_section->vma
9578
                    + input_section->output_offset + rel->r_offset);
9579
 
9580
        if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
9581
          return bfd_reloc_overflow;
9582
 
9583
        if (branch_type == ST_BRANCH_TO_THUMB)
9584
          value |= 1;
9585
 
9586
        if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
9587
            || r_type == R_ARM_MOVT_BREL)
9588
          value >>= 16;
9589
 
9590
        insn &= 0xfff0f000;
9591
        insn |= value & 0xfff;
9592
        insn |= (value & 0xf000) << 4;
9593
        bfd_put_32 (input_bfd, insn, hit_data);
9594
      }
9595
      return bfd_reloc_ok;
9596
 
9597
    case R_ARM_THM_MOVW_ABS_NC:
9598
    case R_ARM_THM_MOVT_ABS:
9599
    case R_ARM_THM_MOVW_PREL_NC:
9600
    case R_ARM_THM_MOVT_PREL:
9601
    /* Until we properly support segment-base-relative addressing then
9602
       we assume the segment base to be zero, as for the above relocations.
9603
       Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
9604
       R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
9605
       as R_ARM_THM_MOVT_ABS.  */
9606
    case R_ARM_THM_MOVW_BREL_NC:
9607
    case R_ARM_THM_MOVW_BREL:
9608
    case R_ARM_THM_MOVT_BREL:
9609
      {
9610
        bfd_vma insn;
9611
 
9612
        insn = bfd_get_16 (input_bfd, hit_data) << 16;
9613
        insn |= bfd_get_16 (input_bfd, hit_data + 2);
9614
 
9615
        if (globals->use_rel)
9616
          {
9617
            addend = ((insn >> 4)  & 0xf000)
9618
                   | ((insn >> 15) & 0x0800)
9619
                   | ((insn >> 4)  & 0x0700)
9620
                   | (insn         & 0x00ff);
9621
            signed_addend = (addend ^ 0x8000) - 0x8000;
9622
          }
9623
 
9624
        value += signed_addend;
9625
 
9626
        if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
9627
          value -= (input_section->output_section->vma
9628
                    + input_section->output_offset + rel->r_offset);
9629
 
9630
        if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
9631
          return bfd_reloc_overflow;
9632
 
9633
        if (branch_type == ST_BRANCH_TO_THUMB)
9634
          value |= 1;
9635
 
9636
        if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
9637
            || r_type == R_ARM_THM_MOVT_BREL)
9638
          value >>= 16;
9639
 
9640
        insn &= 0xfbf08f00;
9641
        insn |= (value & 0xf000) << 4;
9642
        insn |= (value & 0x0800) << 15;
9643
        insn |= (value & 0x0700) << 4;
9644
        insn |= (value & 0x00ff);
9645
 
9646
        bfd_put_16 (input_bfd, insn >> 16, hit_data);
9647
        bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
9648
      }
9649
      return bfd_reloc_ok;
9650
 
9651
    case R_ARM_ALU_PC_G0_NC:
9652
    case R_ARM_ALU_PC_G1_NC:
9653
    case R_ARM_ALU_PC_G0:
9654
    case R_ARM_ALU_PC_G1:
9655
    case R_ARM_ALU_PC_G2:
9656
    case R_ARM_ALU_SB_G0_NC:
9657
    case R_ARM_ALU_SB_G1_NC:
9658
    case R_ARM_ALU_SB_G0:
9659
    case R_ARM_ALU_SB_G1:
9660
    case R_ARM_ALU_SB_G2:
9661
      {
9662
        bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
9663
        bfd_vma pc = input_section->output_section->vma
9664
                     + input_section->output_offset + rel->r_offset;
9665
        /* sb should be the origin of the *segment* containing the symbol.
9666
           It is not clear how to obtain this OS-dependent value, so we
9667
           make an arbitrary choice of zero.  */
9668
        bfd_vma sb = 0;
9669
        bfd_vma residual;
9670
        bfd_vma g_n;
9671
        bfd_signed_vma signed_value;
9672
        int group = 0;
9673
 
9674
        /* Determine which group of bits to select.  */
9675
        switch (r_type)
9676
          {
9677
          case R_ARM_ALU_PC_G0_NC:
9678
          case R_ARM_ALU_PC_G0:
9679
          case R_ARM_ALU_SB_G0_NC:
9680
          case R_ARM_ALU_SB_G0:
9681
            group = 0;
9682
            break;
9683
 
9684
          case R_ARM_ALU_PC_G1_NC:
9685
          case R_ARM_ALU_PC_G1:
9686
          case R_ARM_ALU_SB_G1_NC:
9687
          case R_ARM_ALU_SB_G1:
9688
            group = 1;
9689
            break;
9690
 
9691
          case R_ARM_ALU_PC_G2:
9692
          case R_ARM_ALU_SB_G2:
9693
            group = 2;
9694
            break;
9695
 
9696
          default:
9697
            abort ();
9698
          }
9699
 
9700
        /* If REL, extract the addend from the insn.  If RELA, it will
9701
           have already been fetched for us.  */
9702
        if (globals->use_rel)
9703
          {
9704
            int negative;
9705
            bfd_vma constant = insn & 0xff;
9706
            bfd_vma rotation = (insn & 0xf00) >> 8;
9707
 
9708
            if (rotation == 0)
9709
              signed_addend = constant;
9710
            else
9711
              {
9712
                /* Compensate for the fact that in the instruction, the
9713
                   rotation is stored in multiples of 2 bits.  */
9714
                rotation *= 2;
9715
 
9716
                /* Rotate "constant" right by "rotation" bits.  */
9717
                signed_addend = (constant >> rotation) |
9718
                                (constant << (8 * sizeof (bfd_vma) - rotation));
9719
              }
9720
 
9721
            /* Determine if the instruction is an ADD or a SUB.
9722
               (For REL, this determines the sign of the addend.)  */
9723
            negative = identify_add_or_sub (insn);
9724
            if (negative == 0)
9725
              {
9726
                (*_bfd_error_handler)
9727
                  (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
9728
                  input_bfd, input_section,
9729
                  (long) rel->r_offset, howto->name);
9730
                return bfd_reloc_overflow;
9731
              }
9732
 
9733
            signed_addend *= negative;
9734
          }
9735
 
9736
        /* Compute the value (X) to go in the place.  */
9737
        if (r_type == R_ARM_ALU_PC_G0_NC
9738
            || r_type == R_ARM_ALU_PC_G1_NC
9739
            || r_type == R_ARM_ALU_PC_G0
9740
            || r_type == R_ARM_ALU_PC_G1
9741
            || r_type == R_ARM_ALU_PC_G2)
9742
          /* PC relative.  */
9743
          signed_value = value - pc + signed_addend;
9744
        else
9745
          /* Section base relative.  */
9746
          signed_value = value - sb + signed_addend;
9747
 
9748
        /* If the target symbol is a Thumb function, then set the
9749
           Thumb bit in the address.  */
9750
        if (branch_type == ST_BRANCH_TO_THUMB)
9751
          signed_value |= 1;
9752
 
9753
        /* Calculate the value of the relevant G_n, in encoded
9754
           constant-with-rotation format.  */
9755
        g_n = calculate_group_reloc_mask (abs (signed_value), group,
9756
                                          &residual);
9757
 
9758
        /* Check for overflow if required.  */
9759
        if ((r_type == R_ARM_ALU_PC_G0
9760
             || r_type == R_ARM_ALU_PC_G1
9761
             || r_type == R_ARM_ALU_PC_G2
9762
             || r_type == R_ARM_ALU_SB_G0
9763
             || r_type == R_ARM_ALU_SB_G1
9764
             || r_type == R_ARM_ALU_SB_G2) && residual != 0)
9765
          {
9766
            (*_bfd_error_handler)
9767
              (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
9768
              input_bfd, input_section,
9769
              (long) rel->r_offset, abs (signed_value), howto->name);
9770
            return bfd_reloc_overflow;
9771
          }
9772
 
9773
        /* Mask out the value and the ADD/SUB part of the opcode; take care
9774
           not to destroy the S bit.  */
9775
        insn &= 0xff1ff000;
9776
 
9777
        /* Set the opcode according to whether the value to go in the
9778
           place is negative.  */
9779
        if (signed_value < 0)
9780
          insn |= 1 << 22;
9781
        else
9782
          insn |= 1 << 23;
9783
 
9784
        /* Encode the offset.  */
9785
        insn |= g_n;
9786
 
9787
        bfd_put_32 (input_bfd, insn, hit_data);
9788
      }
9789
      return bfd_reloc_ok;
9790
 
9791
    case R_ARM_LDR_PC_G0:
9792
    case R_ARM_LDR_PC_G1:
9793
    case R_ARM_LDR_PC_G2:
9794
    case R_ARM_LDR_SB_G0:
9795
    case R_ARM_LDR_SB_G1:
9796
    case R_ARM_LDR_SB_G2:
9797
      {
9798
        bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
9799
        bfd_vma pc = input_section->output_section->vma
9800
                     + input_section->output_offset + rel->r_offset;
9801
        bfd_vma sb = 0; /* See note above.  */
9802
        bfd_vma residual;
9803
        bfd_signed_vma signed_value;
9804
        int group = 0;
9805
 
9806
        /* Determine which groups of bits to calculate.  */
9807
        switch (r_type)
9808
          {
9809
          case R_ARM_LDR_PC_G0:
9810
          case R_ARM_LDR_SB_G0:
9811
            group = 0;
9812
            break;
9813
 
9814
          case R_ARM_LDR_PC_G1:
9815
          case R_ARM_LDR_SB_G1:
9816
            group = 1;
9817
            break;
9818
 
9819
          case R_ARM_LDR_PC_G2:
9820
          case R_ARM_LDR_SB_G2:
9821
            group = 2;
9822
            break;
9823
 
9824
          default:
9825
            abort ();
9826
          }
9827
 
9828
        /* If REL, extract the addend from the insn.  If RELA, it will
9829
           have already been fetched for us.  */
9830
        if (globals->use_rel)
9831
          {
9832
            int negative = (insn & (1 << 23)) ? 1 : -1;
9833
            signed_addend = negative * (insn & 0xfff);
9834
          }
9835
 
9836
        /* Compute the value (X) to go in the place.  */
9837
        if (r_type == R_ARM_LDR_PC_G0
9838
            || r_type == R_ARM_LDR_PC_G1
9839
            || r_type == R_ARM_LDR_PC_G2)
9840
          /* PC relative.  */
9841
          signed_value = value - pc + signed_addend;
9842
        else
9843
          /* Section base relative.  */
9844
          signed_value = value - sb + signed_addend;
9845
 
9846
        /* Calculate the value of the relevant G_{n-1} to obtain
9847
           the residual at that stage.  */
9848
        calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
9849
 
9850
        /* Check for overflow.  */
9851
        if (residual >= 0x1000)
9852
          {
9853
            (*_bfd_error_handler)
9854
              (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
9855
              input_bfd, input_section,
9856
              (long) rel->r_offset, abs (signed_value), howto->name);
9857
            return bfd_reloc_overflow;
9858
          }
9859
 
9860
        /* Mask out the value and U bit.  */
9861
        insn &= 0xff7ff000;
9862
 
9863
        /* Set the U bit if the value to go in the place is non-negative.  */
9864
        if (signed_value >= 0)
9865
          insn |= 1 << 23;
9866
 
9867
        /* Encode the offset.  */
9868
        insn |= residual;
9869
 
9870
        bfd_put_32 (input_bfd, insn, hit_data);
9871
      }
9872
      return bfd_reloc_ok;
9873
 
9874
    case R_ARM_LDRS_PC_G0:
9875
    case R_ARM_LDRS_PC_G1:
9876
    case R_ARM_LDRS_PC_G2:
9877
    case R_ARM_LDRS_SB_G0:
9878
    case R_ARM_LDRS_SB_G1:
9879
    case R_ARM_LDRS_SB_G2:
9880
      {
9881
        bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
9882
        bfd_vma pc = input_section->output_section->vma
9883
                     + input_section->output_offset + rel->r_offset;
9884
        bfd_vma sb = 0; /* See note above.  */
9885
        bfd_vma residual;
9886
        bfd_signed_vma signed_value;
9887
        int group = 0;
9888
 
9889
        /* Determine which groups of bits to calculate.  */
9890
        switch (r_type)
9891
          {
9892
          case R_ARM_LDRS_PC_G0:
9893
          case R_ARM_LDRS_SB_G0:
9894
            group = 0;
9895
            break;
9896
 
9897
          case R_ARM_LDRS_PC_G1:
9898
          case R_ARM_LDRS_SB_G1:
9899
            group = 1;
9900
            break;
9901
 
9902
          case R_ARM_LDRS_PC_G2:
9903
          case R_ARM_LDRS_SB_G2:
9904
            group = 2;
9905
            break;
9906
 
9907
          default:
9908
            abort ();
9909
          }
9910
 
9911
        /* If REL, extract the addend from the insn.  If RELA, it will
9912
           have already been fetched for us.  */
9913
        if (globals->use_rel)
9914
          {
9915
            int negative = (insn & (1 << 23)) ? 1 : -1;
9916
            signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
9917
          }
9918
 
9919
        /* Compute the value (X) to go in the place.  */
9920
        if (r_type == R_ARM_LDRS_PC_G0
9921
            || r_type == R_ARM_LDRS_PC_G1
9922
            || r_type == R_ARM_LDRS_PC_G2)
9923
          /* PC relative.  */
9924
          signed_value = value - pc + signed_addend;
9925
        else
9926
          /* Section base relative.  */
9927
          signed_value = value - sb + signed_addend;
9928
 
9929
        /* Calculate the value of the relevant G_{n-1} to obtain
9930
           the residual at that stage.  */
9931
        calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
9932
 
9933
        /* Check for overflow.  */
9934
        if (residual >= 0x100)
9935
          {
9936
            (*_bfd_error_handler)
9937
              (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
9938
              input_bfd, input_section,
9939
              (long) rel->r_offset, abs (signed_value), howto->name);
9940
            return bfd_reloc_overflow;
9941
          }
9942
 
9943
        /* Mask out the value and U bit.  */
9944
        insn &= 0xff7ff0f0;
9945
 
9946
        /* Set the U bit if the value to go in the place is non-negative.  */
9947
        if (signed_value >= 0)
9948
          insn |= 1 << 23;
9949
 
9950
        /* Encode the offset.  */
9951
        insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
9952
 
9953
        bfd_put_32 (input_bfd, insn, hit_data);
9954
      }
9955
      return bfd_reloc_ok;
9956
 
9957
    case R_ARM_LDC_PC_G0:
9958
    case R_ARM_LDC_PC_G1:
9959
    case R_ARM_LDC_PC_G2:
9960
    case R_ARM_LDC_SB_G0:
9961
    case R_ARM_LDC_SB_G1:
9962
    case R_ARM_LDC_SB_G2:
9963
      {
9964
        bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
9965
        bfd_vma pc = input_section->output_section->vma
9966
                     + input_section->output_offset + rel->r_offset;
9967
        bfd_vma sb = 0; /* See note above.  */
9968
        bfd_vma residual;
9969
        bfd_signed_vma signed_value;
9970
        int group = 0;
9971
 
9972
        /* Determine which groups of bits to calculate.  */
9973
        switch (r_type)
9974
          {
9975
          case R_ARM_LDC_PC_G0:
9976
          case R_ARM_LDC_SB_G0:
9977
            group = 0;
9978
            break;
9979
 
9980
          case R_ARM_LDC_PC_G1:
9981
          case R_ARM_LDC_SB_G1:
9982
            group = 1;
9983
            break;
9984
 
9985
          case R_ARM_LDC_PC_G2:
9986
          case R_ARM_LDC_SB_G2:
9987
            group = 2;
9988
            break;
9989
 
9990
          default:
9991
            abort ();
9992
          }
9993
 
9994
        /* If REL, extract the addend from the insn.  If RELA, it will
9995
           have already been fetched for us.  */
9996
        if (globals->use_rel)
9997
          {
9998
            int negative = (insn & (1 << 23)) ? 1 : -1;
9999
            signed_addend = negative * ((insn & 0xff) << 2);
10000
          }
10001
 
10002
        /* Compute the value (X) to go in the place.  */
10003
        if (r_type == R_ARM_LDC_PC_G0
10004
            || r_type == R_ARM_LDC_PC_G1
10005
            || r_type == R_ARM_LDC_PC_G2)
10006
          /* PC relative.  */
10007
          signed_value = value - pc + signed_addend;
10008
        else
10009
          /* Section base relative.  */
10010
          signed_value = value - sb + signed_addend;
10011
 
10012
        /* Calculate the value of the relevant G_{n-1} to obtain
10013
           the residual at that stage.  */
10014
        calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
10015
 
10016
        /* Check for overflow.  (The absolute value to go in the place must be
10017
           divisible by four and, after having been divided by four, must
10018
           fit in eight bits.)  */
10019
        if ((residual & 0x3) != 0 || residual >= 0x400)
10020
          {
10021
            (*_bfd_error_handler)
10022
              (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
10023
              input_bfd, input_section,
10024
              (long) rel->r_offset, abs (signed_value), howto->name);
10025
            return bfd_reloc_overflow;
10026
          }
10027
 
10028
        /* Mask out the value and U bit.  */
10029
        insn &= 0xff7fff00;
10030
 
10031
        /* Set the U bit if the value to go in the place is non-negative.  */
10032
        if (signed_value >= 0)
10033
          insn |= 1 << 23;
10034
 
10035
        /* Encode the offset.  */
10036
        insn |= residual >> 2;
10037
 
10038
        bfd_put_32 (input_bfd, insn, hit_data);
10039
      }
10040
      return bfd_reloc_ok;
10041
 
10042
    default:
10043
      return bfd_reloc_notsupported;
10044
    }
10045
}
10046
 
10047
/* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
10048
static void
10049
arm_add_to_rel (bfd *              abfd,
10050
                bfd_byte *         address,
10051
                reloc_howto_type * howto,
10052
                bfd_signed_vma     increment)
10053
{
10054
  bfd_signed_vma addend;
10055
 
10056
  if (howto->type == R_ARM_THM_CALL
10057
      || howto->type == R_ARM_THM_JUMP24)
10058
    {
10059
      int upper_insn, lower_insn;
10060
      int upper, lower;
10061
 
10062
      upper_insn = bfd_get_16 (abfd, address);
10063
      lower_insn = bfd_get_16 (abfd, address + 2);
10064
      upper = upper_insn & 0x7ff;
10065
      lower = lower_insn & 0x7ff;
10066
 
10067
      addend = (upper << 12) | (lower << 1);
10068
      addend += increment;
10069
      addend >>= 1;
10070
 
10071
      upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
10072
      lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
10073
 
10074
      bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
10075
      bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
10076
    }
10077
  else
10078
    {
10079
      bfd_vma        contents;
10080
 
10081
      contents = bfd_get_32 (abfd, address);
10082
 
10083
      /* Get the (signed) value from the instruction.  */
10084
      addend = contents & howto->src_mask;
10085
      if (addend & ((howto->src_mask + 1) >> 1))
10086
        {
10087
          bfd_signed_vma mask;
10088
 
10089
          mask = -1;
10090
          mask &= ~ howto->src_mask;
10091
          addend |= mask;
10092
        }
10093
 
10094
      /* Add in the increment, (which is a byte value).  */
10095
      switch (howto->type)
10096
        {
10097
        default:
10098
          addend += increment;
10099
          break;
10100
 
10101
        case R_ARM_PC24:
10102
        case R_ARM_PLT32:
10103
        case R_ARM_CALL:
10104
        case R_ARM_JUMP24:
10105
          addend <<= howto->size;
10106
          addend += increment;
10107
 
10108
          /* Should we check for overflow here ?  */
10109
 
10110
          /* Drop any undesired bits.  */
10111
          addend >>= howto->rightshift;
10112
          break;
10113
        }
10114
 
10115
      contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
10116
 
10117
      bfd_put_32 (abfd, contents, address);
10118
    }
10119
}
10120
 
10121
#define IS_ARM_TLS_RELOC(R_TYPE)        \
10122
  ((R_TYPE) == R_ARM_TLS_GD32           \
10123
   || (R_TYPE) == R_ARM_TLS_LDO32       \
10124
   || (R_TYPE) == R_ARM_TLS_LDM32       \
10125
   || (R_TYPE) == R_ARM_TLS_DTPOFF32    \
10126
   || (R_TYPE) == R_ARM_TLS_DTPMOD32    \
10127
   || (R_TYPE) == R_ARM_TLS_TPOFF32     \
10128
   || (R_TYPE) == R_ARM_TLS_LE32        \
10129
   || (R_TYPE) == R_ARM_TLS_IE32        \
10130
   || IS_ARM_TLS_GNU_RELOC (R_TYPE))
10131
 
10132
/* Specific set of relocations for the gnu tls dialect.  */
10133
#define IS_ARM_TLS_GNU_RELOC(R_TYPE)    \
10134
  ((R_TYPE) == R_ARM_TLS_GOTDESC        \
10135
   || (R_TYPE) == R_ARM_TLS_CALL        \
10136
   || (R_TYPE) == R_ARM_THM_TLS_CALL    \
10137
   || (R_TYPE) == R_ARM_TLS_DESCSEQ     \
10138
   || (R_TYPE) == R_ARM_THM_TLS_DESCSEQ)
10139
 
10140
/* Relocate an ARM ELF section.  */
10141
 
10142
static bfd_boolean
10143
elf32_arm_relocate_section (bfd *                  output_bfd,
10144
                            struct bfd_link_info * info,
10145
                            bfd *                  input_bfd,
10146
                            asection *             input_section,
10147
                            bfd_byte *             contents,
10148
                            Elf_Internal_Rela *    relocs,
10149
                            Elf_Internal_Sym *     local_syms,
10150
                            asection **            local_sections)
10151
{
10152
  Elf_Internal_Shdr *symtab_hdr;
10153
  struct elf_link_hash_entry **sym_hashes;
10154
  Elf_Internal_Rela *rel;
10155
  Elf_Internal_Rela *relend;
10156
  const char *name;
10157
  struct elf32_arm_link_hash_table * globals;
10158
 
10159
  globals = elf32_arm_hash_table (info);
10160
  if (globals == NULL)
10161
    return FALSE;
10162
 
10163
  symtab_hdr = & elf_symtab_hdr (input_bfd);
10164
  sym_hashes = elf_sym_hashes (input_bfd);
10165
 
10166
  rel = relocs;
10167
  relend = relocs + input_section->reloc_count;
10168
  for (; rel < relend; rel++)
10169
    {
10170
      int                          r_type;
10171
      reloc_howto_type *           howto;
10172
      unsigned long                r_symndx;
10173
      Elf_Internal_Sym *           sym;
10174
      asection *                   sec;
10175
      struct elf_link_hash_entry * h;
10176
      bfd_vma                      relocation;
10177
      bfd_reloc_status_type        r;
10178
      arelent                      bfd_reloc;
10179
      char                         sym_type;
10180
      bfd_boolean                  unresolved_reloc = FALSE;
10181
      char *error_message = NULL;
10182
 
10183
      r_symndx = ELF32_R_SYM (rel->r_info);
10184
      r_type   = ELF32_R_TYPE (rel->r_info);
10185
      r_type   = arm_real_reloc_type (globals, r_type);
10186
 
10187
      if (   r_type == R_ARM_GNU_VTENTRY
10188
          || r_type == R_ARM_GNU_VTINHERIT)
10189
        continue;
10190
 
10191
      bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
10192
      howto = bfd_reloc.howto;
10193
 
10194
      h = NULL;
10195
      sym = NULL;
10196
      sec = NULL;
10197
 
10198
      if (r_symndx < symtab_hdr->sh_info)
10199
        {
10200
          sym = local_syms + r_symndx;
10201
          sym_type = ELF32_ST_TYPE (sym->st_info);
10202
          sec = local_sections[r_symndx];
10203
 
10204
          /* An object file might have a reference to a local
10205
             undefined symbol.  This is a daft object file, but we
10206
             should at least do something about it.  V4BX & NONE
10207
             relocations do not use the symbol and are explicitly
10208
             allowed to use the undefined symbol, so allow those.
10209
             Likewise for relocations against STN_UNDEF.  */
10210
          if (r_type != R_ARM_V4BX
10211
              && r_type != R_ARM_NONE
10212
              && r_symndx != STN_UNDEF
10213
              && bfd_is_und_section (sec)
10214
              && ELF_ST_BIND (sym->st_info) != STB_WEAK)
10215
            {
10216
              if (!info->callbacks->undefined_symbol
10217
                  (info, bfd_elf_string_from_elf_section
10218
                   (input_bfd, symtab_hdr->sh_link, sym->st_name),
10219
                   input_bfd, input_section,
10220
                   rel->r_offset, TRUE))
10221
                return FALSE;
10222
            }
10223
 
10224
          if (globals->use_rel)
10225
            {
10226
              relocation = (sec->output_section->vma
10227
                            + sec->output_offset
10228
                            + sym->st_value);
10229
              if (!info->relocatable
10230
                  && (sec->flags & SEC_MERGE)
10231
                  && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10232
                {
10233
                  asection *msec;
10234
                  bfd_vma addend, value;
10235
 
10236
                  switch (r_type)
10237
                    {
10238
                    case R_ARM_MOVW_ABS_NC:
10239
                    case R_ARM_MOVT_ABS:
10240
                      value = bfd_get_32 (input_bfd, contents + rel->r_offset);
10241
                      addend = ((value & 0xf0000) >> 4) | (value & 0xfff);
10242
                      addend = (addend ^ 0x8000) - 0x8000;
10243
                      break;
10244
 
10245
                    case R_ARM_THM_MOVW_ABS_NC:
10246
                    case R_ARM_THM_MOVT_ABS:
10247
                      value = bfd_get_16 (input_bfd, contents + rel->r_offset)
10248
                              << 16;
10249
                      value |= bfd_get_16 (input_bfd,
10250
                                           contents + rel->r_offset + 2);
10251
                      addend = ((value & 0xf7000) >> 4) | (value & 0xff)
10252
                               | ((value & 0x04000000) >> 15);
10253
                      addend = (addend ^ 0x8000) - 0x8000;
10254
                      break;
10255
 
10256
                    default:
10257
                      if (howto->rightshift
10258
                          || (howto->src_mask & (howto->src_mask + 1)))
10259
                        {
10260
                          (*_bfd_error_handler)
10261
                            (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
10262
                             input_bfd, input_section,
10263
                             (long) rel->r_offset, howto->name);
10264
                          return FALSE;
10265
                        }
10266
 
10267
                      value = bfd_get_32 (input_bfd, contents + rel->r_offset);
10268
 
10269
                      /* Get the (signed) value from the instruction.  */
10270
                      addend = value & howto->src_mask;
10271
                      if (addend & ((howto->src_mask + 1) >> 1))
10272
                        {
10273
                          bfd_signed_vma mask;
10274
 
10275
                          mask = -1;
10276
                          mask &= ~ howto->src_mask;
10277
                          addend |= mask;
10278
                        }
10279
                      break;
10280
                    }
10281
 
10282
                  msec = sec;
10283
                  addend =
10284
                    _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
10285
                    - relocation;
10286
                  addend += msec->output_section->vma + msec->output_offset;
10287
 
10288
                  /* Cases here must match those in the preceding
10289
                     switch statement.  */
10290
                  switch (r_type)
10291
                    {
10292
                    case R_ARM_MOVW_ABS_NC:
10293
                    case R_ARM_MOVT_ABS:
10294
                      value = (value & 0xfff0f000) | ((addend & 0xf000) << 4)
10295
                              | (addend & 0xfff);
10296
                      bfd_put_32 (input_bfd, value, contents + rel->r_offset);
10297
                      break;
10298
 
10299
                    case R_ARM_THM_MOVW_ABS_NC:
10300
                    case R_ARM_THM_MOVT_ABS:
10301
                      value = (value & 0xfbf08f00) | ((addend & 0xf700) << 4)
10302
                              | (addend & 0xff) | ((addend & 0x0800) << 15);
10303
                      bfd_put_16 (input_bfd, value >> 16,
10304
                                  contents + rel->r_offset);
10305
                      bfd_put_16 (input_bfd, value,
10306
                                  contents + rel->r_offset + 2);
10307
                      break;
10308
 
10309
                    default:
10310
                      value = (value & ~ howto->dst_mask)
10311
                              | (addend & howto->dst_mask);
10312
                      bfd_put_32 (input_bfd, value, contents + rel->r_offset);
10313
                      break;
10314
                    }
10315
                }
10316
            }
10317
          else
10318
            relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10319
        }
10320
      else
10321
        {
10322
          bfd_boolean warned;
10323
 
10324
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
10325
                                   r_symndx, symtab_hdr, sym_hashes,
10326
                                   h, sec, relocation,
10327
                                   unresolved_reloc, warned);
10328
 
10329
          sym_type = h->type;
10330
        }
10331
 
10332
      if (sec != NULL && elf_discarded_section (sec))
10333
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
10334
                                         rel, relend, howto, contents);
10335
 
10336
      if (info->relocatable)
10337
        {
10338
          /* This is a relocatable link.  We don't have to change
10339
             anything, unless the reloc is against a section symbol,
10340
             in which case we have to adjust according to where the
10341
             section symbol winds up in the output section.  */
10342
          if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10343
            {
10344
              if (globals->use_rel)
10345
                arm_add_to_rel (input_bfd, contents + rel->r_offset,
10346
                                howto, (bfd_signed_vma) sec->output_offset);
10347
              else
10348
                rel->r_addend += sec->output_offset;
10349
            }
10350
          continue;
10351
        }
10352
 
10353
      if (h != NULL)
10354
        name = h->root.root.string;
10355
      else
10356
        {
10357
          name = (bfd_elf_string_from_elf_section
10358
                  (input_bfd, symtab_hdr->sh_link, sym->st_name));
10359
          if (name == NULL || *name == '\0')
10360
            name = bfd_section_name (input_bfd, sec);
10361
        }
10362
 
10363
      if (r_symndx != STN_UNDEF
10364
          && r_type != R_ARM_NONE
10365
          && (h == NULL
10366
              || h->root.type == bfd_link_hash_defined
10367
              || h->root.type == bfd_link_hash_defweak)
10368
          && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
10369
        {
10370
          (*_bfd_error_handler)
10371
            ((sym_type == STT_TLS
10372
              ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
10373
              : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
10374
             input_bfd,
10375
             input_section,
10376
             (long) rel->r_offset,
10377
             howto->name,
10378
             name);
10379
        }
10380
 
10381
      /* We call elf32_arm_final_link_relocate unless we're completely
10382
         done, i.e., the relaxation produced the final output we want,
10383
         and we won't let anybody mess with it. Also, we have to do
10384
         addend adjustments in case of a R_ARM_TLS_GOTDESC relocation
10385
         both in relaxed and non-relaxed cases */
10386
     if ((elf32_arm_tls_transition (info, r_type, h) != (unsigned)r_type)
10387
         || (IS_ARM_TLS_GNU_RELOC (r_type)
10388
             && !((h ? elf32_arm_hash_entry (h)->tls_type :
10389
                   elf32_arm_local_got_tls_type (input_bfd)[r_symndx])
10390
                  & GOT_TLS_GDESC)))
10391
       {
10392
         r = elf32_arm_tls_relax (globals, input_bfd, input_section,
10393
                                  contents, rel, h == NULL);
10394
         /* This may have been marked unresolved because it came from
10395
            a shared library.  But we've just dealt with that.  */
10396
         unresolved_reloc = 0;
10397
       }
10398
     else
10399
       r = bfd_reloc_continue;
10400
 
10401
     if (r == bfd_reloc_continue)
10402
       r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
10403
                                          input_section, contents, rel,
10404
                                          relocation, info, sec, name, sym_type,
10405
                                          (h ? h->target_internal
10406
                                           : ARM_SYM_BRANCH_TYPE (sym)), h,
10407
                                          &unresolved_reloc, &error_message);
10408
 
10409
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
10410
         because such sections are not SEC_ALLOC and thus ld.so will
10411
         not process them.  */
10412
      if (unresolved_reloc
10413
          && !((input_section->flags & SEC_DEBUGGING) != 0
10414 163 khays
               && h->def_dynamic)
10415
          && _bfd_elf_section_offset (output_bfd, info, input_section,
10416
                                      rel->r_offset) != (bfd_vma) -1)
10417 14 khays
        {
10418
          (*_bfd_error_handler)
10419
            (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
10420
             input_bfd,
10421
             input_section,
10422
             (long) rel->r_offset,
10423
             howto->name,
10424
             h->root.root.string);
10425
          return FALSE;
10426
        }
10427
 
10428
      if (r != bfd_reloc_ok)
10429
        {
10430
          switch (r)
10431
            {
10432
            case bfd_reloc_overflow:
10433
              /* If the overflowing reloc was to an undefined symbol,
10434
                 we have already printed one error message and there
10435
                 is no point complaining again.  */
10436
              if ((! h ||
10437
                   h->root.type != bfd_link_hash_undefined)
10438
                  && (!((*info->callbacks->reloc_overflow)
10439
                        (info, (h ? &h->root : NULL), name, howto->name,
10440
                         (bfd_vma) 0, input_bfd, input_section,
10441
                         rel->r_offset))))
10442
                  return FALSE;
10443
              break;
10444
 
10445
            case bfd_reloc_undefined:
10446
              if (!((*info->callbacks->undefined_symbol)
10447
                    (info, name, input_bfd, input_section,
10448
                     rel->r_offset, TRUE)))
10449
                return FALSE;
10450
              break;
10451
 
10452
            case bfd_reloc_outofrange:
10453
              error_message = _("out of range");
10454
              goto common_error;
10455
 
10456
            case bfd_reloc_notsupported:
10457
              error_message = _("unsupported relocation");
10458
              goto common_error;
10459
 
10460
            case bfd_reloc_dangerous:
10461
              /* error_message should already be set.  */
10462
              goto common_error;
10463
 
10464
            default:
10465
              error_message = _("unknown error");
10466
              /* Fall through.  */
10467
 
10468
            common_error:
10469
              BFD_ASSERT (error_message != NULL);
10470
              if (!((*info->callbacks->reloc_dangerous)
10471
                    (info, error_message, input_bfd, input_section,
10472
                     rel->r_offset)))
10473
                return FALSE;
10474
              break;
10475
            }
10476
        }
10477
    }
10478
 
10479
  return TRUE;
10480
}
10481
 
10482
/* Add a new unwind edit to the list described by HEAD, TAIL.  If TINDEX is zero,
10483
   adds the edit to the start of the list.  (The list must be built in order of
10484
   ascending TINDEX: the function's callers are primarily responsible for
10485
   maintaining that condition).  */
10486
 
10487
static void
10488
add_unwind_table_edit (arm_unwind_table_edit **head,
10489
                       arm_unwind_table_edit **tail,
10490
                       arm_unwind_edit_type type,
10491
                       asection *linked_section,
10492
                       unsigned int tindex)
10493
{
10494
  arm_unwind_table_edit *new_edit = (arm_unwind_table_edit *)
10495
      xmalloc (sizeof (arm_unwind_table_edit));
10496
 
10497
  new_edit->type = type;
10498
  new_edit->linked_section = linked_section;
10499
  new_edit->index = tindex;
10500
 
10501
  if (tindex > 0)
10502
    {
10503
      new_edit->next = NULL;
10504
 
10505
      if (*tail)
10506
        (*tail)->next = new_edit;
10507
 
10508
      (*tail) = new_edit;
10509
 
10510
      if (!*head)
10511
        (*head) = new_edit;
10512
    }
10513
  else
10514
    {
10515
      new_edit->next = *head;
10516
 
10517
      if (!*tail)
10518
        *tail = new_edit;
10519
 
10520
      *head = new_edit;
10521
    }
10522
}
10523
 
10524
static _arm_elf_section_data *get_arm_elf_section_data (asection *);
10525
 
10526
/* Increase the size of EXIDX_SEC by ADJUST bytes.  ADJUST mau be negative.  */
10527
static void
10528
adjust_exidx_size(asection *exidx_sec, int adjust)
10529
{
10530
  asection *out_sec;
10531
 
10532
  if (!exidx_sec->rawsize)
10533
    exidx_sec->rawsize = exidx_sec->size;
10534
 
10535
  bfd_set_section_size (exidx_sec->owner, exidx_sec, exidx_sec->size + adjust);
10536
  out_sec = exidx_sec->output_section;
10537
  /* Adjust size of output section.  */
10538
  bfd_set_section_size (out_sec->owner, out_sec, out_sec->size +adjust);
10539
}
10540
 
10541
/* Insert an EXIDX_CANTUNWIND marker at the end of a section.  */
10542
static void
10543
insert_cantunwind_after(asection *text_sec, asection *exidx_sec)
10544
{
10545
  struct _arm_elf_section_data *exidx_arm_data;
10546
 
10547
  exidx_arm_data = get_arm_elf_section_data (exidx_sec);
10548
  add_unwind_table_edit (
10549
    &exidx_arm_data->u.exidx.unwind_edit_list,
10550
    &exidx_arm_data->u.exidx.unwind_edit_tail,
10551
    INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX);
10552
 
10553
  adjust_exidx_size(exidx_sec, 8);
10554
}
10555
 
10556
/* Scan .ARM.exidx tables, and create a list describing edits which should be
10557
   made to those tables, such that:
10558
 
10559
     1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries.
10560
     2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind
10561
        codes which have been inlined into the index).
10562
 
10563
   If MERGE_EXIDX_ENTRIES is false, duplicate entries are not merged.
10564
 
10565
   The edits are applied when the tables are written
10566
   (in elf32_arm_write_section).
10567
*/
10568
 
10569
bfd_boolean
10570
elf32_arm_fix_exidx_coverage (asection **text_section_order,
10571
                              unsigned int num_text_sections,
10572
                              struct bfd_link_info *info,
10573
                              bfd_boolean merge_exidx_entries)
10574
{
10575
  bfd *inp;
10576
  unsigned int last_second_word = 0, i;
10577
  asection *last_exidx_sec = NULL;
10578
  asection *last_text_sec = NULL;
10579
  int last_unwind_type = -1;
10580
 
10581
  /* Walk over all EXIDX sections, and create backlinks from the corrsponding
10582
     text sections.  */
10583
  for (inp = info->input_bfds; inp != NULL; inp = inp->link_next)
10584
    {
10585
      asection *sec;
10586
 
10587
      for (sec = inp->sections; sec != NULL; sec = sec->next)
10588
        {
10589
          struct bfd_elf_section_data *elf_sec = elf_section_data (sec);
10590
          Elf_Internal_Shdr *hdr = &elf_sec->this_hdr;
10591
 
10592
          if (!hdr || hdr->sh_type != SHT_ARM_EXIDX)
10593
            continue;
10594
 
10595
          if (elf_sec->linked_to)
10596
            {
10597
              Elf_Internal_Shdr *linked_hdr
10598
                = &elf_section_data (elf_sec->linked_to)->this_hdr;
10599
              struct _arm_elf_section_data *linked_sec_arm_data
10600
                = get_arm_elf_section_data (linked_hdr->bfd_section);
10601
 
10602
              if (linked_sec_arm_data == NULL)
10603
                continue;
10604
 
10605
              /* Link this .ARM.exidx section back from the text section it
10606
                 describes.  */
10607
              linked_sec_arm_data->u.text.arm_exidx_sec = sec;
10608
            }
10609
        }
10610
    }
10611
 
10612
  /* Walk all text sections in order of increasing VMA.  Eilminate duplicate
10613
     index table entries (EXIDX_CANTUNWIND and inlined unwind opcodes),
10614
     and add EXIDX_CANTUNWIND entries for sections with no unwind table data.  */
10615
 
10616
  for (i = 0; i < num_text_sections; i++)
10617
    {
10618
      asection *sec = text_section_order[i];
10619
      asection *exidx_sec;
10620
      struct _arm_elf_section_data *arm_data = get_arm_elf_section_data (sec);
10621
      struct _arm_elf_section_data *exidx_arm_data;
10622
      bfd_byte *contents = NULL;
10623
      int deleted_exidx_bytes = 0;
10624
      bfd_vma j;
10625
      arm_unwind_table_edit *unwind_edit_head = NULL;
10626
      arm_unwind_table_edit *unwind_edit_tail = NULL;
10627
      Elf_Internal_Shdr *hdr;
10628
      bfd *ibfd;
10629
 
10630
      if (arm_data == NULL)
10631
        continue;
10632
 
10633
      exidx_sec = arm_data->u.text.arm_exidx_sec;
10634
      if (exidx_sec == NULL)
10635
        {
10636
          /* Section has no unwind data.  */
10637
          if (last_unwind_type == 0 || !last_exidx_sec)
10638
            continue;
10639
 
10640
          /* Ignore zero sized sections.  */
10641
          if (sec->size == 0)
10642
            continue;
10643
 
10644
          insert_cantunwind_after(last_text_sec, last_exidx_sec);
10645
          last_unwind_type = 0;
10646
          continue;
10647
        }
10648
 
10649
      /* Skip /DISCARD/ sections.  */
10650
      if (bfd_is_abs_section (exidx_sec->output_section))
10651
        continue;
10652
 
10653
      hdr = &elf_section_data (exidx_sec)->this_hdr;
10654
      if (hdr->sh_type != SHT_ARM_EXIDX)
10655
        continue;
10656
 
10657
      exidx_arm_data = get_arm_elf_section_data (exidx_sec);
10658
      if (exidx_arm_data == NULL)
10659
        continue;
10660
 
10661
      ibfd = exidx_sec->owner;
10662
 
10663
      if (hdr->contents != NULL)
10664
        contents = hdr->contents;
10665
      else if (! bfd_malloc_and_get_section (ibfd, exidx_sec, &contents))
10666
        /* An error?  */
10667
        continue;
10668
 
10669
      for (j = 0; j < hdr->sh_size; j += 8)
10670
        {
10671
          unsigned int second_word = bfd_get_32 (ibfd, contents + j + 4);
10672
          int unwind_type;
10673
          int elide = 0;
10674
 
10675
          /* An EXIDX_CANTUNWIND entry.  */
10676
          if (second_word == 1)
10677
            {
10678
              if (last_unwind_type == 0)
10679
                elide = 1;
10680
              unwind_type = 0;
10681
            }
10682
          /* Inlined unwinding data.  Merge if equal to previous.  */
10683
          else if ((second_word & 0x80000000) != 0)
10684
            {
10685
              if (merge_exidx_entries
10686
                   && last_second_word == second_word && last_unwind_type == 1)
10687
                elide = 1;
10688
              unwind_type = 1;
10689
              last_second_word = second_word;
10690
            }
10691
          /* Normal table entry.  In theory we could merge these too,
10692
             but duplicate entries are likely to be much less common.  */
10693
          else
10694
            unwind_type = 2;
10695
 
10696
          if (elide)
10697
            {
10698
              add_unwind_table_edit (&unwind_edit_head, &unwind_edit_tail,
10699
                                     DELETE_EXIDX_ENTRY, NULL, j / 8);
10700
 
10701
              deleted_exidx_bytes += 8;
10702
            }
10703
 
10704
          last_unwind_type = unwind_type;
10705
        }
10706
 
10707
      /* Free contents if we allocated it ourselves.  */
10708
      if (contents != hdr->contents)
10709
        free (contents);
10710
 
10711
      /* Record edits to be applied later (in elf32_arm_write_section).  */
10712
      exidx_arm_data->u.exidx.unwind_edit_list = unwind_edit_head;
10713
      exidx_arm_data->u.exidx.unwind_edit_tail = unwind_edit_tail;
10714
 
10715
      if (deleted_exidx_bytes > 0)
10716
        adjust_exidx_size(exidx_sec, -deleted_exidx_bytes);
10717
 
10718
      last_exidx_sec = exidx_sec;
10719
      last_text_sec = sec;
10720
    }
10721
 
10722
  /* Add terminating CANTUNWIND entry.  */
10723
  if (last_exidx_sec && last_unwind_type != 0)
10724
    insert_cantunwind_after(last_text_sec, last_exidx_sec);
10725
 
10726
  return TRUE;
10727
}
10728
 
10729
static bfd_boolean
10730
elf32_arm_output_glue_section (struct bfd_link_info *info, bfd *obfd,
10731
                               bfd *ibfd, const char *name)
10732
{
10733
  asection *sec, *osec;
10734
 
10735
  sec = bfd_get_section_by_name (ibfd, name);
10736
  if (sec == NULL || (sec->flags & SEC_EXCLUDE) != 0)
10737
    return TRUE;
10738
 
10739
  osec = sec->output_section;
10740
  if (elf32_arm_write_section (obfd, info, sec, sec->contents))
10741
    return TRUE;
10742
 
10743
  if (! bfd_set_section_contents (obfd, osec, sec->contents,
10744
                                  sec->output_offset, sec->size))
10745
    return FALSE;
10746
 
10747
  return TRUE;
10748
}
10749
 
10750
static bfd_boolean
10751
elf32_arm_final_link (bfd *abfd, struct bfd_link_info *info)
10752
{
10753
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
10754
  asection *sec, *osec;
10755
 
10756
  if (globals == NULL)
10757
    return FALSE;
10758
 
10759
  /* Invoke the regular ELF backend linker to do all the work.  */
10760
  if (!bfd_elf_final_link (abfd, info))
10761
    return FALSE;
10762
 
10763
  /* Process stub sections (eg BE8 encoding, ...).  */
10764
  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
10765
  int i;
10766
  for (i=0; i<htab->top_id; i++)
10767
    {
10768
      sec = htab->stub_group[i].stub_sec;
10769
      /* Only process it once, in its link_sec slot.  */
10770
      if (sec && i == htab->stub_group[i].link_sec->id)
10771
        {
10772
          osec = sec->output_section;
10773
          elf32_arm_write_section (abfd, info, sec, sec->contents);
10774
          if (! bfd_set_section_contents (abfd, osec, sec->contents,
10775
                                          sec->output_offset, sec->size))
10776
            return FALSE;
10777
        }
10778
    }
10779
 
10780
  /* Write out any glue sections now that we have created all the
10781
     stubs.  */
10782
  if (globals->bfd_of_glue_owner != NULL)
10783
    {
10784
      if (! elf32_arm_output_glue_section (info, abfd,
10785
                                           globals->bfd_of_glue_owner,
10786
                                           ARM2THUMB_GLUE_SECTION_NAME))
10787
        return FALSE;
10788
 
10789
      if (! elf32_arm_output_glue_section (info, abfd,
10790
                                           globals->bfd_of_glue_owner,
10791
                                           THUMB2ARM_GLUE_SECTION_NAME))
10792
        return FALSE;
10793
 
10794
      if (! elf32_arm_output_glue_section (info, abfd,
10795
                                           globals->bfd_of_glue_owner,
10796
                                           VFP11_ERRATUM_VENEER_SECTION_NAME))
10797
        return FALSE;
10798
 
10799
      if (! elf32_arm_output_glue_section (info, abfd,
10800
                                           globals->bfd_of_glue_owner,
10801
                                           ARM_BX_GLUE_SECTION_NAME))
10802
        return FALSE;
10803
    }
10804
 
10805
  return TRUE;
10806
}
10807
 
10808
/* Set the right machine number.  */
10809
 
10810
static bfd_boolean
10811
elf32_arm_object_p (bfd *abfd)
10812
{
10813
  unsigned int mach;
10814
 
10815
  mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
10816
 
10817
  if (mach != bfd_mach_arm_unknown)
10818
    bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
10819
 
10820
  else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
10821
    bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
10822
 
10823
  else
10824
    bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
10825
 
10826
  return TRUE;
10827
}
10828
 
10829
/* Function to keep ARM specific flags in the ELF header.  */
10830
 
10831
static bfd_boolean
10832
elf32_arm_set_private_flags (bfd *abfd, flagword flags)
10833
{
10834
  if (elf_flags_init (abfd)
10835
      && elf_elfheader (abfd)->e_flags != flags)
10836
    {
10837
      if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
10838
        {
10839
          if (flags & EF_ARM_INTERWORK)
10840
            (*_bfd_error_handler)
10841
              (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
10842
               abfd);
10843
          else
10844
            _bfd_error_handler
10845
              (_("Warning: Clearing the interworking flag of %B due to outside request"),
10846
               abfd);
10847
        }
10848
    }
10849
  else
10850
    {
10851
      elf_elfheader (abfd)->e_flags = flags;
10852
      elf_flags_init (abfd) = TRUE;
10853
    }
10854
 
10855
  return TRUE;
10856
}
10857
 
10858
/* Copy backend specific data from one object module to another.  */
10859
 
10860
static bfd_boolean
10861
elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
10862
{
10863
  flagword in_flags;
10864
  flagword out_flags;
10865
 
10866
  if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
10867
    return TRUE;
10868
 
10869
  in_flags  = elf_elfheader (ibfd)->e_flags;
10870
  out_flags = elf_elfheader (obfd)->e_flags;
10871
 
10872
  if (elf_flags_init (obfd)
10873
      && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
10874
      && in_flags != out_flags)
10875
    {
10876
      /* Cannot mix APCS26 and APCS32 code.  */
10877
      if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
10878
        return FALSE;
10879
 
10880
      /* Cannot mix float APCS and non-float APCS code.  */
10881
      if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
10882
        return FALSE;
10883
 
10884
      /* If the src and dest have different interworking flags
10885
         then turn off the interworking bit.  */
10886
      if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
10887
        {
10888
          if (out_flags & EF_ARM_INTERWORK)
10889
            _bfd_error_handler
10890
              (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
10891
               obfd, ibfd);
10892
 
10893
          in_flags &= ~EF_ARM_INTERWORK;
10894
        }
10895
 
10896
      /* Likewise for PIC, though don't warn for this case.  */
10897
      if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
10898
        in_flags &= ~EF_ARM_PIC;
10899
    }
10900
 
10901
  elf_elfheader (obfd)->e_flags = in_flags;
10902
  elf_flags_init (obfd) = TRUE;
10903
 
10904
  /* Also copy the EI_OSABI field.  */
10905
  elf_elfheader (obfd)->e_ident[EI_OSABI] =
10906
    elf_elfheader (ibfd)->e_ident[EI_OSABI];
10907
 
10908
  /* Copy object attributes.  */
10909
  _bfd_elf_copy_obj_attributes (ibfd, obfd);
10910
 
10911
  return TRUE;
10912
}
10913
 
10914
/* Values for Tag_ABI_PCS_R9_use.  */
10915
enum
10916
{
10917
  AEABI_R9_V6,
10918
  AEABI_R9_SB,
10919
  AEABI_R9_TLS,
10920
  AEABI_R9_unused
10921
};
10922
 
10923
/* Values for Tag_ABI_PCS_RW_data.  */
10924
enum
10925
{
10926
  AEABI_PCS_RW_data_absolute,
10927
  AEABI_PCS_RW_data_PCrel,
10928
  AEABI_PCS_RW_data_SBrel,
10929
  AEABI_PCS_RW_data_unused
10930
};
10931
 
10932
/* Values for Tag_ABI_enum_size.  */
10933
enum
10934
{
10935
  AEABI_enum_unused,
10936
  AEABI_enum_short,
10937
  AEABI_enum_wide,
10938
  AEABI_enum_forced_wide
10939
};
10940
 
10941
/* Determine whether an object attribute tag takes an integer, a
10942
   string or both.  */
10943
 
10944
static int
10945
elf32_arm_obj_attrs_arg_type (int tag)
10946
{
10947
  if (tag == Tag_compatibility)
10948
    return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
10949
  else if (tag == Tag_nodefaults)
10950
    return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_NO_DEFAULT;
10951
  else if (tag == Tag_CPU_raw_name || tag == Tag_CPU_name)
10952
    return ATTR_TYPE_FLAG_STR_VAL;
10953
  else if (tag < 32)
10954
    return ATTR_TYPE_FLAG_INT_VAL;
10955
  else
10956
    return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
10957
}
10958
 
10959
/* The ABI defines that Tag_conformance should be emitted first, and that
10960
   Tag_nodefaults should be second (if either is defined).  This sets those
10961
   two positions, and bumps up the position of all the remaining tags to
10962
   compensate.  */
10963
static int
10964
elf32_arm_obj_attrs_order (int num)
10965
{
10966
  if (num == LEAST_KNOWN_OBJ_ATTRIBUTE)
10967
    return Tag_conformance;
10968
  if (num == LEAST_KNOWN_OBJ_ATTRIBUTE + 1)
10969
    return Tag_nodefaults;
10970
  if ((num - 2) < Tag_nodefaults)
10971
    return num - 2;
10972
  if ((num - 1) < Tag_conformance)
10973
    return num - 1;
10974
  return num;
10975
}
10976
 
10977
/* Attribute numbers >=64 (mod 128) can be safely ignored.  */
10978
static bfd_boolean
10979
elf32_arm_obj_attrs_handle_unknown (bfd *abfd, int tag)
10980
{
10981
  if ((tag & 127) < 64)
10982
    {
10983
      _bfd_error_handler
10984
        (_("%B: Unknown mandatory EABI object attribute %d"),
10985
         abfd, tag);
10986
      bfd_set_error (bfd_error_bad_value);
10987
      return FALSE;
10988
    }
10989
  else
10990
    {
10991
      _bfd_error_handler
10992
        (_("Warning: %B: Unknown EABI object attribute %d"),
10993
         abfd, tag);
10994
      return TRUE;
10995
    }
10996
}
10997
 
10998
/* Read the architecture from the Tag_also_compatible_with attribute, if any.
10999
   Returns -1 if no architecture could be read.  */
11000
 
11001
static int
11002
get_secondary_compatible_arch (bfd *abfd)
11003
{
11004
  obj_attribute *attr =
11005
    &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
11006
 
11007
  /* Note: the tag and its argument below are uleb128 values, though
11008
     currently-defined values fit in one byte for each.  */
11009
  if (attr->s
11010
      && attr->s[0] == Tag_CPU_arch
11011
      && (attr->s[1] & 128) != 128
11012
      && attr->s[2] == 0)
11013
   return attr->s[1];
11014
 
11015
  /* This tag is "safely ignorable", so don't complain if it looks funny.  */
11016
  return -1;
11017
}
11018
 
11019
/* Set, or unset, the architecture of the Tag_also_compatible_with attribute.
11020
   The tag is removed if ARCH is -1.  */
11021
 
11022
static void
11023
set_secondary_compatible_arch (bfd *abfd, int arch)
11024
{
11025
  obj_attribute *attr =
11026
    &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
11027
 
11028
  if (arch == -1)
11029
    {
11030
      attr->s = NULL;
11031
      return;
11032
    }
11033
 
11034
  /* Note: the tag and its argument below are uleb128 values, though
11035
     currently-defined values fit in one byte for each.  */
11036
  if (!attr->s)
11037
    attr->s = (char *) bfd_alloc (abfd, 3);
11038
  attr->s[0] = Tag_CPU_arch;
11039
  attr->s[1] = arch;
11040
  attr->s[2] = '\0';
11041
}
11042
 
11043
/* Combine two values for Tag_CPU_arch, taking secondary compatibility tags
11044
   into account.  */
11045
 
11046
static int
11047
tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out,
11048
                      int newtag, int secondary_compat)
11049
{
11050
#define T(X) TAG_CPU_ARCH_##X
11051
  int tagl, tagh, result;
11052
  const int v6t2[] =
11053
    {
11054
      T(V6T2),   /* PRE_V4.  */
11055
      T(V6T2),   /* V4.  */
11056
      T(V6T2),   /* V4T.  */
11057
      T(V6T2),   /* V5T.  */
11058
      T(V6T2),   /* V5TE.  */
11059
      T(V6T2),   /* V5TEJ.  */
11060
      T(V6T2),   /* V6.  */
11061
      T(V7),     /* V6KZ.  */
11062
      T(V6T2)    /* V6T2.  */
11063
    };
11064
  const int v6k[] =
11065
    {
11066
      T(V6K),    /* PRE_V4.  */
11067
      T(V6K),    /* V4.  */
11068
      T(V6K),    /* V4T.  */
11069
      T(V6K),    /* V5T.  */
11070
      T(V6K),    /* V5TE.  */
11071
      T(V6K),    /* V5TEJ.  */
11072
      T(V6K),    /* V6.  */
11073
      T(V6KZ),   /* V6KZ.  */
11074
      T(V7),     /* V6T2.  */
11075
      T(V6K)     /* V6K.  */
11076
    };
11077
  const int v7[] =
11078
    {
11079
      T(V7),     /* PRE_V4.  */
11080
      T(V7),     /* V4.  */
11081
      T(V7),     /* V4T.  */
11082
      T(V7),     /* V5T.  */
11083
      T(V7),     /* V5TE.  */
11084
      T(V7),     /* V5TEJ.  */
11085
      T(V7),     /* V6.  */
11086
      T(V7),     /* V6KZ.  */
11087
      T(V7),     /* V6T2.  */
11088
      T(V7),     /* V6K.  */
11089
      T(V7)      /* V7.  */
11090
    };
11091
  const int v6_m[] =
11092
    {
11093
      -1,        /* PRE_V4.  */
11094
      -1,        /* V4.  */
11095
      T(V6K),    /* V4T.  */
11096
      T(V6K),    /* V5T.  */
11097
      T(V6K),    /* V5TE.  */
11098
      T(V6K),    /* V5TEJ.  */
11099
      T(V6K),    /* V6.  */
11100
      T(V6KZ),   /* V6KZ.  */
11101
      T(V7),     /* V6T2.  */
11102
      T(V6K),    /* V6K.  */
11103
      T(V7),     /* V7.  */
11104
      T(V6_M)    /* V6_M.  */
11105
    };
11106
  const int v6s_m[] =
11107
    {
11108
      -1,        /* PRE_V4.  */
11109
      -1,        /* V4.  */
11110
      T(V6K),    /* V4T.  */
11111
      T(V6K),    /* V5T.  */
11112
      T(V6K),    /* V5TE.  */
11113
      T(V6K),    /* V5TEJ.  */
11114
      T(V6K),    /* V6.  */
11115
      T(V6KZ),   /* V6KZ.  */
11116
      T(V7),     /* V6T2.  */
11117
      T(V6K),    /* V6K.  */
11118
      T(V7),     /* V7.  */
11119
      T(V6S_M),  /* V6_M.  */
11120
      T(V6S_M)   /* V6S_M.  */
11121
    };
11122
  const int v7e_m[] =
11123
    {
11124
      -1,        /* PRE_V4.  */
11125
      -1,        /* V4.  */
11126
      T(V7E_M),  /* V4T.  */
11127
      T(V7E_M),  /* V5T.  */
11128
      T(V7E_M),  /* V5TE.  */
11129
      T(V7E_M),  /* V5TEJ.  */
11130
      T(V7E_M),  /* V6.  */
11131
      T(V7E_M),  /* V6KZ.  */
11132
      T(V7E_M),  /* V6T2.  */
11133
      T(V7E_M),  /* V6K.  */
11134
      T(V7E_M),  /* V7.  */
11135
      T(V7E_M),  /* V6_M.  */
11136
      T(V7E_M),  /* V6S_M.  */
11137
      T(V7E_M)   /* V7E_M.  */
11138
    };
11139
  const int v4t_plus_v6_m[] =
11140
    {
11141
      -1,               /* PRE_V4.  */
11142
      -1,               /* V4.  */
11143
      T(V4T),           /* V4T.  */
11144
      T(V5T),           /* V5T.  */
11145
      T(V5TE),          /* V5TE.  */
11146
      T(V5TEJ),         /* V5TEJ.  */
11147
      T(V6),            /* V6.  */
11148
      T(V6KZ),          /* V6KZ.  */
11149
      T(V6T2),          /* V6T2.  */
11150
      T(V6K),           /* V6K.  */
11151
      T(V7),            /* V7.  */
11152
      T(V6_M),          /* V6_M.  */
11153
      T(V6S_M),         /* V6S_M.  */
11154
      T(V7E_M),         /* V7E_M.  */
11155
      T(V4T_PLUS_V6_M)  /* V4T plus V6_M.  */
11156
    };
11157
  const int *comb[] =
11158
    {
11159
      v6t2,
11160
      v6k,
11161
      v7,
11162
      v6_m,
11163
      v6s_m,
11164
      v7e_m,
11165
      /* Pseudo-architecture.  */
11166
      v4t_plus_v6_m
11167
    };
11168
 
11169
  /* Check we've not got a higher architecture than we know about.  */
11170
 
11171
  if (oldtag > MAX_TAG_CPU_ARCH || newtag > MAX_TAG_CPU_ARCH)
11172
    {
11173
      _bfd_error_handler (_("error: %B: Unknown CPU architecture"), ibfd);
11174
      return -1;
11175
    }
11176
 
11177
  /* Override old tag if we have a Tag_also_compatible_with on the output.  */
11178
 
11179
  if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
11180
      || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
11181
    oldtag = T(V4T_PLUS_V6_M);
11182
 
11183
  /* And override the new tag if we have a Tag_also_compatible_with on the
11184
     input.  */
11185
 
11186
  if ((newtag == T(V6_M) && secondary_compat == T(V4T))
11187
      || (newtag == T(V4T) && secondary_compat == T(V6_M)))
11188
    newtag = T(V4T_PLUS_V6_M);
11189
 
11190
  tagl = (oldtag < newtag) ? oldtag : newtag;
11191
  result = tagh = (oldtag > newtag) ? oldtag : newtag;
11192
 
11193
  /* Architectures before V6KZ add features monotonically.  */
11194
  if (tagh <= TAG_CPU_ARCH_V6KZ)
11195
    return result;
11196
 
11197
  result = comb[tagh - T(V6T2)][tagl];
11198
 
11199
  /* Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
11200
     as the canonical version.  */
11201
  if (result == T(V4T_PLUS_V6_M))
11202
    {
11203
      result = T(V4T);
11204
      *secondary_compat_out = T(V6_M);
11205
    }
11206
  else
11207
    *secondary_compat_out = -1;
11208
 
11209
  if (result == -1)
11210
    {
11211
      _bfd_error_handler (_("error: %B: Conflicting CPU architectures %d/%d"),
11212
                          ibfd, oldtag, newtag);
11213
      return -1;
11214
    }
11215
 
11216
  return result;
11217
#undef T
11218
}
11219
 
11220
/* Merge EABI object attributes from IBFD into OBFD.  Raise an error if there
11221
   are conflicting attributes.  */
11222
 
11223
static bfd_boolean
11224
elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
11225
{
11226
  obj_attribute *in_attr;
11227
  obj_attribute *out_attr;
11228
  /* Some tags have 0 = don't care, 1 = strong requirement,
11229
     2 = weak requirement.  */
11230
  static const int order_021[3] = {0, 2, 1};
11231
  int i;
11232
  bfd_boolean result = TRUE;
11233
 
11234
  /* Skip the linker stubs file.  This preserves previous behavior
11235
     of accepting unknown attributes in the first input file - but
11236
     is that a bug?  */
11237
  if (ibfd->flags & BFD_LINKER_CREATED)
11238
    return TRUE;
11239
 
11240
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
11241
    {
11242
      /* This is the first object.  Copy the attributes.  */
11243
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
11244
 
11245
      out_attr = elf_known_obj_attributes_proc (obfd);
11246
 
11247
      /* Use the Tag_null value to indicate the attributes have been
11248
         initialized.  */
11249
      out_attr[0].i = 1;
11250
 
11251
      /* We do not output objects with Tag_MPextension_use_legacy - we move
11252
         the attribute's value to Tag_MPextension_use.  */
11253
      if (out_attr[Tag_MPextension_use_legacy].i != 0)
11254
        {
11255
          if (out_attr[Tag_MPextension_use].i != 0
11256
              && out_attr[Tag_MPextension_use_legacy].i
11257
                != out_attr[Tag_MPextension_use].i)
11258
            {
11259
              _bfd_error_handler
11260
                (_("Error: %B has both the current and legacy "
11261
                   "Tag_MPextension_use attributes"), ibfd);
11262
              result = FALSE;
11263
            }
11264
 
11265
          out_attr[Tag_MPextension_use] =
11266
            out_attr[Tag_MPextension_use_legacy];
11267
          out_attr[Tag_MPextension_use_legacy].type = 0;
11268
          out_attr[Tag_MPextension_use_legacy].i = 0;
11269
        }
11270
 
11271
      return result;
11272
    }
11273
 
11274
  in_attr = elf_known_obj_attributes_proc (ibfd);
11275
  out_attr = elf_known_obj_attributes_proc (obfd);
11276
  /* This needs to happen before Tag_ABI_FP_number_model is merged.  */
11277
  if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
11278
    {
11279
      /* Ignore mismatches if the object doesn't use floating point.  */
11280
      if (out_attr[Tag_ABI_FP_number_model].i == 0)
11281
        out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
11282
      else if (in_attr[Tag_ABI_FP_number_model].i != 0)
11283
        {
11284
          _bfd_error_handler
11285
            (_("error: %B uses VFP register arguments, %B does not"),
11286
             in_attr[Tag_ABI_VFP_args].i ? ibfd : obfd,
11287
             in_attr[Tag_ABI_VFP_args].i ? obfd : ibfd);
11288
          result = FALSE;
11289
        }
11290
    }
11291
 
11292
  for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
11293
    {
11294
      /* Merge this attribute with existing attributes.  */
11295
      switch (i)
11296
        {
11297
        case Tag_CPU_raw_name:
11298
        case Tag_CPU_name:
11299
          /* These are merged after Tag_CPU_arch. */
11300
          break;
11301
 
11302
        case Tag_ABI_optimization_goals:
11303
        case Tag_ABI_FP_optimization_goals:
11304
          /* Use the first value seen.  */
11305
          break;
11306
 
11307
        case Tag_CPU_arch:
11308
          {
11309
            int secondary_compat = -1, secondary_compat_out = -1;
11310
            unsigned int saved_out_attr = out_attr[i].i;
11311
            static const char *name_table[] = {
11312
                /* These aren't real CPU names, but we can't guess
11313
                   that from the architecture version alone.  */
11314
                "Pre v4",
11315
                "ARM v4",
11316
                "ARM v4T",
11317
                "ARM v5T",
11318
                "ARM v5TE",
11319
                "ARM v5TEJ",
11320
                "ARM v6",
11321
                "ARM v6KZ",
11322
                "ARM v6T2",
11323
                "ARM v6K",
11324
                "ARM v7",
11325
                "ARM v6-M",
11326
                "ARM v6S-M"
11327
            };
11328
 
11329
            /* Merge Tag_CPU_arch and Tag_also_compatible_with.  */
11330
            secondary_compat = get_secondary_compatible_arch (ibfd);
11331
            secondary_compat_out = get_secondary_compatible_arch (obfd);
11332
            out_attr[i].i = tag_cpu_arch_combine (ibfd, out_attr[i].i,
11333
                                                  &secondary_compat_out,
11334
                                                  in_attr[i].i,
11335
                                                  secondary_compat);
11336
            set_secondary_compatible_arch (obfd, secondary_compat_out);
11337
 
11338
            /* Merge Tag_CPU_name and Tag_CPU_raw_name.  */
11339
            if (out_attr[i].i == saved_out_attr)
11340
              ; /* Leave the names alone.  */
11341
            else if (out_attr[i].i == in_attr[i].i)
11342
              {
11343
                /* The output architecture has been changed to match the
11344
                   input architecture.  Use the input names.  */
11345
                out_attr[Tag_CPU_name].s = in_attr[Tag_CPU_name].s
11346
                  ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_name].s)
11347
                  : NULL;
11348
                out_attr[Tag_CPU_raw_name].s = in_attr[Tag_CPU_raw_name].s
11349
                  ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_raw_name].s)
11350
                  : NULL;
11351
              }
11352
            else
11353
              {
11354
                out_attr[Tag_CPU_name].s = NULL;
11355
                out_attr[Tag_CPU_raw_name].s = NULL;
11356
              }
11357
 
11358
            /* If we still don't have a value for Tag_CPU_name,
11359
               make one up now.  Tag_CPU_raw_name remains blank.  */
11360
            if (out_attr[Tag_CPU_name].s == NULL
11361
                && out_attr[i].i < ARRAY_SIZE (name_table))
11362
              out_attr[Tag_CPU_name].s =
11363
                _bfd_elf_attr_strdup (obfd, name_table[out_attr[i].i]);
11364
          }
11365
          break;
11366
 
11367
        case Tag_ARM_ISA_use:
11368
        case Tag_THUMB_ISA_use:
11369
        case Tag_WMMX_arch:
11370
        case Tag_Advanced_SIMD_arch:
11371
          /* ??? Do Advanced_SIMD (NEON) and WMMX conflict?  */
11372
        case Tag_ABI_FP_rounding:
11373
        case Tag_ABI_FP_exceptions:
11374
        case Tag_ABI_FP_user_exceptions:
11375
        case Tag_ABI_FP_number_model:
11376
        case Tag_FP_HP_extension:
11377
        case Tag_CPU_unaligned_access:
11378
        case Tag_T2EE_use:
11379
        case Tag_MPextension_use:
11380
          /* Use the largest value specified.  */
11381
          if (in_attr[i].i > out_attr[i].i)
11382
            out_attr[i].i = in_attr[i].i;
11383
          break;
11384
 
11385
        case Tag_ABI_align_preserved:
11386
        case Tag_ABI_PCS_RO_data:
11387
          /* Use the smallest value specified.  */
11388
          if (in_attr[i].i < out_attr[i].i)
11389
            out_attr[i].i = in_attr[i].i;
11390
          break;
11391
 
11392
        case Tag_ABI_align_needed:
11393
          if ((in_attr[i].i > 0 || out_attr[i].i > 0)
11394
              && (in_attr[Tag_ABI_align_preserved].i == 0
11395
                  || out_attr[Tag_ABI_align_preserved].i == 0))
11396
            {
11397
              /* This error message should be enabled once all non-conformant
11398
                 binaries in the toolchain have had the attributes set
11399
                 properly.
11400
              _bfd_error_handler
11401
                (_("error: %B: 8-byte data alignment conflicts with %B"),
11402
                 obfd, ibfd);
11403
              result = FALSE; */
11404
            }
11405
          /* Fall through.  */
11406
        case Tag_ABI_FP_denormal:
11407
        case Tag_ABI_PCS_GOT_use:
11408
          /* Use the "greatest" from the sequence 0, 2, 1, or the largest
11409
             value if greater than 2 (for future-proofing).  */
11410
          if ((in_attr[i].i > 2 && in_attr[i].i > out_attr[i].i)
11411
              || (in_attr[i].i <= 2 && out_attr[i].i <= 2
11412
                  && order_021[in_attr[i].i] > order_021[out_attr[i].i]))
11413
            out_attr[i].i = in_attr[i].i;
11414
          break;
11415
 
11416
        case Tag_Virtualization_use:
11417
          /* The virtualization tag effectively stores two bits of
11418
             information: the intended use of TrustZone (in bit 0), and the
11419
             intended use of Virtualization (in bit 1).  */
11420
          if (out_attr[i].i == 0)
11421
            out_attr[i].i = in_attr[i].i;
11422
          else if (in_attr[i].i != 0
11423
                   && in_attr[i].i != out_attr[i].i)
11424
            {
11425
              if (in_attr[i].i <= 3 && out_attr[i].i <= 3)
11426
                out_attr[i].i = 3;
11427
              else
11428
                {
11429
                  _bfd_error_handler
11430
                    (_("error: %B: unable to merge virtualization attributes "
11431
                       "with %B"),
11432
                     obfd, ibfd);
11433
                  result = FALSE;
11434
                }
11435
            }
11436
          break;
11437
 
11438
        case Tag_CPU_arch_profile:
11439
          if (out_attr[i].i != in_attr[i].i)
11440
            {
11441
              /* 0 will merge with anything.
11442
                 'A' and 'S' merge to 'A'.
11443
                 'R' and 'S' merge to 'R'.
11444
                 'M' and 'A|R|S' is an error.  */
11445
              if (out_attr[i].i == 0
11446
                  || (out_attr[i].i == 'S'
11447
                      && (in_attr[i].i == 'A' || in_attr[i].i == 'R')))
11448
                out_attr[i].i = in_attr[i].i;
11449
              else if (in_attr[i].i == 0
11450
                       || (in_attr[i].i == 'S'
11451
                           && (out_attr[i].i == 'A' || out_attr[i].i == 'R')))
11452
                ; /* Do nothing. */
11453
              else
11454
                {
11455
                  _bfd_error_handler
11456
                    (_("error: %B: Conflicting architecture profiles %c/%c"),
11457
                     ibfd,
11458
                     in_attr[i].i ? in_attr[i].i : '0',
11459
                     out_attr[i].i ? out_attr[i].i : '0');
11460
                  result = FALSE;
11461
                }
11462
            }
11463
          break;
11464
        case Tag_FP_arch:
11465
            {
11466
              /* Tag_ABI_HardFP_use is handled along with Tag_FP_arch since
11467
                 the meaning of Tag_ABI_HardFP_use depends on Tag_FP_arch
11468
                 when it's 0.  It might mean absence of FP hardware if
11469
                 Tag_FP_arch is zero, otherwise it is effectively SP + DP.  */
11470
 
11471
              static const struct
11472
              {
11473
                  int ver;
11474
                  int regs;
11475
              } vfp_versions[7] =
11476
                {
11477
                  {0, 0},
11478
                  {1, 16},
11479
                  {2, 16},
11480
                  {3, 32},
11481
                  {3, 16},
11482
                  {4, 32},
11483
                  {4, 16}
11484
                };
11485
              int ver;
11486
              int regs;
11487
              int newval;
11488
 
11489
              /* If the output has no requirement about FP hardware,
11490
                 follow the requirement of the input.  */
11491
              if (out_attr[i].i == 0)
11492
                {
11493
                  BFD_ASSERT (out_attr[Tag_ABI_HardFP_use].i == 0);
11494
                  out_attr[i].i = in_attr[i].i;
11495
                  out_attr[Tag_ABI_HardFP_use].i
11496
                    = in_attr[Tag_ABI_HardFP_use].i;
11497
                  break;
11498
                }
11499
              /* If the input has no requirement about FP hardware, do
11500
                 nothing.  */
11501
              else if (in_attr[i].i == 0)
11502
                {
11503
                  BFD_ASSERT (in_attr[Tag_ABI_HardFP_use].i == 0);
11504
                  break;
11505
                }
11506
 
11507
              /* Both the input and the output have nonzero Tag_FP_arch.
11508
                 So Tag_ABI_HardFP_use is (SP & DP) when it's zero.  */
11509
 
11510
              /* If both the input and the output have zero Tag_ABI_HardFP_use,
11511
                 do nothing.  */
11512
              if (in_attr[Tag_ABI_HardFP_use].i == 0
11513
                  && out_attr[Tag_ABI_HardFP_use].i == 0)
11514
                ;
11515
              /* If the input and the output have different Tag_ABI_HardFP_use,
11516
                 the combination of them is 3 (SP & DP).  */
11517
              else if (in_attr[Tag_ABI_HardFP_use].i
11518
                       != out_attr[Tag_ABI_HardFP_use].i)
11519
                out_attr[Tag_ABI_HardFP_use].i = 3;
11520
 
11521
              /* Now we can handle Tag_FP_arch.  */
11522
 
11523
              /* Values greater than 6 aren't defined, so just pick the
11524
                 biggest */
11525
              if (in_attr[i].i > 6 && in_attr[i].i > out_attr[i].i)
11526
                {
11527
                  out_attr[i] = in_attr[i];
11528
                  break;
11529
                }
11530
              /* The output uses the superset of input features
11531
                 (ISA version) and registers.  */
11532
              ver = vfp_versions[in_attr[i].i].ver;
11533
              if (ver < vfp_versions[out_attr[i].i].ver)
11534
                ver = vfp_versions[out_attr[i].i].ver;
11535
              regs = vfp_versions[in_attr[i].i].regs;
11536
              if (regs < vfp_versions[out_attr[i].i].regs)
11537
                regs = vfp_versions[out_attr[i].i].regs;
11538
              /* This assumes all possible supersets are also a valid
11539
                 options.  */
11540
              for (newval = 6; newval > 0; newval--)
11541
                {
11542
                  if (regs == vfp_versions[newval].regs
11543
                      && ver == vfp_versions[newval].ver)
11544
                    break;
11545
                }
11546
              out_attr[i].i = newval;
11547
            }
11548
          break;
11549
        case Tag_PCS_config:
11550
          if (out_attr[i].i == 0)
11551
            out_attr[i].i = in_attr[i].i;
11552 163 khays
          else if (in_attr[i].i != 0 && out_attr[i].i != in_attr[i].i)
11553 14 khays
            {
11554
              /* It's sometimes ok to mix different configs, so this is only
11555
                 a warning.  */
11556
              _bfd_error_handler
11557
                (_("Warning: %B: Conflicting platform configuration"), ibfd);
11558
            }
11559
          break;
11560
        case Tag_ABI_PCS_R9_use:
11561
          if (in_attr[i].i != out_attr[i].i
11562
              && out_attr[i].i != AEABI_R9_unused
11563
              && in_attr[i].i != AEABI_R9_unused)
11564
            {
11565
              _bfd_error_handler
11566
                (_("error: %B: Conflicting use of R9"), ibfd);
11567
              result = FALSE;
11568
            }
11569
          if (out_attr[i].i == AEABI_R9_unused)
11570
            out_attr[i].i = in_attr[i].i;
11571
          break;
11572
        case Tag_ABI_PCS_RW_data:
11573
          if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
11574
              && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
11575
              && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
11576
            {
11577
              _bfd_error_handler
11578
                (_("error: %B: SB relative addressing conflicts with use of R9"),
11579
                 ibfd);
11580
              result = FALSE;
11581
            }
11582
          /* Use the smallest value specified.  */
11583
          if (in_attr[i].i < out_attr[i].i)
11584
            out_attr[i].i = in_attr[i].i;
11585
          break;
11586
        case Tag_ABI_PCS_wchar_t:
11587
          if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i
11588
              && !elf_arm_tdata (obfd)->no_wchar_size_warning)
11589
            {
11590
              _bfd_error_handler
11591
                (_("warning: %B uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"),
11592
                 ibfd, in_attr[i].i, out_attr[i].i);
11593
            }
11594
          else if (in_attr[i].i && !out_attr[i].i)
11595
            out_attr[i].i = in_attr[i].i;
11596
          break;
11597
        case Tag_ABI_enum_size:
11598
          if (in_attr[i].i != AEABI_enum_unused)
11599
            {
11600
              if (out_attr[i].i == AEABI_enum_unused
11601
                  || out_attr[i].i == AEABI_enum_forced_wide)
11602
                {
11603
                  /* The existing object is compatible with anything.
11604
                     Use whatever requirements the new object has.  */
11605
                  out_attr[i].i = in_attr[i].i;
11606
                }
11607
              else if (in_attr[i].i != AEABI_enum_forced_wide
11608
                       && out_attr[i].i != in_attr[i].i
11609
                       && !elf_arm_tdata (obfd)->no_enum_size_warning)
11610
                {
11611
                  static const char *aeabi_enum_names[] =
11612
                    { "", "variable-size", "32-bit", "" };
11613
                  const char *in_name =
11614
                    in_attr[i].i < ARRAY_SIZE(aeabi_enum_names)
11615
                    ? aeabi_enum_names[in_attr[i].i]
11616
                    : "<unknown>";
11617
                  const char *out_name =
11618
                    out_attr[i].i < ARRAY_SIZE(aeabi_enum_names)
11619
                    ? aeabi_enum_names[out_attr[i].i]
11620
                    : "<unknown>";
11621
                  _bfd_error_handler
11622
                    (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
11623
                     ibfd, in_name, out_name);
11624
                }
11625
            }
11626
          break;
11627
        case Tag_ABI_VFP_args:
11628
          /* Aready done.  */
11629
          break;
11630
        case Tag_ABI_WMMX_args:
11631
          if (in_attr[i].i != out_attr[i].i)
11632
            {
11633
              _bfd_error_handler
11634
                (_("error: %B uses iWMMXt register arguments, %B does not"),
11635
                 ibfd, obfd);
11636
              result = FALSE;
11637
            }
11638
          break;
11639
        case Tag_compatibility:
11640
          /* Merged in target-independent code.  */
11641
          break;
11642
        case Tag_ABI_HardFP_use:
11643
          /* This is handled along with Tag_FP_arch.  */
11644
          break;
11645
        case Tag_ABI_FP_16bit_format:
11646
          if (in_attr[i].i != 0 && out_attr[i].i != 0)
11647
            {
11648
              if (in_attr[i].i != out_attr[i].i)
11649
                {
11650
                  _bfd_error_handler
11651
                    (_("error: fp16 format mismatch between %B and %B"),
11652
                     ibfd, obfd);
11653
                  result = FALSE;
11654
                }
11655
            }
11656
          if (in_attr[i].i != 0)
11657
            out_attr[i].i = in_attr[i].i;
11658
          break;
11659
 
11660
        case Tag_DIV_use:
11661
          /* This tag is set to zero if we can use UDIV and SDIV in Thumb
11662
             mode on a v7-M or v7-R CPU; to one if we can not use UDIV or
11663
             SDIV at all; and to two if we can use UDIV or SDIV on a v7-A
11664
             CPU.  We will merge as follows: If the input attribute's value
11665
             is one then the output attribute's value remains unchanged.  If
11666
             the input attribute's value is zero or two then if the output
11667
             attribute's value is one the output value is set to the input
11668
             value, otherwise the output value must be the same as the
11669
             inputs.  */
11670
          if (in_attr[i].i != 1 && out_attr[i].i != 1)
11671
            {
11672
              if (in_attr[i].i != out_attr[i].i)
11673
                {
11674
                  _bfd_error_handler
11675
                    (_("DIV usage mismatch between %B and %B"),
11676
                     ibfd, obfd);
11677
                  result = FALSE;
11678
                }
11679
            }
11680
 
11681
          if (in_attr[i].i != 1)
11682
            out_attr[i].i = in_attr[i].i;
11683
 
11684
          break;
11685
 
11686
        case Tag_MPextension_use_legacy:
11687
          /* We don't output objects with Tag_MPextension_use_legacy - we
11688
             move the value to Tag_MPextension_use.  */
11689
          if (in_attr[i].i != 0 && in_attr[Tag_MPextension_use].i != 0)
11690
            {
11691
              if (in_attr[Tag_MPextension_use].i != in_attr[i].i)
11692
                {
11693
                  _bfd_error_handler
11694
                    (_("%B has has both the current and legacy "
11695
                       "Tag_MPextension_use attributes"),
11696
                     ibfd);
11697
                  result = FALSE;
11698
                }
11699
            }
11700
 
11701
          if (in_attr[i].i > out_attr[Tag_MPextension_use].i)
11702
            out_attr[Tag_MPextension_use] = in_attr[i];
11703
 
11704
          break;
11705
 
11706
        case Tag_nodefaults:
11707
          /* This tag is set if it exists, but the value is unused (and is
11708
             typically zero).  We don't actually need to do anything here -
11709
             the merge happens automatically when the type flags are merged
11710
             below.  */
11711
          break;
11712
        case Tag_also_compatible_with:
11713
          /* Already done in Tag_CPU_arch.  */
11714
          break;
11715
        case Tag_conformance:
11716
          /* Keep the attribute if it matches.  Throw it away otherwise.
11717
             No attribute means no claim to conform.  */
11718
          if (!in_attr[i].s || !out_attr[i].s
11719
              || strcmp (in_attr[i].s, out_attr[i].s) != 0)
11720
            out_attr[i].s = NULL;
11721
          break;
11722
 
11723
        default:
11724
          result
11725
            = result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
11726
        }
11727
 
11728
      /* If out_attr was copied from in_attr then it won't have a type yet.  */
11729
      if (in_attr[i].type && !out_attr[i].type)
11730
        out_attr[i].type = in_attr[i].type;
11731
    }
11732
 
11733
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
11734
  if (!_bfd_elf_merge_object_attributes (ibfd, obfd))
11735
    return FALSE;
11736
 
11737
  /* Check for any attributes not known on ARM.  */
11738
  result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
11739
 
11740
  return result;
11741
}
11742
 
11743
 
11744
/* Return TRUE if the two EABI versions are incompatible.  */
11745
 
11746
static bfd_boolean
11747
elf32_arm_versions_compatible (unsigned iver, unsigned over)
11748
{
11749
  /* v4 and v5 are the same spec before and after it was released,
11750
     so allow mixing them.  */
11751
  if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
11752
      || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
11753
    return TRUE;
11754
 
11755
  return (iver == over);
11756
}
11757
 
11758
/* Merge backend specific data from an object file to the output
11759
   object file when linking.  */
11760
 
11761
static bfd_boolean
11762
elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd);
11763
 
11764
/* Display the flags field.  */
11765
 
11766
static bfd_boolean
11767
elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
11768
{
11769
  FILE * file = (FILE *) ptr;
11770
  unsigned long flags;
11771
 
11772
  BFD_ASSERT (abfd != NULL && ptr != NULL);
11773
 
11774
  /* Print normal ELF private data.  */
11775
  _bfd_elf_print_private_bfd_data (abfd, ptr);
11776
 
11777
  flags = elf_elfheader (abfd)->e_flags;
11778
  /* Ignore init flag - it may not be set, despite the flags field
11779
     containing valid data.  */
11780
 
11781
  /* xgettext:c-format */
11782
  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
11783
 
11784
  switch (EF_ARM_EABI_VERSION (flags))
11785
    {
11786
    case EF_ARM_EABI_UNKNOWN:
11787
      /* The following flag bits are GNU extensions and not part of the
11788
         official ARM ELF extended ABI.  Hence they are only decoded if
11789
         the EABI version is not set.  */
11790
      if (flags & EF_ARM_INTERWORK)
11791
        fprintf (file, _(" [interworking enabled]"));
11792
 
11793
      if (flags & EF_ARM_APCS_26)
11794
        fprintf (file, " [APCS-26]");
11795
      else
11796
        fprintf (file, " [APCS-32]");
11797
 
11798
      if (flags & EF_ARM_VFP_FLOAT)
11799
        fprintf (file, _(" [VFP float format]"));
11800
      else if (flags & EF_ARM_MAVERICK_FLOAT)
11801
        fprintf (file, _(" [Maverick float format]"));
11802
      else
11803
        fprintf (file, _(" [FPA float format]"));
11804
 
11805
      if (flags & EF_ARM_APCS_FLOAT)
11806
        fprintf (file, _(" [floats passed in float registers]"));
11807
 
11808
      if (flags & EF_ARM_PIC)
11809
        fprintf (file, _(" [position independent]"));
11810
 
11811
      if (flags & EF_ARM_NEW_ABI)
11812
        fprintf (file, _(" [new ABI]"));
11813
 
11814
      if (flags & EF_ARM_OLD_ABI)
11815
        fprintf (file, _(" [old ABI]"));
11816
 
11817
      if (flags & EF_ARM_SOFT_FLOAT)
11818
        fprintf (file, _(" [software FP]"));
11819
 
11820
      flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
11821
                 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
11822
                 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
11823
                 | EF_ARM_MAVERICK_FLOAT);
11824
      break;
11825
 
11826
    case EF_ARM_EABI_VER1:
11827
      fprintf (file, _(" [Version1 EABI]"));
11828
 
11829
      if (flags & EF_ARM_SYMSARESORTED)
11830
        fprintf (file, _(" [sorted symbol table]"));
11831
      else
11832
        fprintf (file, _(" [unsorted symbol table]"));
11833
 
11834
      flags &= ~ EF_ARM_SYMSARESORTED;
11835
      break;
11836
 
11837
    case EF_ARM_EABI_VER2:
11838
      fprintf (file, _(" [Version2 EABI]"));
11839
 
11840
      if (flags & EF_ARM_SYMSARESORTED)
11841
        fprintf (file, _(" [sorted symbol table]"));
11842
      else
11843
        fprintf (file, _(" [unsorted symbol table]"));
11844
 
11845
      if (flags & EF_ARM_DYNSYMSUSESEGIDX)
11846
        fprintf (file, _(" [dynamic symbols use segment index]"));
11847
 
11848
      if (flags & EF_ARM_MAPSYMSFIRST)
11849
        fprintf (file, _(" [mapping symbols precede others]"));
11850
 
11851
      flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
11852
                 | EF_ARM_MAPSYMSFIRST);
11853
      break;
11854
 
11855
    case EF_ARM_EABI_VER3:
11856
      fprintf (file, _(" [Version3 EABI]"));
11857
      break;
11858
 
11859
    case EF_ARM_EABI_VER4:
11860
      fprintf (file, _(" [Version4 EABI]"));
11861
      goto eabi;
11862
 
11863
    case EF_ARM_EABI_VER5:
11864
      fprintf (file, _(" [Version5 EABI]"));
11865
    eabi:
11866
      if (flags & EF_ARM_BE8)
11867
        fprintf (file, _(" [BE8]"));
11868
 
11869
      if (flags & EF_ARM_LE8)
11870
        fprintf (file, _(" [LE8]"));
11871
 
11872
      flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
11873
      break;
11874
 
11875
    default:
11876
      fprintf (file, _(" <EABI version unrecognised>"));
11877
      break;
11878
    }
11879
 
11880
  flags &= ~ EF_ARM_EABIMASK;
11881
 
11882
  if (flags & EF_ARM_RELEXEC)
11883
    fprintf (file, _(" [relocatable executable]"));
11884
 
11885
  if (flags & EF_ARM_HASENTRY)
11886
    fprintf (file, _(" [has entry point]"));
11887
 
11888
  flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
11889
 
11890
  if (flags)
11891
    fprintf (file, _("<Unrecognised flag bits set>"));
11892
 
11893
  fputc ('\n', file);
11894
 
11895
  return TRUE;
11896
}
11897
 
11898
static int
11899
elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
11900
{
11901
  switch (ELF_ST_TYPE (elf_sym->st_info))
11902
    {
11903
    case STT_ARM_TFUNC:
11904
      return ELF_ST_TYPE (elf_sym->st_info);
11905
 
11906
    case STT_ARM_16BIT:
11907
      /* If the symbol is not an object, return the STT_ARM_16BIT flag.
11908
         This allows us to distinguish between data used by Thumb instructions
11909
         and non-data (which is probably code) inside Thumb regions of an
11910
         executable.  */
11911
      if (type != STT_OBJECT && type != STT_TLS)
11912
        return ELF_ST_TYPE (elf_sym->st_info);
11913
      break;
11914
 
11915
    default:
11916
      break;
11917
    }
11918
 
11919
  return type;
11920
}
11921
 
11922
static asection *
11923
elf32_arm_gc_mark_hook (asection *sec,
11924
                        struct bfd_link_info *info,
11925
                        Elf_Internal_Rela *rel,
11926
                        struct elf_link_hash_entry *h,
11927
                        Elf_Internal_Sym *sym)
11928
{
11929
  if (h != NULL)
11930
    switch (ELF32_R_TYPE (rel->r_info))
11931
      {
11932
      case R_ARM_GNU_VTINHERIT:
11933
      case R_ARM_GNU_VTENTRY:
11934
        return NULL;
11935
      }
11936
 
11937
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
11938
}
11939
 
11940
/* Update the got entry reference counts for the section being removed.  */
11941
 
11942
static bfd_boolean
11943
elf32_arm_gc_sweep_hook (bfd *                     abfd,
11944
                         struct bfd_link_info *    info,
11945
                         asection *                sec,
11946
                         const Elf_Internal_Rela * relocs)
11947
{
11948
  Elf_Internal_Shdr *symtab_hdr;
11949
  struct elf_link_hash_entry **sym_hashes;
11950
  bfd_signed_vma *local_got_refcounts;
11951
  const Elf_Internal_Rela *rel, *relend;
11952
  struct elf32_arm_link_hash_table * globals;
11953
 
11954
  if (info->relocatable)
11955
    return TRUE;
11956
 
11957
  globals = elf32_arm_hash_table (info);
11958
  if (globals == NULL)
11959
    return FALSE;
11960
 
11961
  elf_section_data (sec)->local_dynrel = NULL;
11962
 
11963
  symtab_hdr = & elf_symtab_hdr (abfd);
11964
  sym_hashes = elf_sym_hashes (abfd);
11965
  local_got_refcounts = elf_local_got_refcounts (abfd);
11966
 
11967
  check_use_blx (globals);
11968
 
11969
  relend = relocs + sec->reloc_count;
11970
  for (rel = relocs; rel < relend; rel++)
11971
    {
11972
      unsigned long r_symndx;
11973
      struct elf_link_hash_entry *h = NULL;
11974
      struct elf32_arm_link_hash_entry *eh;
11975
      int r_type;
11976
      bfd_boolean call_reloc_p;
11977
      bfd_boolean may_become_dynamic_p;
11978
      bfd_boolean may_need_local_target_p;
11979
      union gotplt_union *root_plt;
11980
      struct arm_plt_info *arm_plt;
11981
 
11982
      r_symndx = ELF32_R_SYM (rel->r_info);
11983
      if (r_symndx >= symtab_hdr->sh_info)
11984
        {
11985
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
11986
          while (h->root.type == bfd_link_hash_indirect
11987
                 || h->root.type == bfd_link_hash_warning)
11988
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
11989
        }
11990
      eh = (struct elf32_arm_link_hash_entry *) h;
11991
 
11992
      call_reloc_p = FALSE;
11993
      may_become_dynamic_p = FALSE;
11994
      may_need_local_target_p = FALSE;
11995
 
11996
      r_type = ELF32_R_TYPE (rel->r_info);
11997
      r_type = arm_real_reloc_type (globals, r_type);
11998
      switch (r_type)
11999
        {
12000
        case R_ARM_GOT32:
12001
        case R_ARM_GOT_PREL:
12002
        case R_ARM_TLS_GD32:
12003
        case R_ARM_TLS_IE32:
12004
          if (h != NULL)
12005
            {
12006
              if (h->got.refcount > 0)
12007
                h->got.refcount -= 1;
12008
            }
12009
          else if (local_got_refcounts != NULL)
12010
            {
12011
              if (local_got_refcounts[r_symndx] > 0)
12012
                local_got_refcounts[r_symndx] -= 1;
12013
            }
12014
          break;
12015
 
12016
        case R_ARM_TLS_LDM32:
12017
          globals->tls_ldm_got.refcount -= 1;
12018
          break;
12019
 
12020
        case R_ARM_PC24:
12021
        case R_ARM_PLT32:
12022
        case R_ARM_CALL:
12023
        case R_ARM_JUMP24:
12024
        case R_ARM_PREL31:
12025
        case R_ARM_THM_CALL:
12026
        case R_ARM_THM_JUMP24:
12027
        case R_ARM_THM_JUMP19:
12028
          call_reloc_p = TRUE;
12029
          may_need_local_target_p = TRUE;
12030
          break;
12031
 
12032
        case R_ARM_ABS12:
12033
          if (!globals->vxworks_p)
12034
            {
12035
              may_need_local_target_p = TRUE;
12036
              break;
12037
            }
12038
          /* Fall through.  */
12039
        case R_ARM_ABS32:
12040
        case R_ARM_ABS32_NOI:
12041
        case R_ARM_REL32:
12042
        case R_ARM_REL32_NOI:
12043
        case R_ARM_MOVW_ABS_NC:
12044
        case R_ARM_MOVT_ABS:
12045
        case R_ARM_MOVW_PREL_NC:
12046
        case R_ARM_MOVT_PREL:
12047
        case R_ARM_THM_MOVW_ABS_NC:
12048
        case R_ARM_THM_MOVT_ABS:
12049
        case R_ARM_THM_MOVW_PREL_NC:
12050
        case R_ARM_THM_MOVT_PREL:
12051
          /* Should the interworking branches be here also?  */
12052
          if ((info->shared || globals->root.is_relocatable_executable)
12053
              && (sec->flags & SEC_ALLOC) != 0)
12054
            {
12055
              if (h == NULL
12056
                  && (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI))
12057
                {
12058
                  call_reloc_p = TRUE;
12059
                  may_need_local_target_p = TRUE;
12060
                }
12061
              else
12062
                may_become_dynamic_p = TRUE;
12063
            }
12064
          else
12065
            may_need_local_target_p = TRUE;
12066
          break;
12067
 
12068
        default:
12069
          break;
12070
        }
12071
 
12072
      if (may_need_local_target_p
12073
          && elf32_arm_get_plt_info (abfd, eh, r_symndx, &root_plt, &arm_plt))
12074
        {
12075
          BFD_ASSERT (root_plt->refcount > 0);
12076
          root_plt->refcount -= 1;
12077
 
12078
          if (!call_reloc_p)
12079
            arm_plt->noncall_refcount--;
12080
 
12081
          if (r_type == R_ARM_THM_CALL)
12082
            arm_plt->maybe_thumb_refcount--;
12083
 
12084
          if (r_type == R_ARM_THM_JUMP24
12085
              || r_type == R_ARM_THM_JUMP19)
12086
            arm_plt->thumb_refcount--;
12087
        }
12088
 
12089
      if (may_become_dynamic_p)
12090
        {
12091
          struct elf_dyn_relocs **pp;
12092
          struct elf_dyn_relocs *p;
12093
 
12094
          if (h != NULL)
12095
            pp = &(eh->dyn_relocs);
12096
          else
12097
            {
12098
              Elf_Internal_Sym *isym;
12099
 
12100
              isym = bfd_sym_from_r_symndx (&globals->sym_cache,
12101
                                            abfd, r_symndx);
12102
              if (isym == NULL)
12103
                return FALSE;
12104
              pp = elf32_arm_get_local_dynreloc_list (abfd, r_symndx, isym);
12105
              if (pp == NULL)
12106
                return FALSE;
12107
            }
12108
          for (; (p = *pp) != NULL; pp = &p->next)
12109
            if (p->sec == sec)
12110
              {
12111
                /* Everything must go for SEC.  */
12112
                *pp = p->next;
12113
                break;
12114
              }
12115
        }
12116
    }
12117
 
12118
  return TRUE;
12119
}
12120
 
12121
/* Look through the relocs for a section during the first phase.  */
12122
 
12123
static bfd_boolean
12124
elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
12125
                        asection *sec, const Elf_Internal_Rela *relocs)
12126
{
12127
  Elf_Internal_Shdr *symtab_hdr;
12128
  struct elf_link_hash_entry **sym_hashes;
12129
  const Elf_Internal_Rela *rel;
12130
  const Elf_Internal_Rela *rel_end;
12131
  bfd *dynobj;
12132
  asection *sreloc;
12133
  struct elf32_arm_link_hash_table *htab;
12134
  bfd_boolean call_reloc_p;
12135
  bfd_boolean may_become_dynamic_p;
12136
  bfd_boolean may_need_local_target_p;
12137
  unsigned long nsyms;
12138
 
12139
  if (info->relocatable)
12140
    return TRUE;
12141
 
12142
  BFD_ASSERT (is_arm_elf (abfd));
12143
 
12144
  htab = elf32_arm_hash_table (info);
12145
  if (htab == NULL)
12146
    return FALSE;
12147
 
12148
  sreloc = NULL;
12149
 
12150
  /* Create dynamic sections for relocatable executables so that we can
12151
     copy relocations.  */
12152
  if (htab->root.is_relocatable_executable
12153
      && ! htab->root.dynamic_sections_created)
12154
    {
12155
      if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
12156
        return FALSE;
12157
    }
12158
 
12159
  if (htab->root.dynobj == NULL)
12160
    htab->root.dynobj = abfd;
12161
  if (!create_ifunc_sections (info))
12162
    return FALSE;
12163
 
12164
  dynobj = htab->root.dynobj;
12165
 
12166
  symtab_hdr = & elf_symtab_hdr (abfd);
12167
  sym_hashes = elf_sym_hashes (abfd);
12168
  nsyms = NUM_SHDR_ENTRIES (symtab_hdr);
12169
 
12170
  rel_end = relocs + sec->reloc_count;
12171
  for (rel = relocs; rel < rel_end; rel++)
12172
    {
12173
      Elf_Internal_Sym *isym;
12174
      struct elf_link_hash_entry *h;
12175
      struct elf32_arm_link_hash_entry *eh;
12176
      unsigned long r_symndx;
12177
      int r_type;
12178
 
12179
      r_symndx = ELF32_R_SYM (rel->r_info);
12180
      r_type = ELF32_R_TYPE (rel->r_info);
12181
      r_type = arm_real_reloc_type (htab, r_type);
12182
 
12183
      if (r_symndx >= nsyms
12184
          /* PR 9934: It is possible to have relocations that do not
12185
             refer to symbols, thus it is also possible to have an
12186
             object file containing relocations but no symbol table.  */
12187
          && (r_symndx > STN_UNDEF || nsyms > 0))
12188
        {
12189
          (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
12190
                                   r_symndx);
12191
          return FALSE;
12192
        }
12193
 
12194
      h = NULL;
12195
      isym = NULL;
12196
      if (nsyms > 0)
12197
        {
12198
          if (r_symndx < symtab_hdr->sh_info)
12199
            {
12200
              /* A local symbol.  */
12201
              isym = bfd_sym_from_r_symndx (&htab->sym_cache,
12202
                                            abfd, r_symndx);
12203
              if (isym == NULL)
12204
                return FALSE;
12205
            }
12206
          else
12207
            {
12208
              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
12209
              while (h->root.type == bfd_link_hash_indirect
12210
                     || h->root.type == bfd_link_hash_warning)
12211
                h = (struct elf_link_hash_entry *) h->root.u.i.link;
12212
            }
12213
        }
12214
 
12215
      eh = (struct elf32_arm_link_hash_entry *) h;
12216
 
12217
      call_reloc_p = FALSE;
12218
      may_become_dynamic_p = FALSE;
12219
      may_need_local_target_p = FALSE;
12220
 
12221
      /* Could be done earlier, if h were already available.  */
12222
      r_type = elf32_arm_tls_transition (info, r_type, h);
12223
      switch (r_type)
12224
        {
12225
          case R_ARM_GOT32:
12226
          case R_ARM_GOT_PREL:
12227
          case R_ARM_TLS_GD32:
12228
          case R_ARM_TLS_IE32:
12229
          case R_ARM_TLS_GOTDESC:
12230
          case R_ARM_TLS_DESCSEQ:
12231
          case R_ARM_THM_TLS_DESCSEQ:
12232
          case R_ARM_TLS_CALL:
12233
          case R_ARM_THM_TLS_CALL:
12234
            /* This symbol requires a global offset table entry.  */
12235
            {
12236
              int tls_type, old_tls_type;
12237
 
12238
              switch (r_type)
12239
                {
12240
                case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
12241
 
12242
                case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
12243
 
12244
                case R_ARM_TLS_GOTDESC:
12245
                case R_ARM_TLS_CALL: case R_ARM_THM_TLS_CALL:
12246
                case R_ARM_TLS_DESCSEQ: case R_ARM_THM_TLS_DESCSEQ:
12247
                  tls_type = GOT_TLS_GDESC; break;
12248
 
12249
                default: tls_type = GOT_NORMAL; break;
12250
                }
12251
 
12252
              if (h != NULL)
12253
                {
12254
                  h->got.refcount++;
12255
                  old_tls_type = elf32_arm_hash_entry (h)->tls_type;
12256
                }
12257
              else
12258
                {
12259
                  /* This is a global offset table entry for a local symbol.  */
12260
                  if (!elf32_arm_allocate_local_sym_info (abfd))
12261
                    return FALSE;
12262
                  elf_local_got_refcounts (abfd)[r_symndx] += 1;
12263
                  old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
12264
                }
12265
 
12266
              /* If a variable is accessed with both tls methods, two
12267
                 slots may be created.  */
12268
              if (GOT_TLS_GD_ANY_P (old_tls_type)
12269
                  && GOT_TLS_GD_ANY_P (tls_type))
12270
                tls_type |= old_tls_type;
12271
 
12272
              /* We will already have issued an error message if there
12273
                 is a TLS/non-TLS mismatch, based on the symbol
12274
                 type.  So just combine any TLS types needed.  */
12275
              if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
12276
                  && tls_type != GOT_NORMAL)
12277
                tls_type |= old_tls_type;
12278
 
12279
              /* If the symbol is accessed in both IE and GDESC
12280
                 method, we're able to relax. Turn off the GDESC flag,
12281
                 without messing up with any other kind of tls types
12282
                 that may be involved */
12283
              if ((tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_GDESC))
12284
                tls_type &= ~GOT_TLS_GDESC;
12285
 
12286
              if (old_tls_type != tls_type)
12287
                {
12288
                  if (h != NULL)
12289
                    elf32_arm_hash_entry (h)->tls_type = tls_type;
12290
                  else
12291
                    elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
12292
                }
12293
            }
12294
            /* Fall through.  */
12295
 
12296
          case R_ARM_TLS_LDM32:
12297
            if (r_type == R_ARM_TLS_LDM32)
12298
                htab->tls_ldm_got.refcount++;
12299
            /* Fall through.  */
12300
 
12301
          case R_ARM_GOTOFF32:
12302
          case R_ARM_GOTPC:
12303
            if (htab->root.sgot == NULL
12304
                && !create_got_section (htab->root.dynobj, info))
12305
              return FALSE;
12306
            break;
12307
 
12308
          case R_ARM_PC24:
12309
          case R_ARM_PLT32:
12310
          case R_ARM_CALL:
12311
          case R_ARM_JUMP24:
12312
          case R_ARM_PREL31:
12313
          case R_ARM_THM_CALL:
12314
          case R_ARM_THM_JUMP24:
12315
          case R_ARM_THM_JUMP19:
12316
            call_reloc_p = TRUE;
12317
            may_need_local_target_p = TRUE;
12318
            break;
12319
 
12320
          case R_ARM_ABS12:
12321
            /* VxWorks uses dynamic R_ARM_ABS12 relocations for
12322
               ldr __GOTT_INDEX__ offsets.  */
12323
            if (!htab->vxworks_p)
12324
              {
12325
                may_need_local_target_p = TRUE;
12326
                break;
12327
              }
12328
            /* Fall through.  */
12329
 
12330
          case R_ARM_MOVW_ABS_NC:
12331
          case R_ARM_MOVT_ABS:
12332
          case R_ARM_THM_MOVW_ABS_NC:
12333
          case R_ARM_THM_MOVT_ABS:
12334
            if (info->shared)
12335
              {
12336
                (*_bfd_error_handler)
12337
                  (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
12338
                   abfd, elf32_arm_howto_table_1[r_type].name,
12339
                   (h) ? h->root.root.string : "a local symbol");
12340
                bfd_set_error (bfd_error_bad_value);
12341
                return FALSE;
12342
              }
12343
 
12344
            /* Fall through.  */
12345
          case R_ARM_ABS32:
12346
          case R_ARM_ABS32_NOI:
12347
          case R_ARM_REL32:
12348
          case R_ARM_REL32_NOI:
12349
          case R_ARM_MOVW_PREL_NC:
12350
          case R_ARM_MOVT_PREL:
12351
          case R_ARM_THM_MOVW_PREL_NC:
12352
          case R_ARM_THM_MOVT_PREL:
12353
 
12354
            /* Should the interworking branches be listed here?  */
12355
            if ((info->shared || htab->root.is_relocatable_executable)
12356
                && (sec->flags & SEC_ALLOC) != 0)
12357
              {
12358
                if (h == NULL
12359
                    && (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI))
12360
                  {
12361
                    /* In shared libraries and relocatable executables,
12362
                       we treat local relative references as calls;
12363
                       see the related SYMBOL_CALLS_LOCAL code in
12364
                       allocate_dynrelocs.  */
12365
                    call_reloc_p = TRUE;
12366
                    may_need_local_target_p = TRUE;
12367
                  }
12368
                else
12369
                  /* We are creating a shared library or relocatable
12370
                     executable, and this is a reloc against a global symbol,
12371
                     or a non-PC-relative reloc against a local symbol.
12372
                     We may need to copy the reloc into the output.  */
12373
                  may_become_dynamic_p = TRUE;
12374
              }
12375
            else
12376
              may_need_local_target_p = TRUE;
12377
            break;
12378
 
12379
        /* This relocation describes the C++ object vtable hierarchy.
12380
           Reconstruct it for later use during GC.  */
12381
        case R_ARM_GNU_VTINHERIT:
12382
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
12383
            return FALSE;
12384
          break;
12385
 
12386
        /* This relocation describes which C++ vtable entries are actually
12387
           used.  Record for later use during GC.  */
12388
        case R_ARM_GNU_VTENTRY:
12389
          BFD_ASSERT (h != NULL);
12390
          if (h != NULL
12391
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
12392
            return FALSE;
12393
          break;
12394
        }
12395
 
12396
      if (h != NULL)
12397
        {
12398
          if (call_reloc_p)
12399
            /* We may need a .plt entry if the function this reloc
12400
               refers to is in a different object, regardless of the
12401
               symbol's type.  We can't tell for sure yet, because
12402
               something later might force the symbol local.  */
12403
            h->needs_plt = 1;
12404
          else if (may_need_local_target_p)
12405
            /* If this reloc is in a read-only section, we might
12406
               need a copy reloc.  We can't check reliably at this
12407
               stage whether the section is read-only, as input
12408
               sections have not yet been mapped to output sections.
12409
               Tentatively set the flag for now, and correct in
12410
               adjust_dynamic_symbol.  */
12411
            h->non_got_ref = 1;
12412
        }
12413
 
12414
      if (may_need_local_target_p
12415
          && (h != NULL || ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC))
12416
        {
12417
          union gotplt_union *root_plt;
12418
          struct arm_plt_info *arm_plt;
12419
          struct arm_local_iplt_info *local_iplt;
12420
 
12421
          if (h != NULL)
12422
            {
12423
              root_plt = &h->plt;
12424
              arm_plt = &eh->plt;
12425
            }
12426
          else
12427
            {
12428
              local_iplt = elf32_arm_create_local_iplt (abfd, r_symndx);
12429
              if (local_iplt == NULL)
12430
                return FALSE;
12431
              root_plt = &local_iplt->root;
12432
              arm_plt = &local_iplt->arm;
12433
            }
12434
 
12435
          /* If the symbol is a function that doesn't bind locally,
12436
             this relocation will need a PLT entry.  */
12437
          root_plt->refcount += 1;
12438
 
12439
          if (!call_reloc_p)
12440
            arm_plt->noncall_refcount++;
12441
 
12442
          /* It's too early to use htab->use_blx here, so we have to
12443
             record possible blx references separately from
12444
             relocs that definitely need a thumb stub.  */
12445
 
12446
          if (r_type == R_ARM_THM_CALL)
12447
            arm_plt->maybe_thumb_refcount += 1;
12448
 
12449
          if (r_type == R_ARM_THM_JUMP24
12450
              || r_type == R_ARM_THM_JUMP19)
12451
            arm_plt->thumb_refcount += 1;
12452
        }
12453
 
12454
      if (may_become_dynamic_p)
12455
        {
12456
          struct elf_dyn_relocs *p, **head;
12457
 
12458
          /* Create a reloc section in dynobj.  */
12459
          if (sreloc == NULL)
12460
            {
12461
              sreloc = _bfd_elf_make_dynamic_reloc_section
12462
                (sec, dynobj, 2, abfd, ! htab->use_rel);
12463
 
12464
              if (sreloc == NULL)
12465
                return FALSE;
12466
 
12467
              /* BPABI objects never have dynamic relocations mapped.  */
12468
              if (htab->symbian_p)
12469
                {
12470
                  flagword flags;
12471
 
12472
                  flags = bfd_get_section_flags (dynobj, sreloc);
12473
                  flags &= ~(SEC_LOAD | SEC_ALLOC);
12474
                  bfd_set_section_flags (dynobj, sreloc, flags);
12475
                }
12476
            }
12477
 
12478
          /* If this is a global symbol, count the number of
12479
             relocations we need for this symbol.  */
12480
          if (h != NULL)
12481
            head = &((struct elf32_arm_link_hash_entry *) h)->dyn_relocs;
12482
          else
12483
            {
12484
              head = elf32_arm_get_local_dynreloc_list (abfd, r_symndx, isym);
12485
              if (head == NULL)
12486
                return FALSE;
12487
            }
12488
 
12489
          p = *head;
12490
          if (p == NULL || p->sec != sec)
12491
            {
12492
              bfd_size_type amt = sizeof *p;
12493
 
12494
              p = (struct elf_dyn_relocs *) bfd_alloc (htab->root.dynobj, amt);
12495
              if (p == NULL)
12496
                return FALSE;
12497
              p->next = *head;
12498
              *head = p;
12499
              p->sec = sec;
12500
              p->count = 0;
12501
              p->pc_count = 0;
12502
            }
12503
 
12504
          if (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
12505
            p->pc_count += 1;
12506
          p->count += 1;
12507
        }
12508
    }
12509
 
12510
  return TRUE;
12511
}
12512
 
12513
/* Unwinding tables are not referenced directly.  This pass marks them as
12514
   required if the corresponding code section is marked.  */
12515
 
12516
static bfd_boolean
12517
elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
12518
                                  elf_gc_mark_hook_fn gc_mark_hook)
12519
{
12520
  bfd *sub;
12521
  Elf_Internal_Shdr **elf_shdrp;
12522
  bfd_boolean again;
12523
 
12524 161 khays
  _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
12525
 
12526 14 khays
  /* Marking EH data may cause additional code sections to be marked,
12527
     requiring multiple passes.  */
12528
  again = TRUE;
12529
  while (again)
12530
    {
12531
      again = FALSE;
12532
      for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
12533
        {
12534
          asection *o;
12535
 
12536
          if (! is_arm_elf (sub))
12537
            continue;
12538
 
12539
          elf_shdrp = elf_elfsections (sub);
12540
          for (o = sub->sections; o != NULL; o = o->next)
12541
            {
12542
              Elf_Internal_Shdr *hdr;
12543
 
12544
              hdr = &elf_section_data (o)->this_hdr;
12545
              if (hdr->sh_type == SHT_ARM_EXIDX
12546
                  && hdr->sh_link
12547
                  && hdr->sh_link < elf_numsections (sub)
12548
                  && !o->gc_mark
12549
                  && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
12550
                {
12551
                  again = TRUE;
12552
                  if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
12553
                    return FALSE;
12554
                }
12555
            }
12556
        }
12557
    }
12558
 
12559
  return TRUE;
12560
}
12561
 
12562
/* Treat mapping symbols as special target symbols.  */
12563
 
12564
static bfd_boolean
12565
elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
12566
{
12567
  return bfd_is_arm_special_symbol_name (sym->name,
12568
                                         BFD_ARM_SPECIAL_SYM_TYPE_ANY);
12569
}
12570
 
12571
/* This is a copy of elf_find_function() from elf.c except that
12572
   ARM mapping symbols are ignored when looking for function names
12573
   and STT_ARM_TFUNC is considered to a function type.  */
12574
 
12575
static bfd_boolean
12576
arm_elf_find_function (bfd *         abfd ATTRIBUTE_UNUSED,
12577
                       asection *    section,
12578
                       asymbol **    symbols,
12579
                       bfd_vma       offset,
12580
                       const char ** filename_ptr,
12581
                       const char ** functionname_ptr)
12582
{
12583
  const char * filename = NULL;
12584
  asymbol * func = NULL;
12585
  bfd_vma low_func = 0;
12586
  asymbol ** p;
12587
 
12588
  for (p = symbols; *p != NULL; p++)
12589
    {
12590
      elf_symbol_type *q;
12591
 
12592
      q = (elf_symbol_type *) *p;
12593
 
12594
      switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
12595
        {
12596
        default:
12597
          break;
12598
        case STT_FILE:
12599
          filename = bfd_asymbol_name (&q->symbol);
12600
          break;
12601
        case STT_FUNC:
12602
        case STT_ARM_TFUNC:
12603
        case STT_NOTYPE:
12604
          /* Skip mapping symbols.  */
12605
          if ((q->symbol.flags & BSF_LOCAL)
12606
              && bfd_is_arm_special_symbol_name (q->symbol.name,
12607
                    BFD_ARM_SPECIAL_SYM_TYPE_ANY))
12608
            continue;
12609
          /* Fall through.  */
12610
          if (bfd_get_section (&q->symbol) == section
12611
              && q->symbol.value >= low_func
12612
              && q->symbol.value <= offset)
12613
            {
12614
              func = (asymbol *) q;
12615
              low_func = q->symbol.value;
12616
            }
12617
          break;
12618
        }
12619
    }
12620
 
12621
  if (func == NULL)
12622
    return FALSE;
12623
 
12624
  if (filename_ptr)
12625
    *filename_ptr = filename;
12626
  if (functionname_ptr)
12627
    *functionname_ptr = bfd_asymbol_name (func);
12628
 
12629
  return TRUE;
12630
}
12631
 
12632
 
12633
/* Find the nearest line to a particular section and offset, for error
12634
   reporting.   This code is a duplicate of the code in elf.c, except
12635
   that it uses arm_elf_find_function.  */
12636
 
12637
static bfd_boolean
12638
elf32_arm_find_nearest_line (bfd *          abfd,
12639
                             asection *     section,
12640
                             asymbol **     symbols,
12641
                             bfd_vma        offset,
12642
                             const char **  filename_ptr,
12643
                             const char **  functionname_ptr,
12644
                             unsigned int * line_ptr)
12645
{
12646
  bfd_boolean found = FALSE;
12647
 
12648
  /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it.  */
12649
 
12650 163 khays
  if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
12651
                                     section, symbols, offset,
12652 14 khays
                                     filename_ptr, functionname_ptr,
12653
                                     line_ptr, 0,
12654
                                     & elf_tdata (abfd)->dwarf2_find_line_info))
12655
    {
12656
      if (!*functionname_ptr)
12657
        arm_elf_find_function (abfd, section, symbols, offset,
12658
                               *filename_ptr ? NULL : filename_ptr,
12659
                               functionname_ptr);
12660
 
12661
      return TRUE;
12662
    }
12663
 
12664
  if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
12665
                                             & found, filename_ptr,
12666
                                             functionname_ptr, line_ptr,
12667
                                             & elf_tdata (abfd)->line_info))
12668
    return FALSE;
12669
 
12670
  if (found && (*functionname_ptr || *line_ptr))
12671
    return TRUE;
12672
 
12673
  if (symbols == NULL)
12674
    return FALSE;
12675
 
12676
  if (! arm_elf_find_function (abfd, section, symbols, offset,
12677
                               filename_ptr, functionname_ptr))
12678
    return FALSE;
12679
 
12680
  *line_ptr = 0;
12681
  return TRUE;
12682
}
12683
 
12684
static bfd_boolean
12685
elf32_arm_find_inliner_info (bfd *          abfd,
12686
                             const char **  filename_ptr,
12687
                             const char **  functionname_ptr,
12688
                             unsigned int * line_ptr)
12689
{
12690
  bfd_boolean found;
12691
  found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
12692
                                         functionname_ptr, line_ptr,
12693
                                         & elf_tdata (abfd)->dwarf2_find_line_info);
12694
  return found;
12695
}
12696
 
12697
/* Adjust a symbol defined by a dynamic object and referenced by a
12698
   regular object.  The current definition is in some section of the
12699
   dynamic object, but we're not including those sections.  We have to
12700
   change the definition to something the rest of the link can
12701
   understand.  */
12702
 
12703
static bfd_boolean
12704
elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
12705
                                 struct elf_link_hash_entry * h)
12706
{
12707
  bfd * dynobj;
12708
  asection * s;
12709
  struct elf32_arm_link_hash_entry * eh;
12710
  struct elf32_arm_link_hash_table *globals;
12711
 
12712
  globals = elf32_arm_hash_table (info);
12713
  if (globals == NULL)
12714
    return FALSE;
12715
 
12716
  dynobj = elf_hash_table (info)->dynobj;
12717
 
12718
  /* Make sure we know what is going on here.  */
12719
  BFD_ASSERT (dynobj != NULL
12720
              && (h->needs_plt
12721
                  || h->type == STT_GNU_IFUNC
12722
                  || h->u.weakdef != NULL
12723
                  || (h->def_dynamic
12724
                      && h->ref_regular
12725
                      && !h->def_regular)));
12726
 
12727
  eh = (struct elf32_arm_link_hash_entry *) h;
12728
 
12729
  /* If this is a function, put it in the procedure linkage table.  We
12730
     will fill in the contents of the procedure linkage table later,
12731
     when we know the address of the .got section.  */
12732
  if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
12733
    {
12734
      /* Calls to STT_GNU_IFUNC symbols always use a PLT, even if the
12735
         symbol binds locally.  */
12736
      if (h->plt.refcount <= 0
12737
          || (h->type != STT_GNU_IFUNC
12738
              && (SYMBOL_CALLS_LOCAL (info, h)
12739
                  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
12740
                      && h->root.type == bfd_link_hash_undefweak))))
12741
        {
12742
          /* This case can occur if we saw a PLT32 reloc in an input
12743
             file, but the symbol was never referred to by a dynamic
12744
             object, or if all references were garbage collected.  In
12745
             such a case, we don't actually need to build a procedure
12746
             linkage table, and we can just do a PC24 reloc instead.  */
12747
          h->plt.offset = (bfd_vma) -1;
12748
          eh->plt.thumb_refcount = 0;
12749
          eh->plt.maybe_thumb_refcount = 0;
12750
          eh->plt.noncall_refcount = 0;
12751
          h->needs_plt = 0;
12752
        }
12753
 
12754
      return TRUE;
12755
    }
12756
  else
12757
    {
12758
      /* It's possible that we incorrectly decided a .plt reloc was
12759
         needed for an R_ARM_PC24 or similar reloc to a non-function sym
12760
         in check_relocs.  We can't decide accurately between function
12761
         and non-function syms in check-relocs; Objects loaded later in
12762
         the link may change h->type.  So fix it now.  */
12763
      h->plt.offset = (bfd_vma) -1;
12764
      eh->plt.thumb_refcount = 0;
12765
      eh->plt.maybe_thumb_refcount = 0;
12766
      eh->plt.noncall_refcount = 0;
12767
    }
12768
 
12769
  /* If this is a weak symbol, and there is a real definition, the
12770
     processor independent code will have arranged for us to see the
12771
     real definition first, and we can just use the same value.  */
12772
  if (h->u.weakdef != NULL)
12773
    {
12774
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
12775
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
12776
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
12777
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
12778
      return TRUE;
12779
    }
12780
 
12781
  /* If there are no non-GOT references, we do not need a copy
12782
     relocation.  */
12783
  if (!h->non_got_ref)
12784
    return TRUE;
12785
 
12786
  /* This is a reference to a symbol defined by a dynamic object which
12787
     is not a function.  */
12788
 
12789
  /* If we are creating a shared library, we must presume that the
12790
     only references to the symbol are via the global offset table.
12791
     For such cases we need not do anything here; the relocations will
12792
     be handled correctly by relocate_section.  Relocatable executables
12793
     can reference data in shared objects directly, so we don't need to
12794
     do anything here.  */
12795
  if (info->shared || globals->root.is_relocatable_executable)
12796
    return TRUE;
12797
 
12798
  if (h->size == 0)
12799
    {
12800
      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
12801
                             h->root.root.string);
12802
      return TRUE;
12803
    }
12804
 
12805
  /* We must allocate the symbol in our .dynbss section, which will
12806
     become part of the .bss section of the executable.  There will be
12807
     an entry for this symbol in the .dynsym section.  The dynamic
12808
     object will contain position independent code, so all references
12809
     from the dynamic object to this symbol will go through the global
12810
     offset table.  The dynamic linker will use the .dynsym entry to
12811
     determine the address it must put in the global offset table, so
12812
     both the dynamic object and the regular object will refer to the
12813
     same memory location for the variable.  */
12814
  s = bfd_get_section_by_name (dynobj, ".dynbss");
12815
  BFD_ASSERT (s != NULL);
12816
 
12817
  /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
12818
     copy the initial value out of the dynamic object and into the
12819
     runtime process image.  We need to remember the offset into the
12820
     .rel(a).bss section we are going to use.  */
12821
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
12822
    {
12823
      asection *srel;
12824
 
12825
      srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (globals, ".bss"));
12826
      elf32_arm_allocate_dynrelocs (info, srel, 1);
12827
      h->needs_copy = 1;
12828
    }
12829
 
12830
  return _bfd_elf_adjust_dynamic_copy (h, s);
12831
}
12832
 
12833
/* Allocate space in .plt, .got and associated reloc sections for
12834
   dynamic relocs.  */
12835
 
12836
static bfd_boolean
12837
allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
12838
{
12839
  struct bfd_link_info *info;
12840
  struct elf32_arm_link_hash_table *htab;
12841
  struct elf32_arm_link_hash_entry *eh;
12842
  struct elf_dyn_relocs *p;
12843
 
12844
  if (h->root.type == bfd_link_hash_indirect)
12845
    return TRUE;
12846
 
12847
  eh = (struct elf32_arm_link_hash_entry *) h;
12848
 
12849
  info = (struct bfd_link_info *) inf;
12850
  htab = elf32_arm_hash_table (info);
12851
  if (htab == NULL)
12852
    return FALSE;
12853
 
12854
  if ((htab->root.dynamic_sections_created || h->type == STT_GNU_IFUNC)
12855
      && h->plt.refcount > 0)
12856
    {
12857
      /* Make sure this symbol is output as a dynamic symbol.
12858
         Undefined weak syms won't yet be marked as dynamic.  */
12859
      if (h->dynindx == -1
12860
          && !h->forced_local)
12861
        {
12862
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
12863
            return FALSE;
12864
        }
12865
 
12866
      /* If the call in the PLT entry binds locally, the associated
12867
         GOT entry should use an R_ARM_IRELATIVE relocation instead of
12868
         the usual R_ARM_JUMP_SLOT.  Put it in the .iplt section rather
12869
         than the .plt section.  */
12870
      if (h->type == STT_GNU_IFUNC && SYMBOL_CALLS_LOCAL (info, h))
12871
        {
12872
          eh->is_iplt = 1;
12873
          if (eh->plt.noncall_refcount == 0
12874
              && SYMBOL_REFERENCES_LOCAL (info, h))
12875
            /* All non-call references can be resolved directly.
12876
               This means that they can (and in some cases, must)
12877
               resolve directly to the run-time target, rather than
12878
               to the PLT.  That in turns means that any .got entry
12879
               would be equal to the .igot.plt entry, so there's
12880
               no point having both.  */
12881
            h->got.refcount = 0;
12882
        }
12883
 
12884
      if (info->shared
12885
          || eh->is_iplt
12886
          || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
12887
        {
12888
          elf32_arm_allocate_plt_entry (info, eh->is_iplt, &h->plt, &eh->plt);
12889
 
12890
          /* If this symbol is not defined in a regular file, and we are
12891
             not generating a shared library, then set the symbol to this
12892
             location in the .plt.  This is required to make function
12893
             pointers compare as equal between the normal executable and
12894
             the shared library.  */
12895
          if (! info->shared
12896
              && !h->def_regular)
12897
            {
12898
              h->root.u.def.section = htab->root.splt;
12899
              h->root.u.def.value = h->plt.offset;
12900
 
12901
              /* Make sure the function is not marked as Thumb, in case
12902
                 it is the target of an ABS32 relocation, which will
12903
                 point to the PLT entry.  */
12904
              h->target_internal = ST_BRANCH_TO_ARM;
12905
            }
12906
 
12907
          htab->next_tls_desc_index++;
12908
 
12909
          /* VxWorks executables have a second set of relocations for
12910
             each PLT entry.  They go in a separate relocation section,
12911
             which is processed by the kernel loader.  */
12912
          if (htab->vxworks_p && !info->shared)
12913
            {
12914
              /* There is a relocation for the initial PLT entry:
12915
                 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_.  */
12916
              if (h->plt.offset == htab->plt_header_size)
12917
                elf32_arm_allocate_dynrelocs (info, htab->srelplt2, 1);
12918
 
12919
              /* There are two extra relocations for each subsequent
12920
                 PLT entry: an R_ARM_32 relocation for the GOT entry,
12921
                 and an R_ARM_32 relocation for the PLT entry.  */
12922
              elf32_arm_allocate_dynrelocs (info, htab->srelplt2, 2);
12923
            }
12924
        }
12925
      else
12926
        {
12927
          h->plt.offset = (bfd_vma) -1;
12928
          h->needs_plt = 0;
12929
        }
12930
    }
12931
  else
12932
    {
12933
      h->plt.offset = (bfd_vma) -1;
12934
      h->needs_plt = 0;
12935
    }
12936
 
12937
  eh = (struct elf32_arm_link_hash_entry *) h;
12938
  eh->tlsdesc_got = (bfd_vma) -1;
12939
 
12940
  if (h->got.refcount > 0)
12941
    {
12942
      asection *s;
12943
      bfd_boolean dyn;
12944
      int tls_type = elf32_arm_hash_entry (h)->tls_type;
12945
      int indx;
12946
 
12947
      /* Make sure this symbol is output as a dynamic symbol.
12948
         Undefined weak syms won't yet be marked as dynamic.  */
12949
      if (h->dynindx == -1
12950
          && !h->forced_local)
12951
        {
12952
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
12953
            return FALSE;
12954
        }
12955
 
12956
      if (!htab->symbian_p)
12957
        {
12958
          s = htab->root.sgot;
12959
          h->got.offset = s->size;
12960
 
12961
          if (tls_type == GOT_UNKNOWN)
12962
            abort ();
12963
 
12964
          if (tls_type == GOT_NORMAL)
12965
            /* Non-TLS symbols need one GOT slot.  */
12966
            s->size += 4;
12967
          else
12968
            {
12969
              if (tls_type & GOT_TLS_GDESC)
12970
                {
12971
                  /* R_ARM_TLS_DESC needs 2 GOT slots.  */
12972
                  eh->tlsdesc_got
12973
                    = (htab->root.sgotplt->size
12974
                       - elf32_arm_compute_jump_table_size (htab));
12975
                  htab->root.sgotplt->size += 8;
12976
                  h->got.offset = (bfd_vma) -2;
12977
                  /* plt.got_offset needs to know there's a TLS_DESC
12978
                     reloc in the middle of .got.plt.  */
12979
                  htab->num_tls_desc++;
12980
                }
12981
 
12982
              if (tls_type & GOT_TLS_GD)
12983
                {
12984
                  /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots.  If
12985
                     the symbol is both GD and GDESC, got.offset may
12986
                     have been overwritten.  */
12987
                  h->got.offset = s->size;
12988
                  s->size += 8;
12989
                }
12990
 
12991
              if (tls_type & GOT_TLS_IE)
12992
                /* R_ARM_TLS_IE32 needs one GOT slot.  */
12993
                s->size += 4;
12994
            }
12995
 
12996
          dyn = htab->root.dynamic_sections_created;
12997
 
12998
          indx = 0;
12999
          if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
13000
              && (!info->shared
13001
                  || !SYMBOL_REFERENCES_LOCAL (info, h)))
13002
            indx = h->dynindx;
13003
 
13004
          if (tls_type != GOT_NORMAL
13005
              && (info->shared || indx != 0)
13006
              && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
13007
                  || h->root.type != bfd_link_hash_undefweak))
13008
            {
13009
              if (tls_type & GOT_TLS_IE)
13010
                elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
13011
 
13012
              if (tls_type & GOT_TLS_GD)
13013
                elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
13014
 
13015
              if (tls_type & GOT_TLS_GDESC)
13016
                {
13017
                  elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
13018
                  /* GDESC needs a trampoline to jump to.  */
13019
                  htab->tls_trampoline = -1;
13020
                }
13021
 
13022
              /* Only GD needs it.  GDESC just emits one relocation per
13023
                 2 entries.  */
13024
              if ((tls_type & GOT_TLS_GD) && indx != 0)
13025
                elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
13026
            }
13027
          else if (!SYMBOL_REFERENCES_LOCAL (info, h))
13028
            {
13029
              if (htab->root.dynamic_sections_created)
13030
                /* Reserve room for the GOT entry's R_ARM_GLOB_DAT relocation.  */
13031
                elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
13032
            }
13033
          else if (h->type == STT_GNU_IFUNC
13034
                   && eh->plt.noncall_refcount == 0)
13035
            /* No non-call references resolve the STT_GNU_IFUNC's PLT entry;
13036
               they all resolve dynamically instead.  Reserve room for the
13037
               GOT entry's R_ARM_IRELATIVE relocation.  */
13038
            elf32_arm_allocate_irelocs (info, htab->root.srelgot, 1);
13039
          else if (info->shared)
13040
            /* Reserve room for the GOT entry's R_ARM_RELATIVE relocation.  */
13041
            elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
13042
        }
13043
    }
13044
  else
13045
    h->got.offset = (bfd_vma) -1;
13046
 
13047
  /* Allocate stubs for exported Thumb functions on v4t.  */
13048
  if (!htab->use_blx && h->dynindx != -1
13049
      && h->def_regular
13050
      && h->target_internal == ST_BRANCH_TO_THUMB
13051
      && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
13052
    {
13053
      struct elf_link_hash_entry * th;
13054
      struct bfd_link_hash_entry * bh;
13055
      struct elf_link_hash_entry * myh;
13056
      char name[1024];
13057
      asection *s;
13058
      bh = NULL;
13059
      /* Create a new symbol to regist the real location of the function.  */
13060
      s = h->root.u.def.section;
13061
      sprintf (name, "__real_%s", h->root.root.string);
13062
      _bfd_generic_link_add_one_symbol (info, s->owner,
13063
                                        name, BSF_GLOBAL, s,
13064
                                        h->root.u.def.value,
13065
                                        NULL, TRUE, FALSE, &bh);
13066
 
13067
      myh = (struct elf_link_hash_entry *) bh;
13068
      myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
13069
      myh->forced_local = 1;
13070
      myh->target_internal = ST_BRANCH_TO_THUMB;
13071
      eh->export_glue = myh;
13072
      th = record_arm_to_thumb_glue (info, h);
13073
      /* Point the symbol at the stub.  */
13074
      h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
13075
      h->target_internal = ST_BRANCH_TO_ARM;
13076
      h->root.u.def.section = th->root.u.def.section;
13077
      h->root.u.def.value = th->root.u.def.value & ~1;
13078
    }
13079
 
13080
  if (eh->dyn_relocs == NULL)
13081
    return TRUE;
13082
 
13083
  /* In the shared -Bsymbolic case, discard space allocated for
13084
     dynamic pc-relative relocs against symbols which turn out to be
13085
     defined in regular objects.  For the normal shared case, discard
13086
     space for pc-relative relocs that have become local due to symbol
13087
     visibility changes.  */
13088
 
13089
  if (info->shared || htab->root.is_relocatable_executable)
13090
    {
13091
      /* The only relocs that use pc_count are R_ARM_REL32 and
13092
         R_ARM_REL32_NOI, which will appear on something like
13093
         ".long foo - .".  We want calls to protected symbols to resolve
13094
         directly to the function rather than going via the plt.  If people
13095
         want function pointer comparisons to work as expected then they
13096
         should avoid writing assembly like ".long foo - .".  */
13097
      if (SYMBOL_CALLS_LOCAL (info, h))
13098
        {
13099
          struct elf_dyn_relocs **pp;
13100
 
13101
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
13102
            {
13103
              p->count -= p->pc_count;
13104
              p->pc_count = 0;
13105
              if (p->count == 0)
13106
                *pp = p->next;
13107
              else
13108
                pp = &p->next;
13109
            }
13110
        }
13111
 
13112
      if (htab->vxworks_p)
13113
        {
13114
          struct elf_dyn_relocs **pp;
13115
 
13116
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
13117
            {
13118
              if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
13119
                *pp = p->next;
13120
              else
13121
                pp = &p->next;
13122
            }
13123
        }
13124
 
13125
      /* Also discard relocs on undefined weak syms with non-default
13126
         visibility.  */
13127
      if (eh->dyn_relocs != NULL
13128
          && h->root.type == bfd_link_hash_undefweak)
13129
        {
13130
          if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
13131
            eh->dyn_relocs = NULL;
13132
 
13133
          /* Make sure undefined weak symbols are output as a dynamic
13134
             symbol in PIEs.  */
13135
          else if (h->dynindx == -1
13136
                   && !h->forced_local)
13137
            {
13138
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
13139
                return FALSE;
13140
            }
13141
        }
13142
 
13143
      else if (htab->root.is_relocatable_executable && h->dynindx == -1
13144
               && h->root.type == bfd_link_hash_new)
13145
        {
13146
          /* Output absolute symbols so that we can create relocations
13147
             against them.  For normal symbols we output a relocation
13148
             against the section that contains them.  */
13149
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
13150
            return FALSE;
13151
        }
13152
 
13153
    }
13154
  else
13155
    {
13156
      /* For the non-shared case, discard space for relocs against
13157
         symbols which turn out to need copy relocs or are not
13158
         dynamic.  */
13159
 
13160
      if (!h->non_got_ref
13161
          && ((h->def_dynamic
13162
               && !h->def_regular)
13163
              || (htab->root.dynamic_sections_created
13164
                  && (h->root.type == bfd_link_hash_undefweak
13165
                      || h->root.type == bfd_link_hash_undefined))))
13166
        {
13167
          /* Make sure this symbol is output as a dynamic symbol.
13168
             Undefined weak syms won't yet be marked as dynamic.  */
13169
          if (h->dynindx == -1
13170
              && !h->forced_local)
13171
            {
13172
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
13173
                return FALSE;
13174
            }
13175
 
13176
          /* If that succeeded, we know we'll be keeping all the
13177
             relocs.  */
13178
          if (h->dynindx != -1)
13179
            goto keep;
13180
        }
13181
 
13182
      eh->dyn_relocs = NULL;
13183
 
13184
    keep: ;
13185
    }
13186
 
13187
  /* Finally, allocate space.  */
13188
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
13189
    {
13190
      asection *sreloc = elf_section_data (p->sec)->sreloc;
13191
      if (h->type == STT_GNU_IFUNC
13192
          && eh->plt.noncall_refcount == 0
13193
          && SYMBOL_REFERENCES_LOCAL (info, h))
13194
        elf32_arm_allocate_irelocs (info, sreloc, p->count);
13195
      else
13196
        elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
13197
    }
13198
 
13199
  return TRUE;
13200
}
13201
 
13202
/* Find any dynamic relocs that apply to read-only sections.  */
13203
 
13204
static bfd_boolean
13205
elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry * h, void * inf)
13206
{
13207
  struct elf32_arm_link_hash_entry * eh;
13208
  struct elf_dyn_relocs * p;
13209
 
13210
  eh = (struct elf32_arm_link_hash_entry *) h;
13211
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
13212
    {
13213
      asection *s = p->sec;
13214
 
13215
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
13216
        {
13217
          struct bfd_link_info *info = (struct bfd_link_info *) inf;
13218
 
13219
          info->flags |= DF_TEXTREL;
13220
 
13221
          /* Not an error, just cut short the traversal.  */
13222
          return FALSE;
13223
        }
13224
    }
13225
  return TRUE;
13226
}
13227
 
13228
void
13229
bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
13230
                                 int byteswap_code)
13231
{
13232
  struct elf32_arm_link_hash_table *globals;
13233
 
13234
  globals = elf32_arm_hash_table (info);
13235
  if (globals == NULL)
13236
    return;
13237
 
13238
  globals->byteswap_code = byteswap_code;
13239
}
13240
 
13241
/* Set the sizes of the dynamic sections.  */
13242
 
13243
static bfd_boolean
13244
elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
13245
                                 struct bfd_link_info * info)
13246
{
13247
  bfd * dynobj;
13248
  asection * s;
13249
  bfd_boolean plt;
13250
  bfd_boolean relocs;
13251
  bfd *ibfd;
13252
  struct elf32_arm_link_hash_table *htab;
13253
 
13254
  htab = elf32_arm_hash_table (info);
13255
  if (htab == NULL)
13256
    return FALSE;
13257
 
13258
  dynobj = elf_hash_table (info)->dynobj;
13259
  BFD_ASSERT (dynobj != NULL);
13260
  check_use_blx (htab);
13261
 
13262
  if (elf_hash_table (info)->dynamic_sections_created)
13263
    {
13264
      /* Set the contents of the .interp section to the interpreter.  */
13265
      if (info->executable)
13266
        {
13267
          s = bfd_get_section_by_name (dynobj, ".interp");
13268
          BFD_ASSERT (s != NULL);
13269
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
13270
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
13271
        }
13272
    }
13273
 
13274
  /* Set up .got offsets for local syms, and space for local dynamic
13275
     relocs.  */
13276
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
13277
    {
13278
      bfd_signed_vma *local_got;
13279
      bfd_signed_vma *end_local_got;
13280
      struct arm_local_iplt_info **local_iplt_ptr, *local_iplt;
13281
      char *local_tls_type;
13282
      bfd_vma *local_tlsdesc_gotent;
13283
      bfd_size_type locsymcount;
13284
      Elf_Internal_Shdr *symtab_hdr;
13285
      asection *srel;
13286
      bfd_boolean is_vxworks = htab->vxworks_p;
13287
      unsigned int symndx;
13288
 
13289
      if (! is_arm_elf (ibfd))
13290
        continue;
13291
 
13292
      for (s = ibfd->sections; s != NULL; s = s->next)
13293
        {
13294
          struct elf_dyn_relocs *p;
13295
 
13296
          for (p = (struct elf_dyn_relocs *)
13297
                   elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
13298
            {
13299
              if (!bfd_is_abs_section (p->sec)
13300
                  && bfd_is_abs_section (p->sec->output_section))
13301
                {
13302
                  /* Input section has been discarded, either because
13303
                     it is a copy of a linkonce section or due to
13304
                     linker script /DISCARD/, so we'll be discarding
13305
                     the relocs too.  */
13306
                }
13307
              else if (is_vxworks
13308
                       && strcmp (p->sec->output_section->name,
13309
                                  ".tls_vars") == 0)
13310
                {
13311
                  /* Relocations in vxworks .tls_vars sections are
13312
                     handled specially by the loader.  */
13313
                }
13314
              else if (p->count != 0)
13315
                {
13316
                  srel = elf_section_data (p->sec)->sreloc;
13317
                  elf32_arm_allocate_dynrelocs (info, srel, p->count);
13318
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
13319
                    info->flags |= DF_TEXTREL;
13320
                }
13321
            }
13322
        }
13323
 
13324
      local_got = elf_local_got_refcounts (ibfd);
13325
      if (!local_got)
13326
        continue;
13327
 
13328
      symtab_hdr = & elf_symtab_hdr (ibfd);
13329
      locsymcount = symtab_hdr->sh_info;
13330
      end_local_got = local_got + locsymcount;
13331
      local_iplt_ptr = elf32_arm_local_iplt (ibfd);
13332
      local_tls_type = elf32_arm_local_got_tls_type (ibfd);
13333
      local_tlsdesc_gotent = elf32_arm_local_tlsdesc_gotent (ibfd);
13334
      symndx = 0;
13335
      s = htab->root.sgot;
13336
      srel = htab->root.srelgot;
13337
      for (; local_got < end_local_got;
13338
           ++local_got, ++local_iplt_ptr, ++local_tls_type,
13339
           ++local_tlsdesc_gotent, ++symndx)
13340
        {
13341
          *local_tlsdesc_gotent = (bfd_vma) -1;
13342
          local_iplt = *local_iplt_ptr;
13343
          if (local_iplt != NULL)
13344
            {
13345
              struct elf_dyn_relocs *p;
13346
 
13347
              if (local_iplt->root.refcount > 0)
13348
                {
13349
                  elf32_arm_allocate_plt_entry (info, TRUE,
13350
                                                &local_iplt->root,
13351
                                                &local_iplt->arm);
13352
                  if (local_iplt->arm.noncall_refcount == 0)
13353
                    /* All references to the PLT are calls, so all
13354
                       non-call references can resolve directly to the
13355
                       run-time target.  This means that the .got entry
13356
                       would be the same as the .igot.plt entry, so there's
13357
                       no point creating both.  */
13358
                    *local_got = 0;
13359
                }
13360
              else
13361
                {
13362
                  BFD_ASSERT (local_iplt->arm.noncall_refcount == 0);
13363
                  local_iplt->root.offset = (bfd_vma) -1;
13364
                }
13365
 
13366
              for (p = local_iplt->dyn_relocs; p != NULL; p = p->next)
13367
                {
13368
                  asection *psrel;
13369
 
13370
                  psrel = elf_section_data (p->sec)->sreloc;
13371
                  if (local_iplt->arm.noncall_refcount == 0)
13372
                    elf32_arm_allocate_irelocs (info, psrel, p->count);
13373
                  else
13374
                    elf32_arm_allocate_dynrelocs (info, psrel, p->count);
13375
                }
13376
            }
13377
          if (*local_got > 0)
13378
            {
13379
              Elf_Internal_Sym *isym;
13380
 
13381
              *local_got = s->size;
13382
              if (*local_tls_type & GOT_TLS_GD)
13383
                /* TLS_GD relocs need an 8-byte structure in the GOT.  */
13384
                s->size += 8;
13385
              if (*local_tls_type & GOT_TLS_GDESC)
13386
                {
13387
                  *local_tlsdesc_gotent = htab->root.sgotplt->size
13388
                    - elf32_arm_compute_jump_table_size (htab);
13389
                  htab->root.sgotplt->size += 8;
13390
                  *local_got = (bfd_vma) -2;
13391
                  /* plt.got_offset needs to know there's a TLS_DESC
13392
                     reloc in the middle of .got.plt.  */
13393
                  htab->num_tls_desc++;
13394
                }
13395
              if (*local_tls_type & GOT_TLS_IE)
13396
                s->size += 4;
13397
 
13398
              if (*local_tls_type & GOT_NORMAL)
13399
                {
13400
                  /* If the symbol is both GD and GDESC, *local_got
13401
                     may have been overwritten.  */
13402
                  *local_got = s->size;
13403
                  s->size += 4;
13404
                }
13405
 
13406
              isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, symndx);
13407
              if (isym == NULL)
13408
                return FALSE;
13409
 
13410
              /* If all references to an STT_GNU_IFUNC PLT are calls,
13411
                 then all non-call references, including this GOT entry,
13412
                 resolve directly to the run-time target.  */
13413
              if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
13414
                  && (local_iplt == NULL
13415
                      || local_iplt->arm.noncall_refcount == 0))
13416
                elf32_arm_allocate_irelocs (info, srel, 1);
13417
              else if ((info->shared && !(*local_tls_type & GOT_TLS_GDESC))
13418
                       || *local_tls_type & GOT_TLS_GD)
13419
                elf32_arm_allocate_dynrelocs (info, srel, 1);
13420
 
13421
              if (info->shared && *local_tls_type & GOT_TLS_GDESC)
13422
                {
13423
                  elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
13424
                  htab->tls_trampoline = -1;
13425
                }
13426
            }
13427
          else
13428
            *local_got = (bfd_vma) -1;
13429
        }
13430
    }
13431
 
13432
  if (htab->tls_ldm_got.refcount > 0)
13433
    {
13434
      /* Allocate two GOT entries and one dynamic relocation (if necessary)
13435
         for R_ARM_TLS_LDM32 relocations.  */
13436
      htab->tls_ldm_got.offset = htab->root.sgot->size;
13437
      htab->root.sgot->size += 8;
13438
      if (info->shared)
13439
        elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
13440
    }
13441
  else
13442
    htab->tls_ldm_got.offset = -1;
13443
 
13444
  /* Allocate global sym .plt and .got entries, and space for global
13445
     sym dynamic relocs.  */
13446
  elf_link_hash_traverse (& htab->root, allocate_dynrelocs_for_symbol, info);
13447
 
13448
  /* Here we rummage through the found bfds to collect glue information.  */
13449
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
13450
    {
13451
      if (! is_arm_elf (ibfd))
13452
        continue;
13453
 
13454
      /* Initialise mapping tables for code/data.  */
13455
      bfd_elf32_arm_init_maps (ibfd);
13456
 
13457
      if (!bfd_elf32_arm_process_before_allocation (ibfd, info)
13458
          || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info))
13459
        /* xgettext:c-format */
13460
        _bfd_error_handler (_("Errors encountered processing file %s"),
13461
                            ibfd->filename);
13462
    }
13463
 
13464
  /* Allocate space for the glue sections now that we've sized them.  */
13465
  bfd_elf32_arm_allocate_interworking_sections (info);
13466
 
13467
  /* For every jump slot reserved in the sgotplt, reloc_count is
13468
     incremented.  However, when we reserve space for TLS descriptors,
13469
     it's not incremented, so in order to compute the space reserved
13470
     for them, it suffices to multiply the reloc count by the jump
13471
     slot size.  */
13472
  if (htab->root.srelplt)
13473
    htab->sgotplt_jump_table_size = elf32_arm_compute_jump_table_size(htab);
13474
 
13475
  if (htab->tls_trampoline)
13476
    {
13477
      if (htab->root.splt->size == 0)
13478
        htab->root.splt->size += htab->plt_header_size;
13479
 
13480
      htab->tls_trampoline = htab->root.splt->size;
13481
      htab->root.splt->size += htab->plt_entry_size;
13482
 
13483
      /* If we're not using lazy TLS relocations, don't generate the
13484
         PLT and GOT entries they require.  */
13485
      if (!(info->flags & DF_BIND_NOW))
13486
        {
13487
          htab->dt_tlsdesc_got = htab->root.sgot->size;
13488
          htab->root.sgot->size += 4;
13489
 
13490
          htab->dt_tlsdesc_plt = htab->root.splt->size;
13491
          htab->root.splt->size += 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline);
13492
        }
13493
    }
13494
 
13495
  /* The check_relocs and adjust_dynamic_symbol entry points have
13496
     determined the sizes of the various dynamic sections.  Allocate
13497
     memory for them.  */
13498
  plt = FALSE;
13499
  relocs = FALSE;
13500
  for (s = dynobj->sections; s != NULL; s = s->next)
13501
    {
13502
      const char * name;
13503
 
13504
      if ((s->flags & SEC_LINKER_CREATED) == 0)
13505
        continue;
13506
 
13507
      /* It's OK to base decisions on the section name, because none
13508
         of the dynobj section names depend upon the input files.  */
13509
      name = bfd_get_section_name (dynobj, s);
13510
 
13511
      if (s == htab->root.splt)
13512
        {
13513
          /* Remember whether there is a PLT.  */
13514
          plt = s->size != 0;
13515
        }
13516
      else if (CONST_STRNEQ (name, ".rel"))
13517
        {
13518
          if (s->size != 0)
13519
            {
13520
              /* Remember whether there are any reloc sections other
13521
                 than .rel(a).plt and .rela.plt.unloaded.  */
13522
              if (s != htab->root.srelplt && s != htab->srelplt2)
13523
                relocs = TRUE;
13524
 
13525
              /* We use the reloc_count field as a counter if we need
13526
                 to copy relocs into the output file.  */
13527
              s->reloc_count = 0;
13528
            }
13529
        }
13530
      else if (s != htab->root.sgot
13531
               && s != htab->root.sgotplt
13532
               && s != htab->root.iplt
13533
               && s != htab->root.igotplt
13534
               && s != htab->sdynbss)
13535
        {
13536
          /* It's not one of our sections, so don't allocate space.  */
13537
          continue;
13538
        }
13539
 
13540
      if (s->size == 0)
13541
        {
13542
          /* If we don't need this section, strip it from the
13543
             output file.  This is mostly to handle .rel(a).bss and
13544
             .rel(a).plt.  We must create both sections in
13545
             create_dynamic_sections, because they must be created
13546
             before the linker maps input sections to output
13547
             sections.  The linker does that before
13548
             adjust_dynamic_symbol is called, and it is that
13549
             function which decides whether anything needs to go
13550
             into these sections.  */
13551
          s->flags |= SEC_EXCLUDE;
13552
          continue;
13553
        }
13554
 
13555
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
13556
        continue;
13557
 
13558
      /* Allocate memory for the section contents.  */
13559
      s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
13560
      if (s->contents == NULL)
13561
        return FALSE;
13562
    }
13563
 
13564
  if (elf_hash_table (info)->dynamic_sections_created)
13565
    {
13566
      /* Add some entries to the .dynamic section.  We fill in the
13567
         values later, in elf32_arm_finish_dynamic_sections, but we
13568
         must add the entries now so that we get the correct size for
13569
         the .dynamic section.  The DT_DEBUG entry is filled in by the
13570
         dynamic linker and used by the debugger.  */
13571
#define add_dynamic_entry(TAG, VAL) \
13572
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
13573
 
13574
     if (info->executable)
13575
        {
13576
          if (!add_dynamic_entry (DT_DEBUG, 0))
13577
            return FALSE;
13578
        }
13579
 
13580
      if (plt)
13581
        {
13582
          if (   !add_dynamic_entry (DT_PLTGOT, 0)
13583
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
13584
              || !add_dynamic_entry (DT_PLTREL,
13585
                                     htab->use_rel ? DT_REL : DT_RELA)
13586
              || !add_dynamic_entry (DT_JMPREL, 0))
13587
            return FALSE;
13588
 
13589
          if (htab->dt_tlsdesc_plt &&
13590
                (!add_dynamic_entry (DT_TLSDESC_PLT,0)
13591
                 || !add_dynamic_entry (DT_TLSDESC_GOT,0)))
13592
            return FALSE;
13593
        }
13594
 
13595
      if (relocs)
13596
        {
13597
          if (htab->use_rel)
13598
            {
13599
              if (!add_dynamic_entry (DT_REL, 0)
13600
                  || !add_dynamic_entry (DT_RELSZ, 0)
13601
                  || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
13602
                return FALSE;
13603
            }
13604
          else
13605
            {
13606
              if (!add_dynamic_entry (DT_RELA, 0)
13607
                  || !add_dynamic_entry (DT_RELASZ, 0)
13608
                  || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
13609
                return FALSE;
13610
            }
13611
        }
13612
 
13613
      /* If any dynamic relocs apply to a read-only section,
13614
         then we need a DT_TEXTREL entry.  */
13615
      if ((info->flags & DF_TEXTREL) == 0)
13616
        elf_link_hash_traverse (& htab->root, elf32_arm_readonly_dynrelocs,
13617
                                info);
13618
 
13619
      if ((info->flags & DF_TEXTREL) != 0)
13620
        {
13621
          if (!add_dynamic_entry (DT_TEXTREL, 0))
13622
            return FALSE;
13623
        }
13624
      if (htab->vxworks_p
13625
          && !elf_vxworks_add_dynamic_entries (output_bfd, info))
13626
        return FALSE;
13627
    }
13628
#undef add_dynamic_entry
13629
 
13630
  return TRUE;
13631
}
13632
 
13633
/* Size sections even though they're not dynamic.  We use it to setup
13634
   _TLS_MODULE_BASE_, if needed.  */
13635
 
13636
static bfd_boolean
13637
elf32_arm_always_size_sections (bfd *output_bfd,
13638
                                struct bfd_link_info *info)
13639
{
13640
  asection *tls_sec;
13641
 
13642
  if (info->relocatable)
13643
    return TRUE;
13644
 
13645
  tls_sec = elf_hash_table (info)->tls_sec;
13646
 
13647
  if (tls_sec)
13648
    {
13649
      struct elf_link_hash_entry *tlsbase;
13650
 
13651
      tlsbase = elf_link_hash_lookup
13652
        (elf_hash_table (info), "_TLS_MODULE_BASE_", TRUE, TRUE, FALSE);
13653
 
13654
      if (tlsbase)
13655
        {
13656
          struct bfd_link_hash_entry *bh = NULL;
13657
          const struct elf_backend_data *bed
13658
            = get_elf_backend_data (output_bfd);
13659
 
13660
          if (!(_bfd_generic_link_add_one_symbol
13661
                (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
13662
                 tls_sec, 0, NULL, FALSE,
13663
                 bed->collect, &bh)))
13664
            return FALSE;
13665
 
13666
          tlsbase->type = STT_TLS;
13667
          tlsbase = (struct elf_link_hash_entry *)bh;
13668
          tlsbase->def_regular = 1;
13669
          tlsbase->other = STV_HIDDEN;
13670
          (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
13671
        }
13672
    }
13673
  return TRUE;
13674
}
13675
 
13676
/* Finish up dynamic symbol handling.  We set the contents of various
13677
   dynamic sections here.  */
13678
 
13679
static bfd_boolean
13680
elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
13681
                                 struct bfd_link_info * info,
13682
                                 struct elf_link_hash_entry * h,
13683
                                 Elf_Internal_Sym * sym)
13684
{
13685
  struct elf32_arm_link_hash_table *htab;
13686
  struct elf32_arm_link_hash_entry *eh;
13687
 
13688
  htab = elf32_arm_hash_table (info);
13689
  if (htab == NULL)
13690
    return FALSE;
13691
 
13692
  eh = (struct elf32_arm_link_hash_entry *) h;
13693
 
13694
  if (h->plt.offset != (bfd_vma) -1)
13695
    {
13696
      if (!eh->is_iplt)
13697
        {
13698
          BFD_ASSERT (h->dynindx != -1);
13699
          elf32_arm_populate_plt_entry (output_bfd, info, &h->plt, &eh->plt,
13700
                                        h->dynindx, 0);
13701
        }
13702
 
13703
      if (!h->def_regular)
13704
        {
13705
          /* Mark the symbol as undefined, rather than as defined in
13706
             the .plt section.  Leave the value alone.  */
13707
          sym->st_shndx = SHN_UNDEF;
13708
          /* If the symbol is weak, we do need to clear the value.
13709
             Otherwise, the PLT entry would provide a definition for
13710
             the symbol even if the symbol wasn't defined anywhere,
13711
             and so the symbol would never be NULL.  */
13712
          if (!h->ref_regular_nonweak)
13713
            sym->st_value = 0;
13714
        }
13715
      else if (eh->is_iplt && eh->plt.noncall_refcount != 0)
13716
        {
13717
          /* At least one non-call relocation references this .iplt entry,
13718
             so the .iplt entry is the function's canonical address.  */
13719
          sym->st_info = ELF_ST_INFO (ELF_ST_BIND (sym->st_info), STT_FUNC);
13720
          sym->st_target_internal = ST_BRANCH_TO_ARM;
13721
          sym->st_shndx = (_bfd_elf_section_from_bfd_section
13722
                           (output_bfd, htab->root.iplt->output_section));
13723
          sym->st_value = (h->plt.offset
13724
                           + htab->root.iplt->output_section->vma
13725
                           + htab->root.iplt->output_offset);
13726
        }
13727
    }
13728
 
13729
  if (h->needs_copy)
13730
    {
13731
      asection * s;
13732
      Elf_Internal_Rela rel;
13733
 
13734
      /* This symbol needs a copy reloc.  Set it up.  */
13735
      BFD_ASSERT (h->dynindx != -1
13736
                  && (h->root.type == bfd_link_hash_defined
13737
                      || h->root.type == bfd_link_hash_defweak));
13738
 
13739
      s = htab->srelbss;
13740
      BFD_ASSERT (s != NULL);
13741
 
13742
      rel.r_addend = 0;
13743
      rel.r_offset = (h->root.u.def.value
13744
                      + h->root.u.def.section->output_section->vma
13745
                      + h->root.u.def.section->output_offset);
13746
      rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
13747
      elf32_arm_add_dynreloc (output_bfd, info, s, &rel);
13748
    }
13749
 
13750
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
13751
     the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
13752
     to the ".got" section.  */
13753
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
13754
      || (!htab->vxworks_p && h == htab->root.hgot))
13755
    sym->st_shndx = SHN_ABS;
13756
 
13757
  return TRUE;
13758
}
13759
 
13760
static void
13761
arm_put_trampoline (struct elf32_arm_link_hash_table *htab, bfd *output_bfd,
13762
                    void *contents,
13763
                    const unsigned long *template, unsigned count)
13764
{
13765
  unsigned ix;
13766
 
13767
  for (ix = 0; ix != count; ix++)
13768
    {
13769
      unsigned long insn = template[ix];
13770
 
13771
      /* Emit mov pc,rx if bx is not permitted.  */
13772
      if (htab->fix_v4bx == 1 && (insn & 0x0ffffff0) == 0x012fff10)
13773
        insn = (insn & 0xf000000f) | 0x01a0f000;
13774
      put_arm_insn (htab, output_bfd, insn, (char *)contents + ix*4);
13775
    }
13776
}
13777
 
13778
/* Finish up the dynamic sections.  */
13779
 
13780
static bfd_boolean
13781
elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
13782
{
13783
  bfd * dynobj;
13784
  asection * sgot;
13785
  asection * sdyn;
13786
  struct elf32_arm_link_hash_table *htab;
13787
 
13788
  htab = elf32_arm_hash_table (info);
13789
  if (htab == NULL)
13790
    return FALSE;
13791
 
13792
  dynobj = elf_hash_table (info)->dynobj;
13793
 
13794
  sgot = htab->root.sgotplt;
13795 148 khays
  /* A broken linker script might have discarded the dynamic sections.
13796
     Catch this here so that we do not seg-fault later on.  */
13797
  if (sgot != NULL && bfd_is_abs_section (sgot->output_section))
13798
    return FALSE;
13799 14 khays
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
13800
 
13801
  if (elf_hash_table (info)->dynamic_sections_created)
13802
    {
13803
      asection *splt;
13804
      Elf32_External_Dyn *dyncon, *dynconend;
13805
 
13806
      splt = htab->root.splt;
13807
      BFD_ASSERT (splt != NULL && sdyn != NULL);
13808
      BFD_ASSERT (htab->symbian_p || sgot != NULL);
13809
 
13810
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
13811
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
13812
 
13813
      for (; dyncon < dynconend; dyncon++)
13814
        {
13815
          Elf_Internal_Dyn dyn;
13816
          const char * name;
13817
          asection * s;
13818
 
13819
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
13820
 
13821
          switch (dyn.d_tag)
13822
            {
13823
              unsigned int type;
13824
 
13825
            default:
13826
              if (htab->vxworks_p
13827
                  && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
13828
                bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13829
              break;
13830
 
13831
            case DT_HASH:
13832
              name = ".hash";
13833
              goto get_vma_if_bpabi;
13834
            case DT_STRTAB:
13835
              name = ".dynstr";
13836
              goto get_vma_if_bpabi;
13837
            case DT_SYMTAB:
13838
              name = ".dynsym";
13839
              goto get_vma_if_bpabi;
13840
            case DT_VERSYM:
13841
              name = ".gnu.version";
13842
              goto get_vma_if_bpabi;
13843
            case DT_VERDEF:
13844
              name = ".gnu.version_d";
13845
              goto get_vma_if_bpabi;
13846
            case DT_VERNEED:
13847
              name = ".gnu.version_r";
13848
              goto get_vma_if_bpabi;
13849
 
13850
            case DT_PLTGOT:
13851
              name = ".got";
13852
              goto get_vma;
13853
            case DT_JMPREL:
13854
              name = RELOC_SECTION (htab, ".plt");
13855
            get_vma:
13856
              s = bfd_get_section_by_name (output_bfd, name);
13857
              BFD_ASSERT (s != NULL);
13858
              if (!htab->symbian_p)
13859
                dyn.d_un.d_ptr = s->vma;
13860
              else
13861
                /* In the BPABI, tags in the PT_DYNAMIC section point
13862
                   at the file offset, not the memory address, for the
13863
                   convenience of the post linker.  */
13864
                dyn.d_un.d_ptr = s->filepos;
13865
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13866
              break;
13867
 
13868
            get_vma_if_bpabi:
13869
              if (htab->symbian_p)
13870
                goto get_vma;
13871
              break;
13872
 
13873
            case DT_PLTRELSZ:
13874
              s = htab->root.srelplt;
13875
              BFD_ASSERT (s != NULL);
13876
              dyn.d_un.d_val = s->size;
13877
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13878
              break;
13879
 
13880
            case DT_RELSZ:
13881
            case DT_RELASZ:
13882
              if (!htab->symbian_p)
13883
                {
13884
                  /* My reading of the SVR4 ABI indicates that the
13885
                     procedure linkage table relocs (DT_JMPREL) should be
13886
                     included in the overall relocs (DT_REL).  This is
13887
                     what Solaris does.  However, UnixWare can not handle
13888
                     that case.  Therefore, we override the DT_RELSZ entry
13889
                     here to make it not include the JMPREL relocs.  Since
13890
                     the linker script arranges for .rel(a).plt to follow all
13891
                     other relocation sections, we don't have to worry
13892
                     about changing the DT_REL entry.  */
13893
                  s = htab->root.srelplt;
13894
                  if (s != NULL)
13895
                    dyn.d_un.d_val -= s->size;
13896
                  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13897
                  break;
13898
                }
13899
              /* Fall through.  */
13900
 
13901
            case DT_REL:
13902
            case DT_RELA:
13903
              /* In the BPABI, the DT_REL tag must point at the file
13904
                 offset, not the VMA, of the first relocation
13905
                 section.  So, we use code similar to that in
13906
                 elflink.c, but do not check for SHF_ALLOC on the
13907
                 relcoation section, since relocations sections are
13908
                 never allocated under the BPABI.  The comments above
13909
                 about Unixware notwithstanding, we include all of the
13910
                 relocations here.  */
13911
              if (htab->symbian_p)
13912
                {
13913
                  unsigned int i;
13914
                  type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
13915
                          ? SHT_REL : SHT_RELA);
13916
                  dyn.d_un.d_val = 0;
13917
                  for (i = 1; i < elf_numsections (output_bfd); i++)
13918
                    {
13919
                      Elf_Internal_Shdr *hdr
13920
                        = elf_elfsections (output_bfd)[i];
13921
                      if (hdr->sh_type == type)
13922
                        {
13923
                          if (dyn.d_tag == DT_RELSZ
13924
                              || dyn.d_tag == DT_RELASZ)
13925
                            dyn.d_un.d_val += hdr->sh_size;
13926
                          else if ((ufile_ptr) hdr->sh_offset
13927
                                   <= dyn.d_un.d_val - 1)
13928
                            dyn.d_un.d_val = hdr->sh_offset;
13929
                        }
13930
                    }
13931
                  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13932
                }
13933
              break;
13934
 
13935
            case DT_TLSDESC_PLT:
13936
              s = htab->root.splt;
13937
              dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
13938
                                + htab->dt_tlsdesc_plt);
13939
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13940
              break;
13941
 
13942
            case DT_TLSDESC_GOT:
13943
              s = htab->root.sgot;
13944
              dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
13945
                                + htab->dt_tlsdesc_got);
13946
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13947
              break;
13948
 
13949
              /* Set the bottom bit of DT_INIT/FINI if the
13950
                 corresponding function is Thumb.  */
13951
            case DT_INIT:
13952
              name = info->init_function;
13953
              goto get_sym;
13954
            case DT_FINI:
13955
              name = info->fini_function;
13956
            get_sym:
13957
              /* If it wasn't set by elf_bfd_final_link
13958
                 then there is nothing to adjust.  */
13959
              if (dyn.d_un.d_val != 0)
13960
                {
13961
                  struct elf_link_hash_entry * eh;
13962
 
13963
                  eh = elf_link_hash_lookup (elf_hash_table (info), name,
13964
                                             FALSE, FALSE, TRUE);
13965
                  if (eh != NULL && eh->target_internal == ST_BRANCH_TO_THUMB)
13966
                    {
13967
                      dyn.d_un.d_val |= 1;
13968
                      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
13969
                    }
13970
                }
13971
              break;
13972
            }
13973
        }
13974
 
13975
      /* Fill in the first entry in the procedure linkage table.  */
13976
      if (splt->size > 0 && htab->plt_header_size)
13977
        {
13978
          const bfd_vma *plt0_entry;
13979
          bfd_vma got_address, plt_address, got_displacement;
13980
 
13981
          /* Calculate the addresses of the GOT and PLT.  */
13982
          got_address = sgot->output_section->vma + sgot->output_offset;
13983
          plt_address = splt->output_section->vma + splt->output_offset;
13984
 
13985
          if (htab->vxworks_p)
13986
            {
13987
              /* The VxWorks GOT is relocated by the dynamic linker.
13988
                 Therefore, we must emit relocations rather than simply
13989
                 computing the values now.  */
13990
              Elf_Internal_Rela rel;
13991
 
13992
              plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
13993
              put_arm_insn (htab, output_bfd, plt0_entry[0],
13994
                            splt->contents + 0);
13995
              put_arm_insn (htab, output_bfd, plt0_entry[1],
13996
                            splt->contents + 4);
13997
              put_arm_insn (htab, output_bfd, plt0_entry[2],
13998
                            splt->contents + 8);
13999
              bfd_put_32 (output_bfd, got_address, splt->contents + 12);
14000
 
14001
              /* Generate a relocation for _GLOBAL_OFFSET_TABLE_.  */
14002
              rel.r_offset = plt_address + 12;
14003
              rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
14004
              rel.r_addend = 0;
14005
              SWAP_RELOC_OUT (htab) (output_bfd, &rel,
14006
                                     htab->srelplt2->contents);
14007
            }
14008
          else
14009
            {
14010
              got_displacement = got_address - (plt_address + 16);
14011
 
14012
              plt0_entry = elf32_arm_plt0_entry;
14013
              put_arm_insn (htab, output_bfd, plt0_entry[0],
14014
                            splt->contents + 0);
14015
              put_arm_insn (htab, output_bfd, plt0_entry[1],
14016
                            splt->contents + 4);
14017
              put_arm_insn (htab, output_bfd, plt0_entry[2],
14018
                            splt->contents + 8);
14019
              put_arm_insn (htab, output_bfd, plt0_entry[3],
14020
                            splt->contents + 12);
14021
 
14022
#ifdef FOUR_WORD_PLT
14023
              /* The displacement value goes in the otherwise-unused
14024
                 last word of the second entry.  */
14025
              bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
14026
#else
14027
              bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
14028
#endif
14029
            }
14030
        }
14031
 
14032
      /* UnixWare sets the entsize of .plt to 4, although that doesn't
14033
         really seem like the right value.  */
14034
      if (splt->output_section->owner == output_bfd)
14035
        elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
14036
 
14037
      if (htab->dt_tlsdesc_plt)
14038
        {
14039
          bfd_vma got_address
14040
            = sgot->output_section->vma + sgot->output_offset;
14041
          bfd_vma gotplt_address = (htab->root.sgot->output_section->vma
14042
                                    + htab->root.sgot->output_offset);
14043
          bfd_vma plt_address
14044
            = splt->output_section->vma + splt->output_offset;
14045
 
14046
          arm_put_trampoline (htab, output_bfd,
14047
                              splt->contents + htab->dt_tlsdesc_plt,
14048
                              dl_tlsdesc_lazy_trampoline, 6);
14049
 
14050
          bfd_put_32 (output_bfd,
14051
                      gotplt_address + htab->dt_tlsdesc_got
14052
                      - (plt_address + htab->dt_tlsdesc_plt)
14053
                      - dl_tlsdesc_lazy_trampoline[6],
14054
                      splt->contents + htab->dt_tlsdesc_plt + 24);
14055
          bfd_put_32 (output_bfd,
14056
                      got_address - (plt_address + htab->dt_tlsdesc_plt)
14057
                      - dl_tlsdesc_lazy_trampoline[7],
14058
                      splt->contents + htab->dt_tlsdesc_plt + 24 + 4);
14059
        }
14060
 
14061
      if (htab->tls_trampoline)
14062
        {
14063
          arm_put_trampoline (htab, output_bfd,
14064
                              splt->contents + htab->tls_trampoline,
14065
                              tls_trampoline, 3);
14066
#ifdef FOUR_WORD_PLT
14067
          bfd_put_32 (output_bfd, 0x00000000,
14068
                      splt->contents + htab->tls_trampoline + 12);
14069
#endif 
14070
        }
14071
 
14072
      if (htab->vxworks_p && !info->shared && htab->root.splt->size > 0)
14073
        {
14074
          /* Correct the .rel(a).plt.unloaded relocations.  They will have
14075
             incorrect symbol indexes.  */
14076
          int num_plts;
14077
          unsigned char *p;
14078
 
14079
          num_plts = ((htab->root.splt->size - htab->plt_header_size)
14080
                      / htab->plt_entry_size);
14081
          p = htab->srelplt2->contents + RELOC_SIZE (htab);
14082
 
14083
          for (; num_plts; num_plts--)
14084
            {
14085
              Elf_Internal_Rela rel;
14086
 
14087
              SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
14088
              rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
14089
              SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
14090
              p += RELOC_SIZE (htab);
14091
 
14092
              SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
14093
              rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
14094
              SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
14095
              p += RELOC_SIZE (htab);
14096
            }
14097
        }
14098
    }
14099
 
14100
  /* Fill in the first three entries in the global offset table.  */
14101
  if (sgot)
14102
    {
14103
      if (sgot->size > 0)
14104
        {
14105
          if (sdyn == NULL)
14106
            bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
14107
          else
14108
            bfd_put_32 (output_bfd,
14109
                        sdyn->output_section->vma + sdyn->output_offset,
14110
                        sgot->contents);
14111
          bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
14112
          bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
14113
        }
14114
 
14115
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
14116
    }
14117
 
14118
  return TRUE;
14119
}
14120
 
14121
static void
14122
elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
14123
{
14124
  Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
14125
  struct elf32_arm_link_hash_table *globals;
14126
 
14127
  i_ehdrp = elf_elfheader (abfd);
14128
 
14129
  if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
14130
    i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
14131
  else
14132
    i_ehdrp->e_ident[EI_OSABI] = 0;
14133
  i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
14134
 
14135
  if (link_info)
14136
    {
14137
      globals = elf32_arm_hash_table (link_info);
14138
      if (globals != NULL && globals->byteswap_code)
14139
        i_ehdrp->e_flags |= EF_ARM_BE8;
14140
    }
14141
}
14142
 
14143
static enum elf_reloc_type_class
14144
elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
14145
{
14146
  switch ((int) ELF32_R_TYPE (rela->r_info))
14147
    {
14148
    case R_ARM_RELATIVE:
14149
      return reloc_class_relative;
14150
    case R_ARM_JUMP_SLOT:
14151
      return reloc_class_plt;
14152
    case R_ARM_COPY:
14153
      return reloc_class_copy;
14154
    default:
14155
      return reloc_class_normal;
14156
    }
14157
}
14158
 
14159
static void
14160
elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
14161
{
14162
  bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
14163
}
14164
 
14165
/* Return TRUE if this is an unwinding table entry.  */
14166
 
14167
static bfd_boolean
14168
is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
14169
{
14170
  return (CONST_STRNEQ (name, ELF_STRING_ARM_unwind)
14171
          || CONST_STRNEQ (name, ELF_STRING_ARM_unwind_once));
14172
}
14173
 
14174
 
14175
/* Set the type and flags for an ARM section.  We do this by
14176
   the section name, which is a hack, but ought to work.  */
14177
 
14178
static bfd_boolean
14179
elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
14180
{
14181
  const char * name;
14182
 
14183
  name = bfd_get_section_name (abfd, sec);
14184
 
14185
  if (is_arm_elf_unwind_section_name (abfd, name))
14186
    {
14187
      hdr->sh_type = SHT_ARM_EXIDX;
14188
      hdr->sh_flags |= SHF_LINK_ORDER;
14189
    }
14190
  return TRUE;
14191
}
14192
 
14193
/* Handle an ARM specific section when reading an object file.  This is
14194
   called when bfd_section_from_shdr finds a section with an unknown
14195
   type.  */
14196
 
14197
static bfd_boolean
14198
elf32_arm_section_from_shdr (bfd *abfd,
14199
                             Elf_Internal_Shdr * hdr,
14200
                             const char *name,
14201
                             int shindex)
14202
{
14203
  /* There ought to be a place to keep ELF backend specific flags, but
14204
     at the moment there isn't one.  We just keep track of the
14205
     sections by their name, instead.  Fortunately, the ABI gives
14206
     names for all the ARM specific sections, so we will probably get
14207
     away with this.  */
14208
  switch (hdr->sh_type)
14209
    {
14210
    case SHT_ARM_EXIDX:
14211
    case SHT_ARM_PREEMPTMAP:
14212
    case SHT_ARM_ATTRIBUTES:
14213
      break;
14214
 
14215
    default:
14216
      return FALSE;
14217
    }
14218
 
14219
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
14220
    return FALSE;
14221
 
14222
  return TRUE;
14223
}
14224
 
14225
static _arm_elf_section_data *
14226
get_arm_elf_section_data (asection * sec)
14227
{
14228
  if (sec && sec->owner && is_arm_elf (sec->owner))
14229
    return elf32_arm_section_data (sec);
14230
  else
14231
    return NULL;
14232
}
14233
 
14234
typedef struct
14235
{
14236
  void *finfo;
14237
  struct bfd_link_info *info;
14238
  asection *sec;
14239
  int sec_shndx;
14240
  int (*func) (void *, const char *, Elf_Internal_Sym *,
14241
               asection *, struct elf_link_hash_entry *);
14242
} output_arch_syminfo;
14243
 
14244
enum map_symbol_type
14245
{
14246
  ARM_MAP_ARM,
14247
  ARM_MAP_THUMB,
14248
  ARM_MAP_DATA
14249
};
14250
 
14251
 
14252
/* Output a single mapping symbol.  */
14253
 
14254
static bfd_boolean
14255
elf32_arm_output_map_sym (output_arch_syminfo *osi,
14256
                          enum map_symbol_type type,
14257
                          bfd_vma offset)
14258
{
14259
  static const char *names[3] = {"$a", "$t", "$d"};
14260
  Elf_Internal_Sym sym;
14261
 
14262
  sym.st_value = osi->sec->output_section->vma
14263
                 + osi->sec->output_offset
14264
                 + offset;
14265
  sym.st_size = 0;
14266
  sym.st_other = 0;
14267
  sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
14268
  sym.st_shndx = osi->sec_shndx;
14269
  sym.st_target_internal = 0;
14270
  elf32_arm_section_map_add (osi->sec, names[type][1], offset);
14271
  return osi->func (osi->finfo, names[type], &sym, osi->sec, NULL) == 1;
14272
}
14273
 
14274
/* Output mapping symbols for the PLT entry described by ROOT_PLT and ARM_PLT.
14275
   IS_IPLT_ENTRY_P says whether the PLT is in .iplt rather than .plt.  */
14276
 
14277
static bfd_boolean
14278
elf32_arm_output_plt_map_1 (output_arch_syminfo *osi,
14279
                            bfd_boolean is_iplt_entry_p,
14280
                            union gotplt_union *root_plt,
14281
                            struct arm_plt_info *arm_plt)
14282
{
14283
  struct elf32_arm_link_hash_table *htab;
14284
  bfd_vma addr, plt_header_size;
14285
 
14286
  if (root_plt->offset == (bfd_vma) -1)
14287
    return TRUE;
14288
 
14289
  htab = elf32_arm_hash_table (osi->info);
14290
  if (htab == NULL)
14291
    return FALSE;
14292
 
14293
  if (is_iplt_entry_p)
14294
    {
14295
      osi->sec = htab->root.iplt;
14296
      plt_header_size = 0;
14297
    }
14298
  else
14299
    {
14300
      osi->sec = htab->root.splt;
14301
      plt_header_size = htab->plt_header_size;
14302
    }
14303
  osi->sec_shndx = (_bfd_elf_section_from_bfd_section
14304
                    (osi->info->output_bfd, osi->sec->output_section));
14305
 
14306
  addr = root_plt->offset & -2;
14307
  if (htab->symbian_p)
14308
    {
14309
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
14310
        return FALSE;
14311
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
14312
        return FALSE;
14313
    }
14314
  else if (htab->vxworks_p)
14315
    {
14316
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
14317
        return FALSE;
14318
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
14319
        return FALSE;
14320
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 12))
14321
        return FALSE;
14322
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
14323
        return FALSE;
14324
    }
14325
  else
14326
    {
14327
      bfd_boolean thumb_stub_p;
14328
 
14329
      thumb_stub_p = elf32_arm_plt_needs_thumb_stub_p (osi->info, arm_plt);
14330
      if (thumb_stub_p)
14331
        {
14332
          if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
14333
            return FALSE;
14334
        }
14335
#ifdef FOUR_WORD_PLT
14336
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
14337
        return FALSE;
14338
      if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
14339
        return FALSE;
14340
#else
14341
      /* A three-word PLT with no Thumb thunk contains only Arm code,
14342
         so only need to output a mapping symbol for the first PLT entry and
14343
         entries with thumb thunks.  */
14344
      if (thumb_stub_p || addr == plt_header_size)
14345
        {
14346
          if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
14347
            return FALSE;
14348
        }
14349
#endif
14350
    }
14351
 
14352
  return TRUE;
14353
}
14354
 
14355
/* Output mapping symbols for PLT entries associated with H.  */
14356
 
14357
static bfd_boolean
14358
elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
14359
{
14360
  output_arch_syminfo *osi = (output_arch_syminfo *) inf;
14361
  struct elf32_arm_link_hash_entry *eh;
14362
 
14363
  if (h->root.type == bfd_link_hash_indirect)
14364
    return TRUE;
14365
 
14366
  if (h->root.type == bfd_link_hash_warning)
14367
    /* When warning symbols are created, they **replace** the "real"
14368
       entry in the hash table, thus we never get to see the real
14369
       symbol in a hash traversal.  So look at it now.  */
14370
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
14371
 
14372
  eh = (struct elf32_arm_link_hash_entry *) h;
14373
  return elf32_arm_output_plt_map_1 (osi, SYMBOL_CALLS_LOCAL (osi->info, h),
14374
                                     &h->plt, &eh->plt);
14375
}
14376
 
14377
/* Output a single local symbol for a generated stub.  */
14378
 
14379
static bfd_boolean
14380
elf32_arm_output_stub_sym (output_arch_syminfo *osi, const char *name,
14381
                           bfd_vma offset, bfd_vma size)
14382
{
14383
  Elf_Internal_Sym sym;
14384
 
14385
  sym.st_value = osi->sec->output_section->vma
14386
                 + osi->sec->output_offset
14387
                 + offset;
14388
  sym.st_size = size;
14389
  sym.st_other = 0;
14390
  sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
14391
  sym.st_shndx = osi->sec_shndx;
14392
  sym.st_target_internal = 0;
14393
  return osi->func (osi->finfo, name, &sym, osi->sec, NULL) == 1;
14394
}
14395
 
14396
static bfd_boolean
14397
arm_map_one_stub (struct bfd_hash_entry * gen_entry,
14398
                  void * in_arg)
14399
{
14400
  struct elf32_arm_stub_hash_entry *stub_entry;
14401
  asection *stub_sec;
14402
  bfd_vma addr;
14403
  char *stub_name;
14404
  output_arch_syminfo *osi;
14405
  const insn_sequence *template_sequence;
14406
  enum stub_insn_type prev_type;
14407
  int size;
14408
  int i;
14409
  enum map_symbol_type sym_type;
14410
 
14411
  /* Massage our args to the form they really have.  */
14412
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
14413
  osi = (output_arch_syminfo *) in_arg;
14414
 
14415
  stub_sec = stub_entry->stub_sec;
14416
 
14417
  /* Ensure this stub is attached to the current section being
14418
     processed.  */
14419
  if (stub_sec != osi->sec)
14420
    return TRUE;
14421
 
14422
  addr = (bfd_vma) stub_entry->stub_offset;
14423
  stub_name = stub_entry->output_name;
14424
 
14425
  template_sequence = stub_entry->stub_template;
14426
  switch (template_sequence[0].type)
14427
    {
14428
    case ARM_TYPE:
14429
      if (!elf32_arm_output_stub_sym (osi, stub_name, addr, stub_entry->stub_size))
14430
        return FALSE;
14431
      break;
14432
    case THUMB16_TYPE:
14433
    case THUMB32_TYPE:
14434
      if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1,
14435
                                      stub_entry->stub_size))
14436
        return FALSE;
14437
      break;
14438
    default:
14439
      BFD_FAIL ();
14440
      return 0;
14441
    }
14442
 
14443
  prev_type = DATA_TYPE;
14444
  size = 0;
14445
  for (i = 0; i < stub_entry->stub_template_size; i++)
14446
    {
14447
      switch (template_sequence[i].type)
14448
        {
14449
        case ARM_TYPE:
14450
          sym_type = ARM_MAP_ARM;
14451
          break;
14452
 
14453
        case THUMB16_TYPE:
14454
        case THUMB32_TYPE:
14455
          sym_type = ARM_MAP_THUMB;
14456
          break;
14457
 
14458
        case DATA_TYPE:
14459
          sym_type = ARM_MAP_DATA;
14460
          break;
14461
 
14462
        default:
14463
          BFD_FAIL ();
14464
          return FALSE;
14465
        }
14466
 
14467
      if (template_sequence[i].type != prev_type)
14468
        {
14469
          prev_type = template_sequence[i].type;
14470
          if (!elf32_arm_output_map_sym (osi, sym_type, addr + size))
14471
            return FALSE;
14472
        }
14473
 
14474
      switch (template_sequence[i].type)
14475
        {
14476
        case ARM_TYPE:
14477
        case THUMB32_TYPE:
14478
          size += 4;
14479
          break;
14480
 
14481
        case THUMB16_TYPE:
14482
          size += 2;
14483
          break;
14484
 
14485
        case DATA_TYPE:
14486
          size += 4;
14487
          break;
14488
 
14489
        default:
14490
          BFD_FAIL ();
14491
          return FALSE;
14492
        }
14493
    }
14494
 
14495
  return TRUE;
14496
}
14497
 
14498
/* Output mapping symbols for linker generated sections,
14499
   and for those data-only sections that do not have a
14500
   $d.  */
14501
 
14502
static bfd_boolean
14503
elf32_arm_output_arch_local_syms (bfd *output_bfd,
14504
                                  struct bfd_link_info *info,
14505
                                  void *finfo,
14506
                                  int (*func) (void *, const char *,
14507
                                               Elf_Internal_Sym *,
14508
                                               asection *,
14509
                                               struct elf_link_hash_entry *))
14510
{
14511
  output_arch_syminfo osi;
14512
  struct elf32_arm_link_hash_table *htab;
14513
  bfd_vma offset;
14514
  bfd_size_type size;
14515
  bfd *input_bfd;
14516
 
14517
  htab = elf32_arm_hash_table (info);
14518
  if (htab == NULL)
14519
    return FALSE;
14520
 
14521
  check_use_blx (htab);
14522
 
14523
  osi.finfo = finfo;
14524
  osi.info = info;
14525
  osi.func = func;
14526
 
14527
  /* Add a $d mapping symbol to data-only sections that
14528
     don't have any mapping symbol.  This may result in (harmless) redundant
14529
     mapping symbols.  */
14530
  for (input_bfd = info->input_bfds;
14531
       input_bfd != NULL;
14532
       input_bfd = input_bfd->link_next)
14533
    {
14534
      if ((input_bfd->flags & (BFD_LINKER_CREATED | HAS_SYMS)) == HAS_SYMS)
14535
        for (osi.sec = input_bfd->sections;
14536
             osi.sec != NULL;
14537
             osi.sec = osi.sec->next)
14538
          {
14539
            if (osi.sec->output_section != NULL
14540
                && ((osi.sec->output_section->flags & (SEC_ALLOC | SEC_CODE))
14541
                    != 0)
14542
                && (osi.sec->flags & (SEC_HAS_CONTENTS | SEC_LINKER_CREATED))
14543
                   == SEC_HAS_CONTENTS
14544
                && get_arm_elf_section_data (osi.sec) != NULL
14545
                && get_arm_elf_section_data (osi.sec)->mapcount == 0
14546 163 khays
                && osi.sec->size > 0
14547
                && (osi.sec->flags & SEC_EXCLUDE) == 0)
14548 14 khays
              {
14549
                osi.sec_shndx = _bfd_elf_section_from_bfd_section
14550
                  (output_bfd, osi.sec->output_section);
14551
                if (osi.sec_shndx != (int)SHN_BAD)
14552
                  elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 0);
14553
              }
14554
          }
14555
    }
14556
 
14557
  /* ARM->Thumb glue.  */
14558
  if (htab->arm_glue_size > 0)
14559
    {
14560
      osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
14561
                                         ARM2THUMB_GLUE_SECTION_NAME);
14562
 
14563
      osi.sec_shndx = _bfd_elf_section_from_bfd_section
14564
          (output_bfd, osi.sec->output_section);
14565
      if (info->shared || htab->root.is_relocatable_executable
14566
          || htab->pic_veneer)
14567
        size = ARM2THUMB_PIC_GLUE_SIZE;
14568
      else if (htab->use_blx)
14569
        size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
14570
      else
14571
        size = ARM2THUMB_STATIC_GLUE_SIZE;
14572
 
14573
      for (offset = 0; offset < htab->arm_glue_size; offset += size)
14574
        {
14575
          elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset);
14576
          elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, offset + size - 4);
14577
        }
14578
    }
14579
 
14580
  /* Thumb->ARM glue.  */
14581
  if (htab->thumb_glue_size > 0)
14582
    {
14583
      osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
14584
                                         THUMB2ARM_GLUE_SECTION_NAME);
14585
 
14586
      osi.sec_shndx = _bfd_elf_section_from_bfd_section
14587
          (output_bfd, osi.sec->output_section);
14588
      size = THUMB2ARM_GLUE_SIZE;
14589
 
14590
      for (offset = 0; offset < htab->thumb_glue_size; offset += size)
14591
        {
14592
          elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, offset);
14593
          elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset + 4);
14594
        }
14595
    }
14596
 
14597
  /* ARMv4 BX veneers.  */
14598
  if (htab->bx_glue_size > 0)
14599
    {
14600
      osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
14601
                                         ARM_BX_GLUE_SECTION_NAME);
14602
 
14603
      osi.sec_shndx = _bfd_elf_section_from_bfd_section
14604
          (output_bfd, osi.sec->output_section);
14605
 
14606
      elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0);
14607
    }
14608
 
14609
  /* Long calls stubs.  */
14610
  if (htab->stub_bfd && htab->stub_bfd->sections)
14611
    {
14612
      asection* stub_sec;
14613
 
14614
      for (stub_sec = htab->stub_bfd->sections;
14615
           stub_sec != NULL;
14616
           stub_sec = stub_sec->next)
14617
        {
14618
          /* Ignore non-stub sections.  */
14619
          if (!strstr (stub_sec->name, STUB_SUFFIX))
14620
            continue;
14621
 
14622
          osi.sec = stub_sec;
14623
 
14624
          osi.sec_shndx = _bfd_elf_section_from_bfd_section
14625
            (output_bfd, osi.sec->output_section);
14626
 
14627
          bfd_hash_traverse (&htab->stub_hash_table, arm_map_one_stub, &osi);
14628
        }
14629
    }
14630
 
14631
  /* Finally, output mapping symbols for the PLT.  */
14632
  if (htab->root.splt && htab->root.splt->size > 0)
14633
    {
14634
      osi.sec = htab->root.splt;
14635
      osi.sec_shndx = (_bfd_elf_section_from_bfd_section
14636
                       (output_bfd, osi.sec->output_section));
14637
 
14638
      /* Output mapping symbols for the plt header.  SymbianOS does not have a
14639
         plt header.  */
14640
      if (htab->vxworks_p)
14641
        {
14642
          /* VxWorks shared libraries have no PLT header.  */
14643
          if (!info->shared)
14644
            {
14645
              if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
14646
                return FALSE;
14647
              if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
14648
                return FALSE;
14649
            }
14650
        }
14651
      else if (!htab->symbian_p)
14652
        {
14653
          if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
14654
            return FALSE;
14655
#ifndef FOUR_WORD_PLT
14656
          if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 16))
14657
            return FALSE;
14658
#endif
14659
        }
14660
    }
14661
  if ((htab->root.splt && htab->root.splt->size > 0)
14662
      || (htab->root.iplt && htab->root.iplt->size > 0))
14663
    {
14664
      elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, &osi);
14665
      for (input_bfd = info->input_bfds;
14666
           input_bfd != NULL;
14667
           input_bfd = input_bfd->link_next)
14668
        {
14669
          struct arm_local_iplt_info **local_iplt;
14670
          unsigned int i, num_syms;
14671
 
14672
          local_iplt = elf32_arm_local_iplt (input_bfd);
14673
          if (local_iplt != NULL)
14674
            {
14675
              num_syms = elf_symtab_hdr (input_bfd).sh_info;
14676
              for (i = 0; i < num_syms; i++)
14677
                if (local_iplt[i] != NULL
14678
                    && !elf32_arm_output_plt_map_1 (&osi, TRUE,
14679
                                                    &local_iplt[i]->root,
14680
                                                    &local_iplt[i]->arm))
14681
                  return FALSE;
14682
            }
14683
        }
14684
    }
14685
  if (htab->dt_tlsdesc_plt != 0)
14686
    {
14687
      /* Mapping symbols for the lazy tls trampoline.  */
14688
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, htab->dt_tlsdesc_plt))
14689
        return FALSE;
14690
 
14691
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA,
14692
                                     htab->dt_tlsdesc_plt + 24))
14693
        return FALSE;
14694
    }
14695
  if (htab->tls_trampoline != 0)
14696
    {
14697
      /* Mapping symbols for the tls trampoline.  */
14698
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, htab->tls_trampoline))
14699
        return FALSE;
14700
#ifdef FOUR_WORD_PLT
14701
      if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA,
14702
                                     htab->tls_trampoline + 12))
14703
        return FALSE;
14704
#endif 
14705
    }
14706
 
14707
  return TRUE;
14708
}
14709
 
14710
/* Allocate target specific section data.  */
14711
 
14712
static bfd_boolean
14713
elf32_arm_new_section_hook (bfd *abfd, asection *sec)
14714
{
14715
  if (!sec->used_by_bfd)
14716
    {
14717
      _arm_elf_section_data *sdata;
14718
      bfd_size_type amt = sizeof (*sdata);
14719
 
14720
      sdata = (_arm_elf_section_data *) bfd_zalloc (abfd, amt);
14721
      if (sdata == NULL)
14722
        return FALSE;
14723
      sec->used_by_bfd = sdata;
14724
    }
14725
 
14726
  return _bfd_elf_new_section_hook (abfd, sec);
14727
}
14728
 
14729
 
14730
/* Used to order a list of mapping symbols by address.  */
14731
 
14732
static int
14733
elf32_arm_compare_mapping (const void * a, const void * b)
14734
{
14735
  const elf32_arm_section_map *amap = (const elf32_arm_section_map *) a;
14736
  const elf32_arm_section_map *bmap = (const elf32_arm_section_map *) b;
14737
 
14738
  if (amap->vma > bmap->vma)
14739
    return 1;
14740
  else if (amap->vma < bmap->vma)
14741
    return -1;
14742
  else if (amap->type > bmap->type)
14743
    /* Ensure results do not depend on the host qsort for objects with
14744
       multiple mapping symbols at the same address by sorting on type
14745
       after vma.  */
14746
    return 1;
14747
  else if (amap->type < bmap->type)
14748
    return -1;
14749
  else
14750
    return 0;
14751
}
14752
 
14753
/* Add OFFSET to lower 31 bits of ADDR, leaving other bits unmodified.  */
14754
 
14755
static unsigned long
14756
offset_prel31 (unsigned long addr, bfd_vma offset)
14757
{
14758
  return (addr & ~0x7ffffffful) | ((addr + offset) & 0x7ffffffful);
14759
}
14760
 
14761
/* Copy an .ARM.exidx table entry, adding OFFSET to (applied) PREL31
14762
   relocations.  */
14763
 
14764
static void
14765
copy_exidx_entry (bfd *output_bfd, bfd_byte *to, bfd_byte *from, bfd_vma offset)
14766
{
14767
  unsigned long first_word = bfd_get_32 (output_bfd, from);
14768
  unsigned long second_word = bfd_get_32 (output_bfd, from + 4);
14769
 
14770
  /* High bit of first word is supposed to be zero.  */
14771
  if ((first_word & 0x80000000ul) == 0)
14772
    first_word = offset_prel31 (first_word, offset);
14773
 
14774
  /* If the high bit of the first word is clear, and the bit pattern is not 0x1
14775
     (EXIDX_CANTUNWIND), this is an offset to an .ARM.extab entry.  */
14776
  if ((second_word != 0x1) && ((second_word & 0x80000000ul) == 0))
14777
    second_word = offset_prel31 (second_word, offset);
14778
 
14779
  bfd_put_32 (output_bfd, first_word, to);
14780
  bfd_put_32 (output_bfd, second_word, to + 4);
14781
}
14782
 
14783
/* Data for make_branch_to_a8_stub().  */
14784
 
14785
struct a8_branch_to_stub_data {
14786
  asection *writing_section;
14787
  bfd_byte *contents;
14788
};
14789
 
14790
 
14791
/* Helper to insert branches to Cortex-A8 erratum stubs in the right
14792
   places for a particular section.  */
14793
 
14794
static bfd_boolean
14795
make_branch_to_a8_stub (struct bfd_hash_entry *gen_entry,
14796
                       void *in_arg)
14797
{
14798
  struct elf32_arm_stub_hash_entry *stub_entry;
14799
  struct a8_branch_to_stub_data *data;
14800
  bfd_byte *contents;
14801
  unsigned long branch_insn;
14802
  bfd_vma veneered_insn_loc, veneer_entry_loc;
14803
  bfd_signed_vma branch_offset;
14804
  bfd *abfd;
14805
  unsigned int target;
14806
 
14807
  stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
14808
  data = (struct a8_branch_to_stub_data *) in_arg;
14809
 
14810
  if (stub_entry->target_section != data->writing_section
14811
      || stub_entry->stub_type < arm_stub_a8_veneer_lwm)
14812
    return TRUE;
14813
 
14814
  contents = data->contents;
14815
 
14816
  veneered_insn_loc = stub_entry->target_section->output_section->vma
14817
                      + stub_entry->target_section->output_offset
14818
                      + stub_entry->target_value;
14819
 
14820
  veneer_entry_loc = stub_entry->stub_sec->output_section->vma
14821
                     + stub_entry->stub_sec->output_offset
14822
                     + stub_entry->stub_offset;
14823
 
14824
  if (stub_entry->stub_type == arm_stub_a8_veneer_blx)
14825
    veneered_insn_loc &= ~3u;
14826
 
14827
  branch_offset = veneer_entry_loc - veneered_insn_loc - 4;
14828
 
14829
  abfd = stub_entry->target_section->owner;
14830
  target = stub_entry->target_value;
14831
 
14832
  /* We attempt to avoid this condition by setting stubs_always_after_branch
14833
     in elf32_arm_size_stubs if we've enabled the Cortex-A8 erratum workaround.
14834
     This check is just to be on the safe side...  */
14835
  if ((veneered_insn_loc & ~0xfff) == (veneer_entry_loc & ~0xfff))
14836
    {
14837
      (*_bfd_error_handler) (_("%B: error: Cortex-A8 erratum stub is "
14838
                               "allocated in unsafe location"), abfd);
14839
      return FALSE;
14840
    }
14841
 
14842
  switch (stub_entry->stub_type)
14843
    {
14844
    case arm_stub_a8_veneer_b:
14845
    case arm_stub_a8_veneer_b_cond:
14846
      branch_insn = 0xf0009000;
14847
      goto jump24;
14848
 
14849
    case arm_stub_a8_veneer_blx:
14850
      branch_insn = 0xf000e800;
14851
      goto jump24;
14852
 
14853
    case arm_stub_a8_veneer_bl:
14854
      {
14855
        unsigned int i1, j1, i2, j2, s;
14856
 
14857
        branch_insn = 0xf000d000;
14858
 
14859
      jump24:
14860
        if (branch_offset < -16777216 || branch_offset > 16777214)
14861
          {
14862
            /* There's not much we can do apart from complain if this
14863
               happens.  */
14864
            (*_bfd_error_handler) (_("%B: error: Cortex-A8 erratum stub out "
14865
                                     "of range (input file too large)"), abfd);
14866
            return FALSE;
14867
          }
14868
 
14869
        /* i1 = not(j1 eor s), so:
14870
           not i1 = j1 eor s
14871
           j1 = (not i1) eor s.  */
14872
 
14873
        branch_insn |= (branch_offset >> 1) & 0x7ff;
14874
        branch_insn |= ((branch_offset >> 12) & 0x3ff) << 16;
14875
        i2 = (branch_offset >> 22) & 1;
14876
        i1 = (branch_offset >> 23) & 1;
14877
        s = (branch_offset >> 24) & 1;
14878
        j1 = (!i1) ^ s;
14879
        j2 = (!i2) ^ s;
14880
        branch_insn |= j2 << 11;
14881
        branch_insn |= j1 << 13;
14882
        branch_insn |= s << 26;
14883
      }
14884
      break;
14885
 
14886
    default:
14887
      BFD_FAIL ();
14888
      return FALSE;
14889
    }
14890
 
14891
  bfd_put_16 (abfd, (branch_insn >> 16) & 0xffff, &contents[target]);
14892
  bfd_put_16 (abfd, branch_insn & 0xffff, &contents[target + 2]);
14893
 
14894
  return TRUE;
14895
}
14896
 
14897
/* Do code byteswapping.  Return FALSE afterwards so that the section is
14898
   written out as normal.  */
14899
 
14900
static bfd_boolean
14901
elf32_arm_write_section (bfd *output_bfd,
14902
                         struct bfd_link_info *link_info,
14903
                         asection *sec,
14904
                         bfd_byte *contents)
14905
{
14906
  unsigned int mapcount, errcount;
14907
  _arm_elf_section_data *arm_data;
14908
  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
14909
  elf32_arm_section_map *map;
14910
  elf32_vfp11_erratum_list *errnode;
14911
  bfd_vma ptr;
14912
  bfd_vma end;
14913
  bfd_vma offset = sec->output_section->vma + sec->output_offset;
14914
  bfd_byte tmp;
14915
  unsigned int i;
14916
 
14917
  if (globals == NULL)
14918
    return FALSE;
14919
 
14920
  /* If this section has not been allocated an _arm_elf_section_data
14921
     structure then we cannot record anything.  */
14922
  arm_data = get_arm_elf_section_data (sec);
14923
  if (arm_data == NULL)
14924
    return FALSE;
14925
 
14926
  mapcount = arm_data->mapcount;
14927
  map = arm_data->map;
14928
  errcount = arm_data->erratumcount;
14929
 
14930
  if (errcount != 0)
14931
    {
14932
      unsigned int endianflip = bfd_big_endian (output_bfd) ? 3 : 0;
14933
 
14934
      for (errnode = arm_data->erratumlist; errnode != 0;
14935
           errnode = errnode->next)
14936
        {
14937
          bfd_vma target = errnode->vma - offset;
14938
 
14939
          switch (errnode->type)
14940
            {
14941
            case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
14942
              {
14943
                bfd_vma branch_to_veneer;
14944
                /* Original condition code of instruction, plus bit mask for
14945
                   ARM B instruction.  */
14946
                unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000)
14947
                                  | 0x0a000000;
14948
 
14949
                /* The instruction is before the label.  */
14950
                target -= 4;
14951
 
14952
                /* Above offset included in -4 below.  */
14953
                branch_to_veneer = errnode->u.b.veneer->vma
14954
                                   - errnode->vma - 4;
14955
 
14956
                if ((signed) branch_to_veneer < -(1 << 25)
14957
                    || (signed) branch_to_veneer >= (1 << 25))
14958
                  (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
14959
                                           "range"), output_bfd);
14960
 
14961
                insn |= (branch_to_veneer >> 2) & 0xffffff;
14962
                contents[endianflip ^ target] = insn & 0xff;
14963
                contents[endianflip ^ (target + 1)] = (insn >> 8) & 0xff;
14964
                contents[endianflip ^ (target + 2)] = (insn >> 16) & 0xff;
14965
                contents[endianflip ^ (target + 3)] = (insn >> 24) & 0xff;
14966
              }
14967
              break;
14968
 
14969
            case VFP11_ERRATUM_ARM_VENEER:
14970
              {
14971
                bfd_vma branch_from_veneer;
14972
                unsigned int insn;
14973
 
14974
                /* Take size of veneer into account.  */
14975
                branch_from_veneer = errnode->u.v.branch->vma
14976
                                     - errnode->vma - 12;
14977
 
14978
                if ((signed) branch_from_veneer < -(1 << 25)
14979
                    || (signed) branch_from_veneer >= (1 << 25))
14980
                  (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
14981
                                           "range"), output_bfd);
14982
 
14983
                /* Original instruction.  */
14984
                insn = errnode->u.v.branch->u.b.vfp_insn;
14985
                contents[endianflip ^ target] = insn & 0xff;
14986
                contents[endianflip ^ (target + 1)] = (insn >> 8) & 0xff;
14987
                contents[endianflip ^ (target + 2)] = (insn >> 16) & 0xff;
14988
                contents[endianflip ^ (target + 3)] = (insn >> 24) & 0xff;
14989
 
14990
                /* Branch back to insn after original insn.  */
14991
                insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff);
14992
                contents[endianflip ^ (target + 4)] = insn & 0xff;
14993
                contents[endianflip ^ (target + 5)] = (insn >> 8) & 0xff;
14994
                contents[endianflip ^ (target + 6)] = (insn >> 16) & 0xff;
14995
                contents[endianflip ^ (target + 7)] = (insn >> 24) & 0xff;
14996
              }
14997
              break;
14998
 
14999
            default:
15000
              abort ();
15001
            }
15002
        }
15003
    }
15004
 
15005
  if (arm_data->elf.this_hdr.sh_type == SHT_ARM_EXIDX)
15006
    {
15007
      arm_unwind_table_edit *edit_node
15008
        = arm_data->u.exidx.unwind_edit_list;
15009
      /* Now, sec->size is the size of the section we will write.  The original
15010
         size (before we merged duplicate entries and inserted EXIDX_CANTUNWIND
15011
         markers) was sec->rawsize.  (This isn't the case if we perform no
15012
         edits, then rawsize will be zero and we should use size).  */
15013
      bfd_byte *edited_contents = (bfd_byte *) bfd_malloc (sec->size);
15014
      unsigned int input_size = sec->rawsize ? sec->rawsize : sec->size;
15015
      unsigned int in_index, out_index;
15016
      bfd_vma add_to_offsets = 0;
15017
 
15018
      for (in_index = 0, out_index = 0; in_index * 8 < input_size || edit_node;)
15019
        {
15020
          if (edit_node)
15021
            {
15022
              unsigned int edit_index = edit_node->index;
15023
 
15024
              if (in_index < edit_index && in_index * 8 < input_size)
15025
                {
15026
                  copy_exidx_entry (output_bfd, edited_contents + out_index * 8,
15027
                                    contents + in_index * 8, add_to_offsets);
15028
                  out_index++;
15029
                  in_index++;
15030
                }
15031
              else if (in_index == edit_index
15032
                       || (in_index * 8 >= input_size
15033
                           && edit_index == UINT_MAX))
15034
                {
15035
                  switch (edit_node->type)
15036
                    {
15037
                    case DELETE_EXIDX_ENTRY:
15038
                      in_index++;
15039
                      add_to_offsets += 8;
15040
                      break;
15041
 
15042
                    case INSERT_EXIDX_CANTUNWIND_AT_END:
15043
                      {
15044
                        asection *text_sec = edit_node->linked_section;
15045
                        bfd_vma text_offset = text_sec->output_section->vma
15046
                                              + text_sec->output_offset
15047
                                              + text_sec->size;
15048
                        bfd_vma exidx_offset = offset + out_index * 8;
15049
                        unsigned long prel31_offset;
15050
 
15051
                        /* Note: this is meant to be equivalent to an
15052
                           R_ARM_PREL31 relocation.  These synthetic
15053
                           EXIDX_CANTUNWIND markers are not relocated by the
15054
                           usual BFD method.  */
15055
                        prel31_offset = (text_offset - exidx_offset)
15056
                                        & 0x7ffffffful;
15057
 
15058
                        /* First address we can't unwind.  */
15059
                        bfd_put_32 (output_bfd, prel31_offset,
15060
                                    &edited_contents[out_index * 8]);
15061
 
15062
                        /* Code for EXIDX_CANTUNWIND.  */
15063
                        bfd_put_32 (output_bfd, 0x1,
15064
                                    &edited_contents[out_index * 8 + 4]);
15065
 
15066
                        out_index++;
15067
                        add_to_offsets -= 8;
15068
                      }
15069
                      break;
15070
                    }
15071
 
15072
                  edit_node = edit_node->next;
15073
                }
15074
            }
15075
          else
15076
            {
15077
              /* No more edits, copy remaining entries verbatim.  */
15078
              copy_exidx_entry (output_bfd, edited_contents + out_index * 8,
15079
                                contents + in_index * 8, add_to_offsets);
15080
              out_index++;
15081
              in_index++;
15082
            }
15083
        }
15084
 
15085
      if (!(sec->flags & SEC_EXCLUDE) && !(sec->flags & SEC_NEVER_LOAD))
15086
        bfd_set_section_contents (output_bfd, sec->output_section,
15087
                                  edited_contents,
15088
                                  (file_ptr) sec->output_offset, sec->size);
15089
 
15090
      return TRUE;
15091
    }
15092
 
15093
  /* Fix code to point to Cortex-A8 erratum stubs.  */
15094
  if (globals->fix_cortex_a8)
15095
    {
15096
      struct a8_branch_to_stub_data data;
15097
 
15098
      data.writing_section = sec;
15099
      data.contents = contents;
15100
 
15101
      bfd_hash_traverse (&globals->stub_hash_table, make_branch_to_a8_stub,
15102
                         &data);
15103
    }
15104
 
15105
  if (mapcount == 0)
15106
    return FALSE;
15107
 
15108
  if (globals->byteswap_code)
15109
    {
15110
      qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
15111
 
15112
      ptr = map[0].vma;
15113
      for (i = 0; i < mapcount; i++)
15114
        {
15115
          if (i == mapcount - 1)
15116
            end = sec->size;
15117
          else
15118
            end = map[i + 1].vma;
15119
 
15120
          switch (map[i].type)
15121
            {
15122
            case 'a':
15123
              /* Byte swap code words.  */
15124
              while (ptr + 3 < end)
15125
                {
15126
                  tmp = contents[ptr];
15127
                  contents[ptr] = contents[ptr + 3];
15128
                  contents[ptr + 3] = tmp;
15129
                  tmp = contents[ptr + 1];
15130
                  contents[ptr + 1] = contents[ptr + 2];
15131
                  contents[ptr + 2] = tmp;
15132
                  ptr += 4;
15133
                }
15134
              break;
15135
 
15136
            case 't':
15137
              /* Byte swap code halfwords.  */
15138
              while (ptr + 1 < end)
15139
                {
15140
                  tmp = contents[ptr];
15141
                  contents[ptr] = contents[ptr + 1];
15142
                  contents[ptr + 1] = tmp;
15143
                  ptr += 2;
15144
                }
15145
              break;
15146
 
15147
            case 'd':
15148
              /* Leave data alone.  */
15149
              break;
15150
            }
15151
          ptr = end;
15152
        }
15153
    }
15154
 
15155
  free (map);
15156
  arm_data->mapcount = -1;
15157
  arm_data->mapsize = 0;
15158
  arm_data->map = NULL;
15159
 
15160
  return FALSE;
15161
}
15162
 
15163
/* Mangle thumb function symbols as we read them in.  */
15164
 
15165
static bfd_boolean
15166
elf32_arm_swap_symbol_in (bfd * abfd,
15167
                          const void *psrc,
15168
                          const void *pshn,
15169
                          Elf_Internal_Sym *dst)
15170
{
15171
  if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
15172
    return FALSE;
15173
 
15174
  /* New EABI objects mark thumb function symbols by setting the low bit of
15175
     the address.  */
15176
  if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
15177
      || ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
15178
    {
15179
      if (dst->st_value & 1)
15180
        {
15181
          dst->st_value &= ~(bfd_vma) 1;
15182
          dst->st_target_internal = ST_BRANCH_TO_THUMB;
15183
        }
15184
      else
15185
        dst->st_target_internal = ST_BRANCH_TO_ARM;
15186
    }
15187
  else if (ELF_ST_TYPE (dst->st_info) == STT_ARM_TFUNC)
15188
    {
15189
      dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_FUNC);
15190
      dst->st_target_internal = ST_BRANCH_TO_THUMB;
15191
    }
15192
  else if (ELF_ST_TYPE (dst->st_info) == STT_SECTION)
15193
    dst->st_target_internal = ST_BRANCH_LONG;
15194
  else
15195
    dst->st_target_internal = ST_BRANCH_UNKNOWN;
15196
 
15197
  return TRUE;
15198
}
15199
 
15200
 
15201
/* Mangle thumb function symbols as we write them out.  */
15202
 
15203
static void
15204
elf32_arm_swap_symbol_out (bfd *abfd,
15205
                           const Elf_Internal_Sym *src,
15206
                           void *cdst,
15207
                           void *shndx)
15208
{
15209
  Elf_Internal_Sym newsym;
15210
 
15211
  /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
15212
     of the address set, as per the new EABI.  We do this unconditionally
15213
     because objcopy does not set the elf header flags until after
15214
     it writes out the symbol table.  */
15215
  if (src->st_target_internal == ST_BRANCH_TO_THUMB)
15216
    {
15217
      newsym = *src;
15218
      if (ELF_ST_TYPE (src->st_info) != STT_GNU_IFUNC)
15219
        newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
15220
      if (newsym.st_shndx != SHN_UNDEF)
15221
        {
15222
          /* Do this only for defined symbols. At link type, the static
15223
             linker will simulate the work of dynamic linker of resolving
15224
             symbols and will carry over the thumbness of found symbols to
15225
             the output symbol table. It's not clear how it happens, but
15226
             the thumbness of undefined symbols can well be different at
15227
             runtime, and writing '1' for them will be confusing for users
15228
             and possibly for dynamic linker itself.
15229
          */
15230
          newsym.st_value |= 1;
15231
        }
15232
 
15233
      src = &newsym;
15234
    }
15235
  bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
15236
}
15237
 
15238
/* Add the PT_ARM_EXIDX program header.  */
15239
 
15240
static bfd_boolean
15241
elf32_arm_modify_segment_map (bfd *abfd,
15242
                              struct bfd_link_info *info ATTRIBUTE_UNUSED)
15243
{
15244
  struct elf_segment_map *m;
15245
  asection *sec;
15246
 
15247
  sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
15248
  if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
15249
    {
15250
      /* If there is already a PT_ARM_EXIDX header, then we do not
15251
         want to add another one.  This situation arises when running
15252
         "strip"; the input binary already has the header.  */
15253
      m = elf_tdata (abfd)->segment_map;
15254
      while (m && m->p_type != PT_ARM_EXIDX)
15255
        m = m->next;
15256
      if (!m)
15257
        {
15258
          m = (struct elf_segment_map *)
15259
              bfd_zalloc (abfd, sizeof (struct elf_segment_map));
15260
          if (m == NULL)
15261
            return FALSE;
15262
          m->p_type = PT_ARM_EXIDX;
15263
          m->count = 1;
15264
          m->sections[0] = sec;
15265
 
15266
          m->next = elf_tdata (abfd)->segment_map;
15267
          elf_tdata (abfd)->segment_map = m;
15268
        }
15269
    }
15270
 
15271
  return TRUE;
15272
}
15273
 
15274
/* We may add a PT_ARM_EXIDX program header.  */
15275
 
15276
static int
15277
elf32_arm_additional_program_headers (bfd *abfd,
15278
                                      struct bfd_link_info *info ATTRIBUTE_UNUSED)
15279
{
15280
  asection *sec;
15281
 
15282
  sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
15283
  if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
15284
    return 1;
15285
  else
15286
    return 0;
15287
}
15288
 
15289
/* Hook called by the linker routine which adds symbols from an object
15290
   file.  */
15291
 
15292
static bfd_boolean
15293
elf32_arm_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
15294
                           Elf_Internal_Sym *sym, const char **namep,
15295
                           flagword *flagsp, asection **secp, bfd_vma *valp)
15296
{
15297
  if ((abfd->flags & DYNAMIC) == 0
15298
      && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
15299
          || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
15300
    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
15301
 
15302
  if (elf32_arm_hash_table (info)->vxworks_p
15303
      && !elf_vxworks_add_symbol_hook (abfd, info, sym, namep,
15304
                                       flagsp, secp, valp))
15305
    return FALSE;
15306
 
15307
  return TRUE;
15308
}
15309
 
15310
/* We use this to override swap_symbol_in and swap_symbol_out.  */
15311
const struct elf_size_info elf32_arm_size_info =
15312
{
15313
  sizeof (Elf32_External_Ehdr),
15314
  sizeof (Elf32_External_Phdr),
15315
  sizeof (Elf32_External_Shdr),
15316
  sizeof (Elf32_External_Rel),
15317
  sizeof (Elf32_External_Rela),
15318
  sizeof (Elf32_External_Sym),
15319
  sizeof (Elf32_External_Dyn),
15320
  sizeof (Elf_External_Note),
15321
  4,
15322
  1,
15323
  32, 2,
15324
  ELFCLASS32, EV_CURRENT,
15325
  bfd_elf32_write_out_phdrs,
15326
  bfd_elf32_write_shdrs_and_ehdr,
15327
  bfd_elf32_checksum_contents,
15328
  bfd_elf32_write_relocs,
15329
  elf32_arm_swap_symbol_in,
15330
  elf32_arm_swap_symbol_out,
15331
  bfd_elf32_slurp_reloc_table,
15332
  bfd_elf32_slurp_symbol_table,
15333
  bfd_elf32_swap_dyn_in,
15334
  bfd_elf32_swap_dyn_out,
15335
  bfd_elf32_swap_reloc_in,
15336
  bfd_elf32_swap_reloc_out,
15337
  bfd_elf32_swap_reloca_in,
15338
  bfd_elf32_swap_reloca_out
15339
};
15340
 
15341
#define ELF_ARCH                        bfd_arch_arm
15342
#define ELF_TARGET_ID                   ARM_ELF_DATA
15343
#define ELF_MACHINE_CODE                EM_ARM
15344
#ifdef __QNXTARGET__
15345
#define ELF_MAXPAGESIZE                 0x1000
15346
#else
15347
#define ELF_MAXPAGESIZE                 0x8000
15348
#endif
15349
#define ELF_MINPAGESIZE                 0x1000
15350
#define ELF_COMMONPAGESIZE              0x1000
15351
 
15352
#define bfd_elf32_mkobject                      elf32_arm_mkobject
15353
 
15354
#define bfd_elf32_bfd_copy_private_bfd_data     elf32_arm_copy_private_bfd_data
15355
#define bfd_elf32_bfd_merge_private_bfd_data    elf32_arm_merge_private_bfd_data
15356
#define bfd_elf32_bfd_set_private_flags         elf32_arm_set_private_flags
15357
#define bfd_elf32_bfd_print_private_bfd_data    elf32_arm_print_private_bfd_data
15358
#define bfd_elf32_bfd_link_hash_table_create    elf32_arm_link_hash_table_create
15359
#define bfd_elf32_bfd_link_hash_table_free      elf32_arm_hash_table_free
15360
#define bfd_elf32_bfd_reloc_type_lookup         elf32_arm_reloc_type_lookup
15361
#define bfd_elf32_bfd_reloc_name_lookup elf32_arm_reloc_name_lookup
15362
#define bfd_elf32_find_nearest_line             elf32_arm_find_nearest_line
15363
#define bfd_elf32_find_inliner_info             elf32_arm_find_inliner_info
15364
#define bfd_elf32_new_section_hook              elf32_arm_new_section_hook
15365
#define bfd_elf32_bfd_is_target_special_symbol  elf32_arm_is_target_special_symbol
15366
#define bfd_elf32_bfd_final_link                elf32_arm_final_link
15367
 
15368
#define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
15369
#define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
15370
#define elf_backend_gc_mark_extra_sections      elf32_arm_gc_mark_extra_sections
15371
#define elf_backend_gc_sweep_hook               elf32_arm_gc_sweep_hook
15372
#define elf_backend_check_relocs                elf32_arm_check_relocs
15373
#define elf_backend_relocate_section            elf32_arm_relocate_section
15374
#define elf_backend_write_section               elf32_arm_write_section
15375
#define elf_backend_adjust_dynamic_symbol       elf32_arm_adjust_dynamic_symbol
15376
#define elf_backend_create_dynamic_sections     elf32_arm_create_dynamic_sections
15377
#define elf_backend_finish_dynamic_symbol       elf32_arm_finish_dynamic_symbol
15378
#define elf_backend_finish_dynamic_sections     elf32_arm_finish_dynamic_sections
15379
#define elf_backend_size_dynamic_sections       elf32_arm_size_dynamic_sections
15380
#define elf_backend_always_size_sections        elf32_arm_always_size_sections
15381
#define elf_backend_init_index_section          _bfd_elf_init_2_index_sections
15382
#define elf_backend_post_process_headers        elf32_arm_post_process_headers
15383
#define elf_backend_reloc_type_class            elf32_arm_reloc_type_class
15384
#define elf_backend_object_p                    elf32_arm_object_p
15385
#define elf_backend_fake_sections               elf32_arm_fake_sections
15386
#define elf_backend_section_from_shdr           elf32_arm_section_from_shdr
15387
#define elf_backend_final_write_processing      elf32_arm_final_write_processing
15388
#define elf_backend_copy_indirect_symbol        elf32_arm_copy_indirect_symbol
15389
#define elf_backend_size_info                   elf32_arm_size_info
15390
#define elf_backend_modify_segment_map          elf32_arm_modify_segment_map
15391
#define elf_backend_additional_program_headers  elf32_arm_additional_program_headers
15392
#define elf_backend_output_arch_local_syms      elf32_arm_output_arch_local_syms
15393
#define elf_backend_begin_write_processing      elf32_arm_begin_write_processing
15394
#define elf_backend_add_symbol_hook             elf32_arm_add_symbol_hook
15395
 
15396
#define elf_backend_can_refcount       1
15397
#define elf_backend_can_gc_sections    1
15398
#define elf_backend_plt_readonly       1
15399
#define elf_backend_want_got_plt       1
15400
#define elf_backend_want_plt_sym       0
15401
#define elf_backend_may_use_rel_p      1
15402
#define elf_backend_may_use_rela_p     0
15403
#define elf_backend_default_use_rela_p 0
15404
 
15405
#define elf_backend_got_header_size     12
15406
 
15407
#undef  elf_backend_obj_attrs_vendor
15408
#define elf_backend_obj_attrs_vendor            "aeabi"
15409
#undef  elf_backend_obj_attrs_section
15410
#define elf_backend_obj_attrs_section           ".ARM.attributes"
15411
#undef  elf_backend_obj_attrs_arg_type
15412
#define elf_backend_obj_attrs_arg_type          elf32_arm_obj_attrs_arg_type
15413
#undef  elf_backend_obj_attrs_section_type
15414
#define elf_backend_obj_attrs_section_type      SHT_ARM_ATTRIBUTES
15415
#define elf_backend_obj_attrs_order     elf32_arm_obj_attrs_order
15416
#define elf_backend_obj_attrs_handle_unknown elf32_arm_obj_attrs_handle_unknown
15417
 
15418
#include "elf32-target.h"
15419
 
15420
/* VxWorks Targets.  */
15421
 
15422
#undef  TARGET_LITTLE_SYM
15423
#define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vxworks_vec
15424
#undef  TARGET_LITTLE_NAME
15425
#define TARGET_LITTLE_NAME              "elf32-littlearm-vxworks"
15426
#undef  TARGET_BIG_SYM
15427
#define TARGET_BIG_SYM                  bfd_elf32_bigarm_vxworks_vec
15428
#undef  TARGET_BIG_NAME
15429
#define TARGET_BIG_NAME                 "elf32-bigarm-vxworks"
15430
 
15431
/* Like elf32_arm_link_hash_table_create -- but overrides
15432
   appropriately for VxWorks.  */
15433
 
15434
static struct bfd_link_hash_table *
15435
elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
15436
{
15437
  struct bfd_link_hash_table *ret;
15438
 
15439
  ret = elf32_arm_link_hash_table_create (abfd);
15440
  if (ret)
15441
    {
15442
      struct elf32_arm_link_hash_table *htab
15443
        = (struct elf32_arm_link_hash_table *) ret;
15444
      htab->use_rel = 0;
15445
      htab->vxworks_p = 1;
15446
    }
15447
  return ret;
15448
}
15449
 
15450
static void
15451
elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
15452
{
15453
  elf32_arm_final_write_processing (abfd, linker);
15454
  elf_vxworks_final_write_processing (abfd, linker);
15455
}
15456
 
15457
#undef  elf32_bed
15458
#define elf32_bed elf32_arm_vxworks_bed
15459
 
15460
#undef  bfd_elf32_bfd_link_hash_table_create
15461
#define bfd_elf32_bfd_link_hash_table_create    elf32_arm_vxworks_link_hash_table_create
15462
#undef  elf_backend_final_write_processing
15463
#define elf_backend_final_write_processing      elf32_arm_vxworks_final_write_processing
15464
#undef  elf_backend_emit_relocs
15465
#define elf_backend_emit_relocs                 elf_vxworks_emit_relocs
15466
 
15467
#undef  elf_backend_may_use_rel_p
15468
#define elf_backend_may_use_rel_p       0
15469
#undef  elf_backend_may_use_rela_p
15470
#define elf_backend_may_use_rela_p      1
15471
#undef  elf_backend_default_use_rela_p
15472
#define elf_backend_default_use_rela_p  1
15473
#undef  elf_backend_want_plt_sym
15474
#define elf_backend_want_plt_sym        1
15475
#undef  ELF_MAXPAGESIZE
15476
#define ELF_MAXPAGESIZE                 0x1000
15477
 
15478
#include "elf32-target.h"
15479
 
15480
 
15481
/* Merge backend specific data from an object file to the output
15482
   object file when linking.  */
15483
 
15484
static bfd_boolean
15485
elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
15486
{
15487
  flagword out_flags;
15488
  flagword in_flags;
15489
  bfd_boolean flags_compatible = TRUE;
15490
  asection *sec;
15491
 
15492
  /* Check if we have the same endianness.  */
15493
  if (! _bfd_generic_verify_endian_match (ibfd, obfd))
15494
    return FALSE;
15495
 
15496
  if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
15497
    return TRUE;
15498
 
15499
  if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
15500
    return FALSE;
15501
 
15502
  /* The input BFD must have had its flags initialised.  */
15503
  /* The following seems bogus to me -- The flags are initialized in
15504
     the assembler but I don't think an elf_flags_init field is
15505
     written into the object.  */
15506
  /* BFD_ASSERT (elf_flags_init (ibfd)); */
15507
 
15508
  in_flags  = elf_elfheader (ibfd)->e_flags;
15509
  out_flags = elf_elfheader (obfd)->e_flags;
15510
 
15511
  /* In theory there is no reason why we couldn't handle this.  However
15512
     in practice it isn't even close to working and there is no real
15513
     reason to want it.  */
15514
  if (EF_ARM_EABI_VERSION (in_flags) >= EF_ARM_EABI_VER4
15515
      && !(ibfd->flags & DYNAMIC)
15516
      && (in_flags & EF_ARM_BE8))
15517
    {
15518
      _bfd_error_handler (_("error: %B is already in final BE8 format"),
15519
                          ibfd);
15520
      return FALSE;
15521
    }
15522
 
15523
  if (!elf_flags_init (obfd))
15524
    {
15525
      /* If the input is the default architecture and had the default
15526
         flags then do not bother setting the flags for the output
15527
         architecture, instead allow future merges to do this.  If no
15528
         future merges ever set these flags then they will retain their
15529
         uninitialised values, which surprise surprise, correspond
15530
         to the default values.  */
15531
      if (bfd_get_arch_info (ibfd)->the_default
15532
          && elf_elfheader (ibfd)->e_flags == 0)
15533
        return TRUE;
15534
 
15535
      elf_flags_init (obfd) = TRUE;
15536
      elf_elfheader (obfd)->e_flags = in_flags;
15537
 
15538
      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
15539
          && bfd_get_arch_info (obfd)->the_default)
15540
        return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
15541
 
15542
      return TRUE;
15543
    }
15544
 
15545
  /* Determine what should happen if the input ARM architecture
15546
     does not match the output ARM architecture.  */
15547
  if (! bfd_arm_merge_machines (ibfd, obfd))
15548
    return FALSE;
15549
 
15550
  /* Identical flags must be compatible.  */
15551
  if (in_flags == out_flags)
15552
    return TRUE;
15553
 
15554
  /* Check to see if the input BFD actually contains any sections.  If
15555
     not, its flags may not have been initialised either, but it
15556
     cannot actually cause any incompatiblity.  Do not short-circuit
15557
     dynamic objects; their section list may be emptied by
15558
    elf_link_add_object_symbols.
15559
 
15560
    Also check to see if there are no code sections in the input.
15561
    In this case there is no need to check for code specific flags.
15562
    XXX - do we need to worry about floating-point format compatability
15563
    in data sections ?  */
15564
  if (!(ibfd->flags & DYNAMIC))
15565
    {
15566
      bfd_boolean null_input_bfd = TRUE;
15567
      bfd_boolean only_data_sections = TRUE;
15568
 
15569
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
15570
        {
15571
          /* Ignore synthetic glue sections.  */
15572
          if (strcmp (sec->name, ".glue_7")
15573
              && strcmp (sec->name, ".glue_7t"))
15574
            {
15575
              if ((bfd_get_section_flags (ibfd, sec)
15576
                   & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
15577
                  == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
15578
                only_data_sections = FALSE;
15579
 
15580
              null_input_bfd = FALSE;
15581
              break;
15582
            }
15583
        }
15584
 
15585
      if (null_input_bfd || only_data_sections)
15586
        return TRUE;
15587
    }
15588
 
15589
  /* Complain about various flag mismatches.  */
15590
  if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
15591
                                      EF_ARM_EABI_VERSION (out_flags)))
15592
    {
15593
      _bfd_error_handler
15594
        (_("error: Source object %B has EABI version %d, but target %B has EABI version %d"),
15595
         ibfd, obfd,
15596
         (in_flags & EF_ARM_EABIMASK) >> 24,
15597
         (out_flags & EF_ARM_EABIMASK) >> 24);
15598
      return FALSE;
15599
    }
15600
 
15601
  /* Not sure what needs to be checked for EABI versions >= 1.  */
15602
  /* VxWorks libraries do not use these flags.  */
15603
  if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
15604
      && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
15605
      && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
15606
    {
15607
      if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
15608
        {
15609
          _bfd_error_handler
15610
            (_("error: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
15611
             ibfd, obfd,
15612
             in_flags & EF_ARM_APCS_26 ? 26 : 32,
15613
             out_flags & EF_ARM_APCS_26 ? 26 : 32);
15614
          flags_compatible = FALSE;
15615
        }
15616
 
15617
      if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
15618
        {
15619
          if (in_flags & EF_ARM_APCS_FLOAT)
15620
            _bfd_error_handler
15621
              (_("error: %B passes floats in float registers, whereas %B passes them in integer registers"),
15622
               ibfd, obfd);
15623
          else
15624
            _bfd_error_handler
15625
              (_("error: %B passes floats in integer registers, whereas %B passes them in float registers"),
15626
               ibfd, obfd);
15627
 
15628
          flags_compatible = FALSE;
15629
        }
15630
 
15631
      if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
15632
        {
15633
          if (in_flags & EF_ARM_VFP_FLOAT)
15634
            _bfd_error_handler
15635
              (_("error: %B uses VFP instructions, whereas %B does not"),
15636
               ibfd, obfd);
15637
          else
15638
            _bfd_error_handler
15639
              (_("error: %B uses FPA instructions, whereas %B does not"),
15640
               ibfd, obfd);
15641
 
15642
          flags_compatible = FALSE;
15643
        }
15644
 
15645
      if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
15646
        {
15647
          if (in_flags & EF_ARM_MAVERICK_FLOAT)
15648
            _bfd_error_handler
15649
              (_("error: %B uses Maverick instructions, whereas %B does not"),
15650
               ibfd, obfd);
15651
          else
15652
            _bfd_error_handler
15653
              (_("error: %B does not use Maverick instructions, whereas %B does"),
15654
               ibfd, obfd);
15655
 
15656
          flags_compatible = FALSE;
15657
        }
15658
 
15659
#ifdef EF_ARM_SOFT_FLOAT
15660
      if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
15661
        {
15662
          /* We can allow interworking between code that is VFP format
15663
             layout, and uses either soft float or integer regs for
15664
             passing floating point arguments and results.  We already
15665
             know that the APCS_FLOAT flags match; similarly for VFP
15666
             flags.  */
15667
          if ((in_flags & EF_ARM_APCS_FLOAT) != 0
15668
              || (in_flags & EF_ARM_VFP_FLOAT) == 0)
15669
            {
15670
              if (in_flags & EF_ARM_SOFT_FLOAT)
15671
                _bfd_error_handler
15672
                  (_("error: %B uses software FP, whereas %B uses hardware FP"),
15673
                   ibfd, obfd);
15674
              else
15675
                _bfd_error_handler
15676
                  (_("error: %B uses hardware FP, whereas %B uses software FP"),
15677
                   ibfd, obfd);
15678
 
15679
              flags_compatible = FALSE;
15680
            }
15681
        }
15682
#endif
15683
 
15684
      /* Interworking mismatch is only a warning.  */
15685
      if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
15686
        {
15687
          if (in_flags & EF_ARM_INTERWORK)
15688
            {
15689
              _bfd_error_handler
15690
                (_("Warning: %B supports interworking, whereas %B does not"),
15691
                 ibfd, obfd);
15692
            }
15693
          else
15694
            {
15695
              _bfd_error_handler
15696
                (_("Warning: %B does not support interworking, whereas %B does"),
15697
                 ibfd, obfd);
15698
            }
15699
        }
15700
    }
15701
 
15702
  return flags_compatible;
15703
}
15704
 
15705
 
15706
/* Symbian OS Targets.  */
15707
 
15708
#undef  TARGET_LITTLE_SYM
15709
#define TARGET_LITTLE_SYM               bfd_elf32_littlearm_symbian_vec
15710
#undef  TARGET_LITTLE_NAME
15711
#define TARGET_LITTLE_NAME              "elf32-littlearm-symbian"
15712
#undef  TARGET_BIG_SYM
15713
#define TARGET_BIG_SYM                  bfd_elf32_bigarm_symbian_vec
15714
#undef  TARGET_BIG_NAME
15715
#define TARGET_BIG_NAME                 "elf32-bigarm-symbian"
15716
 
15717
/* Like elf32_arm_link_hash_table_create -- but overrides
15718
   appropriately for Symbian OS.  */
15719
 
15720
static struct bfd_link_hash_table *
15721
elf32_arm_symbian_link_hash_table_create (bfd *abfd)
15722
{
15723
  struct bfd_link_hash_table *ret;
15724
 
15725
  ret = elf32_arm_link_hash_table_create (abfd);
15726
  if (ret)
15727
    {
15728
      struct elf32_arm_link_hash_table *htab
15729
        = (struct elf32_arm_link_hash_table *)ret;
15730
      /* There is no PLT header for Symbian OS.  */
15731
      htab->plt_header_size = 0;
15732
      /* The PLT entries are each one instruction and one word.  */
15733
      htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
15734
      htab->symbian_p = 1;
15735
      /* Symbian uses armv5t or above, so use_blx is always true.  */
15736
      htab->use_blx = 1;
15737
      htab->root.is_relocatable_executable = 1;
15738
    }
15739
  return ret;
15740
}
15741
 
15742
static const struct bfd_elf_special_section
15743
elf32_arm_symbian_special_sections[] =
15744
{
15745
  /* In a BPABI executable, the dynamic linking sections do not go in
15746
     the loadable read-only segment.  The post-linker may wish to
15747
     refer to these sections, but they are not part of the final
15748
     program image.  */
15749
  { STRING_COMMA_LEN (".dynamic"),       0, SHT_DYNAMIC,  0 },
15750
  { STRING_COMMA_LEN (".dynstr"),        0, SHT_STRTAB,   0 },
15751
  { STRING_COMMA_LEN (".dynsym"),        0, SHT_DYNSYM,   0 },
15752
  { STRING_COMMA_LEN (".got"),           0, SHT_PROGBITS, 0 },
15753
  { STRING_COMMA_LEN (".hash"),          0, SHT_HASH,     0 },
15754
  /* These sections do not need to be writable as the SymbianOS
15755
     postlinker will arrange things so that no dynamic relocation is
15756
     required.  */
15757
  { STRING_COMMA_LEN (".init_array"),    0, SHT_INIT_ARRAY,    SHF_ALLOC },
15758
  { STRING_COMMA_LEN (".fini_array"),    0, SHT_FINI_ARRAY,    SHF_ALLOC },
15759
  { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
15760
  { NULL,                             0, 0, 0,                 0 }
15761
};
15762
 
15763
static void
15764
elf32_arm_symbian_begin_write_processing (bfd *abfd,
15765
                                          struct bfd_link_info *link_info)
15766
{
15767
  /* BPABI objects are never loaded directly by an OS kernel; they are
15768
     processed by a postlinker first, into an OS-specific format.  If
15769
     the D_PAGED bit is set on the file, BFD will align segments on
15770
     page boundaries, so that an OS can directly map the file.  With
15771
     BPABI objects, that just results in wasted space.  In addition,
15772
     because we clear the D_PAGED bit, map_sections_to_segments will
15773
     recognize that the program headers should not be mapped into any
15774
     loadable segment.  */
15775
  abfd->flags &= ~D_PAGED;
15776
  elf32_arm_begin_write_processing (abfd, link_info);
15777
}
15778
 
15779
static bfd_boolean
15780
elf32_arm_symbian_modify_segment_map (bfd *abfd,
15781
                                      struct bfd_link_info *info)
15782
{
15783
  struct elf_segment_map *m;
15784
  asection *dynsec;
15785
 
15786
  /* BPABI shared libraries and executables should have a PT_DYNAMIC
15787
     segment.  However, because the .dynamic section is not marked
15788
     with SEC_LOAD, the generic ELF code will not create such a
15789
     segment.  */
15790
  dynsec = bfd_get_section_by_name (abfd, ".dynamic");
15791
  if (dynsec)
15792
    {
15793
      for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
15794
        if (m->p_type == PT_DYNAMIC)
15795
          break;
15796
 
15797
      if (m == NULL)
15798
        {
15799
          m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
15800
          m->next = elf_tdata (abfd)->segment_map;
15801
          elf_tdata (abfd)->segment_map = m;
15802
        }
15803
    }
15804
 
15805
  /* Also call the generic arm routine.  */
15806
  return elf32_arm_modify_segment_map (abfd, info);
15807
}
15808
 
15809
/* Return address for Ith PLT stub in section PLT, for relocation REL
15810
   or (bfd_vma) -1 if it should not be included.  */
15811
 
15812
static bfd_vma
15813
elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
15814
                               const arelent *rel ATTRIBUTE_UNUSED)
15815
{
15816
  return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
15817
}
15818
 
15819
 
15820
#undef  elf32_bed
15821
#define elf32_bed elf32_arm_symbian_bed
15822
 
15823
/* The dynamic sections are not allocated on SymbianOS; the postlinker
15824
   will process them and then discard them.  */
15825
#undef  ELF_DYNAMIC_SEC_FLAGS
15826
#define ELF_DYNAMIC_SEC_FLAGS \
15827
  (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
15828
 
15829
#undef elf_backend_emit_relocs
15830
 
15831
#undef  bfd_elf32_bfd_link_hash_table_create
15832
#define bfd_elf32_bfd_link_hash_table_create    elf32_arm_symbian_link_hash_table_create
15833
#undef  elf_backend_special_sections
15834
#define elf_backend_special_sections            elf32_arm_symbian_special_sections
15835
#undef  elf_backend_begin_write_processing
15836
#define elf_backend_begin_write_processing      elf32_arm_symbian_begin_write_processing
15837
#undef  elf_backend_final_write_processing
15838
#define elf_backend_final_write_processing      elf32_arm_final_write_processing
15839
 
15840
#undef  elf_backend_modify_segment_map
15841
#define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
15842
 
15843
/* There is no .got section for BPABI objects, and hence no header.  */
15844
#undef  elf_backend_got_header_size
15845
#define elf_backend_got_header_size 0
15846
 
15847
/* Similarly, there is no .got.plt section.  */
15848
#undef  elf_backend_want_got_plt
15849
#define elf_backend_want_got_plt 0
15850
 
15851
#undef  elf_backend_plt_sym_val
15852
#define elf_backend_plt_sym_val         elf32_arm_symbian_plt_sym_val
15853
 
15854
#undef  elf_backend_may_use_rel_p
15855
#define elf_backend_may_use_rel_p       1
15856
#undef  elf_backend_may_use_rela_p
15857
#define elf_backend_may_use_rela_p      0
15858
#undef  elf_backend_default_use_rela_p
15859
#define elf_backend_default_use_rela_p  0
15860
#undef  elf_backend_want_plt_sym
15861
#define elf_backend_want_plt_sym        0
15862
#undef  ELF_MAXPAGESIZE
15863
#define ELF_MAXPAGESIZE                 0x8000
15864
 
15865
#include "elf32-target.h"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.