* ld-elf/sec-to-seg.exp (B_test_same_seg): Clear for i960,
[deliverable/binutils-gdb.git] / ld / ldemul.c
CommitLineData
252b5132 1/* ldemul.c -- clearing house for ld emulation states
aef6203b 2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
eaeb0a9d 3 2001, 2002, 2003, 2005, 2007, 2008, 2009
87f2a346 4 Free Software Foundation, Inc.
252b5132 5
f96b4a7b
NC
6 This file is part of the GNU Binutils.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
252b5132 22
252b5132 23#include "sysdep.h"
3db64b00 24#include "bfd.h"
fcf65871 25#include "getopt.h"
8423293d 26#include "bfdlink.h"
252b5132
RH
27
28#include "ld.h"
252b5132
RH
29#include "ldmisc.h"
30#include "ldexp.h"
31#include "ldlang.h"
32#include "ldfile.h"
b71e2778 33#include "ldemul.h"
252b5132
RH
34#include "ldmain.h"
35#include "ldemul-list.h"
36
279e75dc 37static ld_emulation_xfer_type *ld_emulation;
252b5132
RH
38
39void
62b635b6 40ldemul_hll (char *name)
252b5132 41{
4de2d33d 42 ld_emulation->hll (name);
252b5132
RH
43}
44
4de2d33d 45void
62b635b6 46ldemul_syslib (char *name)
252b5132 47{
4de2d33d 48 ld_emulation->syslib (name);
252b5132
RH
49}
50
51void
62b635b6 52ldemul_after_parse (void)
252b5132 53{
4de2d33d 54 ld_emulation->after_parse ();
252b5132
RH
55}
56
57void
62b635b6 58ldemul_before_parse (void)
252b5132 59{
4de2d33d 60 ld_emulation->before_parse ();
252b5132
RH
61}
62
63void
62b635b6 64ldemul_after_open (void)
252b5132
RH
65{
66 ld_emulation->after_open ();
67}
68
4de2d33d 69void
62b635b6 70ldemul_after_allocation (void)
252b5132 71{
4de2d33d 72 ld_emulation->after_allocation ();
252b5132
RH
73}
74
4de2d33d 75void
62b635b6 76ldemul_before_allocation (void)
252b5132 77{
8423293d 78 ld_emulation->before_allocation ();
252b5132
RH
79}
80
252b5132 81void
62b635b6 82ldemul_set_output_arch (void)
252b5132 83{
4de2d33d 84 ld_emulation->set_output_arch ();
252b5132
RH
85}
86
87void
62b635b6 88ldemul_finish (void)
252b5132 89{
1e035701 90 ld_emulation->finish ();
252b5132
RH
91}
92
93void
62b635b6 94ldemul_set_symbols (void)
252b5132
RH
95{
96 if (ld_emulation->set_symbols)
4de2d33d 97 ld_emulation->set_symbols ();
252b5132
RH
98}
99
100void
62b635b6 101ldemul_create_output_section_statements (void)
252b5132
RH
102{
103 if (ld_emulation->create_output_section_statements)
4de2d33d 104 ld_emulation->create_output_section_statements ();
252b5132
RH
105}
106
107char *
62b635b6 108ldemul_get_script (int *isfile)
252b5132 109{
4de2d33d 110 return ld_emulation->get_script (isfile);
252b5132
RH
111}
112
b34976b6 113bfd_boolean
62b635b6
KH
114ldemul_open_dynamic_archive (const char *arch, search_dirs_type *search,
115 lang_input_statement_type *entry)
252b5132
RH
116{
117 if (ld_emulation->open_dynamic_archive)
118 return (*ld_emulation->open_dynamic_archive) (arch, search, entry);
b34976b6 119 return FALSE;
252b5132
RH
120}
121
c2edb4b8 122lang_output_section_statement_type *
8a99a385 123ldemul_place_orphan (asection *s, const char *name, int constraint)
252b5132
RH
124{
125 if (ld_emulation->place_orphan)
8a99a385 126 return (*ld_emulation->place_orphan) (s, name, constraint);
c2edb4b8 127 return NULL;
252b5132
RH
128}
129
3bcf5557 130void
62b635b6
KH
131ldemul_add_options (int ns, char **shortopts, int nl,
132 struct option **longopts, int nrl,
133 struct option **really_longopts)
3bcf5557
AM
134{
135 if (ld_emulation->add_options)
136 (*ld_emulation->add_options) (ns, shortopts, nl, longopts,
137 nrl, really_longopts);
138}
139
140bfd_boolean
62b635b6 141ldemul_handle_option (int optc)
3bcf5557
AM
142{
143 if (ld_emulation->handle_option)
144 return (*ld_emulation->handle_option) (optc);
145 return FALSE;
146}
147
148bfd_boolean
62b635b6 149ldemul_parse_args (int argc, char **argv)
252b5132 150{
4de2d33d 151 /* Try and use the emulation parser if there is one. */
252b5132 152 if (ld_emulation->parse_args)
3bcf5557 153 return (*ld_emulation->parse_args) (argc, argv);
3aa97c58 154 return FALSE;
252b5132
RH
155}
156
157/* Let the emulation code handle an unrecognized file. */
158
b34976b6 159bfd_boolean
62b635b6 160ldemul_unrecognized_file (lang_input_statement_type *entry)
252b5132
RH
161{
162 if (ld_emulation->unrecognized_file)
163 return (*ld_emulation->unrecognized_file) (entry);
b34976b6 164 return FALSE;
252b5132
RH
165}
166
167/* Let the emulation code handle a recognized file. */
168
b34976b6 169bfd_boolean
62b635b6 170ldemul_recognized_file (lang_input_statement_type *entry)
252b5132
RH
171{
172 if (ld_emulation->recognized_file)
173 return (*ld_emulation->recognized_file) (entry);
b34976b6 174 return FALSE;
252b5132
RH
175}
176
177char *
62b635b6 178ldemul_choose_target (int argc, char **argv)
252b5132 179{
742aeb63 180 return ld_emulation->choose_target (argc, argv);
252b5132
RH
181}
182
742aeb63 183
252b5132
RH
184/* The default choose_target function. */
185
186char *
62b635b6 187ldemul_default_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
252b5132
RH
188{
189 char *from_outside = getenv (TARGET_ENVIRON);
4de2d33d 190 if (from_outside != (char *) NULL)
252b5132
RH
191 return from_outside;
192 return ld_emulation->target_name;
193}
194
97b11f40
AM
195/* If the entry point was not specified as an address, then add the
196 symbol as undefined. This will cause ld to extract an archive
197 element defining the entry if ld is linking against such an archive.
198
199 We don't do this when generating shared libraries unless given -e
200 on the command line, because most shared libs are not designed to
201 be run as an executable. However, some are, eg. glibc ld.so and
202 may rely on the default linker script supplying ENTRY. So we can't
203 remove the ENTRY from the script, but would rather not insert
204 undefined _start syms. */
205
4de2d33d 206void
62b635b6 207after_parse_default (void)
252b5132 208{
97b11f40
AM
209 if (entry_symbol.name != NULL
210 && (link_info.executable || entry_from_cmdline))
211 {
212 bfd_boolean is_vma = FALSE;
213
214 if (entry_from_cmdline)
215 {
216 const char *send;
217
218 bfd_scan_vma (entry_symbol.name, &send, 0);
219 is_vma = *send == '\0';
220 }
221 if (!is_vma)
222 ldlang_add_undef (entry_symbol.name);
223 }
252b5132
RH
224}
225
226void
62b635b6 227after_open_default (void)
252b5132
RH
228{
229}
230
231void
62b635b6 232after_allocation_default (void)
252b5132 233{
eaeb0a9d 234 lang_relax_sections (FALSE);
252b5132
RH
235}
236
237void
62b635b6 238before_allocation_default (void)
252b5132 239{
8423293d
AM
240 if (!link_info.relocatable)
241 strip_excluded_output_sections ();
252b5132
RH
242}
243
5e797c2c 244void
1e035701
AM
245finish_default (void)
246{
247 if (!link_info.relocatable)
f13a99db 248 _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info);
1e035701
AM
249}
250
251void
62b635b6 252set_output_arch_default (void)
252b5132 253{
4de2d33d 254 /* Set the output architecture and machine if possible. */
f13a99db 255 bfd_set_arch_mach (link_info.output_bfd,
4de2d33d 256 ldfile_output_architecture, ldfile_output_machine);
8be573a7
AM
257
258 bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
259 bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
252b5132
RH
260}
261
252b5132 262void
62b635b6 263syslib_default (char *ignore ATTRIBUTE_UNUSED)
252b5132
RH
264{
265 info_msg (_("%S SYSLIB ignored\n"));
266}
267
252b5132 268void
62b635b6 269hll_default (char *ignore ATTRIBUTE_UNUSED)
252b5132
RH
270{
271 info_msg (_("%S HLL ignored\n"));
272}
273
274ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
275
276void
62b635b6 277ldemul_choose_mode (char *target)
252b5132 278{
4de2d33d
KH
279 ld_emulation_xfer_type **eptr = ld_emulations;
280 /* Ignore "gld" prefix. */
281 if (target[0] == 'g' && target[1] == 'l' && target[2] == 'd')
282 target += 3;
283 for (; *eptr; eptr++)
284 {
285 if (strcmp (target, (*eptr)->emulation_name) == 0)
286 {
287 ld_emulation = *eptr;
288 return;
289 }
290 }
291 einfo (_("%P: unrecognised emulation mode: %s\n"), target);
292 einfo (_("Supported emulations: "));
293 ldemul_list_emulations (stderr);
294 einfo ("%F\n");
252b5132
RH
295}
296
297void
62b635b6 298ldemul_list_emulations (FILE *f)
252b5132
RH
299{
300 ld_emulation_xfer_type **eptr = ld_emulations;
b34976b6 301 bfd_boolean first = TRUE;
252b5132
RH
302
303 for (; *eptr; eptr++)
304 {
305 if (first)
b34976b6 306 first = FALSE;
252b5132
RH
307 else
308 fprintf (f, " ");
309 fprintf (f, "%s", (*eptr)->emulation_name);
310 }
311}
312
313void
62b635b6 314ldemul_list_emulation_options (FILE *f)
252b5132 315{
4de2d33d 316 ld_emulation_xfer_type **eptr;
252b5132 317 int options_found = 0;
4de2d33d
KH
318
319 for (eptr = ld_emulations; *eptr; eptr++)
252b5132 320 {
4de2d33d
KH
321 ld_emulation_xfer_type *emul = *eptr;
322
252b5132
RH
323 if (emul->list_options)
324 {
325 fprintf (f, "%s: \n", emul->emulation_name);
4de2d33d 326
252b5132
RH
327 emul->list_options (f);
328
329 options_found = 1;
330 }
331 }
4de2d33d 332
252b5132
RH
333 if (! options_found)
334 fprintf (f, _(" no emulation specific options.\n"));
335}
344a211f
NC
336
337int
62b635b6 338ldemul_find_potential_libraries (char *name, lang_input_statement_type *entry)
344a211f
NC
339{
340 if (ld_emulation->find_potential_libraries)
341 return ld_emulation->find_potential_libraries (name, entry);
342
343 return 0;
344}
fac1652d
AM
345
346struct bfd_elf_version_expr *
62b635b6 347ldemul_new_vers_pattern (struct bfd_elf_version_expr *entry)
fac1652d
AM
348{
349 if (ld_emulation->new_vers_pattern)
350 entry = (*ld_emulation->new_vers_pattern) (entry);
351 return entry;
352}
This page took 0.472413 seconds and 4 git commands to generate.