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