diff options
author | Will Newton <will.newton@linaro.org> | 2015-01-28 10:39:21 +0000 |
---|---|---|
committer | Will Newton <will.newton@linaro.org> | 2015-02-03 14:05:06 +0000 |
commit | 46b87d490296235ab7c76c68816de7c402a79326 (patch) | |
tree | 8941906e51a938432b6293d858fc5c5c0c917531 | |
parent | 3a63561744873b54e13c45923fba4aaca7a2fec7 (diff) | |
download | gdb-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.
-rw-r--r-- | bfd/ChangeLog | 4 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 15 |
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; } } |