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