1ed0d50c3Schristos /* ldemul.c -- clearing house for ld emulation states
2*b88e3e88Schristos Copyright (C) 1991-2020 Free Software Foundation, Inc.
3ed0d50c3Schristos
4ed0d50c3Schristos This file is part of the GNU Binutils.
5ed0d50c3Schristos
6ed0d50c3Schristos This program is free software; you can redistribute it and/or modify
7ed0d50c3Schristos it under the terms of the GNU General Public License as published by
8ed0d50c3Schristos the Free Software Foundation; either version 3 of the License, or
9ed0d50c3Schristos (at your option) any later version.
10ed0d50c3Schristos
11ed0d50c3Schristos This program is distributed in the hope that it will be useful,
12ed0d50c3Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of
13ed0d50c3Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14ed0d50c3Schristos GNU General Public License for more details.
15ed0d50c3Schristos
16ed0d50c3Schristos You should have received a copy of the GNU General Public License
17ed0d50c3Schristos along with this program; if not, write to the Free Software
18ed0d50c3Schristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19ed0d50c3Schristos MA 02110-1301, USA. */
20ed0d50c3Schristos
21ed0d50c3Schristos #include "sysdep.h"
22ed0d50c3Schristos #include "bfd.h"
23ed0d50c3Schristos #include "getopt.h"
24ed0d50c3Schristos #include "bfdlink.h"
25*b88e3e88Schristos #include "ctf-api.h"
26ed0d50c3Schristos
27ed0d50c3Schristos #include "ld.h"
28ed0d50c3Schristos #include "ldmisc.h"
29ed0d50c3Schristos #include "ldexp.h"
30ed0d50c3Schristos #include "ldlang.h"
31ed0d50c3Schristos #include "ldfile.h"
32ed0d50c3Schristos #include "ldemul.h"
33ed0d50c3Schristos #include "ldmain.h"
34ed0d50c3Schristos #include "ldemul-list.h"
35ed0d50c3Schristos
36ed0d50c3Schristos static ld_emulation_xfer_type *ld_emulation;
37ed0d50c3Schristos
38ed0d50c3Schristos void
ldemul_hll(char * name)39ed0d50c3Schristos ldemul_hll (char *name)
40ed0d50c3Schristos {
41ed0d50c3Schristos ld_emulation->hll (name);
42ed0d50c3Schristos }
43ed0d50c3Schristos
44ed0d50c3Schristos void
ldemul_syslib(char * name)45ed0d50c3Schristos ldemul_syslib (char *name)
46ed0d50c3Schristos {
47ed0d50c3Schristos ld_emulation->syslib (name);
48ed0d50c3Schristos }
49ed0d50c3Schristos
50ed0d50c3Schristos void
ldemul_after_parse(void)51ed0d50c3Schristos ldemul_after_parse (void)
52ed0d50c3Schristos {
53ed0d50c3Schristos ld_emulation->after_parse ();
54ed0d50c3Schristos }
55ed0d50c3Schristos
56ed0d50c3Schristos void
ldemul_before_parse(void)57ed0d50c3Schristos ldemul_before_parse (void)
58ed0d50c3Schristos {
59ed0d50c3Schristos ld_emulation->before_parse ();
60ed0d50c3Schristos }
61ed0d50c3Schristos
62ed0d50c3Schristos void
ldemul_after_open(void)63ed0d50c3Schristos ldemul_after_open (void)
64ed0d50c3Schristos {
65ed0d50c3Schristos ld_emulation->after_open ();
66ed0d50c3Schristos }
67ed0d50c3Schristos
68ed0d50c3Schristos void
ldemul_after_check_relocs(void)6906324dcfSchristos ldemul_after_check_relocs (void)
7006324dcfSchristos {
7106324dcfSchristos ld_emulation->after_check_relocs ();
7206324dcfSchristos }
7306324dcfSchristos
7406324dcfSchristos void
ldemul_after_allocation(void)75ed0d50c3Schristos ldemul_after_allocation (void)
76ed0d50c3Schristos {
77ed0d50c3Schristos ld_emulation->after_allocation ();
78ed0d50c3Schristos }
79ed0d50c3Schristos
80ed0d50c3Schristos void
ldemul_before_allocation(void)81ed0d50c3Schristos ldemul_before_allocation (void)
82ed0d50c3Schristos {
83ed0d50c3Schristos ld_emulation->before_allocation ();
84ed0d50c3Schristos }
85ed0d50c3Schristos
86ed0d50c3Schristos void
ldemul_set_output_arch(void)87ed0d50c3Schristos ldemul_set_output_arch (void)
88ed0d50c3Schristos {
89ed0d50c3Schristos ld_emulation->set_output_arch ();
90ed0d50c3Schristos }
91ed0d50c3Schristos
92ed0d50c3Schristos void
ldemul_finish(void)93ed0d50c3Schristos ldemul_finish (void)
94ed0d50c3Schristos {
95ed0d50c3Schristos ld_emulation->finish ();
96ed0d50c3Schristos }
97ed0d50c3Schristos
98ed0d50c3Schristos void
ldemul_set_symbols(void)99ed0d50c3Schristos ldemul_set_symbols (void)
100ed0d50c3Schristos {
101ed0d50c3Schristos if (ld_emulation->set_symbols)
102ed0d50c3Schristos ld_emulation->set_symbols ();
103ed0d50c3Schristos }
104ed0d50c3Schristos
105ed0d50c3Schristos void
ldemul_create_output_section_statements(void)106ed0d50c3Schristos ldemul_create_output_section_statements (void)
107ed0d50c3Schristos {
108ed0d50c3Schristos if (ld_emulation->create_output_section_statements)
109ed0d50c3Schristos ld_emulation->create_output_section_statements ();
110ed0d50c3Schristos }
111ed0d50c3Schristos
112ed0d50c3Schristos char *
ldemul_get_script(int * isfile)113ed0d50c3Schristos ldemul_get_script (int *isfile)
114ed0d50c3Schristos {
115ed0d50c3Schristos return ld_emulation->get_script (isfile);
116ed0d50c3Schristos }
117ed0d50c3Schristos
118ed0d50c3Schristos bfd_boolean
ldemul_open_dynamic_archive(const char * arch,search_dirs_type * search,lang_input_statement_type * entry)119ed0d50c3Schristos ldemul_open_dynamic_archive (const char *arch, search_dirs_type *search,
120ed0d50c3Schristos lang_input_statement_type *entry)
121ed0d50c3Schristos {
122ed0d50c3Schristos if (ld_emulation->open_dynamic_archive)
123ed0d50c3Schristos return (*ld_emulation->open_dynamic_archive) (arch, search, entry);
124ed0d50c3Schristos return FALSE;
125ed0d50c3Schristos }
126ed0d50c3Schristos
127ed0d50c3Schristos lang_output_section_statement_type *
ldemul_place_orphan(asection * s,const char * name,int constraint)128ed0d50c3Schristos ldemul_place_orphan (asection *s, const char *name, int constraint)
129ed0d50c3Schristos {
130ed0d50c3Schristos if (ld_emulation->place_orphan)
131ed0d50c3Schristos return (*ld_emulation->place_orphan) (s, name, constraint);
132ed0d50c3Schristos return NULL;
133ed0d50c3Schristos }
134ed0d50c3Schristos
135ed0d50c3Schristos void
ldemul_add_options(int ns,char ** shortopts,int nl,struct option ** longopts,int nrl,struct option ** really_longopts)136ed0d50c3Schristos ldemul_add_options (int ns, char **shortopts, int nl,
137ed0d50c3Schristos struct option **longopts, int nrl,
138ed0d50c3Schristos struct option **really_longopts)
139ed0d50c3Schristos {
140ed0d50c3Schristos if (ld_emulation->add_options)
141ed0d50c3Schristos (*ld_emulation->add_options) (ns, shortopts, nl, longopts,
142ed0d50c3Schristos nrl, really_longopts);
143ed0d50c3Schristos }
144ed0d50c3Schristos
145ed0d50c3Schristos bfd_boolean
ldemul_handle_option(int optc)146ed0d50c3Schristos ldemul_handle_option (int optc)
147ed0d50c3Schristos {
148ed0d50c3Schristos if (ld_emulation->handle_option)
149ed0d50c3Schristos return (*ld_emulation->handle_option) (optc);
150ed0d50c3Schristos return FALSE;
151ed0d50c3Schristos }
152ed0d50c3Schristos
153ed0d50c3Schristos bfd_boolean
ldemul_parse_args(int argc,char ** argv)154ed0d50c3Schristos ldemul_parse_args (int argc, char **argv)
155ed0d50c3Schristos {
156ed0d50c3Schristos /* Try and use the emulation parser if there is one. */
157ed0d50c3Schristos if (ld_emulation->parse_args)
158ed0d50c3Schristos return (*ld_emulation->parse_args) (argc, argv);
159ed0d50c3Schristos return FALSE;
160ed0d50c3Schristos }
161ed0d50c3Schristos
162ed0d50c3Schristos /* Let the emulation code handle an unrecognized file. */
163ed0d50c3Schristos
164ed0d50c3Schristos bfd_boolean
ldemul_unrecognized_file(lang_input_statement_type * entry)165ed0d50c3Schristos ldemul_unrecognized_file (lang_input_statement_type *entry)
166ed0d50c3Schristos {
167ed0d50c3Schristos if (ld_emulation->unrecognized_file)
168ed0d50c3Schristos return (*ld_emulation->unrecognized_file) (entry);
169ed0d50c3Schristos return FALSE;
170ed0d50c3Schristos }
171ed0d50c3Schristos
172ed0d50c3Schristos /* Let the emulation code handle a recognized file. */
173ed0d50c3Schristos
174ed0d50c3Schristos bfd_boolean
ldemul_recognized_file(lang_input_statement_type * entry)175ed0d50c3Schristos ldemul_recognized_file (lang_input_statement_type *entry)
176ed0d50c3Schristos {
177ed0d50c3Schristos if (ld_emulation->recognized_file)
178ed0d50c3Schristos return (*ld_emulation->recognized_file) (entry);
179ed0d50c3Schristos return FALSE;
180ed0d50c3Schristos }
181ed0d50c3Schristos
182ed0d50c3Schristos char *
ldemul_choose_target(int argc,char ** argv)183ed0d50c3Schristos ldemul_choose_target (int argc, char **argv)
184ed0d50c3Schristos {
185ed0d50c3Schristos return ld_emulation->choose_target (argc, argv);
186ed0d50c3Schristos }
187ed0d50c3Schristos
188ed0d50c3Schristos
189ed0d50c3Schristos /* The default choose_target function. */
190ed0d50c3Schristos
191ed0d50c3Schristos char *
ldemul_default_target(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)192ed0d50c3Schristos ldemul_default_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
193ed0d50c3Schristos {
194ed0d50c3Schristos char *from_outside = getenv (TARGET_ENVIRON);
195ed0d50c3Schristos if (from_outside != (char *) NULL)
196ed0d50c3Schristos return from_outside;
197ed0d50c3Schristos return ld_emulation->target_name;
198ed0d50c3Schristos }
199ed0d50c3Schristos
200ed0d50c3Schristos /* If the entry point was not specified as an address, then add the
201ed0d50c3Schristos symbol as undefined. This will cause ld to extract an archive
202ed0d50c3Schristos element defining the entry if ld is linking against such an archive.
203ed0d50c3Schristos
204ed0d50c3Schristos We don't do this when generating shared libraries unless given -e
205ed0d50c3Schristos on the command line, because most shared libs are not designed to
206ed0d50c3Schristos be run as an executable. However, some are, eg. glibc ld.so and
207ed0d50c3Schristos may rely on the default linker script supplying ENTRY. So we can't
208ed0d50c3Schristos remove the ENTRY from the script, but would rather not insert
209ed0d50c3Schristos undefined _start syms. */
210ed0d50c3Schristos
211ed0d50c3Schristos void
after_parse_default(void)212ed0d50c3Schristos after_parse_default (void)
213ed0d50c3Schristos {
214ed0d50c3Schristos if (entry_symbol.name != NULL
215ed0d50c3Schristos && (bfd_link_executable (&link_info) || entry_from_cmdline))
216ed0d50c3Schristos {
217ed0d50c3Schristos bfd_boolean is_vma = FALSE;
218ed0d50c3Schristos
219ed0d50c3Schristos if (entry_from_cmdline)
220ed0d50c3Schristos {
221ed0d50c3Schristos const char *send;
222ed0d50c3Schristos
223ed0d50c3Schristos bfd_scan_vma (entry_symbol.name, &send, 0);
224ed0d50c3Schristos is_vma = *send == '\0';
225ed0d50c3Schristos }
226ed0d50c3Schristos if (!is_vma)
227ed0d50c3Schristos ldlang_add_undef (entry_symbol.name, entry_from_cmdline);
228ed0d50c3Schristos }
22906324dcfSchristos if (config.maxpagesize == 0)
23006324dcfSchristos config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
23106324dcfSchristos if (config.commonpagesize == 0)
23206324dcfSchristos config.commonpagesize = bfd_emul_get_commonpagesize (default_target,
23306324dcfSchristos link_info.relro);
234ed0d50c3Schristos }
235ed0d50c3Schristos
236ed0d50c3Schristos void
after_open_default(void)237ed0d50c3Schristos after_open_default (void)
238ed0d50c3Schristos {
239*b88e3e88Schristos link_info.big_endian = TRUE;
240*b88e3e88Schristos
241*b88e3e88Schristos if (bfd_big_endian (link_info.output_bfd))
242*b88e3e88Schristos ;
243*b88e3e88Schristos else if (bfd_little_endian (link_info.output_bfd))
244*b88e3e88Schristos link_info.big_endian = FALSE;
245*b88e3e88Schristos else
246*b88e3e88Schristos {
247*b88e3e88Schristos if (command_line.endian == ENDIAN_BIG)
248*b88e3e88Schristos ;
249*b88e3e88Schristos else if (command_line.endian == ENDIAN_LITTLE)
250*b88e3e88Schristos link_info.big_endian = FALSE;
251*b88e3e88Schristos else if (command_line.endian == ENDIAN_UNSET)
252*b88e3e88Schristos {
253*b88e3e88Schristos LANG_FOR_EACH_INPUT_STATEMENT (s)
254*b88e3e88Schristos if (s->the_bfd != NULL)
255*b88e3e88Schristos {
256*b88e3e88Schristos if (bfd_little_endian (s->the_bfd))
257*b88e3e88Schristos link_info.big_endian = FALSE;
258*b88e3e88Schristos break;
259*b88e3e88Schristos }
260*b88e3e88Schristos }
261*b88e3e88Schristos }
262ed0d50c3Schristos }
263ed0d50c3Schristos
264ed0d50c3Schristos void
after_check_relocs_default(void)26506324dcfSchristos after_check_relocs_default (void)
26606324dcfSchristos {
26706324dcfSchristos }
26806324dcfSchristos
26906324dcfSchristos void
after_allocation_default(void)270ed0d50c3Schristos after_allocation_default (void)
271ed0d50c3Schristos {
272ed0d50c3Schristos lang_relax_sections (FALSE);
273ed0d50c3Schristos }
274ed0d50c3Schristos
275ed0d50c3Schristos void
before_allocation_default(void)276ed0d50c3Schristos before_allocation_default (void)
277ed0d50c3Schristos {
278ed0d50c3Schristos if (!bfd_link_relocatable (&link_info))
279ed0d50c3Schristos strip_excluded_output_sections ();
280ed0d50c3Schristos }
281ed0d50c3Schristos
282ed0d50c3Schristos void
finish_default(void)283ed0d50c3Schristos finish_default (void)
284ed0d50c3Schristos {
285ed0d50c3Schristos if (!bfd_link_relocatable (&link_info))
286ed0d50c3Schristos _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info);
287ed0d50c3Schristos }
288ed0d50c3Schristos
289ed0d50c3Schristos void
set_output_arch_default(void)290ed0d50c3Schristos set_output_arch_default (void)
291ed0d50c3Schristos {
292ed0d50c3Schristos /* Set the output architecture and machine if possible. */
293ed0d50c3Schristos bfd_set_arch_mach (link_info.output_bfd,
294ed0d50c3Schristos ldfile_output_architecture, ldfile_output_machine);
295ed0d50c3Schristos
296ed0d50c3Schristos bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
297ed0d50c3Schristos bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
298ed0d50c3Schristos }
299ed0d50c3Schristos
300ed0d50c3Schristos void
syslib_default(char * ignore ATTRIBUTE_UNUSED)301ed0d50c3Schristos syslib_default (char *ignore ATTRIBUTE_UNUSED)
302ed0d50c3Schristos {
30306324dcfSchristos info_msg (_("%pS SYSLIB ignored\n"), NULL);
304ed0d50c3Schristos }
305ed0d50c3Schristos
306ed0d50c3Schristos void
hll_default(char * ignore ATTRIBUTE_UNUSED)307ed0d50c3Schristos hll_default (char *ignore ATTRIBUTE_UNUSED)
308ed0d50c3Schristos {
30906324dcfSchristos info_msg (_("%pS HLL ignored\n"), NULL);
310ed0d50c3Schristos }
311ed0d50c3Schristos
312ed0d50c3Schristos ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
313ed0d50c3Schristos
314ed0d50c3Schristos void
ldemul_choose_mode(char * target)315ed0d50c3Schristos ldemul_choose_mode (char *target)
316ed0d50c3Schristos {
317ed0d50c3Schristos ld_emulation_xfer_type **eptr = ld_emulations;
318ed0d50c3Schristos /* Ignore "gld" prefix. */
319ed0d50c3Schristos if (target[0] == 'g' && target[1] == 'l' && target[2] == 'd')
320ed0d50c3Schristos target += 3;
321ed0d50c3Schristos for (; *eptr; eptr++)
322ed0d50c3Schristos {
323ed0d50c3Schristos if (strcmp (target, (*eptr)->emulation_name) == 0)
324ed0d50c3Schristos {
325ed0d50c3Schristos ld_emulation = *eptr;
326ed0d50c3Schristos return;
327ed0d50c3Schristos }
328ed0d50c3Schristos }
329ed0d50c3Schristos einfo (_("%P: unrecognised emulation mode: %s\n"), target);
330ed0d50c3Schristos einfo (_("Supported emulations: "));
331ed0d50c3Schristos ldemul_list_emulations (stderr);
332ed0d50c3Schristos einfo ("%F\n");
333ed0d50c3Schristos }
334ed0d50c3Schristos
335ed0d50c3Schristos void
ldemul_list_emulations(FILE * f)336ed0d50c3Schristos ldemul_list_emulations (FILE *f)
337ed0d50c3Schristos {
338ed0d50c3Schristos ld_emulation_xfer_type **eptr = ld_emulations;
339ed0d50c3Schristos bfd_boolean first = TRUE;
340ed0d50c3Schristos
341ed0d50c3Schristos for (; *eptr; eptr++)
342ed0d50c3Schristos {
343ed0d50c3Schristos if (first)
344ed0d50c3Schristos first = FALSE;
345ed0d50c3Schristos else
346ed0d50c3Schristos fprintf (f, " ");
347ed0d50c3Schristos fprintf (f, "%s", (*eptr)->emulation_name);
348ed0d50c3Schristos }
349ed0d50c3Schristos }
350ed0d50c3Schristos
351ed0d50c3Schristos void
ldemul_list_emulation_options(FILE * f)352ed0d50c3Schristos ldemul_list_emulation_options (FILE *f)
353ed0d50c3Schristos {
354ed0d50c3Schristos ld_emulation_xfer_type **eptr;
355ed0d50c3Schristos int options_found = 0;
356ed0d50c3Schristos
357ed0d50c3Schristos for (eptr = ld_emulations; *eptr; eptr++)
358ed0d50c3Schristos {
359ed0d50c3Schristos ld_emulation_xfer_type *emul = *eptr;
360ed0d50c3Schristos
361ed0d50c3Schristos if (emul->list_options)
362ed0d50c3Schristos {
363ed0d50c3Schristos fprintf (f, "%s: \n", emul->emulation_name);
364ed0d50c3Schristos
365ed0d50c3Schristos emul->list_options (f);
366ed0d50c3Schristos
367ed0d50c3Schristos options_found = 1;
368ed0d50c3Schristos }
369ed0d50c3Schristos }
370ed0d50c3Schristos
371ed0d50c3Schristos if (!options_found)
372ed0d50c3Schristos fprintf (f, _(" no emulation specific options.\n"));
373ed0d50c3Schristos }
374ed0d50c3Schristos
375ed0d50c3Schristos int
ldemul_find_potential_libraries(char * name,lang_input_statement_type * entry)376ed0d50c3Schristos ldemul_find_potential_libraries (char *name, lang_input_statement_type *entry)
377ed0d50c3Schristos {
378ed0d50c3Schristos if (ld_emulation->find_potential_libraries)
379ed0d50c3Schristos return ld_emulation->find_potential_libraries (name, entry);
380ed0d50c3Schristos
381ed0d50c3Schristos return 0;
382ed0d50c3Schristos }
383ed0d50c3Schristos
384ed0d50c3Schristos struct bfd_elf_version_expr *
ldemul_new_vers_pattern(struct bfd_elf_version_expr * entry)385ed0d50c3Schristos ldemul_new_vers_pattern (struct bfd_elf_version_expr *entry)
386ed0d50c3Schristos {
387ed0d50c3Schristos if (ld_emulation->new_vers_pattern)
388ed0d50c3Schristos entry = (*ld_emulation->new_vers_pattern) (entry);
389ed0d50c3Schristos return entry;
390ed0d50c3Schristos }
391ed0d50c3Schristos
392ed0d50c3Schristos void
ldemul_extra_map_file_text(bfd * abfd,struct bfd_link_info * info,FILE * mapf)393ed0d50c3Schristos ldemul_extra_map_file_text (bfd *abfd, struct bfd_link_info *info, FILE *mapf)
394ed0d50c3Schristos {
395ed0d50c3Schristos if (ld_emulation->extra_map_file_text)
396ed0d50c3Schristos ld_emulation->extra_map_file_text (abfd, info, mapf);
397ed0d50c3Schristos }
398*b88e3e88Schristos
399*b88e3e88Schristos int
ldemul_emit_ctf_early(void)400*b88e3e88Schristos ldemul_emit_ctf_early (void)
401*b88e3e88Schristos {
402*b88e3e88Schristos if (ld_emulation->emit_ctf_early)
403*b88e3e88Schristos return ld_emulation->emit_ctf_early ();
404*b88e3e88Schristos /* If the emulation doesn't know if it wants to emit CTF early, it is going
405*b88e3e88Schristos to do so. */
406*b88e3e88Schristos return 1;
407*b88e3e88Schristos }
408*b88e3e88Schristos
409*b88e3e88Schristos void
ldemul_examine_strtab_for_ctf(struct ctf_file * ctf_output,struct elf_sym_strtab * syms,bfd_size_type symcount,struct elf_strtab_hash * symstrtab)410*b88e3e88Schristos ldemul_examine_strtab_for_ctf (struct ctf_file *ctf_output,
411*b88e3e88Schristos struct elf_sym_strtab *syms,
412*b88e3e88Schristos bfd_size_type symcount,
413*b88e3e88Schristos struct elf_strtab_hash *symstrtab)
414*b88e3e88Schristos
415*b88e3e88Schristos {
416*b88e3e88Schristos if (ld_emulation->examine_strtab_for_ctf)
417*b88e3e88Schristos ld_emulation->examine_strtab_for_ctf (ctf_output, syms,
418*b88e3e88Schristos symcount, symstrtab);
419*b88e3e88Schristos }
420