forked from Imagelibrary/binutils-gdb
Add extern_protected_data and set it for x86
Re-apply: commit ca3fe95e46
With copy relocation, address of protected data defined in the shared
library may be external. This patch adds extern_protected_data and
changes _bfd_elf_symbol_refs_local_p to return false for protected data
if extern_protected_data is true.
This patch will break building shared libraries with protected data
symbols using GCCs older than GCC 5 without the bug fix for
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248
GCC backport request should be made in the GCC bug report above.
To get correct run-time behavior on Linux, glibc 2.22 or above are
required, which have the bug fix for
https://sourceware.org/bugzilla/show_bug.cgi?id=17711
Backports for glibc 2.21, 2.20, 2.19 and 2.18 are on hjl/pr17711/2.21,
hjl/pr17711/2.20, hjl/pr17711/2.19 and hjl/pr17711/2.18 branches,
respectively, at
https://sourceware.org/git/?p=glibc.git;a=summary
bfd/
PR ld/pr15228
PR ld/pr17709
* elf-bfd.h (elf_backend_data): Add extern_protected_data.
* elf32-i386.c (elf_backend_extern_protected_data): New.
Defined to 1.
* elf64-x86-64.c (elf_backend_extern_protected_data): Likewise.
* elflink.c (_bfd_elf_adjust_dynamic_copy): Don't error on
copy relocs against protected symbols if extern_protected_data
is true.
(_bfd_elf_symbol_refs_local_p): Don't return true on protected
non-function symbols if extern_protected_data is true.
* elfxx-target.h (elf_backend_extern_protected_data): New.
Default to 0.
(elfNN_bed): Initialize extern_protected_data with
elf_backend_extern_protected_data.
ld/testsuite/
PR ld/pr15228
PR ld/pr17709
* ld-i386/i386.exp (i386tests): Add a test for PR ld/17709.
* ld-i386/pr17709-nacl.rd: New file.
* ld-i386/pr17709.rd: Likewise.
* ld-i386/pr17709a.s: Likewise.
* ld-i386/pr17709b.s: Likewise.
* ld-i386/protected3.d: Updated.
* ld-i386/protected3.s: Likewise.
* ld-x86-64/pr17709-nacl.rd: New file.
* ld-x86-64/pr17709.rd: Likewise.
* ld-x86-64/pr17709a.s: Likewise.
* ld-x86-64/pr17709b.s: Likewise.
* ld-x86-64/protected3.d: Updated.
* ld-x86-64/protected3.s: Likewise.
* ld-x86-64/x86-64.exp (x86_64tests): Add a test for PR ld/17709.
This commit is contained in:
@@ -2673,7 +2673,9 @@ _bfd_elf_adjust_dynamic_copy (struct bfd_link_info *info,
|
||||
/* Increment the size of DYNBSS to make room for the symbol. */
|
||||
dynbss->size += h->size;
|
||||
|
||||
if (h->protected_def)
|
||||
/* No error if extern_protected_data is true. */
|
||||
if (h->protected_def
|
||||
&& !get_elf_backend_data (dynbss->owner)->extern_protected_data)
|
||||
info->callbacks->einfo
|
||||
(_("%P: copy reloc against protected `%T' is dangerous\n"),
|
||||
h->root.root.string);
|
||||
@@ -2833,8 +2835,9 @@ _bfd_elf_symbol_refs_local_p (struct elf_link_hash_entry *h,
|
||||
|
||||
bed = get_elf_backend_data (hash_table->dynobj);
|
||||
|
||||
/* STV_PROTECTED non-function symbols are local. */
|
||||
if (!bed->is_function_type (h->type))
|
||||
/* If extern_protected_data is false, STV_PROTECTED non-function
|
||||
symbols are local. */
|
||||
if (!bed->extern_protected_data && !bed->is_function_type (h->type))
|
||||
return TRUE;
|
||||
|
||||
/* Function pointer equality tests may require that STV_PROTECTED
|
||||
|
||||
Reference in New Issue
Block a user