x86-64: Check ELF_COMMON_DEF_P for common symbols

bfd/

	PR ld/22064
	* elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Check
	ELF_COMMON_DEF_P for common symbols.

ld/

	PR ld/22064
	* testsuite/ld-x86-64/pr22064a.S: New file.
	* testsuite/ld-x86-64/pr22064b.c: Likewise.
	* testsuite/ld-x86-64/x86-64.exp: Run PR ld/22064 test.
This commit is contained in:
H.J. Lu 2017-09-01 18:53:26 -07:00
parent 96d01d93c4
commit ad71ce8de7
6 changed files with 84 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2017-09-01 H.J. Lu <hongjiu.lu@intel.com>
PR ld/22064
* elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Check
ELF_COMMON_DEF_P for common symbols.
2017-09-02 Alan Modra <amodra@gmail.com>
* elf-eh-frame.c (offset_adjust): Avoid false positive gcc warning.

View File

@ -5330,7 +5330,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
else if (bfd_link_pic (info)
&& SYMBOL_REFERENCES_LOCAL (info, h))
{
if (!h->def_regular)
if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
return FALSE;
BFD_ASSERT((h->got.offset & 1) != 0);
rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);

View File

@ -1,3 +1,10 @@
2017-09-01 H.J. Lu <hongjiu.lu@intel.com>
PR ld/22064
* testsuite/ld-x86-64/pr22064a.S: New file.
* testsuite/ld-x86-64/pr22064b.c: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run PR ld/22064 test.
2017-09-02 Alan Modra <amodra@gmail.com>
* emultempl/msp430.em (eval_upper_either_sections): Make base_sec_name

View File

@ -0,0 +1,33 @@
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "PASS"
.text
.globl main
.type main, @function
main:
movq foo@GOTPCREL(%rip), %rax
cmpl $0, (%rax)
jne .L4
subq $8, %rsp
call foo_p@PLT
cmpq foo@GOTPCREL(%rip), %rax
jne .L2
movq bar@GOTPCREL(%rip), %rax
cmpl $-1, (%rax)
jne .L2
call bar_p@PLT
cmpq bar@GOTPCREL(%rip), %rax
jne .L2
leaq .LC0(%rip), %rdi
call puts@PLT
.L2:
movl $0, %eax
addq $8, %rsp
ret
.L4:
movl $0, %eax
ret
.size main, .-main
.comm bar,8,4
.comm foo,4,4
.section .note.GNU-stack,"",@progbits

View File

@ -0,0 +1,14 @@
int foo[2];
int bar[2] = { -1, -1 };
int *
foo_p (void)
{
return foo;
}
int *
bar_p (void)
{
return bar;
}

View File

@ -1073,6 +1073,20 @@ if { [isnative] && [which $CC] != 0 } {
{{error_output "pr21997-1a.err"}} \
"pr21997-1a" \
] \
[list \
"Build pr22064a.o" \
"" \
"" \
{ pr22064a.S } \
] \
[list \
"Build pr22064.so" \
"-shared" \
"-fPIC" \
{ pr22064b.c } \
{} \
"pr22064.so" \
] \
]
if {[istarget "x86_64-*-linux*-gnux32"]} {
@ -1363,6 +1377,15 @@ if { [isnative] && [which $CC] != 0 } {
"pass.out" \
"-fPIC" \
] \
[list \
"Run pr22064" \
"-pie -Wl,--no-as-needed tmpdir/pr22064a.o tmpdir/pr22064.so" \
"" \
{ dummy.s } \
"pr22064-pie" \
"pass.out" \
"-fPIE" \
] \
]
# Run-time tests which require working ifunc attribute support.