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