aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-x86-64.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-04-11 07:34:49 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-04-11 07:56:48 -0700
commite3c0e327923e27c7d96e6e44e22e10998ff158d7 (patch)
treed4dfd7ed0875d03e7b6c8f1cd51b855fe07d80fb /bfd/elf64-x86-64.c
parentfbed9c2759d43ea6991264c2e963660b5e9202d1 (diff)
downloadgdb-e3c0e327923e27c7d96e6e44e22e10998ff158d7.zip
gdb-e3c0e327923e27c7d96e6e44e22e10998ff158d7.tar.gz
gdb-e3c0e327923e27c7d96e6e44e22e10998ff158d7.tar.bz2
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.
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r--bfd/elf64-x86-64.c56
1 files changed, 42 insertions, 14 deletions
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 2b37c27..a3604c7 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