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