【发布时间】:2011-12-20 18:33:43
【问题描述】:
抱歉标题,实在想不出其他什么来描述这个问题:)
好的,事情是这样的:我正在尝试在 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++ 而不是应用程序提供的,往往会解决问题)
所以,现在如果我可以说服 GUI 使用“LD_PRELOAD”/“LD_LIBRARY_PATH”来调用这些工具 - 我想,一切都会好起来的......
不幸的是,GUI 没有调用会进一步调用这些可执行文件的脚本,我可以直接更改(据我通过grepping 看到的)- 看起来,创建系统调用的是 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 应用程序是否从某种首先更改 LD_LIBRARY_PATH 的包装脚本运行?
-
感谢@bdonlan 的评论-我想是的(实际上有几个GUI,有些不是通过包装脚本开始的-导致问题的这个)。我也尝试更改包装脚本中的内容(我应该提到这一点),但没有太大效果。干杯!
-
如果那个脚本被调用了两次,会不会覆盖
extprogram.old,这样extprogram和extprogram.old都是脚本产生的修改版本?