2011-07-08 72 views
2

我有一个奇怪的问题。我有一个使用gcc-4.2构建的共享库'my_tracker.so'。这个共享库现在依赖于libgcc_s.so.1(GCC 4.2)。我做了'ldd my_tracker.so',它从/ lib64中找到了libgcc_s.so.1。LD_PRELOAD更改LD_LIBRARY_PATH

我运行的是

'LD_PRELOAD=my_tracker.so LD_LIBRARY_PATH=[vnc_install]/lib/vnclibs:$LD_LIBRARY_PATH vncserver' 

我的剧本里。我想确保vncserver从[vnc_install]/lib/vnclibs/获得它的libgcc_so.1(GCC 3.2.3),因此将它放在LD_LIBRARY_PATH的前面。

但是,执行我的脚本后,它看起来像vncserver从/lib64拿起libgcc_s.so.1(GCC 4.2)。

我的预加载的共享库'my_tracker.so'的加载是否预先在发现了libgcc_s.so.1(GCC 4.2)的地方加上了LD_LIBRARY_PATH

如果是这样,我该如何解决这个问题?

问候 约翰

+0

你为什么试图使用旧版本的libgcc_s.so.1?如果libc或其他东西需要更新的版本...... – bdonlan

+1

没有vncserver二进制文件我正在使用指向旧版本libgcc_s.so.1的链接。我没有vncserver的来源来重新编译它。但是从更广泛的角度来看,如何在通用Linux系统上运行使用gcc编译器的diff版本编译的二进制文件(以及与diffg版本的libgcc_s.so.1链接)? – johnm

回答

0

对此的解决方案是让patchelf并用它来修补二进制文件,并复制任何库,使用RPATH。然后你可以完全忽略LD_LIBRARY_PATH。如果你需要一个不同的ld-linux.so来加载你的二进制文件,patchelf可以修复二进制文件以找到它。

+0

谢谢你的建议。我会研究这一点。然而,我不认为这是一个通用的解决方案,因为我不能在每个我想用我的预加载库运行的二进制文件上运行patchelf。 – johnm