Home | History | Annotate | Line # | Download | only in emultempl
beos.em revision 1.1.1.1
      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 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
     11    2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
     12 
     13    This file is part of the GNU Binutils.
     14 
     15    This program is free software; you can redistribute it and/or modify
     16    it under the terms of the GNU General Public License as published by
     17    the Free Software Foundation; either version 3 of the License, or
     18    (at your option) any later version.
     19 
     20    This program is distributed in the hope that it will be useful,
     21    but WITHOUT ANY WARRANTY; without even the implied warranty of
     22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     23    GNU General Public License for more details.
     24 
     25    You should have received a copy of the GNU General Public License
     26    along with this program; if not, write to the Free Software
     27    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     28    MA 02110-1301, USA.  */
     29 
     30 
     31 /* For WINDOWS_NT */
     32 /* The original file generated returned different default scripts depending
     33    on whether certain switches were set, but these switches pertain to the
     34    Linux system and that particular version of coff.  In the NT case, we
     35    only determine if the subsystem is console or windows in order to select
     36    the correct entry point by default. */
     37 
     38 #include "sysdep.h"
     39 #include "bfd.h"
     40 #include "bfdlink.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 ("%P%F: 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 ("%P%F: 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 ("%P%F: strange hex info for PE parameter '%s'\n", optarg);
    260     }
    261 }
    262 
    263 
    264 static bfd_boolean
    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 (link_info.relocatable)
    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 (link_info.relocatable)
    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 (!coff_data(link_info.output_bfd)->pe)
    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_statement_union_type *const *ra = a;
    401   const lang_statement_union_type *const *rb = b;
    402   int i, a_sec, b_sec;
    403 
    404   i = filename_cmp ((*ra)->input_section.section->owner->my_archive->filename,
    405 		    (*rb)->input_section.section->owner->my_archive->filename);
    406   if (i != 0)
    407     return i;
    408 
    409   i = filename_cmp ((*ra)->input_section.section->owner->filename,
    410 		    (*rb)->input_section.section->owner->filename);
    411   if (i != 0)
    412     return i;
    413   /* the tail idata4/5 are the only ones without relocs to an
    414      idata$6 section unless we are importing by ordinal,
    415      so sort them to last to terminate the IAT
    416      and HNT properly. if no reloc this one is import by ordinal
    417      so we have to sort by section contents */
    418 
    419   if ( ((*ra)->input_section.section->reloc_count + (*rb)->input_section.section->reloc_count) )
    420     {
    421        i =  (((*ra)->input_section.section->reloc_count >
    422 		 (*rb)->input_section.section->reloc_count) ? -1 : 0);
    423        if ( i != 0)
    424          return i;
    425 
    426         return  (((*ra)->input_section.section->reloc_count >
    427 		 (*rb)->input_section.section->reloc_count) ? 0 : 1);
    428     }
    429   else
    430     {
    431        if ( (strcmp( (*ra)->input_section.section->name, ".idata$6") == 0) )
    432           return 0; /* don't sort .idata$6 or .idata$7 FIXME dlltool eliminate .idata$7 */
    433 
    434        if (! bfd_get_section_contents ((*ra)->input_section.section->owner,
    435          (*ra)->input_section.section, &a_sec, (file_ptr) 0, (bfd_size_type)sizeof(a_sec)))
    436             einfo ("%F%B: Can't read contents of section .idata: %E\n",
    437                  (*ra)->input_section.section->owner);
    438 
    439        if (! bfd_get_section_contents ((*rb)->input_section.section->owner,
    440         (*rb)->input_section.section, &b_sec, (file_ptr) 0, (bfd_size_type)sizeof(b_sec) ))
    441            einfo ("%F%B: Can't read contents of section .idata: %E\n",
    442                 (*rb)->input_section.section->owner);
    443 
    444       i =  ((a_sec < b_sec) ? -1 : 0);
    445       if ( i != 0)
    446         return i;
    447       return  ((a_sec < b_sec) ? 0 : 1);
    448    }
    449 return 0;
    450 }
    451 
    452 static int
    453 sort_by_section_name (const void *a, const void *b)
    454 {
    455   const lang_statement_union_type *const *ra = a;
    456   const lang_statement_union_type *const *rb = b;
    457   int i;
    458   i = strcmp ((*ra)->input_section.section->name,
    459 	      (*rb)->input_section.section->name);
    460   /* This is a hack to make .stab and .stabstr last, so we don't have
    461      to fix strip/objcopy for .reloc sections.
    462      FIXME stripping images with a .rsrc section still needs to be fixed.  */
    463   if (i != 0)
    464     {
    465       if ((CONST_STRNEQ ((*ra)->input_section.section->name, ".stab"))
    466            && (! CONST_STRNEQ ((*rb)->input_section.section->name, ".stab")))
    467          return 1;
    468     }
    469   return i;
    470 }
    471 
    472 /* Subroutine of sort_sections to a contiguous subset of a list of sections.
    473    NEXT_AFTER is the element after the last one to sort.
    474    The result is a pointer to the last element's "next" pointer.  */
    475 
    476 static lang_statement_union_type **
    477 sort_sections_1 (lang_statement_union_type **startptr,
    478 		 lang_statement_union_type *next_after,
    479 		 int count,
    480 		 int (*sort_func) (const void *, const void *))
    481 {
    482   lang_statement_union_type **vec;
    483   lang_statement_union_type *p;
    484   int i;
    485   lang_statement_union_type **ret;
    486 
    487   if (count == 0)
    488     return startptr;
    489 
    490   vec = ((lang_statement_union_type **)
    491 	 xmalloc (count * sizeof (lang_statement_union_type *)));
    492 
    493   for (p = *startptr, i = 0; i < count; i++, p = p->header.next)
    494     vec[i] = p;
    495 
    496   qsort (vec, count, sizeof (vec[0]), sort_func);
    497 
    498   /* Fill in the next pointers again. */
    499   *startptr = vec[0];
    500   for (i = 0; i < count - 1; i++)
    501     vec[i]->header.next = vec[i + 1];
    502   vec[i]->header.next = next_after;
    503   ret = &vec[i]->header.next;
    504   free (vec);
    505   return ret;
    506 }
    507 
    508 /* Sort the .idata\$foo input sections of archives into filename order.
    509    The reason is so dlltool can arrange to have the pe dll import information
    510    generated correctly - the head of the list goes into dh.o, the tail into
    511    dt.o, and the guts into ds[nnnn].o.  Note that this is only needed for the
    512    .idata section.
    513    FIXME: This may no longer be necessary with grouped sections.  Instead of
    514    sorting on dh.o, ds[nnnn].o, dt.o, one could, for example, have dh.o use
    515    .idata\$4h, have ds[nnnn].o use .idata\$4s[nnnn], and have dt.o use .idata\$4t.
    516    This would have to be elaborated upon to handle multiple dll's
    517    [assuming such an eloboration is possible of course].
    518 
    519    We also sort sections in '\$' wild statements.  These are created by the
    520    place_orphans routine to implement grouped sections.  */
    521 
    522 static void
    523 sort_sections (lang_statement_union_type *s)
    524 {
    525   for (; s ; s = s->header.next)
    526     switch (s->header.type)
    527       {
    528       case lang_output_section_statement_enum:
    529 	sort_sections (s->output_section_statement.children.head);
    530 	break;
    531       case lang_wild_statement_enum:
    532 	{
    533 	  lang_statement_union_type **p = &s->wild_statement.children.head;
    534 	  struct wildcard_list *sec;
    535 
    536 	  for (sec = s->wild_statement.section_list; sec; sec = sec->next)
    537 	    {
    538 	      /* Is this the .idata section?  */
    539 	      if (sec->spec.name != NULL
    540 		  && CONST_STRNEQ (sec->spec.name, ".idata"))
    541 		{
    542 		  /* Sort the children.  We want to sort any objects in
    543 		     the same archive.  In order to handle the case of
    544 		     including a single archive multiple times, we sort
    545 		     all the children by archive name and then by object
    546 		     name.  After sorting them, we re-thread the pointer
    547 		     chain.  */
    548 
    549 		  while (*p)
    550 		    {
    551 		      lang_statement_union_type *start = *p;
    552 		      if (start->header.type != lang_input_section_enum
    553 			  || !start->input_section.section->owner->my_archive)
    554 			p = &(start->header.next);
    555 		      else
    556 			{
    557 			  lang_statement_union_type *end;
    558 			  int count;
    559 
    560 			  for (end = start, count = 0;
    561 			       end && (end->header.type
    562 				       == lang_input_section_enum);
    563 			       end = end->header.next)
    564 			    count++;
    565 
    566 			  p = sort_sections_1 (p, end, count,
    567 					       sort_by_file_name);
    568 			}
    569 		    }
    570 		  break;
    571 		}
    572 
    573 	      /* If this is a collection of grouped sections, sort them.
    574 		 The linker script must explicitly mention "*(.foo\$)" or
    575 		 "*(.foo\$*)".  Don't sort them if \$ is not the last
    576 		 character (not sure if this is really useful, but it
    577 		 allows explicitly mentioning some \$ sections and letting
    578 		 the linker handle the rest).  */
    579 	      if (sec->spec.name != NULL)
    580 		{
    581 		  char *q = strchr (sec->spec.name, '\$');
    582 
    583 		  if (q != NULL
    584 		      && (q[1] == '\0'
    585 			  || (q[1] == '*' && q[2] == '\0')))
    586 		    {
    587 		      lang_statement_union_type *end;
    588 		      int count;
    589 
    590 		      for (end = *p, count = 0; end; end = end->header.next)
    591 			{
    592 			  if (end->header.type != lang_input_section_enum)
    593 			    abort ();
    594 			  count++;
    595 			}
    596 		      (void) sort_sections_1 (p, end, count,
    597 					      sort_by_section_name);
    598 		    }
    599 		  break;
    600 		}
    601 	    }
    602 	}
    603 	break;
    604       default:
    605 	break;
    606       }
    607 }
    608 
    609 static void
    610 gld_${EMULATION_NAME}_before_allocation (void)
    611 {
    612 #ifdef TARGET_IS_ppcpe
    613   /* Here we rummage through the found bfds to collect toc information */
    614   {
    615     LANG_FOR_EACH_INPUT_STATEMENT (is)
    616       {
    617 	if (!ppc_process_before_allocation(is->the_bfd, &link_info))
    618 	  {
    619 	    einfo("Errors encountered processing file %s\n", is->filename);
    620 	  }
    621       }
    622   }
    623 
    624   /* We have seen it all. Allocate it, and carry on */
    625   ppc_allocate_toc_section (&link_info);
    626 #else
    627 #ifdef TARGET_IS_armpe
    628   /* FIXME: we should be able to set the size of the interworking stub
    629      section.
    630 
    631      Here we rummage through the found bfds to collect glue
    632      information.  FIXME: should this be based on a command line
    633      option?  krk (a] cygnus.com */
    634   {
    635     LANG_FOR_EACH_INPUT_STATEMENT (is)
    636       {
    637 	if (!arm_process_before_allocation (is->the_bfd, & link_info))
    638 	  {
    639 	    einfo ("Errors encountered processing file %s", is->filename);
    640 	  }
    641       }
    642   }
    643 
    644   /* We have seen it all. Allocate it, and carry on */
    645   arm_allocate_interworking_sections (& link_info);
    646 #endif /* TARGET_IS_armpe */
    647 #endif /* TARGET_IS_ppcpe */
    648 
    649   sort_sections (stat_ptr->head);
    650 
    651   before_allocation_default ();
    652 }
    653 
    655 /* Place an orphan section.  We use this to put sections with a '\$' in them
    656    into the right place.  Any section with a '\$' in them (e.g. .text\$foo)
    657    gets mapped to the output section with everything from the '\$' on stripped
    658    (e.g. .text).
    659    See the Microsoft Portable Executable and Common Object File Format
    660    Specification 4.1, section 4.2, Grouped Sections.
    661 
    662    FIXME: This is now handled by the linker script using wildcards,
    663    but I'm leaving this here in case we want to enable it for sections
    664    which are not mentioned in the linker script.  */
    665 
    666 static lang_output_section_statement_type *
    667 gld${EMULATION_NAME}_place_orphan (asection *s,
    668 				   const char *secname,
    669 				   int constraint)
    670 {
    671   char *output_secname, *ps;
    672   lang_output_section_statement_type *os;
    673   lang_statement_union_type *l;
    674 
    675   if ((s->flags & SEC_ALLOC) == 0)
    676     return NULL;
    677 
    678   /* Don't process grouped sections unless doing a final link.
    679      If they're marked as COMDAT sections, we don't want .text\$foo to
    680      end up in .text and then have .text disappear because it's marked
    681      link-once-discard.  */
    682   if (link_info.relocatable)
    683     return NULL;
    684 
    685   /* Everything from the '\$' on gets deleted so don't allow '\$' as the
    686      first character.  */
    687   if (*secname == '\$')
    688     einfo ("%P%F: section %s has '\$' as first character\n", secname);
    689   if (strchr (secname + 1, '\$') == NULL)
    690     return NULL;
    691 
    692   /* Look up the output section.  The Microsoft specs say sections names in
    693      image files never contain a '\$'.  Fortunately, lang_..._lookup creates
    694      the section if it doesn't exist.  */
    695   output_secname = xstrdup (secname);
    696   ps = strchr (output_secname + 1, '\$');
    697   *ps = 0;
    698   os = lang_output_section_statement_lookup (output_secname, constraint, TRUE);
    699 
    700   /* Find the '\$' wild statement for this section.  We currently require the
    701      linker script to explicitly mention "*(.foo\$)".
    702      FIXME: ppcpe.sc has .CRT\$foo in the .rdata section.  According to the
    703      Microsoft docs this isn't correct so it's not (currently) handled.  */
    704 
    705   ps[0] = '\$';
    706   ps[1] = 0;
    707   for (l = os->children.head; l; l = l->header.next)
    708     if (l->header.type == lang_wild_statement_enum)
    709       {
    710 	struct wildcard_list *sec;
    711 
    712 	for (sec = l->wild_statement.section_list; sec; sec = sec->next)
    713 	  if (sec->spec.name && strcmp (sec->spec.name, output_secname) == 0)
    714 	    break;
    715 	if (sec)
    716 	  break;
    717       }
    718   ps[0] = 0;
    719   if (l == NULL)
    720     einfo ("%P%F: *(%s\$) missing from linker script\n", output_secname);
    721 
    722   /* Link the input section in and we're done for now.
    723      The sections still have to be sorted, but that has to wait until
    724      all such sections have been processed by us.  The sorting is done by
    725      sort_sections.  */
    726   lang_add_section (&l->wild_statement.children, s, NULL, os);
    727 
    728   return os;
    729 }
    730 
    732 static char *
    733 gld_${EMULATION_NAME}_get_script (int *isfile)
    734 EOF
    735 # Scripts compiled in.
    736 # sed commands to quote an ld script as a C string.
    737 sc="-f stringify.sed"
    738 
    739 fragment <<EOF
    740 {
    741   *isfile = 0;
    742 
    743   if (link_info.relocatable && config.build_constructors)
    744     return
    745 EOF
    746 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
    747 echo '  ; else if (link_info.relocatable) return'     >> e${EMULATION_NAME}.c
    748 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
    749 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
    750 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
    751 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
    752 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
    753 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
    754 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
    755 echo '; }'                                             >> e${EMULATION_NAME}.c
    756 
    757 fragment <<EOF
    758 
    759 
    760 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
    761 {
    762   gld_${EMULATION_NAME}_before_parse,
    763   syslib_default,
    764   hll_default,
    765   after_parse_default,
    766   gld_${EMULATION_NAME}_after_open,
    767   after_allocation_default,
    768   set_output_arch_default,
    769   ldemul_default_target,
    770   gld_${EMULATION_NAME}_before_allocation,
    771   gld_${EMULATION_NAME}_get_script,
    772   "${EMULATION_NAME}",
    773   "${OUTPUT_FORMAT}",
    774   finish_default,
    775   NULL, /* create output section statements */
    776   NULL, /* open dynamic archive */
    777   gld${EMULATION_NAME}_place_orphan,
    778   gld_${EMULATION_NAME}_set_symbols,
    779   NULL, /* parse_args */
    780   gld${EMULATION_NAME}_add_options,
    781   gld${EMULATION_NAME}_handle_option,
    782   NULL,	/* unrecognized file */
    783   NULL,	/* list options */
    784   NULL,	/* recognized file */
    785   NULL,	/* find_potential_libraries */
    786   NULL	/* new_vers_pattern */
    787 };
    788 EOF
    789