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)
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
22 /* ldfile.c: look after all the file stuff. */
27 #include "safe-ctype.h"
37 #include "libiberty.h"
39 const char *ldfile_input_filename;
40 bfd_boolean ldfile_assumed_script = FALSE;
41 const char *ldfile_output_machine_name = "";
42 unsigned long ldfile_output_machine;
43 enum bfd_architecture ldfile_output_architecture;
44 search_dirs_type *search_head;
50 #if defined (_WIN32) && ! defined (__CYGWIN32__)
57 /* The MPW path char is a colon. */
63 static search_dirs_type **search_tail_ptr = &search_head;
65 typedef struct search_arch {
67 struct search_arch *next;
70 static search_arch_type *search_arch_head;
71 static search_arch_type **search_arch_tail_ptr = &search_arch_head;
73 static FILE *try_open PARAMS ((const char *name, const char *exten));
76 ldfile_add_library_path (name, cmdline)
80 search_dirs_type *new;
82 if (!cmdline && config.only_cmd_line_lib_dirs)
85 new = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
88 new->cmdline = cmdline;
89 *search_tail_ptr = new;
90 search_tail_ptr = &new->next;
92 /* If a directory is marked as honoring sysroot, prepend the sysroot path
94 if (new->name[0] == '=')
96 new->name = concat (ld_sysroot, &new->name[1], NULL);
97 new->sysrooted = TRUE;
100 new->sysrooted = FALSE;
103 /* Try to open a BFD for a lang_input_statement. */
106 ldfile_try_open_bfd (attempt, entry)
108 lang_input_statement_type *entry;
110 entry->the_bfd = bfd_openr (attempt, entry->target);
112 if (trace_file_tries)
114 if (entry->the_bfd == NULL)
115 info_msg (_("attempt to open %s failed\n"), attempt);
117 info_msg (_("attempt to open %s succeeded\n"), attempt);
120 if (entry->the_bfd == NULL)
122 if (bfd_get_error () == bfd_error_invalid_target)
123 einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
127 /* If we are searching for this file, see if the architecture is
128 compatible with the output file. If it isn't, keep searching.
129 If we can't open the file as an object file, stop the search
132 if (entry->search_dirs_flag)
136 if (bfd_check_format (entry->the_bfd, bfd_archive))
137 check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
139 check = entry->the_bfd;
143 if (! bfd_check_format (check, bfd_object))
145 if (check == entry->the_bfd
146 && bfd_get_error () == bfd_error_file_not_recognized
147 && ! ldemul_unrecognized_file (entry))
150 char *arg, *arg1, *arg2, *arg3;
153 /* Try to interpret the file as a linker script. */
154 ldfile_open_command_file (attempt);
156 ldfile_assumed_script = TRUE;
157 parser_input = input_selected;
159 token = INPUT_SCRIPT;
165 if ((token = yylex ()) != '(')
167 if ((token = yylex ()) != NAME)
175 if ((token = yylex ()) != NAME)
181 if ((token = yylex ()) != ','
182 || (token = yylex ()) != NAME)
193 switch (command_line.endian)
199 arg = arg2 ? arg2 : arg1; break;
201 arg = arg3 ? arg3 : arg1; break;
203 if (strcmp (arg, lang_get_output_target ()) != 0)
207 if (arg2) free (arg2);
208 if (arg3) free (arg3);
212 case VERS_IDENTIFIER:
217 if (yylval.bigint.str)
218 free (yylval.bigint.str);
223 ldfile_assumed_script = FALSE;
228 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
229 attempt, entry->local_sym_name);
230 bfd_close (entry->the_bfd);
231 entry->the_bfd = NULL;
238 if ((bfd_arch_get_compatible (check, output_bfd,
239 command_line.accept_unknown_input_arch) == NULL)
240 /* XCOFF archives can have 32 and 64 bit objects. */
241 && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
242 && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour
243 && bfd_check_format (entry->the_bfd, bfd_archive)))
245 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
246 attempt, entry->local_sym_name);
247 bfd_close (entry->the_bfd);
248 entry->the_bfd = NULL;
257 /* Search for and open the file specified by ENTRY. If it is an
258 archive, use ARCH, LIB and SUFFIX to modify the file name. */
261 ldfile_open_file_search (arch, entry, lib, suffix)
263 lang_input_statement_type *entry;
267 search_dirs_type *search;
269 /* If this is not an archive, try to open it in the current
271 if (! entry->is_archive)
273 if (entry->sysrooted && entry->filename[0] == '/')
275 char *name = concat (ld_sysroot, entry->filename,
276 (const char *) NULL);
277 if (ldfile_try_open_bfd (name, entry))
279 entry->filename = name;
284 else if (ldfile_try_open_bfd (entry->filename, entry))
286 entry->sysrooted = FALSE;
291 for (search = search_head;
292 search != (search_dirs_type *) NULL;
293 search = search->next)
297 if (entry->dynamic && ! link_info.relocateable)
299 if (ldemul_open_dynamic_archive (arch, search, entry))
301 entry->sysrooted = search->sysrooted;
306 string = (char *) xmalloc (strlen (search->name)
309 + strlen (entry->filename)
314 if (entry->is_archive)
315 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
316 lib, entry->filename, arch, suffix);
317 else if (entry->filename[0] == '/' || entry->filename[0] == '.'
318 #if defined (__MSDOS__) || defined (_WIN32)
319 || entry->filename[0] == '\\'
320 || (ISALPHA (entry->filename[0])
321 && entry->filename[1] == ':')
324 strcpy (string, entry->filename);
326 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
328 if (ldfile_try_open_bfd (string, entry))
330 entry->filename = string;
331 entry->sysrooted = search->sysrooted;
341 /* Open the input file specified by ENTRY. */
344 ldfile_open_file (entry)
345 lang_input_statement_type *entry;
347 if (entry->the_bfd != NULL)
350 if (! entry->search_dirs_flag)
352 if (ldfile_try_open_bfd (entry->filename, entry))
354 if (strcmp (entry->filename, entry->local_sym_name) != 0)
355 einfo (_("%F%P: cannot open %s for %s: %E\n"),
356 entry->filename, entry->local_sym_name);
358 einfo (_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
362 search_arch_type *arch;
363 bfd_boolean found = FALSE;
365 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
366 for (arch = search_arch_head;
367 arch != (search_arch_type *) NULL;
370 found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
374 found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
378 found = ldemul_find_potential_libraries (arch->name, entry);
383 /* If we have found the file, we don't need to search directories
386 entry->search_dirs_flag = FALSE;
388 einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
392 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
395 try_open (name, exten)
402 result = fopen (name, "r");
404 if (trace_file_tries)
407 info_msg (_("cannot find script file %s\n"), name);
409 info_msg (_("opened script file %s\n"), name);
417 sprintf (buff, "%s%s", name, exten);
418 result = fopen (buff, "r");
420 if (trace_file_tries)
423 info_msg (_("cannot find script file %s\n"), buff);
425 info_msg (_("opened script file %s\n"), buff);
432 /* Try to open NAME; if that fails, look for it in any directories
433 specified with -L, without and with EXTEND appended. */
436 ldfile_find_command_file (name, extend)
440 search_dirs_type *search;
444 /* First try raw name. */
445 result = try_open (name, "");
446 if (result == (FILE *) NULL)
448 /* Try now prefixes. */
449 for (search = search_head;
450 search != (search_dirs_type *) NULL;
451 search = search->next)
453 sprintf (buffer, "%s%s%s", search->name, slash, name);
455 result = try_open (buffer, extend);
465 ldfile_open_command_file (name)
468 FILE *ldlex_input_stack;
469 ldlex_input_stack = ldfile_find_command_file (name, "");
471 if (ldlex_input_stack == (FILE *) NULL)
473 bfd_set_error (bfd_error_system_call);
474 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
477 lex_push_file (ldlex_input_stack, name);
479 ldfile_input_filename = name;
482 saved_script_handle = ldlex_input_stack;
487 gnu960_map_archname (name)
490 struct tabentry { char *cmd_switch; char *arch; };
491 static struct tabentry arch_tab[] =
496 "KC", "mc", /* Synonym for MC */
499 "SA", "ka", /* Functionally equivalent to KA */
500 "SB", "kb", /* Functionally equivalent to KB */
505 for (tp = arch_tab; tp->cmd_switch != NULL; tp++)
507 if (! strcmp (name,tp->cmd_switch))
511 if (tp->cmd_switch == NULL)
512 einfo (_("%P%F: unknown architecture: %s\n"), name);
518 ldfile_add_arch (name)
521 search_arch_type *new =
522 (search_arch_type *) xmalloc ((bfd_size_type) (sizeof (search_arch_type)));
526 if (ldfile_output_machine_name[0] != '\0')
528 einfo (_("%P%F: target architecture respecified\n"));
532 ldfile_output_machine_name = name;
535 new->next = (search_arch_type *) NULL;
536 new->name = gnu960_map_archname (name);
537 *search_arch_tail_ptr = new;
538 search_arch_tail_ptr = &new->next;
541 #else /* not GNU960 */
544 ldfile_add_arch (in_name)
547 char *name = xstrdup (in_name);
548 search_arch_type *new =
549 (search_arch_type *) xmalloc (sizeof (search_arch_type));
551 ldfile_output_machine_name = in_name;
554 new->next = (search_arch_type *) NULL;
557 *name = TOLOWER (*name);
560 *search_arch_tail_ptr = new;
561 search_arch_tail_ptr = &new->next;
566 /* Set the output architecture. */
569 ldfile_set_output_arch (string)
572 const bfd_arch_info_type *arch = bfd_scan_arch (string);
576 ldfile_output_architecture = arch->arch;
577 ldfile_output_machine = arch->mach;
578 ldfile_output_machine_name = arch->printable_name;
582 einfo (_("%P%F: cannot represent machine `%s'\n"), string);