This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: Support Sun symbol versioning in libstdc++-v3
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>
- Cc: gcc-patches at gcc dot gnu dot org, libstdc++ at gcc dot gnu dot org
- Date: Wed, 24 Feb 2010 16:32:55 +0100
- Subject: Re: PATCH: Support Sun symbol versioning in libstdc++-v3
- References: <yddocjek7pg.fsf@CeBiTec.Uni-Bielefeld.DE>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Wed, Feb 24, 2010 at 03:51:39PM +0100, Rainer Orth wrote:
> So here's the experiment:
>
> $ cat libfunc.c
> #include <stdio.h>
>
> void
> func_10 (void)
> {
> printf ("FUNC_1.0\n");
> }
>
> void
> func_20 (void)
> {
> printf ("FUNC_2.0\n");
> }
>
> __asm__ (".symver func_10, func@FUNC_1.0");
> __asm__ (".symver func_20, func@@FUNC_2.0");
> $ cat libfunc.ver
> FUNC_1.0 {
> global:
> func;
> local:
> *;
> };
>
> FUNC_2.0 {
> global:
> func;
> local:
> *;
> } FUNC_1.0;
> # This is a gcc built with both gas and gld
> $ gcc -shared -static-libgcc -Wl,--version-script,libfunc.ver -h libfunc.so.1 -o libfunc.so.1 libfunc.c
> $ pvs -dsv libfunc.so.1
> libfunc.so.1 [BASE]:
> FUNC_1.0:
> FUNC_1.0;
> FUNC_2.0: {FUNC_1.0}:
> func;
> FUNC_2.0;
> # As you can see, func is *not* present in FUNC_1.0, although it should.
The problem is that you used a Sun tool in the experiment, and that tool
clearly has no clue about GNU symbol versioning. You should have used readelf or objdump
instead. Doing the same (with s/-h /,-Wl,-soname,/) on Linux followed by:
readelf -Wa libfunc.so.1 | grep func
0x000000000000000e (SONAME) Library soname: [libfunc.so.1]
7: 000000000000059e 18 FUNC GLOBAL DEFAULT 12 func@@FUNC_2.0
9: 000000000000058c 18 FUNC GLOBAL DEFAULT 12 func@FUNC_1.0
40: 0000000000000000 0 FILE LOCAL DEFAULT ABS libfunc.c
41: 000000000000059e 18 FUNC LOCAL DEFAULT 12 func_20
44: 000000000000058c 18 FUNC LOCAL DEFAULT 12 func_10
57: 000000000000059e 18 FUNC GLOBAL DEFAULT 12 func@@FUNC_2.0
59: 000000000000058c 18 FUNC GLOBAL DEFAULT 12 func@FUNC_1.0
000000: Rev: 1 Flags: BASE Index: 1 Cnt: 1 Name: libfunc.so.1
shows that both func@FUNC_1.0 and func@@FUNC_2.0 are present. func@FUNC_1.0
is a non-default symbol version, so new libraries/programs linking against this
library will always pick func@@FUNC_2.0, but libraries/programs already
linked against older version of the library which just had func@@FUNC_1.0
will continue to work.
Jakub