[BFD][PR21703]Override the new defined symbol with the old normal symbol when --allow...
authorRenlin Li <renlin.li@arm.com>
Tue, 24 Oct 2017 11:42:30 +0000 (12:42 +0100)
committerRenlin Li <renlin.li@arm.com>
Tue, 24 Oct 2017 12:01:48 +0000 (13:01 +0100)
commit93f4de3929aeb3e21d57950bfa96539599a92f2a
tree0ff309d325abe18c23c96887731b1b0b5a2463e6
parenteb2bfbadc159ff1463e58daf24c4ad5d1a23796d
[BFD][PR21703]Override the new defined symbol with the old normal symbol when --allow-multiple-definition is provided.

The behavior of _bfd_elf_merge_symbol and _bfd_generic_link_add_one_symbol is
inconsistent.

In multiple definition case, _bfd_elf_merge_symbol decided to override the old
symbol definition with the new defintion, (size, type, target data)
In _bfd_generic_link_add_one_symbol, it simply return without doing anything
because of allow-multiple-definition is provided.
This leaves the symbol in a wrong state.

Here, following the documentation, I made this patch to force the old definition
override the new definition if the old symbol is not dynamic or weak.
Because, in those two cases, it's expected to do some merge. I have checked
that, those two cases are properly handled.

bfd/
PR ld/21703
* elflink.c (_bfd_elf_merge_symbol): Handle multiple definition case.

ld/

PR ld/21703
* testsuite/ld-elf/elf.exp: Run new tests.
* testsuite/ld-elf/pr21703-1.s: New.
* testsuite/ld-elf/pr21703-2.s: New.
* testsuite/ld-elf/pr21703-3.s: New.
* testsuite/ld-elf/pr21703-4.s: New.
* testsuite/ld-elf/pr21703-r.sd: New.
* testsuite/ld-elf/pr21703-shared.sd: New.
* testsuite/ld-elf/pr21703.sd: New.
* testsuite/ld-elf/pr21703.ver: New.
12 files changed:
bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/testsuite/ld-elf/elf.exp
ld/testsuite/ld-elf/pr21703-1.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr21703-2.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr21703-3.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr21703-4.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr21703-r.sd [new file with mode: 0644]
ld/testsuite/ld-elf/pr21703-shared.sd [new file with mode: 0644]
ld/testsuite/ld-elf/pr21703.sd [new file with mode: 0644]
ld/testsuite/ld-elf/pr21703.ver [new file with mode: 0644]