* elf64-hppa.c: Remove PARAMS macro. Replace PTR with void *. Convert
[binutils.git] / ld / emultempl / armelf.em
blob6c55b37777ebff61196c4e9ccd6669621692b521
1 # This shell script emits a C file. -*- C -*-
2 #   Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 #   2004, 2005, 2007, 2008
4 #   Free Software Foundation, Inc.
6 # This file is part of the GNU Binutils.
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 # MA 02110-1301, USA.
24 # This file is sourced from elf32.em, and defines extra arm-elf
25 # specific routines.
27 test -z "$TARGET2_TYPE" && TARGET2_TYPE="rel"
28 fragment <<EOF
30 #include "ldctor.h"
31 #include "elf/arm.h"
33 static char *thumb_entry_symbol = NULL;
34 static bfd *bfd_for_interwork;
35 static int byteswap_code = 0;
36 static int target1_is_rel = 0${TARGET1_IS_REL};
37 static char *target2_type = "${TARGET2_TYPE}";
38 static int fix_v4bx = 0;
39 static int use_blx = 0;
40 static bfd_arm_vfp11_fix vfp11_denorm_fix = BFD_ARM_VFP11_FIX_DEFAULT;
41 static int no_enum_size_warning = 0;
42 static int no_wchar_size_warning = 0;
43 static int pic_veneer = 0;
45 static void
46 gld${EMULATION_NAME}_before_parse (void)
48 #ifndef TARGET_                 /* I.e., if not generic.  */
49   ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
50 #endif /* not TARGET_ */
51   config.dynamic_link = ${DYNAMIC_LINK-TRUE};
52   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
55 static void
56 arm_elf_after_open (void)
58   {
59     LANG_FOR_EACH_INPUT_STATEMENT (is)
60       {
61         bfd_elf32_arm_add_glue_sections_to_bfd (is->the_bfd, & link_info);
62       }
63   }
65   /* Call the standard elf routine.  */
66   gld${EMULATION_NAME}_after_open ();
69 static void
70 arm_elf_set_bfd_for_interworking (lang_statement_union_type *statement)
72   if (statement->header.type == lang_input_section_enum)
73     {
74       asection *i = statement->input_section.section;
76       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
77           && (i->flags & SEC_EXCLUDE) == 0)
78         {
79           asection *output_section = i->output_section;
81           ASSERT (output_section->owner == link_info.output_bfd);
83           /* Don't attach the interworking stubs to a dynamic object, to
84              an empty section, etc.  */
85           if ((output_section->flags & SEC_HAS_CONTENTS) != 0
86               && (i->flags & SEC_NEVER_LOAD) == 0
87               && ! (i->owner->flags & DYNAMIC))
88             bfd_for_interwork = i->owner;
89         }
90     }
93 static void
94 arm_elf_before_allocation (void)
96   if (link_info.input_bfds != NULL)
97     {
98       /* The interworking bfd must be the last one in the link.  */
99       bfd_for_interwork = NULL;
101       lang_for_each_statement (arm_elf_set_bfd_for_interworking);
103       /* If bfd_for_interwork is NULL, then there are no loadable sections
104          with real contents to be linked, so we are not going to have to
105          create any interworking stubs, so it is OK not to call
106          bfd_elf32_arm_get_bfd_for_interworking.  */
107       if (bfd_for_interwork != NULL)
108         bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info);
109     }
111   bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code);
113   /* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary
114      due to architecture version.  */
115   bfd_elf32_arm_set_vfp11_fix (link_info.output_bfd, &link_info);
117   /* We should be able to set the size of the interworking stub section.  We
118      can't do it until later if we have dynamic sections, though.  */
119   if (! elf_hash_table (&link_info)->dynamic_sections_created)
120     {
121       /* Here we rummage through the found bfds to collect glue information.  */
122       LANG_FOR_EACH_INPUT_STATEMENT (is)
123         {
124           /* Initialise mapping tables for code/data.  */
125           bfd_elf32_arm_init_maps (is->the_bfd);
127           if (!bfd_elf32_arm_process_before_allocation (is->the_bfd,
128                                                         &link_info)
129               || !bfd_elf32_arm_vfp11_erratum_scan (is->the_bfd, &link_info))
130             /* xgettext:c-format */
131             einfo (_("Errors encountered processing file %s"), is->filename);
132         }
133     }
135   /* Call the standard elf routine.  */
136   gld${EMULATION_NAME}_before_allocation ();
138   /* We have seen it all. Allocate it, and carry on.  */
139   bfd_elf32_arm_allocate_interworking_sections (& link_info);
142 static void
143 arm_elf_after_allocation (void)
145   /* Call the standard elf routine.  */
146   after_allocation_default ();
148   {
149     LANG_FOR_EACH_INPUT_STATEMENT (is)
150       {
151         /* Figure out where VFP11 erratum veneers (and the labels returning
152            from same) have been placed.  */
153         bfd_elf32_arm_vfp11_fix_veneer_locations (is->the_bfd, &link_info);
154       }
155   }
158 /* Fake input file for stubs.  */
159 static lang_input_statement_type *stub_file;
161 /* Whether we need to call gldarm_layout_sections_again.  */
162 static int need_laying_out = 0;
164 /* Maximum size of a group of input sections that can be handled by
165    one stub section.  A value of +/-1 indicates the bfd back-end
166    should use a suitable default size.  */
167 static bfd_signed_vma group_size = 1;
169 struct hook_stub_info
171   lang_statement_list_type add;
172   asection *input_section;
175 /* Traverse the linker tree to find the spot where the stub goes.  */
177 static bfd_boolean
178 hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
180   lang_statement_union_type *l;
181   bfd_boolean ret;
183   for (; (l = *lp) != NULL; lp = &l->header.next)
184     {
185       switch (l->header.type)
186         {
187         case lang_constructors_statement_enum:
188           ret = hook_in_stub (info, &constructor_list.head);
189           if (ret)
190             return ret;
191           break;
193         case lang_output_section_statement_enum:
194           ret = hook_in_stub (info,
195                               &l->output_section_statement.children.head);
196           if (ret)
197             return ret;
198           break;
200         case lang_wild_statement_enum:
201           ret = hook_in_stub (info, &l->wild_statement.children.head);
202           if (ret)
203             return ret;
204           break;
206         case lang_group_statement_enum:
207           ret = hook_in_stub (info, &l->group_statement.children.head);
208           if (ret)
209             return ret;
210           break;
212         case lang_input_section_enum:
213           if (l->input_section.section == info->input_section)
214             {
215               /* We've found our section.  Insert the stub immediately
216                  before its associated input section.  */
217               *lp = info->add.head;
218               *(info->add.tail) = l;
219               return TRUE;
220             }
221           break;
223         case lang_data_statement_enum:
224         case lang_reloc_statement_enum:
225         case lang_object_symbols_statement_enum:
226         case lang_output_statement_enum:
227         case lang_target_statement_enum:
228         case lang_input_statement_enum:
229         case lang_assignment_statement_enum:
230         case lang_padding_statement_enum:
231         case lang_address_statement_enum:
232         case lang_fill_statement_enum:
233           break;
235         default:
236           FAIL ();
237           break;
238         }
239     }
240   return FALSE;
244 /* Call-back for elf32_arm_size_stubs.  */
246 /* Create a new stub section, and arrange for it to be linked
247    immediately before INPUT_SECTION.  */
249 static asection *
250 elf32_arm_add_stub_section (const char *stub_sec_name,
251                             asection *input_section)
253   asection *stub_sec;
254   flagword flags;
255   asection *output_section;
256   const char *secname;
257   lang_output_section_statement_type *os;
258   struct hook_stub_info info;
260   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
261            | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
262   stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
263                                                  stub_sec_name, flags);
264   if (stub_sec == NULL)
265     goto err_ret;
267   bfd_set_section_alignment (stub_file->the_bfd, stub_sec, 3);
269   output_section = input_section->output_section;
270   secname = bfd_get_section_name (output_section->owner, output_section);
271   os = lang_output_section_find (secname);
273   info.input_section = input_section;
274   lang_list_init (&info.add);
275   lang_add_section (&info.add, stub_sec, os);
277   if (info.add.head == NULL)
278     goto err_ret;
280   if (hook_in_stub (&info, &os->children.head))
281     return stub_sec;
283  err_ret:
284   einfo ("%X%P: can not make stub section: %E\n");
285   return NULL;
288 /* Another call-back for elf_arm_size_stubs.  */
290 static void
291 gldarm_layout_sections_again (void)
293   /* If we have changed sizes of the stub sections, then we need
294      to recalculate all the section offsets.  This may mean we need to
295      add even more stubs.  */
296   gld${EMULATION_NAME}_map_segments (TRUE);
297   need_laying_out = -1;
300 static void
301 build_section_lists (lang_statement_union_type *statement)
303   if (statement->header.type == lang_input_section_enum)
304     {
305       asection *i = statement->input_section.section;
307       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
308           && (i->flags & SEC_EXCLUDE) == 0
309           && i->output_section != NULL
310           && i->output_section->owner == link_info.output_bfd)
311         elf32_arm_next_input_section (& link_info, i);
312     }
315 static void
316 gld${EMULATION_NAME}_finish (void)
318   struct bfd_link_hash_entry * h;
320   /* bfd_elf32_discard_info just plays with debugging sections,
321      ie. doesn't affect any code, so we can delay resizing the
322      sections.  It's likely we'll resize everything in the process of
323      adding stubs.  */
324   if (bfd_elf_discard_info (link_info.output_bfd, & link_info))
325     need_laying_out = 1;
327   /* If generating a relocatable output file, then we don't
328      have to examine the relocs.  */
329   if (stub_file != NULL && !link_info.relocatable)
330     {
331       int  ret = elf32_arm_setup_section_lists (link_info.output_bfd, & link_info);
333       if (ret != 0)
334         {
335           if (ret < 0)
336             {
337               einfo ("%X%P: could not compute sections lists for stub generation: %E\n");
338               return;
339             }
341           lang_for_each_statement (build_section_lists);
343           /* Call into the BFD backend to do the real work.  */
344           if (! elf32_arm_size_stubs (link_info.output_bfd,
345                                       stub_file->the_bfd,
346                                       & link_info,
347                                       group_size,
348                                       & elf32_arm_add_stub_section,
349                                       & gldarm_layout_sections_again))
350             {
351               einfo ("%X%P: cannot size stub section: %E\n");
352               return;
353             }
354         }
355     }
357   if (need_laying_out != -1)
358     gld${EMULATION_NAME}_map_segments (need_laying_out);
360   if (! link_info.relocatable)
361     {
362       /* Now build the linker stubs.  */
363       if (stub_file->the_bfd->sections != NULL)
364         {
365           if (! elf32_arm_build_stubs (& link_info))
366             einfo ("%X%P: can not build stubs: %E\n");
367         }
368     }
370   finish_default ();
372   if (thumb_entry_symbol)
373     {
374       h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
375                                 FALSE, FALSE, TRUE);
376     }
377   else
378     {
379       struct elf_link_hash_entry * eh;
381       if (!entry_symbol.name)
382         return;
384       h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name,
385                                 FALSE, FALSE, TRUE);
386       eh = (struct elf_link_hash_entry *)h;
387       if (!h || ELF_ST_TYPE(eh->type) != STT_ARM_TFUNC)
388         return;
389     }
392   if (h != (struct bfd_link_hash_entry *) NULL
393       && (h->type == bfd_link_hash_defined
394           || h->type == bfd_link_hash_defweak)
395       && h->u.def.section->output_section != NULL)
396     {
397       static char buffer[32];
398       bfd_vma val;
400       /* Special procesing is required for a Thumb entry symbol.  The
401          bottom bit of its address must be set.  */
402       val = (h->u.def.value
403              + bfd_get_section_vma (link_info.output_bfd,
404                                     h->u.def.section->output_section)
405              + h->u.def.section->output_offset);
407       val |= 1;
409       /* Now convert this value into a string and store it in entry_symbol
410          where the lang_finish() function will pick it up.  */
411       buffer[0] = '0';
412       buffer[1] = 'x';
414       sprintf_vma (buffer + 2, val);
416       if (thumb_entry_symbol != NULL && entry_symbol.name != NULL
417           && entry_from_cmdline)
418         einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
419                thumb_entry_symbol, entry_symbol.name);
420       entry_symbol.name = buffer;
421     }
422   else
423     einfo (_("%P: warning: cannot find thumb start symbol %s\n"),
424            thumb_entry_symbol);
427 /* This is a convenient point to tell BFD about target specific flags.
428    After the output has been created, but before inputs are read.  */
429 static void
430 arm_elf_create_output_section_statements (void)
432   if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL)
433     {
434       /* The arm backend needs special fields in the output hash structure.
435          These will only be created if the output format is an arm format,
436          hence we do not support linking and changing output formats at the
437          same time.  Use a link followed by objcopy to change output formats.  */
438       einfo ("%F%X%P: error: Cannot change output format whilst linking ARM binaries.\n");
439       return;
440     }
442   bfd_elf32_arm_set_target_relocs (link_info.output_bfd, &link_info,
443                                    target1_is_rel,
444                                    target2_type, fix_v4bx, use_blx,
445                                    vfp11_denorm_fix, no_enum_size_warning,
446                                    no_wchar_size_warning,
447                                    pic_veneer);
449   stub_file = lang_add_input_file ("linker stubs",
450                                    lang_input_file_is_fake_enum,
451                                    NULL);
452   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
453   if (stub_file->the_bfd == NULL
454       || ! bfd_set_arch_mach (stub_file->the_bfd,
455                               bfd_get_arch (link_info.output_bfd),
456                               bfd_get_mach (link_info.output_bfd)))
457     {
458       einfo ("%X%P: can not create BFD %E\n");
459       return;
460     }
462   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
463   ldlang_add_file (stub_file);
466 /* Avoid processing the fake stub_file in vercheck, stat_needed and
467    check_needed routines.  */
469 static void (*real_func) (lang_input_statement_type *);
471 static void arm_for_each_input_file_wrapper (lang_input_statement_type *l)
473   if (l != stub_file)
474     (*real_func) (l);
477 static void
478 arm_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
480   real_func = func;
481   lang_for_each_input_file (&arm_for_each_input_file_wrapper);
484 #define lang_for_each_input_file arm_lang_for_each_input_file
488 # Define some shell vars to insert bits of code into the standard elf
489 # parse_args and list_options functions.
491 PARSE_AND_LIST_PROLOGUE='
492 #define OPTION_THUMB_ENTRY              301
493 #define OPTION_BE8                      302
494 #define OPTION_TARGET1_REL              303
495 #define OPTION_TARGET1_ABS              304
496 #define OPTION_TARGET2                  305
497 #define OPTION_FIX_V4BX                 306
498 #define OPTION_USE_BLX                  307
499 #define OPTION_VFP11_DENORM_FIX         308
500 #define OPTION_NO_ENUM_SIZE_WARNING     309
501 #define OPTION_PIC_VENEER               310
502 #define OPTION_FIX_V4BX_INTERWORKING    311
503 #define OPTION_STUBGROUP_SIZE           312
504 #define OPTION_NO_WCHAR_SIZE_WARNING    313
507 PARSE_AND_LIST_SHORTOPTS=p
509 PARSE_AND_LIST_LONGOPTS='
510   { "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
511   { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
512   { "be8", no_argument, NULL, OPTION_BE8},
513   { "target1-rel", no_argument, NULL, OPTION_TARGET1_REL},
514   { "target1-abs", no_argument, NULL, OPTION_TARGET1_ABS},
515   { "target2", required_argument, NULL, OPTION_TARGET2},
516   { "fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
517   { "fix-v4bx-interworking", no_argument, NULL, OPTION_FIX_V4BX_INTERWORKING},
518   { "use-blx", no_argument, NULL, OPTION_USE_BLX},
519   { "vfp11-denorm-fix", required_argument, NULL, OPTION_VFP11_DENORM_FIX},
520   { "no-enum-size-warning", no_argument, NULL, OPTION_NO_ENUM_SIZE_WARNING},
521   { "pic-veneer", no_argument, NULL, OPTION_PIC_VENEER},
522   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
523   { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING},
526 PARSE_AND_LIST_OPTIONS='
527   fprintf (file, _("  --thumb-entry=<sym>         Set the entry point to be Thumb symbol <sym>\n"));
528   fprintf (file, _("  --be8                       Output BE8 format image\n"));
529   fprintf (file, _("  --target1=rel               Interpret R_ARM_TARGET1 as R_ARM_REL32\n"));
530   fprintf (file, _("  --target1=abs               Interpret R_ARM_TARGET1 as R_ARM_ABS32\n"));
531   fprintf (file, _("  --target2=<type>            Specify definition of R_ARM_TARGET2\n"));
532   fprintf (file, _("  --fix-v4bx                  Rewrite BX rn as MOV pc, rn for ARMv4\n"));
533   fprintf (file, _("  --fix-v4bx-interworking     Rewrite BX rn branch to ARMv4 interworking veneer\n"));
534   fprintf (file, _("  --use-blx                   Enable use of BLX instructions\n"));
535   fprintf (file, _("  --vfp11-denorm-fix          Specify how to fix VFP11 denorm erratum\n"));
536   fprintf (file, _("  --no-enum-size-warning      Don'\''t warn about objects with incompatible\n"
537                    "                                enum sizes\n"));
538   fprintf (file, _("  --no-wchar-size-warning     Don'\''t warn about objects with incompatible"
539                    "                                wchar_t sizes\n"));
540   fprintf (file, _("  --pic-veneer                Always generate PIC interworking veneers\n"));
541   fprintf (file, _("\
542    --stub-group-size=N   Maximum size of a group of input sections that can be\n\
543                            handled by one stub section.  A negative value\n\
544                            locates all stubs before their branches (with a\n\
545                            group size of -N), while a positive value allows\n\
546                            two groups of input sections, one before, and one\n\
547                            after each stub section.  Values of +/-1 indicate\n\
548                            the linker should choose suitable defaults.\n"
549                    ));
552 PARSE_AND_LIST_ARGS_CASES='
553     case '\'p\'':
554       /* Only here for backwards compatibility.  */
555       break;
557     case OPTION_THUMB_ENTRY:
558       thumb_entry_symbol = optarg;
559       break;
561     case OPTION_BE8:
562       byteswap_code = 1;
563       break;
565     case OPTION_TARGET1_REL:
566       target1_is_rel = 1;
567       break;
569     case OPTION_TARGET1_ABS:
570       target1_is_rel = 0;
571       break;
573     case OPTION_TARGET2:
574       target2_type = optarg;
575       break;
577     case OPTION_FIX_V4BX:
578       fix_v4bx = 1;
579       break;
581     case OPTION_FIX_V4BX_INTERWORKING:
582       fix_v4bx = 2;
583       break;
585     case OPTION_USE_BLX:
586       use_blx = 1;
587       break;
589     case OPTION_VFP11_DENORM_FIX:
590       if (strcmp (optarg, "none") == 0)
591         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_NONE;
592       else if (strcmp (optarg, "scalar") == 0)
593         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_SCALAR;
594       else if (strcmp (optarg, "vector") == 0)
595         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR;
596       else
597         einfo (_("Unrecognized VFP11 fix type '\''%s'\''.\n"), optarg);
598       break;
600     case OPTION_NO_ENUM_SIZE_WARNING:
601       no_enum_size_warning = 1;
602       break;
604     case OPTION_NO_WCHAR_SIZE_WARNING:
605       no_wchar_size_warning = 1;
606       break;
608     case OPTION_PIC_VENEER:
609       pic_veneer = 1;
610       break;
612     case OPTION_STUBGROUP_SIZE:
613       {
614         const char *end;
616         group_size = bfd_scan_vma (optarg, &end, 0);
617         if (*end)
618           einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
619       }
620       break;
623 # We have our own after_open and before_allocation functions, but they call
624 # the standard routines, so give them a different name.
625 LDEMUL_AFTER_OPEN=arm_elf_after_open
626 LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation
627 LDEMUL_AFTER_ALLOCATION=arm_elf_after_allocation
628 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements
630 # Replace the elf before_parse function with our own.
631 LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
633 # Call the extra arm-elf function
634 LDEMUL_FINISH=gld${EMULATION_NAME}_finish