+2010-01-21 Jon Grant <jg@jguk.org>
+ Nick Clifton <nickc@redhat.com>
+
+ PR 4437
+ * ldfile.c: (ldfile_open_file): Do not stop link upon encountering
+ a missing file or library. Instead mark the entry as missing and
+ set the global flag to indicate that missing files were
+ encountered.
+ * ldlang.c (missing_files): New exported variable.
+ (load_symbols): Skip loading if the file is missing.
+ (open_input_bfds): Terminate link if any input files were
+ missing.
+ * ldlang.h (struct lang_input_statement_struct): Add missing_file
+ field.
+ Add export of missing_file variable.
+
2010-01-13 DJ Delorie <dj@redhat.com>
* emultempl/elf32.em (_place_orphan): If an input section doesn't
/* Linker file opening and searching.
Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
- 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
return FALSE;
}
-/* Open the input file specified by ENTRY. */
+/* Open the input file specified by ENTRY.
+ PR 4437: Do not stop on the first missing file, but
+ continue processing other input files in case there
+ are more errors to report. */
void
ldfile_open_file (lang_input_statement_type *entry)
{
if (ldfile_try_open_bfd (entry->filename, entry))
return;
+
if (strcmp (entry->filename, entry->local_sym_name) != 0)
- einfo (_("%F%P: %s (%s): No such file: %E\n"),
+ einfo (_("%P: cannot find %s (%s): %E\n"),
entry->filename, entry->local_sym_name);
else
- einfo (_("%F%P: %s: No such file: %E\n"), entry->local_sym_name);
+ einfo (_("%P: cannot find %s: %E\n"), entry->local_sym_name);
+
+ entry->missing_file = TRUE;
+ missing_file = TRUE;
}
else
{
again. */
if (found)
entry->search_dirs_flag = FALSE;
- else if (entry->sysrooted
+ else
+ {
+ if (entry->sysrooted
&& ld_sysroot
&& IS_ABSOLUTE_PATH (entry->local_sym_name))
- einfo (_("%F%P: cannot find %s inside %s\n"),
- entry->local_sym_name, ld_sysroot);
- else
- einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
+ einfo (_("%P: cannot find %s inside %s\n"),
+ entry->local_sym_name, ld_sysroot);
+ else
+ einfo (_("%P: cannot find %s\n"), entry->local_sym_name);
+ entry->missing_file = TRUE;
+ missing_file = TRUE;
+ }
}
}
/* Linker command language support.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
static struct bfd_hash_table lang_definedness_table;
static lang_statement_list_type *stat_save[10];
static lang_statement_list_type **stat_save_ptr = &stat_save[0];
+static struct unique_sections *unique_section_list;
+static bfd_boolean ldlang_sysrooted_script = FALSE;
/* Forward declarations. */
static void exp_init_os (etree_type *);
bfd_boolean delete_output_file_on_failure = FALSE;
struct lang_phdr *lang_phdr_list;
struct lang_nocrossrefs *nocrossref_list;
-static struct unique_sections *unique_section_list;
-static bfd_boolean ldlang_sysrooted_script = FALSE;
+bfd_boolean missing_file = FALSE;
/* Functions that traverse the linker script and might evaluate
DEFINED() need to increment this. */
p->add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
p->whole_archive = whole_archive;
p->loaded = FALSE;
+ p->missing_file = FALSE;
+
lang_statement_append (&input_file_chain,
(lang_statement_union_type *) p,
&p->next_real_file);
ldfile_open_file (entry);
+ /* Do not process further if the file was missing. */
+ if (entry->missing_file)
+ return TRUE;
+
if (! bfd_check_format (entry->the_bfd, bfd_archive)
&& ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
{
break;
}
}
+
+ /* Exit if any of the files were missing. */
+ if (missing_file)
+ einfo ("%F");
}
/* Add a symbol to a hash of symbols used in DEFINED (NAME) expressions. */
/* ldlang.h - linker command language support
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
/* Whether to include the entire contents of an archive. */
unsigned int whole_archive : 1;
+ /* Set when bfd opening is successful. */
unsigned int loaded : 1;
unsigned int real : 1;
+
+ /* Set if the file does not exist. */
+ unsigned int missing_file : 1;
} lang_input_statement_type;
typedef struct
extern lang_statement_list_type input_file_chain;
extern int lang_statement_iteration;
+extern bfd_boolean missing_file;
extern void lang_init
(void);