我在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'
以及(没有引号,只是转义空间):
export LD_PRELOAD = / home / myuser / MyApp \ Test / lib / mylib.so
答案 0 :(得分:10)
动态加载器可能只是在空间上做了一个天真的分裂,在这种情况下,它不可能让它将空间视为你的路径的一部分。
您可以通过为要预加载但不包含任何空格的库创建符号链接来解决此问题。
修改强>
由http://ubuntuforums.org/showthread.php?t=1142062确认
与其他变量如PATH或LD_LIBRARY_PATH一样,此变量也可以 包含以冒号分隔的库名称列表。但对于 与遗留系统的兼容性可以分开 LD_PRELOAD元素按空格。旧系统不明白 逃避所以事实证明不可能放置完整的库路径 如果它们包含空格,则进入LD_PRELOAD。
答案 1 :(得分:3)
您可以通过向LD_LIBRARY_PATH添加带空格的路径然后使用不带路径名的LD_PRELOAD来解决此问题。例如:
export LD_LIBRARY_PATH="/home/myuser/MyApp\ Test/lib/":${LD_LIBRARY_PATH}
export LD_PRELOAD=mylib.so