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] == '=')
95 new->name
= concat (ld_sysroot
, &new->name
[1], NULL
);
98 /* Try to open a BFD for a lang_input_statement. */
101 ldfile_try_open_bfd (attempt
, entry
)
103 lang_input_statement_type
*entry
;
105 entry
->the_bfd
= bfd_openr (attempt
, entry
->target
);
107 if (trace_file_tries
)
109 if (entry
->the_bfd
== NULL
)
110 info_msg (_("attempt to open %s failed\n"), attempt
);
112 info_msg (_("attempt to open %s succeeded\n"), attempt
);
115 if (entry
->the_bfd
== NULL
)
117 if (bfd_get_error () == bfd_error_invalid_target
)
118 einfo (_("%F%P: invalid BFD target `%s'\n"), entry
->target
);
122 /* If we are searching for this file, see if the architecture is
123 compatible with the output file. If it isn't, keep searching.
124 If we can't open the file as an object file, stop the search
127 if (entry
->search_dirs_flag
)
131 if (bfd_check_format (entry
->the_bfd
, bfd_archive
))
132 check
= bfd_openr_next_archived_file (entry
->the_bfd
, NULL
);
134 check
= entry
->the_bfd
;
138 if (! bfd_check_format (check
, bfd_object
))
140 if (check
== entry
->the_bfd
141 && bfd_get_error () == bfd_error_file_not_recognized
142 && ! ldemul_unrecognized_file (entry
))
145 char *arg
, *arg1
, *arg2
, *arg3
;
148 /* Try to interpret the file as a linker script. */
149 ldfile_open_command_file (attempt
);
151 ldfile_assumed_script
= TRUE
;
152 parser_input
= input_selected
;
154 token
= INPUT_SCRIPT
;
160 if ((token
= yylex ()) != '(')
162 if ((token
= yylex ()) != NAME
)
170 if ((token
= yylex ()) != NAME
)
176 if ((token
= yylex ()) != ','
177 || (token
= yylex ()) != NAME
)
188 switch (command_line
.endian
)
194 arg
= arg2
? arg2
: arg1
; break;
196 arg
= arg3
? arg3
: arg1
; break;
198 if (strcmp (arg
, lang_get_output_target ()) != 0)
202 if (arg2
) free (arg2
);
203 if (arg3
) free (arg3
);
207 case VERS_IDENTIFIER
:
212 if (yylval
.bigint
.str
)
213 free (yylval
.bigint
.str
);
218 ldfile_assumed_script
= FALSE
;
223 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
224 attempt
, entry
->local_sym_name
);
225 bfd_close (entry
->the_bfd
);
226 entry
->the_bfd
= NULL
;
233 if ((bfd_arch_get_compatible (check
, output_bfd
,
234 command_line
.accept_unknown_input_arch
) == NULL
)
235 /* XCOFF archives can have 32 and 64 bit objects. */
236 && ! (bfd_get_flavour (check
) == bfd_target_xcoff_flavour
237 && bfd_get_flavour (output_bfd
) == bfd_target_xcoff_flavour
238 && bfd_check_format (entry
->the_bfd
, bfd_archive
)))
240 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
241 attempt
, entry
->local_sym_name
);
242 bfd_close (entry
->the_bfd
);
243 entry
->the_bfd
= NULL
;
252 /* Search for and open the file specified by ENTRY. If it is an
253 archive, use ARCH, LIB and SUFFIX to modify the file name. */
256 ldfile_open_file_search (arch
, entry
, lib
, suffix
)
258 lang_input_statement_type
*entry
;
262 search_dirs_type
*search
;
264 /* If this is not an archive, try to open it in the current
266 if (! entry
->is_archive
)
268 if (ldfile_try_open_bfd (entry
->filename
, entry
))
272 for (search
= search_head
;
273 search
!= (search_dirs_type
*) NULL
;
274 search
= search
->next
)
278 if (entry
->dynamic
&& ! link_info
.relocateable
)
280 if (ldemul_open_dynamic_archive (arch
, search
, entry
))
284 string
= (char *) xmalloc (strlen (search
->name
)
287 + strlen (entry
->filename
)
292 if (entry
->is_archive
)
293 sprintf (string
, "%s%s%s%s%s%s", search
->name
, slash
,
294 lib
, entry
->filename
, arch
, suffix
);
295 else if (entry
->filename
[0] == '/' || entry
->filename
[0] == '.'
296 #if defined (__MSDOS__) || defined (_WIN32)
297 || entry
->filename
[0] == '\\'
298 || (ISALPHA (entry
->filename
[0])
299 && entry
->filename
[1] == ':')
302 strcpy (string
, entry
->filename
);
304 sprintf (string
, "%s%s%s", search
->name
, slash
, entry
->filename
);
306 if (ldfile_try_open_bfd (string
, entry
))
308 entry
->filename
= string
;
318 /* Open the input file specified by ENTRY. */
321 ldfile_open_file (entry
)
322 lang_input_statement_type
*entry
;
324 if (entry
->the_bfd
!= NULL
)
327 if (! entry
->search_dirs_flag
)
329 if (ldfile_try_open_bfd (entry
->filename
, entry
))
331 if (strcmp (entry
->filename
, entry
->local_sym_name
) != 0)
332 einfo (_("%F%P: cannot open %s for %s: %E\n"),
333 entry
->filename
, entry
->local_sym_name
);
335 einfo (_("%F%P: cannot open %s: %E\n"), entry
->local_sym_name
);
339 search_arch_type
*arch
;
340 bfd_boolean found
= FALSE
;
342 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
343 for (arch
= search_arch_head
;
344 arch
!= (search_arch_type
*) NULL
;
347 found
= ldfile_open_file_search (arch
->name
, entry
, "lib", ".a");
351 found
= ldfile_open_file_search (arch
->name
, entry
, ":lib", ".a");
355 found
= ldemul_find_potential_libraries (arch
->name
, entry
);
360 /* If we have found the file, we don't need to search directories
363 entry
->search_dirs_flag
= FALSE
;
365 einfo (_("%F%P: cannot find %s\n"), entry
->local_sym_name
);
369 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
372 try_open (name
, exten
)
379 result
= fopen (name
, "r");
381 if (trace_file_tries
)
384 info_msg (_("cannot find script file %s\n"), name
);
386 info_msg (_("opened script file %s\n"), name
);
394 sprintf (buff
, "%s%s", name
, exten
);
395 result
= fopen (buff
, "r");
397 if (trace_file_tries
)
400 info_msg (_("cannot find script file %s\n"), buff
);
402 info_msg (_("opened script file %s\n"), buff
);
409 /* Try to open NAME; if that fails, look for it in any directories
410 specified with -L, without and with EXTEND appended. */
413 ldfile_find_command_file (name
, extend
)
417 search_dirs_type
*search
;
421 /* First try raw name. */
422 result
= try_open (name
, "");
423 if (result
== (FILE *) NULL
)
425 /* Try now prefixes. */
426 for (search
= search_head
;
427 search
!= (search_dirs_type
*) NULL
;
428 search
= search
->next
)
430 sprintf (buffer
, "%s%s%s", search
->name
, slash
, name
);
432 result
= try_open (buffer
, extend
);
442 ldfile_open_command_file (name
)
445 FILE *ldlex_input_stack
;
446 ldlex_input_stack
= ldfile_find_command_file (name
, "");
448 if (ldlex_input_stack
== (FILE *) NULL
)
450 bfd_set_error (bfd_error_system_call
);
451 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name
);
454 lex_push_file (ldlex_input_stack
, name
);
456 ldfile_input_filename
= name
;
459 saved_script_handle
= ldlex_input_stack
;
464 gnu960_map_archname (name
)
467 struct tabentry
{ char *cmd_switch
; char *arch
; };
468 static struct tabentry arch_tab
[] =
473 "KC", "mc", /* Synonym for MC */
476 "SA", "ka", /* Functionally equivalent to KA */
477 "SB", "kb", /* Functionally equivalent to KB */
482 for (tp
= arch_tab
; tp
->cmd_switch
!= NULL
; tp
++)
484 if (! strcmp (name
,tp
->cmd_switch
))
488 if (tp
->cmd_switch
== NULL
)
489 einfo (_("%P%F: unknown architecture: %s\n"), name
);
495 ldfile_add_arch (name
)
498 search_arch_type
*new =
499 (search_arch_type
*) xmalloc ((bfd_size_type
) (sizeof (search_arch_type
)));
503 if (ldfile_output_machine_name
[0] != '\0')
505 einfo (_("%P%F: target architecture respecified\n"));
509 ldfile_output_machine_name
= name
;
512 new->next
= (search_arch_type
*) NULL
;
513 new->name
= gnu960_map_archname (name
);
514 *search_arch_tail_ptr
= new;
515 search_arch_tail_ptr
= &new->next
;
518 #else /* not GNU960 */
521 ldfile_add_arch (in_name
)
524 char *name
= xstrdup (in_name
);
525 search_arch_type
*new =
526 (search_arch_type
*) xmalloc (sizeof (search_arch_type
));
528 ldfile_output_machine_name
= in_name
;
531 new->next
= (search_arch_type
*) NULL
;
534 *name
= TOLOWER (*name
);
537 *search_arch_tail_ptr
= new;
538 search_arch_tail_ptr
= &new->next
;
543 /* Set the output architecture. */
546 ldfile_set_output_arch (string
)
549 const bfd_arch_info_type
*arch
= bfd_scan_arch (string
);
553 ldfile_output_architecture
= arch
->arch
;
554 ldfile_output_machine
= arch
->mach
;
555 ldfile_output_machine_name
= arch
->printable_name
;
559 einfo (_("%P%F: cannot represent machine `%s'\n"), string
);