]> Git Repo - binutils.git/blob - bfd/elf32-arm.h
daily update
[binutils.git] / bfd / elf32-arm.h
1 /* 32-bit ELF support for ARM
2    Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #ifndef USE_REL
21 #define USE_REL 0
22 #endif
23
24 typedef unsigned long int insn32;
25 typedef unsigned short int insn16;
26
27 static bfd_boolean elf32_arm_set_private_flags
28   PARAMS ((bfd *, flagword));
29 static bfd_boolean elf32_arm_copy_private_bfd_data
30   PARAMS ((bfd *, bfd *));
31 static bfd_boolean elf32_arm_merge_private_bfd_data
32   PARAMS ((bfd *, bfd *));
33 static bfd_boolean elf32_arm_print_private_bfd_data
34   PARAMS ((bfd *, PTR));
35 static int elf32_arm_get_symbol_type
36   PARAMS (( Elf_Internal_Sym *, int));
37 static struct bfd_link_hash_table *elf32_arm_link_hash_table_create
38   PARAMS ((bfd *));
39 static bfd_reloc_status_type elf32_arm_final_link_relocate
40   PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *,
41            Elf_Internal_Rela *, bfd_vma, struct bfd_link_info *, asection *,
42            const char *, int, struct elf_link_hash_entry *));
43 static insn32 insert_thumb_branch
44   PARAMS ((insn32, int));
45 static struct elf_link_hash_entry *find_thumb_glue
46   PARAMS ((struct bfd_link_info *, const char *, bfd *));
47 static struct elf_link_hash_entry *find_arm_glue
48   PARAMS ((struct bfd_link_info *, const char *, bfd *));
49 static void elf32_arm_post_process_headers
50   PARAMS ((bfd *, struct bfd_link_info *));
51 static int elf32_arm_to_thumb_stub
52   PARAMS ((struct bfd_link_info *, const char *, bfd *, bfd *, asection *,
53            bfd_byte *, asection *, bfd_vma, bfd_signed_vma, bfd_vma));
54 static int elf32_thumb_to_arm_stub
55   PARAMS ((struct bfd_link_info *, const char *, bfd *, bfd *, asection *,
56            bfd_byte *, asection *, bfd_vma, bfd_signed_vma, bfd_vma));
57 static bfd_boolean elf32_arm_relocate_section
58   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
59            Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
60 static asection * elf32_arm_gc_mark_hook
61   PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
62            struct elf_link_hash_entry *, Elf_Internal_Sym *));
63 static bfd_boolean elf32_arm_gc_sweep_hook
64   PARAMS ((bfd *, struct bfd_link_info *, asection *,
65            const Elf_Internal_Rela *));
66 static bfd_boolean elf32_arm_check_relocs
67   PARAMS ((bfd *, struct bfd_link_info *, asection *,
68            const Elf_Internal_Rela *));
69 static bfd_boolean elf32_arm_find_nearest_line
70   PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
71            const char **, unsigned int *));
72 static bfd_boolean elf32_arm_adjust_dynamic_symbol
73   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
74 static bfd_boolean elf32_arm_size_dynamic_sections
75   PARAMS ((bfd *, struct bfd_link_info *));
76 static bfd_boolean elf32_arm_finish_dynamic_symbol
77   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
78            Elf_Internal_Sym *));
79 static bfd_boolean elf32_arm_finish_dynamic_sections
80   PARAMS ((bfd *, struct bfd_link_info *));
81 static struct bfd_hash_entry * elf32_arm_link_hash_newfunc
82   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
83 #if USE_REL
84 static void arm_add_to_rel
85   PARAMS ((bfd *, bfd_byte *, reloc_howto_type *, bfd_signed_vma));
86 #endif
87 static enum elf_reloc_type_class elf32_arm_reloc_type_class
88   PARAMS ((const Elf_Internal_Rela *));
89
90 #ifndef ELFARM_NABI_C_INCLUDED
91 static void record_arm_to_thumb_glue
92   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
93 static void record_thumb_to_arm_glue
94   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
95 bfd_boolean bfd_elf32_arm_allocate_interworking_sections
96   PARAMS ((struct bfd_link_info *));
97 bfd_boolean bfd_elf32_arm_get_bfd_for_interworking
98   PARAMS ((bfd *, struct bfd_link_info *));
99 bfd_boolean bfd_elf32_arm_process_before_allocation
100   PARAMS ((bfd *, struct bfd_link_info *, int));
101 #endif
102
103
104 #define INTERWORK_FLAG(abfd)   (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK)
105
106 /* The linker script knows the section names for placement.
107    The entry_names are used to do simple name mangling on the stubs.
108    Given a function name, and its type, the stub can be found. The
109    name can be changed. The only requirement is the %s be present.  */
110 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
111 #define THUMB2ARM_GLUE_ENTRY_NAME   "__%s_from_thumb"
112
113 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
114 #define ARM2THUMB_GLUE_ENTRY_NAME   "__%s_from_arm"
115
116 /* The name of the dynamic interpreter.  This is put in the .interp
117    section.  */
118 #define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
119
120 /* The size in bytes of an entry in the procedure linkage table.  */
121 #define PLT_ENTRY_SIZE 16
122
123 /* The first entry in a procedure linkage table looks like
124    this.  It is set up so that any shared library function that is
125    called before the relocation has been set up calls the dynamic
126    linker first.  */
127 static const bfd_vma elf32_arm_plt0_entry [PLT_ENTRY_SIZE / 4] =
128   {
129     0xe52de004, /* str   lr, [sp, #-4]!     */
130     0xe59fe010, /* ldr   lr, [pc, #16]      */
131     0xe08fe00e, /* add   lr, pc, lr         */
132     0xe5bef008  /* ldr   pc, [lr, #8]!      */
133   };
134
135 /* Subsequent entries in a procedure linkage table look like
136    this.  */
137 static const bfd_vma elf32_arm_plt_entry [PLT_ENTRY_SIZE / 4] =
138  {
139    0xe59fc004,  /* ldr   ip, [pc, #4]       */
140    0xe08fc00c,  /* add   ip, pc, ip         */
141    0xe59cf000,  /* ldr   pc, [ip]           */
142    0x00000000   /* offset to symbol in got  */
143  };
144
145 /* The ARM linker needs to keep track of the number of relocs that it
146    decides to copy in check_relocs for each symbol.  This is so that
147    it can discard PC relative relocs if it doesn't need them when
148    linking with -Bsymbolic.  We store the information in a field
149    extending the regular ELF linker hash table.  */
150
151 /* This structure keeps track of the number of PC relative relocs we
152    have copied for a given symbol.  */
153 struct elf32_arm_pcrel_relocs_copied
154   {
155     /* Next section.  */
156     struct elf32_arm_pcrel_relocs_copied * next;
157     /* A section in dynobj.  */
158     asection * section;
159     /* Number of relocs copied in this section.  */
160     bfd_size_type count;
161   };
162
163 /* Arm ELF linker hash entry.  */
164 struct elf32_arm_link_hash_entry
165   {
166     struct elf_link_hash_entry root;
167
168     /* Number of PC relative relocs copied for this symbol.  */
169     struct elf32_arm_pcrel_relocs_copied * pcrel_relocs_copied;
170   };
171
172 /* Declare this now that the above structures are defined.  */
173 static bfd_boolean elf32_arm_discard_copies
174   PARAMS ((struct elf32_arm_link_hash_entry *, PTR));
175
176 /* Traverse an arm ELF linker hash table.  */
177 #define elf32_arm_link_hash_traverse(table, func, info)                 \
178   (elf_link_hash_traverse                                               \
179    (&(table)->root,                                                     \
180     (bfd_boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
181     (info)))
182
183 /* Get the ARM elf linker hash table from a link_info structure.  */
184 #define elf32_arm_hash_table(info) \
185   ((struct elf32_arm_link_hash_table *) ((info)->hash))
186
187 /* ARM ELF linker hash table.  */
188 struct elf32_arm_link_hash_table
189   {
190     /* The main hash table.  */
191     struct elf_link_hash_table root;
192
193     /* The size in bytes of the section containg the Thumb-to-ARM glue.  */
194     bfd_size_type thumb_glue_size;
195
196     /* The size in bytes of the section containg the ARM-to-Thumb glue.  */
197     bfd_size_type arm_glue_size;
198
199     /* An arbitary input BFD chosen to hold the glue sections.  */
200     bfd * bfd_of_glue_owner;
201
202     /* A boolean indicating whether knowledge of the ARM's pipeline
203        length should be applied by the linker.  */
204     int no_pipeline_knowledge;
205   };
206
207 /* Create an entry in an ARM ELF linker hash table.  */
208
209 static struct bfd_hash_entry *
210 elf32_arm_link_hash_newfunc (entry, table, string)
211      struct bfd_hash_entry * entry;
212      struct bfd_hash_table * table;
213      const char * string;
214 {
215   struct elf32_arm_link_hash_entry * ret =
216     (struct elf32_arm_link_hash_entry *) entry;
217
218   /* Allocate the structure if it has not already been allocated by a
219      subclass.  */
220   if (ret == (struct elf32_arm_link_hash_entry *) NULL)
221     ret = ((struct elf32_arm_link_hash_entry *)
222            bfd_hash_allocate (table,
223                               sizeof (struct elf32_arm_link_hash_entry)));
224   if (ret == (struct elf32_arm_link_hash_entry *) NULL)
225     return (struct bfd_hash_entry *) ret;
226
227   /* Call the allocation method of the superclass.  */
228   ret = ((struct elf32_arm_link_hash_entry *)
229          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
230                                      table, string));
231   if (ret != (struct elf32_arm_link_hash_entry *) NULL)
232     ret->pcrel_relocs_copied = NULL;
233
234   return (struct bfd_hash_entry *) ret;
235 }
236
237 /* Create an ARM elf linker hash table.  */
238
239 static struct bfd_link_hash_table *
240 elf32_arm_link_hash_table_create (abfd)
241      bfd *abfd;
242 {
243   struct elf32_arm_link_hash_table *ret;
244   bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
245
246   ret = (struct elf32_arm_link_hash_table *) bfd_malloc (amt);
247   if (ret == (struct elf32_arm_link_hash_table *) NULL)
248     return NULL;
249
250   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
251                                       elf32_arm_link_hash_newfunc))
252     {
253       free (ret);
254       return NULL;
255     }
256
257   ret->thumb_glue_size = 0;
258   ret->arm_glue_size = 0;
259   ret->bfd_of_glue_owner = NULL;
260   ret->no_pipeline_knowledge = 0;
261
262   return &ret->root.root;
263 }
264
265 /* Locate the Thumb encoded calling stub for NAME.  */
266
267 static struct elf_link_hash_entry *
268 find_thumb_glue (link_info, name, input_bfd)
269      struct bfd_link_info *link_info;
270      const char *name;
271      bfd *input_bfd;
272 {
273   char *tmp_name;
274   struct elf_link_hash_entry *hash;
275   struct elf32_arm_link_hash_table *hash_table;
276
277   /* We need a pointer to the armelf specific hash table.  */
278   hash_table = elf32_arm_hash_table (link_info);
279
280   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
281                                   + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
282
283   BFD_ASSERT (tmp_name);
284
285   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
286
287   hash = elf_link_hash_lookup
288     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
289
290   if (hash == NULL)
291     /* xgettext:c-format */
292     (*_bfd_error_handler) (_("%s: unable to find THUMB glue '%s' for `%s'"),
293                            bfd_archive_filename (input_bfd), tmp_name, name);
294
295   free (tmp_name);
296
297   return hash;
298 }
299
300 /* Locate the ARM encoded calling stub for NAME.  */
301
302 static struct elf_link_hash_entry *
303 find_arm_glue (link_info, name, input_bfd)
304      struct bfd_link_info *link_info;
305      const char *name;
306      bfd *input_bfd;
307 {
308   char *tmp_name;
309   struct elf_link_hash_entry *myh;
310   struct elf32_arm_link_hash_table *hash_table;
311
312   /* We need a pointer to the elfarm specific hash table.  */
313   hash_table = elf32_arm_hash_table (link_info);
314
315   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
316                                   + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
317
318   BFD_ASSERT (tmp_name);
319
320   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
321
322   myh = elf_link_hash_lookup
323     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
324
325   if (myh == NULL)
326     /* xgettext:c-format */
327     (*_bfd_error_handler) (_("%s: unable to find ARM glue '%s' for `%s'"),
328                            bfd_archive_filename (input_bfd), tmp_name, name);
329
330   free (tmp_name);
331
332   return myh;
333 }
334
335 /* ARM->Thumb glue:
336
337    .arm
338    __func_from_arm:
339    ldr r12, __func_addr
340    bx  r12
341    __func_addr:
342    .word func    @ behave as if you saw a ARM_32 reloc.  */
343
344 #define ARM2THUMB_GLUE_SIZE 12
345 static const insn32 a2t1_ldr_insn = 0xe59fc000;
346 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
347 static const insn32 a2t3_func_addr_insn = 0x00000001;
348
349 /* Thumb->ARM:                          Thumb->(non-interworking aware) ARM
350
351    .thumb                               .thumb
352    .align 2                             .align 2
353    __func_from_thumb:              __func_from_thumb:
354    bx pc                                push {r6, lr}
355    nop                                  ldr  r6, __func_addr
356    .arm                                         mov  lr, pc
357    __func_change_to_arm:                        bx   r6
358    b func                       .arm
359    __func_back_to_thumb:
360    ldmia r13! {r6, lr}
361    bx    lr
362    __func_addr:
363    .word        func  */
364
365 #define THUMB2ARM_GLUE_SIZE 8
366 static const insn16 t2a1_bx_pc_insn = 0x4778;
367 static const insn16 t2a2_noop_insn = 0x46c0;
368 static const insn32 t2a3_b_insn = 0xea000000;
369
370 #ifndef ELFARM_NABI_C_INCLUDED
371 bfd_boolean
372 bfd_elf32_arm_allocate_interworking_sections (info)
373      struct bfd_link_info * info;
374 {
375   asection * s;
376   bfd_byte * foo;
377   struct elf32_arm_link_hash_table * globals;
378
379   globals = elf32_arm_hash_table (info);
380
381   BFD_ASSERT (globals != NULL);
382
383   if (globals->arm_glue_size != 0)
384     {
385       BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
386
387       s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
388                                    ARM2THUMB_GLUE_SECTION_NAME);
389
390       BFD_ASSERT (s != NULL);
391
392       foo = (bfd_byte *) bfd_alloc (globals->bfd_of_glue_owner,
393                                     globals->arm_glue_size);
394
395       s->_raw_size = s->_cooked_size = globals->arm_glue_size;
396       s->contents = foo;
397     }
398
399   if (globals->thumb_glue_size != 0)
400     {
401       BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
402
403       s = bfd_get_section_by_name
404         (globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
405
406       BFD_ASSERT (s != NULL);
407
408       foo = (bfd_byte *) bfd_alloc (globals->bfd_of_glue_owner,
409                                     globals->thumb_glue_size);
410
411       s->_raw_size = s->_cooked_size = globals->thumb_glue_size;
412       s->contents = foo;
413     }
414
415   return TRUE;
416 }
417
418 static void
419 record_arm_to_thumb_glue (link_info, h)
420      struct bfd_link_info * link_info;
421      struct elf_link_hash_entry * h;
422 {
423   const char * name = h->root.root.string;
424   asection * s;
425   char * tmp_name;
426   struct elf_link_hash_entry * myh;
427   struct bfd_link_hash_entry * bh;
428   struct elf32_arm_link_hash_table * globals;
429   bfd_vma val;
430
431   globals = elf32_arm_hash_table (link_info);
432
433   BFD_ASSERT (globals != NULL);
434   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
435
436   s = bfd_get_section_by_name
437     (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
438
439   BFD_ASSERT (s != NULL);
440
441   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
442                                   + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
443
444   BFD_ASSERT (tmp_name);
445
446   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
447
448   myh = elf_link_hash_lookup
449     (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
450
451   if (myh != NULL)
452     {
453       /* We've already seen this guy.  */
454       free (tmp_name);
455       return;
456     }
457
458   /* The only trick here is using hash_table->arm_glue_size as the value. Even
459      though the section isn't allocated yet, this is where we will be putting
460      it.  */
461   bh = NULL;
462   val = globals->arm_glue_size + 1;
463   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
464                                     tmp_name, BSF_GLOBAL, s, val,
465                                     NULL, TRUE, FALSE, &bh);
466
467   free (tmp_name);
468
469   globals->arm_glue_size += ARM2THUMB_GLUE_SIZE;
470
471   return;
472 }
473
474 static void
475 record_thumb_to_arm_glue (link_info, h)
476      struct bfd_link_info *link_info;
477      struct elf_link_hash_entry *h;
478 {
479   const char *name = h->root.root.string;
480   asection *s;
481   char *tmp_name;
482   struct elf_link_hash_entry *myh;
483   struct bfd_link_hash_entry *bh;
484   struct elf32_arm_link_hash_table *hash_table;
485   char bind;
486   bfd_vma val;
487
488   hash_table = elf32_arm_hash_table (link_info);
489
490   BFD_ASSERT (hash_table != NULL);
491   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
492
493   s = bfd_get_section_by_name
494     (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
495
496   BFD_ASSERT (s != NULL);
497
498   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
499                                   + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
500
501   BFD_ASSERT (tmp_name);
502
503   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
504
505   myh = elf_link_hash_lookup
506     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
507
508   if (myh != NULL)
509     {
510       /* We've already seen this guy.  */
511       free (tmp_name);
512       return;
513     }
514
515   bh = NULL;
516   val = hash_table->thumb_glue_size + 1;
517   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
518                                     tmp_name, BSF_GLOBAL, s, val,
519                                     NULL, TRUE, FALSE, &bh);
520
521   /* If we mark it 'Thumb', the disassembler will do a better job.  */
522   myh = (struct elf_link_hash_entry *) bh;
523   bind = ELF_ST_BIND (myh->type);
524   myh->type = ELF_ST_INFO (bind, STT_ARM_TFUNC);
525
526   free (tmp_name);
527
528 #define CHANGE_TO_ARM "__%s_change_to_arm"
529 #define BACK_FROM_ARM "__%s_back_from_arm"
530
531   /* Allocate another symbol to mark where we switch to Arm mode.  */
532   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
533                                   + strlen (CHANGE_TO_ARM) + 1);
534
535   BFD_ASSERT (tmp_name);
536
537   sprintf (tmp_name, CHANGE_TO_ARM, name);
538
539   bh = NULL;
540   val = hash_table->thumb_glue_size + 4,
541   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
542                                     tmp_name, BSF_LOCAL, s, val,
543                                     NULL, TRUE, FALSE, &bh);
544
545   free (tmp_name);
546
547   hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
548
549   return;
550 }
551
552 /* Add the glue sections to ABFD.  This function is called from the
553    linker scripts in ld/emultempl/{armelf}.em.  */
554
555 bfd_boolean
556 bfd_elf32_arm_add_glue_sections_to_bfd (abfd, info)
557      bfd *abfd;
558      struct bfd_link_info *info;
559 {
560   flagword flags;
561   asection *sec;
562
563   /* If we are only performing a partial
564      link do not bother adding the glue.  */
565   if (info->relocateable)
566     return TRUE;
567
568   sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
569
570   if (sec == NULL)
571     {
572       /* Note: we do not include the flag SEC_LINKER_CREATED, as this
573          will prevent elf_link_input_bfd() from processing the contents
574          of this section.  */
575       flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY;
576
577       sec = bfd_make_section (abfd, ARM2THUMB_GLUE_SECTION_NAME);
578
579       if (sec == NULL
580           || !bfd_set_section_flags (abfd, sec, flags)
581           || !bfd_set_section_alignment (abfd, sec, 2))
582         return FALSE;
583
584       /* Set the gc mark to prevent the section from being removed by garbage
585          collection, despite the fact that no relocs refer to this section.  */
586       sec->gc_mark = 1;
587     }
588
589   sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
590
591   if (sec == NULL)
592     {
593       flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY;
594
595       sec = bfd_make_section (abfd, THUMB2ARM_GLUE_SECTION_NAME);
596
597       if (sec == NULL
598           || !bfd_set_section_flags (abfd, sec, flags)
599           || !bfd_set_section_alignment (abfd, sec, 2))
600         return FALSE;
601
602       sec->gc_mark = 1;
603     }
604
605   return TRUE;
606 }
607
608 /* Select a BFD to be used to hold the sections used by the glue code.
609    This function is called from the linker scripts in ld/emultempl/
610    {armelf/pe}.em  */
611
612 bfd_boolean
613 bfd_elf32_arm_get_bfd_for_interworking (abfd, info)
614      bfd *abfd;
615      struct bfd_link_info *info;
616 {
617   struct elf32_arm_link_hash_table *globals;
618
619   /* If we are only performing a partial link
620      do not bother getting a bfd to hold the glue.  */
621   if (info->relocateable)
622     return TRUE;
623
624   globals = elf32_arm_hash_table (info);
625
626   BFD_ASSERT (globals != NULL);
627
628   if (globals->bfd_of_glue_owner != NULL)
629     return TRUE;
630
631   /* Save the bfd for later use.  */
632   globals->bfd_of_glue_owner = abfd;
633
634   return TRUE;
635 }
636
637 bfd_boolean
638 bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
639      bfd *abfd;
640      struct bfd_link_info *link_info;
641      int no_pipeline_knowledge;
642 {
643   Elf_Internal_Shdr *symtab_hdr;
644   Elf_Internal_Rela *internal_relocs = NULL;
645   Elf_Internal_Rela *irel, *irelend;
646   bfd_byte *contents = NULL;
647
648   asection *sec;
649   struct elf32_arm_link_hash_table *globals;
650
651   /* If we are only performing a partial link do not bother
652      to construct any glue.  */
653   if (link_info->relocateable)
654     return TRUE;
655
656   /* Here we have a bfd that is to be included on the link.  We have a hook
657      to do reloc rummaging, before section sizes are nailed down.  */
658   globals = elf32_arm_hash_table (link_info);
659
660   BFD_ASSERT (globals != NULL);
661   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
662
663   globals->no_pipeline_knowledge = no_pipeline_knowledge;
664
665   /* Rummage around all the relocs and map the glue vectors.  */
666   sec = abfd->sections;
667
668   if (sec == NULL)
669     return TRUE;
670
671   for (; sec != NULL; sec = sec->next)
672     {
673       if (sec->reloc_count == 0)
674         continue;
675
676       symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
677
678       /* Load the relocs.  */
679       internal_relocs
680         = _bfd_elf32_link_read_relocs (abfd, sec, (PTR) NULL,
681                                        (Elf_Internal_Rela *) NULL, FALSE);
682
683       if (internal_relocs == NULL)
684         goto error_return;
685
686       irelend = internal_relocs + sec->reloc_count;
687       for (irel = internal_relocs; irel < irelend; irel++)
688         {
689           long r_type;
690           unsigned long r_index;
691
692           struct elf_link_hash_entry *h;
693
694           r_type = ELF32_R_TYPE (irel->r_info);
695           r_index = ELF32_R_SYM (irel->r_info);
696
697           /* These are the only relocation types we care about.  */
698           if (   r_type != R_ARM_PC24
699               && r_type != R_ARM_THM_PC22)
700             continue;
701
702           /* Get the section contents if we haven't done so already.  */
703           if (contents == NULL)
704             {
705               /* Get cached copy if it exists.  */
706               if (elf_section_data (sec)->this_hdr.contents != NULL)
707                 contents = elf_section_data (sec)->this_hdr.contents;
708               else
709                 {
710                   /* Go get them off disk.  */
711                   contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
712                   if (contents == NULL)
713                     goto error_return;
714
715                   if (!bfd_get_section_contents (abfd, sec, contents,
716                                                  (file_ptr) 0, sec->_raw_size))
717                     goto error_return;
718                 }
719             }
720
721           /* If the relocation is not against a symbol it cannot concern us.  */
722           h = NULL;
723
724           /* We don't care about local symbols.  */
725           if (r_index < symtab_hdr->sh_info)
726             continue;
727
728           /* This is an external symbol.  */
729           r_index -= symtab_hdr->sh_info;
730           h = (struct elf_link_hash_entry *)
731             elf_sym_hashes (abfd)[r_index];
732
733           /* If the relocation is against a static symbol it must be within
734              the current section and so cannot be a cross ARM/Thumb relocation.  */
735           if (h == NULL)
736             continue;
737
738           switch (r_type)
739             {
740             case R_ARM_PC24:
741               /* This one is a call from arm code.  We need to look up
742                  the target of the call.  If it is a thumb target, we
743                  insert glue.  */
744               if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
745                 record_arm_to_thumb_glue (link_info, h);
746               break;
747
748             case R_ARM_THM_PC22:
749               /* This one is a call from thumb code.  We look
750                  up the target of the call.  If it is not a thumb
751                  target, we insert glue.  */
752               if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
753                 record_thumb_to_arm_glue (link_info, h);
754               break;
755
756             default:
757               break;
758             }
759         }
760
761       if (contents != NULL
762           && elf_section_data (sec)->this_hdr.contents != contents)
763         free (contents);
764       contents = NULL;
765
766       if (internal_relocs != NULL
767           && elf_section_data (sec)->relocs != internal_relocs)
768         free (internal_relocs);
769       internal_relocs = NULL;
770     }
771
772   return TRUE;
773
774 error_return:
775   if (contents != NULL
776       && elf_section_data (sec)->this_hdr.contents != contents)
777     free (contents);
778   if (internal_relocs != NULL
779       && elf_section_data (sec)->relocs != internal_relocs)
780     free (internal_relocs);
781
782   return FALSE;
783 }
784 #endif
785
786 /* The thumb form of a long branch is a bit finicky, because the offset
787    encoding is split over two fields, each in it's own instruction. They
788    can occur in any order. So given a thumb form of long branch, and an
789    offset, insert the offset into the thumb branch and return finished
790    instruction.
791
792    It takes two thumb instructions to encode the target address. Each has
793    11 bits to invest. The upper 11 bits are stored in one (identifed by
794    H-0.. see below), the lower 11 bits are stored in the other (identified
795    by H-1).
796
797    Combine together and shifted left by 1 (it's a half word address) and
798    there you have it.
799
800    Op: 1111 = F,
801    H-0, upper address-0 = 000
802    Op: 1111 = F,
803    H-1, lower address-0 = 800
804
805    They can be ordered either way, but the arm tools I've seen always put
806    the lower one first. It probably doesn't matter. [email protected]
807
808    XXX:  Actually the order does matter.  The second instruction (H-1)
809    moves the computed address into the PC, so it must be the second one
810    in the sequence.  The problem, however is that whilst little endian code
811    stores the instructions in HI then LOW order, big endian code does the
812    reverse.  [email protected].  */
813
814 #define LOW_HI_ORDER      0xF800F000
815 #define HI_LOW_ORDER      0xF000F800
816
817 static insn32
818 insert_thumb_branch (br_insn, rel_off)
819      insn32 br_insn;
820      int rel_off;
821 {
822   unsigned int low_bits;
823   unsigned int high_bits;
824
825   BFD_ASSERT ((rel_off & 1) != 1);
826
827   rel_off >>= 1;                                /* Half word aligned address.  */
828   low_bits = rel_off & 0x000007FF;              /* The bottom 11 bits.  */
829   high_bits = (rel_off >> 11) & 0x000007FF;     /* The top 11 bits.  */
830
831   if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
832     br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
833   else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
834     br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
835   else
836     /* FIXME: abort is probably not the right call. [email protected]  */
837     abort ();                   /* error - not a valid branch instruction form.  */
838
839   return br_insn;
840 }
841
842 /* Thumb code calling an ARM function.  */
843
844 static int
845 elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
846                          hit_data, sym_sec, offset, addend, val)
847      struct bfd_link_info * info;
848      const char *           name;
849      bfd *                  input_bfd;
850      bfd *                  output_bfd;
851      asection *             input_section;
852      bfd_byte *             hit_data;
853      asection *             sym_sec;
854      bfd_vma                offset;
855      bfd_signed_vma         addend;
856      bfd_vma                val;
857 {
858   asection * s = 0;
859   bfd_vma my_offset;
860   unsigned long int tmp;
861   long int ret_offset;
862   struct elf_link_hash_entry * myh;
863   struct elf32_arm_link_hash_table * globals;
864
865   myh = find_thumb_glue (info, name, input_bfd);
866   if (myh == NULL)
867     return FALSE;
868
869   globals = elf32_arm_hash_table (info);
870
871   BFD_ASSERT (globals != NULL);
872   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
873
874   my_offset = myh->root.u.def.value;
875
876   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
877                                THUMB2ARM_GLUE_SECTION_NAME);
878
879   BFD_ASSERT (s != NULL);
880   BFD_ASSERT (s->contents != NULL);
881   BFD_ASSERT (s->output_section != NULL);
882
883   if ((my_offset & 0x01) == 0x01)
884     {
885       if (sym_sec != NULL
886           && sym_sec->owner != NULL
887           && !INTERWORK_FLAG (sym_sec->owner))
888         {
889           (*_bfd_error_handler)
890             (_("%s(%s): warning: interworking not enabled."),
891              bfd_archive_filename (sym_sec->owner), name);
892           (*_bfd_error_handler)
893             (_("  first occurrence: %s: thumb call to arm"),
894              bfd_archive_filename (input_bfd));
895
896           return FALSE;
897         }
898
899       --my_offset;
900       myh->root.u.def.value = my_offset;
901
902       bfd_put_16 (output_bfd, (bfd_vma) t2a1_bx_pc_insn,
903                   s->contents + my_offset);
904
905       bfd_put_16 (output_bfd, (bfd_vma) t2a2_noop_insn,
906                   s->contents + my_offset + 2);
907
908       ret_offset =
909         /* Address of destination of the stub.  */
910         ((bfd_signed_vma) val)
911         - ((bfd_signed_vma)
912            /* Offset from the start of the current section to the start of the stubs.  */
913            (s->output_offset
914             /* Offset of the start of this stub from the start of the stubs.  */
915             + my_offset
916             /* Address of the start of the current section.  */
917             + s->output_section->vma)
918            /* The branch instruction is 4 bytes into the stub.  */
919            + 4
920            /* ARM branches work from the pc of the instruction + 8.  */
921            + 8);
922
923       bfd_put_32 (output_bfd,
924                   (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
925                   s->contents + my_offset + 4);
926     }
927
928   BFD_ASSERT (my_offset <= globals->thumb_glue_size);
929
930   /* Now go back and fix up the original BL insn to point
931      to here.  */
932   ret_offset = (s->output_offset
933                 + my_offset
934                 - (input_section->output_offset
935                    + offset + addend)
936                 - 8);
937
938   tmp = bfd_get_32 (input_bfd, hit_data
939                     - input_section->vma);
940
941   bfd_put_32 (output_bfd,
942               (bfd_vma) insert_thumb_branch (tmp, ret_offset),
943               hit_data - input_section->vma);
944
945   return TRUE;
946 }
947
948 /* Arm code calling a Thumb function.  */
949
950 static int
951 elf32_arm_to_thumb_stub (info, name, input_bfd, output_bfd, input_section,
952                          hit_data, sym_sec, offset, addend, val)
953      struct bfd_link_info * info;
954      const char *           name;
955      bfd *                  input_bfd;
956      bfd *                  output_bfd;
957      asection *             input_section;
958      bfd_byte *             hit_data;
959      asection *             sym_sec;
960      bfd_vma                offset;
961      bfd_signed_vma         addend;
962      bfd_vma                val;
963 {
964   unsigned long int tmp;
965   bfd_vma my_offset;
966   asection * s;
967   long int ret_offset;
968   struct elf_link_hash_entry * myh;
969   struct elf32_arm_link_hash_table * globals;
970
971   myh = find_arm_glue (info, name, input_bfd);
972   if (myh == NULL)
973     return FALSE;
974
975   globals = elf32_arm_hash_table (info);
976
977   BFD_ASSERT (globals != NULL);
978   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
979
980   my_offset = myh->root.u.def.value;
981   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
982                                ARM2THUMB_GLUE_SECTION_NAME);
983   BFD_ASSERT (s != NULL);
984   BFD_ASSERT (s->contents != NULL);
985   BFD_ASSERT (s->output_section != NULL);
986
987   if ((my_offset & 0x01) == 0x01)
988     {
989       if (sym_sec != NULL
990           && sym_sec->owner != NULL
991           && !INTERWORK_FLAG (sym_sec->owner))
992         {
993           (*_bfd_error_handler)
994             (_("%s(%s): warning: interworking not enabled."),
995              bfd_archive_filename (sym_sec->owner), name);
996           (*_bfd_error_handler)
997             (_("  first occurrence: %s: arm call to thumb"),
998              bfd_archive_filename (input_bfd));
999         }
1000
1001       --my_offset;
1002       myh->root.u.def.value = my_offset;
1003
1004       bfd_put_32 (output_bfd, (bfd_vma) a2t1_ldr_insn,
1005                   s->contents + my_offset);
1006
1007       bfd_put_32 (output_bfd, (bfd_vma) a2t2_bx_r12_insn,
1008                   s->contents + my_offset + 4);
1009
1010       /* It's a thumb address.  Add the low order bit.  */
1011       bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
1012                   s->contents + my_offset + 8);
1013     }
1014
1015   BFD_ASSERT (my_offset <= globals->arm_glue_size);
1016
1017   tmp = bfd_get_32 (input_bfd, hit_data);
1018   tmp = tmp & 0xFF000000;
1019
1020   /* Somehow these are both 4 too far, so subtract 8.  */
1021   ret_offset = (s->output_offset
1022                 + my_offset
1023                 + s->output_section->vma
1024                 - (input_section->output_offset
1025                    + input_section->output_section->vma
1026                    + offset + addend)
1027                 - 8);
1028
1029   tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
1030
1031   bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
1032
1033   return TRUE;
1034 }
1035
1036 /* Perform a relocation as part of a final link.  */
1037
1038 static bfd_reloc_status_type
1039 elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
1040                                input_section, contents, rel, value,
1041                                info, sym_sec, sym_name, sym_flags, h)
1042      reloc_howto_type *     howto;
1043      bfd *                  input_bfd;
1044      bfd *                  output_bfd;
1045      asection *             input_section;
1046      bfd_byte *             contents;
1047      Elf_Internal_Rela *    rel;
1048      bfd_vma                value;
1049      struct bfd_link_info * info;
1050      asection *             sym_sec;
1051      const char *           sym_name;
1052      int                    sym_flags;
1053      struct elf_link_hash_entry * h;
1054 {
1055   unsigned long                 r_type = howto->type;
1056   unsigned long                 r_symndx;
1057   bfd_byte *                    hit_data = contents + rel->r_offset;
1058   bfd *                         dynobj = NULL;
1059   Elf_Internal_Shdr *           symtab_hdr;
1060   struct elf_link_hash_entry ** sym_hashes;
1061   bfd_vma *                     local_got_offsets;
1062   asection *                    sgot = NULL;
1063   asection *                    splt = NULL;
1064   asection *                    sreloc = NULL;
1065   bfd_vma                       addend;
1066   bfd_signed_vma                signed_addend;
1067   struct elf32_arm_link_hash_table * globals;
1068
1069   /* If the start address has been set, then set the EF_ARM_HASENTRY
1070      flag.  Setting this more than once is redundant, but the cost is
1071      not too high, and it keeps the code simple.
1072
1073      The test is done  here, rather than somewhere else, because the
1074      start address is only set just before the final link commences.
1075
1076      Note - if the user deliberately sets a start address of 0, the
1077      flag will not be set.  */
1078   if (bfd_get_start_address (output_bfd) != 0)
1079     elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
1080
1081   globals = elf32_arm_hash_table (info);
1082
1083   dynobj = elf_hash_table (info)->dynobj;
1084   if (dynobj)
1085     {
1086       sgot = bfd_get_section_by_name (dynobj, ".got");
1087       splt = bfd_get_section_by_name (dynobj, ".plt");
1088     }
1089   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1090   sym_hashes = elf_sym_hashes (input_bfd);
1091   local_got_offsets = elf_local_got_offsets (input_bfd);
1092   r_symndx = ELF32_R_SYM (rel->r_info);
1093
1094 #if USE_REL
1095   addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
1096
1097   if (addend & ((howto->src_mask + 1) >> 1))
1098     {
1099       signed_addend = -1;
1100       signed_addend &= ~ howto->src_mask;
1101       signed_addend |= addend;
1102     }
1103   else
1104     signed_addend = addend;
1105 #else
1106   addend = signed_addend = rel->r_addend;
1107 #endif
1108
1109   switch (r_type)
1110     {
1111     case R_ARM_NONE:
1112       return bfd_reloc_ok;
1113
1114     case R_ARM_PC24:
1115     case R_ARM_ABS32:
1116     case R_ARM_REL32:
1117 #ifndef OLD_ARM_ABI
1118     case R_ARM_XPC25:
1119 #endif
1120       /* When generating a shared object, these relocations are copied
1121          into the output file to be resolved at run time.  */
1122       if (info->shared
1123           && r_symndx != 0
1124           && (r_type != R_ARM_PC24
1125               || (h != NULL
1126                   && h->dynindx != -1
1127                   && (! info->symbolic
1128                       || (h->elf_link_hash_flags
1129                           & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1130         {
1131           Elf_Internal_Rela outrel;
1132           bfd_byte *loc;
1133           bfd_boolean skip, relocate;
1134
1135           if (sreloc == NULL)
1136             {
1137               const char * name;
1138
1139               name = (bfd_elf_string_from_elf_section
1140                       (input_bfd,
1141                        elf_elfheader (input_bfd)->e_shstrndx,
1142                        elf_section_data (input_section)->rel_hdr.sh_name));
1143               if (name == NULL)
1144                 return bfd_reloc_notsupported;
1145
1146               BFD_ASSERT (strncmp (name, ".rel", 4) == 0
1147                           && strcmp (bfd_get_section_name (input_bfd,
1148                                                            input_section),
1149                                      name + 4) == 0);
1150
1151               sreloc = bfd_get_section_by_name (dynobj, name);
1152               BFD_ASSERT (sreloc != NULL);
1153             }
1154
1155           skip = FALSE;
1156           relocate = FALSE;
1157
1158           outrel.r_offset =
1159             _bfd_elf_section_offset (output_bfd, info, input_section,
1160                                      rel->r_offset);
1161           if (outrel.r_offset == (bfd_vma) -1)
1162             skip = TRUE;
1163           else if (outrel.r_offset == (bfd_vma) -2)
1164             skip = TRUE, relocate = TRUE;
1165           outrel.r_offset += (input_section->output_section->vma
1166                               + input_section->output_offset);
1167
1168           if (skip)
1169             memset (&outrel, 0, sizeof outrel);
1170           else if (r_type == R_ARM_PC24)
1171             {
1172               BFD_ASSERT (h != NULL && h->dynindx != -1);
1173               if ((input_section->flags & SEC_ALLOC) == 0)
1174                 relocate = TRUE;
1175               outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_PC24);
1176             }
1177           else
1178             {
1179               if (h == NULL
1180                   || ((info->symbolic || h->dynindx == -1)
1181                       && (h->elf_link_hash_flags
1182                           & ELF_LINK_HASH_DEF_REGULAR) != 0))
1183                 {
1184                   relocate = TRUE;
1185                   outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
1186                 }
1187               else
1188                 {
1189                   BFD_ASSERT (h->dynindx != -1);
1190                   if ((input_section->flags & SEC_ALLOC) == 0)
1191                     relocate = TRUE;
1192                   outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_ABS32);
1193                 }
1194             }
1195
1196           loc = sreloc->contents;
1197           loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
1198           bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
1199
1200           /* If this reloc is against an external symbol, we do not want to
1201              fiddle with the addend.  Otherwise, we need to include the symbol
1202              value so that it becomes an addend for the dynamic reloc.  */
1203           if (! relocate)
1204             return bfd_reloc_ok;
1205
1206           return _bfd_final_link_relocate (howto, input_bfd, input_section,
1207                                            contents, rel->r_offset, value,
1208                                            (bfd_vma) 0);
1209         }
1210       else switch (r_type)
1211         {
1212 #ifndef OLD_ARM_ABI
1213         case R_ARM_XPC25:         /* Arm BLX instruction.  */
1214 #endif
1215         case R_ARM_PC24:          /* Arm B/BL instruction */
1216 #ifndef OLD_ARM_ABI
1217           if (r_type == R_ARM_XPC25)
1218             {
1219               /* Check for Arm calling Arm function.  */
1220               /* FIXME: Should we translate the instruction into a BL
1221                  instruction instead ?  */
1222               if (sym_flags != STT_ARM_TFUNC)
1223                 (*_bfd_error_handler) (_("\
1224 %s: Warning: Arm BLX instruction targets Arm function '%s'."),
1225                                        bfd_archive_filename (input_bfd),
1226                                        h ? h->root.root.string : "(local)");
1227             }
1228           else
1229 #endif
1230             {
1231               /* Check for Arm calling Thumb function.  */
1232               if (sym_flags == STT_ARM_TFUNC)
1233                 {
1234                   elf32_arm_to_thumb_stub (info, sym_name, input_bfd, output_bfd,
1235                                            input_section, hit_data, sym_sec, rel->r_offset,
1236                                            signed_addend, value);
1237                   return bfd_reloc_ok;
1238                 }
1239             }
1240
1241           if (   strcmp (bfd_get_target (input_bfd), "elf32-littlearm-oabi") == 0
1242               || strcmp (bfd_get_target (input_bfd), "elf32-bigarm-oabi") == 0)
1243             {
1244               /* The old way of doing things.  Trearing the addend as a
1245                  byte sized field and adding in the pipeline offset.  */
1246               value -= (input_section->output_section->vma
1247                         + input_section->output_offset);
1248               value -= rel->r_offset;
1249               value += addend;
1250
1251               if (! globals->no_pipeline_knowledge)
1252                 value -= 8;
1253             }
1254           else
1255             {
1256               /* The ARM ELF ABI says that this reloc is computed as: S - P + A
1257                  where:
1258                   S is the address of the symbol in the relocation.
1259                   P is address of the instruction being relocated.
1260                   A is the addend (extracted from the instruction) in bytes.
1261
1262                  S is held in 'value'.
1263                  P is the base address of the section containing the instruction
1264                    plus the offset of the reloc into that section, ie:
1265                      (input_section->output_section->vma +
1266                       input_section->output_offset +
1267                       rel->r_offset).
1268                  A is the addend, converted into bytes, ie:
1269                      (signed_addend * 4)
1270
1271                  Note: None of these operations have knowledge of the pipeline
1272                  size of the processor, thus it is up to the assembler to encode
1273                  this information into the addend.  */
1274               value -= (input_section->output_section->vma
1275                         + input_section->output_offset);
1276               value -= rel->r_offset;
1277               value += (signed_addend << howto->size);
1278
1279               /* Previous versions of this code also used to add in the pipeline
1280                  offset here.  This is wrong because the linker is not supposed
1281                  to know about such things, and one day it might change.  In order
1282                  to support old binaries that need the old behaviour however, so
1283                  we attempt to detect which ABI was used to create the reloc.  */
1284               if (! globals->no_pipeline_knowledge)
1285                 {
1286                   Elf_Internal_Ehdr * i_ehdrp; /* Elf file header, internal form */
1287
1288                   i_ehdrp = elf_elfheader (input_bfd);
1289
1290                   if (i_ehdrp->e_ident[EI_OSABI] == 0)
1291                     value -= 8;
1292                 }
1293             }
1294
1295           signed_addend = value;
1296           signed_addend >>= howto->rightshift;
1297
1298           /* It is not an error for an undefined weak reference to be
1299              out of range.  Any program that branches to such a symbol
1300              is going to crash anyway, so there is no point worrying
1301              about getting the destination exactly right.  */
1302           if (! h || h->root.type != bfd_link_hash_undefweak)
1303             {
1304               /* Perform a signed range check.  */
1305               if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
1306                   || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
1307                 return bfd_reloc_overflow;
1308             }
1309
1310 #ifndef OLD_ARM_ABI
1311           /* If necessary set the H bit in the BLX instruction.  */
1312           if (r_type == R_ARM_XPC25 && ((value & 2) == 2))
1313             value = (signed_addend & howto->dst_mask)
1314               | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask))
1315               | (1 << 24);
1316           else
1317 #endif
1318             value = (signed_addend & howto->dst_mask)
1319               | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
1320           break;
1321
1322         case R_ARM_ABS32:
1323           value += addend;
1324           if (sym_flags == STT_ARM_TFUNC)
1325             value |= 1;
1326           break;
1327
1328         case R_ARM_REL32:
1329           value -= (input_section->output_section->vma
1330                     + input_section->output_offset + rel->r_offset);
1331           value += addend;
1332           break;
1333         }
1334
1335       bfd_put_32 (input_bfd, value, hit_data);
1336       return bfd_reloc_ok;
1337
1338     case R_ARM_ABS8:
1339       value += addend;
1340       if ((long) value > 0x7f || (long) value < -0x80)
1341         return bfd_reloc_overflow;
1342
1343       bfd_put_8 (input_bfd, value, hit_data);
1344       return bfd_reloc_ok;
1345
1346     case R_ARM_ABS16:
1347       value += addend;
1348
1349       if ((long) value > 0x7fff || (long) value < -0x8000)
1350         return bfd_reloc_overflow;
1351
1352       bfd_put_16 (input_bfd, value, hit_data);
1353       return bfd_reloc_ok;
1354
1355     case R_ARM_ABS12:
1356       /* Support ldr and str instruction for the arm */
1357       /* Also thumb b (unconditional branch).  ??? Really?  */
1358       value += addend;
1359
1360       if ((long) value > 0x7ff || (long) value < -0x800)
1361         return bfd_reloc_overflow;
1362
1363       value |= (bfd_get_32 (input_bfd, hit_data) & 0xfffff000);
1364       bfd_put_32 (input_bfd, value, hit_data);
1365       return bfd_reloc_ok;
1366
1367     case R_ARM_THM_ABS5:
1368       /* Support ldr and str instructions for the thumb.  */
1369 #if USE_REL
1370       /* Need to refetch addend.  */
1371       addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
1372       /* ??? Need to determine shift amount from operand size.  */
1373       addend >>= howto->rightshift;
1374 #endif
1375       value += addend;
1376
1377       /* ??? Isn't value unsigned?  */
1378       if ((long) value > 0x1f || (long) value < -0x10)
1379         return bfd_reloc_overflow;
1380
1381       /* ??? Value needs to be properly shifted into place first.  */
1382       value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
1383       bfd_put_16 (input_bfd, value, hit_data);
1384       return bfd_reloc_ok;
1385
1386 #ifndef OLD_ARM_ABI
1387     case R_ARM_THM_XPC22:
1388 #endif
1389     case R_ARM_THM_PC22:
1390       /* Thumb BL (branch long instruction).  */
1391       {
1392         bfd_vma relocation;
1393         bfd_boolean overflow = FALSE;
1394         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
1395         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
1396         bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
1397         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
1398         bfd_vma check;
1399         bfd_signed_vma signed_check;
1400
1401 #if USE_REL
1402         /* Need to refetch the addend and squish the two 11 bit pieces
1403            together.  */
1404         {
1405           bfd_vma upper = upper_insn & 0x7ff;
1406           bfd_vma lower = lower_insn & 0x7ff;
1407           upper = (upper ^ 0x400) - 0x400; /* Sign extend.  */
1408           addend = (upper << 12) | (lower << 1);
1409           signed_addend = addend;
1410         }
1411 #endif
1412 #ifndef OLD_ARM_ABI
1413         if (r_type == R_ARM_THM_XPC22)
1414           {
1415             /* Check for Thumb to Thumb call.  */
1416             /* FIXME: Should we translate the instruction into a BL
1417                instruction instead ?  */
1418             if (sym_flags == STT_ARM_TFUNC)
1419               (*_bfd_error_handler) (_("\
1420 %s: Warning: Thumb BLX instruction targets thumb function '%s'."),
1421                                      bfd_archive_filename (input_bfd),
1422                                      h ? h->root.root.string : "(local)");
1423           }
1424         else
1425 #endif
1426           {
1427             /* If it is not a call to Thumb, assume call to Arm.
1428                If it is a call relative to a section name, then it is not a
1429                function call at all, but rather a long jump.  */
1430             if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION)
1431               {
1432                 if (elf32_thumb_to_arm_stub
1433                     (info, sym_name, input_bfd, output_bfd, input_section,
1434                      hit_data, sym_sec, rel->r_offset, signed_addend, value))
1435                   return bfd_reloc_ok;
1436                 else
1437                   return bfd_reloc_dangerous;
1438               }
1439           }
1440
1441         relocation = value + signed_addend;
1442
1443         relocation -= (input_section->output_section->vma
1444                        + input_section->output_offset
1445                        + rel->r_offset);
1446
1447         if (! globals->no_pipeline_knowledge)
1448           {
1449             Elf_Internal_Ehdr * i_ehdrp; /* Elf file header, internal form.  */
1450
1451             i_ehdrp = elf_elfheader (input_bfd);
1452
1453             /* Previous versions of this code also used to add in the pipline
1454                offset here.  This is wrong because the linker is not supposed
1455                to know about such things, and one day it might change.  In order
1456                to support old binaries that need the old behaviour however, so
1457                we attempt to detect which ABI was used to create the reloc.  */
1458             if (   strcmp (bfd_get_target (input_bfd), "elf32-littlearm-oabi") == 0
1459                 || strcmp (bfd_get_target (input_bfd), "elf32-bigarm-oabi") == 0
1460                 || i_ehdrp->e_ident[EI_OSABI] == 0)
1461               relocation += 4;
1462           }
1463
1464         check = relocation >> howto->rightshift;
1465
1466         /* If this is a signed value, the rightshift just dropped
1467            leading 1 bits (assuming twos complement).  */
1468         if ((bfd_signed_vma) relocation >= 0)
1469           signed_check = check;
1470         else
1471           signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
1472
1473         /* Assumes two's complement.  */
1474         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
1475           overflow = TRUE;
1476
1477 #ifndef OLD_ARM_ABI
1478         if (r_type == R_ARM_THM_XPC22
1479             && ((lower_insn & 0x1800) == 0x0800))
1480           /* For a BLX instruction, make sure that the relocation is rounded up
1481              to a word boundary.  This follows the semantics of the instruction
1482              which specifies that bit 1 of the target address will come from bit
1483              1 of the base address.  */
1484           relocation = (relocation + 2) & ~ 3;
1485 #endif
1486         /* Put RELOCATION back into the insn.  */
1487         upper_insn = (upper_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 12) & 0x7ff);
1488         lower_insn = (lower_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 1) & 0x7ff);
1489
1490         /* Put the relocated value back in the object file:  */
1491         bfd_put_16 (input_bfd, upper_insn, hit_data);
1492         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
1493
1494         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
1495       }
1496       break;
1497
1498     case R_ARM_THM_PC11:
1499       /* Thumb B (branch) instruction).  */
1500       {
1501         bfd_signed_vma relocation;
1502         bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
1503         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
1504         bfd_signed_vma signed_check;
1505
1506 #if USE_REL
1507         /* Need to refetch addend.  */
1508         addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
1509         if (addend & ((howto->src_mask + 1) >> 1))
1510           {
1511             signed_addend = -1;
1512             signed_addend &= ~ howto->src_mask;
1513             signed_addend |= addend;
1514           }
1515         else
1516           signed_addend = addend;
1517         /* The value in the insn has been right shifted.  We need to
1518            undo this, so that we can perform the address calculation
1519            in terms of bytes.  */
1520         signed_addend <<= howto->rightshift;
1521 #endif
1522         relocation = value + signed_addend;
1523
1524         relocation -= (input_section->output_section->vma
1525                        + input_section->output_offset
1526                        + rel->r_offset);
1527
1528         relocation >>= howto->rightshift;
1529         signed_check = relocation;
1530         relocation &= howto->dst_mask;
1531         relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
1532
1533         bfd_put_16 (input_bfd, relocation, hit_data);
1534
1535         /* Assumes two's complement.  */
1536         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
1537           return bfd_reloc_overflow;
1538
1539         return bfd_reloc_ok;
1540       }
1541
1542     case R_ARM_GNU_VTINHERIT:
1543     case R_ARM_GNU_VTENTRY:
1544       return bfd_reloc_ok;
1545
1546     case R_ARM_COPY:
1547       return bfd_reloc_notsupported;
1548
1549     case R_ARM_GLOB_DAT:
1550       return bfd_reloc_notsupported;
1551
1552     case R_ARM_JUMP_SLOT:
1553       return bfd_reloc_notsupported;
1554
1555     case R_ARM_RELATIVE:
1556       return bfd_reloc_notsupported;
1557
1558     case R_ARM_GOTOFF:
1559       /* Relocation is relative to the start of the
1560          global offset table.  */
1561
1562       BFD_ASSERT (sgot != NULL);
1563       if (sgot == NULL)
1564         return bfd_reloc_notsupported;
1565
1566       /* If we are addressing a Thumb function, we need to adjust the
1567          address by one, so that attempts to call the function pointer will
1568          correctly interpret it as Thumb code.  */
1569       if (sym_flags == STT_ARM_TFUNC)
1570         value += 1;
1571
1572       /* Note that sgot->output_offset is not involved in this
1573          calculation.  We always want the start of .got.  If we
1574          define _GLOBAL_OFFSET_TABLE in a different way, as is
1575          permitted by the ABI, we might have to change this
1576          calculation.  */
1577       value -= sgot->output_section->vma;
1578       return _bfd_final_link_relocate (howto, input_bfd, input_section,
1579                                        contents, rel->r_offset, value,
1580                                        (bfd_vma) 0);
1581
1582     case R_ARM_GOTPC:
1583       /* Use global offset table as symbol value.  */
1584       BFD_ASSERT (sgot != NULL);
1585
1586       if (sgot == NULL)
1587         return bfd_reloc_notsupported;
1588
1589       value = sgot->output_section->vma;
1590       return _bfd_final_link_relocate (howto, input_bfd, input_section,
1591                                        contents, rel->r_offset, value,
1592                                        (bfd_vma) 0);
1593
1594     case R_ARM_GOT32:
1595       /* Relocation is to the entry for this symbol in the
1596          global offset table.  */
1597       if (sgot == NULL)
1598         return bfd_reloc_notsupported;
1599
1600       if (h != NULL)
1601         {
1602           bfd_vma off;
1603
1604           off = h->got.offset;
1605           BFD_ASSERT (off != (bfd_vma) -1);
1606
1607           if (!elf_hash_table (info)->dynamic_sections_created ||
1608               (info->shared && (info->symbolic || h->dynindx == -1)
1609                && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1610             {
1611               /* This is actually a static link, or it is a -Bsymbolic link
1612                  and the symbol is defined locally.  We must initialize this
1613                  entry in the global offset table.  Since the offset must
1614                  always be a multiple of 4, we use the least significant bit
1615                  to record whether we have initialized it already.
1616
1617                  When doing a dynamic link, we create a .rel.got relocation
1618                  entry to initialize the value.  This is done in the
1619                  finish_dynamic_symbol routine.  */
1620               if ((off & 1) != 0)
1621                 off &= ~1;
1622               else
1623                 {
1624                   /* If we are addressing a Thumb function, we need to
1625                      adjust the address by one, so that attempts to
1626                      call the function pointer will correctly
1627                      interpret it as Thumb code.  */
1628                   if (sym_flags == STT_ARM_TFUNC)
1629                     value |= 1;
1630
1631                   bfd_put_32 (output_bfd, value, sgot->contents + off);
1632                   h->got.offset |= 1;
1633                 }
1634             }
1635
1636           value = sgot->output_offset + off;
1637         }
1638       else
1639         {
1640           bfd_vma off;
1641
1642           BFD_ASSERT (local_got_offsets != NULL &&
1643                       local_got_offsets[r_symndx] != (bfd_vma) -1);
1644
1645           off = local_got_offsets[r_symndx];
1646
1647           /* The offset must always be a multiple of 4.  We use the
1648              least significant bit to record whether we have already
1649              generated the necessary reloc.  */
1650           if ((off & 1) != 0)
1651             off &= ~1;
1652           else
1653             {
1654               bfd_put_32 (output_bfd, value, sgot->contents + off);
1655
1656               if (info->shared)
1657                 {
1658                   asection * srelgot;
1659                   Elf_Internal_Rela outrel;
1660                   bfd_byte *loc;
1661
1662                   srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
1663                   BFD_ASSERT (srelgot != NULL);
1664
1665                   outrel.r_offset = (sgot->output_section->vma
1666                                      + sgot->output_offset
1667                                      + off);
1668                   outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
1669                   loc = srelgot->contents;
1670                   loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
1671                   bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
1672                 }
1673
1674               local_got_offsets[r_symndx] |= 1;
1675             }
1676
1677           value = sgot->output_offset + off;
1678         }
1679
1680       return _bfd_final_link_relocate (howto, input_bfd, input_section,
1681                                        contents, rel->r_offset, value,
1682                                        (bfd_vma) 0);
1683
1684     case R_ARM_PLT32:
1685       /* Relocation is to the entry for this symbol in the
1686          procedure linkage table.  */
1687
1688       /* Resolve a PLT32 reloc against a local symbol directly,
1689          without using the procedure linkage table.  */
1690       if (h == NULL)
1691         return _bfd_final_link_relocate (howto, input_bfd, input_section,
1692                                  contents, rel->r_offset, value,
1693                                  (bfd_vma) 0);
1694
1695       if (h->plt.offset == (bfd_vma) -1)
1696         /* We didn't make a PLT entry for this symbol.  This
1697            happens when statically linking PIC code, or when
1698            using -Bsymbolic.  */
1699         return _bfd_final_link_relocate (howto, input_bfd, input_section,
1700                                          contents, rel->r_offset, value,
1701                                          (bfd_vma) 0);
1702
1703       BFD_ASSERT(splt != NULL);
1704       if (splt == NULL)
1705         return bfd_reloc_notsupported;
1706
1707       value = (splt->output_section->vma
1708                + splt->output_offset
1709                + h->plt.offset);
1710       return _bfd_final_link_relocate (howto, input_bfd, input_section,
1711                                contents, rel->r_offset, value,
1712                                (bfd_vma) 0);
1713
1714     case R_ARM_SBREL32:
1715       return bfd_reloc_notsupported;
1716
1717     case R_ARM_AMP_VCALL9:
1718       return bfd_reloc_notsupported;
1719
1720     case R_ARM_RSBREL32:
1721       return bfd_reloc_notsupported;
1722
1723     case R_ARM_THM_RPC22:
1724       return bfd_reloc_notsupported;
1725
1726     case R_ARM_RREL32:
1727       return bfd_reloc_notsupported;
1728
1729     case R_ARM_RABS32:
1730       return bfd_reloc_notsupported;
1731
1732     case R_ARM_RPC24:
1733       return bfd_reloc_notsupported;
1734
1735     case R_ARM_RBASE:
1736       return bfd_reloc_notsupported;
1737
1738     default:
1739       return bfd_reloc_notsupported;
1740     }
1741 }
1742
1743 #if USE_REL
1744 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
1745 static void
1746 arm_add_to_rel (abfd, address, howto, increment)
1747      bfd *              abfd;
1748      bfd_byte *         address;
1749      reloc_howto_type * howto;
1750      bfd_signed_vma     increment;
1751 {
1752   bfd_signed_vma addend;
1753
1754   if (howto->type == R_ARM_THM_PC22)
1755     {
1756       int upper_insn, lower_insn;
1757       int upper, lower;
1758
1759       upper_insn = bfd_get_16 (abfd, address);
1760       lower_insn = bfd_get_16 (abfd, address + 2);
1761       upper = upper_insn & 0x7ff;
1762       lower = lower_insn & 0x7ff;
1763
1764       addend = (upper << 12) | (lower << 1);
1765       addend += increment;
1766       addend >>= 1;
1767
1768       upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
1769       lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
1770
1771       bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
1772       bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
1773     }
1774   else
1775     {
1776       bfd_vma        contents;
1777
1778       contents = bfd_get_32 (abfd, address);
1779
1780       /* Get the (signed) value from the instruction.  */
1781       addend = contents & howto->src_mask;
1782       if (addend & ((howto->src_mask + 1) >> 1))
1783         {
1784           bfd_signed_vma mask;
1785
1786           mask = -1;
1787           mask &= ~ howto->src_mask;
1788           addend |= mask;
1789         }
1790
1791       /* Add in the increment, (which is a byte value).  */
1792       switch (howto->type)
1793         {
1794         default:
1795           addend += increment;
1796           break;
1797
1798         case R_ARM_PC24:
1799           addend <<= howto->size;
1800           addend += increment;
1801
1802           /* Should we check for overflow here ?  */
1803
1804           /* Drop any undesired bits.  */
1805           addend >>= howto->rightshift;
1806           break;
1807         }
1808
1809       contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
1810
1811       bfd_put_32 (abfd, contents, address);
1812     }
1813 }
1814 #endif /* USE_REL */
1815
1816 /* Relocate an ARM ELF section.  */
1817 static bfd_boolean
1818 elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
1819                             contents, relocs, local_syms, local_sections)
1820      bfd *output_bfd;
1821      struct bfd_link_info *info;
1822      bfd *input_bfd;
1823      asection *input_section;
1824      bfd_byte *contents;
1825      Elf_Internal_Rela *relocs;
1826      Elf_Internal_Sym *local_syms;
1827      asection **local_sections;
1828 {
1829   Elf_Internal_Shdr *symtab_hdr;
1830   struct elf_link_hash_entry **sym_hashes;
1831   Elf_Internal_Rela *rel;
1832   Elf_Internal_Rela *relend;
1833   const char *name;
1834
1835 #if !USE_REL
1836   if (info->relocateable)
1837     return TRUE;
1838 #endif
1839
1840   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1841   sym_hashes = elf_sym_hashes (input_bfd);
1842
1843   rel = relocs;
1844   relend = relocs + input_section->reloc_count;
1845   for (; rel < relend; rel++)
1846     {
1847       int                          r_type;
1848       reloc_howto_type *           howto;
1849       unsigned long                r_symndx;
1850       Elf_Internal_Sym *           sym;
1851       asection *                   sec;
1852       struct elf_link_hash_entry * h;
1853       bfd_vma                      relocation;
1854       bfd_reloc_status_type        r;
1855       arelent                      bfd_reloc;
1856
1857       r_symndx = ELF32_R_SYM (rel->r_info);
1858       r_type   = ELF32_R_TYPE (rel->r_info);
1859
1860       if (   r_type == R_ARM_GNU_VTENTRY
1861           || r_type == R_ARM_GNU_VTINHERIT)
1862         continue;
1863
1864       elf32_arm_info_to_howto (input_bfd, & bfd_reloc, rel);
1865       howto = bfd_reloc.howto;
1866
1867 #if USE_REL
1868       if (info->relocateable)
1869         {
1870           /* This is a relocateable link.  We don't have to change
1871              anything, unless the reloc is against a section symbol,
1872              in which case we have to adjust according to where the
1873              section symbol winds up in the output section.  */
1874           if (r_symndx < symtab_hdr->sh_info)
1875             {
1876               sym = local_syms + r_symndx;
1877               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1878                 {
1879                   sec = local_sections[r_symndx];
1880                   arm_add_to_rel (input_bfd, contents + rel->r_offset,
1881                                   howto,
1882                                   (bfd_signed_vma) (sec->output_offset
1883                                                     + sym->st_value));
1884                 }
1885             }
1886
1887           continue;
1888         }
1889 #endif
1890
1891       /* This is a final link.  */
1892       h = NULL;
1893       sym = NULL;
1894       sec = NULL;
1895
1896       if (r_symndx < symtab_hdr->sh_info)
1897         {
1898           sym = local_syms + r_symndx;
1899           sec = local_sections[r_symndx];
1900 #if USE_REL
1901           relocation = (sec->output_section->vma
1902                         + sec->output_offset
1903                         + sym->st_value);
1904           if ((sec->flags & SEC_MERGE)
1905                    && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1906             {
1907               asection *msec;
1908               bfd_vma addend, value;
1909
1910               if (howto->rightshift)
1911                 {
1912                   (*_bfd_error_handler)
1913                     (_("%s(%s+0x%lx): %s relocation against SEC_MERGE section"),
1914                      bfd_archive_filename (input_bfd),
1915                      bfd_get_section_name (input_bfd, input_section),
1916                      (long) rel->r_offset, howto->name);
1917                   return FALSE;
1918                 }
1919
1920               value = bfd_get_32 (input_bfd, contents + rel->r_offset);
1921
1922               /* Get the (signed) value from the instruction.  */
1923               addend = value & howto->src_mask;
1924               if (addend & ((howto->src_mask + 1) >> 1))
1925                 {
1926                   bfd_signed_vma mask;
1927
1928                   mask = -1;
1929                   mask &= ~ howto->src_mask;
1930                   addend |= mask;
1931                 }
1932               msec = sec;
1933               addend =
1934                 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
1935                 - relocation;
1936               addend += msec->output_section->vma + msec->output_offset;
1937               value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
1938               bfd_put_32 (input_bfd, value, contents + rel->r_offset);
1939             }
1940 #else
1941           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1942 #endif
1943         }
1944       else
1945         {
1946           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1947
1948           while (   h->root.type == bfd_link_hash_indirect
1949                  || h->root.type == bfd_link_hash_warning)
1950             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1951
1952           if (   h->root.type == bfd_link_hash_defined
1953               || h->root.type == bfd_link_hash_defweak)
1954             {
1955               int relocation_needed = 1;
1956
1957               sec = h->root.u.def.section;
1958
1959               /* In these cases, we don't need the relocation value.
1960                  We check specially because in some obscure cases
1961                  sec->output_section will be NULL.  */
1962               switch (r_type)
1963                 {
1964                 case R_ARM_PC24:
1965                 case R_ARM_ABS32:
1966                 case R_ARM_THM_PC22:
1967                   if (info->shared
1968                       && (
1969                   (!info->symbolic && h->dynindx != -1)
1970                           || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
1971                           )
1972                       && ((input_section->flags & SEC_ALLOC) != 0
1973                           /* DWARF will emit R_ARM_ABS32 relocations in its
1974                              sections against symbols defined externally
1975                              in shared libraries.  We can't do anything
1976                              with them here.  */
1977                           || ((input_section->flags & SEC_DEBUGGING) != 0
1978                               && (h->elf_link_hash_flags
1979                                   & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1980                       )
1981                     relocation_needed = 0;
1982                   break;
1983
1984                 case R_ARM_GOTPC:
1985                   relocation_needed = 0;
1986                   break;
1987
1988                 case R_ARM_GOT32:
1989                   if (elf_hash_table(info)->dynamic_sections_created
1990                       && (!info->shared
1991                           || (!info->symbolic && h->dynindx != -1)
1992                           || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
1993                           )
1994                       )
1995                     relocation_needed = 0;
1996                   break;
1997
1998                 case R_ARM_PLT32:
1999                   if (h->plt.offset != (bfd_vma)-1)
2000                     relocation_needed = 0;
2001                   break;
2002
2003                 default:
2004                   if (sec->output_section == NULL)
2005                     {
2006                       (*_bfd_error_handler)
2007                         (_("%s: warning: unresolvable relocation %d against symbol `%s' from %s section"),
2008                          bfd_archive_filename (input_bfd),
2009                          r_type,
2010                          h->root.root.string,
2011                          bfd_get_section_name (input_bfd, input_section));
2012                       relocation_needed = 0;
2013                     }
2014                 }
2015
2016               if (relocation_needed)
2017                 relocation = h->root.u.def.value
2018                   + sec->output_section->vma
2019                   + sec->output_offset;
2020               else
2021                 relocation = 0;
2022             }
2023           else if (h->root.type == bfd_link_hash_undefweak)
2024             relocation = 0;
2025           else if (info->shared && !info->symbolic
2026                    && !info->no_undefined
2027                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2028             relocation = 0;
2029           else
2030             {
2031               if (!((*info->callbacks->undefined_symbol)
2032                     (info, h->root.root.string, input_bfd,
2033                      input_section, rel->r_offset,
2034                      (!info->shared || info->no_undefined
2035                       || ELF_ST_VISIBILITY (h->other)))))
2036                 return FALSE;
2037               relocation = 0;
2038             }
2039         }
2040
2041       if (h != NULL)
2042         name = h->root.root.string;
2043       else
2044         {
2045           name = (bfd_elf_string_from_elf_section
2046                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
2047           if (name == NULL || *name == '\0')
2048             name = bfd_section_name (input_bfd, sec);
2049         }
2050
2051       r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
2052                                          input_section, contents, rel,
2053                                          relocation, info, sec, name,
2054                                          (h ? ELF_ST_TYPE (h->type) :
2055                                           ELF_ST_TYPE (sym->st_info)), h);
2056
2057       if (r != bfd_reloc_ok)
2058         {
2059           const char * msg = (const char *) 0;
2060
2061           switch (r)
2062             {
2063             case bfd_reloc_overflow:
2064               /* If the overflowing reloc was to an undefined symbol,
2065                  we have already printed one error message and there
2066                  is no point complaining again.  */
2067               if ((! h ||
2068                    h->root.type != bfd_link_hash_undefined)
2069                   && (!((*info->callbacks->reloc_overflow)
2070                         (info, name, howto->name, (bfd_vma) 0,
2071                          input_bfd, input_section, rel->r_offset))))
2072                   return FALSE;
2073               break;
2074
2075             case bfd_reloc_undefined:
2076               if (!((*info->callbacks->undefined_symbol)
2077                     (info, name, input_bfd, input_section,
2078                      rel->r_offset, TRUE)))
2079                 return FALSE;
2080               break;
2081
2082             case bfd_reloc_outofrange:
2083               msg = _("internal error: out of range error");
2084               goto common_error;
2085
2086             case bfd_reloc_notsupported:
2087               msg = _("internal error: unsupported relocation error");
2088               goto common_error;
2089
2090             case bfd_reloc_dangerous:
2091               msg = _("internal error: dangerous error");
2092               goto common_error;
2093
2094             default:
2095               msg = _("internal error: unknown error");
2096               /* fall through */
2097
2098             common_error:
2099               if (!((*info->callbacks->warning)
2100                     (info, msg, name, input_bfd, input_section,
2101                      rel->r_offset)))
2102                 return FALSE;
2103               break;
2104             }
2105         }
2106     }
2107
2108   return TRUE;
2109 }
2110
2111 /* Function to keep ARM specific flags in the ELF header.  */
2112 static bfd_boolean
2113 elf32_arm_set_private_flags (abfd, flags)
2114      bfd *abfd;
2115      flagword flags;
2116 {
2117   if (elf_flags_init (abfd)
2118       && elf_elfheader (abfd)->e_flags != flags)
2119     {
2120       if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
2121         {
2122           if (flags & EF_ARM_INTERWORK)
2123             (*_bfd_error_handler) (_("\
2124 Warning: Not setting interworking flag of %s since it has already been specified as non-interworking"),
2125                                    bfd_archive_filename (abfd));
2126           else
2127             _bfd_error_handler (_("\
2128 Warning: Clearing the interworking flag of %s due to outside request"),
2129                                 bfd_archive_filename (abfd));
2130         }
2131     }
2132   else
2133     {
2134       elf_elfheader (abfd)->e_flags = flags;
2135       elf_flags_init (abfd) = TRUE;
2136     }
2137
2138   return TRUE;
2139 }
2140
2141 /* Copy backend specific data from one object module to another.  */
2142
2143 static bfd_boolean
2144 elf32_arm_copy_private_bfd_data (ibfd, obfd)
2145      bfd *ibfd;
2146      bfd *obfd;
2147 {
2148   flagword in_flags;
2149   flagword out_flags;
2150
2151   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2152       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2153     return TRUE;
2154
2155   in_flags  = elf_elfheader (ibfd)->e_flags;
2156   out_flags = elf_elfheader (obfd)->e_flags;
2157
2158   if (elf_flags_init (obfd)
2159       && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
2160       && in_flags != out_flags)
2161     {
2162       /* Cannot mix APCS26 and APCS32 code.  */
2163       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
2164         return FALSE;
2165
2166       /* Cannot mix float APCS and non-float APCS code.  */
2167       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
2168         return FALSE;
2169
2170       /* If the src and dest have different interworking flags
2171          then turn off the interworking bit.  */
2172       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
2173         {
2174           if (out_flags & EF_ARM_INTERWORK)
2175             _bfd_error_handler (_("\
2176 Warning: Clearing the interworking flag of %s because non-interworking code in %s has been linked with it"),
2177                                 bfd_get_filename (obfd),
2178                                 bfd_archive_filename (ibfd));
2179
2180           in_flags &= ~EF_ARM_INTERWORK;
2181         }
2182
2183       /* Likewise for PIC, though don't warn for this case.  */
2184       if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
2185         in_flags &= ~EF_ARM_PIC;
2186     }
2187
2188   elf_elfheader (obfd)->e_flags = in_flags;
2189   elf_flags_init (obfd) = TRUE;
2190
2191   return TRUE;
2192 }
2193
2194 /* Merge backend specific data from an object file to the output
2195    object file when linking.  */
2196
2197 static bfd_boolean
2198 elf32_arm_merge_private_bfd_data (ibfd, obfd)
2199      bfd * ibfd;
2200      bfd * obfd;
2201 {
2202   flagword out_flags;
2203   flagword in_flags;
2204   bfd_boolean flags_compatible = TRUE;
2205   bfd_boolean null_input_bfd = TRUE;
2206   asection *sec;
2207
2208   /* Check if we have the same endianess.  */
2209   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
2210     return FALSE;
2211
2212   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2213       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2214     return TRUE;
2215
2216   /* The input BFD must have had its flags initialised.  */
2217   /* The following seems bogus to me -- The flags are initialized in
2218      the assembler but I don't think an elf_flags_init field is
2219      written into the object.  */
2220   /* BFD_ASSERT (elf_flags_init (ibfd)); */
2221
2222   in_flags  = elf_elfheader (ibfd)->e_flags;
2223   out_flags = elf_elfheader (obfd)->e_flags;
2224
2225   if (!elf_flags_init (obfd))
2226     {
2227       /* If the input is the default architecture and had the default
2228          flags then do not bother setting the flags for the output
2229          architecture, instead allow future merges to do this.  If no
2230          future merges ever set these flags then they will retain their
2231          uninitialised values, which surprise surprise, correspond
2232          to the default values.  */
2233       if (bfd_get_arch_info (ibfd)->the_default
2234           && elf_elfheader (ibfd)->e_flags == 0)
2235         return TRUE;
2236
2237       elf_flags_init (obfd) = TRUE;
2238       elf_elfheader (obfd)->e_flags = in_flags;
2239
2240       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2241           && bfd_get_arch_info (obfd)->the_default)
2242         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
2243
2244       return TRUE;
2245     }
2246
2247   /* Identical flags must be compatible.  */
2248   if (in_flags == out_flags)
2249     return TRUE;
2250
2251   /* Check to see if the input BFD actually contains any sections.
2252      If not, its flags may not have been initialised either, but it cannot
2253      actually cause any incompatibility.  */
2254   for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2255     {
2256       /* Ignore synthetic glue sections.  */
2257       if (strcmp (sec->name, ".glue_7")
2258           && strcmp (sec->name, ".glue_7t"))
2259         {
2260           null_input_bfd = FALSE;
2261           break;
2262         }
2263     }
2264   if (null_input_bfd)
2265     return TRUE;
2266
2267   /* Complain about various flag mismatches.  */
2268   if (EF_ARM_EABI_VERSION (in_flags) != EF_ARM_EABI_VERSION (out_flags))
2269     {
2270       _bfd_error_handler (_("\
2271 ERROR: %s is compiled for EABI version %d, whereas %s is compiled for version %d"),
2272                           bfd_archive_filename (ibfd),
2273                           (in_flags & EF_ARM_EABIMASK) >> 24,
2274                           bfd_get_filename (obfd),
2275                           (out_flags & EF_ARM_EABIMASK) >> 24);
2276       return FALSE;
2277     }
2278
2279   /* Not sure what needs to be checked for EABI versions >= 1.  */
2280   if (EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
2281     {
2282       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
2283         {
2284           _bfd_error_handler (_("\
2285 ERROR: %s is compiled for APCS-%d, whereas target %s uses APCS-%d"),
2286                               bfd_archive_filename (ibfd),
2287                               in_flags & EF_ARM_APCS_26 ? 26 : 32,
2288                               bfd_get_filename (obfd),
2289                               out_flags & EF_ARM_APCS_26 ? 26 : 32);
2290           flags_compatible = FALSE;
2291         }
2292
2293       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
2294         {
2295           if (in_flags & EF_ARM_APCS_FLOAT)
2296             _bfd_error_handler (_("\
2297 ERROR: %s passes floats in float registers, whereas %s passes them in integer registers"),
2298                                 bfd_archive_filename (ibfd),
2299                                 bfd_get_filename (obfd));
2300           else
2301             _bfd_error_handler (_("\
2302 ERROR: %s passes floats in integer registers, whereas %s passes them in float registers"),
2303                                 bfd_archive_filename (ibfd),
2304                                 bfd_get_filename (obfd));
2305
2306           flags_compatible = FALSE;
2307         }
2308
2309       if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
2310         {
2311           if (in_flags & EF_ARM_VFP_FLOAT)
2312             _bfd_error_handler (_("\
2313 ERROR: %s uses VFP instructions, whereas %s uses FPA instructions"),
2314                                 bfd_archive_filename (ibfd),
2315                                 bfd_get_filename (obfd));
2316           else
2317             _bfd_error_handler (_("\
2318 ERROR: %s uses FPA instructions, whereas %s uses VFP instructions"),
2319                                 bfd_archive_filename (ibfd),
2320                                 bfd_get_filename (obfd));
2321
2322           flags_compatible = FALSE;
2323         }
2324
2325 #ifdef EF_ARM_SOFT_FLOAT
2326       if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
2327         {
2328           /* We can allow interworking between code that is VFP format
2329              layout, and uses either soft float or integer regs for
2330              passing floating point arguments and results.  We already
2331              know that the APCS_FLOAT flags match; similarly for VFP
2332              flags.  */
2333           if ((in_flags & EF_ARM_APCS_FLOAT) != 0
2334               || (in_flags & EF_ARM_VFP_FLOAT) == 0)
2335             {
2336               if (in_flags & EF_ARM_SOFT_FLOAT)
2337                 _bfd_error_handler (_("\
2338 ERROR: %s uses software FP, whereas %s uses hardware FP"),
2339                                     bfd_archive_filename (ibfd),
2340                                     bfd_get_filename (obfd));
2341               else
2342                 _bfd_error_handler (_("\
2343 ERROR: %s uses hardware FP, whereas %s uses software FP"),
2344                                     bfd_archive_filename (ibfd),
2345                                     bfd_get_filename (obfd));
2346
2347               flags_compatible = FALSE;
2348             }
2349         }
2350 #endif
2351
2352       /* Interworking mismatch is only a warning.  */
2353       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
2354         {
2355           if (in_flags & EF_ARM_INTERWORK)
2356             {
2357               _bfd_error_handler (_("\
2358 Warning: %s supports interworking, whereas %s does not"),
2359                                   bfd_archive_filename (ibfd),
2360                                   bfd_get_filename (obfd));
2361             }
2362           else
2363             {
2364               _bfd_error_handler (_("\
2365 Warning: %s does not support interworking, whereas %s does"),
2366                                   bfd_archive_filename (ibfd),
2367                                   bfd_get_filename (obfd));
2368             }
2369         }
2370     }
2371
2372   return flags_compatible;
2373 }
2374
2375 /* Display the flags field.  */
2376
2377 static bfd_boolean
2378 elf32_arm_print_private_bfd_data (abfd, ptr)
2379      bfd *abfd;
2380      PTR ptr;
2381 {
2382   FILE * file = (FILE *) ptr;
2383   unsigned long flags;
2384
2385   BFD_ASSERT (abfd != NULL && ptr != NULL);
2386
2387   /* Print normal ELF private data.  */
2388   _bfd_elf_print_private_bfd_data (abfd, ptr);
2389
2390   flags = elf_elfheader (abfd)->e_flags;
2391   /* Ignore init flag - it may not be set, despite the flags field
2392      containing valid data.  */
2393
2394   /* xgettext:c-format */
2395   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
2396
2397   switch (EF_ARM_EABI_VERSION (flags))
2398     {
2399     case EF_ARM_EABI_UNKNOWN:
2400       /* The following flag bits are GNU extenstions and not part of the
2401          official ARM ELF extended ABI.  Hence they are only decoded if
2402          the EABI version is not set.  */
2403       if (flags & EF_ARM_INTERWORK)
2404         fprintf (file, _(" [interworking enabled]"));
2405
2406       if (flags & EF_ARM_APCS_26)
2407         fprintf (file, " [APCS-26]");
2408       else
2409         fprintf (file, " [APCS-32]");
2410
2411       if (flags & EF_ARM_VFP_FLOAT)
2412         fprintf (file, _(" [VFP float format]"));
2413       else
2414         fprintf (file, _(" [FPA float format]"));
2415
2416       if (flags & EF_ARM_APCS_FLOAT)
2417         fprintf (file, _(" [floats passed in float registers]"));
2418
2419       if (flags & EF_ARM_PIC)
2420         fprintf (file, _(" [position independent]"));
2421
2422       if (flags & EF_ARM_NEW_ABI)
2423         fprintf (file, _(" [new ABI]"));
2424
2425       if (flags & EF_ARM_OLD_ABI)
2426         fprintf (file, _(" [old ABI]"));
2427
2428       if (flags & EF_ARM_SOFT_FLOAT)
2429         fprintf (file, _(" [software FP]"));
2430
2431       flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
2432                  | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
2433                  | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT);
2434       break;
2435
2436     case EF_ARM_EABI_VER1:
2437       fprintf (file, _(" [Version1 EABI]"));
2438
2439       if (flags & EF_ARM_SYMSARESORTED)
2440         fprintf (file, _(" [sorted symbol table]"));
2441       else
2442         fprintf (file, _(" [unsorted symbol table]"));
2443
2444       flags &= ~ EF_ARM_SYMSARESORTED;
2445       break;
2446
2447     case EF_ARM_EABI_VER2:
2448       fprintf (file, _(" [Version2 EABI]"));
2449
2450       if (flags & EF_ARM_SYMSARESORTED)
2451         fprintf (file, _(" [sorted symbol table]"));
2452       else
2453         fprintf (file, _(" [unsorted symbol table]"));
2454
2455       if (flags & EF_ARM_DYNSYMSUSESEGIDX)
2456         fprintf (file, _(" [dynamic symbols use segment index]"));
2457
2458       if (flags & EF_ARM_MAPSYMSFIRST)
2459         fprintf (file, _(" [mapping symbols precede others]"));
2460
2461       flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
2462                  | EF_ARM_MAPSYMSFIRST);
2463       break;
2464
2465     default:
2466       fprintf (file, _(" <EABI version unrecognised>"));
2467       break;
2468     }
2469
2470   flags &= ~ EF_ARM_EABIMASK;
2471
2472   if (flags & EF_ARM_RELEXEC)
2473     fprintf (file, _(" [relocatable executable]"));
2474
2475   if (flags & EF_ARM_HASENTRY)
2476     fprintf (file, _(" [has entry point]"));
2477
2478   flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
2479
2480   if (flags)
2481     fprintf (file, _("<Unrecognised flag bits set>"));
2482
2483   fputc ('\n', file);
2484
2485   return TRUE;
2486 }
2487
2488 static int
2489 elf32_arm_get_symbol_type (elf_sym, type)
2490      Elf_Internal_Sym * elf_sym;
2491      int type;
2492 {
2493   switch (ELF_ST_TYPE (elf_sym->st_info))
2494     {
2495     case STT_ARM_TFUNC:
2496       return ELF_ST_TYPE (elf_sym->st_info);
2497
2498     case STT_ARM_16BIT:
2499       /* If the symbol is not an object, return the STT_ARM_16BIT flag.
2500          This allows us to distinguish between data used by Thumb instructions
2501          and non-data (which is probably code) inside Thumb regions of an
2502          executable.  */
2503       if (type != STT_OBJECT)
2504         return ELF_ST_TYPE (elf_sym->st_info);
2505       break;
2506
2507     default:
2508       break;
2509     }
2510
2511   return type;
2512 }
2513
2514 static asection *
2515 elf32_arm_gc_mark_hook (sec, info, rel, h, sym)
2516        asection *sec;
2517        struct bfd_link_info *info ATTRIBUTE_UNUSED;
2518        Elf_Internal_Rela *rel;
2519        struct elf_link_hash_entry *h;
2520        Elf_Internal_Sym *sym;
2521 {
2522   if (h != NULL)
2523     {
2524       switch (ELF32_R_TYPE (rel->r_info))
2525       {
2526       case R_ARM_GNU_VTINHERIT:
2527       case R_ARM_GNU_VTENTRY:
2528         break;
2529
2530       default:
2531         switch (h->root.type)
2532           {
2533           case bfd_link_hash_defined:
2534           case bfd_link_hash_defweak:
2535             return h->root.u.def.section;
2536
2537           case bfd_link_hash_common:
2538             return h->root.u.c.p->section;
2539
2540           default:
2541             break;
2542           }
2543        }
2544      }
2545    else
2546      return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
2547
2548   return NULL;
2549 }
2550
2551 /* Update the got entry reference counts for the section being removed.  */
2552
2553 static bfd_boolean
2554 elf32_arm_gc_sweep_hook (abfd, info, sec, relocs)
2555      bfd *abfd ATTRIBUTE_UNUSED;
2556      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2557      asection *sec ATTRIBUTE_UNUSED;
2558      const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
2559 {
2560   /* We don't support garbage collection of GOT and PLT relocs yet.  */
2561   return TRUE;
2562 }
2563
2564 /* Look through the relocs for a section during the first phase.  */
2565
2566 static bfd_boolean
2567 elf32_arm_check_relocs (abfd, info, sec, relocs)
2568      bfd *abfd;
2569      struct bfd_link_info *info;
2570      asection *sec;
2571      const Elf_Internal_Rela *relocs;
2572 {
2573   Elf_Internal_Shdr *symtab_hdr;
2574   struct elf_link_hash_entry **sym_hashes;
2575   struct elf_link_hash_entry **sym_hashes_end;
2576   const Elf_Internal_Rela *rel;
2577   const Elf_Internal_Rela *rel_end;
2578   bfd *dynobj;
2579   asection *sgot, *srelgot, *sreloc;
2580   bfd_vma *local_got_offsets;
2581
2582   if (info->relocateable)
2583     return TRUE;
2584
2585   sgot = srelgot = sreloc = NULL;
2586
2587   dynobj = elf_hash_table (info)->dynobj;
2588   local_got_offsets = elf_local_got_offsets (abfd);
2589
2590   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2591   sym_hashes = elf_sym_hashes (abfd);
2592   sym_hashes_end = sym_hashes
2593     + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
2594
2595   if (!elf_bad_symtab (abfd))
2596     sym_hashes_end -= symtab_hdr->sh_info;
2597
2598   rel_end = relocs + sec->reloc_count;
2599   for (rel = relocs; rel < rel_end; rel++)
2600     {
2601       struct elf_link_hash_entry *h;
2602       unsigned long r_symndx;
2603
2604       r_symndx = ELF32_R_SYM (rel->r_info);
2605       if (r_symndx < symtab_hdr->sh_info)
2606         h = NULL;
2607       else
2608         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2609
2610       /* Some relocs require a global offset table.  */
2611       if (dynobj == NULL)
2612         {
2613           switch (ELF32_R_TYPE (rel->r_info))
2614             {
2615             case R_ARM_GOT32:
2616             case R_ARM_GOTOFF:
2617             case R_ARM_GOTPC:
2618               elf_hash_table (info)->dynobj = dynobj = abfd;
2619               if (! _bfd_elf_create_got_section (dynobj, info))
2620                 return FALSE;
2621               break;
2622
2623             default:
2624               break;
2625             }
2626         }
2627
2628       switch (ELF32_R_TYPE (rel->r_info))
2629         {
2630           case R_ARM_GOT32:
2631             /* This symbol requires a global offset table entry.  */
2632             if (sgot == NULL)
2633               {
2634                 sgot = bfd_get_section_by_name (dynobj, ".got");
2635                 BFD_ASSERT (sgot != NULL);
2636               }
2637
2638             /* Get the got relocation section if necessary.  */
2639             if (srelgot == NULL
2640                 && (h != NULL || info->shared))
2641               {
2642                 srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
2643
2644                 /* If no got relocation section, make one and initialize.  */
2645                 if (srelgot == NULL)
2646                   {
2647                     srelgot = bfd_make_section (dynobj, ".rel.got");
2648                     if (srelgot == NULL
2649                         || ! bfd_set_section_flags (dynobj, srelgot,
2650                                                     (SEC_ALLOC
2651                                                      | SEC_LOAD
2652                                                      | SEC_HAS_CONTENTS
2653                                                      | SEC_IN_MEMORY
2654                                                      | SEC_LINKER_CREATED
2655                                                      | SEC_READONLY))
2656                         || ! bfd_set_section_alignment (dynobj, srelgot, 2))
2657                       return FALSE;
2658                   }
2659               }
2660
2661             if (h != NULL)
2662               {
2663                 if (h->got.offset != (bfd_vma) -1)
2664                   /* We have already allocated space in the .got.  */
2665                   break;
2666
2667                 h->got.offset = sgot->_raw_size;
2668
2669                 /* Make sure this symbol is output as a dynamic symbol.  */
2670                 if (h->dynindx == -1)
2671                   if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2672                     return FALSE;
2673
2674                 srelgot->_raw_size += sizeof (Elf32_External_Rel);
2675               }
2676             else
2677               {
2678                 /* This is a global offset table entry for a local
2679                    symbol.  */
2680                 if (local_got_offsets == NULL)
2681                   {
2682                     bfd_size_type size;
2683                     unsigned int i;
2684
2685                     size = symtab_hdr->sh_info;
2686                     size *= sizeof (bfd_vma);
2687                     local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
2688                     if (local_got_offsets == NULL)
2689                       return FALSE;
2690                     elf_local_got_offsets (abfd) = local_got_offsets;
2691                     for (i = 0; i < symtab_hdr->sh_info; i++)
2692                       local_got_offsets[i] = (bfd_vma) -1;
2693                   }
2694
2695                 if (local_got_offsets[r_symndx] != (bfd_vma) -1)
2696                   /* We have already allocated space in the .got.  */
2697                   break;
2698
2699                 local_got_offsets[r_symndx] = sgot->_raw_size;
2700
2701                 if (info->shared)
2702                   /* If we are generating a shared object, we need to
2703                      output a R_ARM_RELATIVE reloc so that the dynamic
2704                      linker can adjust this GOT entry.  */
2705                   srelgot->_raw_size += sizeof (Elf32_External_Rel);
2706               }
2707
2708             sgot->_raw_size += 4;
2709             break;
2710
2711           case R_ARM_PLT32:
2712             /* This symbol requires a procedure linkage table entry.  We
2713                actually build the entry in adjust_dynamic_symbol,
2714                because this might be a case of linking PIC code which is
2715                never referenced by a dynamic object, in which case we
2716                don't need to generate a procedure linkage table entry
2717                after all.  */
2718
2719             /* If this is a local symbol, we resolve it directly without
2720                creating a procedure linkage table entry.  */
2721             if (h == NULL)
2722               continue;
2723
2724             h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2725             break;
2726
2727           case R_ARM_ABS32:
2728           case R_ARM_REL32:
2729           case R_ARM_PC24:
2730             /* If we are creating a shared library, and this is a reloc
2731                against a global symbol, or a non PC relative reloc
2732                against a local symbol, then we need to copy the reloc
2733                into the shared library.  However, if we are linking with
2734                -Bsymbolic, we do not need to copy a reloc against a
2735                global symbol which is defined in an object we are
2736                including in the link (i.e., DEF_REGULAR is set).  At
2737                this point we have not seen all the input files, so it is
2738                possible that DEF_REGULAR is not set now but will be set
2739                later (it is never cleared).  We account for that
2740                possibility below by storing information in the
2741                pcrel_relocs_copied field of the hash table entry.  */
2742             if (info->shared
2743               && (ELF32_R_TYPE (rel->r_info) != R_ARM_PC24
2744                 || (h != NULL
2745                   && (! info->symbolic
2746                     || (h->elf_link_hash_flags
2747                       & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2748               {
2749                 /* When creating a shared object, we must copy these
2750                    reloc types into the output file.  We create a reloc
2751                    section in dynobj and make room for this reloc.  */
2752                 if (sreloc == NULL)
2753                   {
2754                     const char * name;
2755
2756                     name = (bfd_elf_string_from_elf_section
2757                             (abfd,
2758                              elf_elfheader (abfd)->e_shstrndx,
2759                              elf_section_data (sec)->rel_hdr.sh_name));
2760                     if (name == NULL)
2761                       return FALSE;
2762
2763                     BFD_ASSERT (strncmp (name, ".rel", 4) == 0
2764                                 && strcmp (bfd_get_section_name (abfd, sec),
2765                                            name + 4) == 0);
2766
2767                     sreloc = bfd_get_section_by_name (dynobj, name);
2768                     if (sreloc == NULL)
2769                       {
2770                         flagword flags;
2771
2772                         sreloc = bfd_make_section (dynobj, name);
2773                         flags = (SEC_HAS_CONTENTS | SEC_READONLY
2774                                  | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2775                         if ((sec->flags & SEC_ALLOC) != 0)
2776                           flags |= SEC_ALLOC | SEC_LOAD;
2777                         if (sreloc == NULL
2778                             || ! bfd_set_section_flags (dynobj, sreloc, flags)
2779                             || ! bfd_set_section_alignment (dynobj, sreloc, 2))
2780                           return FALSE;
2781                       }
2782                   if (sec->flags & SEC_READONLY)
2783                     info->flags |= DF_TEXTREL;
2784                   }
2785
2786                 sreloc->_raw_size += sizeof (Elf32_External_Rel);
2787                 /* If we are linking with -Bsymbolic, and this is a
2788                    global symbol, we count the number of PC relative
2789                    relocations we have entered for this symbol, so that
2790                    we can discard them again if the symbol is later
2791                    defined by a regular object.  Note that this function
2792                    is only called if we are using an elf_i386 linker
2793                    hash table, which means that h is really a pointer to
2794                    an elf_i386_link_hash_entry.  */
2795                 if (h != NULL && info->symbolic
2796                     && ELF32_R_TYPE (rel->r_info) == R_ARM_PC24)
2797                   {
2798                     struct elf32_arm_link_hash_entry * eh;
2799                     struct elf32_arm_pcrel_relocs_copied * p;
2800
2801                     eh = (struct elf32_arm_link_hash_entry *) h;
2802
2803                     for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
2804                       if (p->section == sreloc)
2805                         break;
2806
2807                     if (p == NULL)
2808                       {
2809                         p = ((struct elf32_arm_pcrel_relocs_copied *)
2810                              bfd_alloc (dynobj, (bfd_size_type) sizeof * p));
2811                         if (p == NULL)
2812                           return FALSE;
2813                         p->next = eh->pcrel_relocs_copied;
2814                         eh->pcrel_relocs_copied = p;
2815                         p->section = sreloc;
2816                         p->count = 0;
2817                       }
2818
2819                     ++p->count;
2820                   }
2821               }
2822             break;
2823
2824         /* This relocation describes the C++ object vtable hierarchy.
2825            Reconstruct it for later use during GC.  */
2826         case R_ARM_GNU_VTINHERIT:
2827           if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2828             return FALSE;
2829           break;
2830
2831         /* This relocation describes which C++ vtable entries are actually
2832            used.  Record for later use during GC.  */
2833         case R_ARM_GNU_VTENTRY:
2834           if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
2835             return FALSE;
2836           break;
2837         }
2838     }
2839
2840   return TRUE;
2841 }
2842
2843 /* Find the nearest line to a particular section and offset, for error
2844    reporting.   This code is a duplicate of the code in elf.c, except
2845    that it also accepts STT_ARM_TFUNC as a symbol that names a function.  */
2846
2847 static bfd_boolean
2848 elf32_arm_find_nearest_line
2849   (abfd, section, symbols, offset, filename_ptr, functionname_ptr, line_ptr)
2850      bfd *abfd;
2851      asection *section;
2852      asymbol **symbols;
2853      bfd_vma offset;
2854      const char **filename_ptr;
2855      const char **functionname_ptr;
2856      unsigned int *line_ptr;
2857 {
2858   bfd_boolean found;
2859   const char *filename;
2860   asymbol *func;
2861   bfd_vma low_func;
2862   asymbol **p;
2863
2864   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
2865                                      filename_ptr, functionname_ptr,
2866                                      line_ptr, 0,
2867                                      &elf_tdata (abfd)->dwarf2_find_line_info))
2868     return TRUE;
2869
2870   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
2871                                              &found, filename_ptr,
2872                                              functionname_ptr, line_ptr,
2873                                              &elf_tdata (abfd)->line_info))
2874     return FALSE;
2875
2876   if (found)
2877     return TRUE;
2878
2879   if (symbols == NULL)
2880     return FALSE;
2881
2882   filename = NULL;
2883   func = NULL;
2884   low_func = 0;
2885
2886   for (p = symbols; *p != NULL; p++)
2887     {
2888       elf_symbol_type *q;
2889
2890       q = (elf_symbol_type *) *p;
2891
2892       if (bfd_get_section (&q->symbol) != section)
2893         continue;
2894
2895       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
2896         {
2897         default:
2898           break;
2899         case STT_FILE:
2900           filename = bfd_asymbol_name (&q->symbol);
2901           break;
2902         case STT_NOTYPE:
2903         case STT_FUNC:
2904         case STT_ARM_TFUNC:
2905           if (q->symbol.section == section
2906               && q->symbol.value >= low_func
2907               && q->symbol.value <= offset)
2908             {
2909               func = (asymbol *) q;
2910               low_func = q->symbol.value;
2911             }
2912           break;
2913         }
2914     }
2915
2916   if (func == NULL)
2917     return FALSE;
2918
2919   *filename_ptr = filename;
2920   *functionname_ptr = bfd_asymbol_name (func);
2921   *line_ptr = 0;
2922
2923   return TRUE;
2924 }
2925
2926 /* Adjust a symbol defined by a dynamic object and referenced by a
2927    regular object.  The current definition is in some section of the
2928    dynamic object, but we're not including those sections.  We have to
2929    change the definition to something the rest of the link can
2930    understand.  */
2931
2932 static bfd_boolean
2933 elf32_arm_adjust_dynamic_symbol (info, h)
2934      struct bfd_link_info * info;
2935      struct elf_link_hash_entry * h;
2936 {
2937   bfd * dynobj;
2938   asection * s;
2939   unsigned int power_of_two;
2940
2941   dynobj = elf_hash_table (info)->dynobj;
2942
2943   /* Make sure we know what is going on here.  */
2944   BFD_ASSERT (dynobj != NULL
2945               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
2946                   || h->weakdef != NULL
2947                   || ((h->elf_link_hash_flags
2948                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2949                       && (h->elf_link_hash_flags
2950                           & ELF_LINK_HASH_REF_REGULAR) != 0
2951                       && (h->elf_link_hash_flags
2952                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
2953
2954   /* If this is a function, put it in the procedure linkage table.  We
2955      will fill in the contents of the procedure linkage table later,
2956      when we know the address of the .got section.  */
2957   if (h->type == STT_FUNC
2958       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2959     {
2960       /* If we link a program (not a DSO), we'll get rid of unnecessary
2961          PLT entries; we point to the actual symbols -- even for pic
2962          relocs, because a program built with -fpic should have the same
2963          result as one built without -fpic, specifically considering weak
2964          symbols.
2965          FIXME: m68k and i386 differ here, for unclear reasons.  */
2966       if (! info->shared
2967           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0)
2968         {
2969           /* This case can occur if we saw a PLT32 reloc in an input
2970              file, but the symbol was not defined by a dynamic object.
2971              In such a case, we don't actually need to build a
2972              procedure linkage table, and we can just do a PC32 reloc
2973              instead.  */
2974           BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
2975           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2976           return TRUE;
2977         }
2978
2979       /* Make sure this symbol is output as a dynamic symbol.  */
2980       if (h->dynindx == -1)
2981         {
2982           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2983             return FALSE;
2984         }
2985
2986       s = bfd_get_section_by_name (dynobj, ".plt");
2987       BFD_ASSERT (s != NULL);
2988
2989       /* If this is the first .plt entry, make room for the special
2990          first entry.  */
2991       if (s->_raw_size == 0)
2992         s->_raw_size += PLT_ENTRY_SIZE;
2993
2994       /* If this symbol is not defined in a regular file, and we are
2995          not generating a shared library, then set the symbol to this
2996          location in the .plt.  This is required to make function
2997          pointers compare as equal between the normal executable and
2998          the shared library.  */
2999       if (! info->shared
3000           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3001         {
3002           h->root.u.def.section = s;
3003           h->root.u.def.value = s->_raw_size;
3004         }
3005
3006       h->plt.offset = s->_raw_size;
3007
3008       /* Make room for this entry.  */
3009       s->_raw_size += PLT_ENTRY_SIZE;
3010
3011       /* We also need to make an entry in the .got.plt section, which
3012          will be placed in the .got section by the linker script.  */
3013       s = bfd_get_section_by_name (dynobj, ".got.plt");
3014       BFD_ASSERT (s != NULL);
3015       s->_raw_size += 4;
3016
3017       /* We also need to make an entry in the .rel.plt section.  */
3018
3019       s = bfd_get_section_by_name (dynobj, ".rel.plt");
3020       BFD_ASSERT (s != NULL);
3021       s->_raw_size += sizeof (Elf32_External_Rel);
3022
3023       return TRUE;
3024     }
3025
3026   /* If this is a weak symbol, and there is a real definition, the
3027      processor independent code will have arranged for us to see the
3028      real definition first, and we can just use the same value.  */
3029   if (h->weakdef != NULL)
3030     {
3031       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
3032                   || h->weakdef->root.type == bfd_link_hash_defweak);
3033       h->root.u.def.section = h->weakdef->root.u.def.section;
3034       h->root.u.def.value = h->weakdef->root.u.def.value;
3035       return TRUE;
3036     }
3037
3038   /* This is a reference to a symbol defined by a dynamic object which
3039      is not a function.  */
3040
3041   /* If we are creating a shared library, we must presume that the
3042      only references to the symbol are via the global offset table.
3043      For such cases we need not do anything here; the relocations will
3044      be handled correctly by relocate_section.  */
3045   if (info->shared)
3046     return TRUE;
3047
3048   /* We must allocate the symbol in our .dynbss section, which will
3049      become part of the .bss section of the executable.  There will be
3050      an entry for this symbol in the .dynsym section.  The dynamic
3051      object will contain position independent code, so all references
3052      from the dynamic object to this symbol will go through the global
3053      offset table.  The dynamic linker will use the .dynsym entry to
3054      determine the address it must put in the global offset table, so
3055      both the dynamic object and the regular object will refer to the
3056      same memory location for the variable.  */
3057   s = bfd_get_section_by_name (dynobj, ".dynbss");
3058   BFD_ASSERT (s != NULL);
3059
3060   /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
3061      copy the initial value out of the dynamic object and into the
3062      runtime process image.  We need to remember the offset into the
3063      .rel.bss section we are going to use.  */
3064   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3065     {
3066       asection *srel;
3067
3068       srel = bfd_get_section_by_name (dynobj, ".rel.bss");
3069       BFD_ASSERT (srel != NULL);
3070       srel->_raw_size += sizeof (Elf32_External_Rel);
3071       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
3072     }
3073
3074   /* We need to figure out the alignment required for this symbol.  I
3075      have no idea how ELF linkers handle this.  */
3076   power_of_two = bfd_log2 (h->size);
3077   if (power_of_two > 3)
3078     power_of_two = 3;
3079
3080   /* Apply the required alignment.  */
3081   s->_raw_size = BFD_ALIGN (s->_raw_size,
3082                             (bfd_size_type) (1 << power_of_two));
3083   if (power_of_two > bfd_get_section_alignment (dynobj, s))
3084     {
3085       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
3086         return FALSE;
3087     }
3088
3089   /* Define the symbol as being at this point in the section.  */
3090   h->root.u.def.section = s;
3091   h->root.u.def.value = s->_raw_size;
3092
3093   /* Increment the section size to make room for the symbol.  */
3094   s->_raw_size += h->size;
3095
3096   return TRUE;
3097 }
3098
3099 /* Set the sizes of the dynamic sections.  */
3100
3101 static bfd_boolean
3102 elf32_arm_size_dynamic_sections (output_bfd, info)
3103      bfd * output_bfd ATTRIBUTE_UNUSED;
3104      struct bfd_link_info * info;
3105 {
3106   bfd * dynobj;
3107   asection * s;
3108   bfd_boolean plt;
3109   bfd_boolean relocs;
3110
3111   dynobj = elf_hash_table (info)->dynobj;
3112   BFD_ASSERT (dynobj != NULL);
3113
3114   if (elf_hash_table (info)->dynamic_sections_created)
3115     {
3116       /* Set the contents of the .interp section to the interpreter.  */
3117       if (! info->shared)
3118         {
3119           s = bfd_get_section_by_name (dynobj, ".interp");
3120           BFD_ASSERT (s != NULL);
3121           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
3122           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3123         }
3124     }
3125   else
3126     {
3127       /* We may have created entries in the .rel.got section.
3128          However, if we are not creating the dynamic sections, we will
3129          not actually use these entries.  Reset the size of .rel.got,
3130          which will cause it to get stripped from the output file
3131          below.  */
3132       s = bfd_get_section_by_name (dynobj, ".rel.got");
3133       if (s != NULL)
3134         s->_raw_size = 0;
3135     }
3136
3137   /* If this is a -Bsymbolic shared link, then we need to discard all
3138      PC relative relocs against symbols defined in a regular object.
3139      We allocated space for them in the check_relocs routine, but we
3140      will not fill them in in the relocate_section routine.  */
3141   if (info->shared && info->symbolic)
3142     elf32_arm_link_hash_traverse (elf32_arm_hash_table (info),
3143                                   elf32_arm_discard_copies,
3144                                   (PTR) NULL);
3145
3146   /* The check_relocs and adjust_dynamic_symbol entry points have
3147      determined the sizes of the various dynamic sections.  Allocate
3148      memory for them.  */
3149   plt = FALSE;
3150   relocs = FALSE;
3151   for (s = dynobj->sections; s != NULL; s = s->next)
3152     {
3153       const char * name;
3154       bfd_boolean strip;
3155
3156       if ((s->flags & SEC_LINKER_CREATED) == 0)
3157         continue;
3158
3159       /* It's OK to base decisions on the section name, because none
3160          of the dynobj section names depend upon the input files.  */
3161       name = bfd_get_section_name (dynobj, s);
3162
3163       strip = FALSE;
3164
3165       if (strcmp (name, ".plt") == 0)
3166         {
3167           if (s->_raw_size == 0)
3168             {
3169               /* Strip this section if we don't need it; see the
3170                  comment below.  */
3171               strip = TRUE;
3172             }
3173           else
3174             {
3175               /* Remember whether there is a PLT.  */
3176               plt = TRUE;
3177             }
3178         }
3179       else if (strncmp (name, ".rel", 4) == 0)
3180         {
3181           if (s->_raw_size == 0)
3182             {
3183               /* If we don't need this section, strip it from the
3184                  output file.  This is mostly to handle .rel.bss and
3185                  .rel.plt.  We must create both sections in
3186                  create_dynamic_sections, because they must be created
3187                  before the linker maps input sections to output
3188                  sections.  The linker does that before
3189                  adjust_dynamic_symbol is called, and it is that
3190                  function which decides whether anything needs to go
3191                  into these sections.  */
3192               strip = TRUE;
3193             }
3194           else
3195             {
3196               /* Remember whether there are any reloc sections other
3197                  than .rel.plt.  */
3198               if (strcmp (name, ".rel.plt") != 0)
3199                 relocs = TRUE;
3200
3201               /* We use the reloc_count field as a counter if we need
3202                  to copy relocs into the output file.  */
3203               s->reloc_count = 0;
3204             }
3205         }
3206       else if (strncmp (name, ".got", 4) != 0)
3207         {
3208           /* It's not one of our sections, so don't allocate space.  */
3209           continue;
3210         }
3211
3212       if (strip)
3213         {
3214           _bfd_strip_section_from_output (info, s);
3215           continue;
3216         }
3217
3218       /* Allocate memory for the section contents.  */
3219       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
3220       if (s->contents == NULL && s->_raw_size != 0)
3221         return FALSE;
3222     }
3223
3224   if (elf_hash_table (info)->dynamic_sections_created)
3225     {
3226       /* Add some entries to the .dynamic section.  We fill in the
3227          values later, in elf32_arm_finish_dynamic_sections, but we
3228          must add the entries now so that we get the correct size for
3229          the .dynamic section.  The DT_DEBUG entry is filled in by the
3230          dynamic linker and used by the debugger.  */
3231 #define add_dynamic_entry(TAG, VAL) \
3232   bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
3233
3234       if (!info->shared)
3235         {
3236           if (!add_dynamic_entry (DT_DEBUG, 0))
3237             return FALSE;
3238         }
3239
3240       if (plt)
3241         {
3242           if (   !add_dynamic_entry (DT_PLTGOT, 0)
3243               || !add_dynamic_entry (DT_PLTRELSZ, 0)
3244               || !add_dynamic_entry (DT_PLTREL, DT_REL)
3245               || !add_dynamic_entry (DT_JMPREL, 0))
3246             return FALSE;
3247         }
3248
3249       if (relocs)
3250         {
3251           if (   !add_dynamic_entry (DT_REL, 0)
3252               || !add_dynamic_entry (DT_RELSZ, 0)
3253               || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
3254             return FALSE;
3255         }
3256
3257       if ((info->flags & DF_TEXTREL) != 0)
3258         {
3259           if (!add_dynamic_entry (DT_TEXTREL, 0))
3260             return FALSE;
3261           info->flags |= DF_TEXTREL;
3262         }
3263     }
3264 #undef add_synamic_entry
3265
3266   return TRUE;
3267 }
3268
3269 /* This function is called via elf32_arm_link_hash_traverse if we are
3270    creating a shared object with -Bsymbolic.  It discards the space
3271    allocated to copy PC relative relocs against symbols which are
3272    defined in regular objects.  We allocated space for them in the
3273    check_relocs routine, but we won't fill them in in the
3274    relocate_section routine.  */
3275
3276 static bfd_boolean
3277 elf32_arm_discard_copies (h, ignore)
3278      struct elf32_arm_link_hash_entry * h;
3279      PTR ignore ATTRIBUTE_UNUSED;
3280 {
3281   struct elf32_arm_pcrel_relocs_copied * s;
3282
3283   if (h->root.root.type == bfd_link_hash_warning)
3284     h = (struct elf32_arm_link_hash_entry *) h->root.root.u.i.link;
3285
3286   /* We only discard relocs for symbols defined in a regular object.  */
3287   if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3288     return TRUE;
3289
3290   for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
3291     s->section->_raw_size -= s->count * sizeof (Elf32_External_Rel);
3292
3293   return TRUE;
3294 }
3295
3296 /* Finish up dynamic symbol handling.  We set the contents of various
3297    dynamic sections here.  */
3298
3299 static bfd_boolean
3300 elf32_arm_finish_dynamic_symbol (output_bfd, info, h, sym)
3301      bfd * output_bfd;
3302      struct bfd_link_info * info;
3303      struct elf_link_hash_entry * h;
3304      Elf_Internal_Sym * sym;
3305 {
3306   bfd * dynobj;
3307
3308   dynobj = elf_hash_table (info)->dynobj;
3309
3310   if (h->plt.offset != (bfd_vma) -1)
3311     {
3312       asection * splt;
3313       asection * sgot;
3314       asection * srel;
3315       bfd_vma plt_index;
3316       bfd_vma got_offset;
3317       Elf_Internal_Rela rel;
3318       bfd_byte *loc;
3319
3320       /* This symbol has an entry in the procedure linkage table.  Set
3321          it up.  */
3322
3323       BFD_ASSERT (h->dynindx != -1);
3324
3325       splt = bfd_get_section_by_name (dynobj, ".plt");
3326       sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3327       srel = bfd_get_section_by_name (dynobj, ".rel.plt");
3328       BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
3329
3330       /* Get the index in the procedure linkage table which
3331          corresponds to this symbol.  This is the index of this symbol
3332          in all the symbols for which we are making plt entries.  The
3333          first entry in the procedure linkage table is reserved.  */
3334       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
3335
3336       /* Get the offset into the .got table of the entry that
3337          corresponds to this function.  Each .got entry is 4 bytes.
3338          The first three are reserved.  */
3339       got_offset = (plt_index + 3) * 4;
3340
3341       /* Fill in the entry in the procedure linkage table.  */
3342       bfd_put_32 (output_bfd, elf32_arm_plt_entry[0],
3343                   splt->contents + h->plt.offset + 0);
3344       bfd_put_32 (output_bfd, elf32_arm_plt_entry[1],
3345                   splt->contents + h->plt.offset + 4);
3346       bfd_put_32 (output_bfd, elf32_arm_plt_entry[2],
3347                   splt->contents + h->plt.offset + 8);
3348       bfd_put_32 (output_bfd,
3349                       (sgot->output_section->vma
3350                        + sgot->output_offset
3351                        + got_offset
3352                        - splt->output_section->vma
3353                        - splt->output_offset
3354                        - h->plt.offset - 12),
3355                       splt->contents + h->plt.offset + 12);
3356
3357       /* Fill in the entry in the global offset table.  */
3358       bfd_put_32 (output_bfd,
3359                   (splt->output_section->vma
3360                    + splt->output_offset),
3361                   sgot->contents + got_offset);
3362
3363       /* Fill in the entry in the .rel.plt section.  */
3364       rel.r_offset = (sgot->output_section->vma
3365                       + sgot->output_offset
3366                       + got_offset);
3367       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
3368       loc = srel->contents + plt_index * sizeof (Elf32_External_Rel);
3369       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3370
3371       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3372         {
3373           /* Mark the symbol as undefined, rather than as defined in
3374              the .plt section.  Leave the value alone.  */
3375           sym->st_shndx = SHN_UNDEF;
3376           /* If the symbol is weak, we do need to clear the value.
3377              Otherwise, the PLT entry would provide a definition for
3378              the symbol even if the symbol wasn't defined anywhere,
3379              and so the symbol would never be NULL.  */
3380           if ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
3381               == 0)
3382             sym->st_value = 0;
3383         }
3384     }
3385
3386   if (h->got.offset != (bfd_vma) -1)
3387     {
3388       asection * sgot;
3389       asection * srel;
3390       Elf_Internal_Rela rel;
3391       bfd_byte *loc;
3392
3393       /* This symbol has an entry in the global offset table.  Set it
3394          up.  */
3395       sgot = bfd_get_section_by_name (dynobj, ".got");
3396       srel = bfd_get_section_by_name (dynobj, ".rel.got");
3397       BFD_ASSERT (sgot != NULL && srel != NULL);
3398
3399       rel.r_offset = (sgot->output_section->vma
3400                       + sgot->output_offset
3401                       + (h->got.offset &~ (bfd_vma) 1));
3402
3403       /* If this is a -Bsymbolic link, and the symbol is defined
3404          locally, we just want to emit a RELATIVE reloc.  The entry in
3405          the global offset table will already have been initialized in
3406          the relocate_section function.  */
3407       if (info->shared
3408           && (info->symbolic || h->dynindx == -1)
3409           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3410         rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
3411       else
3412         {
3413           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
3414           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
3415         }
3416
3417       loc = srel->contents + srel->reloc_count++ * sizeof (Elf32_External_Rel);
3418       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3419     }
3420
3421   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
3422     {
3423       asection * s;
3424       Elf_Internal_Rela rel;
3425       bfd_byte *loc;
3426
3427       /* This symbol needs a copy reloc.  Set it up.  */
3428       BFD_ASSERT (h->dynindx != -1
3429                   && (h->root.type == bfd_link_hash_defined
3430                       || h->root.type == bfd_link_hash_defweak));
3431
3432       s = bfd_get_section_by_name (h->root.u.def.section->owner,
3433                                    ".rel.bss");
3434       BFD_ASSERT (s != NULL);
3435
3436       rel.r_offset = (h->root.u.def.value
3437                       + h->root.u.def.section->output_section->vma
3438                       + h->root.u.def.section->output_offset);
3439       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
3440       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rel);
3441       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3442     }
3443
3444   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3445   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3446       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3447     sym->st_shndx = SHN_ABS;
3448
3449   return TRUE;
3450 }
3451
3452 /* Finish up the dynamic sections.  */
3453
3454 static bfd_boolean
3455 elf32_arm_finish_dynamic_sections (output_bfd, info)
3456      bfd * output_bfd;
3457      struct bfd_link_info * info;
3458 {
3459   bfd * dynobj;
3460   asection * sgot;
3461   asection * sdyn;
3462
3463   dynobj = elf_hash_table (info)->dynobj;
3464
3465   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3466   BFD_ASSERT (sgot != NULL);
3467   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3468
3469   if (elf_hash_table (info)->dynamic_sections_created)
3470     {
3471       asection *splt;
3472       Elf32_External_Dyn *dyncon, *dynconend;
3473
3474       splt = bfd_get_section_by_name (dynobj, ".plt");
3475       BFD_ASSERT (splt != NULL && sdyn != NULL);
3476
3477       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3478       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3479
3480       for (; dyncon < dynconend; dyncon++)
3481         {
3482           Elf_Internal_Dyn dyn;
3483           const char * name;
3484           asection * s;
3485
3486           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3487
3488           switch (dyn.d_tag)
3489             {
3490             default:
3491               break;
3492
3493             case DT_PLTGOT:
3494               name = ".got";
3495               goto get_vma;
3496             case DT_JMPREL:
3497               name = ".rel.plt";
3498             get_vma:
3499               s = bfd_get_section_by_name (output_bfd, name);
3500               BFD_ASSERT (s != NULL);
3501               dyn.d_un.d_ptr = s->vma;
3502               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3503               break;
3504
3505             case DT_PLTRELSZ:
3506               s = bfd_get_section_by_name (output_bfd, ".rel.plt");
3507               BFD_ASSERT (s != NULL);
3508               if (s->_cooked_size != 0)
3509                 dyn.d_un.d_val = s->_cooked_size;
3510               else
3511                 dyn.d_un.d_val = s->_raw_size;
3512               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3513               break;
3514
3515             case DT_RELSZ:
3516               /* My reading of the SVR4 ABI indicates that the
3517                  procedure linkage table relocs (DT_JMPREL) should be
3518                  included in the overall relocs (DT_REL).  This is
3519                  what Solaris does.  However, UnixWare can not handle
3520                  that case.  Therefore, we override the DT_RELSZ entry
3521                  here to make it not include the JMPREL relocs.  Since
3522                  the linker script arranges for .rel.plt to follow all
3523                  other relocation sections, we don't have to worry
3524                  about changing the DT_REL entry.  */
3525               s = bfd_get_section_by_name (output_bfd, ".rel.plt");
3526               if (s != NULL)
3527                 {
3528                   if (s->_cooked_size != 0)
3529                     dyn.d_un.d_val -= s->_cooked_size;
3530                   else
3531                     dyn.d_un.d_val -= s->_raw_size;
3532                 }
3533               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3534               break;
3535
3536               /* Set the bottom bit of DT_INIT/FINI if the
3537                  corresponding function is Thumb.  */
3538             case DT_INIT:
3539               name = info->init_function;
3540               goto get_sym;
3541             case DT_FINI:
3542               name = info->fini_function;
3543             get_sym:
3544               /* If it wasn't set by elf_bfd_final_link
3545                  then there is nothing to ajdust.  */
3546               if (dyn.d_un.d_val != 0)
3547                 {
3548                   struct elf_link_hash_entry * eh;
3549
3550                   eh = elf_link_hash_lookup (elf_hash_table (info), name,
3551                                              FALSE, FALSE, TRUE);
3552                   if (eh != (struct elf_link_hash_entry *) NULL
3553                       && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
3554                     {
3555                       dyn.d_un.d_val |= 1;
3556                       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3557                     }
3558                 }
3559               break;
3560             }
3561         }
3562
3563       /* Fill in the first entry in the procedure linkage table.  */
3564       if (splt->_raw_size > 0)
3565         {
3566           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents +  0);
3567           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents +  4);
3568           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents +  8);
3569           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12);
3570         }
3571
3572       /* UnixWare sets the entsize of .plt to 4, although that doesn't
3573          really seem like the right value.  */
3574       elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
3575     }
3576
3577   /* Fill in the first three entries in the global offset table.  */
3578   if (sgot->_raw_size > 0)
3579     {
3580       if (sdyn == NULL)
3581         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
3582       else
3583         bfd_put_32 (output_bfd,
3584                     sdyn->output_section->vma + sdyn->output_offset,
3585                     sgot->contents);
3586       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
3587       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
3588     }
3589
3590   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
3591
3592   return TRUE;
3593 }
3594
3595 static void
3596 elf32_arm_post_process_headers (abfd, link_info)
3597      bfd * abfd;
3598      struct bfd_link_info * link_info ATTRIBUTE_UNUSED;
3599 {
3600   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
3601
3602   i_ehdrp = elf_elfheader (abfd);
3603
3604   i_ehdrp->e_ident[EI_OSABI]      = ARM_ELF_OS_ABI_VERSION;
3605   i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
3606 }
3607
3608 static enum elf_reloc_type_class
3609 elf32_arm_reloc_type_class (rela)
3610      const Elf_Internal_Rela *rela;
3611 {
3612   switch ((int) ELF32_R_TYPE (rela->r_info))
3613     {
3614     case R_ARM_RELATIVE:
3615       return reloc_class_relative;
3616     case R_ARM_JUMP_SLOT:
3617       return reloc_class_plt;
3618     case R_ARM_COPY:
3619       return reloc_class_copy;
3620     default:
3621       return reloc_class_normal;
3622     }
3623 }
3624
3625
3626 #define ELF_ARCH                        bfd_arch_arm
3627 #define ELF_MACHINE_CODE                EM_ARM
3628 #define ELF_MAXPAGESIZE                 0x8000
3629
3630 #define bfd_elf32_bfd_copy_private_bfd_data     elf32_arm_copy_private_bfd_data
3631 #define bfd_elf32_bfd_merge_private_bfd_data    elf32_arm_merge_private_bfd_data
3632 #define bfd_elf32_bfd_set_private_flags         elf32_arm_set_private_flags
3633 #define bfd_elf32_bfd_print_private_bfd_data    elf32_arm_print_private_bfd_data
3634 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_link_hash_table_create
3635 #define bfd_elf32_bfd_reloc_type_lookup         elf32_arm_reloc_type_lookup
3636 #define bfd_elf32_find_nearest_line             elf32_arm_find_nearest_line
3637
3638 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
3639 #define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
3640 #define elf_backend_gc_sweep_hook               elf32_arm_gc_sweep_hook
3641 #define elf_backend_check_relocs                elf32_arm_check_relocs
3642 #define elf_backend_relocate_section            elf32_arm_relocate_section
3643 #define elf_backend_adjust_dynamic_symbol       elf32_arm_adjust_dynamic_symbol
3644 #define elf_backend_create_dynamic_sections     _bfd_elf_create_dynamic_sections
3645 #define elf_backend_finish_dynamic_symbol       elf32_arm_finish_dynamic_symbol
3646 #define elf_backend_finish_dynamic_sections     elf32_arm_finish_dynamic_sections
3647 #define elf_backend_size_dynamic_sections       elf32_arm_size_dynamic_sections
3648 #define elf_backend_post_process_headers        elf32_arm_post_process_headers
3649 #define elf_backend_reloc_type_class            elf32_arm_reloc_type_class
3650
3651 #define elf_backend_can_gc_sections 1
3652 #define elf_backend_plt_readonly    1
3653 #define elf_backend_want_got_plt    1
3654 #define elf_backend_want_plt_sym    0
3655 #if !USE_REL
3656 #define elf_backend_rela_normal     1
3657 #endif
3658
3659 #define elf_backend_got_header_size     12
3660 #define elf_backend_plt_header_size     PLT_ENTRY_SIZE
3661
3662 #include "elf32-target.h"
3663
This page took 0.238211 seconds and 4 git commands to generate.