1 /* 32-bit ELF support for ARM
2 Copyright 1998, 1999 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
21 typedef unsigned long int insn32
;
22 typedef unsigned short int insn16
;
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
36 static bfd_reloc_status_type elf32_arm_final_link_relocate
37 PARAMS ((reloc_howto_type
*, bfd
*, bfd
*, asection
*, bfd_byte
*, Elf_Internal_Rela
*, bfd_vma
, struct bfd_link_info
*, asection
*, const char *, unsigned char));
39 static insn32 insert_thumb_branch
40 PARAMS ((insn32
, int));
41 static struct elf_link_hash_entry
*find_thumb_glue
42 PARAMS ((struct bfd_link_info
*, CONST
char *, bfd
*));
43 static struct elf_link_hash_entry
*find_arm_glue
44 PARAMS ((struct bfd_link_info
*, CONST
char *, bfd
*));
45 static void record_arm_to_thumb_glue
46 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
47 static void record_thumb_to_arm_glue
48 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
50 /* The linker script knows the section names for placement.
51 The entry_names are used to do simple name mangling on the stubs.
52 Given a function name, and its type, the stub can be found. The
53 name can be changed. The only requirement is the %s be present.
56 #define INTERWORK_FLAG( abfd ) (elf_elfheader (abfd)->e_flags & EF_INTERWORK)
58 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
59 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
61 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
62 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
64 /* The name of the dynamic interpreter. This is put in the .interp
66 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
68 /* The size in bytes of an entry in the procedure linkage table. */
70 #define PLT_ENTRY_SIZE 16
72 /* The first entry in a procedure linkage table looks like
73 this. It is set up so that any shared library function that is
74 called before the relocation has been set up calles the dynamic
77 static const bfd_byte elf32_arm_plt0_entry
[PLT_ENTRY_SIZE
] =
79 0x04, 0xe0, 0x2d, 0xe5, /* str lr, [sp, #-4]! */
80 0x10, 0xe0, 0x9f, 0xe5, /* ldr lr, [pc, #16] */
81 0x0e, 0xe0, 0x8f, 0xe0, /* adr lr, pc, lr */
82 0x08, 0xf0, 0xbe, 0xe5 /* ldr pc, [lr, #-4] */
85 /* Subsequent entries in a procedure linkage table look like
88 static const bfd_byte elf32_arm_plt_entry
[PLT_ENTRY_SIZE
] =
90 0x04, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc, #4] */
91 0x0c, 0xc0, 0x8f, 0xe0, /* add ip, pc, ip */
92 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
93 0x00, 0x00, 0x00, 0x00 /* offset to symbol in got */
97 /* The ARM linker needs to keep track of the number of relocs that it
98 decides to copy in check_relocs for each symbol. This is so that
99 it can discard PC relative relocs if it doesn't need them when
100 linking with -Bsymbolic. We store the information in a field
101 extending the regular ELF linker hash table. */
103 /* This structure keeps track of the number of PC relative relocs we
104 have copied for a given symbol. */
106 struct elf32_arm_pcrel_relocs_copied
109 struct elf32_arm_pcrel_relocs_copied
* next
;
110 /* A section in dynobj. */
112 /* Number of relocs copied in this section. */
116 /* arm ELF linker hash entry. */
118 struct elf32_arm_link_hash_entry
120 struct elf_link_hash_entry root
;
122 /* Number of PC relative relocs copied for this symbol. */
123 struct elf32_arm_pcrel_relocs_copied
* pcrel_relocs_copied
;
126 /* Declare this now that the above structures are defined. */
128 static boolean elf32_arm_discard_copies
129 PARAMS ((struct elf32_arm_link_hash_entry
*, PTR
));
131 /* Traverse an arm ELF linker hash table. */
133 #define elf32_arm_link_hash_traverse(table, func, info) \
134 (elf_link_hash_traverse \
136 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
139 /* Get the ARM elf linker hash table from a link_info structure. */
140 #define elf32_arm_hash_table(info) \
141 ((struct elf32_arm_link_hash_table *) ((info)->hash))
143 /* ARM ELF linker hash table */
144 struct elf32_arm_link_hash_table
146 /* The main hash table. */
147 struct elf_link_hash_table root
;
149 /* The size in bytes of the section containg the Thumb-to-ARM glue. */
150 long int thumb_glue_size
;
152 /* The size in bytes of the section containg the ARM-to-Thumb glue. */
153 long int arm_glue_size
;
155 /* An arbitary input BFD chosen to hold the glue sections. */
156 bfd
* bfd_of_glue_owner
;
160 /* Create an ARM elf linker hash table */
162 static struct bfd_link_hash_table
*
163 elf32_arm_link_hash_table_create (abfd
)
166 struct elf32_arm_link_hash_table
*ret
;
168 ret
= ((struct elf32_arm_link_hash_table
*)
169 bfd_alloc (abfd
, sizeof (struct elf32_arm_link_hash_table
)));
170 if (ret
== (struct elf32_arm_link_hash_table
*) NULL
)
173 if (!_bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
174 _bfd_elf_link_hash_newfunc
))
176 bfd_release (abfd
, ret
);
180 ret
->thumb_glue_size
= 0;
181 ret
->arm_glue_size
= 0;
182 ret
->bfd_of_glue_owner
= NULL
;
184 return &ret
->root
.root
;
187 static struct elf_link_hash_entry
*
188 find_thumb_glue (link_info
, name
, input_bfd
)
189 struct bfd_link_info
*link_info
;
194 struct elf_link_hash_entry
*hash
;
195 struct elf32_arm_link_hash_table
*hash_table
;
197 /* We need a pointer to the armelf specific hash table. */
198 hash_table
= elf32_arm_hash_table (link_info
);
202 bfd_malloc (strlen (name
) + strlen (THUMB2ARM_GLUE_ENTRY_NAME
) + 1));
204 BFD_ASSERT (tmp_name
);
206 sprintf (tmp_name
, THUMB2ARM_GLUE_ENTRY_NAME
, name
);
208 hash
= elf_link_hash_lookup
209 (&(hash_table
)->root
, tmp_name
, false, false, true);
212 /* xgettext:c-format */
213 _bfd_error_handler (_ ("%s: unable to find THUMB glue '%s' for `%s'"),
214 bfd_get_filename (input_bfd
), tmp_name
, name
);
221 static struct elf_link_hash_entry
*
222 find_arm_glue (link_info
, name
, input_bfd
)
223 struct bfd_link_info
*link_info
;
228 struct elf_link_hash_entry
*myh
;
229 struct elf32_arm_link_hash_table
*hash_table
;
231 /* We need a pointer to the elfarm specific hash table. */
232 hash_table
= elf32_arm_hash_table (link_info
);
235 bfd_malloc (strlen (name
) + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1));
237 BFD_ASSERT (tmp_name
);
239 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
241 myh
= elf_link_hash_lookup
242 (&(hash_table
)->root
, tmp_name
, false, false, true);
245 /* xgettext:c-format */
246 _bfd_error_handler (_ ("%s: unable to find ARM glue '%s' for `%s'"),
247 bfd_get_filename (input_bfd
), tmp_name
, name
);
262 .word func @ behave as if you saw a ARM_32 reloc
265 #define ARM2THUMB_GLUE_SIZE 12
266 static const insn32 a2t1_ldr_insn
= 0xe59fc000;
267 static const insn32 a2t2_bx_r12_insn
= 0xe12fff1c;
268 static const insn32 a2t3_func_addr_insn
= 0x00000001;
271 Thumb->ARM: Thumb->(non-interworking aware) ARM
275 __func_from_thumb: __func_from_thumb:
277 nop ldr r6, __func_addr
279 __func_change_to_arm: bx r6
281 __func_back_to_thumb:
288 #define THUMB2ARM_GLUE_SIZE 8
289 static const insn16 t2a1_bx_pc_insn
= 0x4778;
290 static const insn16 t2a2_noop_insn
= 0x46c0;
291 static const insn32 t2a3_b_insn
= 0xea000000;
293 static const insn16 t2a1_push_insn
= 0xb540;
294 static const insn16 t2a2_ldr_insn
= 0x4e03;
295 static const insn16 t2a3_mov_insn
= 0x46fe;
296 static const insn16 t2a4_bx_insn
= 0x4730;
297 static const insn32 t2a5_pop_insn
= 0xe8bd4040;
298 static const insn32 t2a6_bx_insn
= 0xe12fff1e;
301 bfd_elf32_arm_allocate_interworking_sections (info
)
302 struct bfd_link_info
* info
;
306 struct elf32_arm_link_hash_table
* globals
;
308 globals
= elf32_arm_hash_table (info
);
310 BFD_ASSERT (globals
!= NULL
);
312 if (globals
->arm_glue_size
!= 0)
314 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
316 s
= bfd_get_section_by_name
317 (globals
->bfd_of_glue_owner
, ARM2THUMB_GLUE_SECTION_NAME
);
319 BFD_ASSERT (s
!= NULL
);
321 foo
= (bfd_byte
*) bfd_alloc
322 (globals
->bfd_of_glue_owner
, globals
->arm_glue_size
);
324 s
->_raw_size
= s
->_cooked_size
= globals
->arm_glue_size
;
328 if (globals
->thumb_glue_size
!= 0)
330 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
332 s
= bfd_get_section_by_name
333 (globals
->bfd_of_glue_owner
, THUMB2ARM_GLUE_SECTION_NAME
);
335 BFD_ASSERT (s
!= NULL
);
337 foo
= (bfd_byte
*) bfd_alloc
338 (globals
->bfd_of_glue_owner
, globals
->thumb_glue_size
);
340 s
->_raw_size
= s
->_cooked_size
= globals
->thumb_glue_size
;
348 record_arm_to_thumb_glue (link_info
, h
)
349 struct bfd_link_info
* link_info
;
350 struct elf_link_hash_entry
* h
;
352 const char * name
= h
->root
.root
.string
;
353 register asection
* s
;
355 struct elf_link_hash_entry
* myh
;
356 struct elf32_arm_link_hash_table
* globals
;
358 globals
= elf32_arm_hash_table (link_info
);
360 BFD_ASSERT (globals
!= NULL
);
361 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
363 s
= bfd_get_section_by_name
364 (globals
->bfd_of_glue_owner
, ARM2THUMB_GLUE_SECTION_NAME
);
367 BFD_ASSERT (s
!= NULL
);
370 bfd_malloc (strlen (name
) + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1));
372 BFD_ASSERT (tmp_name
);
374 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
376 myh
= elf_link_hash_lookup
377 (&(globals
)->root
, tmp_name
, false, false, true);
382 return; /* we've already seen this guy */
385 /* The only trick here is using hash_table->arm_glue_size as the value. Even
386 though the section isn't allocated yet, this is where we will be putting
389 _bfd_generic_link_add_one_symbol (link_info
, globals
->bfd_of_glue_owner
, tmp_name
,
391 s
, globals
->arm_glue_size
+ 1,
393 (struct bfd_link_hash_entry
**) &myh
);
397 globals
->arm_glue_size
+= ARM2THUMB_GLUE_SIZE
;
403 record_thumb_to_arm_glue (link_info
, h
)
404 struct bfd_link_info
*link_info
;
405 struct elf_link_hash_entry
*h
;
407 const char *name
= h
->root
.root
.string
;
408 register asection
*s
;
410 struct elf_link_hash_entry
*myh
;
411 struct elf32_arm_link_hash_table
*hash_table
;
414 hash_table
= elf32_arm_hash_table (link_info
);
416 BFD_ASSERT (hash_table
!= NULL
);
417 BFD_ASSERT (hash_table
->bfd_of_glue_owner
!= NULL
);
419 s
= bfd_get_section_by_name
420 (hash_table
->bfd_of_glue_owner
, THUMB2ARM_GLUE_SECTION_NAME
);
422 BFD_ASSERT (s
!= NULL
);
424 tmp_name
= (char *) bfd_malloc (strlen (name
) + strlen (THUMB2ARM_GLUE_ENTRY_NAME
) + 1);
426 BFD_ASSERT (tmp_name
);
428 sprintf (tmp_name
, THUMB2ARM_GLUE_ENTRY_NAME
, name
);
430 myh
= elf_link_hash_lookup
431 (&(hash_table
)->root
, tmp_name
, false, false, true);
436 return; /* we've already seen this guy */
439 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
, tmp_name
,
440 BSF_GLOBAL
, s
, hash_table
->thumb_glue_size
+ 1,
442 (struct bfd_link_hash_entry
**) &myh
);
444 /* If we mark it 'thumb', the disassembler will do a better job. */
445 bind
= ELF_ST_BIND (myh
->type
);
446 myh
->type
= ELF_ST_INFO (bind
, STT_ARM_TFUNC
);
450 /* Allocate another symbol to mark where we switch to arm mode. */
452 #define CHANGE_TO_ARM "__%s_change_to_arm"
453 #define BACK_FROM_ARM "__%s_back_from_arm"
455 tmp_name
= (char *) bfd_malloc (strlen (name
) + strlen (CHANGE_TO_ARM
) + 1);
457 BFD_ASSERT (tmp_name
);
459 sprintf (tmp_name
, CHANGE_TO_ARM
, name
);
463 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
, tmp_name
,
464 BSF_LOCAL
, s
, hash_table
->thumb_glue_size
+ 4,
466 (struct bfd_link_hash_entry
**) &myh
);
470 hash_table
->thumb_glue_size
+= THUMB2ARM_GLUE_SIZE
;
475 /* Select a BFD to be used to hold the sections used by the glue code.
476 This function is called from the linker scripts in ld/emultempl/
479 bfd_elf32_arm_get_bfd_for_interworking (abfd
, info
)
481 struct bfd_link_info
*info
;
483 struct elf32_arm_link_hash_table
*globals
;
487 /* If we are only performing a partial link do not bother
488 getting a bfd to hold the glue. */
489 if (info
->relocateable
)
492 globals
= elf32_arm_hash_table (info
);
494 BFD_ASSERT (globals
!= NULL
);
496 if (globals
->bfd_of_glue_owner
!= NULL
)
499 sec
= bfd_get_section_by_name (abfd
, ARM2THUMB_GLUE_SECTION_NAME
);
503 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
505 sec
= bfd_make_section (abfd
, ARM2THUMB_GLUE_SECTION_NAME
);
508 || !bfd_set_section_flags (abfd
, sec
, flags
)
509 || !bfd_set_section_alignment (abfd
, sec
, 2))
513 sec
= bfd_get_section_by_name (abfd
, THUMB2ARM_GLUE_SECTION_NAME
);
517 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
519 sec
= bfd_make_section (abfd
, THUMB2ARM_GLUE_SECTION_NAME
);
522 || !bfd_set_section_flags (abfd
, sec
, flags
)
523 || !bfd_set_section_alignment (abfd
, sec
, 2))
527 /* Save the bfd for later use. */
528 globals
->bfd_of_glue_owner
= abfd
;
534 bfd_elf32_arm_process_before_allocation (abfd
, link_info
)
536 struct bfd_link_info
*link_info
;
538 Elf_Internal_Shdr
*symtab_hdr
;
539 Elf_Internal_Rela
*free_relocs
= NULL
;
540 Elf_Internal_Rela
*irel
, *irelend
;
541 bfd_byte
*contents
= NULL
;
542 bfd_byte
*free_contents
= NULL
;
543 Elf32_External_Sym
*extsyms
= NULL
;
544 Elf32_External_Sym
*free_extsyms
= NULL
;
547 struct elf32_arm_link_hash_table
*globals
;
549 /* If we are only performing a partial link do not bother
550 to construct any glue. */
551 if (link_info
->relocateable
)
554 /* Here we have a bfd that is to be included on the link. We have a hook
555 to do reloc rummaging, before section sizes are nailed down. */
557 globals
= elf32_arm_hash_table (link_info
);
559 BFD_ASSERT (globals
!= NULL
);
560 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
562 /* Rummage around all the relocs and map the glue vectors. */
563 sec
= abfd
->sections
;
568 for (; sec
!= NULL
; sec
= sec
->next
)
570 if (sec
->reloc_count
== 0)
573 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
574 /* Load the relocs. */
576 irel
= (_bfd_elf32_link_read_relocs (abfd
, sec
, (PTR
) NULL
,
577 (Elf_Internal_Rela
*) NULL
, false));
579 BFD_ASSERT (irel
!= 0);
581 irelend
= irel
+ sec
->reloc_count
;
582 for (; irel
< irelend
; irel
++)
585 unsigned long r_index
;
588 struct elf_link_hash_entry
*h
;
590 r_type
= ELF32_R_TYPE (irel
->r_info
);
591 r_index
= ELF32_R_SYM (irel
->r_info
);
593 /* These are the only relocation types we care about */
594 if (r_type
!= R_ARM_PC24
595 && r_type
!= R_ARM_THM_PC22
)
598 /* Get the section contents if we haven't done so already. */
599 if (contents
== NULL
)
601 /* Get cached copy if it exists. */
602 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
603 contents
= elf_section_data (sec
)->this_hdr
.contents
;
606 /* Go get them off disk. */
607 contents
= (bfd_byte
*) bfd_malloc (sec
->_raw_size
);
608 if (contents
== NULL
)
610 free_contents
= contents
;
612 if (!bfd_get_section_contents (abfd
, sec
, contents
,
613 (file_ptr
) 0, sec
->_raw_size
))
618 /* Read this BFD's symbols if we haven't done so already. */
621 /* Get cached copy if it exists. */
622 if (symtab_hdr
->contents
!= NULL
)
623 extsyms
= (Elf32_External_Sym
*) symtab_hdr
->contents
;
626 /* Go get them off disk. */
627 extsyms
= ((Elf32_External_Sym
*)
628 bfd_malloc (symtab_hdr
->sh_size
));
631 free_extsyms
= extsyms
;
632 if (bfd_seek (abfd
, symtab_hdr
->sh_offset
, SEEK_SET
) != 0
633 || (bfd_read (extsyms
, 1, symtab_hdr
->sh_size
, abfd
)
634 != symtab_hdr
->sh_size
))
639 /* If the relocation is not against a symbol it cannot concern us. */
643 /* We don't care about local symbols */
644 if (r_index
< symtab_hdr
->sh_info
)
647 /* This is an external symbol */
648 r_index
-= symtab_hdr
->sh_info
;
649 h
= (struct elf_link_hash_entry
*)
650 elf_sym_hashes (abfd
)[r_index
];
652 /* If the relocation is against a static symbol it must be within
653 the current section and so cannot be a cross ARM/Thumb relocation. */
660 /* This one is a call from arm code. We need to look up
661 the target of the call. If it is a thumb target, we
664 if (ELF_ST_TYPE(h
->type
) == STT_ARM_TFUNC
)
665 record_arm_to_thumb_glue (link_info
, h
);
669 /* This one is a call from thumb code. We look
670 up the target of the call. If it is not a thumb
671 target, we insert glue. */
673 if (ELF_ST_TYPE (h
->type
) != STT_ARM_TFUNC
)
674 record_thumb_to_arm_glue (link_info
, h
);
685 if (free_relocs
!= NULL
)
687 if (free_contents
!= NULL
)
688 free (free_contents
);
689 if (free_extsyms
!= NULL
)
695 /* The thumb form of a long branch is a bit finicky, because the offset
696 encoding is split over two fields, each in it's own instruction. They
697 can occur in any order. So given a thumb form of long branch, and an
698 offset, insert the offset into the thumb branch and return finished
701 It takes two thumb instructions to encode the target address. Each has
702 11 bits to invest. The upper 11 bits are stored in one (identifed by
703 H-0.. see below), the lower 11 bits are stored in the other (identified
706 Combine together and shifted left by 1 (it's a half word address) and
710 H-0, upper address-0 = 000
712 H-1, lower address-0 = 800
714 They can be ordered either way, but the arm tools I've seen always put
715 the lower one first. It probably doesn't matter. krk@cygnus.com
717 XXX: Actually the order does matter. The second instruction (H-1)
718 moves the computed address into the PC, so it must be the second one
719 in the sequence. The problem, however is that whilst little endian code
720 stores the instructions in HI then LOW order, big endian code does the
721 reverse. nickc@cygnus.com */
723 #define LOW_HI_ORDER 0xF800F000
724 #define HI_LOW_ORDER 0xF000F800
727 insert_thumb_branch (br_insn
, rel_off
)
731 unsigned int low_bits
;
732 unsigned int high_bits
;
735 BFD_ASSERT ((rel_off
& 1) != 1);
737 rel_off
>>= 1; /* half word aligned address */
738 low_bits
= rel_off
& 0x000007FF; /* the bottom 11 bits */
739 high_bits
= (rel_off
>> 11) & 0x000007FF; /* the top 11 bits */
741 if ((br_insn
& LOW_HI_ORDER
) == LOW_HI_ORDER
)
742 br_insn
= LOW_HI_ORDER
| (low_bits
<< 16) | high_bits
;
743 else if ((br_insn
& HI_LOW_ORDER
) == HI_LOW_ORDER
)
744 br_insn
= HI_LOW_ORDER
| (high_bits
<< 16) | low_bits
;
746 abort (); /* error - not a valid branch instruction form */
748 /* FIXME: abort is probably not the right call. krk@cygnus.com */
753 /* Thumb code calling an ARM function */
755 elf32_thumb_to_arm_stub (info
, name
, input_bfd
, output_bfd
, input_section
,
756 hit_data
, sym_sec
, offset
, addend
, val
)
757 struct bfd_link_info
*info
;
761 asection
*input_section
;
770 unsigned long int tmp
;
772 struct elf_link_hash_entry
*myh
;
773 struct elf32_arm_link_hash_table
*globals
;
775 myh
= find_thumb_glue (info
, name
, input_bfd
);
779 globals
= elf32_arm_hash_table (info
);
781 BFD_ASSERT (globals
!= NULL
);
782 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
784 my_offset
= myh
->root
.u
.def
.value
;
786 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
787 THUMB2ARM_GLUE_SECTION_NAME
);
789 BFD_ASSERT (s
!= NULL
);
790 BFD_ASSERT (s
->contents
!= NULL
);
791 BFD_ASSERT (s
->output_section
!= NULL
);
793 if ((my_offset
& 0x01) == 0x01)
796 && sym_sec
->owner
!= NULL
797 && !INTERWORK_FLAG (sym_sec
->owner
))
800 (_ ("%s(%s): warning: interworking not enabled."),
801 bfd_get_filename (sym_sec
->owner
), name
);
803 (_ (" first occurrence: %s: thumb call to arm"),
804 bfd_get_filename (input_bfd
));
810 myh
->root
.u
.def
.value
= my_offset
;
812 bfd_put_16 (output_bfd
, t2a1_bx_pc_insn
,
813 s
->contents
+ my_offset
);
815 bfd_put_16 (output_bfd
, t2a2_noop_insn
,
816 s
->contents
+ my_offset
+ 2);
819 ((bfd_signed_vma
) val
) /* Address of destination of the stub */
821 (s
->output_offset
/* Offset from the start of the current section to the start of the stubs. */
822 + my_offset
/* Offset of the start of this stub from the start of the stubs. */
823 + s
->output_section
->vma
) /* Address of the start of the current section. */
824 + 4 /* The branch instruction is 4 bytes into the stub. */
825 + 8); /* ARM branches work from the pc of the instruction + 8. */
827 bfd_put_32 (output_bfd
,
828 t2a3_b_insn
| ((ret_offset
>> 2) & 0x00FFFFFF),
829 s
->contents
+ my_offset
+ 4);
832 BFD_ASSERT (my_offset
<= globals
->thumb_glue_size
);
834 /* Now go back and fix up the original BL insn to point
839 - (input_section
->output_offset
843 tmp
= bfd_get_32 (input_bfd
, hit_data
844 - input_section
->vma
);
846 bfd_put_32 (output_bfd
,
847 insert_thumb_branch (tmp
, ret_offset
),
848 hit_data
- input_section
->vma
);
853 /* Arm code calling a Thumb function */
855 elf32_arm_to_thumb_stub (info
, name
, input_bfd
, output_bfd
, input_section
,
856 hit_data
, sym_sec
, offset
, addend
, val
)
858 struct bfd_link_info
*info
;
862 asection
*input_section
;
869 unsigned long int tmp
;
873 struct elf_link_hash_entry
*myh
;
874 struct elf32_arm_link_hash_table
*globals
;
876 myh
= find_arm_glue (info
, name
, input_bfd
);
880 globals
= elf32_arm_hash_table (info
);
882 BFD_ASSERT (globals
!= NULL
);
883 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
885 my_offset
= myh
->root
.u
.def
.value
;
886 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
887 ARM2THUMB_GLUE_SECTION_NAME
);
888 BFD_ASSERT (s
!= NULL
);
889 BFD_ASSERT (s
->contents
!= NULL
);
890 BFD_ASSERT (s
->output_section
!= NULL
);
892 if ((my_offset
& 0x01) == 0x01)
895 && sym_sec
->owner
!= NULL
896 && !INTERWORK_FLAG (sym_sec
->owner
))
899 (_ ("%s(%s): warning: interworking not enabled."),
900 bfd_get_filename (sym_sec
->owner
), name
);
902 (_ (" first occurrence: %s: arm call to thumb"),
903 bfd_get_filename (input_bfd
));
906 myh
->root
.u
.def
.value
= my_offset
;
908 bfd_put_32 (output_bfd
, a2t1_ldr_insn
,
909 s
->contents
+ my_offset
);
911 bfd_put_32 (output_bfd
, a2t2_bx_r12_insn
,
912 s
->contents
+ my_offset
+ 4);
914 /* It's a thumb address. Add the low order bit. */
915 bfd_put_32 (output_bfd
, val
| a2t3_func_addr_insn
,
916 s
->contents
+ my_offset
+ 8);
919 BFD_ASSERT (my_offset
<= globals
->arm_glue_size
);
921 tmp
= bfd_get_32 (input_bfd
, hit_data
);
922 tmp
= tmp
& 0xFF000000;
924 /* Somehow these are both 4 too far, so subtract 8. */
925 ret_offset
= s
->output_offset
927 + s
->output_section
->vma
928 - (input_section
->output_offset
929 + input_section
->output_section
->vma
933 tmp
= tmp
| ((ret_offset
>> 2) & 0x00FFFFFF);
935 bfd_put_32 (output_bfd
, tmp
, hit_data
936 - input_section
->vma
);
942 /* Perform a relocation as part of a final link. */
943 static bfd_reloc_status_type
944 elf32_arm_final_link_relocate (howto
, input_bfd
, output_bfd
,
945 input_section
, contents
, rel
, value
,
946 info
, sym_sec
, sym_name
, sym_flags
)
947 reloc_howto_type
* howto
;
950 asection
* input_section
;
952 Elf_Internal_Rela
* rel
;
954 struct bfd_link_info
* info
;
956 const char * sym_name
;
957 unsigned char sym_flags
;
959 unsigned long r_type
= howto
->type
;
960 unsigned long r_symndx
;
961 bfd_byte
* hit_data
= contents
+ rel
->r_offset
;
963 Elf_Internal_Shdr
* symtab_hdr
;
964 struct elf_link_hash_entry
** sym_hashes
;
965 bfd_vma
* local_got_offsets
;
966 asection
* sgot
= NULL
;
967 asection
* splt
= NULL
;
968 asection
* sreloc
= NULL
;
969 struct elf_link_hash_entry
* h
= NULL
;
972 dynobj
= elf_hash_table (info
)->dynobj
;
975 sgot
= bfd_get_section_by_name (dynobj
, ".got");
976 splt
= bfd_get_section_by_name (dynobj
, ".plt");
978 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
979 sym_hashes
= elf_sym_hashes (input_bfd
);
980 local_got_offsets
= elf_local_got_offsets (input_bfd
);
981 r_symndx
= ELF32_R_SYM (rel
->r_info
);
984 addend
= (bfd_get_32 (input_bfd
, hit_data
) & howto
->src_mask
);
986 addend
= rel
->r_addend
;
997 /* When generating a shared object, these relocations are copied
998 into the output file to be resolved at run time. */
1001 && (r_type
!= R_ARM_PC24
1004 && (! info
->symbolic
1005 || (h
->elf_link_hash_flags
1006 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
1008 Elf_Internal_Rel outrel
;
1009 boolean skip
, relocate
;
1015 name
= (bfd_elf_string_from_elf_section
1017 elf_elfheader (input_bfd
)->e_shstrndx
,
1018 elf_section_data (input_section
)->rel_hdr
.sh_name
));
1020 return bfd_reloc_notsupported
;
1022 BFD_ASSERT (strncmp (name
, ".rel", 4) == 0
1023 && strcmp (bfd_get_section_name (input_bfd
,
1027 sreloc
= bfd_get_section_by_name (dynobj
, name
);
1028 BFD_ASSERT (sreloc
!= NULL
);
1033 if (elf_section_data (input_section
)->stab_info
== NULL
)
1034 outrel
.r_offset
= rel
->r_offset
;
1039 off
= (_bfd_stab_section_offset
1040 (output_bfd
, &elf_hash_table (info
)->stab_info
,
1042 & elf_section_data (input_section
)->stab_info
,
1044 if (off
== (bfd_vma
) -1)
1046 outrel
.r_offset
= off
;
1049 outrel
.r_offset
+= (input_section
->output_section
->vma
1050 + input_section
->output_offset
);
1054 memset (&outrel
, 0, sizeof outrel
);
1057 else if (r_type
== R_ARM_PC24
)
1059 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
1060 if ((input_section
->flags
& SEC_ALLOC
) != 0)
1064 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_PC24
);
1069 || ((info
->symbolic
|| h
->dynindx
== -1)
1070 && (h
->elf_link_hash_flags
1071 & ELF_LINK_HASH_DEF_REGULAR
) != 0))
1074 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
1078 BFD_ASSERT (h
->dynindx
!= -1);
1079 if ((input_section
->flags
& SEC_ALLOC
) != 0)
1083 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_ABS32
);
1087 bfd_elf32_swap_reloc_out (output_bfd
, &outrel
,
1088 (((Elf32_External_Rel
*)
1090 + sreloc
->reloc_count
));
1091 ++sreloc
->reloc_count
;
1093 /* If this reloc is against an external symbol, we do not want to
1094 fiddle with the addend. Otherwise, we need to include the symbol
1095 value so that it becomes an addend for the dynamic reloc. */
1097 return bfd_reloc_ok
;
1099 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1100 contents
, rel
->r_offset
, value
,
1103 else switch (r_type
)
1106 /* Arm B/BL instruction */
1108 /* Check for arm calling thumb function. */
1109 if (sym_flags
== STT_ARM_TFUNC
)
1111 elf32_arm_to_thumb_stub (info
, sym_name
, input_bfd
, output_bfd
,
1112 input_section
, hit_data
, sym_sec
, rel
->r_offset
, addend
, value
);
1113 return bfd_reloc_ok
;
1116 value
= value
+ addend
;
1117 value
-= (input_section
->output_section
->vma
1118 + input_section
->output_offset
+ 8);
1119 value
-= rel
->r_offset
;
1120 value
= value
>> howto
->rightshift
;
1123 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
1128 if (sym_flags
== STT_ARM_TFUNC
)
1133 value
-= (input_section
->output_section
->vma
1134 + input_section
->output_offset
);
1139 bfd_put_32 (input_bfd
, value
, hit_data
);
1140 return bfd_reloc_ok
;
1144 if ((long) value
> 0x7f || (long) value
< -0x80)
1145 return bfd_reloc_overflow
;
1147 bfd_put_8 (input_bfd
, value
, hit_data
);
1148 return bfd_reloc_ok
;
1153 if ((long) value
> 0x7fff || (long) value
< -0x8000)
1154 return bfd_reloc_overflow
;
1156 bfd_put_16 (input_bfd
, value
, hit_data
);
1157 return bfd_reloc_ok
;
1160 /* Support ldr and str instruction for the arm */
1161 /* Also thumb b (unconditional branch). ??? Really? */
1164 if ((long) value
> 0x7ff || (long) value
< -0x800)
1165 return bfd_reloc_overflow
;
1167 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xfffff000);
1168 bfd_put_32 (input_bfd
, value
, hit_data
);
1169 return bfd_reloc_ok
;
1171 case R_ARM_THM_ABS5
:
1172 /* Support ldr and str instructions for the thumb. */
1174 /* Need to refetch addend. */
1175 addend
= bfd_get_16 (input_bfd
, hit_data
) & howto
->src_mask
;
1176 /* ??? Need to determine shift amount from operand size. */
1177 addend
>>= howto
->rightshift
;
1181 /* ??? Isn't value unsigned? */
1182 if ((long) value
> 0x1f || (long) value
< -0x10)
1183 return bfd_reloc_overflow
;
1185 /* ??? Value needs to be properly shifted into place first. */
1186 value
|= bfd_get_16 (input_bfd
, hit_data
) & 0xf83f;
1187 bfd_put_16 (input_bfd
, value
, hit_data
);
1188 return bfd_reloc_ok
;
1190 case R_ARM_THM_PC22
:
1191 /* Thumb BL (branch long instruction). */
1194 boolean overflow
= false;
1195 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
1196 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
1197 bfd_vma src_mask
= 0x007FFFFE;
1198 bfd_signed_vma reloc_signed_max
= (1 << (howto
->bitsize
- 1)) - 1;
1199 bfd_signed_vma reloc_signed_min
= ~reloc_signed_max
;
1201 bfd_signed_vma signed_check
;
1203 bfd_signed_vma signed_add
;
1206 /* Need to refetch the addend and squish the two 11 bit pieces
1209 bfd_vma upper
= bfd_get_16 (input_bfd
, hit_data
) & 0x7ff;
1210 bfd_vma lower
= bfd_get_16 (input_bfd
, hit_data
+ 2) & 0x7ff;
1211 upper
= (upper
^ 0x400) - 0x400; /* sign extend */
1212 addend
= (upper
<< 12) | (lower
<< 1);
1216 /* If it's not a call to thumb, assume call to arm */
1217 if (sym_flags
!= STT_ARM_TFUNC
)
1219 if (elf32_thumb_to_arm_stub
1220 (info
, sym_name
, input_bfd
, output_bfd
, input_section
,
1221 hit_data
, sym_sec
, rel
->r_offset
, addend
, value
))
1222 return bfd_reloc_ok
;
1224 return bfd_reloc_dangerous
;
1227 /* +4: pc is offset by 4 */
1228 relocation
= value
+ addend
+ 4;
1229 relocation
-= (input_section
->output_section
->vma
1230 + input_section
->output_offset
);
1231 relocation
-= rel
->r_offset
;
1233 check
= relocation
>> howto
->rightshift
;
1235 /* If this is a signed value, the rightshift just dropped
1236 leading 1 bits (assuming twos complement). */
1237 if ((bfd_signed_vma
) relocation
>= 0)
1238 signed_check
= check
;
1240 signed_check
= check
| ~((bfd_vma
) -1 >> howto
->rightshift
);
1242 add
= ((upper_insn
& 0x7ff) << 12) | ((lower_insn
& 0x7ff) << 1);
1244 signed_add
= (add
^ 0x400000) - 0x400000;
1246 /* Add the value from the object file. */
1247 signed_check
+= signed_add
;
1248 relocation
+= signed_add
;
1250 /* Assumes two's complement. */
1251 if (signed_check
> reloc_signed_max
1252 || signed_check
< reloc_signed_min
)
1255 /* Put RELOCATION back into the insn. */
1256 upper_insn
= (upper_insn
& ~(bfd_vma
) 0x7ff) | ((relocation
>> 12) & 0x7ff);
1257 lower_insn
= (lower_insn
& ~(bfd_vma
) 0x7ff) | ((relocation
>> 1) & 0x7ff);
1259 /* Put the relocated value back in the object file: */
1260 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
1261 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
1263 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
1267 case R_ARM_GNU_VTINHERIT
:
1268 case R_ARM_GNU_VTENTRY
:
1269 return bfd_reloc_ok
;
1272 return bfd_reloc_notsupported
;
1274 case R_ARM_GLOB_DAT
:
1275 return bfd_reloc_notsupported
;
1277 case R_ARM_JUMP_SLOT
:
1278 return bfd_reloc_notsupported
;
1280 case R_ARM_RELATIVE
:
1281 return bfd_reloc_notsupported
;
1284 /* Relocation is relative to the start of the
1285 global offset table. */
1287 BFD_ASSERT (sgot
!= NULL
);
1289 return bfd_reloc_notsupported
;
1291 /* Note that sgot->output_offset is not involved in this
1292 calculation. We always want the start of .got. If we
1293 define _GLOBAL_OFFSET_TABLE in a different way, as is
1294 permitted by the ABI, we might have to change this
1297 value
-= sgot
->output_section
->vma
;
1298 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1299 contents
, rel
->r_offset
, value
,
1303 /* Use global offset table as symbol value. */
1305 BFD_ASSERT (sgot
!= NULL
);
1308 return bfd_reloc_notsupported
;
1310 value
= sgot
->output_section
->vma
;
1311 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1312 contents
, rel
->r_offset
, value
,
1316 /* Relocation is to the entry for this symbol in the
1317 global offset table. */
1319 return bfd_reloc_notsupported
;
1325 off
= h
->got
.offset
;
1326 BFD_ASSERT (off
!= (bfd_vma
) -1);
1328 if (!elf_hash_table (info
)->dynamic_sections_created
||
1329 (info
->shared
&& (info
->symbolic
|| h
->dynindx
== -1)
1330 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)))
1332 /* This is actually a static link, or it is a -Bsymbolic link
1333 and the symbol is defined locally. We must initialize this
1334 entry in the global offset table. Since the offset must
1335 always be a multiple of 4, we use the least significant bit
1336 to record whether we have initialized it already.
1338 When doing a dynamic link, we create a .rel.got relocation
1339 entry to initialize the value. This is done in the
1340 finish_dynamic_symbol routine. */
1346 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
1351 value
= sgot
->output_offset
+ off
;
1357 BFD_ASSERT (local_got_offsets
!= NULL
&&
1358 local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
1360 off
= local_got_offsets
[r_symndx
];
1362 /* The offset must always be a multiple of 4. We use the
1363 least significant bit to record whether we have already
1364 generated the necessary reloc. */
1369 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
1374 Elf_Internal_Rel outrel
;
1376 srelgot
= bfd_get_section_by_name (dynobj
, ".rel.got");
1377 BFD_ASSERT (srelgot
!= NULL
);
1379 outrel
.r_offset
= (sgot
->output_section
->vma
1380 + sgot
->output_offset
1382 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
1383 bfd_elf32_swap_reloc_out (output_bfd
, &outrel
,
1384 (((Elf32_External_Rel
*)
1386 + srelgot
->reloc_count
));
1387 ++srelgot
->reloc_count
;
1390 local_got_offsets
[r_symndx
] |= 1;
1393 value
= sgot
->output_offset
+ off
;
1396 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1397 contents
, rel
->r_offset
, value
,
1401 /* Relocation is to the entry for this symbol in the
1402 procedure linkage table. */
1404 /* Resolve a PLT32 reloc against a local symbol directly,
1405 without using the procedure linkage table. */
1407 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1408 contents
, rel
->r_offset
, value
,
1411 if (h
->plt
.offset
== (bfd_vma
) -1)
1412 /* We didn't make a PLT entry for this symbol. This
1413 happens when statically linking PIC code, or when
1414 using -Bsymbolic. */
1415 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1416 contents
, rel
->r_offset
, value
,
1419 BFD_ASSERT(splt
!= NULL
);
1421 return bfd_reloc_notsupported
;
1423 value
= (splt
->output_section
->vma
1424 + splt
->output_offset
1426 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1427 contents
, rel
->r_offset
, value
,
1431 return bfd_reloc_notsupported
;
1433 case R_ARM_AMP_VCALL9
:
1434 return bfd_reloc_notsupported
;
1436 case R_ARM_RSBREL32
:
1437 return bfd_reloc_notsupported
;
1439 case R_ARM_THM_RPC22
:
1440 return bfd_reloc_notsupported
;
1443 return bfd_reloc_notsupported
;
1446 return bfd_reloc_notsupported
;
1449 return bfd_reloc_notsupported
;
1452 return bfd_reloc_notsupported
;
1455 return bfd_reloc_notsupported
;
1460 /* Relocate an ARM ELF section. */
1462 elf32_arm_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
1463 contents
, relocs
, local_syms
, local_sections
)
1465 struct bfd_link_info
* info
;
1467 asection
* input_section
;
1468 bfd_byte
* contents
;
1469 Elf_Internal_Rela
* relocs
;
1470 Elf_Internal_Sym
* local_syms
;
1471 asection
** local_sections
;
1473 Elf_Internal_Shdr
* symtab_hdr
;
1474 struct elf_link_hash_entry
** sym_hashes
;
1475 Elf_Internal_Rela
* rel
;
1476 Elf_Internal_Rela
* relend
;
1479 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1480 sym_hashes
= elf_sym_hashes (input_bfd
);
1483 relend
= relocs
+ input_section
->reloc_count
;
1484 for (; rel
< relend
; rel
++)
1487 reloc_howto_type
* howto
;
1488 unsigned long r_symndx
;
1489 Elf_Internal_Sym
* sym
;
1491 struct elf_link_hash_entry
* h
;
1493 bfd_reloc_status_type r
;
1495 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1496 r_type
= ELF32_R_TYPE (rel
->r_info
);
1498 if (r_type
== R_ARM_GNU_VTENTRY
1499 || r_type
== R_ARM_GNU_VTINHERIT
)
1502 /* ScottB: range check r_type here. */
1504 howto
= elf32_arm_howto_table
+ r_type
;
1506 if (info
->relocateable
)
1508 /* This is a relocateable link. We don't have to change
1509 anything, unless the reloc is against a section symbol,
1510 in which case we have to adjust according to where the
1511 section symbol winds up in the output section. */
1512 if (r_symndx
< symtab_hdr
->sh_info
)
1514 sym
= local_syms
+ r_symndx
;
1515 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
1517 sec
= local_sections
[r_symndx
];
1521 val
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
1522 val
+= (sec
->output_offset
+ sym
->st_value
) >> howto
->rightshift
;
1523 bfd_put_32 (input_bfd
, val
, contents
+ rel
->r_offset
);
1526 rel
->r_addend
+= (sec
->output_offset
+ sym
->st_value
)
1527 >> howto
->rightshift
;
1535 /* This is a final link. */
1539 if (r_symndx
< symtab_hdr
->sh_info
)
1541 sym
= local_syms
+ r_symndx
;
1542 sec
= local_sections
[r_symndx
];
1543 relocation
= (sec
->output_section
->vma
1544 + sec
->output_offset
1549 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1550 while (h
->root
.type
== bfd_link_hash_indirect
1551 || h
->root
.type
== bfd_link_hash_warning
)
1552 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1553 if (h
->root
.type
== bfd_link_hash_defined
1554 || h
->root
.type
== bfd_link_hash_defweak
)
1556 sec
= h
->root
.u
.def
.section
;
1558 relocation
= (h
->root
.u
.def
.value
1559 + sec
->output_section
->vma
1560 + sec
->output_offset
);
1562 /* In these cases, we don't need the relocation value.
1563 We check specially because in some obscure cases
1564 sec->output_section will be NULL. */
1571 (!info
->symbolic
&& h
->dynindx
!= -1)
1572 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0
1574 && ((input_section
->flags
& SEC_ALLOC
) != 0)
1584 if (elf_hash_table(info
)->dynamic_sections_created
1586 || (!info
->symbolic
&& h
->dynindx
!= -1)
1587 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0
1594 if (h
->plt
.offset
!= (bfd_vma
)-1)
1599 if (sec
->output_section
== NULL
)
1601 (*_bfd_error_handler
)
1602 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1603 bfd_get_filename (input_bfd
), h
->root
.root
.string
,
1604 bfd_get_section_name (input_bfd
, input_section
));
1609 else if (h
->root
.type
== bfd_link_hash_undefweak
)
1613 if (!((*info
->callbacks
->undefined_symbol
)
1614 (info
, h
->root
.root
.string
, input_bfd
,
1615 input_section
, rel
->r_offset
)))
1622 name
= h
->root
.root
.string
;
1625 name
= (bfd_elf_string_from_elf_section
1626 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
1627 if (name
== NULL
|| *name
== '\0')
1628 name
= bfd_section_name (input_bfd
, sec
);
1631 r
= elf32_arm_final_link_relocate (howto
, input_bfd
, output_bfd
,
1632 input_section
, contents
, rel
,
1633 relocation
, info
, sec
, name
,
1634 (h
? ELF_ST_TYPE (h
->type
) :
1635 ELF_ST_TYPE (sym
->st_info
)));
1637 if (r
!= bfd_reloc_ok
)
1639 const char * msg
= (const char *) 0;
1643 case bfd_reloc_overflow
:
1644 if (!((*info
->callbacks
->reloc_overflow
)
1645 (info
, name
, howto
->name
, (bfd_vma
) 0,
1646 input_bfd
, input_section
, rel
->r_offset
)))
1650 case bfd_reloc_undefined
:
1651 if (!((*info
->callbacks
->undefined_symbol
)
1652 (info
, name
, input_bfd
, input_section
,
1657 case bfd_reloc_outofrange
:
1658 msg
= _ ("internal error: out of range error");
1661 case bfd_reloc_notsupported
:
1662 msg
= _ ("internal error: unsupported relocation error");
1665 case bfd_reloc_dangerous
:
1666 msg
= _ ("internal error: dangerous error");
1670 msg
= _ ("internal error: unknown error");
1674 if (!((*info
->callbacks
->warning
)
1675 (info
, msg
, name
, input_bfd
, input_section
,
1686 /* Function to keep ARM specific flags in the ELF header. */
1688 elf32_arm_set_private_flags (abfd
, flags
)
1692 if (elf_flags_init (abfd
)
1693 && elf_elfheader (abfd
)->e_flags
!= flags
)
1695 if (flags
& EF_INTERWORK
)
1696 _bfd_error_handler (_ ("\
1697 Warning: Not setting interwork flag of %s since it has already been specified as non-interworking"),
1698 bfd_get_filename (abfd
));
1700 _bfd_error_handler (_ ("\
1701 Warning: Clearing the interwork flag of %s due to outside request"),
1702 bfd_get_filename (abfd
));
1706 elf_elfheader (abfd
)->e_flags
= flags
;
1707 elf_flags_init (abfd
) = true;
1713 /* Copy backend specific data from one object module to another */
1715 elf32_arm_copy_private_bfd_data (ibfd
, obfd
)
1722 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1723 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1726 in_flags
= elf_elfheader (ibfd
)->e_flags
;
1727 out_flags
= elf_elfheader (obfd
)->e_flags
;
1729 if (elf_flags_init (obfd
) && in_flags
!= out_flags
)
1731 /* Cannot mix PIC and non-PIC code. */
1732 if ((in_flags
& EF_PIC
) != (out_flags
& EF_PIC
))
1735 /* Cannot mix APCS26 and APCS32 code. */
1736 if ((in_flags
& EF_APCS_26
) != (out_flags
& EF_APCS_26
))
1739 /* Cannot mix float APCS and non-float APCS code. */
1740 if ((in_flags
& EF_APCS_FLOAT
) != (out_flags
& EF_APCS_FLOAT
))
1743 /* If the src and dest have different interworking flags
1744 then turn off the interworking bit. */
1745 if ((in_flags
& EF_INTERWORK
) != (out_flags
& EF_INTERWORK
))
1747 if (out_flags
& EF_INTERWORK
)
1748 _bfd_error_handler (_ ("\
1749 Warning: Clearing the interwork flag in %s because non-interworking code in %s has been linked with it"),
1750 bfd_get_filename (obfd
), bfd_get_filename (ibfd
));
1752 in_flags
&= ~EF_INTERWORK
;
1756 elf_elfheader (obfd
)->e_flags
= in_flags
;
1757 elf_flags_init (obfd
) = true;
1762 /* Merge backend specific data from an object file to the output
1763 object file when linking. */
1765 elf32_arm_merge_private_bfd_data (ibfd
, obfd
)
1772 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1773 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1776 /* Check if we have the same endianess */
1777 if ( ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
1778 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
1779 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
1781 (*_bfd_error_handler
)
1782 (_("%s: compiled for a %s endian system and target is %s endian"),
1783 bfd_get_filename (ibfd
),
1784 bfd_big_endian (ibfd
) ? "big" : "little",
1785 bfd_big_endian (obfd
) ? "big" : "little");
1787 bfd_set_error (bfd_error_wrong_format
);
1791 /* The input BFD must have had its flags initialised. */
1792 /* The following seems bogus to me -- The flags are initialized in
1793 the assembler but I don't think an elf_flags_init field is
1794 written into the object */
1795 /* BFD_ASSERT (elf_flags_init (ibfd)); */
1797 in_flags
= elf_elfheader (ibfd
)->e_flags
;
1798 out_flags
= elf_elfheader (obfd
)->e_flags
;
1800 if (!elf_flags_init (obfd
))
1802 /* If the input is the default architecture then do not
1803 bother setting the flags for the output architecture,
1804 instead allow future merges to do this. If no future
1805 merges ever set these flags then they will retain their
1806 unitialised values, which surprise surprise, correspond
1807 to the default values. */
1808 if (bfd_get_arch_info (ibfd
)->the_default
)
1811 elf_flags_init (obfd
) = true;
1812 elf_elfheader (obfd
)->e_flags
= in_flags
;
1814 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
1815 && bfd_get_arch_info (obfd
)->the_default
)
1816 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
), bfd_get_mach (ibfd
));
1821 /* Check flag compatibility. */
1822 if (in_flags
== out_flags
)
1825 /* Complain about various flag mismatches. */
1827 if ((in_flags
& EF_APCS_26
) != (out_flags
& EF_APCS_26
))
1828 _bfd_error_handler (_ ("\
1829 Error: %s compiled for APCS-%d, whereas %s is compiled for APCS-%d"),
1830 bfd_get_filename (ibfd
),
1831 in_flags
& EF_APCS_26
? 26 : 32,
1832 bfd_get_filename (obfd
),
1833 out_flags
& EF_APCS_26
? 26 : 32);
1835 if ((in_flags
& EF_APCS_FLOAT
) != (out_flags
& EF_APCS_FLOAT
))
1836 _bfd_error_handler (_ ("\
1837 Error: %s passes floats in %s registers, whereas %s passes them in %s registers"),
1838 bfd_get_filename (ibfd
),
1839 in_flags
& EF_APCS_FLOAT
? _ ("float") : _ ("integer"),
1840 bfd_get_filename (obfd
),
1841 out_flags
& EF_APCS_26
? _ ("float") : _ ("integer"));
1843 if ((in_flags
& EF_PIC
) != (out_flags
& EF_PIC
))
1844 _bfd_error_handler (_ ("\
1845 Error: %s is compiled as position %s code, whereas %s is not"),
1846 bfd_get_filename (ibfd
),
1847 in_flags
& EF_PIC
? _ ("independent") : _ ("dependent"),
1848 bfd_get_filename (obfd
));
1850 /* Interworking mismatch is only a warning. */
1851 if ((in_flags
& EF_INTERWORK
) != (out_flags
& EF_INTERWORK
))
1853 _bfd_error_handler (_ ("\
1854 Warning: %s %s interworking, whereas %s %s"),
1855 bfd_get_filename (ibfd
),
1856 in_flags
& EF_INTERWORK
? _ ("supports") : _ ("does not support"),
1857 bfd_get_filename (obfd
),
1858 out_flags
& EF_INTERWORK
? _ ("does not") : _ ("does"));
1865 /* Display the flags field */
1867 elf32_arm_print_private_bfd_data (abfd
, ptr
)
1871 FILE *file
= (FILE *) ptr
;
1873 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
1875 /* Print normal ELF private data. */
1876 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
1878 /* Ignore init flag - it may not be set, despite the flags field containing valid data. */
1880 /* xgettext:c-format */
1881 fprintf (file
, _ ("private flags = %lx:"), elf_elfheader (abfd
)->e_flags
);
1883 if (elf_elfheader (abfd
)->e_flags
& EF_INTERWORK
)
1884 fprintf (file
, _ (" [interworking enabled]"));
1886 fprintf (file
, _ (" [interworking not enabled]"));
1888 if (elf_elfheader (abfd
)->e_flags
& EF_APCS_26
)
1889 fprintf (file
, _ (" [APCS-26]"));
1891 fprintf (file
, _ (" [APCS-32]"));
1893 if (elf_elfheader (abfd
)->e_flags
& EF_APCS_FLOAT
)
1894 fprintf (file
, _ (" [floats passed in float registers]"));
1896 fprintf (file
, _ (" [floats passed in integer registers]"));
1898 if (elf_elfheader (abfd
)->e_flags
& EF_PIC
)
1899 fprintf (file
, _ (" [position independent]"));
1901 fprintf (file
, _ (" [absolute position]"));
1909 elf32_arm_get_symbol_type (elf_sym
, type
)
1910 Elf_Internal_Sym
* elf_sym
;
1913 if (ELF_ST_TYPE (elf_sym
->st_info
) == STT_ARM_TFUNC
)
1914 return ELF_ST_TYPE (elf_sym
->st_info
);
1920 elf32_arm_gc_mark_hook (abfd
, info
, rel
, h
, sym
)
1922 struct bfd_link_info
*info
;
1923 Elf_Internal_Rela
*rel
;
1924 struct elf_link_hash_entry
*h
;
1925 Elf_Internal_Sym
*sym
;
1929 switch (ELF32_R_TYPE (rel
->r_info
))
1931 case R_ARM_GNU_VTINHERIT
:
1932 case R_ARM_GNU_VTENTRY
:
1936 switch (h
->root
.type
)
1938 case bfd_link_hash_defined
:
1939 case bfd_link_hash_defweak
:
1940 return h
->root
.u
.def
.section
;
1942 case bfd_link_hash_common
:
1943 return h
->root
.u
.c
.p
->section
;
1949 if (!(elf_bad_symtab (abfd
)
1950 && ELF_ST_BIND (sym
->st_info
) != STB_LOCAL
)
1951 && ! ((sym
->st_shndx
<= 0 || sym
->st_shndx
>= SHN_LORESERVE
)
1952 && sym
->st_shndx
!= SHN_COMMON
))
1954 return bfd_section_from_elf_index (abfd
, sym
->st_shndx
);
1961 elf32_arm_gc_sweep_hook (abfd
, info
, sec
, relocs
)
1963 struct bfd_link_info
*info
;
1965 const Elf_Internal_Rela
*relocs
;
1967 /* we don't use got and plt entries for armelf */
1971 /* Look through the relocs for a section during the first phase.
1972 Since we don't do .gots or .plts, we just need to consider the
1973 virtual table relocs for gc. */
1976 elf32_arm_check_relocs (abfd
, info
, sec
, relocs
)
1978 struct bfd_link_info
* info
;
1980 const Elf_Internal_Rela
* relocs
;
1982 Elf_Internal_Shdr
* symtab_hdr
;
1983 struct elf_link_hash_entry
** sym_hashes
;
1984 struct elf_link_hash_entry
** sym_hashes_end
;
1985 const Elf_Internal_Rela
* rel
;
1986 const Elf_Internal_Rela
* rel_end
;
1988 asection
* sgot
, *srelgot
, *sreloc
;
1989 bfd_vma
* local_got_offsets
;
1991 if (info
->relocateable
)
1994 sgot
= srelgot
= sreloc
= NULL
;
1996 dynobj
= elf_hash_table (info
)->dynobj
;
1997 local_got_offsets
= elf_local_got_offsets (abfd
);
1999 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2000 sym_hashes
= elf_sym_hashes (abfd
);
2001 sym_hashes_end
= sym_hashes
+ symtab_hdr
->sh_size
/sizeof(Elf32_External_Sym
);
2002 if (!elf_bad_symtab (abfd
))
2003 sym_hashes_end
-= symtab_hdr
->sh_info
;
2005 rel_end
= relocs
+ sec
->reloc_count
;
2006 for (rel
= relocs
; rel
< rel_end
; rel
++)
2008 struct elf_link_hash_entry
*h
;
2009 unsigned long r_symndx
;
2011 r_symndx
= ELF32_R_SYM (rel
->r_info
);
2012 if (r_symndx
< symtab_hdr
->sh_info
)
2015 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
2017 /* Some relocs require a global offset table. */
2020 switch (ELF32_R_TYPE (rel
->r_info
))
2025 elf_hash_table (info
)->dynobj
= dynobj
= abfd
;
2026 if (! _bfd_elf_create_got_section (dynobj
, info
))
2035 switch (ELF32_R_TYPE (rel
->r_info
))
2038 /* This symbol requires a global offset table entry. */
2041 sgot
= bfd_get_section_by_name (dynobj
, ".got");
2042 BFD_ASSERT (sgot
!= NULL
);
2045 /* Get the got relocation section if necessary. */
2047 && (h
!= NULL
|| info
->shared
))
2049 srelgot
= bfd_get_section_by_name (dynobj
, ".rel.got");
2051 /* If no got relocation section, make one and initialize. */
2052 if (srelgot
== NULL
)
2054 srelgot
= bfd_make_section (dynobj
, ".rel.got");
2056 || ! bfd_set_section_flags (dynobj
, srelgot
,
2061 | SEC_LINKER_CREATED
2063 || ! bfd_set_section_alignment (dynobj
, srelgot
, 2))
2070 if (h
->got
.offset
!= (bfd_vma
) -1)
2071 /* We have already allocated space in the .got. */
2074 h
->got
.offset
= sgot
->_raw_size
;
2076 /* Make sure this symbol is output as a dynamic symbol. */
2077 if (h
->dynindx
== -1)
2078 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
2081 srelgot
->_raw_size
+= sizeof (Elf32_External_Rel
);
2085 /* This is a global offset table entry for a local
2087 if (local_got_offsets
== NULL
)
2090 register unsigned int i
;
2092 size
= symtab_hdr
->sh_info
* sizeof (bfd_vma
);
2093 local_got_offsets
= (bfd_vma
*) bfd_alloc (abfd
, size
);
2094 if (local_got_offsets
== NULL
)
2096 elf_local_got_offsets (abfd
) = local_got_offsets
;
2097 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++)
2098 local_got_offsets
[i
] = (bfd_vma
) -1;
2101 if (local_got_offsets
[r_symndx
] != (bfd_vma
) -1)
2102 /* We have already allocated space in the .got. */
2105 local_got_offsets
[r_symndx
] = sgot
->_raw_size
;
2108 /* If we are generating a shared object, we need to
2109 output a R_ARM_RELATIVE reloc so that the dynamic
2110 linker can adjust this GOT entry. */
2111 srelgot
->_raw_size
+= sizeof (Elf32_External_Rel
);
2114 sgot
->_raw_size
+= 4;
2118 /* This symbol requires a procedure linkage table entry. We
2119 actually build the entry in adjust_dynamic_symbol,
2120 because this might be a case of linking PIC code which is
2121 never referenced by a dynamic object, in which case we
2122 don't need to generate a procedure linkage table entry
2125 /* If this is a local symbol, we resolve it directly without
2126 creating a procedure linkage table entry. */
2130 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
2136 /* If we are creating a shared library, and this is a reloc
2137 against a global symbol, or a non PC relative reloc
2138 against a local symbol, then we need to copy the reloc
2139 into the shared library. However, if we are linking with
2140 -Bsymbolic, we do not need to copy a reloc against a
2141 global symbol which is defined in an object we are
2142 including in the link (i.e., DEF_REGULAR is set). At
2143 this point we have not seen all the input files, so it is
2144 possible that DEF_REGULAR is not set now but will be set
2145 later (it is never cleared). We account for that
2146 possibility below by storing information in the
2147 pcrel_relocs_copied field of the hash table entry. */
2149 && (ELF32_R_TYPE (rel
->r_info
) != R_ARM_PC24
2151 && (! info
->symbolic
2152 || (h
->elf_link_hash_flags
2153 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
2155 /* When creating a shared object, we must copy these
2156 reloc types into the output file. We create a reloc
2157 section in dynobj and make room for this reloc. */
2162 name
= (bfd_elf_string_from_elf_section
2164 elf_elfheader (abfd
)->e_shstrndx
,
2165 elf_section_data (sec
)->rel_hdr
.sh_name
));
2169 BFD_ASSERT (strncmp (name
, ".rel", 4) == 0
2170 && strcmp (bfd_get_section_name (abfd
, sec
),
2173 sreloc
= bfd_get_section_by_name (dynobj
, name
);
2178 sreloc
= bfd_make_section (dynobj
, name
);
2179 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
2180 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
2181 if ((sec
->flags
& SEC_ALLOC
) != 0)
2182 flags
|= SEC_ALLOC
| SEC_LOAD
;
2184 || ! bfd_set_section_flags (dynobj
, sreloc
, flags
)
2185 || ! bfd_set_section_alignment (dynobj
, sreloc
, 2))
2190 sreloc
->_raw_size
+= sizeof (Elf32_External_Rel
);
2191 /* If we are linking with -Bsymbolic, and this is a
2192 global symbol, we count the number of PC relative
2193 relocations we have entered for this symbol, so that
2194 we can discard them again if the symbol is later
2195 defined by a regular object. Note that this function
2196 is only called if we are using an elf_i386 linker
2197 hash table, which means that h is really a pointer to
2198 an elf_i386_link_hash_entry. */
2199 if (h
!= NULL
&& info
->symbolic
2200 && ELF32_R_TYPE (rel
->r_info
) == R_ARM_PC24
)
2202 struct elf32_arm_link_hash_entry
* eh
;
2203 struct elf32_arm_pcrel_relocs_copied
* p
;
2205 eh
= (struct elf32_arm_link_hash_entry
*) h
;
2207 for (p
= eh
->pcrel_relocs_copied
; p
!= NULL
; p
= p
->next
)
2208 if (p
->section
== sreloc
)
2213 p
= ((struct elf32_arm_pcrel_relocs_copied
*)
2214 bfd_alloc (dynobj
, sizeof * p
));
2218 p
->next
= eh
->pcrel_relocs_copied
;
2219 eh
->pcrel_relocs_copied
= p
;
2220 p
->section
= sreloc
;
2229 /* This relocation describes the C++ object vtable hierarchy.
2230 Reconstruct it for later use during GC. */
2231 case R_ARM_GNU_VTINHERIT
:
2232 if (!_bfd_elf32_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
2236 /* This relocation describes which C++ vtable entries are actually
2237 used. Record for later use during GC. */
2238 case R_ARM_GNU_VTENTRY
:
2239 if (!_bfd_elf32_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
2249 /* Find the nearest line to a particular section and offset, for error
2250 reporting. This code is a duplicate of the code in elf.c, except
2251 that it also accepts STT_ARM_TFUNC as a symbol that names a function. */
2254 elf32_arm_find_nearest_line
2255 (abfd
, section
, symbols
, offset
, filename_ptr
, functionname_ptr
, line_ptr
)
2260 CONST
char ** filename_ptr
;
2261 CONST
char ** functionname_ptr
;
2262 unsigned int * line_ptr
;
2265 const char * filename
;
2270 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
2271 filename_ptr
, functionname_ptr
,
2275 if (! _bfd_stab_section_find_nearest_line (abfd
, symbols
, section
, offset
,
2276 &found
, filename_ptr
,
2277 functionname_ptr
, line_ptr
,
2278 &elf_tdata (abfd
)->line_info
))
2284 if (symbols
== NULL
)
2291 for (p
= symbols
; *p
!= NULL
; p
++)
2295 q
= (elf_symbol_type
*) *p
;
2297 if (bfd_get_section (&q
->symbol
) != section
)
2300 switch (ELF_ST_TYPE (q
->internal_elf_sym
.st_info
))
2305 filename
= bfd_asymbol_name (&q
->symbol
);
2310 if (q
->symbol
.section
== section
2311 && q
->symbol
.value
>= low_func
2312 && q
->symbol
.value
<= offset
)
2314 func
= (asymbol
*) q
;
2315 low_func
= q
->symbol
.value
;
2324 *filename_ptr
= filename
;
2325 *functionname_ptr
= bfd_asymbol_name (func
);
2331 /* Adjust a symbol defined by a dynamic object and referenced by a
2332 regular object. The current definition is in some section of the
2333 dynamic object, but we're not including those sections. We have to
2334 change the definition to something the rest of the link can
2338 elf32_arm_adjust_dynamic_symbol (info
, h
)
2339 struct bfd_link_info
* info
;
2340 struct elf_link_hash_entry
* h
;
2344 unsigned int power_of_two
;
2346 dynobj
= elf_hash_table (info
)->dynobj
;
2348 /* Make sure we know what is going on here. */
2349 BFD_ASSERT (dynobj
!= NULL
2350 && ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
)
2351 || h
->weakdef
!= NULL
2352 || ((h
->elf_link_hash_flags
2353 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0
2354 && (h
->elf_link_hash_flags
2355 & ELF_LINK_HASH_REF_REGULAR
) != 0
2356 && (h
->elf_link_hash_flags
2357 & ELF_LINK_HASH_DEF_REGULAR
) == 0)));
2359 /* If this is a function, put it in the procedure linkage table. We
2360 will fill in the contents of the procedure linkage table later,
2361 when we know the address of the .got section. */
2362 if (h
->type
== STT_FUNC
2363 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
2366 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) == 0
2367 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) == 0)
2369 /* This case can occur if we saw a PLT32 reloc in an input
2370 file, but the symbol was never referred to by a dynamic
2371 object. In such a case, we don't actually need to build
2372 a procedure linkage table, and we can just do a PC32
2374 BFD_ASSERT ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0);
2378 /* Make sure this symbol is output as a dynamic symbol. */
2379 if (h
->dynindx
== -1)
2381 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
2385 s
= bfd_get_section_by_name (dynobj
, ".plt");
2386 BFD_ASSERT (s
!= NULL
);
2388 /* If this is the first .plt entry, make room for the special
2390 if (s
->_raw_size
== 0)
2391 s
->_raw_size
+= PLT_ENTRY_SIZE
;
2393 /* If this symbol is not defined in a regular file, and we are
2394 not generating a shared library, then set the symbol to this
2395 location in the .plt. This is required to make function
2396 pointers compare as equal between the normal executable and
2397 the shared library. */
2399 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
2401 h
->root
.u
.def
.section
= s
;
2402 h
->root
.u
.def
.value
= s
->_raw_size
;
2405 h
->plt
.offset
= s
->_raw_size
;
2407 /* Make room for this entry. */
2408 s
->_raw_size
+= PLT_ENTRY_SIZE
;
2410 /* We also need to make an entry in the .got.plt section, which
2411 will be placed in the .got section by the linker script. */
2413 s
= bfd_get_section_by_name (dynobj
, ".got.plt");
2414 BFD_ASSERT (s
!= NULL
);
2417 /* We also need to make an entry in the .rel.plt section. */
2419 s
= bfd_get_section_by_name (dynobj
, ".rel.plt");
2420 BFD_ASSERT (s
!= NULL
);
2421 s
->_raw_size
+= sizeof (Elf32_External_Rel
);
2426 /* If this is a weak symbol, and there is a real definition, the
2427 processor independent code will have arranged for us to see the
2428 real definition first, and we can just use the same value. */
2429 if (h
->weakdef
!= NULL
)
2431 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
2432 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
2433 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
2434 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
2438 /* This is a reference to a symbol defined by a dynamic object which
2439 is not a function. */
2441 /* If we are creating a shared library, we must presume that the
2442 only references to the symbol are via the global offset table.
2443 For such cases we need not do anything here; the relocations will
2444 be handled correctly by relocate_section. */
2448 /* We must allocate the symbol in our .dynbss section, which will
2449 become part of the .bss section of the executable. There will be
2450 an entry for this symbol in the .dynsym section. The dynamic
2451 object will contain position independent code, so all references
2452 from the dynamic object to this symbol will go through the global
2453 offset table. The dynamic linker will use the .dynsym entry to
2454 determine the address it must put in the global offset table, so
2455 both the dynamic object and the regular object will refer to the
2456 same memory location for the variable. */
2458 s
= bfd_get_section_by_name (dynobj
, ".dynbss");
2459 BFD_ASSERT (s
!= NULL
);
2461 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
2462 copy the initial value out of the dynamic object and into the
2463 runtime process image. We need to remember the offset into the
2464 .rel.bss section we are going to use. */
2465 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
2469 srel
= bfd_get_section_by_name (dynobj
, ".rel.bss");
2470 BFD_ASSERT (srel
!= NULL
);
2471 srel
->_raw_size
+= sizeof (Elf32_External_Rel
);
2472 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
2475 /* We need to figure out the alignment required for this symbol. I
2476 have no idea how ELF linkers handle this. */
2477 power_of_two
= bfd_log2 (h
->size
);
2478 if (power_of_two
> 3)
2481 /* Apply the required alignment. */
2482 s
->_raw_size
= BFD_ALIGN (s
->_raw_size
,
2483 (bfd_size_type
) (1 << power_of_two
));
2484 if (power_of_two
> bfd_get_section_alignment (dynobj
, s
))
2486 if (! bfd_set_section_alignment (dynobj
, s
, power_of_two
))
2490 /* Define the symbol as being at this point in the section. */
2491 h
->root
.u
.def
.section
= s
;
2492 h
->root
.u
.def
.value
= s
->_raw_size
;
2494 /* Increment the section size to make room for the symbol. */
2495 s
->_raw_size
+= h
->size
;
2500 /* Set the sizes of the dynamic sections. */
2503 elf32_arm_size_dynamic_sections (output_bfd
, info
)
2505 struct bfd_link_info
* info
;
2513 dynobj
= elf_hash_table (info
)->dynobj
;
2514 BFD_ASSERT (dynobj
!= NULL
);
2516 if (elf_hash_table (info
)->dynamic_sections_created
)
2518 /* Set the contents of the .interp section to the interpreter. */
2521 s
= bfd_get_section_by_name (dynobj
, ".interp");
2522 BFD_ASSERT (s
!= NULL
);
2523 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
2524 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
2529 /* We may have created entries in the .rel.got section.
2530 However, if we are not creating the dynamic sections, we will
2531 not actually use these entries. Reset the size of .rel.got,
2532 which will cause it to get stripped from the output file
2534 s
= bfd_get_section_by_name (dynobj
, ".rel.got");
2539 /* If this is a -Bsymbolic shared link, then we need to discard all
2540 PC relative relocs against symbols defined in a regular object.
2541 We allocated space for them in the check_relocs routine, but we
2542 will not fill them in in the relocate_section routine. */
2543 if (info
->shared
&& info
->symbolic
)
2544 elf32_arm_link_hash_traverse (elf32_arm_hash_table (info
),
2545 elf32_arm_discard_copies
,
2548 /* The check_relocs and adjust_dynamic_symbol entry points have
2549 determined the sizes of the various dynamic sections. Allocate
2554 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
2559 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
2562 /* It's OK to base decisions on the section name, because none
2563 of the dynobj section names depend upon the input files. */
2564 name
= bfd_get_section_name (dynobj
, s
);
2568 if (strcmp (name
, ".plt") == 0)
2570 if (s
->_raw_size
== 0)
2572 /* Strip this section if we don't need it; see the
2578 /* Remember whether there is a PLT. */
2582 else if (strncmp (name
, ".rel", 4) == 0)
2584 if (s
->_raw_size
== 0)
2586 /* If we don't need this section, strip it from the
2587 output file. This is mostly to handle .rel.bss and
2588 .rel.plt. We must create both sections in
2589 create_dynamic_sections, because they must be created
2590 before the linker maps input sections to output
2591 sections. The linker does that before
2592 adjust_dynamic_symbol is called, and it is that
2593 function which decides whether anything needs to go
2594 into these sections. */
2601 /* Remember whether there are any reloc sections other
2603 if (strcmp (name
, ".rel.plt") != 0)
2605 const char *outname
;
2609 /* If this relocation section applies to a read only
2610 section, then we probably need a DT_TEXTREL
2611 entry. The entries in the .rel.plt section
2612 really apply to the .got section, which we
2613 created ourselves and so know is not readonly. */
2614 outname
= bfd_get_section_name (output_bfd
,
2616 target
= bfd_get_section_by_name (output_bfd
, outname
+ 4);
2618 && (target
->flags
& SEC_READONLY
) != 0
2619 && (target
->flags
& SEC_ALLOC
) != 0)
2623 /* We use the reloc_count field as a counter if we need
2624 to copy relocs into the output file. */
2628 else if (strncmp (name
, ".got", 4) != 0)
2630 /* It's not one of our sections, so don't allocate space. */
2638 for (spp
= &s
->output_section
->owner
->sections
;
2639 *spp
!= s
->output_section
;
2640 spp
= &(*spp
)->next
)
2642 *spp
= s
->output_section
->next
;
2643 --s
->output_section
->owner
->section_count
;
2648 /* Allocate memory for the section contents. */
2649 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->_raw_size
);
2650 if (s
->contents
== NULL
&& s
->_raw_size
!= 0)
2654 if (elf_hash_table (info
)->dynamic_sections_created
)
2656 /* Add some entries to the .dynamic section. We fill in the
2657 values later, in elf32_arm_finish_dynamic_sections, but we
2658 must add the entries now so that we get the correct size for
2659 the .dynamic section. The DT_DEBUG entry is filled in by the
2660 dynamic linker and used by the debugger. */
2663 if (! bfd_elf32_add_dynamic_entry (info
, DT_DEBUG
, 0))
2669 if (! bfd_elf32_add_dynamic_entry (info
, DT_PLTGOT
, 0)
2670 || ! bfd_elf32_add_dynamic_entry (info
, DT_PLTRELSZ
, 0)
2671 || ! bfd_elf32_add_dynamic_entry (info
, DT_PLTREL
, DT_REL
)
2672 || ! bfd_elf32_add_dynamic_entry (info
, DT_JMPREL
, 0))
2678 if (! bfd_elf32_add_dynamic_entry (info
, DT_REL
, 0)
2679 || ! bfd_elf32_add_dynamic_entry (info
, DT_RELSZ
, 0)
2680 || ! bfd_elf32_add_dynamic_entry (info
, DT_RELENT
,
2681 sizeof (Elf32_External_Rel
)))
2687 if (! bfd_elf32_add_dynamic_entry (info
, DT_TEXTREL
, 0))
2695 /* This function is called via elf32_arm_link_hash_traverse if we are
2696 creating a shared object with -Bsymbolic. It discards the space
2697 allocated to copy PC relative relocs against symbols which are
2698 defined in regular objects. We allocated space for them in the
2699 check_relocs routine, but we won't fill them in in the
2700 relocate_section routine. */
2703 elf32_arm_discard_copies (h
, ignore
)
2704 struct elf32_arm_link_hash_entry
* h
;
2707 struct elf32_arm_pcrel_relocs_copied
* s
;
2709 /* We only discard relocs for symbols defined in a regular object. */
2710 if ((h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
2713 for (s
= h
->pcrel_relocs_copied
; s
!= NULL
; s
= s
->next
)
2714 s
->section
->_raw_size
-= s
->count
* sizeof (Elf32_External_Rel
);
2719 /* Finish up dynamic symbol handling. We set the contents of various
2720 dynamic sections here. */
2723 elf32_arm_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
2725 struct bfd_link_info
* info
;
2726 struct elf_link_hash_entry
* h
;
2727 Elf_Internal_Sym
* sym
;
2731 dynobj
= elf_hash_table (info
)->dynobj
;
2733 if (h
->plt
.offset
!= (bfd_vma
) -1)
2740 Elf_Internal_Rel rel
;
2742 /* This symbol has an entry in the procedure linkage table. Set
2745 BFD_ASSERT (h
->dynindx
!= -1);
2747 splt
= bfd_get_section_by_name (dynobj
, ".plt");
2748 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
2749 srel
= bfd_get_section_by_name (dynobj
, ".rel.plt");
2750 BFD_ASSERT (splt
!= NULL
&& sgot
!= NULL
&& srel
!= NULL
);
2752 /* Get the index in the procedure linkage table which
2753 corresponds to this symbol. This is the index of this symbol
2754 in all the symbols for which we are making plt entries. The
2755 first entry in the procedure linkage table is reserved. */
2756 plt_index
= h
->plt
.offset
/ PLT_ENTRY_SIZE
- 1;
2758 /* Get the offset into the .got table of the entry that
2759 corresponds to this function. Each .got entry is 4 bytes.
2760 The first three are reserved. */
2761 got_offset
= (plt_index
+ 3) * 4;
2763 /* Fill in the entry in the procedure linkage table. */
2764 memcpy (splt
->contents
+ h
->plt
.offset
,
2765 elf32_arm_plt_entry
,
2767 bfd_put_32 (output_bfd
,
2768 (sgot
->output_section
->vma
2769 + sgot
->output_offset
2771 - splt
->output_section
->vma
2772 - splt
->output_offset
2773 - h
->plt
.offset
- 12),
2774 splt
->contents
+ h
->plt
.offset
+ 12);
2776 /* Fill in the entry in the global offset table. */
2777 bfd_put_32 (output_bfd
,
2778 (splt
->output_section
->vma
2779 + splt
->output_offset
),
2780 sgot
->contents
+ got_offset
);
2782 /* Fill in the entry in the .rel.plt section. */
2783 rel
.r_offset
= (sgot
->output_section
->vma
2784 + sgot
->output_offset
2786 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_JUMP_SLOT
);
2787 bfd_elf32_swap_reloc_out (output_bfd
, &rel
,
2788 ((Elf32_External_Rel
*) srel
->contents
2791 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
2793 /* Mark the symbol as undefined, rather than as defined in
2794 the .plt section. Leave the value alone. */
2795 sym
->st_shndx
= SHN_UNDEF
;
2799 if (h
->got
.offset
!= (bfd_vma
) -1)
2803 Elf_Internal_Rel rel
;
2805 /* This symbol has an entry in the global offset table. Set it
2808 sgot
= bfd_get_section_by_name (dynobj
, ".got");
2809 srel
= bfd_get_section_by_name (dynobj
, ".rel.got");
2810 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
2812 rel
.r_offset
= (sgot
->output_section
->vma
2813 + sgot
->output_offset
2814 + (h
->got
.offset
&~ 1));
2816 /* If this is a -Bsymbolic link, and the symbol is defined
2817 locally, we just want to emit a RELATIVE reloc. The entry in
2818 the global offset table will already have been initialized in
2819 the relocate_section function. */
2821 && (info
->symbolic
|| h
->dynindx
== -1)
2822 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
2823 rel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
2826 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ h
->got
.offset
);
2827 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_GLOB_DAT
);
2830 bfd_elf32_swap_reloc_out (output_bfd
, &rel
,
2831 ((Elf32_External_Rel
*) srel
->contents
2832 + srel
->reloc_count
));
2833 ++srel
->reloc_count
;
2836 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
2839 Elf_Internal_Rel rel
;
2841 /* This symbol needs a copy reloc. Set it up. */
2843 BFD_ASSERT (h
->dynindx
!= -1
2844 && (h
->root
.type
== bfd_link_hash_defined
2845 || h
->root
.type
== bfd_link_hash_defweak
));
2847 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
2849 BFD_ASSERT (s
!= NULL
);
2851 rel
.r_offset
= (h
->root
.u
.def
.value
2852 + h
->root
.u
.def
.section
->output_section
->vma
2853 + h
->root
.u
.def
.section
->output_offset
);
2854 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_COPY
);
2855 bfd_elf32_swap_reloc_out (output_bfd
, &rel
,
2856 ((Elf32_External_Rel
*) s
->contents
2861 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2862 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
2863 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
2864 sym
->st_shndx
= SHN_ABS
;
2869 /* Finish up the dynamic sections. */
2872 elf32_arm_finish_dynamic_sections (output_bfd
, info
)
2874 struct bfd_link_info
* info
;
2880 dynobj
= elf_hash_table (info
)->dynobj
;
2882 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
2883 BFD_ASSERT (sgot
!= NULL
);
2884 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
2886 if (elf_hash_table (info
)->dynamic_sections_created
)
2889 Elf32_External_Dyn
*dyncon
, *dynconend
;
2891 splt
= bfd_get_section_by_name (dynobj
, ".plt");
2892 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
2894 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
2895 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
2896 for (; dyncon
< dynconend
; dyncon
++)
2898 Elf_Internal_Dyn dyn
;
2902 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
2915 s
= bfd_get_section_by_name (output_bfd
, name
);
2916 BFD_ASSERT (s
!= NULL
);
2917 dyn
.d_un
.d_ptr
= s
->vma
;
2918 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
2922 s
= bfd_get_section_by_name (output_bfd
, ".rel.plt");
2923 BFD_ASSERT (s
!= NULL
);
2924 if (s
->_cooked_size
!= 0)
2925 dyn
.d_un
.d_val
= s
->_cooked_size
;
2927 dyn
.d_un
.d_val
= s
->_raw_size
;
2928 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
2932 /* My reading of the SVR4 ABI indicates that the
2933 procedure linkage table relocs (DT_JMPREL) should be
2934 included in the overall relocs (DT_REL). This is
2935 what Solaris does. However, UnixWare can not handle
2936 that case. Therefore, we override the DT_RELSZ entry
2937 here to make it not include the JMPREL relocs. Since
2938 the linker script arranges for .rel.plt to follow all
2939 other relocation sections, we don't have to worry
2940 about changing the DT_REL entry. */
2941 s
= bfd_get_section_by_name (output_bfd
, ".rel.plt");
2944 if (s
->_cooked_size
!= 0)
2945 dyn
.d_un
.d_val
-= s
->_cooked_size
;
2947 dyn
.d_un
.d_val
-= s
->_raw_size
;
2949 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
2954 /* Fill in the first entry in the procedure linkage table. */
2955 if (splt
->_raw_size
> 0)
2956 memcpy (splt
->contents
, elf32_arm_plt0_entry
, PLT_ENTRY_SIZE
);
2958 /* UnixWare sets the entsize of .plt to 4, although that doesn't
2959 really seem like the right value. */
2960 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
2963 /* Fill in the first three entries in the global offset table. */
2964 if (sgot
->_raw_size
> 0)
2967 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
2969 bfd_put_32 (output_bfd
,
2970 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
2972 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
2973 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
2976 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
2981 #define ELF_ARCH bfd_arch_arm
2982 #define ELF_MACHINE_CODE EM_ARM
2983 #define ELF_MAXPAGE_SIZE 0x8000
2986 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
2987 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
2988 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
2989 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
2990 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
2991 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
2992 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
2994 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
2995 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
2996 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
2997 #define elf_backend_check_relocs elf32_arm_check_relocs
2998 #define elf_backend_relocate_section elf32_arm_relocate_section
2999 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
3000 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
3001 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
3002 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
3003 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
3005 #define elf_backend_can_gc_sections 1
3006 #define elf_backend_plt_readonly 1
3007 #define elf_backend_want_got_plt 1
3008 #define elf_backend_want_plt_sym 0
3010 #include "elf32-target.h"