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