G++ 试图同时加载共享库的两个不同版本的Linux程序

G++ 试图同时加载共享库的两个不同版本的Linux程序,g++,shared,G++,Shared,我的问题听起来有点奇怪 我已经构建了一个名为libJsonCpp.so的库,我在一些progam中使用了它,现在我只是将该库的修订号从2.12增加到了2.13 [enzo@P0101222 Test]$ ls -la /prd/b_BCM/bin/libJsonCpp.so* lrwxrwxrwx 1 enzo aesys 18 Mar 16 16:52 /prd/b_BCM/bin/libJsonCpp.so -> libJsonCpp.so.2.13 l

我的问题听起来有点奇怪

我已经构建了一个名为libJsonCpp.so的库,我在一些progam中使用了它,现在我只是将该库的修订号从2.12增加到了2.13

[enzo@P0101222 Test]$ ls -la /prd/b_BCM/bin/libJsonCpp.so*
lrwxrwxrwx    1 enzo     aesys          18 Mar 16 16:52 /prd/b_BCM/bin/libJsonCpp.so -> libJsonCpp.so.2.13
lrwxrwxrwx    1 enzo     aesys          18 Mar 16 14:26 /prd/b_BCM/bin/libJsonCpp.so.2 -> libJsonCpp.so.2.13
lrwxrwxrwx    1 enzo     aesys          22 Mar 16 14:26 /prd/b_BCM/bin/libJsonCpp.so.2.13 -> libJsonCpp.so.2.13.001
-rwxr-xr-x    1 enzo     aesys      286939 Mar 16 14:26 /prd/b_BCM/bin/libJsonCpp.so.2.13.001
奇怪的是,使用这个库的程序尝试加载两次,新的reivison和旧的reivison

当我检查程序以查看它需要什么库时,我有如下输出:

  [enzo@P0101222 MySampleProgram]$ ldd MySampleProgram
        libJsonCpp.so.2.13 => /prd/b_BCM/bin/libJsonCpp.so.2.13 (0x4002a000)
        libxerces-c-3.0.so => /usr/local/lib/libxerces-c-3.0.so (0x40061000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x40438000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x4044c000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x40461000)
        ...... 
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        libJsonCpp.so.2.12 => not found
如您所见,程序查找新库(正确)

但也有一些旧的,当然已经被移除了

    libJsonCpp.so.2.12 => not found
我已经检查了所有的系统,找到了应该仍然引用旧版本的地方,但是我什么也没找到。 我还重建了删除缓存文件的程序e,但问题仍然存在

所以我想问,是否有人有一些建议,关于如何检查来发现这个奇怪的问题

你好,恩佐

2015年3月17日增补 在程序链接期间,我出现以下错误: 似乎链接/prd/b_BCM/bin/libJsonCpp.so指向旧版本,但所有链接都链接到新版本(见上文)


我发现了问题

出于某种奇怪的原因,新库包含对旧库的引用

$ ldd  /prd/b_BCM/bin/libJsonCpp.so.2.13
        libpthread.so.0 => /lib/libpthread.so.0 (0x4004d000)

        libJsonCpp.so.2.12 => not found

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
幸运的是,这足以重建新库,错误的依赖项消失了

谢谢乔纳森的支持


Reagards,Enzo

您的程序或您所依赖的其他库之一都需要旧版本。我的实用程序将显示与ldd相同的输出,但显示在树中,因此您可以知道哪个文件依赖于旧库不幸的是,我使用的是一个非常旧的linux版本(redhat 7.3),因此我不认为我应该使用您的实用程序,我建议您使用一个非常新的编译器版本。RH 7.3?为什么?无论如何,你仍然可以手工操作,只要在你的程序和它的每一个依赖项上使用像
readelf-d file | grep DT_NEEDED
,以及它们的每一个依赖项,直到你找到一个依赖于旧lib的,谢谢readelf的建议,但是这给了我一个奇怪的结果。Readelf只列出正确的库,更不用说旧库了。但是ldd仍然拒绝旧的依赖关系
[enzo@P0101222]$readelf-d MySampleProgram | grep需要0x00000001(需要)共享库:[libJsonCpp.so.2.13]0x00000001(需要)共享库:[libxerces-c-3.0.so]。。。。。0x00000001(必需)共享库:[libc.so.6]
正如我所说,您需要在每个库及其依赖项上使用readelf,而不仅仅是在主程序上
g++ -Wcast-qual -Wshadow -Wcast-align -Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef \
-Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 \
-D_BSD_SOURCE -Wcast-align -Wconversion -fno-builtin -g -O2 -O0 -g3 -Wall \
-I.. -Ibcm_plant -Ibcm_panel -Ibcm_display -Ibcm_common -I../bcm_panel -I../bcm_display -I../bcm_common \
-fno-exceptions -fno-check-new -fexceptions -rdynamic \
-o MySampleProgram gestconfigbcmmessage.o clsmsgwritestatus.o testcr01.o util_panel.o updatefirmwaredisplay.o main.o \
/prd/b_BCM/bin/libJsonCpp.so  ./bcm_plant/libbcm_plant.a ./bcm_panel/libbcm_panel.a ./bcm_display/libbcm_display.a \
./bcm_common/libbcm_common.a /usr/local/lib/libxerces-c.so -lnsl -lpthread /usr/lib/libstdc++.so \
-L/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/src \
-L/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr3/BUILD/gcc/gcc-3.4.6/gcc \
-L/usr/local/lib -L/prd/b_BCM/src/b_BCM_common/modules -leasyzlib -lftplib -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib
/usr/bin/ld: warning: libJsonCpp.so.2.12, needed by /prd/b_BCM/bin/libJsonCpp.so, not found (try using -rpath or -rpath-link)
make[1]: Leaving directory `/home/enzo/Autostrade/prd/b_BCM/src/MySampleProgram/MySampleProgram'
$ ldd  /prd/b_BCM/bin/libJsonCpp.so.2.13
        libpthread.so.0 => /lib/libpthread.so.0 (0x4004d000)

        libJsonCpp.so.2.12 => not found

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)