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
) == bfd_target_xcoff_flavour
140 && bfd_check_format (entry
->the_bfd
, bfd_archive
)))
142 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
143 attempt
, entry
->local_sym_name
);
144 bfd_close (entry
->the_bfd
);
145 entry
->the_bfd
= NULL
;
154 /* Search for and open the file specified by ENTRY. If it is an
155 archive, use ARCH, LIB and SUFFIX to modify the file name. */
158 ldfile_open_file_search (arch
, entry
, lib
, suffix
)
160 lang_input_statement_type
*entry
;
164 search_dirs_type
*search
;
166 /* If this is not an archive, try to open it in the current
168 if (! entry
->is_archive
)
170 if (ldfile_try_open_bfd (entry
->filename
, entry
))
174 for (search
= search_head
;
175 search
!= (search_dirs_type
*) NULL
;
176 search
= search
->next
)
180 if (entry
->dynamic
&& ! link_info
.relocateable
)
182 if (ldemul_open_dynamic_archive (arch
, search
, entry
))
186 string
= (char *) xmalloc (strlen (search
->name
)
189 + strlen (entry
->filename
)
194 if (entry
->is_archive
)
195 sprintf (string
, "%s%s%s%s%s%s", search
->name
, slash
,
196 lib
, entry
->filename
, arch
, suffix
);
197 else if (entry
->filename
[0] == '/' || entry
->filename
[0] == '.'
198 #if defined (__MSDOS__) || defined (_WIN32)
199 || entry
->filename
[0] == '\\'
200 || (ISALPHA (entry
->filename
[0])
201 && entry
->filename
[1] == ':')
204 strcpy (string
, entry
->filename
);
206 sprintf (string
, "%s%s%s", search
->name
, slash
, entry
->filename
);
208 if (ldfile_try_open_bfd (string
, entry
))
210 entry
->filename
= string
;
220 /* Open the input file specified by ENTRY. */
223 ldfile_open_file (entry
)
224 lang_input_statement_type
*entry
;
226 if (entry
->the_bfd
!= NULL
)
229 if (! entry
->search_dirs_flag
)
231 if (ldfile_try_open_bfd (entry
->filename
, entry
))
233 if (strcmp (entry
->filename
, entry
->local_sym_name
) != 0)
234 einfo (_("%F%P: cannot open %s for %s: %E\n"),
235 entry
->filename
, entry
->local_sym_name
);
237 einfo (_("%F%P: cannot open %s: %E\n"), entry
->local_sym_name
);
241 search_arch_type
*arch
;
242 boolean found
= false;
244 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
245 for (arch
= search_arch_head
;
246 arch
!= (search_arch_type
*) NULL
;
249 found
= ldfile_open_file_search (arch
->name
, entry
, "lib", ".a");
253 found
= ldfile_open_file_search (arch
->name
, entry
, ":lib", ".a");
257 found
= ldemul_find_potential_libraries (arch
->name
, entry
);
262 /* If we have found the file, we don't need to search directories
265 entry
->search_dirs_flag
= false;
267 einfo (_("%F%P: cannot find %s\n"), entry
->local_sym_name
);
271 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
274 try_open (name
, exten
)
281 result
= fopen (name
, "r");
283 if (trace_file_tries
)
286 info_msg (_("cannot find script file %s\n"), name
);
288 info_msg (_("opened script file %s\n"), name
);
296 sprintf (buff
, "%s%s", name
, exten
);
297 result
= fopen (buff
, "r");
299 if (trace_file_tries
)
302 info_msg (_("cannot find script file %s\n"), buff
);
304 info_msg (_("opened script file %s\n"), buff
);
311 /* Try to open NAME; if that fails, look for it in any directories
312 specified with -L, without and with EXTEND apppended. */
315 ldfile_find_command_file (name
, extend
)
319 search_dirs_type
*search
;
323 /* First try raw name. */
324 result
= try_open (name
, "");
325 if (result
== (FILE *) NULL
)
327 /* Try now prefixes. */
328 for (search
= search_head
;
329 search
!= (search_dirs_type
*) NULL
;
330 search
= search
->next
)
332 sprintf (buffer
, "%s%s%s", search
->name
, slash
, name
);
334 result
= try_open (buffer
, extend
);
344 ldfile_open_command_file (name
)
347 FILE *ldlex_input_stack
;
348 ldlex_input_stack
= ldfile_find_command_file (name
, "");
350 if (ldlex_input_stack
== (FILE *) NULL
)
352 bfd_set_error (bfd_error_system_call
);
353 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name
);
356 lex_push_file (ldlex_input_stack
, name
);
358 ldfile_input_filename
= name
;
361 saved_script_handle
= ldlex_input_stack
;
366 gnu960_map_archname (name
)
369 struct tabentry
{ char *cmd_switch
; char *arch
; };
370 static struct tabentry arch_tab
[] =
375 "KC", "mc", /* Synonym for MC */
378 "SA", "ka", /* Functionally equivalent to KA */
379 "SB", "kb", /* Functionally equivalent to KB */
384 for (tp
= arch_tab
; tp
->cmd_switch
!= NULL
; tp
++)
386 if (! strcmp (name
,tp
->cmd_switch
))
390 if (tp
->cmd_switch
== NULL
)
391 einfo (_("%P%F: unknown architecture: %s\n"), name
);
397 ldfile_add_arch (name
)
400 search_arch_type
*new =
401 (search_arch_type
*) xmalloc ((bfd_size_type
) (sizeof (search_arch_type
)));
405 if (ldfile_output_machine_name
[0] != '\0')
407 einfo (_("%P%F: target architecture respecified\n"));
411 ldfile_output_machine_name
= name
;
414 new->next
= (search_arch_type
*) NULL
;
415 new->name
= gnu960_map_archname (name
);
416 *search_arch_tail_ptr
= new;
417 search_arch_tail_ptr
= &new->next
;
420 #else /* not GNU960 */
423 ldfile_add_arch (in_name
)
426 char *name
= xstrdup (in_name
);
427 search_arch_type
*new =
428 (search_arch_type
*) xmalloc (sizeof (search_arch_type
));
430 ldfile_output_machine_name
= in_name
;
433 new->next
= (search_arch_type
*) NULL
;
436 *name
= TOLOWER (*name
);
439 *search_arch_tail_ptr
= new;
440 search_arch_tail_ptr
= &new->next
;
445 /* Set the output architecture. */
448 ldfile_set_output_arch (string
)
451 const bfd_arch_info_type
*arch
= bfd_scan_arch (string
);
455 ldfile_output_architecture
= arch
->arch
;
456 ldfile_output_machine
= arch
->mach
;
457 ldfile_output_machine_name
= arch
->printable_name
;
461 einfo (_("%P%F: cannot represent machine `%s'\n"), string
);