This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [gold commit] PR 19823: Don't allow COPY relocs to protected symbols
- From: Alan Modra <amodra at gmail dot com>
- To: Cary Coutant <ccoutant at gmail dot com>
- Cc: Binutils <binutils at sourceware dot org>
- Date: Tue, 28 Jun 2016 00:25:49 +0930
- Subject: Re: [gold commit] PR 19823: Don't allow COPY relocs to protected symbols
- Authentication-results: sourceware.org; auth=none
- References: <CAJimCsFDm4e4cXdTdJpMdu1KnM3CwD42Mj5wwgJ8ig6=CjKUVw at mail dot gmail dot com>
On Thu, May 19, 2016 at 03:13:07PM -0700, Cary Coutant wrote:
> 2016-05-19 Cary Coutant <ccoutant@gmail.com>
>
> PR gold/19823
> * copy-relocs.cc (Copy_relocs::make_copy_reloc): Add object
> parameter; check for protected symbol.
> * copy-relocs.h (Copy_relocs::make_copy_reloc): Add object parameter.
> * mips.cc (Mips_copy_relocs): Adjust call to make_copy_reloc.
> * symtab.cc (Symbol::init_fields): Initialize is_protected_.
> (Symbol_table::add_from_dynobj): Mark protected symbols.
> * symtab.h (Symbol::is_protected): New method.
> (Symbol::set_is_protected): New method.
> (Symbol::is_protected_): New data member.
>
> * testsuite/Makefile.am (copy_test_protected): New test.
> * testsuite/Makefile.in: Regenerate.
> * testsuite/copy_test.cc (main): Add legal reference to protected
> symbol.
> * testsuite/copy_test_v1.cc (main): Likewise.
> * testsuite/copy_test_2.cc (ip): Add protected symbol.
> * testsuite/copy_test_protected.cc: New test source file.
> * testsuite/copy_test_protected.sh: New test script.
Cary, this test fails on powerpc64 and powerpc64le because no copy
relocs are needed with a PIC executable, and powerpc64 is PIC by
default.
One way to force a non-PIC reference to the protected visibility
variable in a read-only section, and thus require a copy reloc is:
int* __attribute__ ((section (".rodata"))) ipp = &ip;
It isn't really clean though, and results in assembler warnings about
attributes of .rodata. Using
int* const ipp = &ip;
doesn't work because even at -O1 gcc looks through a *ipp reference
and omits ipp.
Do you have any suggestions?
--
Alan Modra
Australia Development Lab, IBM