aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorWill Newton <will.newton@linaro.org>2015-01-28 10:39:21 +0000
committerWill Newton <will.newton@linaro.org>2015-02-03 14:05:06 +0000
commit46b87d490296235ab7c76c68816de7c402a79326 (patch)
tree8941906e51a938432b6293d858fc5c5c0c917531 /bfd
parent3a63561744873b54e13c45923fba4aaca7a2fec7 (diff)
downloadgdb-46b87d490296235ab7c76c68816de7c402a79326.zip
gdb-46b87d490296235ab7c76c68816de7c402a79326.tar.gz
gdb-46b87d490296235ab7c76c68816de7c402a79326.tar.bz2
bfd/elfnn-aarch64.c: Set st_value to zero for undefined symbols
Unless pointer_equality_needed is set then set st_value to be zero for undefined symbols. bfd/ChangeLog: 2015-02-03 Will Newton <will.newton@linaro.org> * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): Set st_value to zero for undefined symbols if the reference is weak or pointer_equality_needed is FALSE.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog4
-rw-r--r--bfd/elfnn-aarch64.c15
2 files changed, 15 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e6f0418..e6ed9b6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,9 @@
2015-02-03 Will Newton <will.newton@linaro.org>
+ * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol):
+ Set st_value to zero for undefined symbols if the reference
+ is weak or pointer_equality_needed is FALSE.
+
* elf32-arm.c (elf32_arm_finish_dynamic_symbol): Improve
comment discussing why we clear st_value for some symbols.
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 37de7fa..39458aa 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -7436,11 +7436,18 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
if (!h->def_regular)
{
/* Mark the symbol as undefined, rather than as defined in
- the .plt section. Leave the value alone. This is a clue
- for the dynamic linker, to make function pointer
- comparisons work between an application and shared
- library. */
+ the .plt section. */
sym->st_shndx = SHN_UNDEF;
+ /* If the symbol is weak we need to clear the value.
+ Otherwise, the PLT entry would provide a definition for
+ the symbol even if the symbol wasn't defined anywhere,
+ and so the symbol would never be NULL. Leave the value if
+ there were any relocations where pointer equality matters
+ (this is a clue for the dynamic linker, to make function
+ pointer comparisons work between an application and shared
+ library). */
+ if (!h->ref_regular_nonweak || !h->pointer_equality_needed)
+ sym->st_value = 0;
}
}