1 /* Linker file opening and searching.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002
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
))
136 if ((bfd_arch_get_compatible (check
, output_bfd
) == NULL
)
137 /* XCOFF archives can have 32 and 64 bit objects */
138 && ! (bfd_get_flavour (check
) == bfd_target_xcoff_flavour
139 && bfd_get_flavour (output_bfd
) ==
140 bfd_target_xcoff_flavour
141 && bfd_check_format (entry
->the_bfd
, bfd_archive
)))
143 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
144 attempt
, entry
->local_sym_name
);
145 bfd_close (entry
->the_bfd
);
146 entry
->the_bfd
= NULL
;
155 /* Search for and open the file specified by ENTRY. If it is an
156 archive, use ARCH, LIB and SUFFIX to modify the file name. */
159 ldfile_open_file_search (arch
, entry
, lib
, suffix
)
161 lang_input_statement_type
*entry
;
165 search_dirs_type
*search
;
167 /* If this is not an archive, try to open it in the current
169 if (! entry
->is_archive
)
171 if (ldfile_try_open_bfd (entry
->filename
, entry
))
175 for (search
= search_head
;
176 search
!= (search_dirs_type
*) NULL
;
177 search
= search
->next
)
181 if (entry
->dynamic
&& ! link_info
.relocateable
)
183 if (ldemul_open_dynamic_archive (arch
, search
, entry
))
187 string
= (char *) xmalloc (strlen (search
->name
)
190 + strlen (entry
->filename
)
195 if (entry
->is_archive
)
196 sprintf (string
, "%s%s%s%s%s%s", search
->name
, slash
,
197 lib
, entry
->filename
, arch
, suffix
);
198 else if (entry
->filename
[0] == '/' || entry
->filename
[0] == '.'
199 #if defined (__MSDOS__) || defined (_WIN32)
200 || entry
->filename
[0] == '\\'
201 || (ISALPHA (entry
->filename
[0])
202 && entry
->filename
[1] == ':')
205 strcpy (string
, entry
->filename
);
207 sprintf (string
, "%s%s%s", search
->name
, slash
, entry
->filename
);
209 if (ldfile_try_open_bfd (string
, entry
))
211 entry
->filename
= string
;
221 /* Open the input file specified by ENTRY. */
224 ldfile_open_file (entry
)
225 lang_input_statement_type
*entry
;
227 if (entry
->the_bfd
!= NULL
)
230 if (! entry
->search_dirs_flag
)
232 if (ldfile_try_open_bfd (entry
->filename
, entry
))
234 if (strcmp (entry
->filename
, entry
->local_sym_name
) != 0)
235 einfo (_("%F%P: cannot open %s for %s: %E\n"),
236 entry
->filename
, entry
->local_sym_name
);
238 einfo (_("%F%P: cannot open %s: %E\n"), entry
->local_sym_name
);
242 search_arch_type
*arch
;
243 boolean found
= false;
245 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
246 for (arch
= search_arch_head
;
247 arch
!= (search_arch_type
*) NULL
;
250 found
= ldfile_open_file_search (arch
->name
, entry
, "lib", ".a");
254 found
= ldfile_open_file_search (arch
->name
, entry
, ":lib", ".a");
258 found
= ldemul_find_potential_libraries (arch
->name
, entry
);
263 /* If we have found the file, we don't need to search directories
266 entry
->search_dirs_flag
= false;
268 einfo (_("%F%P: cannot find %s\n"), entry
->local_sym_name
);
272 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
275 try_open (name
, exten
)
282 result
= fopen (name
, "r");
284 if (trace_file_tries
)
287 info_msg (_("cannot find script file %s\n"), name
);
289 info_msg (_("opened script file %s\n"), name
);
297 sprintf (buff
, "%s%s", name
, exten
);
298 result
= fopen (buff
, "r");
300 if (trace_file_tries
)
303 info_msg (_("cannot find script file %s\n"), buff
);
305 info_msg (_("opened script file %s\n"), buff
);
312 /* Try to open NAME; if that fails, look for it in any directories
313 specified with -L, without and with EXTEND apppended. */
316 ldfile_find_command_file (name
, extend
)
320 search_dirs_type
*search
;
324 /* First try raw name. */
325 result
= try_open (name
, "");
326 if (result
== (FILE *) NULL
)
328 /* Try now prefixes. */
329 for (search
= search_head
;
330 search
!= (search_dirs_type
*) NULL
;
331 search
= search
->next
)
333 sprintf (buffer
, "%s%s%s", search
->name
, slash
, name
);
335 result
= try_open (buffer
, extend
);
345 ldfile_open_command_file (name
)
348 FILE *ldlex_input_stack
;
349 ldlex_input_stack
= ldfile_find_command_file (name
, "");
351 if (ldlex_input_stack
== (FILE *) NULL
)
353 bfd_set_error (bfd_error_system_call
);
354 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name
);
357 lex_push_file (ldlex_input_stack
, name
);
359 ldfile_input_filename
= name
;
362 saved_script_handle
= ldlex_input_stack
;
367 gnu960_map_archname (name
)
370 struct tabentry
{ char *cmd_switch
; char *arch
; };
371 static struct tabentry arch_tab
[] =
376 "KC", "mc", /* Synonym for MC */
379 "SA", "ka", /* Functionally equivalent to KA */
380 "SB", "kb", /* Functionally equivalent to KB */
385 for (tp
= arch_tab
; tp
->cmd_switch
!= NULL
; tp
++)
387 if (! strcmp (name
,tp
->cmd_switch
))
391 if (tp
->cmd_switch
== NULL
)
392 einfo (_("%P%F: unknown architecture: %s\n"), name
);
398 ldfile_add_arch (name
)
401 search_arch_type
*new =
402 (search_arch_type
*) xmalloc ((bfd_size_type
) (sizeof (search_arch_type
)));
406 if (ldfile_output_machine_name
[0] != '\0')
408 einfo (_("%P%F: target architecture respecified\n"));
412 ldfile_output_machine_name
= name
;
415 new->next
= (search_arch_type
*) NULL
;
416 new->name
= gnu960_map_archname (name
);
417 *search_arch_tail_ptr
= new;
418 search_arch_tail_ptr
= &new->next
;
421 #else /* not GNU960 */
424 ldfile_add_arch (in_name
)
427 char *name
= xstrdup (in_name
);
428 search_arch_type
*new =
429 (search_arch_type
*) xmalloc (sizeof (search_arch_type
));
431 ldfile_output_machine_name
= in_name
;
434 new->next
= (search_arch_type
*) NULL
;
437 *name
= TOLOWER (*name
);
440 *search_arch_tail_ptr
= new;
441 search_arch_tail_ptr
= &new->next
;
446 /* Set the output architecture. */
449 ldfile_set_output_arch (string
)
452 const bfd_arch_info_type
*arch
= bfd_scan_arch (string
);
456 ldfile_output_architecture
= arch
->arch
;
457 ldfile_output_machine
= arch
->mach
;
458 ldfile_output_machine_name
= arch
->printable_name
;
462 einfo (_("%P%F: cannot represent machine `%s'\n"), string
);