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