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