160484Sobrien/* Linker file opening and searching.
2130561Sobrien   Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
3218822Sdim   2003, 2004, 2005, 2007 Free Software Foundation, Inc.
433965Sjdp
5130561Sobrien   This file is part of GLD, the Gnu Linker.
633965Sjdp
7130561Sobrien   GLD is free software; you can redistribute it and/or modify
8130561Sobrien   it under the terms of the GNU General Public License as published by
9130561Sobrien   the Free Software Foundation; either version 2, or (at your option)
10130561Sobrien   any later version.
1133965Sjdp
12130561Sobrien   GLD is distributed in the hope that it will be useful,
13130561Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
14130561Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15130561Sobrien   GNU General Public License for more details.
1633965Sjdp
17130561Sobrien   You should have received a copy of the GNU General Public License
18130561Sobrien   along with GLD; see the file COPYING.  If not, write to the Free
19218822Sdim   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20218822Sdim   02110-1301, USA.  */
2133965Sjdp
2277298Sobrien/* ldfile.c:  look after all the file stuff.  */
2333965Sjdp
24218822Sdim#include "sysdep.h"
2533965Sjdp#include "bfd.h"
2633965Sjdp#include "bfdlink.h"
2789857Sobrien#include "safe-ctype.h"
2833965Sjdp#include "ld.h"
2933965Sjdp#include "ldmisc.h"
3033965Sjdp#include "ldexp.h"
3133965Sjdp#include "ldlang.h"
3233965Sjdp#include "ldfile.h"
3333965Sjdp#include "ldmain.h"
34107492Sobrien#include <ldgram.h>
3533965Sjdp#include "ldlex.h"
3633965Sjdp#include "ldemul.h"
3778828Sobrien#include "libiberty.h"
38130561Sobrien#include "filenames.h"
3933965Sjdp
40130561Sobrienconst char * ldfile_input_filename;
41130561Sobrienbfd_boolean  ldfile_assumed_script = FALSE;
42130561Sobrienconst char * ldfile_output_machine_name = "";
4333965Sjdpunsigned long ldfile_output_machine;
4433965Sjdpenum bfd_architecture ldfile_output_architecture;
45130561Sobriensearch_dirs_type * search_head;
4633965Sjdp
4733965Sjdp#ifdef VMS
48218822Sdimstatic char * slash = "";
4933965Sjdp#else
5038889Sjdp#if defined (_WIN32) && ! defined (__CYGWIN32__)
51218822Sdimstatic char * slash = "\\";
5238889Sjdp#else
53218822Sdimstatic char * slash = "/";
5433965Sjdp#endif
5538889Sjdp#endif
5633965Sjdp
57130561Sobrientypedef struct search_arch
58130561Sobrien{
5977298Sobrien  char *name;
6033965Sjdp  struct search_arch *next;
6133965Sjdp} search_arch_type;
6233965Sjdp
63130561Sobrienstatic search_dirs_type **search_tail_ptr = &search_head;
6433965Sjdpstatic search_arch_type *search_arch_head;
6533965Sjdpstatic search_arch_type **search_arch_tail_ptr = &search_arch_head;
6677298Sobrien
67130561Sobrien/* Test whether a pathname, after canonicalization, is the same or a
68130561Sobrien   sub-directory of the sysroot directory.  */
6933965Sjdp
70130561Sobrienstatic bfd_boolean
71130561Sobrienis_sysrooted_pathname (const char *name, bfd_boolean notsame)
72130561Sobrien{
73130561Sobrien  char * realname = ld_canon_sysroot ? lrealpath (name) : NULL;
74130561Sobrien  int len;
75130561Sobrien  bfd_boolean result;
76130561Sobrien
77130561Sobrien  if (! realname)
78130561Sobrien    return FALSE;
79130561Sobrien
80130561Sobrien  len = strlen (realname);
81130561Sobrien
82130561Sobrien  if (((! notsame && len == ld_canon_sysroot_len)
83130561Sobrien       || (len >= ld_canon_sysroot_len
84130561Sobrien	   && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])
85130561Sobrien	   && (realname[ld_canon_sysroot_len] = '\0') == '\0'))
86130561Sobrien      && FILENAME_CMP (ld_canon_sysroot, realname) == 0)
87130561Sobrien    result = TRUE;
88130561Sobrien  else
89130561Sobrien    result = FALSE;
90130561Sobrien
91130561Sobrien  if (realname)
92130561Sobrien    free (realname);
93130561Sobrien
94130561Sobrien  return result;
95130561Sobrien}
96130561Sobrien
97130561Sobrien/* Adds NAME to the library search path.
98130561Sobrien   Makes a copy of NAME using xmalloc().  */
99130561Sobrien
10033965Sjdpvoid
101130561Sobrienldfile_add_library_path (const char *name, bfd_boolean cmdline)
10233965Sjdp{
10333965Sjdp  search_dirs_type *new;
10433965Sjdp
10589857Sobrien  if (!cmdline && config.only_cmd_line_lib_dirs)
10689857Sobrien    return;
10789857Sobrien
108130561Sobrien  new = xmalloc (sizeof (search_dirs_type));
10933965Sjdp  new->next = NULL;
11033965Sjdp  new->cmdline = cmdline;
11133965Sjdp  *search_tail_ptr = new;
11233965Sjdp  search_tail_ptr = &new->next;
113130561Sobrien
114130561Sobrien  /* If a directory is marked as honoring sysroot, prepend the sysroot path
115130561Sobrien     now.  */
116130561Sobrien  if (name[0] == '=')
117130561Sobrien    {
118130561Sobrien      new->name = concat (ld_sysroot, name + 1, NULL);
119130561Sobrien      new->sysrooted = TRUE;
120130561Sobrien    }
121130561Sobrien  else
122130561Sobrien    {
123130561Sobrien      new->name = xstrdup (name);
124130561Sobrien      new->sysrooted = is_sysrooted_pathname (name, FALSE);
125130561Sobrien    }
12633965Sjdp}
12733965Sjdp
12833965Sjdp/* Try to open a BFD for a lang_input_statement.  */
12933965Sjdp
130130561Sobrienbfd_boolean
131130561Sobrienldfile_try_open_bfd (const char *attempt,
132130561Sobrien		     lang_input_statement_type *entry)
13333965Sjdp{
13433965Sjdp  entry->the_bfd = bfd_openr (attempt, entry->target);
13533965Sjdp
13633965Sjdp  if (trace_file_tries)
13760484Sobrien    {
13860484Sobrien      if (entry->the_bfd == NULL)
13960484Sobrien	info_msg (_("attempt to open %s failed\n"), attempt);
14060484Sobrien      else
14160484Sobrien	info_msg (_("attempt to open %s succeeded\n"), attempt);
14260484Sobrien    }
14333965Sjdp
14460484Sobrien  if (entry->the_bfd == NULL)
14533965Sjdp    {
14633965Sjdp      if (bfd_get_error () == bfd_error_invalid_target)
14760484Sobrien	einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
148130561Sobrien      return FALSE;
14933965Sjdp    }
15060484Sobrien
15160484Sobrien  /* If we are searching for this file, see if the architecture is
15260484Sobrien     compatible with the output file.  If it isn't, keep searching.
15360484Sobrien     If we can't open the file as an object file, stop the search
154218822Sdim     here.  If we are statically linking, ensure that we don't link
155218822Sdim     a dynamic object.  */
15660484Sobrien
157218822Sdim  if (entry->search_dirs_flag || !entry->dynamic)
15860484Sobrien    {
15960484Sobrien      bfd *check;
16060484Sobrien
16160484Sobrien      if (bfd_check_format (entry->the_bfd, bfd_archive))
16260484Sobrien	check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
16360484Sobrien      else
16460484Sobrien	check = entry->the_bfd;
16560484Sobrien
16660484Sobrien      if (check != NULL)
16760484Sobrien	{
16860484Sobrien	  if (! bfd_check_format (check, bfd_object))
169107492Sobrien	    {
170107492Sobrien	      if (check == entry->the_bfd
171218822Sdim		  && entry->search_dirs_flag
172107492Sobrien		  && bfd_get_error () == bfd_error_file_not_recognized
173107492Sobrien		  && ! ldemul_unrecognized_file (entry))
174107492Sobrien		{
175107492Sobrien		  int token, skip = 0;
176107492Sobrien		  char *arg, *arg1, *arg2, *arg3;
177107492Sobrien		  extern FILE *yyin;
178104834Sobrien
179107492Sobrien		  /* Try to interpret the file as a linker script.  */
180107492Sobrien		  ldfile_open_command_file (attempt);
181130561Sobrien
182130561Sobrien		  ldfile_assumed_script = TRUE;
183107492Sobrien		  parser_input = input_selected;
184107492Sobrien		  ldlex_both ();
185107492Sobrien		  token = INPUT_SCRIPT;
186107492Sobrien		  while (token != 0)
187107492Sobrien		    {
188107492Sobrien		      switch (token)
189107492Sobrien			{
190107492Sobrien			case OUTPUT_FORMAT:
191107492Sobrien			  if ((token = yylex ()) != '(')
192107492Sobrien			    continue;
193107492Sobrien			  if ((token = yylex ()) != NAME)
194107492Sobrien			    continue;
195107492Sobrien			  arg1 = yylval.name;
196107492Sobrien			  arg2 = NULL;
197107492Sobrien			  arg3 = NULL;
198107492Sobrien			  token = yylex ();
199107492Sobrien			  if (token == ',')
200107492Sobrien			    {
201107492Sobrien			      if ((token = yylex ()) != NAME)
202107492Sobrien				{
203107492Sobrien				  free (arg1);
204107492Sobrien				  continue;
205107492Sobrien				}
206107492Sobrien			      arg2 = yylval.name;
207107492Sobrien			      if ((token = yylex ()) != ','
208107492Sobrien				  || (token = yylex ()) != NAME)
209107492Sobrien				{
210107492Sobrien				  free (arg1);
211107492Sobrien				  free (arg2);
212107492Sobrien				  continue;
213107492Sobrien				}
214107492Sobrien			      arg3 = yylval.name;
215107492Sobrien			      token = yylex ();
216107492Sobrien			    }
217107492Sobrien			  if (token == ')')
218107492Sobrien			    {
219107492Sobrien			      switch (command_line.endian)
220107492Sobrien				{
221107492Sobrien				default:
222107492Sobrien				case ENDIAN_UNSET:
223107492Sobrien				  arg = arg1; break;
224107492Sobrien				case ENDIAN_BIG:
225107492Sobrien				  arg = arg2 ? arg2 : arg1; break;
226107492Sobrien				case ENDIAN_LITTLE:
227107492Sobrien				  arg = arg3 ? arg3 : arg1; break;
228107492Sobrien				}
229107492Sobrien			      if (strcmp (arg, lang_get_output_target ()) != 0)
230107492Sobrien				skip = 1;
231107492Sobrien			    }
232107492Sobrien			  free (arg1);
233107492Sobrien			  if (arg2) free (arg2);
234107492Sobrien			  if (arg3) free (arg3);
235107492Sobrien			  break;
236107492Sobrien			case NAME:
237107492Sobrien			case LNAME:
238107492Sobrien			case VERS_IDENTIFIER:
239107492Sobrien			case VERS_TAG:
240107492Sobrien			  free (yylval.name);
241107492Sobrien			  break;
242107492Sobrien			case INT:
243107492Sobrien			  if (yylval.bigint.str)
244107492Sobrien			    free (yylval.bigint.str);
245107492Sobrien			  break;
246130561Sobrien			}
247107492Sobrien		      token = yylex ();
248107492Sobrien		    }
249130561Sobrien		  ldlex_popstate ();
250130561Sobrien		  ldfile_assumed_script = FALSE;
251107492Sobrien		  fclose (yyin);
252107492Sobrien		  yyin = NULL;
253107492Sobrien		  if (skip)
254107492Sobrien		    {
255218822Sdim		      if (command_line.warn_search_mismatch)
256218822Sdim			einfo (_("%P: skipping incompatible %s "
257218822Sdim				 "when searching for %s\n"),
258218822Sdim			       attempt, entry->local_sym_name);
259107492Sobrien		      bfd_close (entry->the_bfd);
260107492Sobrien		      entry->the_bfd = NULL;
261130561Sobrien		      return FALSE;
262107492Sobrien		    }
263107492Sobrien		}
264130561Sobrien	      return TRUE;
265107492Sobrien	    }
266107492Sobrien
267218822Sdim	  if (!entry->dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
268218822Sdim	    {
269218822Sdim	      einfo (_("%F%P: attempted static link of dynamic object `%s'\n"),
270218822Sdim		     attempt);
271218822Sdim	      bfd_close (entry->the_bfd);
272218822Sdim	      entry->the_bfd = NULL;
273218822Sdim	      return FALSE;
274218822Sdim	    }
275218822Sdim
276218822Sdim	  if (entry->search_dirs_flag
277218822Sdim	      && !bfd_arch_get_compatible (check, output_bfd,
278218822Sdim					   command_line.accept_unknown_input_arch)
279130561Sobrien	      /* XCOFF archives can have 32 and 64 bit objects.  */
280104834Sobrien	      && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
281104834Sobrien		    && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour
282104834Sobrien		    && bfd_check_format (entry->the_bfd, bfd_archive)))
28360484Sobrien	    {
284218822Sdim	      if (command_line.warn_search_mismatch)
285218822Sdim		einfo (_("%P: skipping incompatible %s "
286218822Sdim			 "when searching for %s\n"),
287218822Sdim		       attempt, entry->local_sym_name);
28860484Sobrien	      bfd_close (entry->the_bfd);
28960484Sobrien	      entry->the_bfd = NULL;
290130561Sobrien	      return FALSE;
29160484Sobrien	    }
29260484Sobrien	}
29360484Sobrien    }
29460484Sobrien
295130561Sobrien  return TRUE;
29633965Sjdp}
29733965Sjdp
29833965Sjdp/* Search for and open the file specified by ENTRY.  If it is an
29933965Sjdp   archive, use ARCH, LIB and SUFFIX to modify the file name.  */
30033965Sjdp
301130561Sobrienbfd_boolean
302130561Sobrienldfile_open_file_search (const char *arch,
303130561Sobrien			 lang_input_statement_type *entry,
304130561Sobrien			 const char *lib,
305130561Sobrien			 const char *suffix)
30633965Sjdp{
30733965Sjdp  search_dirs_type *search;
30833965Sjdp
30933965Sjdp  /* If this is not an archive, try to open it in the current
31033965Sjdp     directory first.  */
31133965Sjdp  if (! entry->is_archive)
31233965Sjdp    {
313130561Sobrien      if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
314130561Sobrien	{
315130561Sobrien	  char *name = concat (ld_sysroot, entry->filename,
316130561Sobrien			       (const char *) NULL);
317130561Sobrien	  if (ldfile_try_open_bfd (name, entry))
318130561Sobrien	    {
319130561Sobrien	      entry->filename = name;
320130561Sobrien	      return TRUE;
321130561Sobrien	    }
322130561Sobrien	  free (name);
323130561Sobrien	}
324130561Sobrien      else if (ldfile_try_open_bfd (entry->filename, entry))
325130561Sobrien	{
326130561Sobrien	  entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
327130561Sobrien	    && is_sysrooted_pathname (entry->filename, TRUE);
328130561Sobrien	  return TRUE;
329130561Sobrien	}
330130561Sobrien
331130561Sobrien      if (IS_ABSOLUTE_PATH (entry->filename))
332130561Sobrien	return FALSE;
33333965Sjdp    }
33433965Sjdp
335130561Sobrien  for (search = search_head; search != NULL; search = search->next)
33633965Sjdp    {
33733965Sjdp      char *string;
33833965Sjdp
339130561Sobrien      if (entry->dynamic && ! link_info.relocatable)
34033965Sjdp	{
34133965Sjdp	  if (ldemul_open_dynamic_archive (arch, search, entry))
342130561Sobrien	    {
343130561Sobrien	      entry->sysrooted = search->sysrooted;
344130561Sobrien	      return TRUE;
345130561Sobrien	    }
34633965Sjdp	}
34733965Sjdp
348130561Sobrien      string = xmalloc (strlen (search->name)
349130561Sobrien			+ strlen (slash)
350130561Sobrien			+ strlen (lib)
351130561Sobrien			+ strlen (entry->filename)
352130561Sobrien			+ strlen (arch)
353130561Sobrien			+ strlen (suffix)
354130561Sobrien			+ 1);
35533965Sjdp
35633965Sjdp      if (entry->is_archive)
35733965Sjdp	sprintf (string, "%s%s%s%s%s%s", search->name, slash,
35833965Sjdp		 lib, entry->filename, arch, suffix);
35933965Sjdp      else
36033965Sjdp	sprintf (string, "%s%s%s", search->name, slash, entry->filename);
36133965Sjdp
36233965Sjdp      if (ldfile_try_open_bfd (string, entry))
36333965Sjdp	{
36433965Sjdp	  entry->filename = string;
365130561Sobrien	  entry->sysrooted = search->sysrooted;
366130561Sobrien	  return TRUE;
36733965Sjdp	}
36833965Sjdp
36933965Sjdp      free (string);
37033965Sjdp    }
37133965Sjdp
372130561Sobrien  return FALSE;
37333965Sjdp}
37433965Sjdp
37533965Sjdp/* Open the input file specified by ENTRY.  */
37633965Sjdp
37733965Sjdpvoid
378130561Sobrienldfile_open_file (lang_input_statement_type *entry)
37933965Sjdp{
38033965Sjdp  if (entry->the_bfd != NULL)
38133965Sjdp    return;
38233965Sjdp
38333965Sjdp  if (! entry->search_dirs_flag)
38433965Sjdp    {
38533965Sjdp      if (ldfile_try_open_bfd (entry->filename, entry))
38633965Sjdp	return;
38760484Sobrien      if (strcmp (entry->filename, entry->local_sym_name) != 0)
388130561Sobrien	einfo (_("%F%P: %s (%s): No such file: %E\n"),
38960484Sobrien	       entry->filename, entry->local_sym_name);
39060484Sobrien      else
391130561Sobrien	einfo (_("%F%P: %s: No such file: %E\n"), entry->local_sym_name);
39233965Sjdp    }
39333965Sjdp  else
39433965Sjdp    {
39533965Sjdp      search_arch_type *arch;
396130561Sobrien      bfd_boolean found = FALSE;
39733965Sjdp
39833965Sjdp      /* Try to open <filename><suffix> or lib<filename><suffix>.a */
399130561Sobrien      for (arch = search_arch_head; arch != NULL; arch = arch->next)
40033965Sjdp	{
40178828Sobrien	  found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
40278828Sobrien	  if (found)
40378828Sobrien	    break;
40433965Sjdp#ifdef VMS
40578828Sobrien	  found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
40678828Sobrien	  if (found)
40778828Sobrien	    break;
40833965Sjdp#endif
40978828Sobrien	  found = ldemul_find_potential_libraries (arch->name, entry);
41078828Sobrien	  if (found)
41178828Sobrien	    break;
41233965Sjdp	}
41377298Sobrien
41478828Sobrien      /* If we have found the file, we don't need to search directories
41578828Sobrien	 again.  */
41678828Sobrien      if (found)
417130561Sobrien	entry->search_dirs_flag = FALSE;
418130561Sobrien      else if (entry->sysrooted
419130561Sobrien	       && ld_sysroot
420130561Sobrien	       && IS_ABSOLUTE_PATH (entry->local_sym_name))
421130561Sobrien	einfo (_("%F%P: cannot find %s inside %s\n"),
422130561Sobrien	       entry->local_sym_name, ld_sysroot);
42378828Sobrien      else
42478828Sobrien	einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
42533965Sjdp    }
42633965Sjdp}
42733965Sjdp
42833965Sjdp/* Try to open NAME; if that fails, try NAME with EXTEN appended to it.  */
42933965Sjdp
43033965Sjdpstatic FILE *
431130561Sobrientry_open (const char *name, const char *exten)
43233965Sjdp{
43333965Sjdp  FILE *result;
43433965Sjdp  char buff[1000];
43533965Sjdp
43633965Sjdp  result = fopen (name, "r");
43777298Sobrien
43833965Sjdp  if (trace_file_tries)
43933965Sjdp    {
44033965Sjdp      if (result == NULL)
44160484Sobrien	info_msg (_("cannot find script file %s\n"), name);
44233965Sjdp      else
44360484Sobrien	info_msg (_("opened script file %s\n"), name);
44433965Sjdp    }
44533965Sjdp
44633965Sjdp  if (result != NULL)
44733965Sjdp    return result;
44833965Sjdp
44933965Sjdp  if (*exten)
45033965Sjdp    {
45133965Sjdp      sprintf (buff, "%s%s", name, exten);
45233965Sjdp      result = fopen (buff, "r");
45377298Sobrien
45433965Sjdp      if (trace_file_tries)
45533965Sjdp	{
45633965Sjdp	  if (result == NULL)
45760484Sobrien	    info_msg (_("cannot find script file %s\n"), buff);
45833965Sjdp	  else
45960484Sobrien	    info_msg (_("opened script file %s\n"), buff);
46033965Sjdp	}
46133965Sjdp    }
46233965Sjdp
46333965Sjdp  return result;
46433965Sjdp}
46533965Sjdp
46633965Sjdp/* Try to open NAME; if that fails, look for it in any directories
467130561Sobrien   specified with -L, without and with EXTEND appended.  */
46833965Sjdp
469218822Sdimstatic FILE *
470130561Sobrienldfile_find_command_file (const char *name, const char *extend)
47133965Sjdp{
47233965Sjdp  search_dirs_type *search;
47333965Sjdp  FILE *result;
47433965Sjdp  char buffer[1000];
47533965Sjdp
47677298Sobrien  /* First try raw name.  */
47777298Sobrien  result = try_open (name, "");
478130561Sobrien  if (result == NULL)
47977298Sobrien    {
48077298Sobrien      /* Try now prefixes.  */
481130561Sobrien      for (search = search_head; search != NULL; search = search->next)
48277298Sobrien	{
48377298Sobrien	  sprintf (buffer, "%s%s%s", search->name, slash, name);
48477298Sobrien
48577298Sobrien	  result = try_open (buffer, extend);
48677298Sobrien	  if (result)
48777298Sobrien	    break;
48877298Sobrien	}
48933965Sjdp    }
49077298Sobrien
49133965Sjdp  return result;
49233965Sjdp}
49333965Sjdp
49433965Sjdpvoid
495130561Sobrienldfile_open_command_file (const char *name)
49633965Sjdp{
49733965Sjdp  FILE *ldlex_input_stack;
49877298Sobrien  ldlex_input_stack = ldfile_find_command_file (name, "");
49933965Sjdp
500130561Sobrien  if (ldlex_input_stack == NULL)
50177298Sobrien    {
50277298Sobrien      bfd_set_error (bfd_error_system_call);
50377298Sobrien      einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
50477298Sobrien    }
50577298Sobrien
50677298Sobrien  lex_push_file (ldlex_input_stack, name);
50777298Sobrien
50833965Sjdp  ldfile_input_filename = name;
50933965Sjdp  lineno = 1;
510104834Sobrien
51189857Sobrien  saved_script_handle = ldlex_input_stack;
51233965Sjdp}
51333965Sjdp
51433965Sjdpvoid
515130561Sobrienldfile_add_arch (const char *in_name)
51633965Sjdp{
51778828Sobrien  char *name = xstrdup (in_name);
518130561Sobrien  search_arch_type *new = xmalloc (sizeof (search_arch_type));
51933965Sjdp
52033965Sjdp  ldfile_output_machine_name = in_name;
52133965Sjdp
52233965Sjdp  new->name = name;
523130561Sobrien  new->next = NULL;
52438889Sjdp  while (*name)
52538889Sjdp    {
52689857Sobrien      *name = TOLOWER (*name);
52738889Sjdp      name++;
52838889Sjdp    }
52933965Sjdp  *search_arch_tail_ptr = new;
53033965Sjdp  search_arch_tail_ptr = &new->next;
53133965Sjdp
53233965Sjdp}
53333965Sjdp
53477298Sobrien/* Set the output architecture.  */
53577298Sobrien
53633965Sjdpvoid
537130561Sobrienldfile_set_output_arch (const char *string, enum bfd_architecture defarch)
53833965Sjdp{
53977298Sobrien  const bfd_arch_info_type *arch = bfd_scan_arch (string);
54033965Sjdp
54177298Sobrien  if (arch)
54277298Sobrien    {
54377298Sobrien      ldfile_output_architecture = arch->arch;
54477298Sobrien      ldfile_output_machine = arch->mach;
54577298Sobrien      ldfile_output_machine_name = arch->printable_name;
54677298Sobrien    }
547130561Sobrien  else if (defarch != bfd_arch_unknown)
548130561Sobrien    ldfile_output_architecture = defarch;
54977298Sobrien  else
550130561Sobrien    einfo (_("%P%F: cannot represent machine `%s'\n"), string);
55133965Sjdp}
552