1

我在 Kubuntu 上正确安装了一个软件。

现在,我正在修补和测试它的一些库。

如何从 bash 启动软件,以便加载我的修补库而不是官方库?

例如:
官方库位于 /usr/lib/
我的补丁库(在测试开发期间使用)位于 /home/user/dev/lib/

我试过了:

$ set LD_LIBRARY_PATH=/home/user/dev/lib/  
$ binary_app &

但无济于事。

我更喜欢可以从 bash 设置的解决方案,但如果不可能,我也可以修改这个 C++ 软件的 cmake 文件。

目的是让我可以使用 vanilla 库或我的修补库轻松启动应用程序以查看差异。

编辑:这是一个 KDE .so 文件

我正在测试的库是 KDE4 库。官方库位于 /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。

4

5 回答 5

7

来自“男人狂欢”:

当要执行除内置函数或 shell 函数之外的简单命令时,将在由以下内容组成的单独执行环境中调用它。除非另有说明,否则这些值是从 shell 继承的。

[……]

· 标记为导出的 shell 变量和函数,以及为命令导出的变量,在环境中传递

如果要被您执行的程序看到,您需要“导出”一个变量。

但是,您也可以尝试以下方法:

/lib/ld-linux.so.2 --library-path 路径可执行文件

请参阅http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

于 2011-02-04T08:49:57.993 回答
5

尝试export LD_LIBRARY_PATH=...而不是设置。

于 2011-02-04T08:44:59.423 回答
3

我已经把它放在评论中,但在考虑之后我认为最好的方法(使用不同的库仅用于测试/调试)是使用LD_PRELOAD,请参阅什么是 LD_PRELOAD 技巧?

从手册页:

LD_PRELOAD

以空格分隔的其他用户指定的 ELF 共享库列表,这些库要在所有其他共享库之前加载。这可用于选择性地覆盖其他共享库中的函数。对于 set-user-ID/set-group-ID ELF 二进制文件,只会加载标准搜索目录中也是 set-user-ID 的库。

更新:

在更新问题之后,应用程序似乎正在使用dlopen绝对路径打开库。我认为你对此无能为力。看man dlopen

更新2:

也许您可以做一些事情:您可以使用LD_PRELOAD自己的dlopen函数来修改自己库的路径...

于 2011-02-04T09:11:32.670 回答
2

你不是偶然的 app setuid 或 setgid 吗?在这种情况下,LD_LIBRARY_PATH 将被忽略。

于 2011-02-04T08:51:49.410 回答
2

将所有内容放在一行上:

LD_LIBRARY_PATH=foo binary_app&
于 2011-02-04T09:05:26.390 回答