Home | History | Annotate | Download | only in emultempl
      1 # This shell script emits a C file. -*- C -*-
      2 # It does some substitutions.
      3 fragment <<EOF
      4 /* This file is is generated by a shell script.  DO NOT EDIT! */
      5 
      6 /* Handle embedded relocs for m68k.
      7    Copyright (C) 2000-2014 Free Software Foundation, Inc.
      8    Written by Michael Sokolov <msokolov (a] ivan.Harhan.ORG>, based on generic.em
      9    by Steve Chamberlain <steve (a] cygnus.com>, embedded relocs code based on
     10    mipsecoff.em by Ian Lance Taylor <ian (a] cygnus.com> (now removed).
     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 #define TARGET_IS_${EMULATION_NAME}
     30 
     31 #include "sysdep.h"
     32 #include "bfd.h"
     33 #include "bfdlink.h"
     34 
     35 #include "ld.h"
     36 #include "ldmain.h"
     37 #include "ldexp.h"
     38 #include "ldlang.h"
     39 #include "ldfile.h"
     40 #include "ldemul.h"
     41 #include "ldmisc.h"
     42 
     43 static void check_sections (bfd *, asection *, void *);
     44 
     45 static void
     46 gld${EMULATION_NAME}_before_parse (void)
     47 {
     48 #ifndef TARGET_			/* I.e., if not generic.  */
     49   ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
     50 #endif /* not TARGET_ */
     51 }
     52 
     53 /* This function is run after all the input files have been opened.
     54    We create a .emreloc section for each input file with a non zero
     55    .data section.  The BFD backend will fill in these sections with
     56    magic numbers which can be used to relocate the data section at run
     57    time.  */
     58 
     59 static void
     60 gld${EMULATION_NAME}_after_open (void)
     61 {
     62   bfd *abfd;
     63 
     64   after_open_default ();
     65 
     66   if (! command_line.embedded_relocs
     67       || link_info.relocatable)
     68     return;
     69 
     70   for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
     71     {
     72       asection *datasec;
     73 
     74       /* As first-order business, make sure that each input BFD is COFF. It
     75          better be, as we are directly calling a COFF backend function.  */
     76       if (bfd_get_flavour (abfd) != bfd_target_coff_flavour)
     77 	einfo ("%F%B: all input objects must be COFF for --embedded-relocs\n");
     78 
     79       datasec = bfd_get_section_by_name (abfd, ".data");
     80 
     81       /* Note that we assume that the reloc_count field has already
     82          been set up.  We could call bfd_get_reloc_upper_bound, but
     83          that returns the size of a memory buffer rather than a reloc
     84          count.  We do not want to call bfd_canonicalize_reloc,
     85          because although it would always work it would force us to
     86          read in the relocs into BFD canonical form, which would waste
     87          a significant amount of time and memory.  */
     88       if (datasec != NULL && datasec->reloc_count > 0)
     89 	{
     90 	  asection *relsec;
     91 
     92 	  relsec = bfd_make_section_with_flags (abfd, ".emreloc",
     93 						(SEC_ALLOC
     94 						 | SEC_LOAD
     95 						 | SEC_HAS_CONTENTS
     96 						 | SEC_IN_MEMORY));
     97 	  if (relsec == NULL
     98 	      || ! bfd_set_section_alignment (abfd, relsec, 2)
     99 	      || ! bfd_set_section_size (abfd, relsec,
    100 					 datasec->reloc_count * 12))
    101 	    einfo ("%F%B: can not create .emreloc section: %E\n");
    102 	}
    103 
    104       /* Double check that all other data sections are empty, as is
    105          required for embedded PIC code.  */
    106       bfd_map_over_sections (abfd, check_sections, datasec);
    107     }
    108 }
    109 
    110 /* Check that of the data sections, only the .data section has
    111    relocs.  This is called via bfd_map_over_sections.  */
    112 
    113 static void
    114 check_sections (bfd *abfd, asection *sec, void *datasec)
    115 {
    116   if ((bfd_get_section_flags (abfd, sec) & SEC_DATA)
    117       && sec != datasec
    118       && sec->reloc_count != 0)
    119     einfo ("%B%X: section %s has relocs; can not use --embedded-relocs\n",
    120 	   abfd, bfd_get_section_name (abfd, sec));
    121 }
    122 
    123 /* This function is called after the section sizes and offsets have
    124    been set.  If we are generating embedded relocs, it calls a special
    125    BFD backend routine to do the work.  */
    126 
    127 static void
    128 gld${EMULATION_NAME}_after_allocation (void)
    129 {
    130   bfd *abfd;
    131 
    132   if (! command_line.embedded_relocs
    133       || link_info.relocatable)
    134     return;
    135 
    136   for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
    137     {
    138       asection *datasec, *relsec;
    139       char *errmsg;
    140 
    141       datasec = bfd_get_section_by_name (abfd, ".data");
    142 
    143       if (datasec == NULL || datasec->reloc_count == 0)
    144 	continue;
    145 
    146       relsec = bfd_get_section_by_name (abfd, ".emreloc");
    147       ASSERT (relsec != NULL);
    148 
    149       if (! bfd_m68k_coff_create_embedded_relocs (abfd, &link_info,
    150 						   datasec, relsec,
    151 						   &errmsg))
    152 	{
    153 	  if (errmsg == NULL)
    154 	    einfo ("%B%X: can not create runtime reloc information: %E\n",
    155 		   abfd);
    156 	  else
    157 	    einfo ("%X%B: can not create runtime reloc information: %s\n",
    158 		   abfd, errmsg);
    159 	}
    160     }
    161 }
    162 
    163 static char *
    164 gld${EMULATION_NAME}_get_script (int *isfile)
    165 EOF
    166 
    167 if test x"$COMPILE_IN" = xyes
    168 then
    169 # Scripts compiled in.
    170 
    171 # sed commands to quote an ld script as a C string.
    172 sc="-f stringify.sed"
    173 
    174 fragment <<EOF
    175 {
    176   *isfile = 0;
    177 
    178   if (link_info.relocatable && config.build_constructors)
    179     return
    180 EOF
    181 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
    182 echo '  ; else if (link_info.relocatable) return'     >> e${EMULATION_NAME}.c
    183 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
    184 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
    185 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
    186 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
    187 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
    188 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
    189 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
    190 echo '; }'                                             >> e${EMULATION_NAME}.c
    191 
    192 else
    193 # Scripts read from the filesystem.
    194 
    195 fragment <<EOF
    196 {
    197   *isfile = 1;
    198 
    199   if (link_info.relocatable && config.build_constructors)
    200     return "ldscripts/${EMULATION_NAME}.xu";
    201   else if (link_info.relocatable)
    202     return "ldscripts/${EMULATION_NAME}.xr";
    203   else if (!config.text_read_only)
    204     return "ldscripts/${EMULATION_NAME}.xbn";
    205   else if (!config.magic_demand_paged)
    206     return "ldscripts/${EMULATION_NAME}.xn";
    207   else
    208     return "ldscripts/${EMULATION_NAME}.x";
    209 }
    210 EOF
    211 
    212 fi
    213 
    214 fragment <<EOF
    215 
    216 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
    217 {
    218   gld${EMULATION_NAME}_before_parse,
    219   syslib_default,
    220   hll_default,
    221   after_parse_default,
    222   gld${EMULATION_NAME}_after_open,
    223   gld${EMULATION_NAME}_after_allocation,
    224   set_output_arch_default,
    225   ldemul_default_target,
    226   before_allocation_default,
    227   gld${EMULATION_NAME}_get_script,
    228   "${EMULATION_NAME}",
    229   "${OUTPUT_FORMAT}",
    230   finish_default,
    231   NULL,	/* create output section statements */
    232   NULL,	/* open dynamic archive */
    233   NULL,	/* place orphan */
    234   NULL,	/* set symbols */
    235   NULL,	/* parse args */
    236   NULL,	/* add_options */
    237   NULL,	/* handle_option */
    238   NULL,	/* unrecognized file */
    239   NULL,	/* list options */
    240   NULL,	/* recognized file */
    241   NULL,	/* find_potential_libraries */
    242   NULL,	/* new_vers_pattern */
    243   NULL	/* extra_map_file_text */
    244 };
    245 EOF
    246