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