2003-05-02 Andrew Cagney <cagney@redhat.com>
[binutils.git] / ld / ldfile.c
blob4806534a74a0358c8624fe41a4dad5ebb396d70d
1 /* Linker file opening and searching.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
5 This file is part of GLD, the Gnu Linker.
7 GLD is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GLD is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GLD; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 /* ldfile.c: look after all the file stuff. */
24 #include "bfd.h"
25 #include "sysdep.h"
26 #include "bfdlink.h"
27 #include "safe-ctype.h"
28 #include "ld.h"
29 #include "ldmisc.h"
30 #include "ldexp.h"
31 #include "ldlang.h"
32 #include "ldfile.h"
33 #include "ldmain.h"
34 #include <ldgram.h>
35 #include "ldlex.h"
36 #include "ldemul.h"
37 #include "libiberty.h"
38 #include "filenames.h"
40 const char * ldfile_input_filename;
41 bfd_boolean ldfile_assumed_script = FALSE;
42 const char * ldfile_output_machine_name = "";
43 unsigned long ldfile_output_machine;
44 enum bfd_architecture ldfile_output_architecture;
45 search_dirs_type * search_head;
47 #ifndef MPW
48 #ifdef VMS
49 char * slash = "";
50 #else
51 #if defined (_WIN32) && ! defined (__CYGWIN32__)
52 char * slash = "\\";
53 #else
54 char * slash = "/";
55 #endif
56 #endif
57 #else /* MPW */
58 /* The MPW path char is a colon. */
59 char * slash = ":";
60 #endif /* MPW */
62 typedef struct search_arch
64 char *name;
65 struct search_arch *next;
66 } search_arch_type;
68 static search_dirs_type **search_tail_ptr = &search_head;
69 static search_arch_type *search_arch_head;
70 static search_arch_type **search_arch_tail_ptr = &search_arch_head;
72 static FILE *try_open
73 PARAMS ((const char *, const char *));
74 static bfd_boolean is_sysrooted_pathname
75 PARAMS ((const char *, bfd_boolean));
77 /* Test whether a pathname, after canonicalization, is the same or a
78 sub-directory of the sysroot directory. */
80 static bfd_boolean
81 is_sysrooted_pathname (name, notsame)
82 const char *name;
83 bfd_boolean notsame;
85 char * realname = ld_canon_sysroot ? lrealpath (name) : NULL;
86 int len;
87 bfd_boolean result;
89 if (! realname)
90 return FALSE;
92 len = strlen (realname);
94 if (((! notsame && len == ld_canon_sysroot_len)
95 || (len >= ld_canon_sysroot_len
96 && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])
97 && (realname[ld_canon_sysroot_len] = '\0') == '\0'))
98 && FILENAME_CMP (ld_canon_sysroot, realname) == 0)
99 result = TRUE;
100 else
101 result = FALSE;
103 if (realname)
104 free (realname);
106 return result;
109 /* Adds NAME to the library search path.
110 Makes a copy of NAME using xmalloc(). */
112 void
113 ldfile_add_library_path (name, cmdline)
114 const char *name;
115 bfd_boolean cmdline;
117 search_dirs_type *new;
119 if (!cmdline && config.only_cmd_line_lib_dirs)
120 return;
122 new = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
123 new->next = NULL;
124 new->cmdline = cmdline;
125 *search_tail_ptr = new;
126 search_tail_ptr = &new->next;
128 /* If a directory is marked as honoring sysroot, prepend the sysroot path
129 now. */
130 if (name[0] == '=')
132 new->name = concat (ld_sysroot, name + 1, NULL);
133 new->sysrooted = TRUE;
135 else
137 new->name = xstrdup (name);
138 new->sysrooted = is_sysrooted_pathname (name, FALSE);
142 /* Try to open a BFD for a lang_input_statement. */
144 bfd_boolean
145 ldfile_try_open_bfd (attempt, entry)
146 const char *attempt;
147 lang_input_statement_type *entry;
149 entry->the_bfd = bfd_openr (attempt, entry->target);
151 if (trace_file_tries)
153 if (entry->the_bfd == NULL)
154 info_msg (_("attempt to open %s failed\n"), attempt);
155 else
156 info_msg (_("attempt to open %s succeeded\n"), attempt);
159 if (entry->the_bfd == NULL)
161 if (bfd_get_error () == bfd_error_invalid_target)
162 einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
163 return FALSE;
166 /* If we are searching for this file, see if the architecture is
167 compatible with the output file. If it isn't, keep searching.
168 If we can't open the file as an object file, stop the search
169 here. */
171 if (entry->search_dirs_flag)
173 bfd *check;
175 if (bfd_check_format (entry->the_bfd, bfd_archive))
176 check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
177 else
178 check = entry->the_bfd;
180 if (check != NULL)
182 if (! bfd_check_format (check, bfd_object))
184 if (check == entry->the_bfd
185 && bfd_get_error () == bfd_error_file_not_recognized
186 && ! ldemul_unrecognized_file (entry))
188 int token, skip = 0;
189 char *arg, *arg1, *arg2, *arg3;
190 extern FILE *yyin;
192 /* Try to interpret the file as a linker script. */
193 ldfile_open_command_file (attempt);
195 ldfile_assumed_script = TRUE;
196 parser_input = input_selected;
197 ldlex_both ();
198 token = INPUT_SCRIPT;
199 while (token != 0)
201 switch (token)
203 case OUTPUT_FORMAT:
204 if ((token = yylex ()) != '(')
205 continue;
206 if ((token = yylex ()) != NAME)
207 continue;
208 arg1 = yylval.name;
209 arg2 = NULL;
210 arg3 = NULL;
211 token = yylex ();
212 if (token == ',')
214 if ((token = yylex ()) != NAME)
216 free (arg1);
217 continue;
219 arg2 = yylval.name;
220 if ((token = yylex ()) != ','
221 || (token = yylex ()) != NAME)
223 free (arg1);
224 free (arg2);
225 continue;
227 arg3 = yylval.name;
228 token = yylex ();
230 if (token == ')')
232 switch (command_line.endian)
234 default:
235 case ENDIAN_UNSET:
236 arg = arg1; break;
237 case ENDIAN_BIG:
238 arg = arg2 ? arg2 : arg1; break;
239 case ENDIAN_LITTLE:
240 arg = arg3 ? arg3 : arg1; break;
242 if (strcmp (arg, lang_get_output_target ()) != 0)
243 skip = 1;
245 free (arg1);
246 if (arg2) free (arg2);
247 if (arg3) free (arg3);
248 break;
249 case NAME:
250 case LNAME:
251 case VERS_IDENTIFIER:
252 case VERS_TAG:
253 free (yylval.name);
254 break;
255 case INT:
256 if (yylval.bigint.str)
257 free (yylval.bigint.str);
258 break;
260 token = yylex ();
262 ldlex_popstate ();
263 ldfile_assumed_script = FALSE;
264 fclose (yyin);
265 yyin = NULL;
266 if (skip)
268 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
269 attempt, entry->local_sym_name);
270 bfd_close (entry->the_bfd);
271 entry->the_bfd = NULL;
272 return FALSE;
275 return TRUE;
278 if ((bfd_arch_get_compatible (check, output_bfd,
279 command_line.accept_unknown_input_arch) == NULL)
280 /* XCOFF archives can have 32 and 64 bit objects. */
281 && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
282 && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour
283 && bfd_check_format (entry->the_bfd, bfd_archive)))
285 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
286 attempt, entry->local_sym_name);
287 bfd_close (entry->the_bfd);
288 entry->the_bfd = NULL;
289 return FALSE;
294 return TRUE;
297 /* Search for and open the file specified by ENTRY. If it is an
298 archive, use ARCH, LIB and SUFFIX to modify the file name. */
300 bfd_boolean
301 ldfile_open_file_search (arch, entry, lib, suffix)
302 const char *arch;
303 lang_input_statement_type *entry;
304 const char *lib;
305 const char *suffix;
307 search_dirs_type *search;
309 /* If this is not an archive, try to open it in the current
310 directory first. */
311 if (! entry->is_archive)
313 if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
315 char *name = concat (ld_sysroot, entry->filename,
316 (const char *) NULL);
317 if (ldfile_try_open_bfd (name, entry))
319 entry->filename = name;
320 return TRUE;
322 free (name);
324 else if (ldfile_try_open_bfd (entry->filename, entry))
326 entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
327 && is_sysrooted_pathname (entry->filename, TRUE);
328 return TRUE;
331 if (IS_ABSOLUTE_PATH (entry->filename))
332 return FALSE;
335 for (search = search_head;
336 search != (search_dirs_type *) NULL;
337 search = search->next)
339 char *string;
341 if (entry->dynamic && ! link_info.relocateable)
343 if (ldemul_open_dynamic_archive (arch, search, entry))
345 entry->sysrooted = search->sysrooted;
346 return TRUE;
350 string = (char *) xmalloc (strlen (search->name)
351 + strlen (slash)
352 + strlen (lib)
353 + strlen (entry->filename)
354 + strlen (arch)
355 + strlen (suffix)
356 + 1);
358 if (entry->is_archive)
359 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
360 lib, entry->filename, arch, suffix);
361 else
362 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
364 if (ldfile_try_open_bfd (string, entry))
366 entry->filename = string;
367 entry->sysrooted = search->sysrooted;
368 return TRUE;
371 free (string);
374 return FALSE;
377 /* Open the input file specified by ENTRY. */
379 void
380 ldfile_open_file (entry)
381 lang_input_statement_type *entry;
383 if (entry->the_bfd != NULL)
384 return;
386 if (! entry->search_dirs_flag)
388 if (ldfile_try_open_bfd (entry->filename, entry))
389 return;
390 if (strcmp (entry->filename, entry->local_sym_name) != 0)
391 einfo (_("%F%P: cannot open %s for %s: %E\n"),
392 entry->filename, entry->local_sym_name);
393 else
394 einfo (_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
396 else
398 search_arch_type *arch;
399 bfd_boolean found = FALSE;
401 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
402 for (arch = search_arch_head;
403 arch != (search_arch_type *) NULL;
404 arch = arch->next)
406 found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
407 if (found)
408 break;
409 #ifdef VMS
410 found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
411 if (found)
412 break;
413 #endif
414 found = ldemul_find_potential_libraries (arch->name, entry);
415 if (found)
416 break;
419 /* If we have found the file, we don't need to search directories
420 again. */
421 if (found)
422 entry->search_dirs_flag = FALSE;
423 else if (entry->sysrooted
424 && ld_sysroot
425 && IS_ABSOLUTE_PATH (entry->local_sym_name))
426 einfo (_("%F%P: cannot find %s inside %s\n"),
427 entry->local_sym_name, ld_sysroot);
428 else
429 einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
433 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
435 static FILE *
436 try_open (name, exten)
437 const char *name;
438 const char *exten;
440 FILE *result;
441 char buff[1000];
443 result = fopen (name, "r");
445 if (trace_file_tries)
447 if (result == NULL)
448 info_msg (_("cannot find script file %s\n"), name);
449 else
450 info_msg (_("opened script file %s\n"), name);
453 if (result != NULL)
454 return result;
456 if (*exten)
458 sprintf (buff, "%s%s", name, exten);
459 result = fopen (buff, "r");
461 if (trace_file_tries)
463 if (result == NULL)
464 info_msg (_("cannot find script file %s\n"), buff);
465 else
466 info_msg (_("opened script file %s\n"), buff);
470 return result;
473 /* Try to open NAME; if that fails, look for it in any directories
474 specified with -L, without and with EXTEND appended. */
476 FILE *
477 ldfile_find_command_file (name, extend)
478 const char *name;
479 const char *extend;
481 search_dirs_type *search;
482 FILE *result;
483 char buffer[1000];
485 /* First try raw name. */
486 result = try_open (name, "");
487 if (result == (FILE *) NULL)
489 /* Try now prefixes. */
490 for (search = search_head;
491 search != (search_dirs_type *) NULL;
492 search = search->next)
494 sprintf (buffer, "%s%s%s", search->name, slash, name);
496 result = try_open (buffer, extend);
497 if (result)
498 break;
502 return result;
505 void
506 ldfile_open_command_file (name)
507 const char *name;
509 FILE *ldlex_input_stack;
510 ldlex_input_stack = ldfile_find_command_file (name, "");
512 if (ldlex_input_stack == (FILE *) NULL)
514 bfd_set_error (bfd_error_system_call);
515 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
518 lex_push_file (ldlex_input_stack, name);
520 ldfile_input_filename = name;
521 lineno = 1;
523 saved_script_handle = ldlex_input_stack;
526 #ifdef GNU960
527 static char *
528 gnu960_map_archname (name)
529 char *name;
531 struct tabentry { char *cmd_switch; char *arch; };
532 static struct tabentry arch_tab[] =
534 "", "",
535 "KA", "ka",
536 "KB", "kb",
537 "KC", "mc", /* Synonym for MC */
538 "MC", "mc",
539 "CA", "ca",
540 "SA", "ka", /* Functionally equivalent to KA */
541 "SB", "kb", /* Functionally equivalent to KB */
542 NULL, ""
544 struct tabentry *tp;
546 for (tp = arch_tab; tp->cmd_switch != NULL; tp++)
548 if (! strcmp (name,tp->cmd_switch))
549 break;
552 if (tp->cmd_switch == NULL)
553 einfo (_("%P%F: unknown architecture: %s\n"), name);
555 return tp->arch;
558 void
559 ldfile_add_arch (name)
560 char *name;
562 search_arch_type *new =
563 (search_arch_type *) xmalloc ((bfd_size_type) (sizeof (search_arch_type)));
565 if (*name != '\0')
567 if (ldfile_output_machine_name[0] != '\0')
569 einfo (_("%P%F: target architecture respecified\n"));
570 return;
573 ldfile_output_machine_name = name;
576 new->next = (search_arch_type *) NULL;
577 new->name = gnu960_map_archname (name);
578 *search_arch_tail_ptr = new;
579 search_arch_tail_ptr = &new->next;
582 #else /* not GNU960 */
584 void
585 ldfile_add_arch (in_name)
586 const char *in_name;
588 char *name = xstrdup (in_name);
589 search_arch_type *new =
590 (search_arch_type *) xmalloc (sizeof (search_arch_type));
592 ldfile_output_machine_name = in_name;
594 new->name = name;
595 new->next = (search_arch_type *) NULL;
596 while (*name)
598 *name = TOLOWER (*name);
599 name++;
601 *search_arch_tail_ptr = new;
602 search_arch_tail_ptr = &new->next;
605 #endif
607 /* Set the output architecture. */
609 void
610 ldfile_set_output_arch (string)
611 const char *string;
613 const bfd_arch_info_type *arch = bfd_scan_arch (string);
615 if (arch)
617 ldfile_output_architecture = arch->arch;
618 ldfile_output_machine = arch->mach;
619 ldfile_output_machine_name = arch->printable_name;
621 else
623 einfo (_("%P%F: cannot represent machine `%s'\n"), string);