summaryrefslogtreecommitdiffstats
path: root/binutils-2.25/gold/archive.cc
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.25/gold/archive.cc')
-rw-r--r--binutils-2.25/gold/archive.cc89
1 files changed, 49 insertions, 40 deletions
diff --git a/binutils-2.25/gold/archive.cc b/binutils-2.25/gold/archive.cc
index 53d88a23..23cb0be3 100644
--- a/binutils-2.25/gold/archive.cc
+++ b/binutils-2.25/gold/archive.cc
@@ -1,7 +1,6 @@
// archive.cc -- archive support for gold
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2013
-// Free Software Foundation, Inc.
+// Copyright (C) 2006-2014 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -97,46 +96,56 @@ Library_base::should_include_member(Symbol_table* symtab, Layout* layout,
*symp = sym;
- if (sym == NULL)
+ if (sym != NULL)
{
- // Check whether the symbol was named in a -u option.
- if (parameters->options().is_undefined(sym_name))
- {
- *why = "-u ";
- *why += sym_name;
- }
- else if (parameters->options().is_export_dynamic_symbol(sym_name))
- {
- *why = "--export-dynamic-symbol ";
- *why += sym_name;
- }
- else if (layout->script_options()->is_referenced(sym_name))
- {
- size_t alc = 100 + strlen(sym_name);
- char* buf = new char[alc];
- snprintf(buf, alc, _("script or expression reference to %s"),
- sym_name);
- *why = buf;
- delete[] buf;
- }
- else if (strcmp(sym_name, parameters->entry()) == 0)
- {
- *why = "entry symbol ";
- *why += sym_name;
- }
- else
- return Library_base::SHOULD_INCLUDE_UNKNOWN;
+ if (!sym->is_undefined())
+ return Library_base::SHOULD_INCLUDE_NO;
+
+ // PR 12001: Do not include an archive when the undefined
+ // symbol has actually been defined on the command line.
+ if (layout->script_options()->is_pending_assignment(sym_name))
+ return Library_base::SHOULD_INCLUDE_NO;
+
+ // If the symbol is weak undefined, we still need to check
+ // for other reasons (like a -u option).
+ if (sym->binding() != elfcpp::STB_WEAK)
+ return Library_base::SHOULD_INCLUDE_YES;
+ }
+
+ // Check whether the symbol was named in a -u option.
+ if (parameters->options().is_undefined(sym_name))
+ {
+ *why = "-u ";
+ *why += sym_name;
+ return Library_base::SHOULD_INCLUDE_YES;
+ }
+
+ if (parameters->options().is_export_dynamic_symbol(sym_name))
+ {
+ *why = "--export-dynamic-symbol ";
+ *why += sym_name;
+ return Library_base::SHOULD_INCLUDE_YES;
}
- else if (!sym->is_undefined())
- return Library_base::SHOULD_INCLUDE_NO;
- // PR 12001: Do not include an archive when the undefined
- // symbol has actually been defined on the command line.
- else if (layout->script_options()->is_pending_assignment(sym_name))
- return Library_base::SHOULD_INCLUDE_NO;
- else if (sym->binding() == elfcpp::STB_WEAK)
- return Library_base::SHOULD_INCLUDE_UNKNOWN;
-
- return Library_base::SHOULD_INCLUDE_YES;
+
+ if (layout->script_options()->is_referenced(sym_name))
+ {
+ size_t alc = 100 + strlen(sym_name);
+ char* buf = new char[alc];
+ snprintf(buf, alc, _("script or expression reference to %s"),
+ sym_name);
+ *why = buf;
+ delete[] buf;
+ return Library_base::SHOULD_INCLUDE_YES;
+ }
+
+ if (strcmp(sym_name, parameters->entry()) == 0)
+ {
+ *why = "entry symbol ";
+ *why += sym_name;
+ return Library_base::SHOULD_INCLUDE_YES;
+ }
+
+ return Library_base::SHOULD_INCLUDE_UNKNOWN;
}
// The header of an entry in the archive. This is all readable text,