3

我在 Linux 上遇到 LD_PRELOAD 问题。我正在尝试在启动我的应用程序之前加载一个存在于名称中带有空格的目录中的库:

> export LD_PRELOAD='/home/myuser/MyApp\ Test/lib/mylib.so'

但是,路径没有被正确采用。它在空间存在的地方被分割,所以它尝试预加载这些:

ERROR: ...: object '/home/myuser/MyApp' from LD_PRELOAD cannot be preloaded: ignored
ERROR: ...: object 'Test/lib/mylib.so' from LD_PRELOAD cannot be preloaded: ignored

我已经逃离了“MyApp Test”中的空间。通过这样的路径的正确方法是什么?

编辑:按照建议在没有转义空间的情况下导出,呈现相同的结果:

export LD_PRELOAD='/home/myuser/MyApp Test/lib/mylib.so'

以及(没有引号,只是转义空格):

导出 LD_PRELOAD=/home/myuser/MyApp\Test/lib/mylib.so

4

2 回答 2

10

动态加载器可能只是对空间进行了简单的拆分,在这种情况下,它不可能将空间视为路径的一部分。

您可以通过创建指向要预加载的不包含任何空格的库的符号链接来解决此问题。

编辑:

http://ubuntuforums.org/showthread.php?t=1142062确认

与 PATH 或 LD_LIBRARY_PATH 等其他变量一样,此变量可能包含由冒号分隔的库名称列表。但是...为了与旧系统兼容,可以用空格分隔 LD_PRELOAD 元素。并且较旧的系统不理解转义,因此如果它们包含空格,则不可能将完整的库路径放入 LD_PRELOAD 中。

于 2012-04-09T12:42:22.570 回答
4

实际上,您可以通过将带有空格的路径添加到 LD_LIBRARY_PATH 然后使用不带路径名的 LD_PRELOAD 来解决此问题。例如:

export LD_LIBRARY_PATH="/home/myuser/MyApp\ Test/lib/":${LD_LIBRARY_PATH}
export LD_PRELOAD=mylib.so
于 2013-10-22T18:02:59.313 回答