summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-12-22 14:43:49 +1030
committerAlan Modra <amodra@gmail.com>2014-12-23 23:36:50 +1030
commitcd8e2bcf0d51e91ab8da72ec63048790e3720b03 (patch)
tree74f3cf1905d6afcc5aba440f51b5ecb4d8e63a3a
parent18d6a79d3527acd718cc8acd9395d1bf4cc4ce0a (diff)
downloadbinutils-gdb-cd8e2bcf0d51e91ab8da72ec63048790e3720b03.tar.gz
Correct logic for "defined by object"
The old code missed testing bfd_link_hash_undefweak, and wrongly excluded bfd_link_hash_common symbols. It is also clearer to invert the set of enum bfd_link_hash_type values tested. bfd_link_hash_indirect and bfd_link_hash_warning will never appear here. * ldexp.c (update_definedness): Correct logic setting by_object.
-rw-r--r--ld/ChangeLog4
-rw-r--r--ld/ldexp.c8
2 files changed, 8 insertions, 4 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 1492b8d9f19..43ce92432ea 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,9 @@
2014-12-23 Alan Modra <amodra@gmail.com>
+ * ldexp.c (update_definedness): Correct logic setting by_object.
+
+2014-12-23 Alan Modra <amodra@gmail.com>
+
* ldexp.c (struct definedness_hash_entry, definedness_table)
(definedness_newfunc, symbol_defined, update_definedness): Move
and rename from..
diff --git a/ld/ldexp.c b/ld/ldexp.c
index 28289338dec..e9e95f9ddeb 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -304,11 +304,11 @@ update_definedness (const char *name, struct bfd_link_hash_entry *h)
einfo (_("%P%F: bfd_hash_lookup failed creating symbol %s\n"), name);
/* If the symbol was already defined, and not by a script, then it
- must be defined by an object file. */
+ must be defined by an object file or by the linker target code. */
if (!defentry->by_script
- && h->type != bfd_link_hash_undefined
- && h->type != bfd_link_hash_common
- && h->type != bfd_link_hash_new)
+ && (h->type == bfd_link_hash_defined
+ || h->type == bfd_link_hash_defweak
+ || h->type == bfd_link_hash_common))
defentry->by_object = 1;
defentry->by_script = 1;