1 /* Linker file opening and searching.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001
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 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;
93 /* Try to open a BFD for a lang_input_statement. */
96 ldfile_try_open_bfd (attempt, entry)
98 lang_input_statement_type *entry;
100 entry->the_bfd = bfd_openr (attempt, entry->target);
102 if (trace_file_tries)
104 if (entry->the_bfd == NULL)
105 info_msg (_("attempt to open %s failed\n"), attempt);
107 info_msg (_("attempt to open %s succeeded\n"), attempt);
110 if (entry->the_bfd == NULL)
112 if (bfd_get_error () == bfd_error_invalid_target)
113 einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
117 /* If we are searching for this file, see if the architecture is
118 compatible with the output file. If it isn't, keep searching.
119 If we can't open the file as an object file, stop the search
122 if (entry->search_dirs_flag)
126 if (bfd_check_format (entry->the_bfd, bfd_archive))
127 check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
129 check = entry->the_bfd;
133 if (! bfd_check_format (check, bfd_object))
135 if (bfd_arch_get_compatible (check, output_bfd) == NULL)
137 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
138 attempt, entry->local_sym_name);
139 bfd_close (entry->the_bfd);
140 entry->the_bfd = NULL;
149 /* Search for and open the file specified by ENTRY. If it is an
150 archive, use ARCH, LIB and SUFFIX to modify the file name. */
153 ldfile_open_file_search (arch, entry, lib, suffix)
155 lang_input_statement_type *entry;
159 search_dirs_type *search;
161 /* If this is not an archive, try to open it in the current
163 if (! entry->is_archive)
165 if (ldfile_try_open_bfd (entry->filename, entry))
169 for (search = search_head;
170 search != (search_dirs_type *) NULL;
171 search = search->next)
175 if (entry->dynamic && ! link_info.relocateable)
177 if (ldemul_open_dynamic_archive (arch, search, entry))
181 string = (char *) xmalloc (strlen (search->name)
184 + strlen (entry->filename)
189 if (entry->is_archive)
190 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
191 lib, entry->filename, arch, suffix);
192 else if (entry->filename[0] == '/' || entry->filename[0] == '.'
193 #if defined (__MSDOS__) || defined (_WIN32)
194 || entry->filename[0] == '\\'
195 || (ISALPHA (entry->filename[0])
196 && entry->filename[1] == ':')
199 strcpy (string, entry->filename);
201 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
203 if (ldfile_try_open_bfd (string, entry))
205 entry->filename = string;
215 /* Open the input file specified by ENTRY. */
218 ldfile_open_file (entry)
219 lang_input_statement_type *entry;
221 if (entry->the_bfd != NULL)
224 if (! entry->search_dirs_flag)
226 if (ldfile_try_open_bfd (entry->filename, entry))
228 if (strcmp (entry->filename, entry->local_sym_name) != 0)
229 einfo (_("%F%P: cannot open %s for %s: %E\n"),
230 entry->filename, entry->local_sym_name);
232 einfo (_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
236 search_arch_type *arch;
237 boolean found = false;
239 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
240 for (arch = search_arch_head;
241 arch != (search_arch_type *) NULL;
244 found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
248 found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
252 found = ldemul_find_potential_libraries (arch->name, entry);
257 /* If we have found the file, we don't need to search directories
260 entry->search_dirs_flag = false;
262 einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
266 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
269 try_open (name, exten)
276 result = fopen (name, "r");
278 if (trace_file_tries)
281 info_msg (_("cannot find script file %s\n"), name);
283 info_msg (_("opened script file %s\n"), name);
291 sprintf (buff, "%s%s", name, exten);
292 result = fopen (buff, "r");
294 if (trace_file_tries)
297 info_msg (_("cannot find script file %s\n"), buff);
299 info_msg (_("opened script file %s\n"), buff);
306 /* Try to open NAME; if that fails, look for it in any directories
307 specified with -L, without and with EXTEND apppended. */
310 ldfile_find_command_file (name, extend)
314 search_dirs_type *search;
318 /* First try raw name. */
319 result = try_open (name, "");
320 if (result == (FILE *) NULL)
322 /* Try now prefixes. */
323 for (search = search_head;
324 search != (search_dirs_type *) NULL;
325 search = search->next)
327 sprintf (buffer, "%s%s%s", search->name, slash, name);
329 result = try_open (buffer, extend);
339 ldfile_open_command_file (name)
342 FILE *ldlex_input_stack;
343 ldlex_input_stack = ldfile_find_command_file (name, "");
345 if (ldlex_input_stack == (FILE *) NULL)
347 bfd_set_error (bfd_error_system_call);
348 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
351 lex_push_file (ldlex_input_stack, name);
353 ldfile_input_filename = name;
356 saved_script_handle = ldlex_input_stack;
361 gnu960_map_archname (name)
364 struct tabentry { char *cmd_switch; char *arch; };
365 static struct tabentry arch_tab[] =
370 "KC", "mc", /* Synonym for MC */
373 "SA", "ka", /* Functionally equivalent to KA */
374 "SB", "kb", /* Functionally equivalent to KB */
379 for (tp = arch_tab; tp->cmd_switch != NULL; tp++)
381 if (! strcmp (name,tp->cmd_switch))
385 if (tp->cmd_switch == NULL)
386 einfo (_("%P%F: unknown architecture: %s\n"), name);
392 ldfile_add_arch (name)
395 search_arch_type *new =
396 (search_arch_type *) xmalloc ((bfd_size_type) (sizeof (search_arch_type)));
400 if (ldfile_output_machine_name[0] != '\0')
402 einfo (_("%P%F: target architecture respecified\n"));
406 ldfile_output_machine_name = name;
409 new->next = (search_arch_type *) NULL;
410 new->name = gnu960_map_archname (name);
411 *search_arch_tail_ptr = new;
412 search_arch_tail_ptr = &new->next;
415 #else /* not GNU960 */
418 ldfile_add_arch (in_name)
421 char *name = xstrdup (in_name);
422 search_arch_type *new =
423 (search_arch_type *) xmalloc (sizeof (search_arch_type));
425 ldfile_output_machine_name = in_name;
428 new->next = (search_arch_type *) NULL;
431 *name = TOLOWER (*name);
434 *search_arch_tail_ptr = new;
435 search_arch_tail_ptr = &new->next;
440 /* Set the output architecture. */
443 ldfile_set_output_arch (string)
446 const bfd_arch_info_type *arch = bfd_scan_arch (string);
450 ldfile_output_architecture = arch->arch;
451 ldfile_output_machine = arch->mach;
452 ldfile_output_machine_name = arch->printable_name;
456 einfo (_("%P%F: cannot represent machine `%s'\n"), string);