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