1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 cat >e${EMULATION_NAME}.c <<EOF
4 /* This file is is generated by a shell script. DO NOT EDIT! */
6 /* 32 bit ELF emulation code for ${EMULATION_NAME}
7 Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
8 Written by Steve Chamberlain <sac@cygnus.com>
9 ELF support by Ian Lance Taylor <ian@cygnus.com>
11 This file is part of GLD, the Gnu Linker.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
27 #define TARGET_IS_${EMULATION_NAME}
46 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
47 static boolean gld${EMULATION_NAME}_open_dynamic_archive
48 PARAMS ((const char *, lang_input_statement_type *));
49 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
50 static void gld${EMULATION_NAME}_find_statement_assignment
51 PARAMS ((lang_statement_union_type *));
52 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
53 static boolean gld${EMULATION_NAME}_place_orphan
54 PARAMS ((lang_input_statement_type *, asection *));
55 static void gld${EMULATION_NAME}_place_section
56 PARAMS ((lang_statement_union_type *));
57 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
60 gld${EMULATION_NAME}_before_parse()
62 ldfile_output_architecture = bfd_arch_${ARCH};
63 config.dynamic_link = ${DYNAMIC_LINK-true};
66 /* Try to open a dynamic archive. This is where we know that ELF
67 dynamic libraries have an extension of .so. */
70 gld${EMULATION_NAME}_open_dynamic_archive (arch, entry)
72 lang_input_statement_type *entry;
76 filename = entry->filename;
78 if (! ldfile_open_file_search (arch, entry, "lib", ".so"))
81 /* We have found a dynamic object to include in the link. The ELF
82 backend linker will create a DT_NEEDED entry in the .dynamic
83 section naming this file. If this file includes a DT_SONAME
84 entry, it will be used. Otherwise, the ELF linker will just use
85 the name of the file. For an archive found by searching, like
86 this one, the DT_NEEDED entry should consist of just the name of
87 the file, without the path information used to find it. Note
88 that we only need to do this if we have a dynamic object; an
89 archive will never be referenced by a DT_NEEDED entry.
91 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
92 very pretty. I haven't been able to think of anything that is
94 if (bfd_check_format (entry->the_bfd, bfd_object)
95 && (entry->the_bfd->flags & DYNAMIC) != 0)
99 ASSERT (entry->is_archive && entry->search_dirs_flag);
100 needed_name = (char *) xmalloc (strlen (filename)
103 sprintf (needed_name, "lib%s%s.so", filename, arch);
104 bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
110 /* This is called after the sections have been attached to output
111 sections, but before any sizes or addresses have been set. */
114 gld${EMULATION_NAME}_before_allocation ()
117 lang_input_statement_type *is;
119 /* If we are going to make any variable assignments, we need to let
120 the ELF backend know about them in case the variables are
121 referred to by dynamic objects. */
122 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
124 /* Let the ELF backend work out the sizes of any sections required
125 by dynamic linking. */
126 if (! bfd_elf32_size_dynamic_sections (output_bfd,
129 command_line.export_dynamic,
132 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
134 /* Let the user override the dynamic linker we are using. */
135 if (command_line.interpreter != NULL
138 sinterp->contents = (bfd_byte *) command_line.interpreter;
139 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
142 /* Look for any sections named .gnu.warning. As a GNU extensions,
143 we treat such sections as containing warning messages. We print
144 out the warning message, and then zero out the section size so
145 that it does not get copied into the output file. */
148 LANG_FOR_EACH_INPUT_STATEMENT (is)
155 if (is->just_syms_flag)
158 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
162 sz = bfd_section_size (is->the_bfd, s);
163 msg = xmalloc ((size_t) sz + 1);
164 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
165 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
168 ret = link_info.callbacks->warning (&link_info, msg);
172 /* Clobber the section size, so that we don't waste copying the
173 warning into the output file. */
179 /* This is called by the before_allocation routine via
180 lang_for_each_statement. It locates any assignment statements, and
181 tells the ELF backend about them, in case they are assignments to
182 symbols which are referred to by dynamic objects. */
185 gld${EMULATION_NAME}_find_statement_assignment (s)
186 lang_statement_union_type *s;
188 if (s->header.type == lang_assignment_statement_enum)
189 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
192 /* Look through an expression for an assignment statement. */
195 gld${EMULATION_NAME}_find_exp_assignment (exp)
198 switch (exp->type.node_class)
201 if (strcmp (exp->assign.dst, ".") != 0)
203 if (! bfd_elf32_record_link_assignment (output_bfd, &link_info,
205 einfo ("%P%F: failed to record assignment to %s: %E\n",
208 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
212 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
213 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
217 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
218 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
219 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
223 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
231 /* Place an orphan section. We use this to put random SHF_ALLOC
232 sections in the right segment. */
234 static asection *hold_section;
235 static lang_output_section_statement_type *hold_use;
236 static lang_output_section_statement_type *hold_text;
237 static lang_output_section_statement_type *hold_data;
238 static lang_output_section_statement_type *hold_bss;
242 gld${EMULATION_NAME}_place_orphan (file, s)
243 lang_input_statement_type *file;
246 lang_output_section_statement_type *place;
247 asection *snew, **pps;
248 lang_statement_list_type *old;
249 lang_statement_list_type add;
251 const char *secname, *ps;
252 lang_output_section_statement_type *os;
254 if ((s->flags & SEC_ALLOC) == 0)
257 /* Look through the script to see where to place this section. */
260 lang_for_each_statement (gld${EMULATION_NAME}_place_section);
262 if (hold_use != NULL)
264 /* We have already placed a section with this name. */
265 wild_doit (&hold_use->children, s, hold_use, file);
269 /* Decide which segment the section should go in based on the
272 if ((s->flags & SEC_HAS_CONTENTS) == 0
275 else if ((s->flags & SEC_READONLY) == 0
276 && hold_data != NULL)
278 else if ((s->flags & SEC_READONLY) != 0
279 && hold_text != NULL)
284 secname = bfd_get_section_name (s->owner, s);
286 /* When generating an object which is to be dynamically linked, we
287 do not support orphaned reloc sections. This is because all the
288 reloc sections must be contiguous in order to generate correct
289 DT_REL entries. When this case arises, you can just add the
290 appropriate reloc sections to the linker script. Note that the
291 .rel.plt section must always be the last reloc section. FIXME:
292 This should simply be handled correctly here. */
293 ASSERT (strncmp (secname, ".rel", 4) != 0
294 || bfd_get_section_by_name (output_bfd, ".dynamic") == NULL);
296 /* Create the section in the output file, and put it in the right
297 place. This shuffling to make the output file look neater, and
298 also means that the BFD backend does not have to sort the
299 sections in order by address. */
300 snew = bfd_make_section (output_bfd, secname);
302 einfo ("%P%F: output format %s cannot represent section called %s\n",
303 output_bfd->xvec->name, secname);
304 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
307 snew->next = place->bfd_section->next;
308 place->bfd_section->next = snew;
310 /* Start building a list of statements for this section. */
313 lang_list_init (stat_ptr);
315 /* If the name of the section is representable in C, then create
316 symbols to mark the start and the end of the section. */
317 for (ps = secname; *ps != '\0'; ps++)
318 if (! isalnum (*ps) && *ps != '_')
320 if (*ps == '\0' && config.build_constructors)
324 symname = (char *) xmalloc (ps - secname + sizeof "__start_");
325 sprintf (symname, "__start_%s", secname);
326 lang_add_assignment (exp_assop ('=', symname,
327 exp_nameop (NAME, ".")));
330 if (! link_info.relocateable)
333 address = exp_intop ((bfd_vma) 0);
335 lang_enter_output_section_statement (secname, address, 0,
339 (etree_type *) NULL);
341 os = lang_output_section_statement_lookup (secname);
342 wild_doit (&os->children, s, os, file);
344 lang_leave_output_section_statement ((bfd_vma) 0, "*default*");
347 if (*ps == '\0' && config.build_constructors)
351 symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
352 sprintf (symname, "__stop_%s", secname);
353 lang_add_assignment (exp_assop ('=', symname,
354 exp_nameop (NAME, ".")));
357 /* Now stick the new statement list right after PLACE. */
358 *add.tail = place->header.next;
359 place->header.next = add.head;
367 gld${EMULATION_NAME}_place_section (s)
368 lang_statement_union_type *s;
370 lang_output_section_statement_type *os;
372 if (s->header.type != lang_output_section_statement_enum)
375 os = &s->output_section_statement;
377 if (strcmp (os->name, hold_section->name) == 0)
380 if (strcmp (os->name, ".text") == 0)
382 else if (strcmp (os->name, ".data") == 0)
384 else if (strcmp (os->name, ".bss") == 0)
389 gld${EMULATION_NAME}_get_script(isfile)
393 if test -n "$COMPILE_IN"
395 # Scripts compiled in.
397 # sed commands to quote an ld script as a C string.
404 cat >>e${EMULATION_NAME}.c <<EOF
408 if (link_info.relocateable == true && config.build_constructors == true)
409 return `sed "$sc" ldscripts/${EMULATION_NAME}.xu`;
410 else if (link_info.relocateable == true)
411 return `sed "$sc" ldscripts/${EMULATION_NAME}.xr`;
412 else if (!config.text_read_only)
413 return `sed "$sc" ldscripts/${EMULATION_NAME}.xbn`;
414 else if (!config.magic_demand_paged)
415 return `sed "$sc" ldscripts/${EMULATION_NAME}.xn`;
416 else if (link_info.shared)
417 return `sed "$sc" ldscripts/${EMULATION_NAME}.xs`;
419 return `sed "$sc" ldscripts/${EMULATION_NAME}.x`;
424 # Scripts read from the filesystem.
426 cat >>e${EMULATION_NAME}.c <<EOF
430 if (link_info.relocateable == true && config.build_constructors == true)
431 return "ldscripts/${EMULATION_NAME}.xu";
432 else if (link_info.relocateable == true)
433 return "ldscripts/${EMULATION_NAME}.xr";
434 else if (!config.text_read_only)
435 return "ldscripts/${EMULATION_NAME}.xbn";
436 else if (!config.magic_demand_paged)
437 return "ldscripts/${EMULATION_NAME}.xn";
438 else if (link_info.shared)
439 return "ldscripts/${EMULATION_NAME}.xs";
441 return "ldscripts/${EMULATION_NAME}.x";
447 cat >>e${EMULATION_NAME}.c <<EOF
449 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
451 gld${EMULATION_NAME}_before_parse,
456 after_allocation_default,
457 set_output_arch_default,
458 ldemul_default_target,
459 gld${EMULATION_NAME}_before_allocation,
460 gld${EMULATION_NAME}_get_script,
465 gld${EMULATION_NAME}_open_dynamic_archive,
466 gld${EMULATION_NAME}_place_orphan