From 4e0c91e45402ebf4215066e4a61143896e831049 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 15 Mar 2016 11:46:51 -0700 Subject: [PATCH] Bind defined symbol locally in PIE Symbols defined in PIE should be bound locally, the same as -shared -Bsymbolic. bfd/ PR ld/19827 * elf32-i386.c (elf_i386_check_relocs): Bind defined symbol locally in PIE. (elf_i386_relocate_section): Likewise. * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. (elf_x86_64_relocate_section): Likewise. ld/ PR ld/19827 * testsuite/ld-i386/i386.exp: Run PR ld/19827 tests. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-i386/pr19827.rd: New file. * testsuite/ld-i386/pr19827a.S: Likewise. * testsuite/ld-i386/pr19827b.S: Likewise. * testsuite/ld-x86-64/pr19827.rd: Likewise. * testsuite/ld-x86-64/pr19827a.S: Likewise. * testsuite/ld-x86-64/pr19827b.S: Likewise. --- bfd/ChangeLog | 9 +++++++++ bfd/elf32-i386.c | 7 ++++--- bfd/elf64-x86-64.c | 7 ++++--- ld/ChangeLog | 12 ++++++++++++ ld/testsuite/ld-i386/i386.exp | 8 ++++++++ ld/testsuite/ld-i386/pr19827.rd | 5 +++++ ld/testsuite/ld-i386/pr19827a.S | 8 ++++++++ ld/testsuite/ld-i386/pr19827b.S | 2 ++ ld/testsuite/ld-x86-64/pr19827.rd | 5 +++++ ld/testsuite/ld-x86-64/pr19827a.S | 8 ++++++++ ld/testsuite/ld-x86-64/pr19827b.S | 2 ++ ld/testsuite/ld-x86-64/x86-64.exp | 8 ++++++++ 12 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 ld/testsuite/ld-i386/pr19827.rd create mode 100644 ld/testsuite/ld-i386/pr19827a.S create mode 100644 ld/testsuite/ld-i386/pr19827b.S create mode 100644 ld/testsuite/ld-x86-64/pr19827.rd create mode 100644 ld/testsuite/ld-x86-64/pr19827a.S create mode 100644 ld/testsuite/ld-x86-64/pr19827b.S diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2bb0cc1ea6a..740fd4474b8 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2016-03-15 H.J. Lu + + PR ld/19827 + * elf32-i386.c (elf_i386_check_relocs): Bind defined symbol + locally in PIE. + (elf_i386_relocate_section): Likewise. + * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. + (elf_x86_64_relocate_section): Likewise. + 2016-03-15 H.J. Lu PR ld/19807 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index ac3c2f467c6..1ebb61524d5 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1874,7 +1874,8 @@ do_size: && (sec->flags & SEC_ALLOC) != 0 && (r_type != R_386_PC32 || (h != NULL - && (! SYMBOLIC_BIND (info, h) + && (! (bfd_link_pie (info) + || SYMBOLIC_BIND (info, h)) || h->root.type == bfd_link_hash_defweak || !h->def_regular)))) || (ELIMINATE_COPY_RELOCS @@ -4431,8 +4432,8 @@ r_386_got32: else if (h != NULL && h->dynindx != -1 && (r_type == R_386_PC32 - || !bfd_link_pic (info) - || !SYMBOLIC_BIND (info, h) + || !(bfd_link_executable (info) + || SYMBOLIC_BIND (info, h)) || !h->def_regular)) outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); else diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 31b1f87d0b7..dc7738a3564 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2073,7 +2073,8 @@ do_size: && (sec->flags & SEC_ALLOC) != 0 && (! IS_X86_64_PCREL_TYPE (r_type) || (h != NULL - && (! SYMBOLIC_BIND (info, h) + && (! (bfd_link_pie (info) + || SYMBOLIC_BIND (info, h)) || h->root.type == bfd_link_hash_defweak || !h->def_regular)))) || (ELIMINATE_COPY_RELOCS @@ -4830,8 +4831,8 @@ direct: else if (h != NULL && h->dynindx != -1 && (IS_X86_64_PCREL_TYPE (r_type) - || ! bfd_link_pic (info) - || ! SYMBOLIC_BIND (info, h) + || !(bfd_link_executable (info) + || SYMBOLIC_BIND (info, h)) || ! h->def_regular)) { if ((r_type != R_X86_64_PC64 && r_type != R_X86_64_64) diff --git a/ld/ChangeLog b/ld/ChangeLog index d3172dcb0a5..04b484cc4ed 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,15 @@ +2016-03-15 H.J. Lu + + PR ld/19827 + * testsuite/ld-i386/i386.exp: Run PR ld/19827 tests. + * testsuite/ld-x86-64/x86-64.exp: Likewise. + * testsuite/ld-i386/pr19827.rd: New file. + * testsuite/ld-i386/pr19827a.S: Likewise. + * testsuite/ld-i386/pr19827b.S: Likewise. + * testsuite/ld-x86-64/pr19827.rd: Likewise. + * testsuite/ld-x86-64/pr19827a.S: Likewise. + * testsuite/ld-x86-64/pr19827b.S: Likewise. + 2016-03-15 H.J. Lu PR ld/19807 diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 1e52cdbaca7..2b7a09efb97 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -195,6 +195,14 @@ set i386tests { "--32" {pr17709a.s} {} "libpr17709.so"} {"PR ld/17709 (2)" "-melf_i386 tmpdir/libpr17709.so" "" "--32" {pr17709b.s} {{readelf -r pr17709.rd}} "pr17709"} + {"Build pr19827a.o" "" "" + "--32" { pr19827a.S }} + {"Build pr19827b.so" "-melf_i386 -shared" "" + "--32" { pr19827b.S } {} "pr19827b.so"} + {"Build pr19827" "-melf_i386 -pie tmpdir/pr19827a.o tmpdir/pr19827b.so" "" + "--32" { dummy.s } {{readelf {-rW} pr19827.rd}} "pr19827"} + {"Build pr19827.so" "-melf_i386 -shared -Bsymbolic" "" + "--32" { pr19827a.S } {{readelf {-rW} pr19827.rd}} "pr19827.so"} } # So as to avoid rewriting every last test case here in a nacl variant, diff --git a/ld/testsuite/ld-i386/pr19827.rd b/ld/testsuite/ld-i386/pr19827.rd new file mode 100644 index 00000000000..5d2a885fcd0 --- /dev/null +++ b/ld/testsuite/ld-i386/pr19827.rd @@ -0,0 +1,5 @@ +#readelf: -r --wide + +Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name +[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE + diff --git a/ld/testsuite/ld-i386/pr19827a.S b/ld/testsuite/ld-i386/pr19827a.S new file mode 100644 index 00000000000..cdf1d4b8a30 --- /dev/null +++ b/ld/testsuite/ld-i386/pr19827a.S @@ -0,0 +1,8 @@ + .text + .global _start +_start: + .dc.a foo + .data + .globl foo +foo: + .byte 0 diff --git a/ld/testsuite/ld-i386/pr19827b.S b/ld/testsuite/ld-i386/pr19827b.S new file mode 100644 index 00000000000..bb46e1d59f0 --- /dev/null +++ b/ld/testsuite/ld-i386/pr19827b.S @@ -0,0 +1,2 @@ + .data + .dc.a foo diff --git a/ld/testsuite/ld-x86-64/pr19827.rd b/ld/testsuite/ld-x86-64/pr19827.rd new file mode 100644 index 00000000000..67eaacc54ee --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr19827.rd @@ -0,0 +1,5 @@ +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Symbol's Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+ diff --git a/ld/testsuite/ld-x86-64/pr19827a.S b/ld/testsuite/ld-x86-64/pr19827a.S new file mode 100644 index 00000000000..cdf1d4b8a30 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr19827a.S @@ -0,0 +1,8 @@ + .text + .global _start +_start: + .dc.a foo + .data + .globl foo +foo: + .byte 0 diff --git a/ld/testsuite/ld-x86-64/pr19827b.S b/ld/testsuite/ld-x86-64/pr19827b.S new file mode 100644 index 00000000000..bb46e1d59f0 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr19827b.S @@ -0,0 +1,2 @@ + .data + .dc.a foo diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 8f297610ace..603ef37b14a 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -148,6 +148,14 @@ set x86_64tests { "--64" {pr17709a.s} {} "libpr17709.so"} {"PR ld/17709 (2)" "-melf_x86_64 tmpdir/libpr17709.so" "" "--64" {pr17709b.s} {{readelf -rW pr17709.rd}} "pr17709"} + {"Build pr19827a.o" "" "" + "--64" { pr19827a.S }} + {"Build pr19827b.so" "-melf_x86_64 -shared" "" + "--64" { pr19827b.S } {} "pr19827b.so"} + {"Build pr19827" "-melf_x86_64 -pie tmpdir/pr19827a.o tmpdir/pr19827b.so" "" + "--64" { dummy.s } {{readelf {-rW} pr19827.rd}} "pr19827"} + {"Build pr19827.so" "-melf_x86_64 -shared -Bsymbolic" "" + "--64" { pr19827a.S } {{readelf {-rW} pr19827.rd}} "pr19827.so"} } # So as to avoid rewriting every last test case here in a nacl variant, -- 2.30.2