共有ライブラリ (この例ではlibcryto & libsslですが、実際のライブラリは関係ありません)に対してリンクされているプログラム (myprog と呼びましょう) をコンパイルしてリンクしようとしています。Centos 5.5でビルドしていますが、同じバイナリを他のRHELのようなディストリビューション (CloudLinux など) でも実行したいと考えています。両方とも、同じライブラリの同じバージョンを持っていますSO_NAME
(つまり、DT_NEEDED
バージョンが対応しています)。
私の問題はこれです。Centos でコンパイルすると、次のように表示されます。
centos$ objdump -T myprog | fgrep SSL_new
0000000000000000 DF *UND* 0000000000000000 libssl.so.10 SSL_new
次の理由により、これは正常に機能します。
centos$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000000000447d0 g DF .text 0000000000000390 libssl.so.10 SSL_new
ただし、CloudLinux では:
cloudlinux$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000033a623a120 g DF .text 0000000000000390 Base SSL_new
SSL シンボルのバージョンが からlibssl.so.10
に変更されていることに注意してくださいBase
。
これは、バイナリを実行すると次のようになることを意味します。
cloudlinux$ ./myprog
./myprog: /usr/lib64/libcrypto.so.10: no version information available (required by ./myprog)
./myprog: /usr/lib64/libssl.so.10: no version information available (required by ./myprog)
これは「単なる警告」であることは理解していますが、これを取り除きたいと考えています。
私が望むのは、バイナリが警告なしで cloudlinux と centos の両方で実行されることです。私が知る限り、openssl ライブラリの ABI は、少なくとも私が使用する部分では同一です。myprog
現在、cloudlinux または centos ライブラリで実行することを意図しているため、共有ライブラリを変更できません。インストール時に(何らかの方法で)シンボルを修正するソリューションを受け入れobjcopy
ます。
SSL_new@libssl.so.10
1 つのアプローチは、 のエイリアスである弱いシンボルを導入するようなものですSSL_new@Base
。明らかに、それは ssl ライブラリ内のすべての単一シンボルに適用されます (したがって、ラッパーは適切ではありません)。しかし、記号を含む と の値を取得することは-Wl,--defsym=x=y
できません。x
y
@
機能する可能性のある別のアプローチは、単純にバイナリからシンボルのバージョン管理情報を削除することです (つまり、libssl.so.10
各 ssl シンボルからバージョンを削除し、名前内のバージョン管理に依存しますDT_NEEDED
)。これは単純な要求のように思えますが、その方法もわかりません。何かobjcopy
呪文はありますか?
最悪の場合、Centos 上に CloudLinux で動作する (別の) バージョンを構築しても問題ありません。私はこれをやってみました:
#define OSLB(SYMNAME) __asm__(".symver " #SYMNAME "," #SYMNAME "@Base");
OSLB (SSL_new);
ただし、未定義のシンボルであると不平を言うリンクでは失敗します(CentosにはそのシンボルがないためSSL_new@Base
、Centosではそうです)。.so
これを回避する方法はありますか?