diff options
Diffstat (limited to 'gnu/usr.bin/binutils/ld/ldfile.c')
-rw-r--r-- | gnu/usr.bin/binutils/ld/ldfile.c | 113 |
1 files changed, 81 insertions, 32 deletions
diff --git a/gnu/usr.bin/binutils/ld/ldfile.c b/gnu/usr.bin/binutils/ld/ldfile.c index a1f2b49c086..9613c078384 100644 --- a/gnu/usr.bin/binutils/ld/ldfile.c +++ b/gnu/usr.bin/binutils/ld/ldfile.c @@ -1,10 +1,12 @@ -/* Copyright (C) 1991, 92, 93, 94 Free Software Foundation, Inc. +/* Linker file opening and searching. + Copyright (C) 1991, 92, 93, 94, 95, 98, 99, 2000 + Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. GLD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) +the Free Software Foundation; either version 2, or (at your option) any later version. GLD is distributed in the hope that it will be useful, @@ -13,8 +15,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -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. */ +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 @@ -49,8 +52,12 @@ search_dirs_type *search_head; #ifdef VMS char *slash = ""; #else +#if defined (_WIN32) && ! defined (__CYGWIN32__) +char *slash = "\\"; +#else char *slash = "/"; #endif +#endif #else /* MPW */ /* The MPW path char is a colon. */ char *slash = ":"; @@ -69,9 +76,6 @@ typedef struct search_arch 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 @@ -99,23 +103,56 @@ ldfile_try_open_bfd (attempt, entry) entry->the_bfd = bfd_openr (attempt, entry->target); if (trace_file_tries) - info_msg ("attempt to open %s %s\n", attempt, - entry->the_bfd == NULL ? "failed" : "succeeded"); + { + if (entry->the_bfd == NULL) + info_msg (_("attempt to open %s failed\n"), attempt); + else + info_msg (_("attempt to open %s succeeded\n"), attempt); + } - if (entry->the_bfd != NULL) - return true; - else + if (entry->the_bfd == NULL) { if (bfd_get_error () == bfd_error_invalid_target) - einfo ("%F%P: invalid BFD target `%s'\n", entry->target); + einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target); return false; } + + /* If we are searching for this file, see if the architecture is + compatible with the output file. If it isn't, keep searching. + If we can't open the file as an object file, stop the search + here. */ + + if (entry->search_dirs_flag) + { + bfd *check; + + if (bfd_check_format (entry->the_bfd, bfd_archive)) + check = bfd_openr_next_archived_file (entry->the_bfd, NULL); + else + check = entry->the_bfd; + + if (check != NULL) + { + if (! bfd_check_format (check, bfd_object)) + return true; + if (bfd_arch_get_compatible (check, output_bfd) == 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; + } + } + } + + return true; } /* 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; @@ -155,7 +192,13 @@ ldfile_open_file_search (arch, entry, lib, suffix) if (entry->is_archive) sprintf (string, "%s%s%s%s%s%s", search->name, slash, lib, entry->filename, arch, suffix); - else if (entry->filename[0] == '/' || entry->filename[0] == '.') + else if (entry->filename[0] == '/' || entry->filename[0] == '.' +#if defined (__MSDOS__) || defined (_WIN32) + || entry->filename[0] == '\\' + || (isalpha (entry->filename[0]) + && entry->filename[1] == ':') +#endif + ) strcpy (string, entry->filename); else sprintf (string, "%s%s%s", search->name, slash, entry->filename); @@ -185,6 +228,11 @@ ldfile_open_file (entry) { if (ldfile_try_open_bfd (entry->filename, entry)) return; + if (strcmp (entry->filename, entry->local_sym_name) != 0) + 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); } else { @@ -201,10 +249,11 @@ ldfile_open_file (entry) if (ldfile_open_file_search (arch->name, entry, ":lib", ".a")) return; #endif + if (ldemul_find_potential_libraries (arch->name, entry)) + return; } + einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name); } - - einfo("%F%P: cannot open %s: %E\n", entry->local_sym_name); } /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */ @@ -221,10 +270,9 @@ try_open (name, exten) if (trace_file_tries) { if (result == NULL) - info_msg ("cannot find script file "); + info_msg (_("cannot find script file %s\n"), name); else - info_msg ("opened script file "); - info_msg ("%s\n",name); + info_msg (_("opened script file %s\n"), name); } if (result != NULL) @@ -237,10 +285,9 @@ try_open (name, exten) if (trace_file_tries) { if (result == NULL) - info_msg ("cannot find script file "); + info_msg (_("cannot find script file %s\n"), buff); else - info_msg ("opened script file "); - info_msg ("%s\n", buff); + info_msg (_("opened script file %s\n"), buff); } } @@ -266,7 +313,7 @@ ldfile_find_command_file (name, extend) for (search = search_head; search != (search_dirs_type *)NULL; search = search->next) { - sprintf(buffer,"%s/%s", search->name, name); + sprintf(buffer,"%s%s%s", search->name, slash, name); result = try_open(buffer, extend); if (result)break; } @@ -283,7 +330,7 @@ ldfile_open_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); + einfo(_("%P%F: cannot open linker script file %s: %E\n"),name); } lex_push_file(ldlex_input_stack, name); @@ -324,7 +371,7 @@ char *name; } if ( tp->cmd_switch == NULL ){ - einfo("%P%F: unknown architecture: %s\n",name); + einfo(_("%P%F: unknown architecture: %s\n"),name); } return tp->arch; } @@ -341,7 +388,7 @@ char *name; if (*name != '\0') { if (ldfile_output_machine_name[0] != '\0') { - einfo("%P%F: target architecture respecified\n"); + einfo(_("%P%F: target architecture respecified\n")); return; } ldfile_output_machine_name = name; @@ -369,10 +416,12 @@ ldfile_add_arch (in_name) new->name = name; new->next = (search_arch_type*)NULL; - while (*name) { - if (isupper(*name)) *name = tolower(*name); - name++; - } + while (*name) + { + if (isupper ((unsigned char) *name)) + *name = tolower ((unsigned char) *name); + name++; + } *search_arch_tail_ptr = new; search_arch_tail_ptr = &new->next; @@ -392,6 +441,6 @@ ldfile_set_output_arch (string) ldfile_output_machine_name = arch->printable_name; } else { - einfo("%P%F: cannot represent machine `%s'\n", string); + einfo(_("%P%F: cannot represent machine `%s'\n"), string); } } |