1*fae548d3Szrj /* Linker file opening and searching.
2*fae548d3Szrj Copyright (C) 1991-2020 Free Software Foundation, Inc.
3*fae548d3Szrj
4*fae548d3Szrj This file is part of the GNU Binutils.
5*fae548d3Szrj
6*fae548d3Szrj This program is free software; you can redistribute it and/or modify
7*fae548d3Szrj it under the terms of the GNU General Public License as published by
8*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or
9*fae548d3Szrj (at your option) any later version.
10*fae548d3Szrj
11*fae548d3Szrj This program is distributed in the hope that it will be useful,
12*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
13*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*fae548d3Szrj GNU General Public License for more details.
15*fae548d3Szrj
16*fae548d3Szrj You should have received a copy of the GNU General Public License
17*fae548d3Szrj along with this program; if not, write to the Free Software
18*fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19*fae548d3Szrj MA 02110-1301, USA. */
20*fae548d3Szrj
21*fae548d3Szrj #include "sysdep.h"
22*fae548d3Szrj #include "bfd.h"
23*fae548d3Szrj #include "bfdlink.h"
24*fae548d3Szrj #include "ctf-api.h"
25*fae548d3Szrj #include "safe-ctype.h"
26*fae548d3Szrj #include "ld.h"
27*fae548d3Szrj #include "ldmisc.h"
28*fae548d3Szrj #include "ldexp.h"
29*fae548d3Szrj #include "ldlang.h"
30*fae548d3Szrj #include "ldfile.h"
31*fae548d3Szrj #include "ldmain.h"
32*fae548d3Szrj #include <ldgram.h>
33*fae548d3Szrj #include "ldlex.h"
34*fae548d3Szrj #include "ldemul.h"
35*fae548d3Szrj #include "libiberty.h"
36*fae548d3Szrj #include "filenames.h"
37*fae548d3Szrj #ifdef ENABLE_PLUGINS
38*fae548d3Szrj #include "plugin-api.h"
39*fae548d3Szrj #include "plugin.h"
40*fae548d3Szrj #endif /* ENABLE_PLUGINS */
41*fae548d3Szrj
42*fae548d3Szrj bfd_boolean ldfile_assumed_script = FALSE;
43*fae548d3Szrj const char *ldfile_output_machine_name = "";
44*fae548d3Szrj unsigned long ldfile_output_machine;
45*fae548d3Szrj enum bfd_architecture ldfile_output_architecture;
46*fae548d3Szrj search_dirs_type *search_head;
47*fae548d3Szrj
48*fae548d3Szrj #ifdef VMS
49*fae548d3Szrj static char *slash = "";
50*fae548d3Szrj #else
51*fae548d3Szrj #if defined (_WIN32) && !defined (__CYGWIN32__)
52*fae548d3Szrj static char *slash = "\\";
53*fae548d3Szrj #else
54*fae548d3Szrj static char *slash = "/";
55*fae548d3Szrj #endif
56*fae548d3Szrj #endif
57*fae548d3Szrj
58*fae548d3Szrj typedef struct search_arch
59*fae548d3Szrj {
60*fae548d3Szrj char *name;
61*fae548d3Szrj struct search_arch *next;
62*fae548d3Szrj } search_arch_type;
63*fae548d3Szrj
64*fae548d3Szrj static search_dirs_type **search_tail_ptr = &search_head;
65*fae548d3Szrj static search_arch_type *search_arch_head;
66*fae548d3Szrj static search_arch_type **search_arch_tail_ptr = &search_arch_head;
67*fae548d3Szrj
68*fae548d3Szrj /* Test whether a pathname, after canonicalization, is the same or a
69*fae548d3Szrj sub-directory of the sysroot directory. */
70*fae548d3Szrj
71*fae548d3Szrj static bfd_boolean
is_sysrooted_pathname(const char * name)72*fae548d3Szrj is_sysrooted_pathname (const char *name)
73*fae548d3Szrj {
74*fae548d3Szrj char *realname;
75*fae548d3Szrj int len;
76*fae548d3Szrj bfd_boolean result;
77*fae548d3Szrj
78*fae548d3Szrj if (ld_canon_sysroot == NULL)
79*fae548d3Szrj return FALSE;
80*fae548d3Szrj
81*fae548d3Szrj realname = lrealpath (name);
82*fae548d3Szrj len = strlen (realname);
83*fae548d3Szrj result = FALSE;
84*fae548d3Szrj if (len > ld_canon_sysroot_len
85*fae548d3Szrj && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len]))
86*fae548d3Szrj {
87*fae548d3Szrj realname[ld_canon_sysroot_len] = '\0';
88*fae548d3Szrj result = FILENAME_CMP (ld_canon_sysroot, realname) == 0;
89*fae548d3Szrj }
90*fae548d3Szrj
91*fae548d3Szrj free (realname);
92*fae548d3Szrj return result;
93*fae548d3Szrj }
94*fae548d3Szrj
95*fae548d3Szrj /* Adds NAME to the library search path.
96*fae548d3Szrj Makes a copy of NAME using xmalloc(). */
97*fae548d3Szrj
98*fae548d3Szrj void
ldfile_add_library_path(const char * name,bfd_boolean cmdline)99*fae548d3Szrj ldfile_add_library_path (const char *name, bfd_boolean cmdline)
100*fae548d3Szrj {
101*fae548d3Szrj search_dirs_type *new_dirs;
102*fae548d3Szrj
103*fae548d3Szrj if (!cmdline && config.only_cmd_line_lib_dirs)
104*fae548d3Szrj return;
105*fae548d3Szrj
106*fae548d3Szrj new_dirs = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
107*fae548d3Szrj new_dirs->next = NULL;
108*fae548d3Szrj new_dirs->cmdline = cmdline;
109*fae548d3Szrj *search_tail_ptr = new_dirs;
110*fae548d3Szrj search_tail_ptr = &new_dirs->next;
111*fae548d3Szrj
112*fae548d3Szrj /* If a directory is marked as honoring sysroot, prepend the sysroot path
113*fae548d3Szrj now. */
114*fae548d3Szrj if (name[0] == '=')
115*fae548d3Szrj new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL);
116*fae548d3Szrj else if (CONST_STRNEQ (name, "$SYSROOT"))
117*fae548d3Szrj new_dirs->name = concat (ld_sysroot, name + strlen ("$SYSROOT"), (const char *) NULL);
118*fae548d3Szrj else
119*fae548d3Szrj new_dirs->name = xstrdup (name);
120*fae548d3Szrj }
121*fae548d3Szrj
122*fae548d3Szrj /* Try to open a BFD for a lang_input_statement. */
123*fae548d3Szrj
124*fae548d3Szrj bfd_boolean
ldfile_try_open_bfd(const char * attempt,lang_input_statement_type * entry)125*fae548d3Szrj ldfile_try_open_bfd (const char *attempt,
126*fae548d3Szrj lang_input_statement_type *entry)
127*fae548d3Szrj {
128*fae548d3Szrj entry->the_bfd = bfd_openr (attempt, entry->target);
129*fae548d3Szrj
130*fae548d3Szrj if (verbose)
131*fae548d3Szrj {
132*fae548d3Szrj if (entry->the_bfd == NULL)
133*fae548d3Szrj info_msg (_("attempt to open %s failed\n"), attempt);
134*fae548d3Szrj else
135*fae548d3Szrj info_msg (_("attempt to open %s succeeded\n"), attempt);
136*fae548d3Szrj }
137*fae548d3Szrj
138*fae548d3Szrj if (entry->the_bfd == NULL)
139*fae548d3Szrj {
140*fae548d3Szrj if (bfd_get_error () == bfd_error_invalid_target)
141*fae548d3Szrj einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
142*fae548d3Szrj return FALSE;
143*fae548d3Szrj }
144*fae548d3Szrj
145*fae548d3Szrj /* Linker needs to decompress sections. */
146*fae548d3Szrj entry->the_bfd->flags |= BFD_DECOMPRESS;
147*fae548d3Szrj
148*fae548d3Szrj /* This is a linker input BFD. */
149*fae548d3Szrj entry->the_bfd->is_linker_input = 1;
150*fae548d3Szrj
151*fae548d3Szrj #ifdef ENABLE_PLUGINS
152*fae548d3Szrj if (entry->flags.lto_output)
153*fae548d3Szrj entry->the_bfd->lto_output = 1;
154*fae548d3Szrj #endif
155*fae548d3Szrj
156*fae548d3Szrj /* If we are searching for this file, see if the architecture is
157*fae548d3Szrj compatible with the output file. If it isn't, keep searching.
158*fae548d3Szrj If we can't open the file as an object file, stop the search
159*fae548d3Szrj here. If we are statically linking, ensure that we don't link
160*fae548d3Szrj a dynamic object.
161*fae548d3Szrj
162*fae548d3Szrj In the code below, it's OK to exit early if the check fails,
163*fae548d3Szrj closing the checked BFD and returning FALSE, but if the BFD
164*fae548d3Szrj checks out compatible, do not exit early returning TRUE, or
165*fae548d3Szrj the plugins will not get a chance to claim the file. */
166*fae548d3Szrj
167*fae548d3Szrj if (entry->flags.search_dirs || !entry->flags.dynamic)
168*fae548d3Szrj {
169*fae548d3Szrj bfd *check;
170*fae548d3Szrj
171*fae548d3Szrj if (bfd_check_format (entry->the_bfd, bfd_archive))
172*fae548d3Szrj check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
173*fae548d3Szrj else
174*fae548d3Szrj check = entry->the_bfd;
175*fae548d3Szrj
176*fae548d3Szrj if (check != NULL)
177*fae548d3Szrj {
178*fae548d3Szrj if (!bfd_check_format (check, bfd_object))
179*fae548d3Szrj {
180*fae548d3Szrj if (check == entry->the_bfd
181*fae548d3Szrj && entry->flags.search_dirs
182*fae548d3Szrj && bfd_get_error () == bfd_error_file_not_recognized
183*fae548d3Szrj && !ldemul_unrecognized_file (entry))
184*fae548d3Szrj {
185*fae548d3Szrj int token, skip = 0;
186*fae548d3Szrj char *arg, *arg1, *arg2, *arg3;
187*fae548d3Szrj extern FILE *yyin;
188*fae548d3Szrj
189*fae548d3Szrj /* Try to interpret the file as a linker script. */
190*fae548d3Szrj ldfile_open_command_file (attempt);
191*fae548d3Szrj
192*fae548d3Szrj ldfile_assumed_script = TRUE;
193*fae548d3Szrj parser_input = input_selected;
194*fae548d3Szrj ldlex_both ();
195*fae548d3Szrj token = INPUT_SCRIPT;
196*fae548d3Szrj while (token != 0)
197*fae548d3Szrj {
198*fae548d3Szrj switch (token)
199*fae548d3Szrj {
200*fae548d3Szrj case OUTPUT_FORMAT:
201*fae548d3Szrj if ((token = yylex ()) != '(')
202*fae548d3Szrj continue;
203*fae548d3Szrj if ((token = yylex ()) != NAME)
204*fae548d3Szrj continue;
205*fae548d3Szrj arg1 = yylval.name;
206*fae548d3Szrj arg2 = NULL;
207*fae548d3Szrj arg3 = NULL;
208*fae548d3Szrj token = yylex ();
209*fae548d3Szrj if (token == ',')
210*fae548d3Szrj {
211*fae548d3Szrj if ((token = yylex ()) != NAME)
212*fae548d3Szrj {
213*fae548d3Szrj free (arg1);
214*fae548d3Szrj continue;
215*fae548d3Szrj }
216*fae548d3Szrj arg2 = yylval.name;
217*fae548d3Szrj if ((token = yylex ()) != ','
218*fae548d3Szrj || (token = yylex ()) != NAME)
219*fae548d3Szrj {
220*fae548d3Szrj free (arg1);
221*fae548d3Szrj free (arg2);
222*fae548d3Szrj continue;
223*fae548d3Szrj }
224*fae548d3Szrj arg3 = yylval.name;
225*fae548d3Szrj token = yylex ();
226*fae548d3Szrj }
227*fae548d3Szrj if (token == ')')
228*fae548d3Szrj {
229*fae548d3Szrj switch (command_line.endian)
230*fae548d3Szrj {
231*fae548d3Szrj default:
232*fae548d3Szrj case ENDIAN_UNSET:
233*fae548d3Szrj arg = arg1; break;
234*fae548d3Szrj case ENDIAN_BIG:
235*fae548d3Szrj arg = arg2 ? arg2 : arg1; break;
236*fae548d3Szrj case ENDIAN_LITTLE:
237*fae548d3Szrj arg = arg3 ? arg3 : arg1; break;
238*fae548d3Szrj }
239*fae548d3Szrj if (strcmp (arg, lang_get_output_target ()) != 0)
240*fae548d3Szrj skip = 1;
241*fae548d3Szrj }
242*fae548d3Szrj free (arg1);
243*fae548d3Szrj if (arg2) free (arg2);
244*fae548d3Szrj if (arg3) free (arg3);
245*fae548d3Szrj break;
246*fae548d3Szrj case NAME:
247*fae548d3Szrj case LNAME:
248*fae548d3Szrj case VERS_IDENTIFIER:
249*fae548d3Szrj case VERS_TAG:
250*fae548d3Szrj free (yylval.name);
251*fae548d3Szrj break;
252*fae548d3Szrj case INT:
253*fae548d3Szrj if (yylval.bigint.str)
254*fae548d3Szrj free (yylval.bigint.str);
255*fae548d3Szrj break;
256*fae548d3Szrj }
257*fae548d3Szrj token = yylex ();
258*fae548d3Szrj }
259*fae548d3Szrj ldlex_popstate ();
260*fae548d3Szrj ldfile_assumed_script = FALSE;
261*fae548d3Szrj fclose (yyin);
262*fae548d3Szrj yyin = NULL;
263*fae548d3Szrj if (skip)
264*fae548d3Szrj {
265*fae548d3Szrj if (command_line.warn_search_mismatch)
266*fae548d3Szrj einfo (_("%P: skipping incompatible %s "
267*fae548d3Szrj "when searching for %s\n"),
268*fae548d3Szrj attempt, entry->local_sym_name);
269*fae548d3Szrj bfd_close (entry->the_bfd);
270*fae548d3Szrj entry->the_bfd = NULL;
271*fae548d3Szrj return FALSE;
272*fae548d3Szrj }
273*fae548d3Szrj }
274*fae548d3Szrj goto success;
275*fae548d3Szrj }
276*fae548d3Szrj
277*fae548d3Szrj if (!entry->flags.dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
278*fae548d3Szrj {
279*fae548d3Szrj einfo (_("%F%P: attempted static link of dynamic object `%s'\n"),
280*fae548d3Szrj attempt);
281*fae548d3Szrj bfd_close (entry->the_bfd);
282*fae548d3Szrj entry->the_bfd = NULL;
283*fae548d3Szrj return FALSE;
284*fae548d3Szrj }
285*fae548d3Szrj
286*fae548d3Szrj if (entry->flags.search_dirs
287*fae548d3Szrj && !bfd_arch_get_compatible (check, link_info.output_bfd,
288*fae548d3Szrj command_line.accept_unknown_input_arch)
289*fae548d3Szrj /* XCOFF archives can have 32 and 64 bit objects. */
290*fae548d3Szrj && !(bfd_get_flavour (check) == bfd_target_xcoff_flavour
291*fae548d3Szrj && (bfd_get_flavour (link_info.output_bfd)
292*fae548d3Szrj == bfd_target_xcoff_flavour)
293*fae548d3Szrj && bfd_check_format (entry->the_bfd, bfd_archive)))
294*fae548d3Szrj {
295*fae548d3Szrj if (command_line.warn_search_mismatch)
296*fae548d3Szrj einfo (_("%P: skipping incompatible %s "
297*fae548d3Szrj "when searching for %s\n"),
298*fae548d3Szrj attempt, entry->local_sym_name);
299*fae548d3Szrj bfd_close (entry->the_bfd);
300*fae548d3Szrj entry->the_bfd = NULL;
301*fae548d3Szrj return FALSE;
302*fae548d3Szrj }
303*fae548d3Szrj }
304*fae548d3Szrj }
305*fae548d3Szrj success:
306*fae548d3Szrj #ifdef ENABLE_PLUGINS
307*fae548d3Szrj /* If plugins are active, they get first chance to claim
308*fae548d3Szrj any successfully-opened input file. We skip archives
309*fae548d3Szrj here; the plugin wants us to offer it the individual
310*fae548d3Szrj members when we enumerate them, not the whole file. We
311*fae548d3Szrj also ignore corefiles, because that's just weird. It is
312*fae548d3Szrj a needed side-effect of calling bfd_check_format with
313*fae548d3Szrj bfd_object that it sets the bfd's arch and mach, which
314*fae548d3Szrj will be needed when and if we want to bfd_create a new
315*fae548d3Szrj one using this one as a template. */
316*fae548d3Szrj if (link_info.lto_plugin_active
317*fae548d3Szrj && !no_more_claiming
318*fae548d3Szrj && bfd_check_format (entry->the_bfd, bfd_object))
319*fae548d3Szrj plugin_maybe_claim (entry);
320*fae548d3Szrj #endif /* ENABLE_PLUGINS */
321*fae548d3Szrj
322*fae548d3Szrj /* It opened OK, the format checked out, and the plugins have had
323*fae548d3Szrj their chance to claim it, so this is success. */
324*fae548d3Szrj return TRUE;
325*fae548d3Szrj }
326*fae548d3Szrj
327*fae548d3Szrj /* Search for and open the file specified by ENTRY. If it is an
328*fae548d3Szrj archive, use ARCH, LIB and SUFFIX to modify the file name. */
329*fae548d3Szrj
330*fae548d3Szrj bfd_boolean
ldfile_open_file_search(const char * arch,lang_input_statement_type * entry,const char * lib,const char * suffix)331*fae548d3Szrj ldfile_open_file_search (const char *arch,
332*fae548d3Szrj lang_input_statement_type *entry,
333*fae548d3Szrj const char *lib,
334*fae548d3Szrj const char *suffix)
335*fae548d3Szrj {
336*fae548d3Szrj search_dirs_type *search;
337*fae548d3Szrj
338*fae548d3Szrj /* If this is not an archive, try to open it in the current
339*fae548d3Szrj directory first. */
340*fae548d3Szrj if (!entry->flags.maybe_archive)
341*fae548d3Szrj {
342*fae548d3Szrj if (entry->flags.sysrooted && IS_ABSOLUTE_PATH (entry->filename))
343*fae548d3Szrj {
344*fae548d3Szrj char *name = concat (ld_sysroot, entry->filename,
345*fae548d3Szrj (const char *) NULL);
346*fae548d3Szrj if (ldfile_try_open_bfd (name, entry))
347*fae548d3Szrj {
348*fae548d3Szrj entry->filename = name;
349*fae548d3Szrj return TRUE;
350*fae548d3Szrj }
351*fae548d3Szrj free (name);
352*fae548d3Szrj }
353*fae548d3Szrj else if (ldfile_try_open_bfd (entry->filename, entry))
354*fae548d3Szrj return TRUE;
355*fae548d3Szrj
356*fae548d3Szrj if (IS_ABSOLUTE_PATH (entry->filename))
357*fae548d3Szrj return FALSE;
358*fae548d3Szrj }
359*fae548d3Szrj
360*fae548d3Szrj for (search = search_head; search != NULL; search = search->next)
361*fae548d3Szrj {
362*fae548d3Szrj char *string;
363*fae548d3Szrj
364*fae548d3Szrj if (entry->flags.dynamic && !bfd_link_relocatable (&link_info))
365*fae548d3Szrj {
366*fae548d3Szrj if (ldemul_open_dynamic_archive (arch, search, entry))
367*fae548d3Szrj return TRUE;
368*fae548d3Szrj }
369*fae548d3Szrj
370*fae548d3Szrj if (entry->flags.maybe_archive && !entry->flags.full_name_provided)
371*fae548d3Szrj string = concat (search->name, slash, lib, entry->filename,
372*fae548d3Szrj arch, suffix, (const char *) NULL);
373*fae548d3Szrj else
374*fae548d3Szrj string = concat (search->name, slash, entry->filename,
375*fae548d3Szrj (const char *) 0);
376*fae548d3Szrj
377*fae548d3Szrj if (ldfile_try_open_bfd (string, entry))
378*fae548d3Szrj {
379*fae548d3Szrj entry->filename = string;
380*fae548d3Szrj return TRUE;
381*fae548d3Szrj }
382*fae548d3Szrj
383*fae548d3Szrj free (string);
384*fae548d3Szrj }
385*fae548d3Szrj
386*fae548d3Szrj return FALSE;
387*fae548d3Szrj }
388*fae548d3Szrj
389*fae548d3Szrj /* Open the input file specified by ENTRY.
390*fae548d3Szrj PR 4437: Do not stop on the first missing file, but
391*fae548d3Szrj continue processing other input files in case there
392*fae548d3Szrj are more errors to report. */
393*fae548d3Szrj
394*fae548d3Szrj void
ldfile_open_file(lang_input_statement_type * entry)395*fae548d3Szrj ldfile_open_file (lang_input_statement_type *entry)
396*fae548d3Szrj {
397*fae548d3Szrj if (entry->the_bfd != NULL)
398*fae548d3Szrj return;
399*fae548d3Szrj
400*fae548d3Szrj if (!entry->flags.search_dirs)
401*fae548d3Szrj {
402*fae548d3Szrj if (ldfile_try_open_bfd (entry->filename, entry))
403*fae548d3Szrj return;
404*fae548d3Szrj
405*fae548d3Szrj if (filename_cmp (entry->filename, entry->local_sym_name) != 0)
406*fae548d3Szrj einfo (_("%P: cannot find %s (%s): %E\n"),
407*fae548d3Szrj entry->filename, entry->local_sym_name);
408*fae548d3Szrj else
409*fae548d3Szrj einfo (_("%P: cannot find %s: %E\n"), entry->local_sym_name);
410*fae548d3Szrj
411*fae548d3Szrj entry->flags.missing_file = TRUE;
412*fae548d3Szrj input_flags.missing_file = TRUE;
413*fae548d3Szrj }
414*fae548d3Szrj else
415*fae548d3Szrj {
416*fae548d3Szrj search_arch_type *arch;
417*fae548d3Szrj bfd_boolean found = FALSE;
418*fae548d3Szrj
419*fae548d3Szrj /* Try to open <filename><suffix> or lib<filename><suffix>.a */
420*fae548d3Szrj for (arch = search_arch_head; arch != NULL; arch = arch->next)
421*fae548d3Szrj {
422*fae548d3Szrj found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
423*fae548d3Szrj if (found)
424*fae548d3Szrj break;
425*fae548d3Szrj #ifdef VMS
426*fae548d3Szrj found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
427*fae548d3Szrj if (found)
428*fae548d3Szrj break;
429*fae548d3Szrj #endif
430*fae548d3Szrj found = ldemul_find_potential_libraries (arch->name, entry);
431*fae548d3Szrj if (found)
432*fae548d3Szrj break;
433*fae548d3Szrj }
434*fae548d3Szrj
435*fae548d3Szrj /* If we have found the file, we don't need to search directories
436*fae548d3Szrj again. */
437*fae548d3Szrj if (found)
438*fae548d3Szrj entry->flags.search_dirs = FALSE;
439*fae548d3Szrj else
440*fae548d3Szrj {
441*fae548d3Szrj if (entry->flags.sysrooted
442*fae548d3Szrj && ld_sysroot
443*fae548d3Szrj && IS_ABSOLUTE_PATH (entry->local_sym_name))
444*fae548d3Szrj einfo (_("%P: cannot find %s inside %s\n"),
445*fae548d3Szrj entry->local_sym_name, ld_sysroot);
446*fae548d3Szrj else
447*fae548d3Szrj einfo (_("%P: cannot find %s\n"), entry->local_sym_name);
448*fae548d3Szrj entry->flags.missing_file = TRUE;
449*fae548d3Szrj input_flags.missing_file = TRUE;
450*fae548d3Szrj }
451*fae548d3Szrj }
452*fae548d3Szrj }
453*fae548d3Szrj
454*fae548d3Szrj /* Try to open NAME. */
455*fae548d3Szrj
456*fae548d3Szrj static FILE *
try_open(const char * name,bfd_boolean * sysrooted)457*fae548d3Szrj try_open (const char *name, bfd_boolean *sysrooted)
458*fae548d3Szrj {
459*fae548d3Szrj FILE *result;
460*fae548d3Szrj
461*fae548d3Szrj result = fopen (name, "r");
462*fae548d3Szrj
463*fae548d3Szrj if (result != NULL)
464*fae548d3Szrj *sysrooted = is_sysrooted_pathname (name);
465*fae548d3Szrj
466*fae548d3Szrj if (verbose)
467*fae548d3Szrj {
468*fae548d3Szrj if (result == NULL)
469*fae548d3Szrj info_msg (_("cannot find script file %s\n"), name);
470*fae548d3Szrj else
471*fae548d3Szrj info_msg (_("opened script file %s\n"), name);
472*fae548d3Szrj }
473*fae548d3Szrj
474*fae548d3Szrj return result;
475*fae548d3Szrj }
476*fae548d3Szrj
477*fae548d3Szrj /* Return TRUE iff directory DIR contains an "ldscripts" subdirectory. */
478*fae548d3Szrj
479*fae548d3Szrj static bfd_boolean
check_for_scripts_dir(char * dir)480*fae548d3Szrj check_for_scripts_dir (char *dir)
481*fae548d3Szrj {
482*fae548d3Szrj char *buf;
483*fae548d3Szrj struct stat s;
484*fae548d3Szrj bfd_boolean res;
485*fae548d3Szrj
486*fae548d3Szrj buf = concat (dir, "/ldscripts", (const char *) NULL);
487*fae548d3Szrj res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode);
488*fae548d3Szrj free (buf);
489*fae548d3Szrj return res;
490*fae548d3Szrj }
491*fae548d3Szrj
492*fae548d3Szrj /* Return the default directory for finding script files.
493*fae548d3Szrj We look for the "ldscripts" directory in:
494*fae548d3Szrj
495*fae548d3Szrj SCRIPTDIR (passed from Makefile)
496*fae548d3Szrj (adjusted according to the current location of the binary)
497*fae548d3Szrj the dir where this program is (for using it from the build tree). */
498*fae548d3Szrj
499*fae548d3Szrj static char *
find_scripts_dir(void)500*fae548d3Szrj find_scripts_dir (void)
501*fae548d3Szrj {
502*fae548d3Szrj char *dir;
503*fae548d3Szrj
504*fae548d3Szrj dir = make_relative_prefix (program_name, BINDIR, SCRIPTDIR);
505*fae548d3Szrj if (dir)
506*fae548d3Szrj {
507*fae548d3Szrj if (check_for_scripts_dir (dir))
508*fae548d3Szrj return dir;
509*fae548d3Szrj free (dir);
510*fae548d3Szrj }
511*fae548d3Szrj
512*fae548d3Szrj dir = make_relative_prefix (program_name, TOOLBINDIR, SCRIPTDIR);
513*fae548d3Szrj if (dir)
514*fae548d3Szrj {
515*fae548d3Szrj if (check_for_scripts_dir (dir))
516*fae548d3Szrj return dir;
517*fae548d3Szrj free (dir);
518*fae548d3Szrj }
519*fae548d3Szrj
520*fae548d3Szrj /* Look for "ldscripts" in the dir where our binary is. */
521*fae548d3Szrj dir = make_relative_prefix (program_name, ".", ".");
522*fae548d3Szrj if (dir)
523*fae548d3Szrj {
524*fae548d3Szrj if (check_for_scripts_dir (dir))
525*fae548d3Szrj return dir;
526*fae548d3Szrj free (dir);
527*fae548d3Szrj }
528*fae548d3Szrj
529*fae548d3Szrj return NULL;
530*fae548d3Szrj }
531*fae548d3Szrj
532*fae548d3Szrj /* If DEFAULT_ONLY is false, try to open NAME; if that fails, look for
533*fae548d3Szrj it in directories specified with -L, then in the default script
534*fae548d3Szrj directory. If DEFAULT_ONLY is true, the search is restricted to
535*fae548d3Szrj the default script location. */
536*fae548d3Szrj
537*fae548d3Szrj static FILE *
ldfile_find_command_file(const char * name,bfd_boolean default_only,bfd_boolean * sysrooted)538*fae548d3Szrj ldfile_find_command_file (const char *name,
539*fae548d3Szrj bfd_boolean default_only,
540*fae548d3Szrj bfd_boolean *sysrooted)
541*fae548d3Szrj {
542*fae548d3Szrj search_dirs_type *search;
543*fae548d3Szrj FILE *result = NULL;
544*fae548d3Szrj char *path;
545*fae548d3Szrj static search_dirs_type *script_search;
546*fae548d3Szrj
547*fae548d3Szrj if (!default_only)
548*fae548d3Szrj {
549*fae548d3Szrj /* First try raw name. */
550*fae548d3Szrj result = try_open (name, sysrooted);
551*fae548d3Szrj if (result != NULL)
552*fae548d3Szrj return result;
553*fae548d3Szrj }
554*fae548d3Szrj
555*fae548d3Szrj if (!script_search)
556*fae548d3Szrj {
557*fae548d3Szrj char *script_dir = find_scripts_dir ();
558*fae548d3Szrj if (script_dir)
559*fae548d3Szrj {
560*fae548d3Szrj search_dirs_type **save_tail_ptr = search_tail_ptr;
561*fae548d3Szrj search_tail_ptr = &script_search;
562*fae548d3Szrj ldfile_add_library_path (script_dir, TRUE);
563*fae548d3Szrj search_tail_ptr = save_tail_ptr;
564*fae548d3Szrj }
565*fae548d3Szrj }
566*fae548d3Szrj
567*fae548d3Szrj /* Temporarily append script_search to the path list so that the
568*fae548d3Szrj paths specified with -L will be searched first. */
569*fae548d3Szrj *search_tail_ptr = script_search;
570*fae548d3Szrj
571*fae548d3Szrj /* Try now prefixes. */
572*fae548d3Szrj for (search = default_only ? script_search : search_head;
573*fae548d3Szrj search != NULL;
574*fae548d3Szrj search = search->next)
575*fae548d3Szrj {
576*fae548d3Szrj path = concat (search->name, slash, name, (const char *) NULL);
577*fae548d3Szrj result = try_open (path, sysrooted);
578*fae548d3Szrj free (path);
579*fae548d3Szrj if (result)
580*fae548d3Szrj break;
581*fae548d3Szrj }
582*fae548d3Szrj
583*fae548d3Szrj /* Restore the original path list. */
584*fae548d3Szrj *search_tail_ptr = NULL;
585*fae548d3Szrj
586*fae548d3Szrj return result;
587*fae548d3Szrj }
588*fae548d3Szrj
589*fae548d3Szrj enum script_open_style {
590*fae548d3Szrj script_nonT,
591*fae548d3Szrj script_T,
592*fae548d3Szrj script_defaultT
593*fae548d3Szrj };
594*fae548d3Szrj
595*fae548d3Szrj struct script_name_list
596*fae548d3Szrj {
597*fae548d3Szrj struct script_name_list *next;
598*fae548d3Szrj enum script_open_style open_how;
599*fae548d3Szrj char name[1];
600*fae548d3Szrj };
601*fae548d3Szrj
602*fae548d3Szrj /* Open command file NAME. */
603*fae548d3Szrj
604*fae548d3Szrj static void
ldfile_open_command_file_1(const char * name,enum script_open_style open_how)605*fae548d3Szrj ldfile_open_command_file_1 (const char *name, enum script_open_style open_how)
606*fae548d3Szrj {
607*fae548d3Szrj FILE *ldlex_input_stack;
608*fae548d3Szrj bfd_boolean sysrooted;
609*fae548d3Szrj static struct script_name_list *processed_scripts = NULL;
610*fae548d3Szrj struct script_name_list *script;
611*fae548d3Szrj size_t len;
612*fae548d3Szrj
613*fae548d3Szrj /* PR 24576: Catch the case where the user has accidentally included
614*fae548d3Szrj the same linker script twice. */
615*fae548d3Szrj for (script = processed_scripts; script != NULL; script = script->next)
616*fae548d3Szrj {
617*fae548d3Szrj if ((open_how != script_nonT || script->open_how != script_nonT)
618*fae548d3Szrj && strcmp (name, script->name) == 0)
619*fae548d3Szrj {
620*fae548d3Szrj einfo (_("%F%P: error: linker script file '%s'"
621*fae548d3Szrj " appears multiple times\n"), name);
622*fae548d3Szrj return;
623*fae548d3Szrj }
624*fae548d3Szrj }
625*fae548d3Szrj
626*fae548d3Szrj /* FIXME: This memory is never freed, but that should not really matter.
627*fae548d3Szrj It will be released when the linker exits, and it is unlikely to ever
628*fae548d3Szrj be more than a few tens of bytes. */
629*fae548d3Szrj len = strlen (name);
630*fae548d3Szrj script = xmalloc (sizeof (*script) + len);
631*fae548d3Szrj script->next = processed_scripts;
632*fae548d3Szrj script->open_how = open_how;
633*fae548d3Szrj memcpy (script->name, name, len + 1);
634*fae548d3Szrj processed_scripts = script;
635*fae548d3Szrj
636*fae548d3Szrj ldlex_input_stack = ldfile_find_command_file (name,
637*fae548d3Szrj open_how == script_defaultT,
638*fae548d3Szrj &sysrooted);
639*fae548d3Szrj if (ldlex_input_stack == NULL)
640*fae548d3Szrj {
641*fae548d3Szrj bfd_set_error (bfd_error_system_call);
642*fae548d3Szrj einfo (_("%F%P: cannot open linker script file %s: %E\n"), name);
643*fae548d3Szrj return;
644*fae548d3Szrj }
645*fae548d3Szrj
646*fae548d3Szrj lex_push_file (ldlex_input_stack, name, sysrooted);
647*fae548d3Szrj
648*fae548d3Szrj lineno = 1;
649*fae548d3Szrj
650*fae548d3Szrj saved_script_handle = ldlex_input_stack;
651*fae548d3Szrj }
652*fae548d3Szrj
653*fae548d3Szrj /* Open command file NAME in the current directory, -L directories,
654*fae548d3Szrj the default script location, in that order. */
655*fae548d3Szrj
656*fae548d3Szrj void
ldfile_open_command_file(const char * name)657*fae548d3Szrj ldfile_open_command_file (const char *name)
658*fae548d3Szrj {
659*fae548d3Szrj ldfile_open_command_file_1 (name, script_nonT);
660*fae548d3Szrj }
661*fae548d3Szrj
662*fae548d3Szrj void
ldfile_open_script_file(const char * name)663*fae548d3Szrj ldfile_open_script_file (const char *name)
664*fae548d3Szrj {
665*fae548d3Szrj ldfile_open_command_file_1 (name, script_T);
666*fae548d3Szrj }
667*fae548d3Szrj
668*fae548d3Szrj /* Open command file NAME at the default script location. */
669*fae548d3Szrj
670*fae548d3Szrj void
ldfile_open_default_command_file(const char * name)671*fae548d3Szrj ldfile_open_default_command_file (const char *name)
672*fae548d3Szrj {
673*fae548d3Szrj ldfile_open_command_file_1 (name, script_defaultT);
674*fae548d3Szrj }
675*fae548d3Szrj
676*fae548d3Szrj void
ldfile_add_arch(const char * in_name)677*fae548d3Szrj ldfile_add_arch (const char *in_name)
678*fae548d3Szrj {
679*fae548d3Szrj char *name = xstrdup (in_name);
680*fae548d3Szrj search_arch_type *new_arch
681*fae548d3Szrj = (search_arch_type *) xmalloc (sizeof (search_arch_type));
682*fae548d3Szrj
683*fae548d3Szrj ldfile_output_machine_name = in_name;
684*fae548d3Szrj
685*fae548d3Szrj new_arch->name = name;
686*fae548d3Szrj new_arch->next = NULL;
687*fae548d3Szrj while (*name)
688*fae548d3Szrj {
689*fae548d3Szrj *name = TOLOWER (*name);
690*fae548d3Szrj name++;
691*fae548d3Szrj }
692*fae548d3Szrj *search_arch_tail_ptr = new_arch;
693*fae548d3Szrj search_arch_tail_ptr = &new_arch->next;
694*fae548d3Szrj
695*fae548d3Szrj }
696*fae548d3Szrj
697*fae548d3Szrj /* Set the output architecture. */
698*fae548d3Szrj
699*fae548d3Szrj void
ldfile_set_output_arch(const char * string,enum bfd_architecture defarch)700*fae548d3Szrj ldfile_set_output_arch (const char *string, enum bfd_architecture defarch)
701*fae548d3Szrj {
702*fae548d3Szrj const bfd_arch_info_type *arch = bfd_scan_arch (string);
703*fae548d3Szrj
704*fae548d3Szrj if (arch)
705*fae548d3Szrj {
706*fae548d3Szrj ldfile_output_architecture = arch->arch;
707*fae548d3Szrj ldfile_output_machine = arch->mach;
708*fae548d3Szrj ldfile_output_machine_name = arch->printable_name;
709*fae548d3Szrj }
710*fae548d3Szrj else if (defarch != bfd_arch_unknown)
711*fae548d3Szrj ldfile_output_architecture = defarch;
712*fae548d3Szrj else
713*fae548d3Szrj einfo (_("%F%P: cannot represent machine `%s'\n"), string);
714*fae548d3Szrj }
715