x86-64: Check ELF_COMMON_DEF_P for common symbols
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 2 Sep 2017 01:53:26 +0000 (18:53 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 2 Sep 2017 01:55:55 +0000 (18:55 -0700)
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.

bfd/ChangeLog
bfd/elf64-x86-64.c
ld/ChangeLog
ld/testsuite/ld-x86-64/pr22064a.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22064b.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 5dde137405db6092cd61a80bee399eec1b459f5f..5ef77cce6c7467d0a63561580a36d9b5daaed7e7 100644 (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.
index 63aff4630f5f00a7ac9e3d9be5473c0ae3e59d7e..26ab715daf244ac69510a0a4678b42f1aaa06433 100644 (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);
index 4a45000813d323be89685a082257cbfa34936662..2cda5e03fd880897aeb9f563c0b792be2532cd5b 100644 (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
diff --git a/ld/testsuite/ld-x86-64/pr22064a.S b/ld/testsuite/ld-x86-64/pr22064a.S
new file mode 100644 (file)
index 0000000..8065a11
--- /dev/null
@@ -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 (file)
index 0000000..d906545
--- /dev/null
@@ -0,0 +1,14 @@
+int foo[2];
+int bar[2] = { -1, -1 };
+
+int *
+foo_p (void)
+{
+  return foo;
+}
+
+int *
+bar_p (void)
+{
+  return bar;
+}
index bf73534c1b8e0619f39763a5213b99dd36c0685a..83822dcfe9669579518931bd3acc8b6a34e2811b 100644 (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.