2012-02-22 15 views
6

私は次のrpathでのopenssl 1.0.0gをコンパイルしようとしているとOpenSSLをコンパイルする方法:相対RPATH

$ORIGIN/../lib64 

毎回I readelf -d apps/openssl、私は私が試したものをエスケープ変化に応じて、次のような結果を取得しています:

\RIGIN/../lib64 
RIGIN/../lib64 
ORIGIN/../lib64 

chrpathのような外部ツールを使用せずに自分のrpathを設定したいと思います。それはすべて可能ですか?私は基本的にはchrpathのような外部ツールを使用することを伴わないものを受け入れます(ただし、私はすでにそれで済んでいます)。

理想的には、コマンドライン(任意の形式の-Wl,-rpath,$ORIGIN/../lib64)でオプションを渡して、やりたいと思います。

私が最後に試したことである生成されたMakefileを編集しても構いません。もし私が愚かなドル記号を印刷するためにそれを得ることができれば!私はBUILDENVの下でLIBRPATHを修正しようとしました=ブロックは不運です。これまでの私の最高の結果:

LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64 
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64 

私は、様々なRPATH関連の質問を読み、様々なエスケープや引用トリックを試してみましたが、何もこれまで働いていません!あなたのメイクの試みで

答えて

7

-Wl,-rpath,${ORIGIN}/../lib64 

私はORIGINはシェル変数であると仮定しています。

EDIT

私はちょうどは、あなたの質問(より良い遅く、その後は決して)への答えを見つけた: あなたは変数を補間から作る防ぐために必要がある、あなたが使用する必要があることを行うために$$(ダブルdolar記号):

-Wl,-rpath,'$$ORIGIN/../lib64' 

私は楽しんで、私は自分のアプリケーションでそれをテストしているので、それが動作することを知っている:)

+0

これは問題ではありません。実行可能ファイルに書き込むために、literalの文字列 '$ ORIGIN /../ lib64'が必要です。どのような種類の置換もできません。 –

+0

あなたが使っていたopensslのバージョンと、変更したMakefileの行を明確にしてください。 –

+0

OpenSSLには 'Makefile.org'と再帰的なmakefileがあります。そして、彼らは 'CFLAGS'、' LDFLAGS'などを尊敬しません。* *あなたのmakefileで試してみてください。 – jww

2

私が行ってきましたchrpathの方法。 http://enchildfone.wordpress.com/2010/03/23/a-description-of-rpath-origin-ld_library_path-and-portable-linux-binaries/

opensslでの `$$ ORIGIN`のシェル拡張に対抗するのはかなり複雑です。遅かれ早かれ、それはドル記号のために拡大される。あなたが本当にこのようにしたいなら、あなたはそれをすることができます。 Linuxでopenssl 1.0.1gを使用するには、次のものがあることがわかりました。 Makefile.sharedで、次の行を探します。

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" 

次のように置き換えます。この引用符は$の拡張を無効にします。ダブル$$は、メイクファイルに1ドル記号を付ける方法です。コンパイルした後

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,'"'$$'"ORIGIN/../lib64'" 

readelf -d apps/openssl | grep RPATH 
0x000000000000000f (RPATH)    Library rpath: ['$ORIGIN/../lib64'] 
+0

'DO_GNU_APP = LDFLAGS ...' - これは 'libssl.so'が間違った' libcrypto.so'を読み込むことができると思います。 – jww

+0

*** Plus One *** ...シェル変数を使って相対RPATH *を取得できました。 'ldd'はシェル変数を尊重しますか?それは拡大しますか?私はこれを見たことがないので、この質問をブックマークします。 – jww

+0

$ ORIGINは特別なlddトークンです。あなたが私に尋ねるとひどく選んだのは、ドル記号がシェルによって展開される特殊文字だからです。これは、実行可能ファイルに$ ORIGINを付けることがとても複雑な理由です。 chrpathを使用することは賢明です。この種の相対パスは、あなたのopensslの場所を独立させ、異なる場所に複数のバージョンを維持することを可能にします。 –

0

を私は最後にしようとしているものです生成されたMakefileを編集する気にしません...

シェル変数と相対パスで設定できるかどうか不安です。 I dolddはを$ORIGIN/../lib64に展開します。この場合、ldconfigを使用して、$ORIGIN/../lib64をライブラリ検索パスに追加する必要があると思います。詳細については、サーバ障害に関するfinding ldd search pathを参照してください。

わからないので、とにかく指示を出します。 Makefileを変更する必要はありません。事実上、物事が上書きされてしまい、CFLAGSLDFLAGSのようなものは無視されるので、私は過去に運がなかった。

また、Build OpenSSL with RPATH?を参照してください。あなたの質問と引用された質問は、同様の回答(それらの間に重複はありません)に収束する異なる質問です。しかし、RPATH上でOpenSSL開発者の立場を提供します。プライベートメールだったので、メッセージ全体ではなく関連する詳細を共有しました。

$ORIGIN/../lib64をELFセクションに埋め込み、それが機能する場合は、報告してください。以下、自分のRPATHに/usr/local/ssl/libを使用しています。 /usr/local/ssl/libには$ORIGIN/../lib64を代入する必要があります。


OpenSSLはBSDターゲット(ではなく、他)のために箱から出してRPATH年代をサポートしています。設定から:

# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time 
# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on 
# .so objects. Apparently application RPATH is not global and does 
# not apply to .so linked with other .so. Problem manifests itself 
# when libssl.so fails to load libcrypto.so. One can argue that we 
# should engrave this into Makefile.shared rules or into BSD-* config 
# lines above. Meanwhile let's try to be cautious and pass -rpath to 
# linker only when --prefix is not /usr. 
if ($target =~ /^BSD\-/) 
    { 
    $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|); 
    } 

のOpenSSL 1.0.2 のためにそれを行うための最も簡単な方法が表示されますadd it to linker flags during configuration

./config -Wl,-rpath=/usr/local/ssl/lib 

あなたはまた、設定ラインとハードコードrpathを編集することができなければ。たとえば、私はDebian x86_64で作業しています。だから私は、エディタでファイルを開いたConfigurelinux-x86_64-rpathそれを名付け、linux-x86_64をコピーし、そして-rpathオプション追加するには、以下の変更を加えた:

上記
"linux-x86_64-rpath", "gcc:-m64 -DL_ENDIAN -O3 -Wall -Wl,-rpath=/usr/local/ssl/lib:: 
-D_REENTRANT::-Wl,-rpath=/usr/local/ssl/lib -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL: 
${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64", 

を、フィールド2と6が変更されました。 OpenSSLのビルドシステムでは$cflag$ldflagに対応しています。

その後、新しい構成での設定:

$ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp \ 
    --openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128 

は最後に、make後、立ち往生の設定を確認します。

$ readelf -d ./libssl.so | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 
$ readelf -d ./libcrypto.so | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 
$ readelf -d ./apps/openssl | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 

あなたがmake installを実行すると、その後、lddが期待される結果を生成します:

$ ldd /usr/local/ssl/lib/libssl.so 
    linux-vdso.so.1 => (0x00007ffceff6c000) 
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007ff5eff96000) 
    ... 

$ ldd /usr/local/ssl/bin/openssl 
    linux-vdso.so.1 => (0x00007ffc30d3a000) 
    libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f9e8372e000) 
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f9e832c0000) 
    ...