2010-12-27 1 views
6

Ho alcuni scenario come questo:È possibile che in un'applicazione siano presenti due versioni diverse delle stesse librerie (con lo stesso nome)?

product-> dalla piattaforma> mylibs (versione-1)

product-> mylibs (versione-2)

cioè prodotto utilizza mylibs (versione-2) direttamente. Il prodotto usa anche la piattaforma (che è anche una lib dinamica) e la piattaforma usa le mie librerie (versione 1).

I nomi delle librerie utilizzate per prodotto e piattaforma sono gli stessi. Solo le versioni sono diverse e entrambe queste versioni non sono compatibili.

Esiste un modo con ".so" librerie a Linux Platform può collegarsi a una versione e del prodotto può collegare ad un'altra versione delle stesse librerie che hanno lo stesso nome?

+0

perché non cambiate semplicemente i nomi delle librerie? –

risposta

6

nota, anche cambiando i nomi delle librerie non sarà sufficiente per impostazione predefinita, come i nomi dei simboli sarebbero in conflitto. vostre librerie dovrebbero usare soname e simboli di versione, nel qual caso possono anche essere chiamati lo stesso.

$ make 
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.1 -Wl,--default-symver -o libmylibs.so.1 mylibs1.c 
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.2 -Wl,--default-symver -o libmylibs.so.2 mylibs2.c 
gcc -shared -fpic -Wl,-soname -Wl,libplatform.so.1 -Wl,--default-symver -Wl,--default-imported-symver -o libplatform.so.1 platform.c libmylibs.so.1 
gcc -Wl,-rpath-link -Wl,. -Wl,--default-imported-symver -o program program.c libplatform.so.1 libmylibs.so.2 
/usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, may conflict with libmylibs.so.2 
$ LD_LIBRARY_PATH=$PWD ldd ./program 
    linux-vdso.so.1 => (0x00007fff1e3ff000) 
    libplatform.so.1 => /tmp/so-4539442/libplatform.so.1 (0x00007f6dc3ba0000) 
    libmylibs.so.2 => /tmp/so-4539442/libmylibs.so.2 (0x00007f6dc399f000) 
    libc.so.6 => /lib/libc.so.6 (0x00007f6dc364c000) 
    libmylibs.so.1 => /tmp/so-4539442/libmylibs.so.1 (0x00007f6dc344b000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f6dc3da1000) 
$ LD_LIBRARY_PATH=$PWD ./program 
lib version 2, platform lib version 1 
+0

Grazie per la risposta. Ma, non ho capito il motivo per cui questo avvertimento "/ usr/bin/ld: avvertimento: libmylibs.so.1, necessaria per libplatform.so.1, può entrare in conflitto con libmylibs.so.2" è gettato da gcc? – Jay

+0

Direi che è perché gcc non controlla se tutti i simboli sono di versione, quindi avverte che alcuni possono entrare in conflitto. Inoltre, a un livello più alto, le due librerie potrebbero entrare in conflitto durante l'operazione, ad esempio se entrambe vogliono controllare la stessa risorsa. – Jester