Home | History | Annotate | Line # | Download | only in emultempl
beos.em revision 1.1.1.7
      1 # This shell script emits a C file. -*- C -*-
      2 # It does some substitutions.
      3 if [ -z "$MACHINE" ]; then
      4   OUTPUT_ARCH=${ARCH}
      5 else
      6   OUTPUT_ARCH=${ARCH}:${MACHINE}
      7 fi
      8 fragment <<EOF
      9 /* This file is part of GLD, the Gnu Linker.
     10    Copyright (C) 1995-2024 Free Software Foundation, Inc.
     11 
     12    This file is part of the GNU Binutils.
     13 
     14    This program is free software; you can redistribute it and/or modify
     15    it under the terms of the GNU General Public License as published by
     16    the Free Software Foundation; either version 3 of the License, or
     17    (at your option) any later version.
     18 
     19    This program is distributed in the hope that it will be useful,
     20    but WITHOUT ANY WARRANTY; without even the implied warranty of
     21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22    GNU General Public License for more details.
     23 
     24    You should have received a copy of the GNU General Public License
     25    along with this program; if not, write to the Free Software
     26    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     27    MA 02110-1301, USA.  */
     28 
     29 
     30 /* For WINDOWS_NT */
     31 /* The original file generated returned different default scripts depending
     32    on whether certain switches were set, but these switches pertain to the
     33    Linux system and that particular version of coff.  In the NT case, we
     34    only determine if the subsystem is console or windows in order to select
     35    the correct entry point by default. */
     36 
     37 #include "sysdep.h"
     38 #include "bfd.h"
     39 #include "bfdlink.h"
     40 #include "ctf-api.h"
     41 #include "getopt.h"
     42 #include "libiberty.h"
     43 #include "filenames.h"
     44 #include "ld.h"
     45 #include "ldmain.h"
     46 #include "ldexp.h"
     47 #include "ldlang.h"
     48 #include "ldfile.h"
     49 #include "ldemul.h"
     50 #include <ldgram.h>
     51 #include "ldlex.h"
     52 #include "ldmisc.h"
     53 #include "ldctor.h"
     54 #include "coff/internal.h"
     55 #include "../bfd/libcoff.h"
     56 
     57 #define TARGET_IS_${EMULATION_NAME}
     58 
     59 static struct internal_extra_pe_aouthdr pe;
     60 static int dll;
     61 
     62 extern const char *output_filename;
     63 
     64 static void
     65 gld${EMULATION_NAME}_before_parse (void)
     66 {
     67   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
     68   output_filename = "a.exe";
     69 }
     70 
     72 /* PE format extra command line options.  */
     73 
     74 /* Used for setting flags in the PE header. */
     75 #define OPTION_BASE_FILE		(300  + 1)
     76 #define OPTION_DLL			(OPTION_BASE_FILE + 1)
     77 #define OPTION_FILE_ALIGNMENT		(OPTION_DLL + 1)
     78 #define OPTION_IMAGE_BASE		(OPTION_FILE_ALIGNMENT + 1)
     79 #define OPTION_MAJOR_IMAGE_VERSION	(OPTION_IMAGE_BASE + 1)
     80 #define OPTION_MAJOR_OS_VERSION		(OPTION_MAJOR_IMAGE_VERSION + 1)
     81 #define OPTION_MAJOR_SUBSYSTEM_VERSION	(OPTION_MAJOR_OS_VERSION + 1)
     82 #define OPTION_MINOR_IMAGE_VERSION	(OPTION_MAJOR_SUBSYSTEM_VERSION + 1)
     83 #define OPTION_MINOR_OS_VERSION		(OPTION_MINOR_IMAGE_VERSION + 1)
     84 #define OPTION_MINOR_SUBSYSTEM_VERSION	(OPTION_MINOR_OS_VERSION + 1)
     85 #define OPTION_SECTION_ALIGNMENT	(OPTION_MINOR_SUBSYSTEM_VERSION + 1)
     86 #define OPTION_STACK			(OPTION_SECTION_ALIGNMENT + 1)
     87 #define OPTION_SUBSYSTEM		(OPTION_STACK + 1)
     88 #define OPTION_HEAP			(OPTION_SUBSYSTEM + 1)
     89 
     90 static void
     91 gld${EMULATION_NAME}_add_options
     92   (int ns ATTRIBUTE_UNUSED, char **shortopts ATTRIBUTE_UNUSED, int nl,
     93    struct option **longopts, int nrl ATTRIBUTE_UNUSED,
     94    struct option **really_longopts ATTRIBUTE_UNUSED)
     95 {
     96   static const struct option xtra_long[] = {
     97     /* PE options */
     98     {"base-file", required_argument, NULL, OPTION_BASE_FILE},
     99     {"dll", no_argument, NULL, OPTION_DLL},
    100     {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
    101     {"heap", required_argument, NULL, OPTION_HEAP},
    102     {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
    103     {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
    104     {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
    105     {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
    106     {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
    107     {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
    108     {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
    109     {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
    110     {"stack", required_argument, NULL, OPTION_STACK},
    111     {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
    112     {NULL, no_argument, NULL, 0}
    113   };
    114 
    115   *longopts = (struct option *)
    116     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
    117   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
    118 }
    119 
    120 
    121 /* PE/WIN32; added routines to get the subsystem type, heap and/or stack
    122    parameters which may be input from the command line */
    123 
    124 typedef struct {
    125   void *ptr;
    126   int size;
    127   int value;
    128   char *symbol;
    129   int inited;
    130 } definfo;
    131 
    132 #define D(field,symbol,def)  {&pe.field,sizeof(pe.field), def, symbol,0}
    133 
    134 static definfo init[] =
    135 {
    136   /* imagebase must be first */
    137 #define IMAGEBASEOFF 0
    138   D(ImageBase,"__image_base__", BEOS_EXE_IMAGE_BASE),
    139 #define DLLOFF 1
    140   {&dll, sizeof(dll), 0, "__dll__", 0},
    141   D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT),
    142   D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT),
    143   D(MajorOperatingSystemVersion,"__major_os_version__", 4),
    144   D(MinorOperatingSystemVersion,"__minor_os_version__", 0),
    145   D(MajorImageVersion,"__major_image_version__", 1),
    146   D(MinorImageVersion,"__minor_image_version__", 0),
    147   D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
    148   D(MinorSubsystemVersion,"__minor_subsystem_version__", 0),
    149   D(Subsystem,"__subsystem__", 3),
    150   D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x2000000),
    151   D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000),
    152   D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000),
    153   D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000),
    154   D(LoaderFlags,"__loader_flags__", 0x0),
    155   { NULL, 0, 0, NULL, 0 }
    156 };
    157 
    158 
    159 static void
    160 set_pe_name (char *name, long val)
    161 {
    162   int i;
    163   /* Find the name and set it. */
    164   for (i = 0; init[i].ptr; i++)
    165     {
    166       if (strcmp (name, init[i].symbol) == 0)
    167 	{
    168 	  init[i].value = val;
    169 	  init[i].inited = 1;
    170 	  return;
    171 	}
    172     }
    173   abort();
    174 }
    175 
    176 
    177 static void
    178 set_pe_subsystem (void)
    179 {
    180   const char *sver;
    181   int len;
    182   int i;
    183   static const struct
    184     {
    185       const char *name;
    186       const int value;
    187       const char *entry;
    188     }
    189   v[] =
    190     {
    191       { "native", 1, "_NtProcessStartup" },
    192       { "windows", 2, "_WinMainCRTStartup" },
    193       { "wwindows", 2, "_wWinMainCRTStartup" },
    194       { "console", 3, "_mainCRTStartup" },
    195       { "wconsole", 3, "_wmainCRTStartup" },
    196       { "posix", 7, "___PosixProcessStartup"},
    197       { 0, 0, 0 }
    198     };
    199 
    200   sver = strchr (optarg, ':');
    201   if (sver == NULL)
    202     len = strlen (optarg);
    203   else
    204     {
    205       char *end;
    206 
    207       len = sver - optarg;
    208       set_pe_name ("__major_subsystem_version__",
    209 		   strtoul (sver + 1, &end, 0));
    210       if (*end == '.')
    211 	set_pe_name ("__minor_subsystem_version__",
    212 		     strtoul (end + 1, &end, 0));
    213       if (*end != '\0')
    214 	einfo (_("%P: warning: bad version number in -subsystem option\n"));
    215     }
    216 
    217   for (i = 0; v[i].name; i++)
    218     {
    219       if (strncmp (optarg, v[i].name, len) == 0
    220 	  && v[i].name[len] == '\0')
    221 	{
    222 	  set_pe_name ("__subsystem__", v[i].value);
    223 
    224 	  /* If the subsystem is windows, we use a different entry
    225 	     point.  */
    226 	  lang_default_entry (v[i].entry);
    227 
    228 	  return;
    229 	}
    230     }
    231   einfo (_("%F%P: invalid subsystem type %s\n"), optarg);
    232 }
    233 
    234 
    235 static void
    236 set_pe_value (char *name)
    237 {
    238   char *end;
    239   set_pe_name (name,  strtoul (optarg, &end, 0));
    240   if (end == optarg)
    241     {
    242       einfo (_("%F%P: invalid hex number for PE parameter '%s'\n"), optarg);
    243     }
    244 
    245   optarg = end;
    246 }
    247 
    248 static void
    249 set_pe_stack_heap (char *resname, char *comname)
    250 {
    251   set_pe_value (resname);
    252   if (*optarg == ',')
    253     {
    254       optarg++;
    255       set_pe_value (comname);
    256     }
    257   else if (*optarg)
    258     {
    259       einfo (_("%F%P: strange hex info for PE parameter '%s'\n"), optarg);
    260     }
    261 }
    262 
    263 
    264 static bool
    265 gld${EMULATION_NAME}_handle_option (int optc)
    266 {
    267   switch (optc)
    268     {
    269     default:
    270       return false;
    271 
    272     case OPTION_BASE_FILE:
    273       link_info.base_file = fopen (optarg, FOPEN_WB);
    274       if (link_info.base_file == NULL)
    275 	einfo (_("%F%P: cannot open base file %s\n"), optarg);
    276       break;
    277 
    278       /* PE options */
    279     case OPTION_HEAP:
    280       set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
    281       break;
    282     case OPTION_STACK:
    283       set_pe_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
    284       break;
    285     case OPTION_SUBSYSTEM:
    286       set_pe_subsystem ();
    287       break;
    288     case OPTION_MAJOR_OS_VERSION:
    289       set_pe_value ("__major_os_version__");
    290       break;
    291     case OPTION_MINOR_OS_VERSION:
    292       set_pe_value ("__minor_os_version__");
    293       break;
    294     case OPTION_MAJOR_SUBSYSTEM_VERSION:
    295       set_pe_value ("__major_subsystem_version__");
    296       break;
    297     case OPTION_MINOR_SUBSYSTEM_VERSION:
    298       set_pe_value ("__minor_subsystem_version__");
    299       break;
    300     case OPTION_MAJOR_IMAGE_VERSION:
    301       set_pe_value ("__major_image_version__");
    302       break;
    303     case OPTION_MINOR_IMAGE_VERSION:
    304       set_pe_value ("__minor_image_version__");
    305       break;
    306     case OPTION_FILE_ALIGNMENT:
    307       set_pe_value ("__file_alignment__");
    308       break;
    309     case OPTION_SECTION_ALIGNMENT:
    310       set_pe_value ("__section_alignment__");
    311       break;
    312     case OPTION_DLL:
    313       set_pe_name ("__dll__", 1);
    314       break;
    315     case OPTION_IMAGE_BASE:
    316       set_pe_value ("__image_base__");
    317       break;
    318     }
    319   return true;
    320 }
    321 
    323 /* Assign values to the special symbols before the linker script is
    324    read.  */
    325 
    326 static void
    327 gld${EMULATION_NAME}_set_symbols (void)
    328 {
    329   /* Run through and invent symbols for all the
    330      names and insert the defaults. */
    331   int j;
    332 
    333   if (!init[IMAGEBASEOFF].inited)
    334     {
    335       if (bfd_link_relocatable (&link_info))
    336 	init[IMAGEBASEOFF].value = 0;
    337       else if (init[DLLOFF].value)
    338 	init[IMAGEBASEOFF].value = BEOS_DLL_IMAGE_BASE;
    339       else
    340 	init[IMAGEBASEOFF].value = BEOS_EXE_IMAGE_BASE;
    341     }
    342 
    343   /* Don't do any symbol assignments if this is a relocatable link.  */
    344   if (bfd_link_relocatable (&link_info))
    345     return;
    346 
    347   /* Glue the assignments into the abs section */
    348   push_stat_ptr (&abs_output_section->children);
    349 
    350   for (j = 0; init[j].ptr; j++)
    351     {
    352       long val = init[j].value;
    353       lang_add_assignment (exp_assign (init[j].symbol, exp_intop (val),
    354 				       false));
    355       if (init[j].size == sizeof(short))
    356 	*(short *)init[j].ptr = val;
    357       else if (init[j].size == sizeof(int))
    358 	*(int *)init[j].ptr = val;
    359       else if (init[j].size == sizeof(long))
    360 	*(long *)init[j].ptr = val;
    361       /* This might be a long long or other special type.  */
    362       else if (init[j].size == sizeof(bfd_vma))
    363 	*(bfd_vma *)init[j].ptr = val;
    364       else	abort();
    365     }
    366   /* Restore the pointer. */
    367   pop_stat_ptr ();
    368 
    369   if (pe.FileAlignment >
    370       pe.SectionAlignment)
    371     {
    372       einfo (_("%P: warning, file alignment > section alignment\n"));
    373     }
    374 }
    375 
    376 static void
    377 gld${EMULATION_NAME}_after_open (void)
    378 {
    379   after_open_default ();
    380 
    381   /* Pass the wacky PE command line options into the output bfd.
    382      FIXME: This should be done via a function, rather than by
    383      including an internal BFD header.  */
    384   if (!obj_pe (link_info.output_bfd))
    385     {
    386       einfo (_("%F%P: PE operations on non PE file\n"));
    387     }
    388 
    389   pe_data(link_info.output_bfd)->pe_opthdr = pe;
    390   pe_data(link_info.output_bfd)->dll = init[DLLOFF].value;
    391 
    392 }
    393 
    395 /* Callback functions for qsort in sort_sections. */
    396 
    397 static int
    398 sort_by_file_name (const void *a, const void *b)
    399 {
    400   const lang_input_section_type *const *ra = a;
    401   const lang_input_section_type *const *rb = b;
    402   asection *sa = (*ra)->section;
    403   asection *sb = (*rb)->section;
    404   int i, a_sec, b_sec;
    405 
    406   i = filename_cmp (bfd_get_filename (sa->owner->my_archive),
    407 		    bfd_get_filename (sb->owner->my_archive));
    408   if (i != 0)
    409     return i;
    410 
    411   i = filename_cmp (bfd_get_filename (sa->owner),
    412 		    bfd_get_filename (sb->owner));
    413   if (i != 0)
    414     return i;
    415   /* the tail idata4/5 are the only ones without relocs to an
    416      idata$6 section unless we are importing by ordinal,
    417      so sort them to last to terminate the IAT
    418      and HNT properly. if no reloc this one is import by ordinal
    419      so we have to sort by section contents */
    420 
    421   if (sa->reloc_count + sb->reloc_count != 0)
    422     {
    423       i = sa->reloc_count > sb->reloc_count ? -1 : 0;
    424       if (i != 0)
    425 	return i;
    426 
    427       return sa->reloc_count > sb->reloc_count ? 0 : 1;
    428     }
    429   else
    430     {
    431       /* don't sort .idata$6 or .idata$7 FIXME dlltool eliminate .idata$7 */
    432       if ((strcmp (sa->name, ".idata$6") == 0))
    433 	return 0;
    434 
    435       if (!bfd_get_section_contents (sa->owner, sa, &a_sec, (file_ptr) 0,
    436 				     (bfd_size_type) sizeof (a_sec)))
    437 	einfo (_("%F%P: %pB: can't read contents of section .idata: %E\n"),
    438 	       sa->owner);
    439 
    440       if (!bfd_get_section_contents (sb->owner, sb, &b_sec, (file_ptr) 0,
    441 				     (bfd_size_type) sizeof (b_sec)))
    442 	einfo (_("%F%P: %pB: can't read contents of section .idata: %E\n"),
    443 	       sb->owner);
    444 
    445       i = a_sec < b_sec ? -1 : 0;
    446       if (i != 0)
    447 	return i;
    448       return a_sec < b_sec ? 0 : 1;
    449     }
    450   return 0;
    451 }
    452 
    453 static int
    454 sort_by_section_name (const void *a, const void *b)
    455 {
    456   const lang_input_section_type *const *ra = a;
    457   const lang_input_section_type *const *rb = b;
    458   const char *sna = (*ra)->section->name;
    459   const char *snb = (*rb)->section->name;
    460   int i;
    461   i = strcmp (sna, snb);
    462   /* This is a hack to make .stab and .stabstr last, so we don't have
    463      to fix strip/objcopy for .reloc sections.
    464      FIXME stripping images with a .rsrc section still needs to be fixed.  */
    465   if (i != 0)
    466     {
    467       if ((startswith (sna, ".stab"))
    468 	  && (!startswith (snb, ".stab")))
    469 	return 1;
    470     }
    471   return i;
    472 }
    473 
    474 /* Subroutine of sort_sections to a contiguous subset of a list of sections.
    475    NEXT_AFTER is the element after the last one to sort.
    476    The result is a pointer to the last element's "next" pointer.  */
    477 
    478 static lang_statement_union_type **
    479 sort_sections_1 (lang_statement_union_type **startptr,
    480 		 lang_statement_union_type *next_after,
    481 		 int count,
    482 		 int (*sort_func) (const void *, const void *))
    483 {
    484   lang_statement_union_type **vec;
    485   lang_statement_union_type *p;
    486   int i;
    487   lang_statement_union_type **ret;
    488 
    489   if (count == 0)
    490     return startptr;
    491 
    492   vec = ((lang_statement_union_type **)
    493 	 xmalloc (count * sizeof (lang_statement_union_type *)));
    494 
    495   for (p = *startptr, i = 0; i < count; i++, p = p->header.next)
    496     vec[i] = p;
    497 
    498   qsort (vec, count, sizeof (vec[0]), sort_func);
    499 
    500   /* Fill in the next pointers again. */
    501   *startptr = vec[0];
    502   for (i = 0; i < count - 1; i++)
    503     vec[i]->header.next = vec[i + 1];
    504   vec[i]->header.next = next_after;
    505   ret = &vec[i]->header.next;
    506   free (vec);
    507   return ret;
    508 }
    509 
    510 /* Sort the .idata\$foo input sections of archives into filename order.
    511    The reason is so dlltool can arrange to have the pe dll import information
    512    generated correctly - the head of the list goes into dh.o, the tail into
    513    dt.o, and the guts into ds[nnnn].o.  Note that this is only needed for the
    514    .idata section.
    515    FIXME: This may no longer be necessary with grouped sections.  Instead of
    516    sorting on dh.o, ds[nnnn].o, dt.o, one could, for example, have dh.o use
    517    .idata\$4h, have ds[nnnn].o use .idata\$4s[nnnn], and have dt.o use .idata\$4t.
    518    This would have to be elaborated upon to handle multiple dll's
    519    [assuming such an eloboration is possible of course].
    520 
    521    We also sort sections in '\$' wild statements.  These are created by the
    522    place_orphans routine to implement grouped sections.  */
    523 
    524 static void
    525 sort_sections (lang_statement_union_type *s)
    526 {
    527   for (; s ; s = s->header.next)
    528     switch (s->header.type)
    529       {
    530       case lang_output_section_statement_enum:
    531 	sort_sections (s->output_section_statement.children.head);
    532 	break;
    533       case lang_wild_statement_enum:
    534 	{
    535 	  lang_statement_union_type **p = &s->wild_statement.children.head;
    536 	  struct wildcard_list *sec;
    537 
    538 	  for (sec = s->wild_statement.section_list; sec; sec = sec->next)
    539 	    {
    540 	      /* Is this the .idata section?  */
    541 	      if (sec->spec.name != NULL
    542 		  && startswith (sec->spec.name, ".idata"))
    543 		{
    544 		  /* Sort the children.  We want to sort any objects in
    545 		     the same archive.  In order to handle the case of
    546 		     including a single archive multiple times, we sort
    547 		     all the children by archive name and then by object
    548 		     name.  After sorting them, we re-thread the pointer
    549 		     chain.  */
    550 
    551 		  while (*p)
    552 		    {
    553 		      lang_statement_union_type *start = *p;
    554 		      if (start->header.type != lang_input_section_enum
    555 			  || !start->input_section.section->owner->my_archive)
    556 			p = &(start->header.next);
    557 		      else
    558 			{
    559 			  lang_statement_union_type *end;
    560 			  int count;
    561 
    562 			  for (end = start, count = 0;
    563 			       end && (end->header.type
    564 				       == lang_input_section_enum);
    565 			       end = end->header.next)
    566 			    count++;
    567 
    568 			  p = sort_sections_1 (p, end, count,
    569 					       sort_by_file_name);
    570 			}
    571 		    }
    572 		  break;
    573 		}
    574 
    575 	      /* If this is a collection of grouped sections, sort them.
    576 		 The linker script must explicitly mention "*(.foo\$)" or
    577 		 "*(.foo\$*)".  Don't sort them if \$ is not the last
    578 		 character (not sure if this is really useful, but it
    579 		 allows explicitly mentioning some \$ sections and letting
    580 		 the linker handle the rest).  */
    581 	      if (sec->spec.name != NULL)
    582 		{
    583 		  char *q = strchr (sec->spec.name, '\$');
    584 
    585 		  if (q != NULL
    586 		      && (q[1] == '\0'
    587 			  || (q[1] == '*' && q[2] == '\0')))
    588 		    {
    589 		      lang_statement_union_type *end;
    590 		      int count;
    591 
    592 		      for (end = *p, count = 0; end; end = end->header.next)
    593 			{
    594 			  if (end->header.type != lang_input_section_enum)
    595 			    abort ();
    596 			  count++;
    597 			}
    598 		      (void) sort_sections_1 (p, end, count,
    599 					      sort_by_section_name);
    600 		    }
    601 		  break;
    602 		}
    603 	    }
    604 	}
    605 	break;
    606       default:
    607 	break;
    608       }
    609 }
    610 
    611 static void
    612 gld${EMULATION_NAME}_before_allocation (void)
    613 {
    614 #ifdef TARGET_IS_armpe
    615   /* FIXME: we should be able to set the size of the interworking stub
    616      section.
    617 
    618      Here we rummage through the found bfds to collect glue
    619      information.  FIXME: should this be based on a command line
    620      option?  krk (a] cygnus.com */
    621   {
    622     LANG_FOR_EACH_INPUT_STATEMENT (is)
    623     {
    624       if (!arm_process_before_allocation (is->the_bfd, & link_info))
    625 	{
    626 	  einfo (_("%P: errors encountered processing file %s\n"),
    627 		 is->filename);
    628 	}
    629     }
    630   }
    631 
    632   /* We have seen it all. Allocate it, and carry on */
    633   arm_allocate_interworking_sections (& link_info);
    634 #endif /* TARGET_IS_armpe */
    635 
    636   sort_sections (stat_ptr->head);
    637 
    638   before_allocation_default ();
    639 }
    640 
    642 /* Place an orphan section.  We use this to put sections with a '\$' in them
    643    into the right place.  Any section with a '\$' in them (e.g. .text\$foo)
    644    gets mapped to the output section with everything from the '\$' on stripped
    645    (e.g. .text).
    646    See the Microsoft Portable Executable and Common Object File Format
    647    Specification 4.1, section 4.2, Grouped Sections.
    648 
    649    FIXME: This is now handled by the linker script using wildcards,
    650    but I'm leaving this here in case we want to enable it for sections
    651    which are not mentioned in the linker script.  */
    652 
    653 static lang_output_section_statement_type *
    654 gld${EMULATION_NAME}_place_orphan (asection *s,
    655 				   const char *secname,
    656 				   int constraint)
    657 {
    658   char *output_secname, *ps;
    659   lang_output_section_statement_type *os;
    660   lang_statement_union_type *l;
    661 
    662   if ((s->flags & SEC_ALLOC) == 0)
    663     return NULL;
    664 
    665   /* Don't process grouped sections unless doing a final link.
    666      If they're marked as COMDAT sections, we don't want .text\$foo to
    667      end up in .text and then have .text disappear because it's marked
    668      link-once-discard.  */
    669   if (bfd_link_relocatable (&link_info))
    670     return NULL;
    671 
    672   /* Everything from the '\$' on gets deleted so don't allow '\$' as the
    673      first character.  */
    674   if (*secname == '\$')
    675     einfo (_("%F%P: section %s has '\$' as first character\n"), secname);
    676   if (strchr (secname + 1, '\$') == NULL)
    677     return NULL;
    678 
    679   /* Look up the output section.  The Microsoft specs say sections names in
    680      image files never contain a '\$'.  Fortunately, lang_..._lookup creates
    681      the section if it doesn't exist.  */
    682   output_secname = xstrdup (secname);
    683   ps = strchr (output_secname + 1, '\$');
    684   *ps = 0;
    685   os = lang_output_section_statement_lookup (output_secname, constraint, true);
    686 
    687   /* Find the '\$' wild statement for this section.  We currently require the
    688      linker script to explicitly mention "*(.foo\$)".  */
    689 
    690   ps[0] = '\$';
    691   ps[1] = 0;
    692   for (l = os->children.head; l; l = l->header.next)
    693     if (l->header.type == lang_wild_statement_enum)
    694       {
    695 	struct wildcard_list *sec;
    696 
    697 	for (sec = l->wild_statement.section_list; sec; sec = sec->next)
    698 	  if (sec->spec.name && strcmp (sec->spec.name, output_secname) == 0)
    699 	    break;
    700 	if (sec)
    701 	  break;
    702       }
    703   ps[0] = 0;
    704   if (l == NULL)
    705     einfo (_("%F%P: *(%s\$) missing from linker script\n"), output_secname);
    706 
    707   /* Link the input section in and we're done for now.
    708      The sections still have to be sorted, but that has to wait until
    709      all such sections have been processed by us.  The sorting is done by
    710      sort_sections.  */
    711   lang_add_section (&l->wild_statement.children, s, NULL, NULL, os);
    712 
    713   return os;
    714 }
    715 
    717 static char *
    718 gld${EMULATION_NAME}_get_script (int *isfile)
    719 EOF
    720 
    721 if test x"$COMPILE_IN" = xyes
    722 then
    723 # Scripts compiled in.
    724 
    725 # sed commands to quote an ld script as a C string.
    726 sc="-f ${srcdir}/emultempl/stringify.sed"
    727 
    728 fragment <<EOF
    729 {
    730   *isfile = 0;
    731 
    732   if (bfd_link_relocatable (&link_info) && config.build_constructors)
    733     return
    734 EOF
    735 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
    736 echo '  ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
    737 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
    738 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
    739 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
    740 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
    741 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
    742 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
    743 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
    744 echo '; }'                                             >> e${EMULATION_NAME}.c
    745 
    746 else
    747 # Scripts read from the filesystem.
    748 
    749 fragment <<EOF
    750 {
    751   *isfile = 1;
    752 
    753   if (bfd_link_relocatable (&link_info) && config.build_constructors)
    754     return "ldscripts/${EMULATION_NAME}.xu";
    755   else if (bfd_link_relocatable (&link_info))
    756     return "ldscripts/${EMULATION_NAME}.xr";
    757   else if (!config.text_read_only)
    758     return "ldscripts/${EMULATION_NAME}.xbn";
    759   else if (!config.magic_demand_paged)
    760     return "ldscripts/${EMULATION_NAME}.xn";
    761   else
    762     return "ldscripts/${EMULATION_NAME}.x";
    763 }
    764 EOF
    765 fi
    766 
    767 LDEMUL_AFTER_OPEN=gld${EMULATION_NAME}_after_open
    768 LDEMUL_BEFORE_ALLOCATION=gld${EMULATION_NAME}_before_allocation
    769 LDEMUL_PLACE_ORPHAN=gld${EMULATION_NAME}_place_orphan
    770 LDEMUL_SET_SYMBOLS=gld${EMULATION_NAME}_set_symbols
    771 LDEMUL_ADD_OPTIONS=gld${EMULATION_NAME}_add_options
    772 LDEMUL_HANDLE_OPTION=gld${EMULATION_NAME}_handle_option
    773 
    774 source_em ${srcdir}/emultempl/emulation.em
    775