欺骗Linux:可执行文件和依赖库通过LD_PRELOAD
Cheating Linux: executables and dependent libraries via LD_PRELOAD
很抱歉这个标题,我实在想不出其他什么来描述这个问题
好的,事情是这样的:我试图在Linux下使用一个专有的免费软件应用程序(因此问题;如果我有源代码,我可以重建它)。此外,我尝试在不受支持的Linux版本上运行它,应用程序的几乎所有组件都是单独工作的,但不是一起工作的(如果应用程序完全运行,它们应该一起工作)。
让我澄清一下。有一个GUI,在不支持的操作系统中启动得很好。然后,从这个GUI中,您可以调用一堆命令行工具——有用的是,GUI还会吐出在每种情况下被调用的命令行。
现在,从GUI中调用其中一些命令会失败—但是,由于我调用了实际的命令行(假设为:"extprogram -arg1 1 -arg2 2 ...
"),因此我可以从终端中重复这些命令。因此,我发现应用程序作为一个整体携带它自己的libc库;使用这些库,(一些)命令(从终端运行)往往会失败——然而,我发现从命令行,这通常适用于那些失败的命令:
LD_PRELOAD=/usr/lib/libstdc++.so.6 extprogram -arg1 1 -arg2 2 ...
# or alternatively, this works too:
# LD_LIBRARY_PATH=/usr/lib extprogram -arg1 1 -arg2 2 ...
(换句话说,使用系统libstdc++而不是应用程序提供的libstdc++,倾向于修复问题)
,
所以,现在如果我能说服GUI用"LD_PRELOAD
"/"LD_LIBRARY_PATH
"来调用这些工具-我想,一切都会很好…
不幸的是,GUI不调用脚本,将进一步调用这些可执行文件,我可以直接改变(只要我能看到通过grep
ping) -表面上,它是GUI可执行文件创建系统调用;我试过' strace
'-ing,但我找不到像临时脚本或任何我可以改变的东西…
,
所以,我想也许我可以"欺骗"做一个可执行的bash脚本;因此,我移动了可执行文件—并创建了一个脚本,该脚本应该调用移动的可执行文件,并加上LD_
:
mv extprogram extprogram.old
cat > extprogram <<EOF
LD_LIBRARY_PATH=/usr/lib extprogram $@
EOF
…但这行不通;显然,GUI应用程序识别出某些东西是不对的。
,
所以,我在想-是否有可能以某种方式,也许,有一个C/c++代码"包装器",会以某种方式"加载"这个可执行文件,但在一个"环境"有"LD_LIBRARY_PATH=/usr/lib
"设置-并传递它的参数(并返回它的返回值)?然后,我就可以在操作系统上本地构建这个"包装器",并使用与原始可执行文件相同的名称-并且在不触及原始可执行文件(除了重命名)的情况下使整个事情正常工作。
提前感谢您的任何回答,
干杯!
你很接近了。您忘记了如何使脚本可执行。而且你调用了错误的外部程序。最后,我将使用旧脚本的绝对路径,因为您不知道GUI的CWD将是什么。
mv extprogram extprogram.old
cat > extprogram <<EOF
#!/bin/sh
LD_LIBRARY_PATH=/usr/lib exec /psth/to/extprogram.old "$@"
EOF
chmod +x extprogram
使用系统libstdc++而不是应用程序提供的libstdc++,倾向于修复问题
我很想知道使用应用程序提供的libstdc++.so.6
会导致什么问题,但是如果系统解决了问题,那么一个更简单的解决方案是删除(重命名)麻烦的库,而不是做整个shell包装解决方案。
如果应用程序找不到"坏"库,那么它很有可能会找到系统库。
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- /usr/bin/ld: cannot find -lc++
- 解决"ld: library not found for -ltensorflow_framework.2.3.0"
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 使 ld 忽略来自 /etc/ld.so.conf 的目录
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- LD:尝试编译项目时找不到架构x86_64符号
- Linux ld 如何解释 -lSomething::AnotherSomething(如 /usr/bin/ld: 找
- LD 找不到生成的函数
- C++ collect2:错误:ld 返回 1 退出状态
- OS X: ld: 找不到 -lstdc++ 的库
- Mac Snow Leopard 上的 Qt 5.3.2:ld:在架构x86_64 [clang、Objective-C
- 找不到 -llibmysqld Collect2.exe:错误:ld 返回 1 退出状态
- ld 链接器错误,未定义对主函数的引用
- 使用 Arduino 对 ATtiny10 进行编程 ( "ld.exe" 错误)
- 每次我要使用外部资源时,我都会得到:collect2。exe:错误 ld 返回 1 退出状态
- 当出现错误ld return 1退出状态时,如何编译程序