2010-12-27 16 views
6

que tienen algún escenario como este:¿Existen dos versiones diferentes de las mismas libretas (con el mismo nombre) en una aplicación?

Producto-> plataforma-> mylibs (versión-1)

Producto-> mylibs (versión 2)

es decir, producto utiliza mylibs (versión 2) directamente. El producto también usa la plataforma (que también es una lib dinámica) y la plataforma usa mis libs (versión-1).

Los nombres de las bibliotecas usadas por el producto y la plataforma son los mismos. Solo las versiones son diferentes y estas dos versiones no son compatibles.

¿Hay alguna forma con ".so" libs en Linux que la plataforma puede vincular a una versión y el producto puede vincular a otra versión de las mismas librerías que tienen el mismo nombre?

+0

¿por qué no cambia los nombres de las librerías? –

Respuesta

6

Nota: incluso cambiar los nombres de las librerías no será suficiente por defecto, ya que los nombres de los símbolos entrarán en conflicto. Sus libs deben usar sóname y símbolos versionados, en cuyo caso pueden llamarse igual.

$ 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

Gracias por la respuesta. Pero, no entendí por qué esta advertencia "/ usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, puede entrar en conflicto con libmylibs.so.2" es lanzada por gcc? – Jay

+0

Supongo que es porque gcc no comprueba si todos los símbolos están versionados, por lo que advierte que algunos pueden entrar en conflicto. Además, en un nivel superior, las dos bibliotecas pueden entrar en conflicto durante la operación, como si ambas desean controlar el mismo recurso. – Jester

Cuestiones relacionadas