如何防止加载特定的动态库
我想使用一个古老的软件(从1999年开始的虚幻竞技场“经典”,也被称为UT99)。隐式加载动态库libtxc_dxtn.so
,探测可选的S3纹理压缩(S3TC)支持。不幸的是,在加载库时,主应用程序崩溃并出现分段错误(崩溃还描述了here)。解决方法似乎是通过删除或移动libtxc_dxtn.so
来移除Mesa的纹理压缩库。应用程序运行得非常好,没有纹理压缩,但当然其他需要纹理压缩支持的应用程序现在已经被破坏。当然,我不想为一个特定的应用程序修改我的系统。如何防止加载特定的动态库
所以我的问题是:
我可以防止特定的应用程序加载特定的动态库(如在“掩码”或“禁用”)?我希望能找到类似LD_PRELOAD
的相反情况。
更新:libtxc_dxtn.so
是含蓄和间接加载。修改应用程序二进制文件不可行。
initialize program: ut-bin file=libSDL-1.1.so.0 [0]; needed by ut-bin [0]
file=libGL.so.1 [0]; dynamically loaded by libSDL-1.1.so.0 [0]
file=i965_dri.so [0]; dynamically loaded by libGL.so.1 [0]
file=libtxc_dxtn.so [0]; dynamically loaded by i965_dri.so [0]
回答:
有一个叫工具,它应该让你从可执行文件中删除DSO依赖。
下面是一个例子,从一个虚拟的可执行文件删除一个libpthread
依赖性:
echo 'int main(){}' | gcc -x c - -Wl,--no-as-needed -lpthread &&
ldd a.out &&
patchelf --remove-needed libpthread.so.0 a.out &&
echo ====== &&
ldd a.out
我的输出:
linux-vdso.so.1 => (0x00007ffeced67000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f21560f1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2155d28000)
/lib64/ld-linux-x86-64.so.2 (0x00007f215630f000)
======
linux-vdso.so.1 => (0x00007fffac536000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6235c0d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6235fd6000)
更新:
如果libtxc_dxtn.so
装有dlopen
,你可以预先加载(LD_PRELOAD
)提供0123的小型库覆盖将返回NULL
如果 其文件名参数是例如"libtxc_dxtn.so"
(ltrace
应该帮助您找到需要防范的实际文件名参数)。例如:
#define _GNU_SOURCE #include <dlfcn.h>
#include <string.h>
void *dlopen(char const *Fnm, int Flg)
{
void *(*real_dlopen)(char const *, int);
*(void**)(&real_dlopen) = dlsym(RTLD_NEXT, "dlopen");
if(0==strcmp("libtxc_dxtn.so", Fnm)){
return NULL;
}else{
return real_dlopen(Fnm, Flg);
}
}
以上是 如何防止加载特定的动态库 的全部内容, 来源链接: utcz.com/qa/257758.html