X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Fldfile.c;h=9fb2b2dab9e4ef24a29637693d362e776eedab9b;hb=5415e7c5d4ce0b49756c8a7ecd800c323e0584d3;hp=6c00cab91e3d90d2f169f581e8bc40611affcaba;hpb=dc9e099fc0eced486ae2b49455c9da113c11f4ff;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldfile.c b/ld/ldfile.c index 6c00cab91e..9fb2b2dab9 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -1,4 +1,6 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 98, 1999 Free Software Foundation, Inc. +/* Linker file opening and searching. + Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002 + Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. @@ -17,16 +19,12 @@ along with GLD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* - ldfile.c - - look after all the file stuff - - */ +/* ldfile.c: look after all the file stuff. */ #include "bfd.h" #include "sysdep.h" #include "bfdlink.h" +#include "safe-ctype.h" #include "ld.h" #include "ldmisc.h" #include "ldexp.h" @@ -36,8 +34,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "ldgram.h" #include "ldlex.h" #include "ldemul.h" - -#include +#include "libiberty.h" const char *ldfile_input_filename; boolean ldfile_assumed_script = false; @@ -57,7 +54,7 @@ char *slash = "/"; #endif #endif #else /* MPW */ -/* The MPW path char is a colon. */ +/* The MPW path char is a colon. */ char *slash = ":"; #endif /* MPW */ @@ -65,18 +62,14 @@ char *slash = ":"; static search_dirs_type **search_tail_ptr = &search_head; -typedef struct search_arch -{ - char *name; +typedef struct search_arch { + char *name; struct search_arch *next; } search_arch_type; static search_arch_type *search_arch_head; static search_arch_type **search_arch_tail_ptr = &search_arch_head; - -static boolean ldfile_open_file_search - PARAMS ((const char *arch, lang_input_statement_type *, - const char *lib, const char *suffix)); + static FILE *try_open PARAMS ((const char *name, const char *exten)); void @@ -86,6 +79,9 @@ ldfile_add_library_path (name, cmdline) { search_dirs_type *new; + if (!cmdline && config.only_cmd_line_lib_dirs) + return; + new = (search_dirs_type *) xmalloc (sizeof (search_dirs_type)); new->next = NULL; new->name = name; @@ -132,15 +128,23 @@ ldfile_try_open_bfd (attempt, entry) else check = entry->the_bfd; - if (! bfd_check_format (check, bfd_object)) - return true; - if (bfd_arch_get_compatible (check, output_bfd) == NULL) + if (check != NULL) { - einfo (_("%P: skipping incompatible %s when searching for %s"), - attempt, entry->local_sym_name); - bfd_close (entry->the_bfd); - entry->the_bfd = NULL; - return false; + if (! bfd_check_format (check, bfd_object)) + return true; + + if ((bfd_arch_get_compatible (check, output_bfd) == NULL) + /* XCOFF archives can have 32 and 64 bit objects */ + && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour + && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour + && bfd_check_format (entry->the_bfd, bfd_archive))) + { + einfo (_("%P: skipping incompatible %s when searching for %s\n"), + attempt, entry->local_sym_name); + bfd_close (entry->the_bfd); + entry->the_bfd = NULL; + return false; + } } } @@ -150,7 +154,7 @@ ldfile_try_open_bfd (attempt, entry) /* Search for and open the file specified by ENTRY. If it is an archive, use ARCH, LIB and SUFFIX to modify the file name. */ -static boolean +boolean ldfile_open_file_search (arch, entry, lib, suffix) const char *arch; lang_input_statement_type *entry; @@ -168,8 +172,8 @@ ldfile_open_file_search (arch, entry, lib, suffix) } for (search = search_head; - search != (search_dirs_type *)NULL; - search = search->next) + search != (search_dirs_type *) NULL; + search = search->next) { char *string; @@ -192,8 +196,8 @@ ldfile_open_file_search (arch, entry, lib, suffix) lib, entry->filename, arch, suffix); else if (entry->filename[0] == '/' || entry->filename[0] == '.' #if defined (__MSDOS__) || defined (_WIN32) - || entry->filename[0] == '\\' - || (isalpha (entry->filename[0]) + || entry->filename[0] == '\\' + || (ISALPHA (entry->filename[0]) && entry->filename[1] == ':') #endif ) @@ -230,25 +234,37 @@ ldfile_open_file (entry) einfo (_("%F%P: cannot open %s for %s: %E\n"), entry->filename, entry->local_sym_name); else - einfo(_("%F%P: cannot open %s: %E\n"), entry->local_sym_name); + einfo (_("%F%P: cannot open %s: %E\n"), entry->local_sym_name); } else { search_arch_type *arch; + boolean found = false; /* Try to open or lib.a */ for (arch = search_arch_head; arch != (search_arch_type *) NULL; arch = arch->next) { - if (ldfile_open_file_search (arch->name, entry, "lib", ".a")) - return; + found = ldfile_open_file_search (arch->name, entry, "lib", ".a"); + if (found) + break; #ifdef VMS - if (ldfile_open_file_search (arch->name, entry, ":lib", ".a")) - return; + found = ldfile_open_file_search (arch->name, entry, ":lib", ".a"); + if (found) + break; #endif + found = ldemul_find_potential_libraries (arch->name, entry); + if (found) + break; } - einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name); + + /* If we have found the file, we don't need to search directories + again. */ + if (found) + entry->search_dirs_flag = false; + else + einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name); } } @@ -263,6 +279,7 @@ try_open (name, exten) char buff[1000]; result = fopen (name, "r"); + if (trace_file_tries) { if (result == NULL) @@ -278,6 +295,7 @@ try_open (name, exten) { sprintf (buff, "%s%s", name, exten); result = fopen (buff, "r"); + if (trace_file_tries) { if (result == NULL) @@ -302,18 +320,23 @@ ldfile_find_command_file (name, extend) FILE *result; char buffer[1000]; - /* First try raw name */ - result = try_open(name,""); - if (result == (FILE *)NULL) { - /* Try now prefixes */ - for (search = search_head; - search != (search_dirs_type *)NULL; - search = search->next) { - sprintf(buffer,"%s%s%s", search->name, slash, name); - result = try_open(buffer, extend); - if (result)break; + /* First try raw name. */ + result = try_open (name, ""); + if (result == (FILE *) NULL) + { + /* Try now prefixes. */ + for (search = search_head; + search != (search_dirs_type *) NULL; + search = search->next) + { + sprintf (buffer, "%s%s%s", search->name, slash, name); + + result = try_open (buffer, extend); + if (result) + break; + } } - } + return result; } @@ -322,31 +345,30 @@ ldfile_open_command_file (name) const char *name; { FILE *ldlex_input_stack; - ldlex_input_stack = ldfile_find_command_file(name, ""); - - if (ldlex_input_stack == (FILE *)NULL) { - bfd_set_error (bfd_error_system_call); - einfo(_("%P%F: cannot open linker script file %s: %E\n"),name); - } - lex_push_file(ldlex_input_stack, name); - - ldfile_input_filename = name; - lineno = 1; - had_script = true; -} + ldlex_input_stack = ldfile_find_command_file (name, ""); + if (ldlex_input_stack == (FILE *) NULL) + { + bfd_set_error (bfd_error_system_call); + einfo (_("%P%F: cannot open linker script file %s: %E\n"), name); + } + lex_push_file (ldlex_input_stack, name); + ldfile_input_filename = name; + lineno = 1; + saved_script_handle = ldlex_input_stack; +} #ifdef GNU960 -static -char * -gnu960_map_archname( name ) -char *name; +static char * +gnu960_map_archname (name) + char *name; { struct tabentry { char *cmd_switch; char *arch; }; - static struct tabentry arch_tab[] = { + static struct tabentry arch_tab[] = + { "", "", "KA", "ka", "KB", "kb", @@ -358,64 +380,60 @@ char *name; NULL, "" }; struct tabentry *tp; - - for ( tp = arch_tab; tp->cmd_switch != NULL; tp++ ){ - if ( !strcmp(name,tp->cmd_switch) ){ - break; + for (tp = arch_tab; tp->cmd_switch != NULL; tp++) + { + if (! strcmp (name,tp->cmd_switch)) + break; } - } - if ( tp->cmd_switch == NULL ){ - einfo(_("%P%F: unknown architecture: %s\n"),name); - } + if (tp->cmd_switch == NULL) + einfo (_("%P%F: unknown architecture: %s\n"), name); + return tp->arch; } - - void -ldfile_add_arch(name) -char *name; +ldfile_add_arch (name) + char *name; { search_arch_type *new = - (search_arch_type *)xmalloc((bfd_size_type)(sizeof(search_arch_type))); + (search_arch_type *) xmalloc ((bfd_size_type) (sizeof (search_arch_type))); + if (*name != '\0') + { + if (ldfile_output_machine_name[0] != '\0') + { + einfo (_("%P%F: target architecture respecified\n")); + return; + } - if (*name != '\0') { - if (ldfile_output_machine_name[0] != '\0') { - einfo(_("%P%F: target architecture respecified\n")); - return; + ldfile_output_machine_name = name; } - ldfile_output_machine_name = name; - } - new->next = (search_arch_type*)NULL; - new->name = gnu960_map_archname( name ); + new->next = (search_arch_type *) NULL; + new->name = gnu960_map_archname (name); *search_arch_tail_ptr = new; search_arch_tail_ptr = &new->next; - } -#else /* not GNU960 */ - +#else /* not GNU960 */ void ldfile_add_arch (in_name) - CONST char * in_name; + const char *in_name; { - char *name = buystring(in_name); + char *name = xstrdup (in_name); search_arch_type *new = (search_arch_type *) xmalloc (sizeof (search_arch_type)); ldfile_output_machine_name = in_name; new->name = name; - new->next = (search_arch_type*)NULL; + new->next = (search_arch_type *) NULL; while (*name) { - if (isupper ((unsigned char) *name)) - *name = tolower ((unsigned char) *name); + *name = TOLOWER (*name); name++; } *search_arch_tail_ptr = new; @@ -424,19 +442,22 @@ ldfile_add_arch (in_name) } #endif -/* Set the output architecture */ +/* Set the output architecture. */ + void ldfile_set_output_arch (string) - CONST char *string; + const char *string; { - const bfd_arch_info_type *arch = bfd_scan_arch(string); - - if (arch) { - ldfile_output_architecture = arch->arch; - ldfile_output_machine = arch->mach; - ldfile_output_machine_name = arch->printable_name; - } - else { - einfo(_("%P%F: cannot represent machine `%s'\n"), string); - } + const bfd_arch_info_type *arch = bfd_scan_arch (string); + + if (arch) + { + ldfile_output_architecture = arch->arch; + ldfile_output_machine = arch->mach; + ldfile_output_machine_name = arch->printable_name; + } + else + { + einfo (_("%P%F: cannot represent machine `%s'\n"), string); + } }