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

「MyAppTest」のスペースをすでにエスケープしています。そのようなパスを通過する正しい方法は何ですか?

編集:提案されているようにエスケープされたスペースなしでエクスポートすると、同じ結果が表示されます:

エクスポートLD_PRELOAD='/home/myuser/MyAppTest / 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 に答える