Dan*_*Dan 3 unix linux ld-preload
我在Linux上遇到LD_PRELOAD问题.我正在尝试在启动我的应用程序之前加载存在于名称中包含空格的目录中的库:
> export LD_PRELOAD='/home/myuser/MyApp\ Test/lib/mylib.so'
Run Code Online (Sandbox Code Playgroud)
但是,路径没有正确使用.它会在空间存在的地方被拆分,因此它会尝试预加载这些:
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
Run Code Online (Sandbox Code Playgroud)
我已经在"MyApp Test"中逃避了这个空间.通过这条路径的正确方法是什么?
编辑:根据建议导出没有转义空格,呈现相同的结果:
export LD_PRELOAD ='/ home/myuser/MyApp Test/lib/mylib.so'
除了(没有引号,只是转义空间):
export LD_PRELOAD =/home/myuser/MyApp\Test/lib/mylib.so
je4*_*e4d 10
动态加载器可能只是在空间上做了一个天真的分裂,在这种情况下,它不可能让它将空间视为路径的一部分.
您可以通过创建要预加载的库的符号链接来解决此问题,该符号链接不包含任何空格.
编辑:
由http://ubuntuforums.org/showthread.php?t=1142062确认
与PATH或LD_LIBRARY_PATH等其他变量一样,此变量可能包含以冒号分隔的库名称列表.但是......为了与遗留系统兼容,可以用空格分隔LD_PRELOAD元素.旧系统无法理解转义,因此如果它们包含空格,则无法将完整的库路径放入LD_PRELOAD.
实际上,您可以通过将带有空格的路径添加到 LD_LIBRARY_PATH,然后使用不带路径名的 LD_PRELOAD 来解决此问题。例如:
export LD_LIBRARY_PATH="/home/myuser/MyApp\ Test/lib/":${LD_LIBRARY_PATH}
export LD_PRELOAD=mylib.so
Run Code Online (Sandbox Code Playgroud)