mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-18 14:53:32 +08:00
[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.
This commit is contained in:
parent
eb2bfbadc1
commit
93f4de3929
@ -1,3 +1,8 @@
|
||||
2017-10-24 Renlin Li <renlin.li@arm.com>
|
||||
|
||||
PR ld/21703
|
||||
* elflink.c (_bfd_elf_merge_symbol): Handle multiple definition case.
|
||||
|
||||
2017-10-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR 22319
|
||||
|
@ -1036,6 +1036,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||
bfd_boolean newweak, oldweak, newfunc, oldfunc;
|
||||
const struct elf_backend_data *bed;
|
||||
char *new_version;
|
||||
bfd_boolean default_sym = *matched;
|
||||
|
||||
*skip = FALSE;
|
||||
*override = FALSE;
|
||||
@ -1557,6 +1558,18 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||
sec = *psec;
|
||||
}
|
||||
|
||||
/* There are multiple definitions of a normal symbol.
|
||||
Skip the default symbol as well. */
|
||||
if (olddef && !olddyn && !oldweak && newdef && !newdyn && !newweak
|
||||
&& !default_sym && h->def_regular)
|
||||
{
|
||||
/* Handle a multiple definition. */
|
||||
(*info->callbacks->multiple_definition) (info, &h->root,
|
||||
abfd, sec, *pvalue);
|
||||
*skip = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* If both the old and the new symbols look like common symbols in a
|
||||
dynamic object, set the size of the symbol to the larger of the
|
||||
two. */
|
||||
|
13
ld/ChangeLog
13
ld/ChangeLog
@ -1,3 +1,16 @@
|
||||
2017-10-24 Renlin Li <renlin.li@arm.com>
|
||||
|
||||
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.
|
||||
|
||||
2017-10-23 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* configure.tgt (i[3-7]86-*-linux-*): Move elf32_x86_64 from
|
||||
|
@ -70,6 +70,18 @@ run_ld_link_tests [list \
|
||||
{symbol3w.s} {} "symbol3w.a" ] \
|
||||
]
|
||||
|
||||
run_ld_link_tests [list \
|
||||
[list "PR ld/21703" \
|
||||
"--allow-multiple-definition tmpdir/pr21703-1.o tmpdir/pr21703-2.o" "" "" \
|
||||
{pr21703-1.s pr21703-2.s} {{readelf {-s} pr21703.sd}} "pr21703" ] \
|
||||
[list "PR ld/21703 -r" \
|
||||
"-r --allow-multiple-definition tmpdir/pr21703-3.o tmpdir/pr21703-4.o" "" "" \
|
||||
{pr21703-3.s pr21703-4.s} {{readelf {-s} pr21703-r.sd}} "pr21703.o" ] \
|
||||
[list "PR ld/21703 shared" \
|
||||
"-shared --allow-multiple-definition --version-script pr21703.ver tmpdir/pr21703-3.o tmpdir/pr21703-4.o" "" "" \
|
||||
{pr21703-3.s pr21703-4.s} {{readelf {--dyn-syms} pr21703-shared.sd}} "pr21703.so" ] \
|
||||
]
|
||||
|
||||
if { [check_shared_lib_support] } then {
|
||||
run_ld_link_tests {
|
||||
{"Build pr14170a.o" "" "" "" {pr14170a.s} {} "pr14170.a" }
|
||||
|
6
ld/testsuite/ld-elf/pr21703-1.s
Normal file
6
ld/testsuite/ld-elf/pr21703-1.s
Normal file
@ -0,0 +1,6 @@
|
||||
.text
|
||||
.globl foo
|
||||
.type foo, %function
|
||||
foo:
|
||||
.space 4
|
||||
.size foo, 4
|
6
ld/testsuite/ld-elf/pr21703-2.s
Normal file
6
ld/testsuite/ld-elf/pr21703-2.s
Normal file
@ -0,0 +1,6 @@
|
||||
.text
|
||||
.globl foo
|
||||
.type foo, %function
|
||||
foo:
|
||||
.space 16
|
||||
.size foo, 16
|
15
ld/testsuite/ld-elf/pr21703-3.s
Normal file
15
ld/testsuite/ld-elf/pr21703-3.s
Normal file
@ -0,0 +1,15 @@
|
||||
.text
|
||||
.global foo
|
||||
.type foo, %function
|
||||
foo:
|
||||
.space 4
|
||||
.size foo, 4
|
||||
|
||||
.global foo1
|
||||
.type foo1, %function
|
||||
foo1:
|
||||
.space 32
|
||||
.size foo1, 32
|
||||
|
||||
.symver foo, foo@FOO
|
||||
.symver foo1, foo@@FOO1
|
15
ld/testsuite/ld-elf/pr21703-4.s
Normal file
15
ld/testsuite/ld-elf/pr21703-4.s
Normal file
@ -0,0 +1,15 @@
|
||||
.text
|
||||
.global bar
|
||||
.type bar, %function
|
||||
bar:
|
||||
.space 16
|
||||
.size bar, 16
|
||||
|
||||
.global bar1
|
||||
.type bar1, %function
|
||||
bar1:
|
||||
.space 8
|
||||
.size bar1, 8
|
||||
|
||||
.symver bar, foo@FOO
|
||||
.symver bar1, foo@@FOO1
|
9
ld/testsuite/ld-elf/pr21703-r.sd
Normal file
9
ld/testsuite/ld-elf/pr21703-r.sd
Normal file
@ -0,0 +1,9 @@
|
||||
Symbol table '.symtab' contains .* entries:
|
||||
#...
|
||||
.*: [0-9a-fA-F]* +4 +FUNC +GLOBAL +DEFAULT +. foo@FOO
|
||||
.*: [0-9a-fA-F]* +32 +FUNC +GLOBAL +DEFAULT +. foo1
|
||||
.*: [0-9a-fA-F]* +32 +FUNC +GLOBAL +DEFAULT +. foo@@FOO1
|
||||
.*: [0-9a-fA-F]* +8 +FUNC +GLOBAL +DEFAULT +. bar1
|
||||
.*: [0-9a-fA-F]* +4 +FUNC +GLOBAL +DEFAULT +. foo
|
||||
.*: [0-9a-fA-F]* +16 +FUNC +GLOBAL +DEFAULT +. bar
|
||||
#pass
|
8
ld/testsuite/ld-elf/pr21703-shared.sd
Normal file
8
ld/testsuite/ld-elf/pr21703-shared.sd
Normal file
@ -0,0 +1,8 @@
|
||||
Symbol table '\.dynsym' contains [0-9]+ entries:
|
||||
+Num: +Value +Size Type +Bind +Vis +Ndx Name
|
||||
#...
|
||||
+[0-9]+: +[0-9a-f]+ +4 +FUNC +GLOBAL +DEFAULT +[0-9] +foo@FOO
|
||||
+[0-9]+: +[0-9a-f]+ +0 +OBJECT +GLOBAL +DEFAULT +ABS +FOO1
|
||||
+[0-9]+: +[0-9a-f]+ +32 +FUNC +GLOBAL +DEFAULT +[0-9] +foo@@FOO1
|
||||
+[0-9]+: +[0-9a-f]+ +0 +OBJECT +GLOBAL +DEFAULT +ABS +FOO
|
||||
#...
|
4
ld/testsuite/ld-elf/pr21703.sd
Normal file
4
ld/testsuite/ld-elf/pr21703.sd
Normal file
@ -0,0 +1,4 @@
|
||||
Symbol table '.symtab' contains .* entries:
|
||||
#...
|
||||
.*: [0-9a-fA-F]* +4 +FUNC +GLOBAL +DEFAULT +. foo
|
||||
#pass
|
4
ld/testsuite/ld-elf/pr21703.ver
Normal file
4
ld/testsuite/ld-elf/pr21703.ver
Normal file
@ -0,0 +1,4 @@
|
||||
FOO
|
||||
{ global: foo; local: *; };
|
||||
FOO1
|
||||
{ global: foo; local: *; };
|
Loading…
Reference in New Issue
Block a user