C++ 如何从bash更改二进制文件的库包含路径?
我在Kubuntu上正确安装了一个软件 现在,我正在修补和测试它的一些库 如何从bash启动软件,使其加载我的修补库而不是正式的libs e、 g.: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++软件的
官方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进行检查