1 /* ldemul.c -- clearing house for ld emulation states
2    Copyright (C) 1991-2016 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 
35 static ld_emulation_xfer_type *ld_emulation;
36 
37 void
ldemul_hll(char * name)38 ldemul_hll (char *name)
39 {
40   ld_emulation->hll (name);
41 }
42 
43 void
ldemul_syslib(char * name)44 ldemul_syslib (char *name)
45 {
46   ld_emulation->syslib (name);
47 }
48 
49 void
ldemul_after_parse(void)50 ldemul_after_parse (void)
51 {
52   ld_emulation->after_parse ();
53 }
54 
55 void
ldemul_before_parse(void)56 ldemul_before_parse (void)
57 {
58   ld_emulation->before_parse ();
59 }
60 
61 void
ldemul_after_open(void)62 ldemul_after_open (void)
63 {
64   ld_emulation->after_open ();
65 }
66 
67 void
ldemul_after_allocation(void)68 ldemul_after_allocation (void)
69 {
70   ld_emulation->after_allocation ();
71 }
72 
73 void
ldemul_before_allocation(void)74 ldemul_before_allocation (void)
75 {
76   ld_emulation->before_allocation ();
77 }
78 
79 void
ldemul_set_output_arch(void)80 ldemul_set_output_arch (void)
81 {
82   ld_emulation->set_output_arch ();
83 }
84 
85 void
ldemul_finish(void)86 ldemul_finish (void)
87 {
88   ld_emulation->finish ();
89 }
90 
91 void
ldemul_set_symbols(void)92 ldemul_set_symbols (void)
93 {
94   if (ld_emulation->set_symbols)
95     ld_emulation->set_symbols ();
96 }
97 
98 void
ldemul_create_output_section_statements(void)99 ldemul_create_output_section_statements (void)
100 {
101   if (ld_emulation->create_output_section_statements)
102     ld_emulation->create_output_section_statements ();
103 }
104 
105 char *
ldemul_get_script(int * isfile)106 ldemul_get_script (int *isfile)
107 {
108   return ld_emulation->get_script (isfile);
109 }
110 
111 bfd_boolean
ldemul_open_dynamic_archive(const char * arch,search_dirs_type * search,lang_input_statement_type * entry)112 ldemul_open_dynamic_archive (const char *arch, search_dirs_type *search,
113 			     lang_input_statement_type *entry)
114 {
115   if (ld_emulation->open_dynamic_archive)
116     return (*ld_emulation->open_dynamic_archive) (arch, search, entry);
117   return FALSE;
118 }
119 
120 lang_output_section_statement_type *
ldemul_place_orphan(asection * s,const char * name,int constraint)121 ldemul_place_orphan (asection *s, const char *name, int constraint)
122 {
123   if (ld_emulation->place_orphan)
124     return (*ld_emulation->place_orphan) (s, name, constraint);
125   return NULL;
126 }
127 
128 void
ldemul_add_options(int ns,char ** shortopts,int nl,struct option ** longopts,int nrl,struct option ** really_longopts)129 ldemul_add_options (int ns, char **shortopts, int nl,
130 		    struct option **longopts, int nrl,
131 		    struct option **really_longopts)
132 {
133   if (ld_emulation->add_options)
134     (*ld_emulation->add_options) (ns, shortopts, nl, longopts,
135 				  nrl, really_longopts);
136 }
137 
138 bfd_boolean
ldemul_handle_option(int optc)139 ldemul_handle_option (int optc)
140 {
141   if (ld_emulation->handle_option)
142     return (*ld_emulation->handle_option) (optc);
143   return FALSE;
144 }
145 
146 bfd_boolean
ldemul_parse_args(int argc,char ** argv)147 ldemul_parse_args (int argc, char **argv)
148 {
149   /* Try and use the emulation parser if there is one.  */
150   if (ld_emulation->parse_args)
151     return (*ld_emulation->parse_args) (argc, argv);
152   return FALSE;
153 }
154 
155 /* Let the emulation code handle an unrecognized file.  */
156 
157 bfd_boolean
ldemul_unrecognized_file(lang_input_statement_type * entry)158 ldemul_unrecognized_file (lang_input_statement_type *entry)
159 {
160   if (ld_emulation->unrecognized_file)
161     return (*ld_emulation->unrecognized_file) (entry);
162   return FALSE;
163 }
164 
165 /* Let the emulation code handle a recognized file.  */
166 
167 bfd_boolean
ldemul_recognized_file(lang_input_statement_type * entry)168 ldemul_recognized_file (lang_input_statement_type *entry)
169 {
170   if (ld_emulation->recognized_file)
171     return (*ld_emulation->recognized_file) (entry);
172   return FALSE;
173 }
174 
175 char *
ldemul_choose_target(int argc,char ** argv)176 ldemul_choose_target (int argc, char **argv)
177 {
178   return ld_emulation->choose_target (argc, argv);
179 }
180 
181 
182 /* The default choose_target function.  */
183 
184 char *
ldemul_default_target(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)185 ldemul_default_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
186 {
187   char *from_outside = getenv (TARGET_ENVIRON);
188   if (from_outside != (char *) NULL)
189     return from_outside;
190   return ld_emulation->target_name;
191 }
192 
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 
204 void
after_parse_default(void)205 after_parse_default (void)
206 {
207   if (entry_symbol.name != NULL
208       && (bfd_link_executable (&link_info) || 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)
220 	ldlang_add_undef (entry_symbol.name, entry_from_cmdline);
221     }
222 }
223 
224 void
after_open_default(void)225 after_open_default (void)
226 {
227 }
228 
229 void
after_allocation_default(void)230 after_allocation_default (void)
231 {
232   lang_relax_sections (FALSE);
233 }
234 
235 void
before_allocation_default(void)236 before_allocation_default (void)
237 {
238   if (!bfd_link_relocatable (&link_info))
239     strip_excluded_output_sections ();
240 }
241 
242 void
finish_default(void)243 finish_default (void)
244 {
245   if (!bfd_link_relocatable (&link_info))
246     _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info);
247 }
248 
249 void
set_output_arch_default(void)250 set_output_arch_default (void)
251 {
252   /* Set the output architecture and machine if possible.  */
253   bfd_set_arch_mach (link_info.output_bfd,
254 		     ldfile_output_architecture, ldfile_output_machine);
255 
256   bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
257   bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
258 }
259 
260 void
syslib_default(char * ignore ATTRIBUTE_UNUSED)261 syslib_default (char *ignore ATTRIBUTE_UNUSED)
262 {
263   info_msg (_("%S SYSLIB ignored\n"), NULL);
264 }
265 
266 void
hll_default(char * ignore ATTRIBUTE_UNUSED)267 hll_default (char *ignore ATTRIBUTE_UNUSED)
268 {
269   info_msg (_("%S HLL ignored\n"), NULL);
270 }
271 
272 ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
273 
274 void
ldemul_choose_mode(char * target)275 ldemul_choose_mode (char *target)
276 {
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");
293 }
294 
295 void
ldemul_list_emulations(FILE * f)296 ldemul_list_emulations (FILE *f)
297 {
298   ld_emulation_xfer_type **eptr = ld_emulations;
299   bfd_boolean first = TRUE;
300 
301   for (; *eptr; eptr++)
302     {
303       if (first)
304 	first = FALSE;
305       else
306 	fprintf (f, " ");
307       fprintf (f, "%s", (*eptr)->emulation_name);
308     }
309 }
310 
311 void
ldemul_list_emulation_options(FILE * f)312 ldemul_list_emulation_options (FILE *f)
313 {
314   ld_emulation_xfer_type **eptr;
315   int options_found = 0;
316 
317   for (eptr = ld_emulations; *eptr; eptr++)
318     {
319       ld_emulation_xfer_type *emul = *eptr;
320 
321       if (emul->list_options)
322 	{
323 	  fprintf (f, "%s: \n", emul->emulation_name);
324 
325 	  emul->list_options (f);
326 
327 	  options_found = 1;
328 	}
329     }
330 
331   if (!options_found)
332     fprintf (f, _("  no emulation specific options.\n"));
333 }
334 
335 int
ldemul_find_potential_libraries(char * name,lang_input_statement_type * entry)336 ldemul_find_potential_libraries (char *name, lang_input_statement_type *entry)
337 {
338   if (ld_emulation->find_potential_libraries)
339     return ld_emulation->find_potential_libraries (name, entry);
340 
341   return 0;
342 }
343 
344 struct bfd_elf_version_expr *
ldemul_new_vers_pattern(struct bfd_elf_version_expr * entry)345 ldemul_new_vers_pattern (struct bfd_elf_version_expr *entry)
346 {
347   if (ld_emulation->new_vers_pattern)
348     entry = (*ld_emulation->new_vers_pattern) (entry);
349   return entry;
350 }
351 
352 void
ldemul_extra_map_file_text(bfd * abfd,struct bfd_link_info * info,FILE * mapf)353 ldemul_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 }
358