* 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.
This commit is contained in:
Nick Clifton 2010-01-21 10:31:32 +00:00
parent 95433b348d
commit c4b7819565
4 changed files with 57 additions and 13 deletions

View File

@ -1,3 +1,19 @@
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

View File

@ -1,6 +1,6 @@
/* 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.
@ -363,7 +363,10 @@ ldfile_open_file_search (const char *arch,
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)
@ -375,11 +378,15 @@ 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
{
@ -406,13 +413,18 @@ ldfile_open_file (lang_input_statement_type *entry)
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;
}
}
}

View File

@ -1,6 +1,6 @@
/* 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.
@ -64,6 +64,8 @@ static lang_statement_list_type statement_list;
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 *);
@ -101,8 +103,7 @@ bfd_boolean lang_float_flag = FALSE;
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. */
@ -1060,6 +1061,8 @@ new_afile (const char *name,
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);
@ -2583,6 +2586,10 @@ load_symbols (lang_input_statement_type *entry,
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))
{
@ -3164,6 +3171,10 @@ open_input_bfds (lang_statement_union_type *s, bfd_boolean force)
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. */

View File

@ -1,6 +1,6 @@
/* 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.
@ -279,9 +279,13 @@ typedef struct lang_input_statement_struct
/* 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
@ -462,6 +466,7 @@ extern lang_statement_list_type file_chain;
extern lang_statement_list_type input_file_chain;
extern int lang_statement_iteration;
extern bfd_boolean missing_file;
extern void lang_init
(void);