C++ 如何从bash更改二进制文件的库包含路径?

C++ 如何从bash更改二进制文件的库包含路径?,c++,linux,bash,include-path,kde4,C++,Linux,Bash,Include Path,Kde4,我在Kubuntu上正确安装了一个软件 现在,我正在修补和测试它的一些库 如何从bash启动软件,使其加载我的修补库而不是正式的libs e、 g.: 官方lib位于/usr/lib/ 我的补丁库(在测试开发期间使用)位于/home/user/dev/lib/ 我试过: $ set LD_LIBRARY_PATH=/home/user/dev/lib/ $ binary_app & 但是没有用 我更喜欢一个可以从BASH中设置的解决方案,但是如果不可能,我也可以修改这个C++软件的

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

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

如何从bash启动软件,使其加载我的修补库而不是正式的libs

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

我试过:

$ set LD_LIBRARY_PATH=/home/user/dev/lib/  
$ binary_app &
但是没有用

<>我更喜欢一个可以从BASH中设置的解决方案,但是如果不可能,我也可以修改这个C++软件的CMAK文件。p> 这样做的目的是让我能够轻松地启动应用程序,或者使用香草libs,或者使用我的补丁libs来查看差异

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

我正在测试的库是KDE4库。官方库位于/usr/lib/kde4/。在该目录中,没有一个库以lib前缀开头

我是否:

/lib/ld-linux-x86-64.so.2 --list  --library-path PATH EXEC  

该库根本没有列出

另一方面,如果将原始库从/usr/lib/kde4/移开,则应用程序将启动,但缺少相应的功能

KDE4库是否以特定方式加载?可能要设置的变量不同

编辑2


所有的答案都是好的和有用的。。。不幸的是,问题似乎与lib路径设置无关。我正在处理一个插件架构和。因此加载路径似乎是在应用程序中的某个地方硬编码的。我需要在源代码中花更多的时间来理解发生了什么。。。谢谢大家,谢谢大家。

尝试导出LD_库路径=…而不是集合。

尝试
导出LD_库路径=…
而不是集合。

来自“man bash”:

当要执行除内置或shell函数以外的简单命令时 如果要执行,则在 独立的执行环境 包括以下内容。除非 否则,值为 继承自外壳

[……]

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

如果要让执行的程序看到变量,则需要“导出”变量

但是,您也可以尝试以下操作:

/lib/ld linux.so.2——库路径可执行文件

参见《曼巴什》中的

当要执行除内置或shell函数以外的简单命令时 如果要执行,则在 独立的执行环境 包括以下内容。除非 否则,值为 继承自外壳

[……]

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

如果要让执行的程序看到变量,则需要“导出”变量

但是,您也可以尝试以下操作:

/lib/ld linux.so.2——库路径可执行文件


请看

您的应用程序不是偶然设置的setuid或setgid吗?在这种情况下,LD_LIBRARY_路径将被忽略。

您不是碰巧使用了应用程序setuid或setgid吗?在这种情况下,将忽略LD_LIBRARY_路径。

将所有内容放在一行:

LD_LIBRARY_PATH=foo binary_app&

将所有内容放在一行:

LD_LIBRARY_PATH=foo binary_app&

我已经在评论中提到了这一点,但仔细考虑后,我认为最好的方法是使用
LD_PRELOAD
,请参阅

从手册页:

LD_预载

以空格分隔的附加、用户指定的ELF共享库列表,将在所有其他库之前加载。这可用于选择性地重写其他共享库中的函数。对于set user ID/set group ID ELF二进制文件,将仅加载标准搜索目录中同样为set user ID的库

更新:

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

更新2:


也许您可以做些什么:您可以使用
LD_PRELOAD
您自己的
dlopen
函数修改您自己库的路径

我已经在评论中提到了这一点,但考虑到这一点,我认为最好的方法是使用
LD_PRELOAD
,请参阅

从手册页:

LD_预载

以空格分隔的附加、用户指定的ELF共享库列表,将在所有其他库之前加载。这可用于选择性地重写其他共享库中的函数。对于set user ID/set group ID ELF二进制文件,将仅加载标准搜索目录中同样为set user ID的库

更新:

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

更新2:


也许您可以做些什么:您可以使用
LD_PRELOAD
您自己的
dlopen
函数修改您自己库的路径

在任何一种情况下,echo$LD_LIBRARY_PATH都会输出正确的路径。使用导出似乎没有任何区别…:(@augustin-您看不到与shell的区别。但是从shell启动的进程只继承导出的变量。在这两种情况下,echo$LD_LIBRARY_PATH都输出正确的路径。使用导出似乎没有任何区别…:(@augustin-你看不到与shell的区别。但是从shell启动的进程只继承导出的变量。考虑得好,但是没有setuid。考虑得好,但是没有setuid。你可以使用
ldd-bin进行检查