我在Kubuntu上正确安装了一个软件。
现在,我正在修补和测试它的一些库。
如何从bash启动软件,以便加载我的修补库而不是官方库?
例如为:
官方库位于/ usr / lib /
我的补丁库(在测试开发期间使用)位于/ home / user / dev / lib /
我试过了:
$ set LD_LIBRARY_PATH=/home/user/dev/lib/
$ binary_app &
但无济于事。
我更喜欢可以从bash设置的解决方案,但如果不可能,我也可以修改这个C ++软件的cmake文件。
目的是允许我使用vanilla libs轻松启动应用程序,或者使用我的修补库来查看差异。
编辑:这是一个KDE .so文件
我正在测试的库是一个KDE4库。官方lib位于/ usr / lib / kde4 /中。在该目录中,库中没有一个以 lib 前缀开头。
我是否:
/lib/ld-linux-x86-64.so.2 --list --library-path PATH EXEC
或
ldd EXEC
图书馆根本没有列出。
另一方面,如果将原始库从/ usr / lib / kde4 /移开,则应用程序启动但缺少相应的功能。
KDE4库是否以特定方式加载?也许要设置的变量是不同的......
修改2
所有答案都很好且有用......不幸的是,事实证明问题似乎与lib路径设置无关。我正在处理插件架构,并且.so加载路径似乎在应用程序的某处硬编码。我需要在源代码中花费更多时间来了解正在发生的事情......谢谢,并且+1给所有人。
答案 0 :(得分:7)
来自'man bash':
当一个简单的命令而不是内置函数或shell函数时 被执行,它被调用 单独的执行环境 由以下内容组成。除非 另外注意到,值是 继承自shell。
[...]
·标记为导出的shell变量和函数 用于导出的变量 命令,在环境中传递
如果要执行的程序可以看到变量,则需要“导出”变量。
但是,您也可以尝试以下方法:
/lib/ld-linux.so.2 --library-path PATH EXECUTABLE
请参阅http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
答案 1 :(得分:5)
尝试export LD_LIBRARY_PATH=...
而不是设置。
答案 2 :(得分:3)
我已经把它放在评论中但是在考虑之后我认为最好的方法(使用不同的库仅用于测试/调试)是使用LD_PRELOAD
,请参阅What is the LD_PRELOAD trick?
从手册页:
<强> LD_PRELOAD 强>
以空格分隔的列表,其中包含要在所有其他库之前加载的其他用户指定的ELF共享库。这可用于有选择地覆盖其他共享库中的函数。对于set-user-ID / set-group-ID ELF二进制文件,只会加载标准搜索目录中也是set-user-ID的库。
更新
在更新的问题之后,应用程序似乎正在使用dlopen
使用绝对路径打开库。我认为你无能为力。见man dlopen
UPDATE2:
也许你可以做些什么:你可能LD_PRELOAD
你自己的dlopen
函数修改了你自己的库的路径......
答案 3 :(得分:2)
你不是偶然的应用程序setuid或setgid吗?在这种情况下,LD_LIBRARY_PATH将被忽略。
答案 4 :(得分:2)
将所有内容放在一行:
LD_LIBRARY_PATH=foo binary_app&