From bdb892b99584bfd481ed23c90ad7ceafb31ca791 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 20 Mar 2012 18:16:38 +0000 Subject: [PATCH] Handle relocation against protected function for -Bsymbolic bfd/ 2012-03-20 H.J. Lu PR ld/13880 * elf32-i386.c (elf_i386_relocate_section): Don't issue an error for R_386_GOTOFF relocation against protected function if SYMBOLIC_BIND is true. * elf64-x86-64.c (elf_x86_64_relocate_section): Don't issue an error for R_X86_64_GOTOFF64 relocation against protected function when building executable or SYMBOLIC_BIND is true. ld/testsuite/ 2012-03-20 H.J. Lu PR ld/13880 * ld-i386/i386.exp: Run protected4 and protected5. * ld-x86-64/x86-64.exp: Likewise. * ld-i386/protected4.d: New. * ld-i386/protected4.s: Likewise. * ld-i386/protected5.d: Likewise. * ld-i386/protected5.s: Likewise. * ld-x86-64/protected4.d: Likewise. * ld-x86-64/protected4.s: Likewise. * ld-x86-64/protected5.d: Likewise. * ld-x86-64/protected5.s: Likewise. --- bfd/ChangeLog | 11 +++++++++++ bfd/elf32-i386.c | 1 + bfd/elf64-x86-64.c | 3 ++- ld/testsuite/ChangeLog | 15 +++++++++++++++ ld/testsuite/ld-i386/i386.exp | 2 ++ ld/testsuite/ld-i386/protected4.d | 5 +++++ ld/testsuite/ld-i386/protected4.s | 12 ++++++++++++ ld/testsuite/ld-i386/protected5.d | 5 +++++ ld/testsuite/ld-i386/protected5.s | 12 ++++++++++++ ld/testsuite/ld-x86-64/protected4.d | 5 +++++ ld/testsuite/ld-x86-64/protected4.s | 12 ++++++++++++ ld/testsuite/ld-x86-64/protected5.d | 5 +++++ ld/testsuite/ld-x86-64/protected5.s | 12 ++++++++++++ ld/testsuite/ld-x86-64/x86-64.exp | 2 ++ 14 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 ld/testsuite/ld-i386/protected4.d create mode 100644 ld/testsuite/ld-i386/protected4.s create mode 100644 ld/testsuite/ld-i386/protected5.d create mode 100644 ld/testsuite/ld-i386/protected5.s create mode 100644 ld/testsuite/ld-x86-64/protected4.d create mode 100644 ld/testsuite/ld-x86-64/protected4.s create mode 100644 ld/testsuite/ld-x86-64/protected5.d create mode 100644 ld/testsuite/ld-x86-64/protected5.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b9849f8f50..735a0ba51d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2012-03-20 H.J. Lu + + PR ld/13880 + * elf32-i386.c (elf_i386_relocate_section): Don't issue an error + for R_386_GOTOFF relocation against protected function if + SYMBOLIC_BIND is true. + + * elf64-x86-64.c (elf_x86_64_relocate_section): Don't issue an + error for R_X86_64_GOTOFF64 relocation against protected function + when building executable or SYMBOLIC_BIND is true. + 2012-03-16 Roland McGrath * config.bfd: Handle x86_64-*-nacl*. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 4ae21664f6..f35e3c22a9 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -3503,6 +3503,7 @@ elf_i386_relocate_section (bfd *output_bfd, return FALSE; } else if (!info->executable + && !SYMBOLIC_BIND (info, h) && h->type == STT_FUNC && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) { diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index f2f803a54b..cc5ee42b81 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -3464,8 +3464,9 @@ elf_x86_64_relocate_section (bfd *output_bfd, /* Check to make sure it isn't a protected function symbol for shared library since it may not be local when used as function address. */ - if (info->shared + if (!info->executable && h + && !SYMBOLIC_BIND (info, h) && h->def_regular && h->type == STT_FUNC && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 1bcf098d90..ac06f535b8 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2012-03-20 H.J. Lu + + PR ld/13880 + * ld-i386/i386.exp: Run protected4 and protected5. + * ld-x86-64/x86-64.exp: Likewise. + + * ld-i386/protected4.d: New. + * ld-i386/protected4.s: Likewise. + * ld-i386/protected5.d: Likewise. + * ld-i386/protected5.s: Likewise. + * ld-x86-64/protected4.d: Likewise. + * ld-x86-64/protected4.s: Likewise. + * ld-x86-64/protected5.d: Likewise. + * ld-x86-64/protected5.s: Likewise. + 2012-03-19 Andreas Schwab * ld-m68k/m68k.exp ("TLS indirect symbol use"): Pass diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 1727922400..ff9db9829e 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -194,6 +194,8 @@ run_dump_test "hidden3" run_dump_test "protected1" run_dump_test "protected2" run_dump_test "protected3" +run_dump_test "protected4" +run_dump_test "protected5" run_dump_test "tlspie1" run_dump_test "tlspie2" run_dump_test "nogot1" diff --git a/ld/testsuite/ld-i386/protected4.d b/ld/testsuite/ld-i386/protected4.d new file mode 100644 index 0000000000..f16f0c0bca --- /dev/null +++ b/ld/testsuite/ld-i386/protected4.d @@ -0,0 +1,5 @@ +#as: --32 +#ld: -shared -Bsymbolic -melf_i386 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-i386/protected4.s b/ld/testsuite/ld-i386/protected4.s new file mode 100644 index 0000000000..66f2a56dfc --- /dev/null +++ b/ld/testsuite/ld-i386/protected4.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl foo + .type foo, @function +foo: + ret + .size foo, .-foo + .globl bar + .type bar, @function +bar: + movl foo@GOTOFF(%ecx), %eax + .size bar, .-bar diff --git a/ld/testsuite/ld-i386/protected5.d b/ld/testsuite/ld-i386/protected5.d new file mode 100644 index 0000000000..89e21592b8 --- /dev/null +++ b/ld/testsuite/ld-i386/protected5.d @@ -0,0 +1,5 @@ +#as: --32 +#ld: -pie -melf_i386 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-i386/protected5.s b/ld/testsuite/ld-i386/protected5.s new file mode 100644 index 0000000000..fc218f2a32 --- /dev/null +++ b/ld/testsuite/ld-i386/protected5.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl foo + .type foo, @function +foo: + ret + .size foo, .-foo + .globl _start + .type _start, @function +_start: + movl foo@GOTOFF(%ecx), %eax + .size _start, .-_start diff --git a/ld/testsuite/ld-x86-64/protected4.d b/ld/testsuite/ld-x86-64/protected4.d new file mode 100644 index 0000000000..a8a898053e --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected4.d @@ -0,0 +1,5 @@ +#as: --64 +#ld: -shared -Bsymbolic -melf_x86_64 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/protected4.s b/ld/testsuite/ld-x86-64/protected4.s new file mode 100644 index 0000000000..c6e41ec189 --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected4.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl foo + .type foo, @function +foo: + ret + .size foo, .-foo + .globl bar + .type bar, @function +bar: + movabsq $foo@GOTOFF, %rax + .size bar, .-bar diff --git a/ld/testsuite/ld-x86-64/protected5.d b/ld/testsuite/ld-x86-64/protected5.d new file mode 100644 index 0000000000..afe172a425 --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected5.d @@ -0,0 +1,5 @@ +#as: --64 +#ld: -pie -melf_x86_64 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/protected5.s b/ld/testsuite/ld-x86-64/protected5.s new file mode 100644 index 0000000000..8e14138043 --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected5.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl foo + .type foo, @function +foo: + ret + .size foo, .-foo + .globl _start + .type _start, @function +_start: + movabsq $foo@GOTOFF, %rax + .size _start, .-_start diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index f713ca51a1..c258251853 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -158,6 +158,8 @@ run_dump_test "protected2" run_dump_test "protected2-l1om" run_dump_test "protected3" run_dump_test "protected3-l1om" +run_dump_test "protected4" +run_dump_test "protected5" run_dump_test "tlsle1" run_dump_test "tlspie1" run_dump_test "unique1" -- 2.34.1