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.
This commit is contained in:
parent
95433b348d
commit
c4b7819565
16
ld/ChangeLog
16
ld/ChangeLog
|
@ -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
|
||||
|
|
30
ld/ldfile.c
30
ld/ldfile.c
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
17
ld/ldlang.c
17
ld/ldlang.c
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue