Relax PR 15228 protected visibility restriction
authorAlan Modra <amodra@gmail.com>
Fri, 27 Mar 2015 05:11:05 +0000 (15:41 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 27 Mar 2015 05:50:32 +0000 (16:20 +1030)
commitb84171287ffe60dd1e7c02262a0493862fa21a97
tree158858087a8b26b4da5a56cbce18fad8ac814970
parentf3308340aba43e99aa448641a5d3db1c7fae60cf
Relax PR 15228 protected visibility restriction

Allows .dynbss copy of shared library protected visibility variables
if they are read-only.

To recap: Copying a variable from a shared library into an executable's
.dynbss is an old hack invented for non-PIC executables, to avoid the
text relocations you'd otherwise need to access a shared library
variable.  This works with ELF shared libraries because global
symbols can be overridden.  The trouble is that protected visibility
symbols can't be overridden.  A shared library will continue to access
it's own protected visibility variable while the executable accesses a
copy.  If either the shared library or the executable updates the
value then the copy diverges from the original.  This is wrong since
there is only one definition of the variable in the application.

So I made the linker report an error on attempting to copy protected
visibility variables into .dynbss.  However, you'll notice the above
paragraph contains an "If".  An application that does not modify the
variable value remains correct even though two copies of the variable
exist.  The linker can detect this situation if the variable was
defined in a read-only section.

PR ld/15228
PR ld/18167
* elflink.c (elf_merge_st_other): Add "sec" parameter.  Don't set
protected_def when symbol section is read-only.  Adjust all calls.
* elf-bfd.h (struct elf_link_hash_entry): Update protected_def comment.
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elflink.c