ldfile.c revision 60484
1/* Linker file opening and searching.
2   Copyright (C) 1991, 92, 93, 94, 95, 98, 99, 2000
3   Free Software Foundation, Inc.
4
5This file is part of GLD, the Gnu Linker.
6
7GLD is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GLD is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GLD; see the file COPYING.  If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA.  */
21
22/*
23 ldfile.c
24
25 look after all the file stuff
26
27 */
28
29#include "bfd.h"
30#include "sysdep.h"
31#include "bfdlink.h"
32#include "ld.h"
33#include "ldmisc.h"
34#include "ldexp.h"
35#include "ldlang.h"
36#include "ldfile.h"
37#include "ldmain.h"
38#include "ldgram.h"
39#include "ldlex.h"
40#include "ldemul.h"
41
42#include <ctype.h>
43
44const char *ldfile_input_filename;
45boolean ldfile_assumed_script = false;
46const char *ldfile_output_machine_name = "";
47unsigned long ldfile_output_machine;
48enum bfd_architecture ldfile_output_architecture;
49search_dirs_type *search_head;
50
51#ifndef MPW
52#ifdef VMS
53char *slash = "";
54#else
55#if defined (_WIN32) && ! defined (__CYGWIN32__)
56char *slash = "\\";
57#else
58char *slash = "/";
59#endif
60#endif
61#else /* MPW */
62/* The MPW path char is a colon. */
63char *slash = ":";
64#endif /* MPW */
65
66/* LOCAL */
67
68static search_dirs_type **search_tail_ptr = &search_head;
69
70typedef struct search_arch
71{
72  char *name;
73  struct search_arch *next;
74} search_arch_type;
75
76static search_arch_type *search_arch_head;
77static search_arch_type **search_arch_tail_ptr = &search_arch_head;
78
79static FILE *try_open PARAMS ((const char *name, const char *exten));
80
81void
82ldfile_add_library_path (name, cmdline)
83     const char *name;
84     boolean cmdline;
85{
86  search_dirs_type *new;
87
88  new = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
89  new->next = NULL;
90  new->name = name;
91  new->cmdline = cmdline;
92  *search_tail_ptr = new;
93  search_tail_ptr = &new->next;
94}
95
96/* Try to open a BFD for a lang_input_statement.  */
97
98boolean
99ldfile_try_open_bfd (attempt, entry)
100     const char *attempt;
101     lang_input_statement_type *entry;
102{
103  entry->the_bfd = bfd_openr (attempt, entry->target);
104
105  if (trace_file_tries)
106    {
107      if (entry->the_bfd == NULL)
108	info_msg (_("attempt to open %s failed\n"), attempt);
109      else
110	info_msg (_("attempt to open %s succeeded\n"), attempt);
111    }
112
113  if (entry->the_bfd == NULL)
114    {
115      if (bfd_get_error () == bfd_error_invalid_target)
116	einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
117      return false;
118    }
119
120  /* If we are searching for this file, see if the architecture is
121     compatible with the output file.  If it isn't, keep searching.
122     If we can't open the file as an object file, stop the search
123     here.  */
124
125  if (entry->search_dirs_flag)
126    {
127      bfd *check;
128
129      if (bfd_check_format (entry->the_bfd, bfd_archive))
130	check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
131      else
132	check = entry->the_bfd;
133
134      if (check != NULL)
135	{
136	  if (! bfd_check_format (check, bfd_object))
137	    return true;
138	  if (bfd_arch_get_compatible (check, output_bfd) == NULL)
139	    {
140	      einfo (_("%P: skipping incompatible %s when searching for %s"),
141		     attempt, entry->local_sym_name);
142	      bfd_close (entry->the_bfd);
143	      entry->the_bfd = NULL;
144	      return false;
145	    }
146	}
147    }
148
149  return true;
150}
151
152/* Search for and open the file specified by ENTRY.  If it is an
153   archive, use ARCH, LIB and SUFFIX to modify the file name.  */
154
155boolean
156ldfile_open_file_search (arch, entry, lib, suffix)
157     const char *arch;
158     lang_input_statement_type *entry;
159     const char *lib;
160     const char *suffix;
161{
162  search_dirs_type *search;
163
164  /* If this is not an archive, try to open it in the current
165     directory first.  */
166  if (! entry->is_archive)
167    {
168      if (ldfile_try_open_bfd (entry->filename, entry))
169	return true;
170    }
171
172  for (search = search_head;
173       search != (search_dirs_type *)NULL;
174       search = search->next)
175    {
176      char *string;
177
178      if (entry->dynamic && ! link_info.relocateable)
179	{
180	  if (ldemul_open_dynamic_archive (arch, search, entry))
181	    return true;
182	}
183
184      string = (char *) xmalloc (strlen (search->name)
185				 + strlen (slash)
186				 + strlen (lib)
187				 + strlen (entry->filename)
188				 + strlen (arch)
189				 + strlen (suffix)
190				 + 1);
191
192      if (entry->is_archive)
193	sprintf (string, "%s%s%s%s%s%s", search->name, slash,
194		 lib, entry->filename, arch, suffix);
195      else if (entry->filename[0] == '/' || entry->filename[0] == '.'
196#if defined (__MSDOS__) || defined (_WIN32)
197	       || entry->filename[0] == '\\'
198	       || (isalpha (entry->filename[0])
199	           && entry->filename[1] == ':')
200#endif
201	  )
202	strcpy (string, entry->filename);
203      else
204	sprintf (string, "%s%s%s", search->name, slash, entry->filename);
205
206      if (ldfile_try_open_bfd (string, entry))
207	{
208	  entry->filename = string;
209	  return true;
210	}
211
212      free (string);
213    }
214
215  return false;
216}
217
218/* Open the input file specified by ENTRY.  */
219
220void
221ldfile_open_file (entry)
222     lang_input_statement_type *entry;
223{
224  if (entry->the_bfd != NULL)
225    return;
226
227  if (! entry->search_dirs_flag)
228    {
229      if (ldfile_try_open_bfd (entry->filename, entry))
230	return;
231      if (strcmp (entry->filename, entry->local_sym_name) != 0)
232	einfo (_("%F%P: cannot open %s for %s: %E\n"),
233	       entry->filename, entry->local_sym_name);
234      else
235	einfo(_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
236    }
237  else
238    {
239      search_arch_type *arch;
240
241      /* Try to open <filename><suffix> or lib<filename><suffix>.a */
242      for (arch = search_arch_head;
243	   arch != (search_arch_type *) NULL;
244	   arch = arch->next)
245	{
246	  if (ldfile_open_file_search (arch->name, entry, "lib", ".a"))
247	    return;
248#ifdef VMS
249	  if (ldfile_open_file_search (arch->name, entry, ":lib", ".a"))
250	    return;
251#endif
252	  if (ldemul_find_potential_libraries (arch->name, entry))
253	    return;
254	}
255      einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
256    }
257}
258
259/* Try to open NAME; if that fails, try NAME with EXTEN appended to it.  */
260
261static FILE *
262try_open (name, exten)
263     const char *name;
264     const char *exten;
265{
266  FILE *result;
267  char buff[1000];
268
269  result = fopen (name, "r");
270  if (trace_file_tries)
271    {
272      if (result == NULL)
273	info_msg (_("cannot find script file %s\n"), name);
274      else
275	info_msg (_("opened script file %s\n"), name);
276    }
277
278  if (result != NULL)
279    return result;
280
281  if (*exten)
282    {
283      sprintf (buff, "%s%s", name, exten);
284      result = fopen (buff, "r");
285      if (trace_file_tries)
286	{
287	  if (result == NULL)
288	    info_msg (_("cannot find script file %s\n"), buff);
289	  else
290	    info_msg (_("opened script file %s\n"), buff);
291	}
292    }
293
294  return result;
295}
296
297/* Try to open NAME; if that fails, look for it in any directories
298   specified with -L, without and with EXTEND apppended.  */
299
300FILE *
301ldfile_find_command_file (name, extend)
302     const char *name;
303     const char *extend;
304{
305  search_dirs_type *search;
306  FILE *result;
307  char buffer[1000];
308
309  /* First try raw name */
310  result = try_open(name,"");
311  if (result == (FILE *)NULL) {
312    /* Try now prefixes */
313    for (search = search_head;
314	 search != (search_dirs_type *)NULL;
315	 search = search->next) {
316      sprintf(buffer,"%s%s%s", search->name, slash, name);
317      result = try_open(buffer, extend);
318      if (result)break;
319    }
320  }
321  return result;
322}
323
324void
325ldfile_open_command_file (name)
326     const char *name;
327{
328  FILE *ldlex_input_stack;
329  ldlex_input_stack = ldfile_find_command_file(name, "");
330
331  if (ldlex_input_stack == (FILE *)NULL) {
332    bfd_set_error (bfd_error_system_call);
333    einfo(_("%P%F: cannot open linker script file %s: %E\n"),name);
334  }
335  lex_push_file(ldlex_input_stack, name);
336
337  ldfile_input_filename = name;
338  lineno = 1;
339  had_script = true;
340}
341
342
343
344
345
346#ifdef GNU960
347static
348char *
349gnu960_map_archname( name )
350char *name;
351{
352  struct tabentry { char *cmd_switch; char *arch; };
353  static struct tabentry arch_tab[] = {
354	"",   "",
355	"KA", "ka",
356	"KB", "kb",
357	"KC", "mc",	/* Synonym for MC */
358	"MC", "mc",
359	"CA", "ca",
360	"SA", "ka",	/* Functionally equivalent to KA */
361	"SB", "kb",	/* Functionally equivalent to KB */
362	NULL, ""
363  };
364  struct tabentry *tp;
365
366
367  for ( tp = arch_tab; tp->cmd_switch != NULL; tp++ ){
368    if ( !strcmp(name,tp->cmd_switch) ){
369      break;
370    }
371  }
372
373  if ( tp->cmd_switch == NULL ){
374    einfo(_("%P%F: unknown architecture: %s\n"),name);
375  }
376  return tp->arch;
377}
378
379
380
381void
382ldfile_add_arch(name)
383char *name;
384{
385  search_arch_type *new =
386    (search_arch_type *)xmalloc((bfd_size_type)(sizeof(search_arch_type)));
387
388
389  if (*name != '\0') {
390    if (ldfile_output_machine_name[0] != '\0') {
391      einfo(_("%P%F: target architecture respecified\n"));
392      return;
393    }
394    ldfile_output_machine_name = name;
395  }
396
397  new->next = (search_arch_type*)NULL;
398  new->name = gnu960_map_archname( name );
399  *search_arch_tail_ptr = new;
400  search_arch_tail_ptr = &new->next;
401
402}
403
404#else	/* not GNU960 */
405
406
407void
408ldfile_add_arch (in_name)
409     CONST char * in_name;
410{
411  char *name = buystring(in_name);
412  search_arch_type *new =
413    (search_arch_type *) xmalloc (sizeof (search_arch_type));
414
415  ldfile_output_machine_name = in_name;
416
417  new->name = name;
418  new->next = (search_arch_type*)NULL;
419  while (*name)
420    {
421      if (isupper ((unsigned char) *name))
422	*name = tolower ((unsigned char) *name);
423      name++;
424    }
425  *search_arch_tail_ptr = new;
426  search_arch_tail_ptr = &new->next;
427
428}
429#endif
430
431/* Set the output architecture */
432void
433ldfile_set_output_arch (string)
434     CONST char *string;
435{
436  const bfd_arch_info_type *arch = bfd_scan_arch(string);
437
438  if (arch) {
439    ldfile_output_architecture = arch->arch;
440    ldfile_output_machine = arch->mach;
441    ldfile_output_machine_name = arch->printable_name;
442  }
443  else {
444    einfo(_("%P%F: cannot represent machine `%s'\n"), string);
445  }
446}
447