PATCH] PR target/65612: Multiversioning doesn't work with DSO nor PIE

H.J. Lu hjl.tools@gmail.com
Mon Mar 30 22:26:00 GMT 2015


On Sun, Mar 29, 2015 at 7:40 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sun, Mar 29, 2015 at 7:34 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Sun, Mar 29, 2015 at 7:25 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> We shouldn't call external function, __cpu_indicator_init, while an object
>>> is being relocated since its .got.plt section hasn't been updated.  It
>>> works for non-PIE since no update on .got.plt section is required.  This
>>> patch hides __cpu_indicator_init/__cpu_model from linker to force linker
>>> to resolve __cpu_indicator_init/__cpu_model to their hidden definitions
>>> in libgcc.a while providing backward binary compatibility.
>>>
>>> OK for trunk, 4.9 and 4.9 branches?
>>>
>>> Thanks.
>>>
>>>
>>> H.J.
>>> ---
>>> libgcc/
>>>
>>>         PR target/65612
>>>         * config/i386/cpuinfo.c (__cpu_model): Initialize.
>>>         (__cpu_indicator_init@GCC_4.8.0): New.
>>>         (__cpu_model@GCC_4.8.0): Likewise.
>>>
>>> gcc/testsuite/
>>>
>>>         PR target/65612
>>>         * g++.dg/ext/mv18.C: New test.
>>>         * g++.dg/ext/mv19.C: Likewise.
>>>         * g++.dg/ext/mv20.C: Likewise.
>>
>> It doesn' work for shared C++ library:
>>
>> /export/build/gnu/gcc-x32/release/usr/gcc-5.0.0-x32/bin/g++ -O2    -c
>> -o main.o main.cc
>> /export/build/gnu/gcc-x32/release/usr/gcc-5.0.0-x32/bin/g++ -shared
>> -fPIC -O2  -o libmv20.so mv20.cc
>> /export/build/gnu/gcc-x32/release/usr/gcc-5.0.0-x32/bin/g++ -O2  -o x
>> main.o libmv20.so -Wl,-R,.
>> /usr/local/bin/ld: x: hidden symbol `__cpu_model' in
>> /export/build/gnu/gcc-x32/release/usr/gcc-5.0.0-x32/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.0.0/libgcc.a(cpuinfo.o)
>> is referenced by DSO
>> /usr/local/bin/ld: final link failed: Bad value
>> collect2: error: ld returned 1 exit status
>> Makefile:12: recipe for target 'x' failed
>> make: *** [x] Error 1
>> [hjl@gnu-tools-1 pr65612]$
>>
>> --
>> H.J.
>
> We need something like libgcc_nonshared.a, which contains cpuinfo.o, and
> link together with -lgcc_s when creating executable or DSO.
>

I am testing it on Linux/x86-64.  OK for master if regression test
passes?

-- 
H.J.
--
We shouldn't call external function, __cpu_indicator_init, while an object
is being relocated since its .got.plt section hasn't been updated.  It
works for non-PIE since no update on .got.plt section is required.  This
patch hides __cpu_indicator_init/__cpu_model from linker to force linker
to resolve __cpu_indicator_init/__cpu_model to their hidden definitions
in libgcc_nonshared.a while providing backward binary compatibility.  The
new libgcc_nonshared.a is always linked togther with -lgcc_s and -lgcc.

gcc/

PR target/65612
* gcc.c (init_spec): Add -lgcc_nonshared/libgcc_nonshared.a%s
to -lgcc_s/-lgcc/libgcc.a%s.

gcc/testsuite/

PR target/65612
* g++.dg/ext/mv18.C: New test.
* g++.dg/ext/mv19.C: Likewise.
* g++.dg/ext/mv20.C: Likewise.

libgcc/

PR target/65612
* Makefile.in (LIB2ADDSHARED): New.
(LIB2ADDNONSHARED): Likewise.
(libgcc-nonshared-objects): Likewise.
(libgcc_nonshared.a): Likewise.
(libgcc-s-objects): Add $(LIB2ADDSHARED).
(all): Depend on libgcc_nonshared.a.
($(libgcc-nonshared-objects)): Depend on libgcc_tm.h.
(install-leaf): Install libgcc_nonshared.a.
* config/i386/cpuinfo.c (__cpu_model): Initialize.
(__cpu_indicator_init@GCC_4.8.0): New.
(__cpu_model@GCC_4.8.0): Likewise.
* config/i386/t-cpuinfo (LIB2ADD): Renamed to ...
(LIB2ADDSHARED): This.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Hide-__cpu_indicator_init-__cpu_model-from-linker.patch
Type: text/x-patch
Size: 7893 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20150330/a9f689cf/attachment.bin>


More information about the Gcc-patches mailing list