Return error status from bfd_elf_discard_info.
[external/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   int ret;
275
276   if (!link_info.relocatable)
277     {
278       /* Build a sorted list of input text sections, then use that to process
279          the unwind table index.  */
280       unsigned int list_size = 10;
281       asection **sec_list = (asection **)
282           xmalloc (list_size * sizeof (asection *));
283       unsigned int sec_count = 0;
284
285       LANG_FOR_EACH_INPUT_STATEMENT (is)
286         {
287           bfd *abfd = is->the_bfd;
288           asection *sec;
289
290           if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
291             continue;
292
293           for (sec = abfd->sections; sec != NULL; sec = sec->next)
294             {
295               asection *out_sec = sec->output_section;
296
297               if (out_sec
298                   && elf_section_data (sec)
299                   && elf_section_type (sec) == SHT_PROGBITS
300                   && (elf_section_flags (sec) & SHF_EXECINSTR) != 0
301                   && (sec->flags & SEC_EXCLUDE) == 0
302                   && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
303                   && out_sec != bfd_abs_section_ptr)
304                 {
305                   if (sec_count == list_size)
306                     {
307                       list_size *= 2;
308                       sec_list = (asection **)
309                           xrealloc (sec_list, list_size * sizeof (asection *));
310                     }
311
312                   sec_list[sec_count++] = sec;
313                 }
314             }
315         }
316
317       qsort (sec_list, sec_count, sizeof (asection *), &compare_output_sec_vma);
318
319       if (elf32_arm_fix_exidx_coverage (sec_list, sec_count, &link_info,
320                                            merge_exidx_entries))
321         need_laying_out = 1;
322
323       free (sec_list);
324     }
325
326   /* bfd_elf32_discard_info just plays with debugging sections,
327      ie. doesn't affect any code, so we can delay resizing the
328      sections.  It's likely we'll resize everything in the process of
329      adding stubs.  */
330   ret = bfd_elf_discard_info (link_info.output_bfd, & link_info);
331   if (ret < 0)
332     {
333       einfo ("%X%P: .eh_frame/.stab edit: %E\n");
334       return;
335     }
336   else if (ret > 0)
337     need_laying_out = 1;
338
339   /* If generating a relocatable output file, then we don't
340      have to examine the relocs.  */
341   if (stub_file != NULL && !link_info.relocatable)
342     {
343       ret = elf32_arm_setup_section_lists (link_info.output_bfd, &link_info);
344       if (ret != 0)
345         {
346           if (ret < 0)
347             {
348               einfo ("%X%P: could not compute sections lists for stub generation: %E\n");
349               return;
350             }
351
352           lang_for_each_statement (build_section_lists);
353
354           /* Call into the BFD backend to do the real work.  */
355           if (! elf32_arm_size_stubs (link_info.output_bfd,
356                                       stub_file->the_bfd,
357                                       & link_info,
358                                       group_size,
359                                       & elf32_arm_add_stub_section,
360                                       & gldarm_layout_sections_again))
361             {
362               einfo ("%X%P: cannot size stub section: %E\n");
363               return;
364             }
365         }
366     }
367
368   if (need_laying_out != -1)
369     gld${EMULATION_NAME}_map_segments (need_laying_out);
370 }
371
372 static void
373 gld${EMULATION_NAME}_finish (void)
374 {
375   struct bfd_link_hash_entry * h;
376
377   {
378     LANG_FOR_EACH_INPUT_STATEMENT (is)
379       {
380         /* Figure out where VFP11 erratum veneers (and the labels returning
381            from same) have been placed.  */
382         bfd_elf32_arm_vfp11_fix_veneer_locations (is->the_bfd, &link_info);
383       }
384   }
385
386   if (! link_info.relocatable)
387     {
388       /* Now build the linker stubs.  */
389       if (stub_file->the_bfd->sections != NULL)
390         {
391           if (! elf32_arm_build_stubs (& link_info))
392             einfo ("%X%P: can not build stubs: %E\n");
393         }
394     }
395
396   finish_default ();
397
398   if (thumb_entry_symbol)
399     {
400       h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
401                                 FALSE, FALSE, TRUE);
402     }
403   else
404     {
405       struct elf_link_hash_entry * eh;
406
407       if (!entry_symbol.name)
408         return;
409
410       h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name,
411                                 FALSE, FALSE, TRUE);
412       eh = (struct elf_link_hash_entry *)h;
413       if (!h || eh->target_internal != ST_BRANCH_TO_THUMB)
414         return;
415     }
416
417
418   if (h != (struct bfd_link_hash_entry *) NULL
419       && (h->type == bfd_link_hash_defined
420           || h->type == bfd_link_hash_defweak)
421       && h->u.def.section->output_section != NULL)
422     {
423       static char buffer[32];
424       bfd_vma val;
425
426       /* Special procesing is required for a Thumb entry symbol.  The
427          bottom bit of its address must be set.  */
428       val = (h->u.def.value
429              + bfd_get_section_vma (link_info.output_bfd,
430                                     h->u.def.section->output_section)
431              + h->u.def.section->output_offset);
432
433       val |= 1;
434
435       /* Now convert this value into a string and store it in entry_symbol
436          where the lang_finish() function will pick it up.  */
437       buffer[0] = '0';
438       buffer[1] = 'x';
439
440       sprintf_vma (buffer + 2, val);
441
442       if (thumb_entry_symbol != NULL && entry_symbol.name != NULL
443           && entry_from_cmdline)
444         einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
445                thumb_entry_symbol, entry_symbol.name);
446       entry_symbol.name = buffer;
447     }
448   else
449     einfo (_("%P: warning: cannot find thumb start symbol %s\n"),
450            thumb_entry_symbol);
451 }
452
453 /* This is a convenient point to tell BFD about target specific flags.
454    After the output has been created, but before inputs are read.  */
455 static void
456 arm_elf_create_output_section_statements (void)
457 {
458   if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL)
459     {
460       /* The arm backend needs special fields in the output hash structure.
461          These will only be created if the output format is an arm format,
462          hence we do not support linking and changing output formats at the
463          same time.  Use a link followed by objcopy to change output formats.  */
464       einfo ("%F%X%P: error: Cannot change output format whilst linking ARM binaries.\n");
465       return;
466     }
467
468   bfd_elf32_arm_set_target_relocs (link_info.output_bfd, &link_info,
469                                    target1_is_rel,
470                                    target2_type, fix_v4bx, use_blx,
471                                    vfp11_denorm_fix, no_enum_size_warning,
472                                    no_wchar_size_warning,
473                                    pic_veneer, fix_cortex_a8,
474                                    fix_arm1176);
475
476   stub_file = lang_add_input_file ("linker stubs",
477                                    lang_input_file_is_fake_enum,
478                                    NULL);
479   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
480   if (stub_file->the_bfd == NULL
481       || ! bfd_set_arch_mach (stub_file->the_bfd,
482                               bfd_get_arch (link_info.output_bfd),
483                               bfd_get_mach (link_info.output_bfd)))
484     {
485       einfo ("%X%P: can not create BFD %E\n");
486       return;
487     }
488
489   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
490   ldlang_add_file (stub_file);
491
492   /* Also use the stub file for stubs placed in a single output section.  */
493   bfd_elf32_arm_add_glue_sections_to_bfd (stub_file->the_bfd, &link_info);
494   bfd_elf32_arm_get_bfd_for_interworking (stub_file->the_bfd, &link_info);
495 }
496
497 /* Avoid processing the fake stub_file in vercheck, stat_needed and
498    check_needed routines.  */
499
500 static void (*real_func) (lang_input_statement_type *);
501
502 static void arm_for_each_input_file_wrapper (lang_input_statement_type *l)
503 {
504   if (l != stub_file)
505     (*real_func) (l);
506 }
507
508 static void
509 arm_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
510 {
511   real_func = func;
512   lang_for_each_input_file (&arm_for_each_input_file_wrapper);
513 }
514
515 #define lang_for_each_input_file arm_lang_for_each_input_file
516
517 EOF
518
519 # Define some shell vars to insert bits of code into the standard elf
520 # parse_args and list_options functions.
521 #
522 PARSE_AND_LIST_PROLOGUE='
523 #define OPTION_THUMB_ENTRY              301
524 #define OPTION_BE8                      302
525 #define OPTION_TARGET1_REL              303
526 #define OPTION_TARGET1_ABS              304
527 #define OPTION_TARGET2                  305
528 #define OPTION_FIX_V4BX                 306
529 #define OPTION_USE_BLX                  307
530 #define OPTION_VFP11_DENORM_FIX         308
531 #define OPTION_NO_ENUM_SIZE_WARNING     309
532 #define OPTION_PIC_VENEER               310
533 #define OPTION_FIX_V4BX_INTERWORKING    311
534 #define OPTION_STUBGROUP_SIZE           312
535 #define OPTION_NO_WCHAR_SIZE_WARNING    313
536 #define OPTION_FIX_CORTEX_A8            314
537 #define OPTION_NO_FIX_CORTEX_A8         315
538 #define OPTION_NO_MERGE_EXIDX_ENTRIES   316
539 #define OPTION_FIX_ARM1176              317
540 #define OPTION_NO_FIX_ARM1176           318
541 #define OPTION_LONG_PLT                 319
542 '
543
544 PARSE_AND_LIST_SHORTOPTS=p
545
546 PARSE_AND_LIST_LONGOPTS='
547   { "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
548   { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
549   { "be8", no_argument, NULL, OPTION_BE8},
550   { "target1-rel", no_argument, NULL, OPTION_TARGET1_REL},
551   { "target1-abs", no_argument, NULL, OPTION_TARGET1_ABS},
552   { "target2", required_argument, NULL, OPTION_TARGET2},
553   { "fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
554   { "fix-v4bx-interworking", no_argument, NULL, OPTION_FIX_V4BX_INTERWORKING},
555   { "use-blx", no_argument, NULL, OPTION_USE_BLX},
556   { "vfp11-denorm-fix", required_argument, NULL, OPTION_VFP11_DENORM_FIX},
557   { "no-enum-size-warning", no_argument, NULL, OPTION_NO_ENUM_SIZE_WARNING},
558   { "pic-veneer", no_argument, NULL, OPTION_PIC_VENEER},
559   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
560   { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING},
561   { "fix-cortex-a8", no_argument, NULL, OPTION_FIX_CORTEX_A8 },
562   { "no-fix-cortex-a8", no_argument, NULL, OPTION_NO_FIX_CORTEX_A8 },
563   { "no-merge-exidx-entries", no_argument, NULL, OPTION_NO_MERGE_EXIDX_ENTRIES },
564   { "fix-arm1176", no_argument, NULL, OPTION_FIX_ARM1176 },
565   { "no-fix-arm1176", no_argument, NULL, OPTION_NO_FIX_ARM1176 },
566   { "long-plt", no_argument, NULL, OPTION_LONG_PLT },
567 '
568
569 PARSE_AND_LIST_OPTIONS='
570   fprintf (file, _("  --thumb-entry=<sym>         Set the entry point to be Thumb symbol <sym>\n"));
571   fprintf (file, _("  --be8                       Output BE8 format image\n"));
572   fprintf (file, _("  --target1-rel               Interpret R_ARM_TARGET1 as R_ARM_REL32\n"));
573   fprintf (file, _("  --target1-abs               Interpret R_ARM_TARGET1 as R_ARM_ABS32\n"));
574   fprintf (file, _("  --target2=<type>            Specify definition of R_ARM_TARGET2\n"));
575   fprintf (file, _("  --fix-v4bx                  Rewrite BX rn as MOV pc, rn for ARMv4\n"));
576   fprintf (file, _("  --fix-v4bx-interworking     Rewrite BX rn branch to ARMv4 interworking veneer\n"));
577   fprintf (file, _("  --use-blx                   Enable use of BLX instructions\n"));
578   fprintf (file, _("  --vfp11-denorm-fix          Specify how to fix VFP11 denorm erratum\n"));
579   fprintf (file, _("  --no-enum-size-warning      Don'\''t warn about objects with incompatible\n"
580                    "                                enum sizes\n"));
581   fprintf (file, _("  --no-wchar-size-warning     Don'\''t warn about objects with incompatible\n"
582                    "                                wchar_t sizes\n"));
583   fprintf (file, _("  --pic-veneer                Always generate PIC interworking veneers\n"));
584   fprintf (file, _("  --long-plt                  Generate long .plt entries\n"
585            "                              to handle large .plt/.got displacements\n"));
586   fprintf (file, _("\
587   --stub-group-size=N         Maximum size of a group of input sections that\n\
588                                can be handled by one stub section.  A negative\n\
589                                value locates all stubs after their branches\n\
590                                (with a group size of -N), while a positive\n\
591                                value allows two groups of input sections, one\n\
592                                before, and one after each stub section.\n\
593                                Values of +/-1 indicate the linker should\n\
594                                choose suitable defaults.\n"));
595   fprintf (file, _("  --[no-]fix-cortex-a8        Disable/enable Cortex-A8 Thumb-2 branch erratum fix\n"));
596   fprintf (file, _("  --no-merge-exidx-entries    Disable merging exidx entries\n"));
597   fprintf (file, _("  --[no-]fix-arm1176          Disable/enable ARM1176 BLX immediate erratum fix\n"));
598 '
599
600 PARSE_AND_LIST_ARGS_CASES='
601     case '\'p\'':
602       /* Only here for backwards compatibility.  */
603       break;
604
605     case OPTION_THUMB_ENTRY:
606       thumb_entry_symbol = optarg;
607       break;
608
609     case OPTION_BE8:
610       byteswap_code = 1;
611       break;
612
613     case OPTION_TARGET1_REL:
614       target1_is_rel = 1;
615       break;
616
617     case OPTION_TARGET1_ABS:
618       target1_is_rel = 0;
619       break;
620
621     case OPTION_TARGET2:
622       target2_type = optarg;
623       break;
624
625     case OPTION_FIX_V4BX:
626       fix_v4bx = 1;
627       break;
628
629     case OPTION_FIX_V4BX_INTERWORKING:
630       fix_v4bx = 2;
631       break;
632
633     case OPTION_USE_BLX:
634       use_blx = 1;
635       break;
636
637     case OPTION_VFP11_DENORM_FIX:
638       if (strcmp (optarg, "none") == 0)
639         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_NONE;
640       else if (strcmp (optarg, "scalar") == 0)
641         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_SCALAR;
642       else if (strcmp (optarg, "vector") == 0)
643         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR;
644       else
645         einfo (_("Unrecognized VFP11 fix type '\''%s'\''.\n"), optarg);
646       break;
647
648     case OPTION_NO_ENUM_SIZE_WARNING:
649       no_enum_size_warning = 1;
650       break;
651
652     case OPTION_NO_WCHAR_SIZE_WARNING:
653       no_wchar_size_warning = 1;
654       break;
655
656     case OPTION_PIC_VENEER:
657       pic_veneer = 1;
658       break;
659
660     case OPTION_STUBGROUP_SIZE:
661       {
662         const char *end;
663
664         group_size = bfd_scan_vma (optarg, &end, 0);
665         if (*end)
666           einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
667       }
668       break;
669
670     case OPTION_FIX_CORTEX_A8:
671       fix_cortex_a8 = 1;
672       break;
673
674     case OPTION_NO_FIX_CORTEX_A8:
675       fix_cortex_a8 = 0;
676       break;
677
678    case OPTION_NO_MERGE_EXIDX_ENTRIES:
679       merge_exidx_entries = 0;
680       break;
681
682    case OPTION_FIX_ARM1176:
683       fix_arm1176 = 1;
684       break;
685
686    case OPTION_NO_FIX_ARM1176:
687       fix_arm1176 = 0;
688       break;
689
690    case OPTION_LONG_PLT:
691       bfd_elf32_arm_use_long_plt ();
692       break;
693 '
694
695 # We have our own before_allocation etc. functions, but they call
696 # the standard routines, so give them a different name.
697 LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation
698 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
699 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements
700
701 # Replace the elf before_parse function with our own.
702 LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
703
704 # Call the extra arm-elf function
705 LDEMUL_FINISH=gld${EMULATION_NAME}_finish