LD_PRELOAD - shell扩展麻烦

时间:2014-04-06 07:16:51

标签: linux bash shell

我想用LD_PRELOAD来调用一些.so文件的可执行文件。 但我有一个问题,即bash shell扩展似乎不适用于变量扩展:

这些是我试图为LD_PRELOAD设置的文件:

nuclear@Korhal:~$ ls speedhack/speedhack*.so
speedhack/speedhack32.so  speedhack/speedhack.so

但是shell扩展在这里不起作用:

nuclear@Korhal:~$ LD_PRELOAD="speedhack/speedhack*.so" ./my_executable
ERROR: ld.so: object 'speedhack/speedhack*.so' from LD_PRELOAD cannot be preloaded: ignored.

我编写了一个脚本来检查shell变量扩展会发生什么:

nuclear@Korhal:~$ cat test.sh 
#!/bin/bash

echo "LD_PRELOAD w/o quotes:"
echo $LD_PRELOAD

echo "LD_PRELOAD with quotes:"
echo "$LD_PRELOAD"

运行它:

nuclear@Korhal:~$ LD_PRELOAD="speedhack/speedhack*.so" ./test.sh
ERROR: ld.so: object 'speedhack/speedhack*.so' from LD_PRELOAD cannot be preloaded: ignored.
LD_PRELOAD w/o quotes:
speedhack/speedhack32.so speedhack/speedhack.so
LD_PRELOAD with quotes:
speedhack/speedhack*.so

但它变得更复杂:当从ld.so访问变量时,星不会扩展 只有当我在回声中没有引号时,它才会被扩展。我知道,双引号在变量扩展中没有区别(echo $ VAR应该与echo“$ VAR”相同。但是echo'$ VAR'将打印字符串$ VAR)

主要问题:如何在变量赋值中强制shell扩展,以便LD_PRELOAD保存文件列表?

2 个答案:

答案 0 :(得分:2)

您可以将文件名放在数组中并使用它来展开列表:

FILES=(speedhack/speedhack*.so)
LD_PRELOAD="${FILES[@]}" ./my_executable

答案 1 :(得分:0)

您还可以使用反引号或$()语法将命令的结果复制粘贴到命令行。然后使用双引号将所有单词都抓到同一个变量中。

LD_PRELOAD="$(ls speedhack/speedhack*.so)" ./my_executable