[binutils-gdb/binutils-2_29-branch] x86-64: Check ELF_COMMON_DEF_P for common symbols

H.J.Lu hjl@sourceware.org
Sat Sep 2 02:55:00 GMT 2017


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=78a6a9c3a3a37868fd7014a67606281aea1c2c84

commit 78a6a9c3a3a37868fd7014a67606281aea1c2c84
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Sep 1 18:53:26 2017 -0700

    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.
    
    (cherry picked from commit ad71ce8de7dba823f5fc478e6d5eba03f1a2e822)

Diff:
---
 bfd/ChangeLog                     |  6 ++++++
 bfd/elf64-x86-64.c                |  2 +-
 ld/ChangeLog                      |  7 +++++++
 ld/testsuite/ld-x86-64/pr22064a.S | 33 +++++++++++++++++++++++++++++++++
 ld/testsuite/ld-x86-64/pr22064b.c | 14 ++++++++++++++
 ld/testsuite/ld-x86-64/x86-64.exp | 23 +++++++++++++++++++++++
 6 files changed, 84 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9314254..b5f1204 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
 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-01  H.J. Lu  <hongjiu.lu@intel.com>
+
 	PR ld/22061
 	* elf32-i386.c (elf_i386_link_setup_gnu_properties): Create
 	.eh_frame section for the second PLT.
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index bc60012..59926b6 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -6181,7 +6181,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);
diff --git a/ld/ChangeLog b/ld/ChangeLog
index f4335cf..24d0ed2 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,12 @@
 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-01  H.J. Lu  <hongjiu.lu@intel.com>
+
 	PR ld/22061
 	* testsuite/ld-i386/ibt-plt-1.d: Pass --hash-style=sysv to ld.
 	Updated.
diff --git a/ld/testsuite/ld-x86-64/pr22064a.S b/ld/testsuite/ld-x86-64/pr22064a.S
new file mode 100644
index 0000000..8065a11
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr22064a.S
@@ -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
diff --git a/ld/testsuite/ld-x86-64/pr22064b.c b/ld/testsuite/ld-x86-64/pr22064b.c
new file mode 100644
index 0000000..d906545
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr22064b.c
@@ -0,0 +1,14 @@
+int foo[2];
+int bar[2] = { -1, -1 };
+
+int *
+foo_p (void)
+{
+  return foo;
+}
+
+int *
+bar_p (void)
+{
+  return bar;
+}
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 13c68b8..2535fb7 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -1039,6 +1039,20 @@ if { [isnative] && [which $CC] != 0 } {
 	    {{readelf {-n} property-7.r}} \
 	    "property-7b.o" \
 	] \
+	[list \
+	    "Build pr22064a.o" \
+	    "" \
+	    "" \
+	    { pr22064a.S } \
+	] \
+	[list \
+	    "Build pr22064.so" \
+	    "-shared" \
+	    "-fPIC" \
+	    { pr22064b.c } \
+	    {} \
+	    "pr22064.so" \
+	] \
     ]
 
     run_ld_link_exec_tests [list \
@@ -1215,6 +1229,15 @@ if { [isnative] && [which $CC] != 0 } {
 	    {property-x86-2.S property-x86-1.S pass.c property-stack.S} \
 	    "property-5-static" "pass.out" \
 	] \
+	[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.



More information about the Binutils-cvs mailing list