2017-12-20 13 views
0

私はherokuベースの環境で実行しているため、システムスペースにパッケージをインストールすることはできません。この問題を回避するには、/app/.aptにインストールし、これを反映するようにLD_LIBRARY_PATHを更新します。リンカーは常にLD_LIBRARY_PATHによって提供されるシステムよりもlibsasldb.soを選択します

私はcyrus-sasl2を使ってインストールしようとしていますが、インストールされていることを確認していますが、このライブラリを使用しようとすると、同じ場所にインストールされているgssapiv2 。私は

通常
file=/usr/lib/x86_64-linux-gnu/sasl2/libsasldb.so [0]; dynamically loaded by /app/.apt/usr/lib/x86_64-linux-gnu/libsasl2.so.2 [0] 

何か面白いものを参照してくださいLD_DEBUG=allでコードを実行

私は図書館が検索を行う見るが、これは、常にシステムを拾って、検索を実行していません。

1673: 
    1673:  file=libsasl2.so.2 [0]; needed by /app/.heroku/python/lib/python2.7/site-packages/sasl/saslwrapper.so [0] 
    1673:  find library=libsasl2.so.2 [0]; searching 
    1673:  search path=/app/.heroku/vendor/lib:/app/.heroku/python/lib:/app/.apt/usr/lib/x86_64-linux-gnu:/app/.apt/usr/lib:tls/x86_64:tls:x86_64:    (LD_LIBRARY_PATH) 
    1673:  trying file=/app/.heroku/vendor/lib/libsasl2.so.2 
    1673:  trying file=/app/.heroku/python/lib/libsasl2.so.2 
    1673:  trying file=/app/.apt/usr/lib/x86_64-linux-gnu/libsasl2.so.2 

のようなものがありますが、libsasldb.soの場合は表示されません。

私の質問は、なぜリンカーは検索しないで、代わりに常にシステムバージョンを使用するのでしょうか?

答えて

0

上記の例では、cyrus-saslがコンパイル時のフラグを使用してプラグインディレクトリを定義し、そのパスからロードすることが判明しました。私はHerokuの場所であることと、次のシステムコールに要するに

openat(AT_FDCWD, "/app/.apt/usr/lib/sasl2", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5 
open("/app/.apt/usr/lib/sasl2/libcrammd5.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libcrammd5.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libdigestmd5.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libdigestmd5.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libscram.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libscram.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/liblogin.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/liblogin.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libcrammd5.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libldapdb.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libanonymous.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libanonymous.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libplain.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libplain.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libntlm.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libntlm.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libntlm.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libotp.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libldapdb.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libldapdb.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libanonymous.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/liblogin.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libscram.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libotp.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libotp.so.2", O_RDONLY|O_CLOEXEC) = 6 
open("/app/.apt/usr/lib/sasl2/libdigestmd5.la", O_RDONLY) = 6 
open("/app/.apt/usr/lib/sasl2/libplain.la", O_RDONLY) = 6 

を見るために、プラグインのディレクトリを変更するには、プロジェクトを再コンパイルし、それは、リンカが追加LIBSを検索したことがない理由である自分自身のリンクを制御します。

関連する問題