From e3c0e327923e27c7d96e6e44e22e10998ff158d7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 11 Apr 2015 07:34:49 -0700 Subject: Replace SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL When checking R_386_GOTOFF/R_X86_64_GOTOFF64 for building shared library, we should check SYMBOL_REFERENCES_LOCAL instead of SYMBOLIC_BIND to cover more cases. bfd/ * elf32-i386.c (elf_i386_relocate_section): Replace SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL when checking R_386_GOTOFF against protected data symbol when building shared library. * elf64-x86-64.c (elf_x86_64_relocate_section): Check R_X86_64_GOTOFF64 against undefined symbol and replace SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL when checking R_X86_64_GOTOFF64 against protected data symbol when building shared library. ld/testsuite/ * ld-i386/i386.exp: Run protected6a. * ld-i386/protected6.d: Renamed to ... * ld-i386/protected6a.d: This. * ld-x86-64/hidden4.d: New file. * ld-x86-64/hidden4.s: Likewise. * ld-x86-64/hidden5.d: Likewise. * ld-x86-64/hidden5.s: Likewise. * ld-x86-64/protected6.d: Renamed to ... * ld-x86-64/protected6a.d: This. * ld-x86-64/x86-64.exp: Run hidden4, hidden5, protected6a, protected7a and protected7b. --- bfd/ChangeLog | 11 +++++++ bfd/elf32-i386.c | 4 +-- bfd/elf64-x86-64.c | 56 +++++++++++++++++++++++++++--------- ld/testsuite/ChangeLog | 14 +++++++++ ld/testsuite/ld-i386/i386.exp | 2 +- ld/testsuite/ld-i386/protected6.d | 3 -- ld/testsuite/ld-i386/protected6a.d | 4 +++ ld/testsuite/ld-x86-64/hidden4.d | 3 ++ ld/testsuite/ld-x86-64/hidden4.s | 8 ++++++ ld/testsuite/ld-x86-64/hidden5.d | 3 ++ ld/testsuite/ld-x86-64/hidden5.s | 7 +++++ ld/testsuite/ld-x86-64/protected6.d | 3 -- ld/testsuite/ld-x86-64/protected6a.d | 4 +++ ld/testsuite/ld-x86-64/x86-64.exp | 4 ++- 14 files changed, 102 insertions(+), 24 deletions(-) delete mode 100644 ld/testsuite/ld-i386/protected6.d create mode 100644 ld/testsuite/ld-i386/protected6a.d create mode 100644 ld/testsuite/ld-x86-64/hidden4.d create mode 100644 ld/testsuite/ld-x86-64/hidden4.s create mode 100644 ld/testsuite/ld-x86-64/hidden5.d create mode 100644 ld/testsuite/ld-x86-64/hidden5.s delete mode 100644 ld/testsuite/ld-x86-64/protected6.d create mode 100644 ld/testsuite/ld-x86-64/protected6a.d diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ea3543552ad..207884a1cd7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2015-04-11 H.J. Lu + + * elf32-i386.c (elf_i386_relocate_section): Replace SYMBOLIC_BIND + with SYMBOL_REFERENCES_LOCAL when checking R_386_GOTOFF against + protected data symbol when building shared library. + * elf64-x86-64.c (elf_x86_64_relocate_section): Check + R_X86_64_GOTOFF64 against undefined symbol and replace + SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL when checking + R_X86_64_GOTOFF64 against protected data symbol when building + shared library. + 2015-04-10 H.J. Lu PR ld/pr17709 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index af16da357dd..f71bce12243 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -3717,7 +3717,7 @@ elf_i386_relocate_section (bfd *output_bfd, /* Check to make sure it isn't a protected function or data symbol for shared library since it may not be local when used as function address or with copy relocation. We also - need to make sure that a symbol is defined locally. */ + need to make sure that a symbol is referenced locally. */ if (info->shared && h) { if (!h->def_regular) @@ -3747,7 +3747,7 @@ elf_i386_relocate_section (bfd *output_bfd, return FALSE; } else if (!info->executable - && !SYMBOLIC_BIND (info, h) + && !SYMBOL_REFERENCES_LOCAL (info, h) && (h->type == STT_FUNC || h->type == STT_OBJECT) && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 2b37c270f8f..a3604c7eba5 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -3957,22 +3957,50 @@ elf_x86_64_relocate_section (bfd *output_bfd, /* Check to make sure it isn't a protected function or data symbol for shared library since it may not be local when - used as function address or with copy relocation. */ - if (!info->executable - && h - && !SYMBOLIC_BIND (info, h) - && h->def_regular - && (h->type == STT_FUNC - || h->type == STT_OBJECT) - && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) + used as function address or with copy relocation. We also + need to make sure that a symbol is referenced locally. */ + if (info->shared && h) { - (*_bfd_error_handler) - (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"), - input_bfd, - h->type == STT_FUNC ? "function" : "data", - h->root.root.string); - bfd_set_error (bfd_error_bad_value); + if (!h->def_regular) + { + const char *v; + + switch (ELF_ST_VISIBILITY (h->other)) + { + case STV_HIDDEN: + v = _("hidden symbol"); + break; + case STV_INTERNAL: + v = _("internal symbol"); + break; + case STV_PROTECTED: + v = _("protected symbol"); + break; + default: + v = _("symbol"); + break; + } + + (*_bfd_error_handler) + (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"), + input_bfd, v, h->root.root.string); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + else if (!info->executable + && !SYMBOL_REFERENCES_LOCAL (info, h) + && (h->type == STT_FUNC + || h->type == STT_OBJECT) + && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) + { + (*_bfd_error_handler) + (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"), + input_bfd, + h->type == STT_FUNC ? "function" : "data", + h->root.root.string); + bfd_set_error (bfd_error_bad_value); return FALSE; + } } /* Note that sgot is not involved in this diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index c4bc387a563..8b45279b0e8 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2015-04-11 H.J. Lu + + * ld-i386/i386.exp: Run protected6a. + * ld-i386/protected6.d: Renamed to ... + * ld-i386/protected6a.d: This. + * ld-x86-64/hidden4.d: New file. + * ld-x86-64/hidden4.s: Likewise. + * ld-x86-64/hidden5.d: Likewise. + * ld-x86-64/hidden5.s: Likewise. + * ld-x86-64/protected6.d: Renamed to ... + * ld-x86-64/protected6a.d: This. + * ld-x86-64/x86-64.exp: Run hidden4, hidden5, protected6a, + protected7a and protected7b. + 2015-04-10 H.J. Lu PR ld/pr17709 diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 3dd11391396..0c0fd96b5f7 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -236,7 +236,7 @@ run_dump_test "protected2" run_dump_test "protected3" run_dump_test "protected4" run_dump_test "protected5" -run_dump_test "protected6" +run_dump_test "protected6a" run_dump_test "tlspie1" run_dump_test "tlspie2" run_dump_test "nogot1" diff --git a/ld/testsuite/ld-i386/protected6.d b/ld/testsuite/ld-i386/protected6.d deleted file mode 100644 index 37d513223f0..00000000000 --- a/ld/testsuite/ld-i386/protected6.d +++ /dev/null @@ -1,3 +0,0 @@ -#as: --32 -#ld: -shared -melf_i386 -#error: .*relocation R_386_GOTOFF against protected data `foo' can not be used when making a shared object diff --git a/ld/testsuite/ld-i386/protected6a.d b/ld/testsuite/ld-i386/protected6a.d new file mode 100644 index 00000000000..7dc350432f4 --- /dev/null +++ b/ld/testsuite/ld-i386/protected6a.d @@ -0,0 +1,4 @@ +#source: protected6.s +#as: --32 +#ld: -shared -melf_i386 +#error: .*relocation R_386_GOTOFF against protected data `foo' can not be used when making a shared object diff --git a/ld/testsuite/ld-x86-64/hidden4.d b/ld/testsuite/ld-x86-64/hidden4.d new file mode 100644 index 00000000000..2f36d00884f --- /dev/null +++ b/ld/testsuite/ld-x86-64/hidden4.d @@ -0,0 +1,3 @@ +#as: --64 +#ld: -shared -melf_x86_64 +#error: .*relocation R_X86_64_GOTOFF64 against undefined hidden symbol `foo' can not be used when making a shared object diff --git a/ld/testsuite/ld-x86-64/hidden4.s b/ld/testsuite/ld-x86-64/hidden4.s new file mode 100644 index 00000000000..3e6a2a1e3b1 --- /dev/null +++ b/ld/testsuite/ld-x86-64/hidden4.s @@ -0,0 +1,8 @@ + .text +.globl bar + .type bar, @function +bar: + movabsq $foo@GOTOFF, %rax + .size bar, .-bar + .weak foo + .hidden foo diff --git a/ld/testsuite/ld-x86-64/hidden5.d b/ld/testsuite/ld-x86-64/hidden5.d new file mode 100644 index 00000000000..2f36d00884f --- /dev/null +++ b/ld/testsuite/ld-x86-64/hidden5.d @@ -0,0 +1,3 @@ +#as: --64 +#ld: -shared -melf_x86_64 +#error: .*relocation R_X86_64_GOTOFF64 against undefined hidden symbol `foo' can not be used when making a shared object diff --git a/ld/testsuite/ld-x86-64/hidden5.s b/ld/testsuite/ld-x86-64/hidden5.s new file mode 100644 index 00000000000..f35607609a9 --- /dev/null +++ b/ld/testsuite/ld-x86-64/hidden5.s @@ -0,0 +1,7 @@ + .text +.globl bar + .type bar, @function +bar: + movabsq $foo@GOTOFF, %rax + .size bar, .-bar + .hidden foo diff --git a/ld/testsuite/ld-x86-64/protected6.d b/ld/testsuite/ld-x86-64/protected6.d deleted file mode 100644 index 872a9f6f4ab..00000000000 --- a/ld/testsuite/ld-x86-64/protected6.d +++ /dev/null @@ -1,3 +0,0 @@ -#as: --64 -#ld: -shared -melf_x86_64 -#error: .*relocation R_X86_64_GOTOFF64 against protected data `foo' can not be used when making a shared object diff --git a/ld/testsuite/ld-x86-64/protected6a.d b/ld/testsuite/ld-x86-64/protected6a.d new file mode 100644 index 00000000000..3a7963ffd2f --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected6a.d @@ -0,0 +1,4 @@ +#source: protected6.s +#as: --64 +#ld: -shared -melf_x86_64 +#error: .*relocation R_X86_64_GOTOFF64 against protected data `foo' can not be used when making a shared object diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 63754efdca5..213a4c03bab 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -211,6 +211,8 @@ run_dump_test "tlsie3" run_dump_test "hidden1" run_dump_test "hidden2" run_dump_test "hidden3" +run_dump_test "hidden4" +run_dump_test "hidden5" run_dump_test "protected1" run_dump_test "protected2" run_dump_test "protected2-l1om" @@ -218,7 +220,7 @@ run_dump_test "protected3" run_dump_test "protected3-l1om" run_dump_test "protected4" run_dump_test "protected5" -run_dump_test "protected6" +run_dump_test "protected6a" run_dump_test "protected7a" run_dump_test "protected7b" run_dump_test "tlsle1" -- cgit v1.2.1