-/* Copyright (C) 1991, 92, 93, 94 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 98, 1999 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,
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
#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 = ":";
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
- return false;
+ {
+ if (bfd_get_error () == bfd_error_invalid_target)
+ einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
+ return false;
+ }
}
/* Search for and open the file specified by ENTRY. If it is an
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);
if (ldfile_try_open_bfd (string, entry))
{
- entry->filename = string;
- return true;
+ bfd * arfile = NULL;
+
+ if (bfd_check_format (entry->the_bfd, bfd_archive))
+ {
+ /* We treat an archive as compatible if it empty
+ or has at least one compatible object. */
+ arfile = bfd_openr_next_archived_file (entry->the_bfd, NULL);
+
+ if (!arfile)
+ arfile = output_bfd;
+ else
+ while (arfile
+ && !(bfd_check_format (arfile, bfd_object)
+ && bfd_arch_get_compatible (arfile, output_bfd)))
+ arfile = bfd_openr_next_archived_file (entry->the_bfd, arfile);
+ }
+ else if (bfd_arch_get_compatible (entry->the_bfd, output_bfd))
+ arfile = output_bfd;
+
+ if (arfile)
+ {
+ entry->filename = string;
+ return true;
+ }
+
+ info_msg (_("%s is for an incompatible architecture -- skipped\n"),
+ string);
+ bfd_close(entry->the_bfd);
+ entry->the_bfd = NULL;
}
free (string);
{
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
{
return;
#endif
}
+ 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. */
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)
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);
}
}
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;
}
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);
}
if ( tp->cmd_switch == NULL ){
- einfo("%P%F: unknown architecture: %s\n",name);
+ einfo(_("%P%F: unknown architecture: %s\n"),name);
}
return tp->arch;
}
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;
{
char *name = buystring(in_name);
search_arch_type *new =
- (search_arch_type *)xmalloc((bfd_size_type)(sizeof(search_arch_type)));
+ (search_arch_type *) xmalloc (sizeof (search_arch_type));
ldfile_output_machine_name = 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;
ldfile_set_output_arch (string)
CONST char *string;
{
- bfd_arch_info_type *arch = bfd_scan_arch(string);
+ const bfd_arch_info_type *arch = bfd_scan_arch(string);
if (arch) {
ldfile_output_architecture = arch->arch;
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);
}
}