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"
38 #include "filenames.h"
40 const char * ldfile_input_filename
;
41 bfd_boolean ldfile_assumed_script
= FALSE
;
42 const char * ldfile_output_machine_name
= "";
43 unsigned long ldfile_output_machine
;
44 enum bfd_architecture ldfile_output_architecture
;
45 search_dirs_type
* search_head
;
51 #if defined (_WIN32) && ! defined (__CYGWIN32__)
58 /* The MPW path char is a colon. */
62 typedef struct search_arch
65 struct search_arch
*next
;
68 static search_dirs_type
**search_tail_ptr
= &search_head
;
69 static search_arch_type
*search_arch_head
;
70 static search_arch_type
**search_arch_tail_ptr
= &search_arch_head
;
73 PARAMS ((const char *, const char *));
74 static bfd_boolean is_sysrooted_pathname
75 PARAMS ((const char *, bfd_boolean
));
77 /* Test whether a pathname, after canonicalization, is the same or a
78 sub-directory of the sysroot directory. */
81 is_sysrooted_pathname (name
, notsame
)
85 char * realname
= ld_canon_sysroot
? lrealpath (name
) : NULL
;
92 len
= strlen (realname
);
94 if (((! notsame
&& len
== ld_canon_sysroot_len
)
95 || (len
>= ld_canon_sysroot_len
96 && IS_DIR_SEPARATOR (realname
[ld_canon_sysroot_len
])
97 && (realname
[ld_canon_sysroot_len
] = '\0') == '\0'))
98 && FILENAME_CMP (ld_canon_sysroot
, realname
) == 0)
109 /* Adds NAME to the library search path.
110 Makes a copy of NAME using xmalloc(). */
113 ldfile_add_library_path (name
, cmdline
)
117 search_dirs_type
*new;
119 if (!cmdline
&& config
.only_cmd_line_lib_dirs
)
122 new = (search_dirs_type
*) xmalloc (sizeof (search_dirs_type
));
124 new->cmdline
= cmdline
;
125 *search_tail_ptr
= new;
126 search_tail_ptr
= &new->next
;
128 /* If a directory is marked as honoring sysroot, prepend the sysroot path
132 new->name
= concat (ld_sysroot
, name
+ 1, NULL
);
133 new->sysrooted
= TRUE
;
137 new->name
= xstrdup (name
);
138 new->sysrooted
= is_sysrooted_pathname (name
, FALSE
);
142 /* Try to open a BFD for a lang_input_statement. */
145 ldfile_try_open_bfd (attempt
, entry
)
147 lang_input_statement_type
*entry
;
149 entry
->the_bfd
= bfd_openr (attempt
, entry
->target
);
151 if (trace_file_tries
)
153 if (entry
->the_bfd
== NULL
)
154 info_msg (_("attempt to open %s failed\n"), attempt
);
156 info_msg (_("attempt to open %s succeeded\n"), attempt
);
159 if (entry
->the_bfd
== NULL
)
161 if (bfd_get_error () == bfd_error_invalid_target
)
162 einfo (_("%F%P: invalid BFD target `%s'\n"), entry
->target
);
166 /* If we are searching for this file, see if the architecture is
167 compatible with the output file. If it isn't, keep searching.
168 If we can't open the file as an object file, stop the search
171 if (entry
->search_dirs_flag
)
175 if (bfd_check_format (entry
->the_bfd
, bfd_archive
))
176 check
= bfd_openr_next_archived_file (entry
->the_bfd
, NULL
);
178 check
= entry
->the_bfd
;
182 if (! bfd_check_format (check
, bfd_object
))
184 if (check
== entry
->the_bfd
185 && bfd_get_error () == bfd_error_file_not_recognized
186 && ! ldemul_unrecognized_file (entry
))
189 char *arg
, *arg1
, *arg2
, *arg3
;
192 /* Try to interpret the file as a linker script. */
193 ldfile_open_command_file (attempt
);
195 ldfile_assumed_script
= TRUE
;
196 parser_input
= input_selected
;
198 token
= INPUT_SCRIPT
;
204 if ((token
= yylex ()) != '(')
206 if ((token
= yylex ()) != NAME
)
214 if ((token
= yylex ()) != NAME
)
220 if ((token
= yylex ()) != ','
221 || (token
= yylex ()) != NAME
)
232 switch (command_line
.endian
)
238 arg
= arg2
? arg2
: arg1
; break;
240 arg
= arg3
? arg3
: arg1
; break;
242 if (strcmp (arg
, lang_get_output_target ()) != 0)
246 if (arg2
) free (arg2
);
247 if (arg3
) free (arg3
);
251 case VERS_IDENTIFIER
:
256 if (yylval
.bigint
.str
)
257 free (yylval
.bigint
.str
);
263 ldfile_assumed_script
= FALSE
;
268 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
269 attempt
, entry
->local_sym_name
);
270 bfd_close (entry
->the_bfd
);
271 entry
->the_bfd
= NULL
;
278 if ((bfd_arch_get_compatible (check
, output_bfd
,
279 command_line
.accept_unknown_input_arch
) == NULL
)
280 /* XCOFF archives can have 32 and 64 bit objects. */
281 && ! (bfd_get_flavour (check
) == bfd_target_xcoff_flavour
282 && bfd_get_flavour (output_bfd
) == bfd_target_xcoff_flavour
283 && bfd_check_format (entry
->the_bfd
, bfd_archive
)))
285 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
286 attempt
, entry
->local_sym_name
);
287 bfd_close (entry
->the_bfd
);
288 entry
->the_bfd
= NULL
;
297 /* Search for and open the file specified by ENTRY. If it is an
298 archive, use ARCH, LIB and SUFFIX to modify the file name. */
301 ldfile_open_file_search (arch
, entry
, lib
, suffix
)
303 lang_input_statement_type
*entry
;
307 search_dirs_type
*search
;
309 /* If this is not an archive, try to open it in the current
311 if (! entry
->is_archive
)
313 if (entry
->sysrooted
&& IS_ABSOLUTE_PATH (entry
->filename
))
315 char *name
= concat (ld_sysroot
, entry
->filename
,
316 (const char *) NULL
);
317 if (ldfile_try_open_bfd (name
, entry
))
319 entry
->filename
= name
;
324 else if (ldfile_try_open_bfd (entry
->filename
, entry
))
326 entry
->sysrooted
= IS_ABSOLUTE_PATH (entry
->filename
)
327 && is_sysrooted_pathname (entry
->filename
, TRUE
);
331 if (IS_ABSOLUTE_PATH (entry
->filename
))
335 for (search
= search_head
;
336 search
!= (search_dirs_type
*) NULL
;
337 search
= search
->next
)
341 if (entry
->dynamic
&& ! link_info
.relocateable
)
343 if (ldemul_open_dynamic_archive (arch
, search
, entry
))
345 entry
->sysrooted
= search
->sysrooted
;
350 string
= (char *) xmalloc (strlen (search
->name
)
353 + strlen (entry
->filename
)
358 if (entry
->is_archive
)
359 sprintf (string
, "%s%s%s%s%s%s", search
->name
, slash
,
360 lib
, entry
->filename
, arch
, suffix
);
362 sprintf (string
, "%s%s%s", search
->name
, slash
, entry
->filename
);
364 if (ldfile_try_open_bfd (string
, entry
))
366 entry
->filename
= string
;
367 entry
->sysrooted
= search
->sysrooted
;
377 /* Open the input file specified by ENTRY. */
380 ldfile_open_file (entry
)
381 lang_input_statement_type
*entry
;
383 if (entry
->the_bfd
!= NULL
)
386 if (! entry
->search_dirs_flag
)
388 if (ldfile_try_open_bfd (entry
->filename
, entry
))
390 if (strcmp (entry
->filename
, entry
->local_sym_name
) != 0)
391 einfo (_("%F%P: cannot open %s for %s: %E\n"),
392 entry
->filename
, entry
->local_sym_name
);
394 einfo (_("%F%P: cannot open %s: %E\n"), entry
->local_sym_name
);
398 search_arch_type
*arch
;
399 bfd_boolean found
= FALSE
;
401 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
402 for (arch
= search_arch_head
;
403 arch
!= (search_arch_type
*) NULL
;
406 found
= ldfile_open_file_search (arch
->name
, entry
, "lib", ".a");
410 found
= ldfile_open_file_search (arch
->name
, entry
, ":lib", ".a");
414 found
= ldemul_find_potential_libraries (arch
->name
, entry
);
419 /* If we have found the file, we don't need to search directories
422 entry
->search_dirs_flag
= FALSE
;
423 else if (entry
->sysrooted
425 && IS_ABSOLUTE_PATH (entry
->local_sym_name
))
426 einfo (_("%F%P: cannot find %s inside %s\n"),
427 entry
->local_sym_name
, ld_sysroot
);
429 einfo (_("%F%P: cannot find %s\n"), entry
->local_sym_name
);
433 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
436 try_open (name
, exten
)
443 result
= fopen (name
, "r");
445 if (trace_file_tries
)
448 info_msg (_("cannot find script file %s\n"), name
);
450 info_msg (_("opened script file %s\n"), name
);
458 sprintf (buff
, "%s%s", name
, exten
);
459 result
= fopen (buff
, "r");
461 if (trace_file_tries
)
464 info_msg (_("cannot find script file %s\n"), buff
);
466 info_msg (_("opened script file %s\n"), buff
);
473 /* Try to open NAME; if that fails, look for it in any directories
474 specified with -L, without and with EXTEND appended. */
477 ldfile_find_command_file (name
, extend
)
481 search_dirs_type
*search
;
485 /* First try raw name. */
486 result
= try_open (name
, "");
487 if (result
== (FILE *) NULL
)
489 /* Try now prefixes. */
490 for (search
= search_head
;
491 search
!= (search_dirs_type
*) NULL
;
492 search
= search
->next
)
494 sprintf (buffer
, "%s%s%s", search
->name
, slash
, name
);
496 result
= try_open (buffer
, extend
);
506 ldfile_open_command_file (name
)
509 FILE *ldlex_input_stack
;
510 ldlex_input_stack
= ldfile_find_command_file (name
, "");
512 if (ldlex_input_stack
== (FILE *) NULL
)
514 bfd_set_error (bfd_error_system_call
);
515 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name
);
518 lex_push_file (ldlex_input_stack
, name
);
520 ldfile_input_filename
= name
;
523 saved_script_handle
= ldlex_input_stack
;
528 gnu960_map_archname (name
)
531 struct tabentry
{ char *cmd_switch
; char *arch
; };
532 static struct tabentry arch_tab
[] =
537 "KC", "mc", /* Synonym for MC */
540 "SA", "ka", /* Functionally equivalent to KA */
541 "SB", "kb", /* Functionally equivalent to KB */
546 for (tp
= arch_tab
; tp
->cmd_switch
!= NULL
; tp
++)
548 if (! strcmp (name
,tp
->cmd_switch
))
552 if (tp
->cmd_switch
== NULL
)
553 einfo (_("%P%F: unknown architecture: %s\n"), name
);
559 ldfile_add_arch (name
)
562 search_arch_type
*new =
563 (search_arch_type
*) xmalloc ((bfd_size_type
) (sizeof (search_arch_type
)));
567 if (ldfile_output_machine_name
[0] != '\0')
569 einfo (_("%P%F: target architecture respecified\n"));
573 ldfile_output_machine_name
= name
;
576 new->next
= (search_arch_type
*) NULL
;
577 new->name
= gnu960_map_archname (name
);
578 *search_arch_tail_ptr
= new;
579 search_arch_tail_ptr
= &new->next
;
582 #else /* not GNU960 */
585 ldfile_add_arch (in_name
)
588 char *name
= xstrdup (in_name
);
589 search_arch_type
*new =
590 (search_arch_type
*) xmalloc (sizeof (search_arch_type
));
592 ldfile_output_machine_name
= in_name
;
595 new->next
= (search_arch_type
*) NULL
;
598 *name
= TOLOWER (*name
);
601 *search_arch_tail_ptr
= new;
602 search_arch_tail_ptr
= &new->next
;
607 /* Set the output architecture. */
610 ldfile_set_output_arch (string
)
613 const bfd_arch_info_type
*arch
= bfd_scan_arch (string
);
617 ldfile_output_architecture
= arch
->arch
;
618 ldfile_output_machine
= arch
->mach
;
619 ldfile_output_machine_name
= arch
->printable_name
;
623 einfo (_("%P%F: cannot represent machine `%s'\n"), string
);