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