This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH] PR target/65612: Multiversioning doesn't work with DSO nor PIE
- From: Szabolcs Nagy <nsz at port70 dot net>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: Jakub Jelinek <jakub at redhat dot com>, Uros Bizjak <ubizjak at gmail dot com>, Mike Stump <mikestump at comcast dot net>, Jack Howarth <howarth dot at dot gcc at gmail dot com>, Ian Lance Taylor <ian at airs dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>, Iain Sandoe <iain at codesourcery dot com>, Rainer Orth <ro at cebitec dot uni-bielefeld dot de>, Rich Felker <dalias at libc dot org>
- Date: Sat, 9 May 2015 20:57:37 +0200
- Subject: Re: PATCH] PR target/65612: Multiversioning doesn't work with DSO nor PIE
- Authentication-results: sourceware.org; auth=none
- References: <B1F30D20-7B2F-477E-87AB-82BAA7039767 at comcast dot net> <CAFULd4aTcfyDVpMQVyZ2Po=BCG5ZQxV1Qq5TD5xsZ3LeGNwOFw at mail dot gmail dot com> <CAMe9rOpim6FhVk=ts3Zd4jfNU+oAXmtpy2aWy+ZP7qJ75E9H8g at mail dot gmail dot com> <CAFULd4bDmOcJ4bm8GpGvNL6-TCZYpZuC79RHGw_+BKD08ZF73A at mail dot gmail dot com> <20150417113731 dot GL1725 at tucnak dot redhat dot com> <CAMe9rOpGbB=UuSg3s437FaedD_mugzYKffdrJJfZEHVQQEBODQ at mail dot gmail dot com> <20150417115950 dot GM1725 at tucnak dot redhat dot com> <CAMe9rOp_Eck1MEOV6btcHLOsd5u0=dtEQDq3iy0QY0RvXwuVDQ at mail dot gmail dot com> <20150509143104 dot GA26462 at port70 dot net> <CAMe9rOp3tg=kJK+kCnDgDMxCpvfqP7kEG9LvwcPbakwNx+Hh_g at mail dot gmail dot com>
* H.J. Lu <hjl.tools@gmail.com> [2015-05-09 10:41:41 -0700]:
> On Sat, May 9, 2015 at 7:31 AM, Szabolcs Nagy <nsz@port70.net> wrote:
> >
> > The symbol versioning hack for __cpu_model and __cpu_indicator_init
> > makes them invisible to the musl dynamic linker so their relocation
> > fails with 'symbol not found' error.
> > (affects anything linked with -lgcc_s)
>
> There are
>
> 4: 0000000000002b70 806 FUNC GLOBAL DEFAULT 12
> __cpu_indicator_init@GCC_4.8.0
> 38: 00000000002153d0 16 OBJECT GLOBAL DEFAULT 25 __cpu_model@GCC_4.8.0
>
> and
>
> 000000000215000 0000000400000001 R_X86_64_64
> 0000000000002b70 __cpu_indicator_init@GCC_4.8.0 + 0
> 0000000000215220 0000002600000006 R_X86_64_GLOB_DAT
> 00000000002153d0 __cpu_model@GCC_4.8.0 + 0
>
> in libgcc_s.so.1. Musl ld.so must be fixed to handle it.
>
(sorry, i missed the other discussion about the same issue)
i still think a solution that avoids depending on symbol
versioning in the dynamic linker would be preferable.
(versioning is a sun/gnu elf extension as far as i understand,
eg. not supported by posix dlsym).
i think it might be enough to add __cpu_indicator_init_local
as an alias to __cpu_indicator_init in libgcc.a and then use
the *_local symbol from the ifunc resolver, that way no new
dependency is added to libgcc_s.so handling.
(adding versioning support to musl is problematic with the
current code, a simpler workaround for musl is to provide its
own weak definition of __cpu_indicator_init, but that's ugly.)