linux.em revision 89857
1# This shell script emits a C file. -*- C -*- 2# It does some substitutions. 3if [ -z "$MACHINE" ]; then 4 OUTPUT_ARCH=${ARCH} 5else 6 OUTPUT_ARCH=${ARCH}:${MACHINE} 7fi 8cat >e${EMULATION_NAME}.c <<EOF 9/* This file is is generated by a shell script. DO NOT EDIT! */ 10 11/* Linux a.out emulation code for ${EMULATION_NAME} 12 Copyright 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000 13 Free Software Foundation, Inc. 14 Written by Steve Chamberlain <sac@cygnus.com> 15 Linux support by Eric Youngdale <ericy@cais.cais.com> 16 17This file is part of GLD, the Gnu Linker. 18 19This program is free software; you can redistribute it and/or modify 20it under the terms of the GNU General Public License as published by 21the Free Software Foundation; either version 2 of the License, or 22(at your option) any later version. 23 24This program is distributed in the hope that it will be useful, 25but WITHOUT ANY WARRANTY; without even the implied warranty of 26MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27GNU General Public License for more details. 28 29You should have received a copy of the GNU General Public License 30along with this program; if not, write to the Free Software 31Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 32 33#define TARGET_IS_${EMULATION_NAME} 34 35#include "bfd.h" 36#include "sysdep.h" 37#include "bfdlink.h" 38 39#include "ld.h" 40#include "ldmain.h" 41#include "ldmisc.h" 42#include "ldexp.h" 43#include "ldlang.h" 44#include "ldfile.h" 45#include "ldemul.h" 46 47static void gld${EMULATION_NAME}_before_parse PARAMS ((void)); 48static boolean gld${EMULATION_NAME}_open_dynamic_archive 49 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *)); 50static void gld${EMULATION_NAME}_find_address_statement 51 PARAMS ((lang_statement_union_type *)); 52static void gld${EMULATION_NAME}_create_output_section_statements 53 PARAMS ((void)); 54static void gld${EMULATION_NAME}_before_allocation PARAMS ((void)); 55static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile)); 56 57static void 58gld${EMULATION_NAME}_before_parse() 59{ 60 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}"); 61 if (arch) 62 { 63 ldfile_output_architecture = arch->arch; 64 ldfile_output_machine = arch->mach; 65 ldfile_output_machine_name = arch->printable_name; 66 } 67 else 68 ldfile_output_architecture = bfd_arch_${ARCH}; 69 config.dynamic_link = true; 70 config.has_shared = true; 71} 72 73/* Try to open a dynamic archive. This is where we know that Linux 74 dynamic libraries have an extension of .sa. */ 75 76static boolean 77gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry) 78 const char *arch; 79 search_dirs_type *search; 80 lang_input_statement_type *entry; 81{ 82 char *string; 83 84 if (! entry->is_archive) 85 return false; 86 87 string = (char *) xmalloc (strlen (search->name) 88 + strlen (entry->filename) 89 + strlen (arch) 90 + sizeof "/lib.sa"); 91 92 sprintf (string, "%s/lib%s%s.sa", search->name, entry->filename, arch); 93 94 if (! ldfile_try_open_bfd (string, entry)) 95 { 96 free (string); 97 return false; 98 } 99 100 entry->filename = string; 101 102 return true; 103} 104 105/* This is called by the create_output_section_statements routine via 106 lang_for_each_statement. It locates any address assignment to 107 .text, and modifies it to include the size of the headers. This 108 causes -Ttext to mean the starting address of the header, rather 109 than the starting address of .text, which is compatible with other 110 Linux tools. */ 111 112static void 113gld${EMULATION_NAME}_find_address_statement (s) 114 lang_statement_union_type *s; 115{ 116 if (s->header.type == lang_address_statement_enum 117 && strcmp (s->address_statement.section_name, ".text") == 0) 118 { 119 ASSERT (s->address_statement.address->type.node_class == etree_value); 120 s->address_statement.address->value.value += 0x20; 121 } 122} 123 124/* This is called before opening the input BFD's. */ 125 126static void 127gld${EMULATION_NAME}_create_output_section_statements () 128{ 129 lang_for_each_statement (gld${EMULATION_NAME}_find_address_statement); 130} 131 132/* This is called after the sections have been attached to output 133 sections, but before any sizes or addresses have been set. */ 134 135static void 136gld${EMULATION_NAME}_before_allocation () 137{ 138 if (link_info.relocateable) 139 return; 140 141 /* Let the backend work out the sizes of any sections required by 142 dynamic linking. */ 143 if (! bfd_${EMULATION_NAME}_size_dynamic_sections (output_bfd, &link_info)) 144 einfo ("%P%F: failed to set dynamic section sizes: %E\n"); 145} 146 147static char * 148gld${EMULATION_NAME}_get_script(isfile) 149 int *isfile; 150EOF 151 152if test -n "$COMPILE_IN" 153then 154# Scripts compiled in. 155 156# sed commands to quote an ld script as a C string. 157sc="-f stringify.sed" 158 159cat >>e${EMULATION_NAME}.c <<EOF 160{ 161 *isfile = 0; 162 163 if (link_info.relocateable == true && config.build_constructors == true) 164 return 165EOF 166sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c 167echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c 168sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c 169echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c 170sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c 171echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c 172sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c 173echo ' ; else return' >> e${EMULATION_NAME}.c 174sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c 175echo '; }' >> e${EMULATION_NAME}.c 176 177else 178# Scripts read from the filesystem. 179 180cat >>e${EMULATION_NAME}.c <<EOF 181{ 182 *isfile = 1; 183 184 if (link_info.relocateable == true && config.build_constructors == true) 185 return "ldscripts/${EMULATION_NAME}.xu"; 186 else if (link_info.relocateable == true) 187 return "ldscripts/${EMULATION_NAME}.xr"; 188 else if (!config.text_read_only) 189 return "ldscripts/${EMULATION_NAME}.xbn"; 190 else if (!config.magic_demand_paged) 191 return "ldscripts/${EMULATION_NAME}.xn"; 192 else 193 return "ldscripts/${EMULATION_NAME}.x"; 194} 195EOF 196 197fi 198 199cat >>e${EMULATION_NAME}.c <<EOF 200 201struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = 202{ 203 gld${EMULATION_NAME}_before_parse, 204 syslib_default, 205 hll_default, 206 after_parse_default, 207 after_open_default, 208 after_allocation_default, 209 set_output_arch_default, 210 ldemul_default_target, 211 gld${EMULATION_NAME}_before_allocation, 212 gld${EMULATION_NAME}_get_script, 213 "${EMULATION_NAME}", 214 "${OUTPUT_FORMAT}", 215 NULL, /* finish */ 216 gld${EMULATION_NAME}_create_output_section_statements, 217 gld${EMULATION_NAME}_open_dynamic_archive, 218 NULL, /* place orphan */ 219 NULL, /* set symbols */ 220 NULL, /* parse args */ 221 NULL, /* unrecognized file */ 222 NULL, /* list options */ 223 NULL, /* recognized file */ 224 NULL /* find_potential_libraries */ 225}; 226EOF 227