xref: /dragonfly/contrib/binutils-2.34/ld/ldfile.c (revision fae548d3)
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