Co by tu zmienic w PLD...

Paweł Sikora pluto w agmk.net
Czw, 5 Sie 2010, 12:12:21 CEST


Dnia 05-08-2010 o 11:40:38 Pawel Golaszewski <blues w pld-linux.org>  
napisał(a):

> On Thu, 5 Aug 2010, Paweł Sikora wrote:
>> >> To nie jest recepta na łączenie części starszej dystrybucji z nowszą
>> >> - zazwyczaj działa tylko dopóki w jednym kodzie nie "spotkają się"
>> >> różne wersje tej samej biblioteki.
>> > Dobrze - jaką widzisz inną?
>> recepta jest jedna - wersjonowanie soname *i symboli* w bibliotekach.
>
> I to miałoby wchodzić w zależności rpm-a?

jak juz napisano rpm, to rozpoznaje, a takie wersjonowanie symboli
pozwala nawet na binarna kompatybilnosc najnowszej biblioteki
ze starszymi binarami jej uzywajacymi,

np: 5 lat temu mielismy skompilowana biblioteke i jej uzycie:

$ cat libx.old.c
#include <stdio.h>
void original_foo() { puts( "original_foo()" ); }
__asm__( ".symver original_foo,foo@@VER_1.0" );

$ cat libx.old.lds
VER_1.0 {
         global:
                 *;
         local:
                 original_*;
                 new_*;
};

$ cat main.c
extern void foo();
int main() { foo(); return 0; }

$ gcc -m32 -Wall libx.old.c -shared -o libx.so -fpic  
-Wl,--version-script=libx.old.lds -s
$ gcc -m32 -Wall main.c -o main.old ./libx.so -s

$ ./main.old
original_foo()

aktualnie zrobilismy zmiane w api i implementacji funkcji foo:

$ cat libx.new.c
#include <stdio.h>
void original_foo() { puts( "original_foo()" ); }
__asm__( ".symver original_foo,foo w VER_1.0" );
void new_foo() { puts( "new_foo()" ); }
__asm__( ".symver new_foo,foo@@VER_2.0" );

$ cat libx.new.lds
VER_1.0 {
         global:
                 *;
         local:
                 original_*;
                 new_*;
};
VER_2.0 {
         global:
                 *;
         local:
                 original_*;
                 new_*;
};

$ gcc -m32 -Wall libx.new.c -shared -o libx.so -fpic  
-Wl,--version-script=libx.new.lds -s
$ gcc -m32 -Wall main.c -o main.new ./libx.so -s


$ ./main.old
original_foo()
$ ./main.new
new_foo()

stara i nowa binarka klienta dzialaja na jednej nowej binarce biblioteki.


Więcej informacji o liście dyskusyjnej pld-devel-pl