Fix fallout from splitting ldbuildid.[ch] off elf32.em.
[platform/upstream/binutils.git] / ld / emultempl / armelf.em
1 # This shell script emits a C file. -*- C -*-
2 #   Copyright (C) 1991-2014 Free Software Foundation, Inc.
3 #
4 # This file is part of the GNU Binutils.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 # MA 02110-1301, USA.
20 #
21
22 # This file is sourced from elf32.em, and defines extra arm-elf
23 # specific routines.
24 #
25 test -z "$TARGET2_TYPE" && TARGET2_TYPE="rel"
26 fragment <<EOF
27
28 #include "ldctor.h"
29 #include "elf/arm.h"
30
31 static char * thumb_entry_symbol = NULL;
32 static int byteswap_code = 0;
33 static int target1_is_rel = 0${TARGET1_IS_REL};
34 static char * target2_type = "${TARGET2_TYPE}";
35 static int fix_v4bx = 0;
36 static int use_blx = 0;
37 static bfd_arm_vfp11_fix vfp11_denorm_fix = BFD_ARM_VFP11_FIX_DEFAULT;
38 static int fix_cortex_a8 = -1;
39 static int no_enum_size_warning = 0;
40 static int no_wchar_size_warning = 0;
41 static int pic_veneer = 0;
42 static int merge_exidx_entries = -1;
43 static int fix_arm1176 = 1;
44
45 static void
46 gld${EMULATION_NAME}_before_parse (void)
47 {
48 #ifndef TARGET_                 /* I.e., if not generic.  */
49   ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
50 #endif /* not TARGET_ */
51   input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
52   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
53   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
54 }
55
56 static void
57 arm_elf_before_allocation (void)
58 {
59   bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code);
60
61   /* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary
62      due to architecture version.  */
63   bfd_elf32_arm_set_vfp11_fix (link_info.output_bfd, &link_info);
64
65   /* Auto-select Cortex-A8 erratum fix if it wasn't explicitly specified.  */
66   bfd_elf32_arm_set_cortex_a8_fix (link_info.output_bfd, &link_info);
67
68   /* We should be able to set the size of the interworking stub section.  We
69      can't do it until later if we have dynamic sections, though.  */
70   if (elf_hash_table (&link_info)->dynobj == NULL)
71     {
72       /* Here we rummage through the found bfds to collect glue information.  */
73       LANG_FOR_EACH_INPUT_STATEMENT (is)
74         {
75           /* Initialise mapping tables for code/data.  */
76           bfd_elf32_arm_init_maps (is->the_bfd);
77
78           if (!bfd_elf32_arm_process_before_allocation (is->the_bfd,
79                                                         &link_info)
80               || !bfd_elf32_arm_vfp11_erratum_scan (is->the_bfd, &link_info))
81             /* xgettext:c-format */
82             einfo (_("Errors encountered processing file %s"), is->filename);
83         }
84
85       /* We have seen it all.  Allocate it, and carry on.  */
86       bfd_elf32_arm_allocate_interworking_sections (& link_info);
87     }
88
89   /* Call the standard elf routine.  */
90   gld${EMULATION_NAME}_before_allocation ();
91 }
92
93 /* Fake input file for stubs.  */
94 static lang_input_statement_type *stub_file;
95
96 /* Whether we need to call gldarm_layout_sections_again.  */
97 static int need_laying_out = 0;
98
99 /* Maximum size of a group of input sections that can be handled by
100    one stub section.  A value of +/-1 indicates the bfd back-end
101    should use a suitable default size.  */
102 static bfd_signed_vma group_size = 1;
103
104 struct hook_stub_info
105 {
106   lang_statement_list_type add;
107   asection *input_section;
108 };
109
110 /* Traverse the linker tree to find the spot where the stub goes.  */
111
112 static bfd_boolean
113 hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
114 {
115   lang_statement_union_type *l;
116   bfd_boolean ret;
117
118   for (; (l = *lp) != NULL; lp = &l->header.next)
119     {
120       switch (l->header.type)
121         {
122         case lang_constructors_statement_enum:
123           ret = hook_in_stub (info, &constructor_list.head);
124           if (ret)
125             return ret;
126           break;
127
128         case lang_output_section_statement_enum:
129           ret = hook_in_stub (info,
130                               &l->output_section_statement.children.head);
131           if (ret)
132             return ret;
133           break;
134
135         case lang_wild_statement_enum:
136           ret = hook_in_stub (info, &l->wild_statement.children.head);
137           if (ret)
138             return ret;
139           break;
140
141         case lang_group_statement_enum:
142           ret = hook_in_stub (info, &l->group_statement.children.head);
143           if (ret)
144             return ret;
145           break;
146
147         case lang_input_section_enum:
148           if (l->input_section.section == info->input_section)
149             {
150               /* We've found our section.  Insert the stub immediately
151                  after its associated input section.  */
152               *(info->add.tail) = l->header.next;
153               l->header.next = info->add.head;
154               return TRUE;
155             }
156           break;
157
158         case lang_data_statement_enum:
159         case lang_reloc_statement_enum:
160         case lang_object_symbols_statement_enum:
161         case lang_output_statement_enum:
162         case lang_target_statement_enum:
163         case lang_input_statement_enum:
164         case lang_assignment_statement_enum:
165         case lang_padding_statement_enum:
166         case lang_address_statement_enum:
167         case lang_fill_statement_enum:
168           break;
169
170         default:
171           FAIL ();
172           break;
173         }
174     }
175   return FALSE;
176 }
177
178
179 /* Call-back for elf32_arm_size_stubs.  */
180
181 /* Create a new stub section, and arrange for it to be linked
182    immediately after INPUT_SECTION.  */
183
184 static asection *
185 elf32_arm_add_stub_section (const char * stub_sec_name,
186                             asection *   input_section,
187                             unsigned int alignment_power)
188 {
189   asection *stub_sec;
190   flagword flags;
191   asection *output_section;
192   lang_output_section_statement_type *os;
193   struct hook_stub_info info;
194
195   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
196            | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
197   stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
198                                                  stub_sec_name, flags);
199   if (stub_sec == NULL)
200     goto err_ret;
201
202   bfd_set_section_alignment (stub_file->the_bfd, stub_sec, alignment_power);
203
204   output_section = input_section->output_section;
205   os = lang_output_section_get (output_section);
206
207   info.input_section = input_section;
208   lang_list_init (&info.add);
209   lang_add_section (&info.add, stub_sec, NULL, os);
210
211   if (info.add.head == NULL)
212     goto err_ret;
213
214   if (hook_in_stub (&info, &os->children.head))
215     return stub_sec;
216
217  err_ret:
218   einfo ("%X%P: can not make stub section: %E\n");
219   return NULL;
220 }
221
222 /* Another call-back for elf_arm_size_stubs.  */
223
224 static void
225 gldarm_layout_sections_again (void)
226 {
227   /* If we have changed sizes of the stub sections, then we need
228      to recalculate all the section offsets.  This may mean we need to
229      add even more stubs.  */
230   gld${EMULATION_NAME}_map_segments (TRUE);
231   need_laying_out = -1;
232 }
233
234 static void
235 build_section_lists (lang_statement_union_type *statement)
236 {
237   if (statement->header.type == lang_input_section_enum)
238     {
239       asection *i = statement->input_section.section;
240
241       if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
242           && (i->flags & SEC_EXCLUDE) == 0
243           && i->output_section != NULL
244           && i->output_section->owner == link_info.output_bfd)
245         elf32_arm_next_input_section (& link_info, i);
246     }
247 }
248
249 static int
250 compare_output_sec_vma (const void *a, const void *b)
251 {
252   asection *asec = *(asection **) a, *bsec = *(asection **) b;
253   asection *aout = asec->output_section, *bout = bsec->output_section;
254   bfd_vma avma, bvma;
255
256   /* If there's no output section for some reason, compare equal.  */
257   if (!aout || !bout)
258     return 0;
259
260   avma = aout->vma + asec->output_offset;
261   bvma = bout->vma + bsec->output_offset;
262
263   if (avma > bvma)
264     return 1;
265   else if (avma < bvma)
266     return -1;
267
268   return 0;
269 }
270
271 static void
272 gld${EMULATION_NAME}_after_allocation (void)
273 {
274   if (!link_info.relocatable)
275     {
276       /* Build a sorted list of input text sections, then use that to process
277          the unwind table index.  */
278       unsigned int list_size = 10;
279       asection **sec_list = (asection **)
280           xmalloc (list_size * sizeof (asection *));
281       unsigned int sec_count = 0;
282
283       LANG_FOR_EACH_INPUT_STATEMENT (is)
284         {
285           bfd *abfd = is->the_bfd;
286           asection *sec;
287
288           if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
289             continue;
290
291           for (sec = abfd->sections; sec != NULL; sec = sec->next)
292             {
293               asection *out_sec = sec->output_section;
294
295               if (out_sec
296                   && elf_section_data (sec)
297                   && elf_section_type (sec) == SHT_PROGBITS
298                   && (elf_section_flags (sec) & SHF_EXECINSTR) != 0
299                   && (sec->flags & SEC_EXCLUDE) == 0
300                   && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
301                   && out_sec != bfd_abs_section_ptr)
302                 {
303                   if (sec_count == list_size)
304                     {
305                       list_size *= 2;
306                       sec_list = (asection **)
307                           xrealloc (sec_list, list_size * sizeof (asection *));
308                     }
309
310                   sec_list[sec_count++] = sec;
311                 }
312             }
313         }
314
315       qsort (sec_list, sec_count, sizeof (asection *), &compare_output_sec_vma);
316
317       if (elf32_arm_fix_exidx_coverage (sec_list, sec_count, &link_info,
318                                            merge_exidx_entries))
319         need_laying_out = 1;
320
321       free (sec_list);
322     }
323
324   /* bfd_elf32_discard_info just plays with debugging sections,
325      ie. doesn't affect any code, so we can delay resizing the
326      sections.  It's likely we'll resize everything in the process of
327      adding stubs.  */
328   if (bfd_elf_discard_info (link_info.output_bfd, & link_info))
329     need_laying_out = 1;
330
331   /* If generating a relocatable output file, then we don't
332      have to examine the relocs.  */
333   if (stub_file != NULL && !link_info.relocatable)
334     {
335       int  ret = elf32_arm_setup_section_lists (link_info.output_bfd, & link_info);
336
337       if (ret != 0)
338         {
339           if (ret < 0)
340             {
341               einfo ("%X%P: could not compute sections lists for stub generation: %E\n");
342               return;
343             }
344
345           lang_for_each_statement (build_section_lists);
346
347           /* Call into the BFD backend to do the real work.  */
348           if (! elf32_arm_size_stubs (link_info.output_bfd,
349                                       stub_file->the_bfd,
350                                       & link_info,
351                                       group_size,
352                                       & elf32_arm_add_stub_section,
353                                       & gldarm_layout_sections_again))
354             {
355               einfo ("%X%P: cannot size stub section: %E\n");
356               return;
357             }
358         }
359     }
360
361   if (need_laying_out != -1)
362     gld${EMULATION_NAME}_map_segments (need_laying_out);
363 }
364
365 static void
366 gld${EMULATION_NAME}_finish (void)
367 {
368   struct bfd_link_hash_entry * h;
369
370   {
371     LANG_FOR_EACH_INPUT_STATEMENT (is)
372       {
373         /* Figure out where VFP11 erratum veneers (and the labels returning
374            from same) have been placed.  */
375         bfd_elf32_arm_vfp11_fix_veneer_locations (is->the_bfd, &link_info);
376       }
377   }
378
379   if (! link_info.relocatable)
380     {
381       /* Now build the linker stubs.  */
382       if (stub_file->the_bfd->sections != NULL)
383         {
384           if (! elf32_arm_build_stubs (& link_info))
385             einfo ("%X%P: can not build stubs: %E\n");
386         }
387     }
388
389   finish_default ();
390
391   if (thumb_entry_symbol)
392     {
393       h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
394                                 FALSE, FALSE, TRUE);
395     }
396   else
397     {
398       struct elf_link_hash_entry * eh;
399
400       if (!entry_symbol.name)
401         return;
402
403       h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name,
404                                 FALSE, FALSE, TRUE);
405       eh = (struct elf_link_hash_entry *)h;
406       if (!h || eh->target_internal != ST_BRANCH_TO_THUMB)
407         return;
408     }
409
410
411   if (h != (struct bfd_link_hash_entry *) NULL
412       && (h->type == bfd_link_hash_defined
413           || h->type == bfd_link_hash_defweak)
414       && h->u.def.section->output_section != NULL)
415     {
416       static char buffer[32];
417       bfd_vma val;
418
419       /* Special procesing is required for a Thumb entry symbol.  The
420          bottom bit of its address must be set.  */
421       val = (h->u.def.value
422              + bfd_get_section_vma (link_info.output_bfd,
423                                     h->u.def.section->output_section)
424              + h->u.def.section->output_offset);
425
426       val |= 1;
427
428       /* Now convert this value into a string and store it in entry_symbol
429          where the lang_finish() function will pick it up.  */
430       buffer[0] = '0';
431       buffer[1] = 'x';
432
433       sprintf_vma (buffer + 2, val);
434
435       if (thumb_entry_symbol != NULL && entry_symbol.name != NULL
436           && entry_from_cmdline)
437         einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
438                thumb_entry_symbol, entry_symbol.name);
439       entry_symbol.name = buffer;
440     }
441   else
442     einfo (_("%P: warning: cannot find thumb start symbol %s\n"),
443            thumb_entry_symbol);
444 }
445
446 /* This is a convenient point to tell BFD about target specific flags.
447    After the output has been created, but before inputs are read.  */
448 static void
449 arm_elf_create_output_section_statements (void)
450 {
451   if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL)
452     {
453       /* The arm backend needs special fields in the output hash structure.
454          These will only be created if the output format is an arm format,
455          hence we do not support linking and changing output formats at the
456          same time.  Use a link followed by objcopy to change output formats.  */
457       einfo ("%F%X%P: error: Cannot change output format whilst linking ARM binaries.\n");
458       return;
459     }
460
461   bfd_elf32_arm_set_target_relocs (link_info.output_bfd, &link_info,
462                                    target1_is_rel,
463                                    target2_type, fix_v4bx, use_blx,
464                                    vfp11_denorm_fix, no_enum_size_warning,
465                                    no_wchar_size_warning,
466                                    pic_veneer, fix_cortex_a8,
467                                    fix_arm1176);
468
469   stub_file = lang_add_input_file ("linker stubs",
470                                    lang_input_file_is_fake_enum,
471                                    NULL);
472   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
473   if (stub_file->the_bfd == NULL
474       || ! bfd_set_arch_mach (stub_file->the_bfd,
475                               bfd_get_arch (link_info.output_bfd),
476                               bfd_get_mach (link_info.output_bfd)))
477     {
478       einfo ("%X%P: can not create BFD %E\n");
479       return;
480     }
481
482   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
483   ldlang_add_file (stub_file);
484
485   /* Also use the stub file for stubs placed in a single output section.  */
486   bfd_elf32_arm_add_glue_sections_to_bfd (stub_file->the_bfd, &link_info);
487   bfd_elf32_arm_get_bfd_for_interworking (stub_file->the_bfd, &link_info);
488 }
489
490 /* Avoid processing the fake stub_file in vercheck, stat_needed and
491    check_needed routines.  */
492
493 static void (*real_func) (lang_input_statement_type *);
494
495 static void arm_for_each_input_file_wrapper (lang_input_statement_type *l)
496 {
497   if (l != stub_file)
498     (*real_func) (l);
499 }
500
501 static void
502 arm_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
503 {
504   real_func = func;
505   lang_for_each_input_file (&arm_for_each_input_file_wrapper);
506 }
507
508 #define lang_for_each_input_file arm_lang_for_each_input_file
509
510 EOF
511
512 # Define some shell vars to insert bits of code into the standard elf
513 # parse_args and list_options functions.
514 #
515 PARSE_AND_LIST_PROLOGUE='
516 #define OPTION_THUMB_ENTRY              301
517 #define OPTION_BE8                      302
518 #define OPTION_TARGET1_REL              303
519 #define OPTION_TARGET1_ABS              304
520 #define OPTION_TARGET2                  305
521 #define OPTION_FIX_V4BX                 306
522 #define OPTION_USE_BLX                  307
523 #define OPTION_VFP11_DENORM_FIX         308
524 #define OPTION_NO_ENUM_SIZE_WARNING     309
525 #define OPTION_PIC_VENEER               310
526 #define OPTION_FIX_V4BX_INTERWORKING    311
527 #define OPTION_STUBGROUP_SIZE           312
528 #define OPTION_NO_WCHAR_SIZE_WARNING    313
529 #define OPTION_FIX_CORTEX_A8            314
530 #define OPTION_NO_FIX_CORTEX_A8         315
531 #define OPTION_NO_MERGE_EXIDX_ENTRIES   316
532 #define OPTION_FIX_ARM1176              317
533 #define OPTION_NO_FIX_ARM1176           318
534 #define OPTION_LONG_PLT                 319
535 '
536
537 PARSE_AND_LIST_SHORTOPTS=p
538
539 PARSE_AND_LIST_LONGOPTS='
540   { "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
541   { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
542   { "be8", no_argument, NULL, OPTION_BE8},
543   { "target1-rel", no_argument, NULL, OPTION_TARGET1_REL},
544   { "target1-abs", no_argument, NULL, OPTION_TARGET1_ABS},
545   { "target2", required_argument, NULL, OPTION_TARGET2},
546   { "fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
547   { "fix-v4bx-interworking", no_argument, NULL, OPTION_FIX_V4BX_INTERWORKING},
548   { "use-blx", no_argument, NULL, OPTION_USE_BLX},
549   { "vfp11-denorm-fix", required_argument, NULL, OPTION_VFP11_DENORM_FIX},
550   { "no-enum-size-warning", no_argument, NULL, OPTION_NO_ENUM_SIZE_WARNING},
551   { "pic-veneer", no_argument, NULL, OPTION_PIC_VENEER},
552   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
553   { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING},
554   { "fix-cortex-a8", no_argument, NULL, OPTION_FIX_CORTEX_A8 },
555   { "no-fix-cortex-a8", no_argument, NULL, OPTION_NO_FIX_CORTEX_A8 },
556   { "no-merge-exidx-entries", no_argument, NULL, OPTION_NO_MERGE_EXIDX_ENTRIES },
557   { "fix-arm1176", no_argument, NULL, OPTION_FIX_ARM1176 },
558   { "no-fix-arm1176", no_argument, NULL, OPTION_NO_FIX_ARM1176 },
559   { "long-plt", no_argument, NULL, OPTION_LONG_PLT },
560 '
561
562 PARSE_AND_LIST_OPTIONS='
563   fprintf (file, _("  --thumb-entry=<sym>         Set the entry point to be Thumb symbol <sym>\n"));
564   fprintf (file, _("  --be8                       Output BE8 format image\n"));
565   fprintf (file, _("  --target1-rel               Interpret R_ARM_TARGET1 as R_ARM_REL32\n"));
566   fprintf (file, _("  --target1-abs               Interpret R_ARM_TARGET1 as R_ARM_ABS32\n"));
567   fprintf (file, _("  --target2=<type>            Specify definition of R_ARM_TARGET2\n"));
568   fprintf (file, _("  --fix-v4bx                  Rewrite BX rn as MOV pc, rn for ARMv4\n"));
569   fprintf (file, _("  --fix-v4bx-interworking     Rewrite BX rn branch to ARMv4 interworking veneer\n"));
570   fprintf (file, _("  --use-blx                   Enable use of BLX instructions\n"));
571   fprintf (file, _("  --vfp11-denorm-fix          Specify how to fix VFP11 denorm erratum\n"));
572   fprintf (file, _("  --no-enum-size-warning      Don'\''t warn about objects with incompatible\n"
573                    "                                enum sizes\n"));
574   fprintf (file, _("  --no-wchar-size-warning     Don'\''t warn about objects with incompatible\n"
575                    "                                wchar_t sizes\n"));
576   fprintf (file, _("  --pic-veneer                Always generate PIC interworking veneers\n"));
577   fprintf (file, _("  --long-plt                  Generate long .plt entries\n"
578            "                              to handle large .plt/.got displacements\n"));
579   fprintf (file, _("\
580   --stub-group-size=N         Maximum size of a group of input sections that\n\
581                                can be handled by one stub section.  A negative\n\
582                                value locates all stubs after their branches\n\
583                                (with a group size of -N), while a positive\n\
584                                value allows two groups of input sections, one\n\
585                                before, and one after each stub section.\n\
586                                Values of +/-1 indicate the linker should\n\
587                                choose suitable defaults.\n"));
588   fprintf (file, _("  --[no-]fix-cortex-a8        Disable/enable Cortex-A8 Thumb-2 branch erratum fix\n"));
589   fprintf (file, _("  --no-merge-exidx-entries    Disable merging exidx entries\n"));
590   fprintf (file, _("  --[no-]fix-arm1176          Disable/enable ARM1176 BLX immediate erratum fix\n"));
591 '
592
593 PARSE_AND_LIST_ARGS_CASES='
594     case '\'p\'':
595       /* Only here for backwards compatibility.  */
596       break;
597
598     case OPTION_THUMB_ENTRY:
599       thumb_entry_symbol = optarg;
600       break;
601
602     case OPTION_BE8:
603       byteswap_code = 1;
604       break;
605
606     case OPTION_TARGET1_REL:
607       target1_is_rel = 1;
608       break;
609
610     case OPTION_TARGET1_ABS:
611       target1_is_rel = 0;
612       break;
613
614     case OPTION_TARGET2:
615       target2_type = optarg;
616       break;
617
618     case OPTION_FIX_V4BX:
619       fix_v4bx = 1;
620       break;
621
622     case OPTION_FIX_V4BX_INTERWORKING:
623       fix_v4bx = 2;
624       break;
625
626     case OPTION_USE_BLX:
627       use_blx = 1;
628       break;
629
630     case OPTION_VFP11_DENORM_FIX:
631       if (strcmp (optarg, "none") == 0)
632         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_NONE;
633       else if (strcmp (optarg, "scalar") == 0)
634         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_SCALAR;
635       else if (strcmp (optarg, "vector") == 0)
636         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR;
637       else
638         einfo (_("Unrecognized VFP11 fix type '\''%s'\''.\n"), optarg);
639       break;
640
641     case OPTION_NO_ENUM_SIZE_WARNING:
642       no_enum_size_warning = 1;
643       break;
644
645     case OPTION_NO_WCHAR_SIZE_WARNING:
646       no_wchar_size_warning = 1;
647       break;
648
649     case OPTION_PIC_VENEER:
650       pic_veneer = 1;
651       break;
652
653     case OPTION_STUBGROUP_SIZE:
654       {
655         const char *end;
656
657         group_size = bfd_scan_vma (optarg, &end, 0);
658         if (*end)
659           einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
660       }
661       break;
662
663     case OPTION_FIX_CORTEX_A8:
664       fix_cortex_a8 = 1;
665       break;
666
667     case OPTION_NO_FIX_CORTEX_A8:
668       fix_cortex_a8 = 0;
669       break;
670
671    case OPTION_NO_MERGE_EXIDX_ENTRIES:
672       merge_exidx_entries = 0;
673       break;
674
675    case OPTION_FIX_ARM1176:
676       fix_arm1176 = 1;
677       break;
678
679    case OPTION_NO_FIX_ARM1176:
680       fix_arm1176 = 0;
681       break;
682
683    case OPTION_LONG_PLT:
684       bfd_elf32_arm_use_long_plt ();
685       break;
686 '
687
688 # We have our own before_allocation etc. functions, but they call
689 # the standard routines, so give them a different name.
690 LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation
691 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
692 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements
693
694 # Replace the elf before_parse function with our own.
695 LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
696
697 # Call the extra arm-elf function
698 LDEMUL_FINISH=gld${EMULATION_NAME}_finish