From: H.J. Lu Date: Tue, 15 Mar 2016 18:46:51 +0000 (-0700) Subject: Bind defined symbol locally in PIE X-Git-Tag: binutils-2_27~1073 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4e0c91e45402ebf4215066e4a61143896e831049;p=external%2Fbinutils.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2bb0cc1..740fd44 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,14 @@ 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 * elf64-x86-64.c (elf_x86_64_relocate_section): Check no_reloc_overflow_check to diable R_X86_64_32/R_X86_64_32S diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index ac3c2f4..1ebb615 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 31b1f87..dc7738a 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 d3172dc..04b484c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,17 @@ 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 * Makefile.am (ELF_X86_DEPS): Add $(srcdir)/emulparams/reloc_overflow.sh. diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 1e52cdb..2b7a09e 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 0000000..5d2a885 --- /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 0000000..cdf1d4b --- /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 0000000..bb46e1d --- /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 0000000..67eaacc --- /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 0000000..cdf1d4b --- /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 0000000..bb46e1d --- /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 8f29761..603ef37 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,